e7cccebb6dacaa0a9bab52632ca0a2047a79cdbf
[akaros.git] / kern / arch / sparc / process.c
1 #include <arch/arch.h>
2 #include <arch/trap.h>
3 #include <process.h>
4 #include <frontend.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 void
17 proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
18                     uint32_t entryp, uint32_t stack_top)
19 {
20         memset(tf,0,sizeof(*tf));
21
22         tf->psr = PSR_S; // but PS = 0
23         tf->gpr[14] = stack_top-96;
24
25         tf->pc = entryp;
26         tf->npc = entryp+4;
27
28         tf->gpr[6] = vcoreid;
29 }
30
31 void proc_secure_trapframe(struct trapframe *tf)
32 {
33         // only take the condition codes from the user.  we set S=1, PS=0
34         tf->psr = (tf->psr & PSR_ICC) | PSR_S;
35 }
36
37 /* Called when we are currently running an address space on our core and want to
38  * abandon it.  We need a known good pgdir before releasing the old one.  We
39  * decref, since current no longer tracks the proc (and current no longer
40  * protects the cr3). */
41 void __abandon_core(void)
42 {
43         struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
44         lcr3(boot_cr3);
45         kref_put(&pcpui->cur_proc->kref);
46         pcpui->cur_proc = 0;
47 }