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