]> rtime.felk.cvut.cz Git - jailhouse.git/blob - inmates/lib/x86/header.S
inmates: x86: Use .code16 instead of .code16gcc
[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         .code16
25         .section ".boot", "ax"
26
27         ljmp $0xf000,$start16
28
29
30         .section ".startup", "ax"
31
32 start16:
33         cs,lgdtl gdt_ptr
34
35         mov %cr0,%eax
36         or $X86_CR0_PE,%al
37         mov %eax,%cr0
38
39         ljmpl $INMATE_CS32,$start32 + FSEGMENT_BASE
40
41
42         .code32
43 start32:
44         mov %cr4,%eax
45         or $X86_CR4_PAE,%eax
46         mov %eax,%cr4
47
48         mov $pml4 + FSEGMENT_BASE,%eax
49         mov %eax,%cr3
50
51         movl $MSR_EFER,%ecx
52         rdmsr
53         or $EFER_LME,%eax
54         wrmsr
55
56         mov $(X86_CR0_PG | X86_CR0_WP | X86_CR0_PE),%eax
57         mov %eax,%cr0
58
59         ljmpl $INMATE_CS64,$start64 + FSEGMENT_BASE
60
61         .code64
62 start64:
63         mov $stack_top,%rsp
64
65         xor %rax,%rax
66         mov $bss_start,%rdi
67         mov $bss_qwords,%rcx
68         rep stosq
69
70         mov $inmate_main,%rax
71         callq *%rax
72
73 stop:   cli
74         hlt
75         jmp stop
76
77
78         .align(16)
79 gdt:
80         .quad   0
81         .quad   0x00c09b000000ffff
82         .quad   0x00af9b000000ffff
83
84 gdt_ptr:
85         .short  gdt_ptr - gdt - 1
86         .long   gdt + FSEGMENT_BASE
87
88         .align(4096)
89 pml4:
90         .quad   pdpt + FSEGMENT_BASE + 0x003
91
92         .align(4096)
93 pdpt:
94         .quad   pd + FSEGMENT_BASE + 0x003
95
96         .align(4096)
97 pd:
98         .quad   0x0000000000000083
99         .align(4096)