Synced up SPARC port
[akaros.git] / kern / arch / sparc / process.c
1 #include <arch/arch.h>
2 #include <arch/trap.h>
3 #include <arch/frontend.h>
4 #include <process.h>
5 #include <pmap.h>
6 #include <smp.h>
7
8 #include <string.h>
9 #include <assert.h>
10 #include <stdio.h>
11
12 #ifdef __SHARC__
13 #pragma nosharc
14 #endif
15
16 // architecture-specific process initialization code
17 void
18 proc_init_arch(struct proc *SAFE p)
19 {
20         pid_t parent_id = p->ppid, id = p->pid;
21         if(frontend_syscall(parent_id,RAMP_SYSCALL_proc_init,id,0,0))
22                 panic("Front-end server couldn't initialize new process!");
23 }
24
25 // architecture-specific process termination code
26 void
27 proc_free_arch(struct proc *SAFE p)
28 {
29         if(frontend_syscall(0,RAMP_SYSCALL_proc_free,p->pid,0,0))
30                 panic("Front-end server couldn't free process!");
31 }
32
33 void
34 proc_set_program_counter(trapframe_t *tf, uintptr_t pc)
35 {
36         tf->pc = pc;
37         tf->npc = pc+4;
38 }
39
40 void
41 proc_init_trapframe(trapframe_t *tf)
42 {
43         extern char trap_table;
44
45         tf->gpr[14] = USTACKTOP-64;
46         tf->psr = PSR_S; // but PS = 0
47         tf->wim = 0;
48         tf->tbr = (uint32_t)&trap_table;
49 }
50
51 void proc_set_tfcoreid(trapframe_t *tf, uint32_t id)
52 {
53         tf->gpr[6] = id;
54 }
55
56 /* For cases that we won't return from a syscall via the normal path, and need
57  * to set the syscall return value in the registers manually.  Like in a syscall
58  * moving to RUNNING_M */
59 void proc_set_syscall_retval(trapframe_t *SAFE tf, intreg_t value)
60 {
61         tf->gpr[8] = value;
62 }