a4d7d81812404fa3d1c6efe72cb895b0dbeebfb7
[akaros.git] / kern / arch / sparc / process.c
1 #include <arch/arch.h>
2 #include <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 /* TODO: handle user and kernel contexts */
17 void proc_pop_ctx(struct user_context *ctx)
18 {
19         struct hw_trapframe *tf = &ctx->tf.hw_tf;
20         assert(ctx->type = ROS_HW_CTX);
21         extern void env_pop_tf(struct hw_trapframe *tf);        /* in asm */
22         env_pop_tf(tf);
23 }
24
25 /* TODO: consider using a SW context */
26 void proc_init_ctx(struct user_context *ctx, uint32_t vcoreid, uintptr_t entryp,
27                    uintptr_t stack_top)
28 {
29         struct hw_trapframe *tf = &ctx->tf.hw_tf;
30         ctx->type = ROS_HW_CTX;
31
32         memset(tf,0,sizeof(*tf));
33
34         tf->psr = PSR_S; // but PS = 0
35         tf->gpr[14] = stack_top-96;
36
37         tf->pc = entryp;
38         tf->npc = entryp+4;
39
40         tf->gpr[6] = vcoreid;
41 }
42
43 /* TODO: handle both HW and SW contexts */
44 void proc_secure_ctx(struct user_context *ctx)
45 {
46         struct hw_trapframe *tf = &ctx->tf.hw_tf;
47         ctx->type = ROS_HW_CTX;
48         // only take the condition codes from the user.  we set S=1, PS=0
49         tf->psr = (tf->psr & PSR_ICC) | PSR_S;
50 }
51
52 /* Called when we are currently running an address space on our core and want to
53  * abandon it.  We need a known good pgdir before releasing the old one.  We
54  * decref, since current no longer tracks the proc (and current no longer
55  * protects the cr3). */
56 void __abandon_core(void)
57 {
58         struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
59         lcr3(boot_cr3);
60         proc_decref(pcpui->cur_proc);
61         pcpui->cur_proc = 0;
62 }