i386 parlib follows sparc parlib stack conventions
authorKevin Klues <klueska@cs.berkeley.edu>
Mon, 26 Oct 2009 09:22:13 +0000 (10:22 +0100)
committerKevin Klues <klueska@cs.berkeley.edu>
Mon, 26 Oct 2009 09:22:13 +0000 (10:22 +0100)
kern/arch/i386/ros/hart.h
kern/src/syscall.c
user/parlib/src/Makefrag
user/parlib/src/i386/entry.S
user/parlib/src/i386/newlib_backend.c
user/parlib/src/newlib_backend.c [new file with mode: 0644]
user/parlib/src/sparc/newlib_backend.c

index 5e6cf6e..fbd0659 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _ROS_ARCH_HART_H
 #define _ROS_ARCH_HART_H
 
+#define HART_ALLOCATE_STACKS
+
 #include <parlib.h>
 
 // The actual hart_self() function is a global symbol that invokes this routine.
index 4e43603..7019506 100644 (file)
@@ -335,9 +335,18 @@ static envid_t sys_getcpuid(void)
        return core_id();
 }
 
+// TODO: Temporary hack until thread-local storage is implemented on i386
 static size_t sys_getvcoreid(env_t* e)
 {
-       return e->vcoremap[core_id()];
+       if(e->state == PROC_RUNNING_S)
+               return 0;
+
+       size_t i;
+       for(i = 0; i < e->num_vcores; i++)
+               if(core_id() == e->vcoremap[i])
+                       return i;
+
+       panic("virtual core id not found in sys_getvcoreid()!");
 }
 
 // TODO FIX Me!!!! for processes
index 1016696..c87bfec 100644 (file)
@@ -15,6 +15,7 @@ USER_PARLIB_SRC_SRCFILES := $(USER_PARLIB_SRC_DIR)/debug.c \
                             $(USER_PARLIB_SRC_DIR)/parlibmain.c \
                             $(USER_PARLIB_SRC_DIR)/channel.c \
                             $(USER_PARLIB_SRC_DIR)/hart.c \
+                            $(USER_PARLIB_SRC_DIR)/newlib_backend.c \
                             $(USER_PARLIB_ARCH_SRCFILES)
 
 USER_PARLIB_SRC_OBJFILES := $(patsubst $(USER_PARLIB_SRC_DIR)/%.c, \
index 5edc303..ab5b4ec 100644 (file)
        .globl procdata
        .set procdata, UDATA
 
+// Stack pointers, to be allocated by the hart lib
+       .globl stack_ptr_array
+       stack_ptr_array:
+               .word 0
+
 // TODO: We're not exposing these yet.  Think about how to do so judiciously.
 //     .globl vpt
 //     .set vpt, UVPT
 .text
 .globl _start
 _start:
+       // Are we core 0?
+       test    %eax,%eax
+       jne     notcore0
+
        // See if we were started with arguments on the stack
        cmpl $USTACKTOP, %esp
        jne args_exist
@@ -36,3 +45,12 @@ args_exist:
        call parlibmain
 1:      jmp 1b
 
+notcore0:
+       mov     stack_ptr_array,%edx
+       mov     (%edx,%eax,4),%esp
+
+       call    hart_entry
+
+       call    hart_yield
+
+1:     jmp     1b
index 1e327ec..4de33e7 100644 (file)
@@ -420,35 +420,6 @@ int read_buffer_from_channel(char *buf, int len)
                                                                NO_PEEK);
 }
 
-/* sbrk()
- * Increase program data space. 
- * As malloc and related functions depend on this, it is 
- * useful to have a working implementation. 
- * The following suffices for a standalone system; it exploits the 
- * symbol _end automatically defined by the GNU linker.
- */
-void* sbrk(ptrdiff_t incr) 
-{
-       debug_in_out("SBRK\n");
-       debug_in_out("\tincr: %u\n", incr);     
-
-       extern char (SNT RO _end)[];
-       static void* heap_end = NULL;
-       if (heap_end == NULL)
-               heap_end = (void*)_end;
-
-       uint8_t* prev_heap_end; 
-       prev_heap_end = heap_end;
-       if (sys_brk(heap_end + incr) < 0) {
-               errno = ENOMEM;
-               return (void*CT(1))TC(-1);
-       }
-     
-       heap_end += incr;
-       debug_in_out("\treturning: %u\n", prev_heap_end);
-       return (caddr_t) prev_heap_end;
-}
-
 /* send_message()
  * Write the message in buffer out on the channel, and wait for a response.
  * Caller is responsible for management of buffer passed in and buffer returned.
diff --git a/user/parlib/src/newlib_backend.c b/user/parlib/src/newlib_backend.c
new file mode 100644 (file)
index 0000000..9df1878
--- /dev/null
@@ -0,0 +1,37 @@
+#include <hart.h>
+#include <parlib.h>
+#include <unistd.h>
+#include <newlib_backend.h>
+
+/* sbrk()
+ * Increase program data space. 
+ * As malloc and related functions depend on this, it is 
+ * useful to have a working implementation. 
+ * The following suffices for a standalone system; it exploits the 
+ * symbol _end automatically defined by the GNU linker.
+ */
+void* sbrk(ptrdiff_t incr) 
+{
+       debug_in_out("SBRK\n");
+       debug_in_out("\tincr: %u\n", incr);     
+
+       extern char (SNT RO _end)[];
+       static void* heap_end = NULL;
+
+       static hart_lock_t sbrk_lock = HART_LOCK_INIT;
+       hart_lock_lock(&sbrk_lock);
+       if (heap_end == NULL)
+               heap_end = (void*)_end;
+
+       uint8_t* prev_heap_end; 
+       prev_heap_end = heap_end;
+       if (sys_brk(heap_end + incr) < 0) {
+               errno = ENOMEM;
+               return (void*CT(1))TC(-1);
+       }
+     
+       heap_end += incr;
+       hart_lock_unlock(&sbrk_lock);
+       debug_in_out("\treturning: %u\n", prev_heap_end);
+       return (void*) prev_heap_end;
+}
index 0e884d0..59df8f5 100644 (file)
@@ -139,28 +139,3 @@ gettimeofday(struct timeval* tp, void* tzp)
        return syscall(SYS_frontend,RAMP_SYSCALL_gettimeofday,(int)tp,(int)tzp,0,0);
 }
 
-/* sbrk()
- * Increase program data space. 
- * As malloc and related functions depend on this, it is 
- * useful to have a working implementation. 
- * The following suffices for a standalone system; it exploits the 
- * symbol _end automatically defined by the GNU linker.
- */
-void* sbrk(ptrdiff_t incr) 
-{
-       #define HEAP_SIZE (1<<23)
-       static uint8_t array[HEAP_SIZE];
-       static uint8_t *BND(array, array + HEAP_SIZE) heap_end = array;
-       static uint8_t *stack_ptr = &(array[HEAP_SIZE-1]);
-
-       uint8_t* prev_heap_end; 
-
-       prev_heap_end = heap_end;
-       if (heap_end + incr > stack_ptr) {
-               errno = ENOMEM;
-               return (void*CT(1))TC(-1);
-       }
-
-       heap_end += incr;
-       return (caddr_t) prev_heap_end;
-}