]> rtime.felk.cvut.cz Git - jailhouse-test.git/blob - bootstrap-relink/header-32-inmate.S
054ac70fd5fe3af19a9d8e222061981d45c8a9a7
[jailhouse-test.git] / bootstrap-relink / header-32-inmate.S
1 #include <inmate.h>
2
3 #define X86_CR0_PE              0x00000001
4 #define X86_CR0_WP              0x00010000
5 #define X86_CR0_PG              0x80000000
6
7 #define X86_CR4_PSE             0x00000010
8
9 #define MSR_MTRR_DEF_TYPE       0x000002ff
10 #define MTRR_ENABLE             0x00000800
11
12         .code16
13         .section ".boot", "ax"
14
15         .globl __reset_entry
16         .extern _start
17 __reset_entry:
18         ljmp $0xf000,$start16
19
20
21         .section ".startup", "ax"
22
23 start16:
24         lgdtl %cs:gdt_ptr
25
26         mov %cr0,%eax
27         or $X86_CR0_PE,%al
28         mov %eax,%cr0
29
30         ljmpl $INMATE_CS32,$start32 + FSEGMENT_BASE
31
32
33         .code32
34 start32:
35         mov %cr4,%eax
36         or $X86_CR4_PSE,%eax
37         mov %eax,%cr4
38
39         mov $loader_pdpt + FSEGMENT_BASE,%eax
40         mov %eax,%cr3
41
42         mov $(X86_CR0_PG | X86_CR0_WP | X86_CR0_PE),%eax
43         mov %eax,%cr0
44
45         movl $MSR_MTRR_DEF_TYPE,%ecx
46         rdmsr
47         or $MTRR_ENABLE,%eax
48         wrmsr
49
50         mov $INMATE_DS32,%eax
51         mov %eax,%ds
52         mov %eax,%es
53         mov %eax,%ss
54
55         xor %ebx,%ebx
56         xchg ap_entry,%ebx
57         or %ebx,%ebx
58         jnz call_entry
59
60         mov $1,%edi
61         lock xadd %edi,cpu_number + FSEGMENT_BASE
62
63         cmp $SMP_MAX_CPUS,%edi
64         jae stop
65
66         mov $0x01,%eax
67         cpuid
68         shr $24,%ebx
69         mov %bl,smp_cpu_ids(%edi)
70
71         lock incl smp_num_cpus
72
73         cmp $0,%edi
74         jne stop
75
76         xor %eax,%eax
77         mov $bss_start,%edi
78         mov $bss_dwords,%ecx
79         rep stosl
80
81         mov $_start,%ebx
82
83 call_entry:
84         mov $stack_top,%esp
85         call *%ebx
86
87 stop:   cli
88         hlt
89         jmp stop
90
91
92         .pushsection ".data"
93
94         .globl ap_entry
95 ap_entry:
96         .long   0
97
98         .globl smp_num_cpus
99 smp_num_cpus:
100         .long   0
101
102         .globl smp_cpu_ids
103 smp_cpu_ids:
104         .fill   SMP_MAX_CPUS, 1, 0
105
106         .popsection
107
108 cpu_number:
109         .long   0
110
111         .align(16)
112         .global loader_gdt
113 loader_gdt:
114         .quad   0
115         .quad   0x00cf9b000000ffff
116         .quad   0x00af9b000000ffff
117         .quad   0x00cf93000000ffff
118
119 gdt_ptr:
120         .short  gdt_ptr - loader_gdt - 1
121         .long   loader_gdt + FSEGMENT_BASE
122
123         .align(4096)
124         .global loader_pdpt
125 loader_pdpt:
126         .long   0x00000083
127         .align(4096)