xref: /aosp_15_r20/external/ltp/testcases/kernel/kvm/bootstrap_x86.S (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker// SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker/*
3*49cdfc7eSAndroid Build Coastguard Worker * Copyright (C) 2020 SUSE LLC
4*49cdfc7eSAndroid Build Coastguard Worker * Author: Nicolai Stange <[email protected]>
5*49cdfc7eSAndroid Build Coastguard Worker * LTP port: Martin Doucha <[email protected]>
6*49cdfc7eSAndroid Build Coastguard Worker */
7*49cdfc7eSAndroid Build Coastguard Worker
8*49cdfc7eSAndroid Build Coastguard Worker.set KVM_TEXIT, 0xff
9*49cdfc7eSAndroid Build Coastguard Worker.set RESULT_ADDRESS, 0xfffff000
10*49cdfc7eSAndroid Build Coastguard Worker.set KVM_GDT_SIZE, 32
11*49cdfc7eSAndroid Build Coastguard Worker
12*49cdfc7eSAndroid Build Coastguard Worker.set MSR_VM_HSAVE_PA, 0xc0010117
13*49cdfc7eSAndroid Build Coastguard Worker
14*49cdfc7eSAndroid Build Coastguard Worker/*
15*49cdfc7eSAndroid Build Coastguard Worker * This section will be allocated at address 0x1000 and
16*49cdfc7eSAndroid Build Coastguard Worker * jumped to from the reset stub provided by kvm_run.
17*49cdfc7eSAndroid Build Coastguard Worker */
18*49cdfc7eSAndroid Build Coastguard Worker.code16
19*49cdfc7eSAndroid Build Coastguard Worker.section .init.protected_mode, "ax"
20*49cdfc7eSAndroid Build Coastguard Workerreal_mode_entry:
21*49cdfc7eSAndroid Build Coastguard Worker	cli
22*49cdfc7eSAndroid Build Coastguard Worker
23*49cdfc7eSAndroid Build Coastguard Worker	lgdt kvm_gdt_desc
24*49cdfc7eSAndroid Build Coastguard Worker
25*49cdfc7eSAndroid Build Coastguard Worker	mov $0x11, %eax
26*49cdfc7eSAndroid Build Coastguard Worker	mov %eax, %cr0
27*49cdfc7eSAndroid Build Coastguard Worker
28*49cdfc7eSAndroid Build Coastguard Worker	jmp $1 * 8, $protected_mode_entry
29*49cdfc7eSAndroid Build Coastguard Worker
30*49cdfc7eSAndroid Build Coastguard Worker.code32
31*49cdfc7eSAndroid Build Coastguard Workerprotected_mode_entry:
32*49cdfc7eSAndroid Build Coastguard Worker	mov $2 * 8, %eax
33*49cdfc7eSAndroid Build Coastguard Worker	mov %eax, %ds
34*49cdfc7eSAndroid Build Coastguard Worker	mov %eax, %es
35*49cdfc7eSAndroid Build Coastguard Worker	jmp init_memlayout
36*49cdfc7eSAndroid Build Coastguard Worker
37*49cdfc7eSAndroid Build Coastguard Worker.section .init.gdt32, "a", @progbits
38*49cdfc7eSAndroid Build Coastguard Worker
39*49cdfc7eSAndroid Build Coastguard Worker.macro gdt32_entry type:req l=0 d=0 dpl=0 limit=0xfffff g=1 p=1
40*49cdfc7eSAndroid Build Coastguard Worker	.4byte \limit & 0xffff
41*49cdfc7eSAndroid Build Coastguard Worker	.2byte (\type << 8) | (\dpl << 13) | (\p << 15)
42*49cdfc7eSAndroid Build Coastguard Worker	.2byte (\limit >> 16) | (\l << 5) | (\d << 6) | (\g << 7)
43*49cdfc7eSAndroid Build Coastguard Worker.endm
44*49cdfc7eSAndroid Build Coastguard Worker.align 8
45*49cdfc7eSAndroid Build Coastguard Worker.global kvm_gdt
46*49cdfc7eSAndroid Build Coastguard Workerkvm_gdt:
47*49cdfc7eSAndroid Build Coastguard Worker	.8byte 0
48*49cdfc7eSAndroid Build Coastguard Worker	gdt32_entry type=0x1a l=0 d=1 /* Code segment protected_mode, 32bits */
49*49cdfc7eSAndroid Build Coastguard Worker	gdt32_entry type=0x12 /* Data segment, writable */
50*49cdfc7eSAndroid Build Coastguard Worker	.skip (KVM_GDT_SIZE-3)*8 /* Stack, TSS and other segment descriptors */
51*49cdfc7eSAndroid Build Coastguard Worker
52*49cdfc7eSAndroid Build Coastguard Worker.Lgdt_end:
53*49cdfc7eSAndroid Build Coastguard Worker.global kvm_gdt_desc
54*49cdfc7eSAndroid Build Coastguard Workerkvm_gdt_desc:
55*49cdfc7eSAndroid Build Coastguard Worker	.2byte .Lgdt_end - kvm_gdt - 1
56*49cdfc7eSAndroid Build Coastguard Worker	.4byte kvm_gdt
57*49cdfc7eSAndroid Build Coastguard Worker
58*49cdfc7eSAndroid Build Coastguard Worker.code32
59*49cdfc7eSAndroid Build Coastguard Worker.section .init.memlayout, "ax"
60*49cdfc7eSAndroid Build Coastguard Workerinit_memlayout:
61*49cdfc7eSAndroid Build Coastguard Worker	/*
62*49cdfc7eSAndroid Build Coastguard Worker	 * Identity-map the first 2GB of virtual address space.
63*49cdfc7eSAndroid Build Coastguard Worker	 */
64*49cdfc7eSAndroid Build Coastguard Worker	lea kvm_pagetable, %edi
65*49cdfc7eSAndroid Build Coastguard Worker	lea kvm_pgtable_l2, %esi
66*49cdfc7eSAndroid Build Coastguard Worker	movl %esi, %eax
67*49cdfc7eSAndroid Build Coastguard Worker	mov $1024, %ecx
68*49cdfc7eSAndroid Build Coastguard Worker
69*49cdfc7eSAndroid Build Coastguard Worker1:	movl %eax, %ebx
70*49cdfc7eSAndroid Build Coastguard Worker	orl $0x3, %ebx		/* Flags: present, writable */
71*49cdfc7eSAndroid Build Coastguard Worker	movl %ebx, (%edi)
72*49cdfc7eSAndroid Build Coastguard Worker	addl $4, %edi
73*49cdfc7eSAndroid Build Coastguard Worker	addl $4096, %eax
74*49cdfc7eSAndroid Build Coastguard Worker	dec %ecx
75*49cdfc7eSAndroid Build Coastguard Worker	jnz 1b
76*49cdfc7eSAndroid Build Coastguard Worker
77*49cdfc7eSAndroid Build Coastguard Worker	/* Fill kvm_pgtable_l2 with identity map of the first 2GB. */
78*49cdfc7eSAndroid Build Coastguard Worker	movl %esi, %edi
79*49cdfc7eSAndroid Build Coastguard Worker	movl $512 * 1024, %ecx
80*49cdfc7eSAndroid Build Coastguard Worker	xor %eax, %eax
81*49cdfc7eSAndroid Build Coastguard Worker
82*49cdfc7eSAndroid Build Coastguard Worker1:	movl %eax, %ebx
83*49cdfc7eSAndroid Build Coastguard Worker	orl $0x3, %ebx		/* Flags: present, writable */
84*49cdfc7eSAndroid Build Coastguard Worker	movl %ebx, (%edi)
85*49cdfc7eSAndroid Build Coastguard Worker	addl $4, %edi
86*49cdfc7eSAndroid Build Coastguard Worker	addl $4096, %eax
87*49cdfc7eSAndroid Build Coastguard Worker	dec %ecx
88*49cdfc7eSAndroid Build Coastguard Worker	jnz 1b
89*49cdfc7eSAndroid Build Coastguard Worker
90*49cdfc7eSAndroid Build Coastguard Worker	/* Mark the upper 2GB as unmapped except for the last page. */
91*49cdfc7eSAndroid Build Coastguard Worker	movl $512 * 1024 - 1, %ecx
92*49cdfc7eSAndroid Build Coastguard Worker	xor %eax, %eax
93*49cdfc7eSAndroid Build Coastguard Worker	rep stosl
94*49cdfc7eSAndroid Build Coastguard Worker	movl $0xfffff003, (%edi)
95*49cdfc7eSAndroid Build Coastguard Worker
96*49cdfc7eSAndroid Build Coastguard Worker	/*
97*49cdfc7eSAndroid Build Coastguard Worker	 * Install new pagetable to CR3 and enable memory paging by setting
98*49cdfc7eSAndroid Build Coastguard Worker	 * CR0.WP and CR0.PG
99*49cdfc7eSAndroid Build Coastguard Worker	 */
100*49cdfc7eSAndroid Build Coastguard Worker	lea kvm_pagetable, %eax
101*49cdfc7eSAndroid Build Coastguard Worker	movl %eax, %cr3
102*49cdfc7eSAndroid Build Coastguard Worker	movl %cr0, %eax
103*49cdfc7eSAndroid Build Coastguard Worker	btsl $31, %eax
104*49cdfc7eSAndroid Build Coastguard Worker	btsl $16, %eax
105*49cdfc7eSAndroid Build Coastguard Worker	movl %eax, %cr0
106*49cdfc7eSAndroid Build Coastguard Worker
107*49cdfc7eSAndroid Build Coastguard Worker	/* Init TSS */
108*49cdfc7eSAndroid Build Coastguard Worker	lea kvm_tss, %edx
109*49cdfc7eSAndroid Build Coastguard Worker	movl %edx, %edi
110*49cdfc7eSAndroid Build Coastguard Worker	movl $.Ltss_end - kvm_tss, %ecx
111*49cdfc7eSAndroid Build Coastguard Worker	xor %eax, %eax
112*49cdfc7eSAndroid Build Coastguard Worker	rep stosb
113*49cdfc7eSAndroid Build Coastguard Worker	movl %edx, %edi
114*49cdfc7eSAndroid Build Coastguard Worker	lea kvm_stack_top, %edx
115*49cdfc7eSAndroid Build Coastguard Worker	movl %edx, 4(%edi)
116*49cdfc7eSAndroid Build Coastguard Worker
117*49cdfc7eSAndroid Build Coastguard Worker	/* Create a stack descriptor in the 4th GDT slot */
118*49cdfc7eSAndroid Build Coastguard Worker	/* Base address: 0x0, Limit: kvm_stack_bottom */
119*49cdfc7eSAndroid Build Coastguard Worker	xor %eax, %eax
120*49cdfc7eSAndroid Build Coastguard Worker	movl $0xc09600, %ebx /* flags + access bits */
121*49cdfc7eSAndroid Build Coastguard Worker	movl $kvm_stack_bottom - 1, %edx
122*49cdfc7eSAndroid Build Coastguard Worker	shr $12, %edx
123*49cdfc7eSAndroid Build Coastguard Worker	movw %dx, %ax
124*49cdfc7eSAndroid Build Coastguard Worker	andl $0xf0000, %edx
125*49cdfc7eSAndroid Build Coastguard Worker	orl %edx, %ebx
126*49cdfc7eSAndroid Build Coastguard Worker
127*49cdfc7eSAndroid Build Coastguard Worker	lea kvm_gdt + 3*8, %edi
128*49cdfc7eSAndroid Build Coastguard Worker	mov %eax, (%edi)
129*49cdfc7eSAndroid Build Coastguard Worker	mov %ebx, 4(%edi)
130*49cdfc7eSAndroid Build Coastguard Worker	mov $3 * 8, %eax
131*49cdfc7eSAndroid Build Coastguard Worker	mov %ax, %ss
132*49cdfc7eSAndroid Build Coastguard Worker	lea kvm_stack_top, %esp
133*49cdfc7eSAndroid Build Coastguard Worker
134*49cdfc7eSAndroid Build Coastguard Worker	/* Create a TSS descriptor in the 5th GDT slot */
135*49cdfc7eSAndroid Build Coastguard Worker	lea kvm_tss, %edx
136*49cdfc7eSAndroid Build Coastguard Worker	movl %edx, %ebx
137*49cdfc7eSAndroid Build Coastguard Worker	andl $0xff000000, %ebx
138*49cdfc7eSAndroid Build Coastguard Worker	movl %edx, %eax
139*49cdfc7eSAndroid Build Coastguard Worker	shr $16, %eax
140*49cdfc7eSAndroid Build Coastguard Worker	movb %al, %bl
141*49cdfc7eSAndroid Build Coastguard Worker	orl $0x408900, %ebx /* flags + access bits */
142*49cdfc7eSAndroid Build Coastguard Worker
143*49cdfc7eSAndroid Build Coastguard Worker	movl %edx, %eax
144*49cdfc7eSAndroid Build Coastguard Worker	movl $.Ltss_end - kvm_tss - 1, %edx
145*49cdfc7eSAndroid Build Coastguard Worker	shl $16, %eax
146*49cdfc7eSAndroid Build Coastguard Worker	movw %dx, %ax
147*49cdfc7eSAndroid Build Coastguard Worker	andl $0xf0000, %edx
148*49cdfc7eSAndroid Build Coastguard Worker	orl %edx, %ebx
149*49cdfc7eSAndroid Build Coastguard Worker
150*49cdfc7eSAndroid Build Coastguard Worker	lea kvm_gdt + 4*8, %edi
151*49cdfc7eSAndroid Build Coastguard Worker	mov %eax, (%edi)
152*49cdfc7eSAndroid Build Coastguard Worker	mov %ebx, 4(%edi)
153*49cdfc7eSAndroid Build Coastguard Worker	mov $4 * 8, %ax
154*49cdfc7eSAndroid Build Coastguard Worker	ltr %ax
155*49cdfc7eSAndroid Build Coastguard Worker
156*49cdfc7eSAndroid Build Coastguard Worker	/* Configure and enable interrupts */
157*49cdfc7eSAndroid Build Coastguard Worker	call kvm_init_interrupts
158*49cdfc7eSAndroid Build Coastguard Worker	lidt kvm_idt_desc
159*49cdfc7eSAndroid Build Coastguard Worker	sti
160*49cdfc7eSAndroid Build Coastguard Worker
161*49cdfc7eSAndroid Build Coastguard Worker	/*
162*49cdfc7eSAndroid Build Coastguard Worker	 * Do just enough of initialization to get to a working
163*49cdfc7eSAndroid Build Coastguard Worker	 * -ffreestanding environment and call tst_main(void).
164*49cdfc7eSAndroid Build Coastguard Worker	 */
165*49cdfc7eSAndroid Build Coastguard Worker	lea __preinit_array_start, %edi
166*49cdfc7eSAndroid Build Coastguard Worker	lea __preinit_array_end, %esi
167*49cdfc7eSAndroid Build Coastguard Worker1:
168*49cdfc7eSAndroid Build Coastguard Worker	cmp %edi, %esi
169*49cdfc7eSAndroid Build Coastguard Worker	je 2f
170*49cdfc7eSAndroid Build Coastguard Worker	call *(%edi)
171*49cdfc7eSAndroid Build Coastguard Worker	add $4, %edi
172*49cdfc7eSAndroid Build Coastguard Worker	jmp 1b
173*49cdfc7eSAndroid Build Coastguard Worker2:
174*49cdfc7eSAndroid Build Coastguard Worker
175*49cdfc7eSAndroid Build Coastguard Worker	lea __init_array_start, %edi
176*49cdfc7eSAndroid Build Coastguard Worker	lea __init_array_end, %esi
177*49cdfc7eSAndroid Build Coastguard Worker1:
178*49cdfc7eSAndroid Build Coastguard Worker	cmp %edi, %esi
179*49cdfc7eSAndroid Build Coastguard Worker	je 2f
180*49cdfc7eSAndroid Build Coastguard Worker	call *(%edi)
181*49cdfc7eSAndroid Build Coastguard Worker	add $4, %edi
182*49cdfc7eSAndroid Build Coastguard Worker	jmp 1b
183*49cdfc7eSAndroid Build Coastguard Worker2:
184*49cdfc7eSAndroid Build Coastguard Worker	call main
185*49cdfc7eSAndroid Build Coastguard Worker	jmp kvm_exit
186*49cdfc7eSAndroid Build Coastguard Worker
187*49cdfc7eSAndroid Build Coastguard Worker.global kvm_read_cregs
188*49cdfc7eSAndroid Build Coastguard Workerkvm_read_cregs:
189*49cdfc7eSAndroid Build Coastguard Worker	push %edi
190*49cdfc7eSAndroid Build Coastguard Worker	mov 8(%esp), %edi
191*49cdfc7eSAndroid Build Coastguard Worker	mov %cr0, %eax
192*49cdfc7eSAndroid Build Coastguard Worker	mov %eax, (%edi)
193*49cdfc7eSAndroid Build Coastguard Worker	mov %cr2, %eax
194*49cdfc7eSAndroid Build Coastguard Worker	mov %eax, 4(%edi)
195*49cdfc7eSAndroid Build Coastguard Worker	mov %cr3, %eax
196*49cdfc7eSAndroid Build Coastguard Worker	mov %eax, 8(%edi)
197*49cdfc7eSAndroid Build Coastguard Worker	mov %cr4, %eax
198*49cdfc7eSAndroid Build Coastguard Worker	mov %eax, 12(%edi)
199*49cdfc7eSAndroid Build Coastguard Worker	pop %edi
200*49cdfc7eSAndroid Build Coastguard Worker	ret
201*49cdfc7eSAndroid Build Coastguard Worker
202*49cdfc7eSAndroid Build Coastguard Worker.global kvm_read_sregs
203*49cdfc7eSAndroid Build Coastguard Workerkvm_read_sregs:
204*49cdfc7eSAndroid Build Coastguard Worker	push %edi
205*49cdfc7eSAndroid Build Coastguard Worker	mov 8(%esp), %edi
206*49cdfc7eSAndroid Build Coastguard Worker	mov %cs, %ax
207*49cdfc7eSAndroid Build Coastguard Worker	movw %ax, (%edi)
208*49cdfc7eSAndroid Build Coastguard Worker	mov %ds, %ax
209*49cdfc7eSAndroid Build Coastguard Worker	movw %ax, 2(%edi)
210*49cdfc7eSAndroid Build Coastguard Worker	mov %es, %ax
211*49cdfc7eSAndroid Build Coastguard Worker	movw %ax, 4(%edi)
212*49cdfc7eSAndroid Build Coastguard Worker	mov %fs, %ax
213*49cdfc7eSAndroid Build Coastguard Worker	movw %ax, 6(%edi)
214*49cdfc7eSAndroid Build Coastguard Worker	mov %gs, %ax
215*49cdfc7eSAndroid Build Coastguard Worker	movw %ax, 8(%edi)
216*49cdfc7eSAndroid Build Coastguard Worker	mov %ss, %ax
217*49cdfc7eSAndroid Build Coastguard Worker	movw %ax, 10(%edi)
218*49cdfc7eSAndroid Build Coastguard Worker	pop %edi
219*49cdfc7eSAndroid Build Coastguard Worker	ret
220*49cdfc7eSAndroid Build Coastguard Worker
221*49cdfc7eSAndroid Build Coastguard Workerhandle_interrupt:
222*49cdfc7eSAndroid Build Coastguard Worker	/* save CPU state */
223*49cdfc7eSAndroid Build Coastguard Worker	push %ebp
224*49cdfc7eSAndroid Build Coastguard Worker	mov %esp, %ebp
225*49cdfc7eSAndroid Build Coastguard Worker	addl $12, %ebp
226*49cdfc7eSAndroid Build Coastguard Worker	pushal
227*49cdfc7eSAndroid Build Coastguard Worker
228*49cdfc7eSAndroid Build Coastguard Worker	/* call handler */
229*49cdfc7eSAndroid Build Coastguard Worker	push -4(%ebp)
230*49cdfc7eSAndroid Build Coastguard Worker	push -8(%ebp)
231*49cdfc7eSAndroid Build Coastguard Worker	push %ebp
232*49cdfc7eSAndroid Build Coastguard Worker	cld
233*49cdfc7eSAndroid Build Coastguard Worker	call tst_handle_interrupt
234*49cdfc7eSAndroid Build Coastguard Worker	addl $12, %esp
235*49cdfc7eSAndroid Build Coastguard Worker	popal
236*49cdfc7eSAndroid Build Coastguard Worker	pop %ebp
237*49cdfc7eSAndroid Build Coastguard Worker	addl $8, %esp
238*49cdfc7eSAndroid Build Coastguard Worker	iret
239*49cdfc7eSAndroid Build Coastguard Worker
240*49cdfc7eSAndroid Build Coastguard Worker.macro create_intr_handler vector:req padargs=0
241*49cdfc7eSAndroid Build Coastguard Worker.if \padargs
242*49cdfc7eSAndroid Build Coastguard Worker	pushl $0	/* push dummy error code */
243*49cdfc7eSAndroid Build Coastguard Worker.endif
244*49cdfc7eSAndroid Build Coastguard Worker	pushl $\vector
245*49cdfc7eSAndroid Build Coastguard Worker	jmp handle_interrupt
246*49cdfc7eSAndroid Build Coastguard Worker.endm
247*49cdfc7eSAndroid Build Coastguard Worker
248*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_zerodiv
249*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_zerodiv:
250*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 0, padargs=1
251*49cdfc7eSAndroid Build Coastguard Worker
252*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_debug
253*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_debug:
254*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 1, padargs=1
255*49cdfc7eSAndroid Build Coastguard Worker
256*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_nmi
257*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_nmi:
258*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 2, padargs=1
259*49cdfc7eSAndroid Build Coastguard Worker
260*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_breakpoint
261*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_breakpoint:
262*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 3, padargs=1
263*49cdfc7eSAndroid Build Coastguard Worker
264*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_overflow
265*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_overflow:
266*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 4, padargs=1
267*49cdfc7eSAndroid Build Coastguard Worker
268*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_bound_range_exc
269*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_bound_range_exc:
270*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 5, padargs=1
271*49cdfc7eSAndroid Build Coastguard Worker
272*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_bad_opcode
273*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_bad_opcode:
274*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 6, padargs=1
275*49cdfc7eSAndroid Build Coastguard Worker
276*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_device_error
277*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_device_error:
278*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 7, padargs=1
279*49cdfc7eSAndroid Build Coastguard Worker
280*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_double_fault
281*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_double_fault:
282*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 8
283*49cdfc7eSAndroid Build Coastguard Worker
284*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_invalid_tss
285*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_invalid_tss:
286*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 10
287*49cdfc7eSAndroid Build Coastguard Worker
288*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_segfault
289*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_segfault:
290*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 11
291*49cdfc7eSAndroid Build Coastguard Worker
292*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_stack_fault
293*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_stack_fault:
294*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 12
295*49cdfc7eSAndroid Build Coastguard Worker
296*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_gpf
297*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_gpf:
298*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 13
299*49cdfc7eSAndroid Build Coastguard Worker
300*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_page_fault
301*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_page_fault:
302*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 14
303*49cdfc7eSAndroid Build Coastguard Worker
304*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_fpu_error
305*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_fpu_error:
306*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 16, padargs=1
307*49cdfc7eSAndroid Build Coastguard Worker
308*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_alignment_error
309*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_alignment_error:
310*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 17
311*49cdfc7eSAndroid Build Coastguard Worker
312*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_machine_check
313*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_machine_check:
314*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 18, padargs=1
315*49cdfc7eSAndroid Build Coastguard Worker
316*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_simd_error
317*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_simd_error:
318*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 19, padargs=1
319*49cdfc7eSAndroid Build Coastguard Worker
320*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_virt_error
321*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_virt_error:
322*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 20, padargs=1
323*49cdfc7eSAndroid Build Coastguard Worker
324*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_cpe
325*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_cpe:
326*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 21
327*49cdfc7eSAndroid Build Coastguard Worker
328*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_hv_injection
329*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_hv_injection:
330*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 28, padargs=1
331*49cdfc7eSAndroid Build Coastguard Worker
332*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_vmm_comm
333*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_vmm_comm:
334*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 29
335*49cdfc7eSAndroid Build Coastguard Worker
336*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_security_error
337*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_security_error:
338*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler 30
339*49cdfc7eSAndroid Build Coastguard Worker
340*49cdfc7eSAndroid Build Coastguard Worker.global kvm_handle_bad_exception
341*49cdfc7eSAndroid Build Coastguard Workerkvm_handle_bad_exception:
342*49cdfc7eSAndroid Build Coastguard Worker	create_intr_handler -1, padargs=1
343*49cdfc7eSAndroid Build Coastguard Worker
344*49cdfc7eSAndroid Build Coastguard Worker.global kvm_exit
345*49cdfc7eSAndroid Build Coastguard Workerkvm_exit:
346*49cdfc7eSAndroid Build Coastguard Worker	movl $RESULT_ADDRESS, %edi
347*49cdfc7eSAndroid Build Coastguard Worker	movl $KVM_TEXIT, (%edi)
348*49cdfc7eSAndroid Build Coastguard Worker	hlt
349*49cdfc7eSAndroid Build Coastguard Worker	jmp kvm_exit
350*49cdfc7eSAndroid Build Coastguard Worker
351*49cdfc7eSAndroid Build Coastguard Worker.global kvm_yield
352*49cdfc7eSAndroid Build Coastguard Workerkvm_yield:
353*49cdfc7eSAndroid Build Coastguard Worker	hlt
354*49cdfc7eSAndroid Build Coastguard Worker	ret
355*49cdfc7eSAndroid Build Coastguard Worker
356*49cdfc7eSAndroid Build Coastguard Worker.global kvm_svm_guest_entry
357*49cdfc7eSAndroid Build Coastguard Workerkvm_svm_guest_entry:
358*49cdfc7eSAndroid Build Coastguard Worker	call *%eax
359*49cdfc7eSAndroid Build Coastguard Worker1:	hlt
360*49cdfc7eSAndroid Build Coastguard Worker	jmp 1b
361*49cdfc7eSAndroid Build Coastguard Worker
362*49cdfc7eSAndroid Build Coastguard Worker.global kvm_svm_vmrun
363*49cdfc7eSAndroid Build Coastguard Workerkvm_svm_vmrun:
364*49cdfc7eSAndroid Build Coastguard Worker	push %edi
365*49cdfc7eSAndroid Build Coastguard Worker	mov 8(%esp), %edi
366*49cdfc7eSAndroid Build Coastguard Worker	push %ebx
367*49cdfc7eSAndroid Build Coastguard Worker	push %esi
368*49cdfc7eSAndroid Build Coastguard Worker	push %ebp
369*49cdfc7eSAndroid Build Coastguard Worker
370*49cdfc7eSAndroid Build Coastguard Worker	clgi
371*49cdfc7eSAndroid Build Coastguard Worker
372*49cdfc7eSAndroid Build Coastguard Worker	/* Save full host state */
373*49cdfc7eSAndroid Build Coastguard Worker	movl $MSR_VM_HSAVE_PA, %ecx
374*49cdfc7eSAndroid Build Coastguard Worker	rdmsr
375*49cdfc7eSAndroid Build Coastguard Worker	vmsave
376*49cdfc7eSAndroid Build Coastguard Worker	push %eax
377*49cdfc7eSAndroid Build Coastguard Worker
378*49cdfc7eSAndroid Build Coastguard Worker	/* Load guest registers */
379*49cdfc7eSAndroid Build Coastguard Worker	push %edi
380*49cdfc7eSAndroid Build Coastguard Worker	movl (%edi), %eax
381*49cdfc7eSAndroid Build Coastguard Worker	/* %eax is loaded by vmrun from VMCB */
382*49cdfc7eSAndroid Build Coastguard Worker	movl 0x0c(%edi), %ebx
383*49cdfc7eSAndroid Build Coastguard Worker	movl 0x14(%edi), %ecx
384*49cdfc7eSAndroid Build Coastguard Worker	movl 0x1c(%edi), %edx
385*49cdfc7eSAndroid Build Coastguard Worker	movl 0x2c(%edi), %esi
386*49cdfc7eSAndroid Build Coastguard Worker	movl 0x34(%edi), %ebp
387*49cdfc7eSAndroid Build Coastguard Worker	/* %esp is loaded by vmrun from VMCB */
388*49cdfc7eSAndroid Build Coastguard Worker	movl 0x24(%edi), %edi
389*49cdfc7eSAndroid Build Coastguard Worker
390*49cdfc7eSAndroid Build Coastguard Worker	vmload
391*49cdfc7eSAndroid Build Coastguard Worker	vmrun
392*49cdfc7eSAndroid Build Coastguard Worker	vmsave
393*49cdfc7eSAndroid Build Coastguard Worker
394*49cdfc7eSAndroid Build Coastguard Worker	/* Clear guest register buffer */
395*49cdfc7eSAndroid Build Coastguard Worker	push %edi
396*49cdfc7eSAndroid Build Coastguard Worker	push %ecx
397*49cdfc7eSAndroid Build Coastguard Worker	movl 8(%esp), %edi
398*49cdfc7eSAndroid Build Coastguard Worker	addl $4, %edi
399*49cdfc7eSAndroid Build Coastguard Worker	xorl %eax, %eax
400*49cdfc7eSAndroid Build Coastguard Worker	mov $32, %ecx
401*49cdfc7eSAndroid Build Coastguard Worker	pushfl
402*49cdfc7eSAndroid Build Coastguard Worker	cld
403*49cdfc7eSAndroid Build Coastguard Worker	rep stosl
404*49cdfc7eSAndroid Build Coastguard Worker	popfl
405*49cdfc7eSAndroid Build Coastguard Worker
406*49cdfc7eSAndroid Build Coastguard Worker	/* Save guest registers */
407*49cdfc7eSAndroid Build Coastguard Worker	pop %ecx
408*49cdfc7eSAndroid Build Coastguard Worker	pop %eax
409*49cdfc7eSAndroid Build Coastguard Worker	pop %edi
410*49cdfc7eSAndroid Build Coastguard Worker	movl %ebx, 0x0c(%edi)
411*49cdfc7eSAndroid Build Coastguard Worker	movl %ecx, 0x14(%edi)
412*49cdfc7eSAndroid Build Coastguard Worker	movl %edx, 0x1c(%edi)
413*49cdfc7eSAndroid Build Coastguard Worker	movl %eax, 0x24(%edi)
414*49cdfc7eSAndroid Build Coastguard Worker	movl %esi, 0x2c(%edi)
415*49cdfc7eSAndroid Build Coastguard Worker	movl %ebp, 0x34(%edi)
416*49cdfc7eSAndroid Build Coastguard Worker	/* Copy %eax and %esp from VMCB */
417*49cdfc7eSAndroid Build Coastguard Worker	movl (%edi), %esi
418*49cdfc7eSAndroid Build Coastguard Worker	movl 0x5f8(%esi), %eax
419*49cdfc7eSAndroid Build Coastguard Worker	movl %eax, 0x04(%edi)
420*49cdfc7eSAndroid Build Coastguard Worker	movl 0x5d8(%esi), %eax
421*49cdfc7eSAndroid Build Coastguard Worker	movl %eax, 0x3c(%edi)
422*49cdfc7eSAndroid Build Coastguard Worker
423*49cdfc7eSAndroid Build Coastguard Worker	pop %eax
424*49cdfc7eSAndroid Build Coastguard Worker	vmload
425*49cdfc7eSAndroid Build Coastguard Worker	stgi
426*49cdfc7eSAndroid Build Coastguard Worker
427*49cdfc7eSAndroid Build Coastguard Worker	pop %ebp
428*49cdfc7eSAndroid Build Coastguard Worker	pop %esi
429*49cdfc7eSAndroid Build Coastguard Worker	pop %ebx
430*49cdfc7eSAndroid Build Coastguard Worker	pop %edi
431*49cdfc7eSAndroid Build Coastguard Worker	ret
432*49cdfc7eSAndroid Build Coastguard Worker
433*49cdfc7eSAndroid Build Coastguard Worker
434*49cdfc7eSAndroid Build Coastguard Worker.section .bss.pgtables, "aw", @nobits
435*49cdfc7eSAndroid Build Coastguard Worker.global kvm_pagetable
436*49cdfc7eSAndroid Build Coastguard Workerkvm_pagetable:
437*49cdfc7eSAndroid Build Coastguard Worker	.skip 4096
438*49cdfc7eSAndroid Build Coastguard Worker
439*49cdfc7eSAndroid Build Coastguard Workerkvm_pgtable_l2:
440*49cdfc7eSAndroid Build Coastguard Worker	.skip 1024 * 4096
441*49cdfc7eSAndroid Build Coastguard Worker
442*49cdfc7eSAndroid Build Coastguard Worker.section .bss.stack, "aw", @nobits
443*49cdfc7eSAndroid Build Coastguard Worker.global kvm_stack_bottom
444*49cdfc7eSAndroid Build Coastguard Workerkvm_stack_bottom:
445*49cdfc7eSAndroid Build Coastguard Worker	.skip 2 * 4096
446*49cdfc7eSAndroid Build Coastguard Worker.global kvm_stack_top
447*49cdfc7eSAndroid Build Coastguard Workerkvm_stack_top:
448*49cdfc7eSAndroid Build Coastguard Worker
449*49cdfc7eSAndroid Build Coastguard Worker.section .bss.tss
450*49cdfc7eSAndroid Build Coastguard Worker.global kvm_tss
451*49cdfc7eSAndroid Build Coastguard Workerkvm_tss:
452*49cdfc7eSAndroid Build Coastguard Worker	.skip 0x6C
453*49cdfc7eSAndroid Build Coastguard Worker.Ltss_end:
454*49cdfc7eSAndroid Build Coastguard Worker
455*49cdfc7eSAndroid Build Coastguard Worker.section .bss
456*49cdfc7eSAndroid Build Coastguard Worker.align 8
457*49cdfc7eSAndroid Build Coastguard Worker.global kvm_idt
458*49cdfc7eSAndroid Build Coastguard Workerkvm_idt:
459*49cdfc7eSAndroid Build Coastguard Worker	.skip 8 * 256
460*49cdfc7eSAndroid Build Coastguard Worker.Lidt_end:
461*49cdfc7eSAndroid Build Coastguard Worker
462*49cdfc7eSAndroid Build Coastguard Worker.section .data
463*49cdfc7eSAndroid Build Coastguard Worker.align 8
464*49cdfc7eSAndroid Build Coastguard Worker.global kvm_idt_desc
465*49cdfc7eSAndroid Build Coastguard Workerkvm_idt_desc:
466*49cdfc7eSAndroid Build Coastguard Worker	.2byte .Lidt_end - kvm_idt - 1
467*49cdfc7eSAndroid Build Coastguard Worker	.4byte kvm_idt
468