Removed set_current_proc()
[akaros.git] / kern / arch / sparc / process.c
index 8729a0f..e7ccceb 100644 (file)
@@ -1,6 +1,7 @@
 #include <arch/arch.h>
 #include <arch/trap.h>
 #include <process.h>
+#include <frontend.h>
 #include <pmap.h>
 #include <smp.h>
 
 #pragma nosharc
 #endif
 
-
 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;
+       memset(tf,0,sizeof(*tf));
+
+       tf->psr = PSR_S; // but PS = 0
+       tf->gpr[14] = stack_top-96;
+
+       tf->pc = entryp;
+       tf->npc = entryp+4;
+
+       tf->gpr[6] = vcoreid;
 }
 
-void
-proc_init_trapframe(trapframe_t *tf)
+void proc_secure_trapframe(struct trapframe *tf)
 {
-        extern char trap_table;
-
-        tf->gpr[14] = USTACKTOP-64;
-        tf->psr = PSR_S; // but PS = 0
-        tf->wim = 0;
-        tf->tbr = (uint32_t)&trap_table;
+       // only take the condition codes from the user.  we set S=1, PS=0
+       tf->psr = (tf->psr & PSR_ICC) | PSR_S;
 }
 
-void proc_set_tfcoreid(trapframe_t *tf, uint32_t id)
+/* Called when we are currently running an address space on our core and want to
+ * abandon it.  We need a known good pgdir before releasing the old one.  We
+ * decref, since current no longer tracks the proc (and current no longer
+ * protects the cr3). */
+void __abandon_core(void)
 {
-       tf->gpr[8] = id;
+       struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
+       lcr3(boot_cr3);
+       kref_put(&pcpui->cur_proc->kref);
+       pcpui->cur_proc = 0;
 }