Vcore mapping and idle core management
[akaros.git] / kern / arch / i386 / 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_set_program_counter(trapframe_t *tf, uintptr_t pc)
12 {
13         tf->tf_eip = pc;
14 }
15
16 void proc_init_trapframe(trapframe_t *tf)
17 {
18         /* Set up appropriate initial values for the segment registers.
19          * GD_UD is the user data segment selector in the GDT, and
20          * GD_UT is the user text segment selector (see inc/memlayout.h).
21          * The low 2 bits of each segment register contains the
22          * Requestor Privilege Level (RPL); 3 means user mode. */
23         tf->tf_ds = GD_UD | 3;
24         tf->tf_es = GD_UD | 3;
25         tf->tf_ss = GD_UD | 3;
26         tf->tf_esp = USTACKTOP;
27         tf->tf_cs = GD_UT | 3;
28         /* set the env's EFLAGSs to have interrupts enabled */
29         tf->tf_eflags |= 0x00000200; // bit 9 is the interrupts-enabled
30 }
31
32 /* Coupled closely with userland's entry.S.  id is the vcoreid, which entry.S
33  * uses to determine what to do.  vcoreid == 0 is the main core/context. */
34 void proc_set_tfcoreid(trapframe_t *tf, uint32_t id)
35 {
36         tf->tf_regs.reg_eax = id;
37 }