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