Ticket #32913

VM0でWindows 8.1を起動できるようにする

Open Date: 2014-01-13 16:30 Last Update: 2014-01-25 23:15

Reporter:
Owner:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
4

Details

VM0でWindows 8.1を起動できるようにしたいと思います。

Ticket History (3/24 Histories)

2014-01-13 16:30 Updated by: yuichi_xy
  • New Ticket "VM0でWindows 8.1を起動できるようにする" created
2014-01-13 16:32 Updated by: yuichi_xy
Comment

試してみたところ、いきなり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
------------------------------------------------
2014-01-13 23:58 Updated by: yuichi_xy
Comment

VTの仕様に基づいて、VM entryのチェックを(一部)行うパッチを作りました。

vm_entry_check_140113.patch

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
2014-01-14 21:29 Updated by: yuichi_xy
Comment

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
------------------------------------------------
2014-01-14 23:39 Updated by: yuichi_xy
Comment

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
------------------------------------------------
2014-01-15 21:45 Updated by: yuichi_xy
Comment

r157で、IA32_PAT MSR に予約されたメモリタイプが書き込まれた時に、一般保護例外を Inject するようにしました。

2014-01-15 21:49 Updated by: yuichi_xy
Comment

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
------------------------------------------------
2014-01-15 22:40 Updated by: yuichi_xy
Comment

SIPI待ちの状態で外部割り込みを受け取ったときはpanicせずにEOIを発行するパッチを作成したところ、Windows 8.1が起動しました。

ignore_intr_140115.patch

なお、「高速スタートアップを有効にする」をオフにした状態で評価しました。

2014-01-17 21:49 Updated by: yuichi_xy
Comment

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
------------------------------------------------
2014-01-19 15:45 Updated by: yuichi_xy
Comment

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
------------------------------------------------
2014-01-19 16:29 Updated by: yuichi_xy
Comment

yuichi_xy への返信

SIPI待ちの状態で外部割り込みを受け取ったときはpanicせずにEOIを発行するパッチを作成したところ、Windows 8.1が起動しました。 ignore_intr_140115.patch

上記に加え、IA32_PAT MSRに不正値が書かれても#GPをInjectしないパッチを作成したところ、Windows 8.1の起動に成功しました。 SPT3無効、EPT無効で試しました。

ignore-intr_no-inject-gp_140119.patch

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.
2014-01-19 16:41 Updated by: yuichi_xy
Comment

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.
2014-01-19 16:45 Updated by: yuichi_xy
Comment

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.
2014-01-19 21:41 Updated by: yuichi_xy
Comment

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.
2014-01-19 22:14 Updated by: yuichi_xy
Comment

yuichi_xy への返信

デバッグメッセージを追加してみたところ、CPU#4とCPU#6で、e1とd2の割り込みが発生していました。

r159で、SIPI をエミュレートするための IPI のベクタを 0xff に変更し、Wait for SIPI 状態では TPR に 0xef を指定するようにしました。

これで、Wait for SIPI 状態で割り込みを無視するパッチは不要になりました。

2014-01-23 23:55 Updated by: yuichi_xy
Comment

yuichi_xy への返信

yuichi_xy への返信

ignore-intr_no-inject-gp_140119.patch を適用し、SPT3を無効、EPTを有効にした状態でも、Windows 8.1の起動に成功しました。 CPU#2,4,6で書き込まれるIA32_PAT MSRの値が変化しました。

IA32_PAT MSRを読んだ時に不定値となる不具合(コードバグ)が原因でした。

r160で修正しました。

2014-01-24 21:54 Updated by: yuichi_xy
Comment

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
2014-01-25 11:47 Updated by: yuichi_xy
Comment

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)
2014-01-25 22:29 Updated by: yuichi_xy
Comment

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も正常起動しました。

2014-01-25 23:15 Updated by: yuichi_xy
  • Resolution Update from None to Fixed
  • Ticket Close date is changed to 2014-01-25 23:15
  • Status Update from Open to Closed

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login