VM0でWindows 8.1を起動できるようにする
試してみたところ、いきなりpanicしました。
CPU0 panic : VM Entry failure. VMM state of CPU0 ------------------------------ RAX 00000031 RCX 00000A90 RDX 403024E0 RBX 00000000 RSP 4033FCC0 RBP 4033FE00 RSI 00000000 RDI 00000000 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 4014935E R13 4033FE18 R14 00000271 R15 BA558018 CR0 8000003B CR2 00000000 CR3 B4D5C000 CR4 00002668 RFLAGS 00000006 GDTR 403024E0+0000FFFF IDTR 401B5B80+0000FFFF backtrace: 0x4033fcb8: 0x4011a2bb 0x4033fe08: 0x4011a091 0x4033fe68: 0x4012af57 0x4033fea8: 0x4012b15c 0x4033ffa8: 0x401152a6 0x4033ffc8: 0x40123455 0x4033fff8: 0x0 ------------------------------------------------ Guest state of CPU0 ---------------------------- RAX 00000011 RCX 00000080 RDX 00000001 RBX 00001508 RSP 00000C4C RBP 00000C4C RSI 0000000B RDI 00000000 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 00000011 CR2 00000000 CR3 00000000 CR4 00000000 ACR ES 000000F3 CS 0000009B SS 00000093 DS 000000F3 FS 000000F3 GS 000000F3 LIMIT ES 0000FFFF CS 0000FFFF SS 0000FFFF DS 0000FFFF FS 0000FFFF GS 0000FFFF BASE ES 00024AD0 CS 00020000 SS 00024AD0 DS 00024AD0 FS 00000000 GS 000F0000 SEL ES 000024AD CS 00002000 SS 000024AD DS 000024AD FS 00000000 GS 0000F000 RIP 0000083B RFLAGS 00010006 GDTR 0001F000+0000007F IDTR 0001F080+000007FF EFER 00000000 Exit reason: 0x80000021 (VM-entry failure due to invalid guest state) VM entry failure Exit qualification 00000000 Exit intr info 80000b0d Exit intr errcode 00000000 VMCS IDTR 0001f080+000007ff VMCS RFLAGS 00010006 pe=1 pg=0 sw:en=0x4 es=0x24ad cs=0x2000 ss=0x24ad ds=0x24ad fs=0x0 gs=0xF000 32-Bit Control Fields VMCS_PIN_BASED_VMEXEC_CTL 0x3f VMCS_PROC_BASED_VMEXEC_CTL 0x8701e37a VMCS_EXCEPTION_BMP 0xffffffff VMCS_PAGEFAULT_ERRCODE_MASK 0x0 VMCS_PAGEFAULT_ERRCODE_MATCH 0x0 VMCS_CR3_TARGET_COUNT 0x0 VMCS_VMEXIT_CTL 0x36fff VMCS_VMEXIT_MSR_STORE_COUNT 0x6 VMCS_VMEXIT_MSR_LOAD_COUNT 0x6 VMCS_VMENTRY_CTL 0x11ff VMCS_VMENTRY_MSR_LOAD_COUNT 0x6 VMCS_VMENTRY_INTR_INFO_FIELD 0x0 VMCS_VMENTRY_EXCEPTION_ERRCODE 0x0 VMCS_VMENTRY_INSTRUCTION_LEN 0x0 VMCS_TPR_THRESHOLD 0x0 64-Bit Control Fields VMCS_ADDR_IOBMP_A 0xb4ff8000 VMCS_ADDR_IOBMP_A_HIGH 0x0 VMCS_ADDR_IOBMP_B 0xb4ff9000 VMCS_ADDR_IOBMP_B_HIGH 0x0 VMCS_ADDR_MSRBMP 0xffffffffffffffff VMCS_ADDR_MSRBMP_HIGH 0xffffffff VMCS_VMEXIT_MSRSTORE_ADDR 0xb5008000 VMCS_VMEXIT_MSRSTORE_ADDR_HIGH 0x0 VMCS_VMEXIT_MSRLOAD_ADDR 0xb5006000 VMCS_VMEXIT_MSRLOAD_ADDR_HIGH 0x0 VMCS_VMENTRY_MSRLOAD_ADDR 0xb5008000 VMCS_VMENTRY_MSRLOAD_ADDR_HIGH 0x0 VMCS_EXEC_VMCS_POINTER 0x0 VMCS_EXEC_VMCS_POINTER_HIGH 0x0 VMCS_TSC_OFFSET 0x0 VMCS_TSC_OFFSET_HIGH 0x0 Natural-Width Control Fields VMCS_CR0_GUESTHOST_MASK 0xffffffff VMCS_CR4_GUESTHOST_MASK 0xffffffff VMCS_CR0_READ_SHADOW 0x11 VMCS_CR4_READ_SHADOW 0x0 VMCS_CR3_TARGET_VALUE_0 0x0 VMCS_CR3_TARGET_VALUE_1 0x0 VMCS_CR3_TARGET_VALUE_2 0x0 VMCS_CR3_TARGET_VALUE_3 0x0 16-Bit Host-State Fields VMCS_HOST_ES_SEL 0x58 VMCS_HOST_CS_SEL 0x50 VMCS_HOST_SS_SEL 0x58 VMCS_HOST_DS_SEL 0x58 VMCS_HOST_FS_SEL 0x58 VMCS_HOST_GS_SEL 0x80 VMCS_HOST_TR_SEL 0x70 32-Bit Host-State Field VMCS_HOST_IA32_SYSENTER_CS 0x0 Natural-Width Host-State Fields VMCS_HOST_CR0 0x8000003b VMCS_HOST_CR3 0xb4d5c000 VMCS_HOST_CR4 0x2668 VMCS_HOST_FS_BASE 0x0 VMCS_HOST_GS_BASE 0x40302780 VMCS_HOST_TR_BASE 0x40302648 VMCS_HOST_GDTR_BASE 0x403024e0 VMCS_HOST_IDTR_BASE 0x401b5b80 VMCS_HOST_IA32_SYSENTER_ESP 0x0 VMCS_HOST_IA32_SYSENTER_EIP 0x0 VMCS_HOST_RSP 0x4033fe60 VMCS_HOST_RIP 0x40107c20 16-Bit Guest-State Fields VMCS_GUEST_ES_SEL 0x24ad VMCS_GUEST_CS_SEL 0x2000 VMCS_GUEST_SS_SEL 0x24ad VMCS_GUEST_DS_SEL 0x24ad VMCS_GUEST_FS_SEL 0x0 VMCS_GUEST_GS_SEL 0xf000 VMCS_GUEST_LDTR_SEL 0x0 VMCS_GUEST_TR_SEL 0x70 32-Bit Guest-State Fields VMCS_GUEST_ES_LIMIT 0xffff VMCS_GUEST_CS_LIMIT 0xffff VMCS_GUEST_SS_LIMIT 0xffff VMCS_GUEST_DS_LIMIT 0xffff VMCS_GUEST_FS_LIMIT 0xffff VMCS_GUEST_GS_LIMIT 0xffff VMCS_GUEST_LDTR_LIMIT 0x0 VMCS_GUEST_TR_LIMIT 0x67 VMCS_GUEST_GDTR_LIMIT 0x7f VMCS_GUEST_IDTR_LIMIT 0x7ff VMCS_GUEST_ES_ACCESS_RIGHTS 0xf3 VMCS_GUEST_CS_ACCESS_RIGHTS 0x9b VMCS_GUEST_SS_ACCESS_RIGHTS 0x93 VMCS_GUEST_DS_ACCESS_RIGHTS 0xf3 VMCS_GUEST_FS_ACCESS_RIGHTS 0xf3 VMCS_GUEST_GS_ACCESS_RIGHTS 0xf3 VMCS_GUEST_LDTR_ACCESS_RIGHTS 0x10000 VMCS_GUEST_TR_ACCESS_RIGHTS 0x8b VMCS_GUEST_INTERRUPTIBILITY_STATE 0x0 VMCS_GUEST_ACTIVITY_STATE 0x0 VMCS_GUEST_IA32_SYSENTER_CS 0x0 64-Bit Guest-State Fields VMCS_VMCS_LINK_POINTER 0xffffffffffffffff VMCS_VMCS_LINK_POINTER_HIGH 0xffffffff VMCS_GUEST_IA32_DEBUGCTL 0x0 VMCS_GUEST_IA32_DEBUGCTL_HIGH 0x0 Natural-Width Guest-State Fields VMCS_GUEST_CR0 0x80010031 VMCS_GUEST_CR3 0xb73fe000 VMCS_GUEST_CR4 0x2020 VMCS_GUEST_ES_BASE 0x24ad0 VMCS_GUEST_CS_BASE 0x20000 VMCS_GUEST_SS_BASE 0x24ad0 VMCS_GUEST_DS_BASE 0x24ad0 VMCS_GUEST_FS_BASE 0x0 VMCS_GUEST_GS_BASE 0xf0000 VMCS_GUEST_LDTR_BASE 0x0 VMCS_GUEST_TR_BASE 0x40302648 VMCS_GUEST_GDTR_BASE 0x1f000 VMCS_GUEST_IDTR_BASE 0x1f080 VMCS_GUEST_DR7 0x400 VMCS_GUEST_RSP 0xc4c VMCS_GUEST_RIP 0x83b VMCS_GUEST_RFLAGS 0x10006 VMCS_GUEST_PENDING_DEBUG_EXCEPTIONS 0x0 VMCS_GUEST_IA32_SYSENTER_ESP 0x0 VMCS_GUEST_IA32_SYSENTER_EIP 0x0 ------------------------------------------------
VTの仕様に基づいて、VM entryのチェックを(一部)行うパッチを作りました。
SS SelectorのRPLが1になっていることが、VM entry failureの原因のようです。
Starting a virtual machine. RPL of VMCS_GUEST_SS_SEL 0x24ad and VMCS_GUEST_CS_SEL 0x2000 are not the same. DPL of VMCS_GUEST_SS_ACCESS_RIGHTS 0x93 and RPL of VMCS_GUEST_SS_SEL 0x24ad are not the same CPU0 panic : VM Entry failure. VMM state of CPU0 ------------------------------ RAX 00000031 RCX 00000B3C RDX 403034E0 RBX 00000000 RSP 4033FCC0 RBP 4033FE00 RSI 00000000 RDI 00000000 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 4014A707 R13 4033FE18 R14 00000271 R15 BA558018 CR0 8000003B CR2 00000000 CR3 B4D5D000 CR4 00002668 RFLAGS 00000006 GDTR 403034E0+0000FFFF IDTR 401B6B80+0000FFFF backtrace: 0x4033fcb8: 0x4011a2bb 0x4033fe08: 0x4011a091 0x4033fe68: 0x4012bfd7 0x4033fea8: 0x4012c1dc 0x4033ffa8: 0x401152a6 0x4033ffc8: 0x40123455 0x4033fff8: 0x0 ------------------------------------------------ Guest state of CPU0 ---------------------------- RAX 00000011 RCX 00000080 RDX 00000001 RBX 00001508 RSP 00000C4C RBP 00000C4C RSI 0000000B RDI 00000000 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 00000011 CR2 00000000 CR3 00000000 CR4 00000000 ACR ES 000000F3 CS 0000009B SS 00000093 DS 000000F3 FS 000000F3 GS 000000F3 LIMIT ES 0000FFFF CS 0000FFFF SS 0000FFFF DS 0000FFFF FS 0000FFFF GS 0000FFFF BASE ES 00024AD0 CS 00020000 SS 00024AD0 DS 00024AD0 FS 00000000 GS 000F0000 SEL ES 000024AD CS 00002000 SS 000024AD DS 000024AD FS 00000000 GS 0000F000 RIP 0000083B RFLAGS 00010006 GDTR 0001F000+0000007F IDTR 0001F080+000007FF EFER 00000000 Exit reason: 0x80000021 (VM-entry failure due to invalid guest state) VM entry failure Exit qualification 00000000 Exit intr info 80000b0d Exit intr errcode 00000000 VMCS IDTR 0001f080+000007ff VMCS RFLAGS 00010006 pe=1 pg=0 sw:en=0x4 es=0x24ad cs=0x2000 ss=0x24ad ds=0x24ad fs=0x0 gs=0xF000
yuichi_xy への返信
VTの仕様に基づいて、VM entryのチェックを(一部)行うパッチを作りました。 vm_entry_check_140113.patch SS SelectorのRPLが1になっていることが、VM entry failureの原因のようです。
r156 で、Protect Mode 移行時、RPL が 0 でない場合は、Segment Selector の値をダミーの値に設定するようにしました。
Windowsのロゴが表示されたところで、panic するようになりました。
Starting a virtual machine. msr_pass: microcode updates cannot be loaded. CPU2 panic : Unsupported pat encoding 0x3 VMM state of CPU2 ------------------------------ RAX 00000031 RCX 00000AC9 RDX 40337400 RBX 00000000 RSP 40367C70 RBP 40367DB0 RSI 00000000 RDI 00000000 R8 00000000 R9 40367B31 R10 00000002 R11 00000000 R12 401492A8 R13 40367DC8 R14 00000000 R15 00000000 CR0 80000039 CR2 00000000 CR3 B4D5D000 CR4 00002668 RFLAGS 00000002 GDTR 40337400+0000FFFF IDTR 401B6B80+0000FFFF backtrace: 0x40367c68: 0x4011a2bb 0x40367db8: 0x4011a091 0x40367e18: 0x40119c2f 0x40367e48: 0x4012cbb6 0x40367e58: 0x401085b8 0x40367e88: 0x4012bcc5 0x40367ec8: 0x4012c2dc 0x40367fc8: 0x4011518d 0x40367ff8: 0x0 ------------------------------------------------ Guest state of CPU2 ---------------------------- RAX 4013096C RCX 00000277 RDX 00000000 RBX 00000000 RSP 00000000 RBP 00000000 RSI 00000000 RDI FFFFFFFFFFD06000 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 80050031 CR2 00000000 CR3 001A7000 CR4 000006B8 ACR ES 000000F3 CS 0000209B SS 00000093 DS 0000C093 FS 000000F3 GS 000000F3 LIMIT ES FFFFFFFFFFFFFFFF CS FFFFFFFFFFFFFFFF SS FFFFFFFFFFFFFFFF DS FFFFFFFFFFFFFFFF FS FFFFFFFFFFFFFFFF GS FFFFFFFFFFFFFFFF BASE ES 00000000 CS 00000000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00000000 CS 00000010 SS 00000000 DS 00000020 FS 00000000 GS 00000000 RIP FFFFF803F7831285 RFLAGS 00000006 GDTR 00001018+0000003F IDTR 00000000+000003FF EFER 00000D01 Exit reason: 0x20 (WRMSR) Exit qualification 00000000 Exit intr info 00000000 Exit intr errcode 00000000 VMCS IDTR 00000000+000003ff VMCS RFLAGS 00000006 pe=1 pg=1 sw:en=0x0 es=0x0 cs=0x100 ss=0x0 ds=0x100 fs=0x0 gs=0x0 ------------------------------------------------
CPU2 panic : Unsupported pat encoding 0x3
上記の時に、GP#をinjectするパッチを作ったところ(pat_140114.patch)、page faultをinjectできないというpanicになりました。
Starting a virtual machine. MSR: msr_pass: microcode updates cannot be loaded. MSR: Unsupported pat encoding 401309bc 2 0x3 ip 0xfffff800ee5a6285 CPU2 panic : Can't inject a page fault because the other event is already pending. vector 0xd type 0x3, err_valid 0x1 VMM state of CPU2 ------------------------------ RAX 00000031 RCX 00000B5D RDX 40337400 RBX 00000000 RSP 40367CE0 RBP 40367E20 RSI 00000000 RDI 00000000 R8 00000000 R9 40367BA1 R10 00000002 R11 00000000 R12 4014E188 R13 40367E38 R14 00000000 R15 00000000 CR0 80000039 CR2 00000000 CR3 B4D5D000 CR4 00002668 RFLAGS 00000002 GDTR 40337400+0000FFFF IDTR 401B6B80+0000FFFF backtrace: 0x40367cd8: 0x4011a32b 0x40367e28: 0x4011a101 0x40367e88: 0x4012c130 0x40367ec8: 0x4012c30c 0x40367fc8: 0x4011518d 0x40367ff8: 0x0 ------------------------------------------------ Guest state of CPU2 ---------------------------- RAX 401309BC RCX 00000277 RDX 00000000 RBX 00000000 RSP 00000000 RBP 00000000 RSI 00000000 RDI FFFFFFFFFFD06000 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 80050031 CR2 00000000 CR3 00210000 CR4 000006B8 ACR ES 000000F3 CS 0000209B SS 00000093 DS 0000C093 FS 000000F3 GS 000000F3 LIMIT ES FFFFFFFFFFFFFFFF CS FFFFFFFFFFFFFFFF SS FFFFFFFFFFFFFFFF DS FFFFFFFFFFFFFFFF FS FFFFFFFFFFFFFFFF GS FFFFFFFFFFFFFFFF BASE ES 00000000 CS 00000000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00000000 CS 00000010 SS 00000000 DS 00000020 FS 00000000 GS 00000000 RIP FFFFF800EE5A6285 RFLAGS 00010006 GDTR 00001018+0000003F IDTR 00000000+000003FF EFER 00000D01 Exit reason: 0x0 (Exception or NMI) Exit qualification 000000d0 Exit intr info 80000b0e Exit intr errcode 00000000 VMCS IDTR 00000000+000003ff VMCS RFLAGS 00010006 pe=1 pg=1 sw:en=0x0 es=0x0 cs=0x100 ss=0x0 ds=0x100 fs=0x0 gs=0x0 ------------------------------------------------
r157で、IA32_PAT MSR に予約されたメモリタイプが書き込まれた時に、一般保護例外を Inject するようにしました。
SPT3とEPTを無効化したところ、IA32_PATに予約されたメモリタイプが書き込まれる事象や、pegefaultが発生しなくなりました。
CPU6 panic : Fatal interrupt in VMM: 0xE1 CR0: 0x80000039 CR2: 0x00000000 CR3: 0xB4D58000 CR4: 0x00002668 RSP on interrupt: 0x40377E68 Stack information: +00 Error code / RIP : 0x40107378 +32 RSP / SS : 0x00000058 +08 RIP / CS : 0x00000050 +40 SS / : 0x40377EC0 +16 CS / RFLAGS : 0x00207202 +48 / : 0xFFFFFFFF +24 RFLAGS / RSP : 0x40377E90 +56 / : 0x00000000 RAX: 0x00000001 RCX: 0x402FFA60 RDX: 0x40331C00 RBX: 0x00000000 RSP: 0x40377E10 RBP: 0x40377EC0 RSI: 0x40377E68 RDI: 0x402FFA60 R8: 0x00000000 R9: 0x00000000 R10: 0x00000001 R11: 0x00000802 R12: 0x00000001 R13: 0x00000000 R14: 0x4041A1F8 R15: 0x00000000 ES: 0x0058 CS: 0x0050 SS: 0x0058 DS: 0x0058 FS: 0x0058 GS: 0x0080 VMM state of CPU6 ------------------------------ RAX 00000031 RCX 00000D92 RDX 40331C00 RBX 40377DB0 RSP 40377B90 RBP 40377CD0 RSI 00000000 RDI 00000000 R8 00000000 R9 40377A51 R10 00000006 R11 00000000 R12 401469D0 R13 40377CE8 R14 4041B850 R15 00000001 CR0 80000039 CR2 00000000 CR3 B4D58000 CR4 00002668 RFLAGS 00203006 GDTR 40331C00+000000FF IDTR 401B1B60+00001000 backtrace: 0x40377b88: 0x4011a2eb 0x40377cd8: 0x4011ab28 0x40377d38: 0x4013df5c 0x40377d58: 0x401144f0 0x40377da8: 0x40114698 0x40377ec8: 0x4012c14a 0x40377fc8: 0x4011518d 0x40377ff8: 0x0 ------------------------------------------------
SIPI待ちの状態で外部割り込みを受け取ったときはpanicせずにEOIを発行するパッチを作成したところ、Windows 8.1が起動しました。
なお、「高速スタートアップを有効にする」をオフにした状態で評価しました。
SPT3を無効、EPTを有効、ignore_intr_140115.patchを適用した状態では、VM-entry失敗によるpanicが発生しました。
Starting a virtual machine. CPU2 panic : VM-entry failure. VMM state of CPU2 ------------------------------ RAX 00000031 RCX 00000A90 RDX 40332400 RBX 00000000 RSP 40367CE0 RBP 40367E20 RSI 00000000 RDI 00000000 R8 00000000 R9 40367BA1 R10 00000002 R11 00000000 R12 401465FD R13 40367E38 R14 00000000 R15 00000000 CR0 80000039 CR2 00000000 CR3 B4D59000 CR4 00002668 RFLAGS 00000002 GDTR 40332400+0000FFFF IDTR 401B2B60+0000FFFF backtrace: 0x40367cd8: 0x4011a32b 0x40367e28: 0x4011a101 0x40367e88: 0x4012c057 0x40367ec8: 0x4012c25c 0x40367fc8: 0x401151cd 0x40367ff8: 0x0 ------------------------------------------------ Guest state of CPU2 ---------------------------- RAX 403008C0 RCX 00000277 RDX 00000000 RBX 00000000 RSP 00000000 RBP 00000000 RSI 00000000 RDI FFFFFFFFFFD06000 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 80050031 CR2 00000000 CR3 001A7000 CR4 000006B8 ACR ES 000000F3 CS 0000209B SS 00000093 DS 0000C093 FS 000000F3 GS 000000F3 LIMIT ES FFFFFFFFFFFFFFFF CS FFFFFFFFFFFFFFFF SS FFFFFFFFFFFFFFFF DS FFFFFFFFFFFF FFFF FS FFFFFFFFFFFFFFFF GS FFFFFFFFFFFFFFFF BASE ES 00000000 CS 00000000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00000000 CS 00000010 SS 00000000 DS 00000020 FS 00000000 GS 00000000 RIP FFFFF8014442C287 RFLAGS 00000006 GDTR 00001018+0000003F IDTR 00000000+0000 03FF EFER 00000D01 Exit reason: 0x80000021 (VM-entry failure due to invalid guest state) VM entry f ailure Exit qualification 00000000 Exit intr info 00000000 Exit intr errcode 00000000 VMCS IDTR 00000000+000003ff VMCS RFLAGS 00000006 pe=1 pg=1 sw:en=0x0 es=0x0 cs=0x100 ss=0x0 ds=0x100 fs=0x0 gs=0x0 32-Bit Control Fields VMCS_PIN_BASED_VMEXEC_CTL 0x3f VMCS_PROC_BASED_VMEXEC_CTL 0x8701e17a VMCS_EXCEPTION_BMP 0xffffbfff VMCS_PAGEFAULT_ERRCODE_MASK 0x0 VMCS_PAGEFAULT_ERRCODE_MATCH 0xffffffff VMCS_CR3_TARGET_COUNT 0x0 VMCS_VMEXIT_CTL 0xb6fff VMCS_VMEXIT_MSR_STORE_COUNT 0x6 VMCS_VMEXIT_MSR_LOAD_COUNT 0x6 VMCS_VMENTRY_CTL 0x53ff VMCS_VMENTRY_MSR_LOAD_COUNT 0x6 VMCS_VMENTRY_INTR_INFO_FIELD 0x0 VMCS_VMENTRY_EXCEPTION_ERRCODE 0x0 VMCS_VMENTRY_INSTRUCTION_LEN 0x0 VMCS_TPR_THRESHOLD 0x0 64-Bit Control Fields VMCS_ADDR_IOBMP_A 0xb4fec000 VMCS_ADDR_IOBMP_A_HIGH 0x0 VMCS_ADDR_IOBMP_B 0xb4fed000 VMCS_ADDR_IOBMP_B_HIGH 0x0 VMCS_ADDR_MSRBMP 0xffffffffffffffff VMCS_ADDR_MSRBMP_HIGH 0xffffffff VMCS_VMEXIT_MSRSTORE_ADDR 0xb503c000 VMCS_VMEXIT_MSRSTORE_ADDR_HIGH 0x0 VMCS_VMEXIT_MSRLOAD_ADDR 0xb503a000 VMCS_VMEXIT_MSRLOAD_ADDR_HIGH 0x0 VMCS_VMENTRY_MSRLOAD_ADDR 0xb503c000 VMCS_VMENTRY_MSRLOAD_ADDR_HIGH 0x0 VMCS_EXEC_VMCS_POINTER 0x0 VMCS_EXEC_VMCS_POINTER_HIGH 0x0 VMCS_TSC_OFFSET 0x0 VMCS_TSC_OFFSET_HIGH 0x0 Natural-Width Control Fields VMCS_CR0_GUESTHOST_MASK 0xffffffff VMCS_CR4_GUESTHOST_MASK 0xffffffff VMCS_CR0_READ_SHADOW 0x80050031 VMCS_CR4_READ_SHADOW 0x6b8 VMCS_CR3_TARGET_VALUE_0 0x0 VMCS_CR3_TARGET_VALUE_1 0x0 VMCS_CR3_TARGET_VALUE_2 0x0 VMCS_CR3_TARGET_VALUE_3 0x0 16-Bit Host-State Fields VMCS_HOST_ES_SEL 0x58 VMCS_HOST_CS_SEL 0x50 VMCS_HOST_SS_SEL 0x58 VMCS_HOST_DS_SEL 0x58 VMCS_HOST_FS_SEL 0x58 VMCS_HOST_GS_SEL 0x80 VMCS_HOST_TR_SEL 0x70 32-Bit Host-State Field VMCS_HOST_IA32_SYSENTER_CS 0x0 Natural-Width Host-State Fields VMCS_HOST_CR0 0x80000039 VMCS_HOST_CR3 0xb4d59000 VMCS_HOST_CR4 0x2668 VMCS_HOST_FS_BASE 0x0 VMCS_HOST_GS_BASE 0x403313c0 VMCS_HOST_TR_BASE 0x40332568 VMCS_HOST_GDTR_BASE 0x40332400 VMCS_HOST_IDTR_BASE 0x401b2b60 VMCS_HOST_IA32_SYSENTER_ESP 0x0 VMCS_HOST_IA32_SYSENTER_EIP 0x0 VMCS_HOST_RSP 0x40367e80 VMCS_HOST_RIP 0x40107c20 16-Bit Guest-State Fields VMCS_GUEST_ES_SEL 0x0 VMCS_GUEST_CS_SEL 0x10 VMCS_GUEST_SS_SEL 0x0 VMCS_GUEST_DS_SEL 0x20 VMCS_GUEST_FS_SEL 0x0 VMCS_GUEST_GS_SEL 0x0 VMCS_GUEST_LDTR_SEL 0x0 VMCS_GUEST_TR_SEL 0x70 32-Bit Guest-State Fields VMCS_GUEST_ES_LIMIT 0xffff VMCS_GUEST_CS_LIMIT 0x0 VMCS_GUEST_SS_LIMIT 0xffff VMCS_GUEST_DS_LIMIT 0xffffffff VMCS_GUEST_FS_LIMIT 0xffff VMCS_GUEST_GS_LIMIT 0xffff VMCS_GUEST_LDTR_LIMIT 0x0 VMCS_GUEST_TR_LIMIT 0x67 VMCS_GUEST_GDTR_LIMIT 0x3f VMCS_GUEST_IDTR_LIMIT 0x3ff VMCS_GUEST_ES_ACCESS_RIGHTS 0xf3 VMCS_GUEST_CS_ACCESS_RIGHTS 0x209b VMCS_GUEST_SS_ACCESS_RIGHTS 0x93 VMCS_GUEST_DS_ACCESS_RIGHTS 0xc093 VMCS_GUEST_FS_ACCESS_RIGHTS 0xf3 VMCS_GUEST_GS_ACCESS_RIGHTS 0xf3 VMCS_GUEST_LDTR_ACCESS_RIGHTS 0x10000 VMCS_GUEST_TR_ACCESS_RIGHTS 0x8b VMCS_GUEST_INTERRUPTIBILITY_STATE 0x0 VMCS_GUEST_ACTIVITY_STATE 0x0 VMCS_GUEST_IA32_SYSENTER_CS 0x0 64-Bit Guest-State Fields VMCS_VMCS_LINK_POINTER 0xffffffffffffffff VMCS_VMCS_LINK_POINTER_HIGH 0xffffffff VMCS_GUEST_IA32_DEBUGCTL 0x0 VMCS_GUEST_IA32_DEBUGCTL_HIGH 0x0 Natural-Width Guest-State Fields VMCS_GUEST_CR0 0x80050031 VMCS_GUEST_CR3 0x1a7000 VMCS_GUEST_CR4 0x26b8 VMCS_GUEST_ES_BASE 0x0 VMCS_GUEST_CS_BASE 0x0 VMCS_GUEST_SS_BASE 0x0 VMCS_GUEST_DS_BASE 0x0 VMCS_GUEST_FS_BASE 0x0 VMCS_GUEST_GS_BASE 0x0 VMCS_GUEST_LDTR_BASE 0x0 VMCS_GUEST_TR_BASE 0x40332568 VMCS_GUEST_GDTR_BASE 0x1018 VMCS_GUEST_IDTR_BASE 0x0 VMCS_GUEST_DR7 0x400 VMCS_GUEST_RSP 0x0 VMCS_GUEST_RIP 0xfffff8014442c287 VMCS_GUEST_RFLAGS 0x6 VMCS_GUEST_PENDING_DEBUG_EXCEPTIONS 0x0 VMCS_GUEST_IA32_SYSENTER_ESP 0x0 VMCS_GUEST_IA32_SYSENTER_EIP 0x0 ------------------------------------------------
yuichi_xy への返信
SPT3とEPTを無効化したところ、IA32_PATに予約されたメモリタイプが書き込まれる事象や、pegefaultが発生しなくなりました。
r158で、IA32_PAT MSR のフィール ドの値をチェックする際に、8ビットすべてを対象としました。
その結果、SPT3とEPTを無効にした状態でも、予約されたメモリタイプが書き込まれる事象や、general protectionのInject時にpage faultが発生しました。
CPU2 panic : Can't inject page fault (cr2 0xd0 err 0x0) because the other event (vector 0xd type 0x3 err_valid 0x1) is already pending. VMM state of CPU2 ------------------------------ RAX 00000031 RCX 00000AEC RDX 40331400 RBX 00000000 RSP 40367B70 RBP 40367CB0 RSI 00000000 RDI 00000000 R8 00000000 R9 40367A31 R10 00000002 R11 00000000 R12 401489C8 R13 40367CC8 R14 00000000 R15 00000000 CR0 80000039 CR2 00000000 CR3 B4D58000 CR4 00002668 RFLAGS 00000002 GDTR 40331400+0000FFFF IDTR 401B1B60+0000FFFF backtrace: 0x40367b68: 0x4011a2fb 0x40367cb8: 0x4011a0d1 0x40367d18: 0x401293d8 0x40367d28: 0x4012f89f 0x40367e88: 0x4012c115 0x40367ec8: 0x4012c34c 0x40367fc8: 0x4011518d 0x40367ff8: 0x0 ------------------------------------------------ Guest state of CPU2 ---------------------------- RAX 402FF910 RCX 00000277 RDX 00000000 RBX 00000000 RSP 00000000 RBP 00000000 RSI 00000000 RDI FFFFFFFFFFD06000 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 80050031 CR2 00000000 CR3 001A7000 CR4 000006B8 ACR ES 000000F3 CS 0000209B SS 00000093 DS 0000C093 FS 000000F3 GS 000000F3 LIMIT ES FFFFFFFFFFFFFFFF CS FFFFFFFFFFFFFFFF SS FFFFFFFFFFFFFFFF DS FFFFFFFFFFFFFFFF FS FFFFFFFFFFFFFFFF GS FFFFFFFFFFFFFFFF BASE ES 00000000 CS 00000000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00000000 CS 00000010 SS 00000000 DS 00000020 FS 00000000 GS 00000000 RIP FFFFF8020D1A3285 RFLAGS 00010006 GDTR 00001018+0000003F IDTR 00000000+000003FF EFER 00000D01 Exit reason: 0x0 (Exception or NMI) Exit qualification 000000d0 Exit intr info 80000b0e Exit intr errcode 00000000 VMCS IDTR 00000000+000003ff VMCS RFLAGS 00010006 pe=1 pg=1 sw:en=0x0 es=0x0 cs=0x100 ss=0x0 ds=0x100 fs=0x0 gs=0x0 ------------------------------------------------
yuichi_xy への返信
SIPI待ちの状態で外部割り込みを受け取ったときはpanicせずにEOIを発行するパッチを作成したところ、Windows 8.1が起動しました。 ignore_intr_140115.patch
上記に加え、IA32_PAT MSRに不正値が書かれても#GPをInjectしないパッチを作成したところ、Windows 8.1の起動に成功しました。 SPT3無効、EPT無効で試しました。
CPU#0では正しい値がIA32_PAT MSRに書き込まれていますが、CPU#2,4,6では不正値が書き込まれているように見えます。
Starting a virtual machine. MSR: msr_pass: microcode updates cannot be loaded. MSR: Update PAT 0x7010600070106 of cpu0 MSR: Unsupported pat encoding 0x402ff8c0 0 0xc0 ip 0xfffff803cb62e285 MSR: msr_pass: microcode updates cannot be loaded. MSR: Unsupported pat encoding 0x402ff8c0 0 0xc0 ip 0xfffff803cb62e285 MSR: msr_pass: microcode updates cannot be loaded. MSR: Unsupported pat encoding 0x402ff8c0 0 0xc0 ip 0xfffff803cb62e285 MSR: msr_pass: microcode updates cannot be loaded.
ignore-intr_no-inject-gp_140119.patch を適用し、SPT3を無効、EPTを有効にした状態でも、Windows 8.1の起動に成功しました。
CPU#2,4,6で書き込まれるIA32_PAT MSRの値が変化しました。
VT-d IOMMU enabled. Starting a virtual machine. MSR: msr_pass: microcode updates cannot be loaded. MSR: Update PAT 0x7010600070106 of cpu0 MSR: Unsupported pat encoding 0x40300870 0 0x70 ip 0xfffff8014d5ab285 MSR: msr_pass: microcode updates cannot be loaded. MSR: Unsupported pat encoding 0x40300870 0 0x70 ip 0xfffff8014d5ab285 MSR: msr_pass: microcode updates cannot be loaded. MSR: Unsupported pat encoding 0x40300870 0 0x70 ip 0xfffff8014d5ab285 MSR: msr_pass: microcode updates cannot be loaded.
yuichi_xy への返信
ignore-intr_no-inject-gp_140119.patch を適用し、SPT3を無効、EPTを有効にした状態でも、Windows 8.1の起動に成功しました。 CPU#2,4,6で書き込まれるIA32_PAT MSRの値が変化しました。
ignore-intr_no-inject-gp_140119.patch を適用し、SPT3を有効、EPTを有効にした状態でも、Windows 8.1の起動に成功しました。 今回も、CPU#2,4,6で書き込まれるIA32_PAT MSRの値が変化しました。
Starting a virtual machine. MSR: msr_pass: microcode updates cannot be loaded. MSR: Update PAT 0x7010600070106 of cpu0 MSR: Unsupported pat encoding 0x40130abc 0 0xbc ip 0xfffff8024c82c285 MSR: msr_pass: microcode updates cannot be loaded. MSR: Unsupported pat encoding 0x40130abc 0 0xbc ip 0xfffff8024c82c285 MSR: msr_pass: microcode updates cannot be loaded. MSR: Unsupported pat encoding 0x40130abc 0 0xbc ip 0xfffff8024c82c285 MSR: msr_pass: microcode updates cannot be loaded.
yuichi_xy への返信
SIPI待ちの状態で外部割り込みを受け取ったときはpanicせずにEOIを発行するパッチを作成したところ、Windows 8.1が起動しました。 ignore_intr_140115.patch なお、「高速スタートアップを有効にする」をオフにした状態で評価しました。
デバッグメッセージを追加してみたところ、CPU#4とCPU#6で、e1とd2の割り込みが発生していました。
Starting a virtual machine. APIC: handle wait-for-sipi state APIC: handle wait-for-sipi state APIC: handle wait-for-sipi state MSR: msr_pass: microcode updates cannot be loaded. MSR: Update PAT 0x7010600070106 of cpu0 APIC: Exit wait-for-sipi state MSR: Unsupported pat encoding 0x40130abc 0 0xbc ip 0xfffff80093233285 MSR: msr_pass: microcode updates cannot be loaded. Ignore 0xe1 cpu 6 Ignore 0xe1 cpu 4 APIC: Exit wait-for-sipi state MSR: Unsupported pat encoding 0x40130abc 0 0xbc ip 0xfffff80093233285 MSR: msr_pass: microcode updates cannot be loaded. Ignore 0xd2 cpu 6 Ignore 0xe1 cpu 6 APIC: Exit wait-for-sipi state MSR: Unsupported pat encoding 0x40130abc 0 0xbc ip 0xfffff80093233285 MSR: msr_pass: microcode updates cannot be loaded.
VM0でWindows 8.1を起動し、VM1でDebian GNU/Linux 7.0を起動したところ、Debianがストールしました。
[ 5.765477] ata2: softreset failed (1st FIS failed) [ 9.602045] ata2: softreset failed (1st FIS failed) [ 23.026214] ata2: softreset failed (1st FIS failed) [ 23.028279] ata2: limiting SATA link speed to 1.5 Gbps [ 24.948352] ata2: softreset failed (1st FIS failed) [ 24.950410] ata2: reset failed, giving up
MCFGテーブルを隠しても、Windows 8.1がmemory mapped configuration accessしてしまい、VM1に割り当てたデバイスにアクセスしてしまうのではないかと推測し、r164でmemory mapped configuration accessに対応しました。
しかし、VM1のDebianがストールする問題は解決しませんでした。
[ 5.795333] ata2: softreset failed (1st FIS failed) [ 9.631905] ata2: softreset failed (1st FIS failed)
yuichi_xy への返信
VM0でWindows 8.1を起動し、VM1でDebian GNU/Linux 7.0を起動したところ、Debianがストールしました。
VM0のWindows 8.1のHDDはチップセット内蔵AHCIに接続し、VM1のDebian 7.0のHDDはマザーボード上のAHCIに接続していました。 VM1のDebian 7.0のHDDを増設したAHCIカードに接続したところ、Windows 8.1もDebian 7.0も正常起動しました。
VM0でWindows 8.1を起動できるようにしたいと思います。