kconfig: use pkg-config for ncurses detection
[akaros.git] / kern / arch / riscv / process.c
1 #include <arch/arch.h>
2 #include <pmap.h>
3 #include <process.h>
4 #include <smp.h>
5 #include <trap.h>
6
7 #include <assert.h>
8 #include <stdio.h>
9 #include <string.h>
10
11 void proc_pop_ctx(struct user_context *ctx)
12 {
13         struct hw_trapframe *tf = &ctx->tf.hw_tf;
14         assert(ctx->type == ROS_HW_CTX);
15         extern void pop_hw_tf(struct hw_trapframe * tf)
16             __attribute__((noreturn)); /* in asm */
17         pop_hw_tf(tf);
18 }
19
20 /* TODO: consider using a SW context */
21 void proc_init_ctx(struct user_context *ctx, uint32_t vcoreid, uintptr_t entryp,
22                    uintptr_t stack_top, uintptr_t tls_desc)
23 {
24         struct hw_trapframe *tf = &ctx->tf.hw_tf;
25         ctx->type = ROS_HW_CTX;
26
27         /* TODO: If you'd like, take tls_desc and save it in the ctx somehow, so
28          * that proc_pop_ctx will set up that TLS before launching.  If you do
29          * this, you can change _start.c to not reset the TLS in userspace.
30          *
31          * This is a bigger deal on amd64, where we take a (fast) syscall to
32          * change the TLS desc, right after the kernel just 0'd out the TLS
33          * desc.  If you can change your HW TLS desc with negligible overhead,
34          * then feel free to do whatever.  Long term, it might be better to do
35          * whatever amd64 does. */
36
37         memset(tf, 0, sizeof(*tf));
38
39         tf->gpr[GPR_SP] = stack_top - 64;
40         tf->sr = SR_U64 | SR_EF;
41
42         tf->epc = entryp;
43
44         /* Coupled closely with user's entry.S.  id is the vcoreid, which
45          * entry.S uses to determine what to do.  vcoreid == 0 is the main
46          * core/context. */
47         tf->gpr[GPR_A0] = vcoreid;
48 }
49
50 /* TODO: handle SW and VM contexts */
51 void proc_secure_ctx(struct user_context *ctx)
52 {
53         struct hw_trapframe *tf = &ctx->tf.hw_tf;
54         ctx->type = ROS_HW_CTX;
55         tf->sr = SR_U64 | SR_EF;
56 }
57
58 /* Called when we are currently running an address space on our core and want to
59  * abandon it.  We need a known good pgdir before releasing the old one.  We
60  * decref, since current no longer tracks the proc (and current no longer
61  * protects the cr3).  We also need to clear out the TLS registers (before
62  * unmapping the address space!) */
63 void __abandon_core(void)
64 {
65         struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
66         struct proc *old_proc;
67
68         lcr3(boot_cr3);
69         old_proc = pcpui->cur_proc;
70         pcpui->cur_proc = NULL;
71         proc_decref(old_proc);
72 }
73
74 void __clear_owning_proc(uint32_t coreid)
75 {
76 }