]> rtime.felk.cvut.cz Git - jailhouse.git/blob - inmates/lib/x86/header.S
inmates: x86: Add basic SMP support
[jailhouse.git] / inmates / lib / x86 / header.S
1 /*
2  * Jailhouse, a Linux-based partitioning hypervisor
3  *
4  * Copyright (c) Siemens AG, 2013
5  *
6  * Authors:
7  *  Jan Kiszka <jan.kiszka@siemens.com>
8  *
9  * This work is licensed under the terms of the GNU GPL, version 2.  See
10  * the COPYING file in the top-level directory.
11  */
12
13 #include <inmate.h>
14
15 #define X86_CR0_PE              0x00000001
16 #define X86_CR0_WP              0x00010000
17 #define X86_CR0_PG              0x80000000
18
19 #define X86_CR4_PAE             0x00000020
20
21 #define MSR_EFER                0xc0000080
22 #define EFER_LME                0x00000100
23
24 #define MSR_MTRR_DEF_TYPE       0x000002ff
25 #define MTRR_ENABLE             0x00000800
26
27         .code16
28         .section ".boot", "ax"
29
30         .globl __reset_entry
31 __reset_entry:
32         ljmp $0xf000,$start16
33
34
35         .section ".startup", "ax"
36
37 start16:
38         lgdtl %cs:gdt_ptr
39
40         mov %cr0,%eax
41         or $X86_CR0_PE,%al
42         mov %eax,%cr0
43
44         ljmpl $INMATE_CS32,$start32 + FSEGMENT_BASE
45
46
47         .code32
48 start32:
49         mov %cr4,%eax
50         or $X86_CR4_PAE,%eax
51         mov %eax,%cr4
52
53         mov $pml4 + FSEGMENT_BASE,%eax
54         mov %eax,%cr3
55
56         movl $MSR_MTRR_DEF_TYPE,%ecx
57         rdmsr
58         or $MTRR_ENABLE,%eax
59         wrmsr
60
61         movl $MSR_EFER,%ecx
62         rdmsr
63         or $EFER_LME,%eax
64         wrmsr
65
66         mov $(X86_CR0_PG | X86_CR0_WP | X86_CR0_PE),%eax
67         mov %eax,%cr0
68
69         ljmpl $INMATE_CS64,$start64 + FSEGMENT_BASE
70
71         .code64
72 start64:
73         xor %rbx,%rbx
74         xchg ap_entry,%rbx
75         or %rbx,%rbx
76         jnz call_entry
77
78         mov $1,%edi
79         lock xadd %edi,cpu_number + FSEGMENT_BASE
80
81         cmp $SMP_MAX_CPUS,%edi
82         jae stop
83
84         mov $0x01,%eax
85         cpuid
86         shr $24,%ebx
87         mov %bl,smp_cpu_ids(%edi)
88
89         lock incl smp_num_cpus
90
91         cmp $0,%edi
92         jne stop
93
94         xor %rax,%rax
95         mov $bss_start,%rdi
96         mov $bss_qwords,%rcx
97         rep stosq
98
99         mov $inmate_main,%rbx
100
101 call_entry:
102         mov $stack_top,%rsp
103         callq *%rbx
104
105 stop:   cli
106         hlt
107         jmp stop
108
109
110         .pushsection ".data"
111
112         .globl ap_entry
113 ap_entry:
114         .quad   0
115
116         .globl smp_num_cpus
117 smp_num_cpus:
118         .long   0
119
120         .globl smp_cpu_ids
121 smp_cpu_ids:
122         .fill   SMP_MAX_CPUS, 1, 0
123
124         .popsection
125
126 cpu_number:
127         .long   0
128
129         .align(16)
130 gdt:
131         .quad   0
132         .quad   0x00c09b000000ffff
133         .quad   0x00af9b000000ffff
134
135 gdt_ptr:
136         .short  gdt_ptr - gdt - 1
137         .long   gdt + FSEGMENT_BASE
138
139         .align(4096)
140 pml4:
141         .quad   pdpt + FSEGMENT_BASE + 0x003
142
143         .align(4096)
144 pdpt:
145         .quad   pd + FSEGMENT_BASE + 0x003
146
147         .align(4096)
148 pd:
149         .quad   0x0000000000000083
150         .align(4096)