Fixing syscalls to new seterrno and setretval.
[akaros.git] / kern / arch / sparc / process.c
index f3a15e1..65dc46d 100644 (file)
@@ -1,7 +1,7 @@
 #include <arch/arch.h>
 #include <arch/trap.h>
-#include <arch/frontend.h>
 #include <process.h>
+#include <frontend.h>
 #include <pmap.h>
 #include <smp.h>
 
 #pragma nosharc
 #endif
 
-// architecture-specific process initialization code
-void
-proc_init_arch(struct proc *SAFE p)
-{
-       pid_t parent_id = p->ppid, id = p->pid;
-       int32_t errno;
-       if(frontend_syscall(parent_id,RAMP_SYSCALL_proc_init,id,0,0,0,&errno))
-               panic("Front-end server couldn't initialize new process!");
-}
-
-// architecture-specific process termination code
-void
-proc_free_arch(struct proc *SAFE p)
-{
-       int32_t errno;
-       if(frontend_syscall(0,RAMP_SYSCALL_proc_free,p->pid,0,0,0,&errno))
-               panic("Front-end server couldn't free process!");
-}
-
 void
 proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
                     uint32_t entryp, uint32_t stack_top)
@@ -40,16 +21,26 @@ proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
 
        tf->psr = PSR_S; // but PS = 0
        tf->gpr[14] = stack_top-96;
-       tf->asr13 = vcoreid;
 
        tf->pc = entryp;
        tf->npc = entryp+4;
+
+       tf->gpr[6] = vcoreid;
+}
+
+void proc_secure_trapframe(struct trapframe *tf)
+{
+       // only take the condition codes from the user.  we set S=1, PS=0
+       tf->psr = (tf->psr & PSR_ICC) | PSR_S;
 }
 
-/* For cases that we won't return from a syscall via the normal path, and need
- * to set the syscall return value in the registers manually.  Like in a syscall
- * moving to RUNNING_M */
-void proc_set_syscall_retval(trapframe_t *SAFE tf, intreg_t value)
+/* 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] = value;
+       lcr3(boot_cr3);
+       kref_put(&current->kref);
+       set_current_proc(NULL);
 }