Embed ISRs at known address
[viridis.git] / kernel / smp.c
1 /* vim: set ts=4 sw=4 sts=4 et : */
2
3 #include <kernel.h>
4 #include <map.h>
5 #include <apic.h>
6 #include <vsalloc.h>
7
8 #include <asm/realmode.h>
9 #include <asm/regs.h>
10
11 static struct rm_header *realboot = NULL;
12
13 /* Yes, I know this is currently racy as fuck, it just doesn't matter yet */
14
15 void secondary_start(void)
16 {
17     printk("Here\n");
18     while (1) ;
19 }
20
21 void smp_wake(u32 apic_id)
22 {
23     int my_lapic = apic->get_id();
24
25     if (apic_id != my_lapic) {
26
27         /* kernel stacks are part of the big kernel virtual space, so no need
28          * to inform vsalloc */
29
30         page_alloc_to_virtual(STACK_ADDR_CPU(apic_id), STACK_PAGES_ORDER);
31
32         apic->wake_secondary(apic_id);
33     }
34 }
35
36 int smp_prepare(void)
37 {
38     map_page(REALMODE_PA, REALMODE_PA);
39     realboot = (void *)REALMODE_PA;
40
41     memcpy(realboot, &realmode_bin, REALMODE_BIN_LEN);
42
43     realboot->gdtr = (VIRT_BASE + (u64) & GDTR_64);
44     realboot->cr3 = get_cr3();
45     realboot->kernel_entry = (u64) secondary_start;
46
47     return 0;
48 }