Merge origin/netpush (networking code) (XCC)
[akaros.git] / kern / arch / riscv / process.c
1 #include <arch/arch.h>
2 #include <arch/trap.h>
3 #include <process.h>
4 #include <pmap.h>
5 #include <smp.h>
6
7 #include <string.h>
8 #include <assert.h>
9 #include <stdio.h>
10
11 void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
12                          uintptr_t entryp, uintptr_t stack_top)
13 {
14         memset(tf, 0, sizeof(*tf));
15
16         tf->gpr[30] = stack_top-64;
17         tf->sr = SR_U64;
18
19         tf->epc = entryp;
20
21         /* Coupled closely with user's entry.S.  id is the vcoreid, which entry.S
22          * uses to determine what to do.  vcoreid == 0 is the main core/context. */
23         tf->gpr[4] = vcoreid;
24 }
25
26 void proc_secure_trapframe(struct trapframe *tf)
27 {
28         tf->sr = SR_U64;
29 }
30
31 /* Called when we are currently running an address space on our core and want to
32  * abandon it.  We need a known good pgdir before releasing the old one.  We
33  * decref, since current no longer tracks the proc (and current no longer
34  * protects the cr3).  We also need to clear out the TLS registers (before
35  * unmapping the address space!) */
36 void __abandon_core(void)
37 {
38         struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
39         lcr3(boot_cr3);
40         proc_decref(pcpui->cur_proc);
41         pcpui->cur_proc = 0;
42 }