]> rtime.felk.cvut.cz Git - jailhouse.git/blob - inmates/header.S
x86: Handle more SIB cases in MMIO instruction parser
[jailhouse.git] / inmates / 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         .code16gcc
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         jmpq *%rax
72
73
74         .align(16)
75 gdt:
76         .quad   0
77         .quad   0x00c09b000000ffff
78         .quad   0x00af9b000000ffff
79
80 gdt_ptr:
81         .short  gdt_ptr - gdt - 1
82         .long   gdt + FSEGMENT_BASE
83
84         .align(4096)
85 pml4:
86         .quad   pdpt + FSEGMENT_BASE + 0x003
87
88         .align(4096)
89 pdpt:
90         .quad   pd + FSEGMENT_BASE + 0x003
91
92         .align(4096)
93 pd:
94         .quad   0x0000000000000083
95
96
97         .global irq_entry
98         .balign 16
99 irq_entry:
100         push %rax
101         push %rcx
102         push %rdx
103         push %rsi
104         push %rdi
105         push %r8
106         push %r9
107         push %r10
108         push %r11
109
110         call irq_handler - FSEGMENT_BASE
111
112         pop %r11
113         pop %r10
114         pop %r9
115         pop %r8
116         pop %rdi
117         pop %rsi
118         pop %rdx
119         pop %rcx
120         pop %rax
121
122         iretq
123
124
125 /* to please linker if irq_entry remains unused */
126         .weak irq_handler
127 irq_handler: