User programs now tell kernel the stack pointers for new harts
authorAndrew Waterman <waterman@s143.Millennium.Berkeley.EDU>
Sat, 13 Mar 2010 05:10:42 +0000 (21:10 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:36 +0000 (17:35 -0700)
...using procdata.  This change also eliminated the functions
proc_set_tfcoreid and proc_set_program_counter; instead, they
are args to proc_init_trapframe.

kern/arch/i386/process.c
kern/arch/sparc/process.c
kern/include/process.h
kern/include/ros/procdata.h
kern/src/elf.c
kern/src/env.c
kern/src/process.c

index 8ee744d..06aa9cd 100644 (file)
@@ -18,12 +18,8 @@ void proc_free_arch(struct proc *SAFE p)
 {
 }
 
-void proc_set_program_counter(trapframe_t *tf, uintptr_t pc)
-{
-       tf->tf_eip = pc;
-}
-
-void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid)
+void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
+                         uint32_t entryp, uint32_t stack_top)
 {
        /* Set up appropriate initial values for the segment registers.
         * GD_UD is the user data segment selector in the GDT, and
@@ -33,19 +29,16 @@ void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid)
        tf->tf_ds = GD_UD | 3;
        tf->tf_es = GD_UD | 3;
        tf->tf_ss = GD_UD | 3;
-       tf->tf_esp = USTACKTOP;
+       tf->tf_esp = stack_top;
        tf->tf_cs = GD_UT | 3;
        /* set the env's EFLAGSs to have interrupts enabled */
        tf->tf_eflags |= 0x00000200; // bit 9 is the interrupts-enabled
 
-       proc_set_tfcoreid(tf,vcoreid);
-}
+       tf->tf_eip = entryp;
 
-/* Coupled closely with userland's entry.S.  id is the vcoreid, which entry.S
- * uses to determine what to do.  vcoreid == 0 is the main core/context. */
-void proc_set_tfcoreid(trapframe_t *tf, uint32_t id)
-{
-       tf->tf_regs.reg_eax = id;
+       /* Coupled closely with user's entry.S.  id is the vcoreid, which entry.S
+        * uses to determine what to do.  vcoreid == 0 is the main core/context. */
+       tf->tf_regs.reg_eax = vcoreid;
 }
 
 /* For cases that we won't return from a syscall via the normal path, and need
index 04208f9..f3a15e1 100644 (file)
@@ -33,31 +33,17 @@ proc_free_arch(struct proc *SAFE p)
 }
 
 void
-proc_set_program_counter(trapframe_t *tf, uintptr_t pc)
+proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
+                    uint32_t entryp, uint32_t stack_top)
 {
-       tf->pc = pc;
-       tf->npc = pc+4;
-}
-
-void
-proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid)
-{
-       extern char trap_table;
-
        memset(tf,0,sizeof(*tf));
-       tf->gpr[14] = USTACKTOP-96;
-       tf->psr = PSR_S; // but PS = 0
-
-       // unused
-       //tf->wim = 0;
-       //tf->tbr = (uint32_t)&trap_table;
 
-       proc_set_tfcoreid(tf,vcoreid);
-}
+       tf->psr = PSR_S; // but PS = 0
+       tf->gpr[14] = stack_top-96;
+       tf->asr13 = vcoreid;
 
-void proc_set_tfcoreid(trapframe_t *tf, uint32_t id)
-{
-       tf->asr13 = id;
+       tf->pc = entryp;
+       tf->npc = entryp+4;
 }
 
 /* For cases that we won't return from a syscall via the normal path, and need
index 8341334..9a52fe8 100644 (file)
@@ -148,9 +148,8 @@ void __death(trapframe_t *tf, uint32_t srcid, void * a0, void * a1,
 /* Arch Specific */
 void proc_init_arch(struct proc *SAFE p);
 void proc_free_arch(struct proc *SAFE p);
-void proc_set_program_counter(trapframe_t *SAFE tf, uintptr_t pc);
-void proc_init_trapframe(trapframe_t *SAFE tf, uint32_t vcoreid);
-void proc_set_tfcoreid(trapframe_t *SAFE tf, uint32_t id);
+void proc_init_trapframe(trapframe_t *SAFE tf, uint32_t vcoreid,
+                         uint32_t entryp, uint32_t stack_top);
 void proc_set_syscall_retval(trapframe_t *SAFE tf, intreg_t value);
 
 /* Degubbing */
index 6d0913c..5c3a4de 100644 (file)
@@ -9,6 +9,7 @@
 #include <ros/common.h>
 #include <ros/procinfo.h>
 #include <arch/mmu.h>
+#include <arch/arch.h>
 
 typedef struct procdata {
        // The actual ring buffers for communicating with user space
@@ -19,6 +20,8 @@ typedef struct procdata {
 #ifdef __i386__
        segdesc_t *ldt;
 #endif
+
+       char stack_pointers[MAX_NUM_CPUS];
 } procdata_t;
 #define PROCDATA_NUM_PAGES  ((sizeof(procdata_t)-1)/PGSIZE + 1)
 
index 69e8b50..1df6994 100644 (file)
@@ -125,7 +125,7 @@ int load_elf(struct proc* p, const char* fn)
        }
 
        intptr_t core0_entry = ei.dynamic ? interp_ei.entry : ei.entry;
-       proc_set_program_counter(&p->env_tf,core0_entry);
+       proc_init_trapframe(&p->env_tf,0,core0_entry,USTACKTOP);
        p->env_entry = ei.entry;
 
        uintptr_t stacksz = USTACK_NUM_PAGES*PGSIZE;
index 9260c43..8dd177d 100644 (file)
@@ -284,7 +284,7 @@ static void* load_icode(env_t *SAFE e, env_t* binary_env,
                //because upage_alloc'd pages are zeroed
        }}
 
-       proc_set_program_counter(&e->env_tf, elfhdr.e_entry);
+       proc_init_trapframe(&e->env_tf, 0, elfhdr.e_entry, USTACKTOP);
        e->env_entry = elfhdr.e_entry;
 
        // Now map USTACK_NUM_PAGES pages for the program's initial stack
index 6a21169..d8c0646 100644 (file)
@@ -249,7 +249,6 @@ static error_t proc_alloc(struct proc *SAFE*SAFE pp, pid_t parent_id)
        memset(&p->resources, 0, sizeof(p->resources));
        memset(&p->env_ancillary_state, 0, sizeof(p->env_ancillary_state));
        memset(&p->env_tf, 0, sizeof(p->env_tf));
-       proc_init_trapframe(&p->env_tf,0);
 
        /* Initialize the contents of the e->env_procinfo structure */
        proc_init_procinfo(p);
@@ -965,6 +964,7 @@ void __startcore(trapframe_t *tf, uint32_t srcid, void * a0, void * a1,
 #endif
 {
        uint32_t coreid = core_id();
+       uint32_t vcoreid = (uint32_t)a2;
        struct proc *p_to_run = (struct proc *CT(1))a0;
        trapframe_t local_tf;
        trapframe_t *tf_to_pop = (trapframe_t *CT(1))a1;
@@ -976,9 +976,8 @@ void __startcore(trapframe_t *tf, uint32_t srcid, void * a0, void * a1,
        if (!tf_to_pop) {
                tf_to_pop = &local_tf;
                memset(tf_to_pop, 0, sizeof(*tf_to_pop));
-               proc_init_trapframe(tf_to_pop,(uint32_t)a2);
-               // Note the init_tf sets tf_to_pop->tf_esp = USTACKTOP;
-               proc_set_program_counter(tf_to_pop, p_to_run->env_entry);
+               proc_init_trapframe(tf_to_pop, vcoreid, p_to_run->env_entry,
+                                   p_to_run->env_procdata->stack_pointers[vcoreid]);
        }
        /* the sender of the amsg increfed, thinking we weren't running current. */
        if (p_to_run == current)