]> rtime.felk.cvut.cz Git - jailhouse.git/blob - inmates/lib/x86/header.S
b178dc1a07fb7e64276f42f497b77a6a9bb6467d
[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         mov $stack_top,%rsp
74
75         xor %rax,%rax
76         mov $bss_start,%rdi
77         mov $bss_qwords,%rcx
78         rep stosq
79
80         mov $inmate_main,%rax
81         callq *%rax
82
83 stop:   cli
84         hlt
85         jmp stop
86
87
88         .align(16)
89 gdt:
90         .quad   0
91         .quad   0x00c09b000000ffff
92         .quad   0x00af9b000000ffff
93
94 gdt_ptr:
95         .short  gdt_ptr - gdt - 1
96         .long   gdt + FSEGMENT_BASE
97
98         .align(4096)
99 pml4:
100         .quad   pdpt + FSEGMENT_BASE + 0x003
101
102         .align(4096)
103 pdpt:
104         .quad   pd + FSEGMENT_BASE + 0x003
105
106         .align(4096)
107 pd:
108         .quad   0x0000000000000083
109         .align(4096)