]> rtime.felk.cvut.cz Git - jailhouse.git/blob - inmates/lib/x86/header-32.S
6f704f9d32aaf0769249515b007a051a504d3b38
[jailhouse.git] / inmates / lib / x86 / header-32.S
1 /*
2  * Jailhouse, a Linux-based partitioning hypervisor
3  *
4  * Copyright (c) Siemens AG, 2014
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_PSE             0x00000010
20
21 #define MSR_MTRR_DEF_TYPE       0x000002ff
22 #define MTRR_ENABLE             0x00000800
23
24         .code16
25         .section ".boot", "ax"
26
27         .globl __reset_entry
28 __reset_entry:
29         ljmp $0xf000,$start16
30
31
32         .section ".startup", "ax"
33
34 start16:
35         lgdtl %cs:gdt_ptr
36
37         mov %cr0,%eax
38         or $X86_CR0_PE,%al
39         mov %eax,%cr0
40
41         ljmpl $INMATE_CS32,$start32 + FSEGMENT_BASE
42
43
44         .code32
45 start32:
46         mov %cr4,%eax
47         or $X86_CR4_PSE,%eax
48         mov %eax,%cr4
49
50         mov $loader_pdpt + FSEGMENT_BASE,%eax
51         mov %eax,%cr3
52
53         mov $(X86_CR0_PG | X86_CR0_WP | X86_CR0_PE),%eax
54         mov %eax,%cr0
55
56         movl $MSR_MTRR_DEF_TYPE,%ecx
57         rdmsr
58         or $MTRR_ENABLE,%eax
59         wrmsr
60
61         mov $stack_top,%esp
62
63         mov $INMATE_DS32,%eax
64         mov %eax,%ds
65         mov %eax,%es
66         mov %eax,%ss
67
68         xor %eax,%eax
69         mov $bss_start,%edi
70         mov $bss_dwords,%ecx
71         rep stosl
72
73         mov $inmate_main,%eax
74         call *%eax
75
76 stop:   cli
77         hlt
78         jmp stop
79
80
81         .align(16)
82         .global loader_gdt
83 loader_gdt:
84         .quad   0
85         .quad   0x00cf9b000000ffff
86         .quad   0x00af9b000000ffff
87         .quad   0x00cf93000000ffff
88
89 gdt_ptr:
90         .short  gdt_ptr - loader_gdt - 1
91         .long   loader_gdt + FSEGMENT_BASE
92
93         .align(4096)
94         .global loader_pdpt
95 loader_pdpt:
96         .long   0x00000083
97         .align(4096)