made some fixes to support gcc3 on sparc
authorAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Wed, 28 Oct 2009 06:28:06 +0000 (23:28 -0700)
committerAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Wed, 28 Oct 2009 06:28:06 +0000 (23:28 -0700)
12 files changed:
GNUmakefile
gccinclude/sparc/stddef.h
kern/arch/sparc/boot.c
kern/arch/sparc/entry.S
kern/arch/sparc/spillfill.S
kern/arch/sparc/trap_entry.S
kern/src/Makefrag
kern/src/kfs.c
kern/src/manager.c
kern/src/printf.c
user/parlib/src/Makefrag
user/roslib/src/Makefrag

index f9f6bd3..3644769 100644 (file)
@@ -60,7 +60,7 @@ KERN_CFLAGS := --deputy\
 USER_CFLAGS := --deputy --enable-error-db
 CC         := ivycc --gcc=$(GCCPREFIX)gcc
 else
-CC         := $(GCCPREFIX)gcc -std=gnu99 -fgnu89-inline
+CC         := $(GCCPREFIX)gcc -std=gnu99
 endif
 
 AS         := $(GCCPREFIX)as
@@ -71,12 +71,14 @@ OBJDUMP     := $(GCCPREFIX)objdump
 NM         := $(GCCPREFIX)nm
 PERL    := perl
 
+EXTRAARGS ?= -Wno-attributes -fno-stack-protector -fgnu89-inline
+
 # Universal compiler flags
 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
 CFLAGS := $(CFLAGS) -D$(TARGET_ARCH) $(EXTRAARGS)
-CFLAGS += -O2 -pipe -MD -fno-builtin -fno-stack-protector -gstabs
-CFLAGS += -Wall -Wno-format -Wno-unused -Wno-attributes
+CFLAGS += -O2 -pipe -MD -fno-builtin -gstabs
+CFLAGS += -Wall -Wno-format -Wno-unused
 CFLAGS += -nostdinc -Igccinclude/$(TARGET_ARCH)
 
 # Universal loader flags
index 2bab2c2..16021d9 100644 (file)
@@ -412,7 +412,8 @@ typedef __WINT_TYPE__ wint_t;
 
 /* Offset of member MEMBER in a struct of type TYPE. */
 #ifndef offsetof
-#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
+/* #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) */
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 #endif
 
 #endif /* _STDDEF_H was defined this time */
index bc66a66..b8f4936 100644 (file)
@@ -100,8 +100,7 @@ mmu_boot(void)
 {
        int id = core_id(), i, ncores = num_cores();
 
-       static volatile int barrier[MAX_NUM_CPUS] = {0};
-       static volatile int done_0 = 0, done1 = 0;
+       static volatile int done_0 = 0;
        volatile int* done0 = (int*)((uintptr_t)&done_0 - KERNBASE); 
 
        if(id == 0)
@@ -113,9 +112,15 @@ mmu_boot(void)
                while(!*done0);
 
        mmu_init();
+}
 
-       extern void relocate(void);
-       relocate();
+void
+mmu_boot_finish(void)
+{
+       int id = core_id(), i, ncores = num_cores();
+
+       static volatile int barrier[MAX_NUM_CPUS] = {0};
+       static volatile int done1 = 0;
 
        if(id == 0)
        {
index 3bed26e..6e831a1 100644 (file)
@@ -5,35 +5,35 @@
 #include <arch/arch.h>
 #include <ros/memlayout.h>
 
-###################################################################
-# The kernel (this code) is linked at address (KERNBASE + 0x00000000),
-# but we tell the bootloader to load it at physical address 
-# 0x00000000, which is the start of extended memory.
-# (See kernel.ld)
-###################################################################
-
-
-###################################################################
-# RELOC(x) maps a symbol x from its link address to its actual
-# location in physical memory (its load address).       
-###################################################################
+///////////////////////////////////////////////////////////////////
+// The kernel (this code) is linked at address (KERNBASE + 0x00000000),
+// but we tell the bootloader to load it at physical address 
+// 0x00000000, which is the start of extended memory.
+// (See kernel.ld)
+///////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////
+// RELOC(x) maps a symbol x from its link address to its actual
+// location in physical memory (its load address).      
+///////////////////////////////////////////////////////////////////
 #define        RELOC(x) ((x) - KERNBASE)
 
-###################################################################
-# entry point
-###################################################################
+///////////////////////////////////////////////////////////////////
+// entry point
+///////////////////////////////////////////////////////////////////
 
 .text
 
 .global                _start
 _start:
-       # This is the first code that ever executes.  It executes on all
-       # cores (RAMP Gold-specific).  All we know is that PSR.S (supervisor)
-       # and PSR.ET (enable traps) are both 0.  Before we can enable traps,
-       # we must determine how many register windows we have, set up the
-       # trap table, and set up a stack frame.
+       // This is the first code that ever executes.  It executes on all
+       // cores (RAMP Gold-specific).  All we know is that PSR.S (supervisor)
+       // and PSR.ET (enable traps) are both 0.  Before we can enable traps,
+       // we must determine how many register windows we have, set up the
+       // trap table, and set up a stack frame.
 
-       # compute NWINDOWS
+       // compute NWINDOWS
 
        mov     -1,%wim                 ! mark all windows invalid.
        mov     (PSR_S|PSR_PS),%psr
@@ -46,66 +46,73 @@ _start:
        bne,a   1b
         inc    %g2
 
-       # now g2 = NWINDOWS - 1.  Patch the window spill trap handler.
+       // now g2 = NWINDOWS - 1.  Patch the window spill trap handler.
        set     RELOC(spill_patchme),%g1
        ld      [%g1],%g3
        or      %g2,%g3,%g3
        st      %g3,[%g1]
        flush   %g1
 
-       # and patch the window fill trap handler.
+       // and patch the window fill trap handler.
        set     RELOC(fill_patchme),%g1
        ld      [%g1],%g3
        or      %g2,%g3,%g3
        st      %g3,[%g1]
        flush   %g1
 
-       # store NWINDOWS away for safekeeping
+       // store NWINDOWS away for safekeeping
        set     RELOC(NWINDOWS),%g1
        inc     %g2
        st      %g2,[%g1]
 
-       # PSR.CWP (current window pointer) == 0.
-       # Set WIM so we'll trap on the next save instruction.
+       // PSR.CWP (current window pointer) == 0.
+       // Set WIM so we'll trap on the next save instruction.
        mov     1 << 1,%wim
 
-       # set up the TBR (trap base register)
+       // set up the TBR (trap base register)
        set     RELOC(trap_table),%g1
        mov     %g1,%tbr
 
-       # clear frame pointer for backtrace termination
+       // clear frame pointer for backtrace termination
        mov     0,%fp
 
-       # set stack pointer (-64 is space for window spill)
-       # sp = bootstacktop - core_id*KSTKSIZE - 64
+       // set stack pointer (-64 is space for window spill)
+       // sp = bootstacktop - core_id*KSTKSIZE - 64
        set     RELOC(bootstacktop)-64,%sp
        mov     CORE_ID_REG,%g1
        sll     %g1,KSTKSHIFT,%g1
        sub     %sp,%g1,%sp
 
-       # set up a virtual->physical mapping and relocate
+       // set up a virtual->physical mapping
        call    mmu_boot
         nop
 
-       # now we're relocated, so set %sp and TBR again
-       set     KERNBASE,%g1
-       add     %sp,%g1,%sp
+       // relocate
        set     trap_table,%g1
        mov     %g1,%tbr
+       set     reloc,%g1
+       set     KERNBASE,%g2
+       jmp     %g1
+        add    %g2,%sp,%sp
+reloc:
+
+       // finish mmu_boot
+       call    mmu_boot_finish
+        nop
 
-       # now it's safe to enable traps
+       // now it's safe to enable traps
        mov     %psr,%g1
        wr      %g1,PSR_ET,%psr
        nop; nop; nop
 
-       # am i core 0?  (do i run BSD?!?)
+       // am i core 0?  (do i run BSD?!?)
        mov     CORE_ID_REG,%g1
        tst     %g1
        bne     4f
         nop
 
-       # only core 0 gets here
-       # set num_cpus
+       // only core 0 gets here
+       // set num_cpus
        set     num_cpus,%l0
        mov     NUM_CORES_REG,%l1
        st      %l1,[%l0]
@@ -117,19 +124,19 @@ _start:
        call    build_multiboot_info
         add    %sp,64,%o0
 
-       # kernel_init time!
-       # first arg is pointer to multiboot_info_t, but kernel_init
-       # expects it to be a pre-relocation address, so lop off KERNBASE
+       // kernel_init time!
+       // first arg is pointer to multiboot_info_t, but kernel_init
+       // expects it to be a pre-relocation address, so lop off KERNBASE
        set     KERNBASE,%l0
        add     %sp,64,%o0
        call    kernel_init
         sub    %o0,%l0,%o0
 
-       # shouldn't get here
+       // shouldn't get here
 3:     ba      3b
         nop
 
-       # i'm not core 0, so i'll call smp_init when the time is nigh
+       // i'm not core 0, so i'll call smp_init when the time is nigh
 4:     set     time_for_smp_init,%l1
        ld      [%l1],%l0
        tst     %l0
@@ -139,28 +146,13 @@ _start:
        call    smp_init
         nop
 
-       # shouldn't get here
+       // shouldn't get here
 5:     ba      5b
         nop
 
-
-
-# this function (against the ABI!) relocates its caller's stack pointer
-# and return address, then returns to the caller, relocated
-
-.global                relocate
-relocate:
-       set     KERNBASE,%o0
-       inc     8,%o7
-       add     %i7,%o0,%i7
-       jmp     %o7+%o0
-       add     %sp,%o0,%sp
-
-.data
-
-###################################################################
-# various data
-###################################################################
+///////////////////////////////////////////////////////////////////
+// various data
+///////////////////////////////////////////////////////////////////
 
        .global         time_for_smp_init
 time_for_smp_init:
@@ -174,9 +166,9 @@ NWINDOWS:
 num_cpus:
        .word           0
 
-###################################################################
-# boot stack
-###################################################################
+///////////////////////////////////////////////////////////////////
+// boot stack
+///////////////////////////////////////////////////////////////////
 
        .align          PGSIZE          ! force page alignment
        .global         bootstack
@@ -185,9 +177,9 @@ bootstack:
        .global         bootstacktop   
 bootstacktop:
 
-###################################################################
-# page tables
-###################################################################
+///////////////////////////////////////////////////////////////////
+// page tables
+///////////////////////////////////////////////////////////////////
        .align          (NCONTEXTS+CONTEXT_TABLE_PAD)*4
        .global         mmu_context_tables
 mmu_context_tables:
index e705592..e9d31bc 100644 (file)
@@ -3,9 +3,9 @@
 #include <arch/trap.h>
 #include <ros/memlayout.h>
 
-# before spilling a window, we must be certain
-# that %sp is 8-byte aligned and the range [%sp,%sp+64)
-# is validly mapped in
+// before spilling a window, we must be certain
+// that %sp is 8-byte aligned and the range [%sp,%sp+64)
+// is validly mapped in
 #define VALIDATE_STACK(reg1,reg2,misaligned,pagefault) \
        mov     %psr,reg1               ;\
        btst    7,%sp                   ;\
@@ -119,7 +119,7 @@ spill_patchme:
        jmp     %l7+8
        mov     %l4,%g1
 
-# spill failed!
+// spill failed!
 1:     restore
        RETHROW_TRAP(stack_misaligned)
 2:     restore
@@ -166,7 +166,7 @@ fill_patchme:
        mov     %l4,%g1
 
 
-# spill failed!
+// spill failed!
 3:     save
        save
        RETHROW_TRAP(stack_misaligned)
index 5621506..e9d3f8b 100644 (file)
        .global handle_trap
 handle_trap:
 
-       # At this point, %l1 = pc, %l2 = npc, and %l0/3/4/5
-       # might contain an active message.  so we only get %l6/%l7
+       // At this point, %l1 = pc, %l2 = npc, and %l0/3/4/5
+       // might contain an active message.  so we only get %l6/%l7
 
-        # calculate stack pointer (-64 is space for window spill).
-        # sp = bootstacktop - core_id*KSTKSIZE - 64 - sizeof(trapframe_t).
-       # should you change this, make sure to change stack_fucked()
+        // calculate stack pointer (-64 is space for window spill).
+        // sp = bootstacktop - core_id*KSTKSIZE - 64 - sizeof(trapframe_t).
+       // should you change this, make sure to change stack_fucked()
         set     bootstacktop-64-SIZEOF_TRAPFRAME_T,%l6
         mov     CORE_ID_REG,%l7
        sll     %l7,KSTKSHIFT,%l7
         sub     %l6,%l7,%l6
 
-       # see if trap came from kernel; if so, use that stack
-       # also preserve the psr, since we'll screw with the condition codes
+       // see if trap came from kernel; if so, use that stack
+       // also preserve the psr, since we'll screw with the condition codes
        mov     %psr,%l7
        btst    PSR_PS,%l7
        bne,a   1f
         sub    %fp,64+SIZEOF_TRAPFRAME_T,%l6
 
-       # here is where we might do something with an active message
+       // here is where we might do something with an active message
 
 1:     mov     %l7,%l0
-       # At this point we may use %l3/4/5/7 as temporary regs
+       // At this point we may use %l3/4/5/7 as temporary regs
 
-       # is CWP valid?
+       // is CWP valid?
        and     %l0,PSR_CWP,%l4 ! %l4 = cwp
        mov     1,%l7
        sll     %l7,%l4,%l4     ! %l4 = 1 << cwp
@@ -46,8 +46,8 @@ handle_trap:
         nop
 
 
-       # At this point we may use %o0-7, %l3/4/5/7 as temporary regs
-       # save the whole user context to a trapframe_t
+       // At this point we may use %o0-7, %l3/4/5/7 as temporary regs
+       // save the whole user context to a trapframe_t
 
 2:     mov     %l0,%psr
        mov     %l6,%sp
@@ -56,14 +56,14 @@ handle_trap:
        call    env_save_tf
         add    %sp,64,%o0
 
-       # enable traps (but not interrupts)
+       // enable traps (but not interrupts)
        or      %l0,PSR_PIL,%l3
        wr      %l3,0,%psr
        wr      %l3,PSR_ET,%psr
 
-       # spill all trapper's windows out to the stack.
-       # the 'save' may trap (triggering the spill),
-       # and if the stack is corrupted, the process may die
+       // spill all trapper's windows out to the stack.
+       // the 'save' may trap (triggering the spill),
+       // and if the stack is corrupted, the process may die
        set     NWINDOWS,%g1
        ld      [%g1],%g1
        sub     %g1,1,%g2
@@ -71,24 +71,24 @@ handle_trap:
        bne,a   5b
 tflush:         save   %sp,0,%sp
 
-       # get our old cwp back (restore should NOT trap)
+       // get our old cwp back (restore should NOT trap)
        sub     %g1,1,%g2
 6:     deccc   %g2
        bne,a   6b
         restore
 
-       # restore interrupt level
+       // restore interrupt level
        wr      %l0,PSR_ET,%psr
 
-       # call the handler and pass in the tf, message, and handler addr
+       // call the handler and pass in the tf, message, and handler addr
        add     %sp,64,%o0
        call    trap
         mov    %l5,%o1
 
-       # should never get here
+       // should never get here
        unimp
 
-# void env_save_tf(trapframe_t* tf, uint32_t trap_pc, uint32_t trap_npc)
+// void env_save_tf(trapframe_t* tf, uint32_t trap_pc, uint32_t trap_npc)
        .global env_save_tf
 env_save_tf:
 
@@ -140,14 +140,14 @@ env_save_tf:
        .global env_pop_tf
 env_pop_tf:
 
-       # disable interrupts.
-       # since wrpsr/rdpsr is interruptible, all interrupt handlers
-       # must restore the psr to its interrupt-time value
+       // disable interrupts.
+       // since wrpsr/rdpsr is interruptible, all interrupt handlers
+       // must restore the psr to its interrupt-time value
        mov     %psr,%o1
        or      %o1,PSR_PIL,%o2
        wr      %o2,%psr
 
-       # spill all kernel windows to the stack
+       // spill all kernel windows to the stack
        set     NWINDOWS,%g1
        ld      [%g1],%g1
        sub     %g1,1,%g2
@@ -155,18 +155,24 @@ env_pop_tf:
        bne,a   5b
         save   %sp,0,%sp
 
-       # get our old cwp back (restore should NOT trap)
+       // get our old cwp back (restore should NOT trap)
        sub     %g1,1,%g2
 6:     deccc   %g2
        bne,a   6b
         restore
        
 
-       # disable traps, and restore interrupt level
+       // disable traps, and restore interrupt level
        wr      %o2,PSR_ET,%psr
        wr      %o1,PSR_ET,%psr
 
-       # is (CWP+1) % NWINDOWS valid?
+       // if we did this right (and didn't get an NMI!),
+       // then (CWP+1) % NWINDOWS should be invalid.  fix that.
+       save
+       mov     %i0,%o0
+
+#if 0
+       // is (CWP+1) % NWINDOWS valid?
        and     %o1,PSR_CWP,%o2
        set     NWINDOWS,%o1
        ld      [%o1],%o1
@@ -187,7 +193,9 @@ env_pop_tf:
         save   %o3,0,%l7               ! fill returns to %l7
        restore
 
-       # restore user context
+#endif
+
+       // restore user context
 4:     mov     %o0,%g2
        restore
        ldd     [%g2+32],%o0
index cbd124f..e06d96c 100644 (file)
@@ -63,7 +63,8 @@ KERN_APPFILES := \
                  $(USER_APPS_PARLIB_DIR)/channel_test_server \
                  $(USER_APPS_PARLIB_DIR)/hello \
                  $(USER_APPS_PARLIB_DIR)/manycore_test \
-                 $(USER_APPS_PARLIB_DIR)/matrix 
+                 $(USER_APPS_PARLIB_DIR)/matrix  \
+                 $(USER_APPS_PARLIB_DIR)/fptest
 #                 $(USER_APPS_PARLIB_DIR)/open_read
 
 KERN_LDFLAGS   := $(KERN_LDFLAGS) -L$(OBJDIR)/$(KERN_DIR) \
@@ -83,7 +84,7 @@ KERN_LDDEPENDS := $(KERN_OBJFILES) $(KERN_APPFILES) $(ARCH_DIR)/$(TARGET_ARCH)/k
 
 KERN_LDLIBS    := -livykern
 
-KERN_GCC_LIB   := $(GCC_LIB)
+KERN_GCC_LIB   ?= $(GCC_LIB)
 
 $(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.c
        @echo + cc [KERN] $<
@@ -93,7 +94,7 @@ $(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.c
 $(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.S
        @echo + as [KERN] $<
        @mkdir -p $(@D)
-       $(V)$(CC) $(KERN_CFLAGS) -c -o $@ $<
+       $(V)$(CC) $(KERN_CFLAGS) -D__ASSEMBLER__ -c -o $@ $<
 
 $(OBJDIR)/$(KERN_DIR)/kernel: $(KERN_LDDEPENDS)
        @echo + ld [KERN] $@
index a7394c0..606a2e0 100644 (file)
@@ -43,6 +43,7 @@ DECL_PROG(parlib_matrix);
 DECL_PROG(parlib_manycore_test);
 DECL_PROG(parlib_pthread_pthread_test);
 DECL_PROG(parlib_pthread_blackscholes);
+DECL_PROG(parlib_fptest);
 
 struct kfs_entry kfs[MAX_KFS_FILES] = {
        KFS_ENTRY(roslib_proctests)
@@ -60,6 +61,7 @@ struct kfs_entry kfs[MAX_KFS_FILES] = {
        KFS_ENTRY(parlib_manycore_test)
        KFS_ENTRY(parlib_pthread_pthread_test)
        KFS_ENTRY(parlib_pthread_blackscholes)
+       KFS_ENTRY(parlib_fptest)
 };
 
 ssize_t kfs_lookup_path(char* path)
index d90d99d..4a5a531 100644 (file)
@@ -245,9 +245,10 @@ void manager_waterman()
        switch(progress++)
        {
                case 0:
-                       RUN_APP("parlib_draw_nanwan_standalone",0);
+                       RUN_APP("parlib_fptest",0);
                        break;
                case 1:
+                       reboot();
                        RUN_APP("parlib_manycore_test",0);
                        break;
                case 2:
index 2bb2bb3..651790c 100644 (file)
@@ -49,7 +49,7 @@ int vcprintf(const char *fmt, va_list ap)
        volatile int i;
 
        // lock all output.  this will catch any printfs at line granularity
-       spin_lock_irqsave(&output_lock);
+//     spin_lock_irqsave(&output_lock);
 
        // do the buffered printf
        #ifdef __DEPUTY__
@@ -61,7 +61,7 @@ int vcprintf(const char *fmt, va_list ap)
        // write out remaining chars in the buffer
        buffered_putch(-1,&cntp);
 
-       spin_unlock_irqsave(&output_lock);
+//     spin_unlock_irqsave(&output_lock);
 
        return cnt;
 }
index c87bfec..558de88 100644 (file)
@@ -41,7 +41,7 @@ $(OBJDIR)/$(USER_PARLIB_SRC_DIR)/%.o: $(USER_PARLIB_SRC_DIR)/%.c $(PATCHFILE)
 $(OBJDIR)/$(USER_PARLIB_SRC_DIR)/%.o: $(USER_PARLIB_SRC_DIR)/%.S
        @echo + as [PARLIB] $<
        @mkdir -p $(@D)
-       $(V)$(CC) $(USER_PARLIB_SRC_CFLAGS) -c -o $@ $<
+       $(V)$(CC) $(USER_PARLIB_SRC_CFLAGS) -D__ASSEMBLER__ -c -o $@ $<
 
 $(OBJDIR)/$(USER_PARLIB_DIR)/libparlib.a: $(USER_PARLIB_SRC_OBJFILES)
        @echo + ar [PARLIB] $@
index a32d7ab..524f9ac 100644 (file)
@@ -34,7 +34,7 @@ $(OBJDIR)/$(USER_ROSLIB_SRC_DIR)/%.o: $(USER_ROSLIB_SRC_DIR)/%.c
 $(OBJDIR)/$(USER_ROSLIB_SRC_DIR)/%.o: $(USER_ROSLIB_SRC_DIR)/%.S
        @echo + as [ROSLIB] $<
        @mkdir -p $(@D)
-       $(V)$(CC) $(USER_ROSLIB_SRC_CFLAGS) -c -o $@ $<
+       $(V)$(CC) $(USER_ROSLIB_SRC_CFLAGS) -D__ASSEMBLER__ -c -o $@ $<
 
 $(OBJDIR)/$(USER_ROSLIB_DIR)/libroslib.a: $(USER_ROSLIB_SRC_OBJFILES)
        @echo + ar [ROSLIB] $@