boot_drive=81でOSの起動したところ、General protection faultが発生しPanic
デバッグメッセージを有効にしてみたところ、0x5eというオペコードの命令を実行した時にGeneral Protection Faultが発生したようです。
DEBUG: Unsupported opcode: 0x5e (type 0)
オペコードマップによると、pop命令であるようで、General Protection Faultが発生した原因が良く分かりません。
pop into general register rSI/r14
コードセグメントが0004C8B0:0000FFFFで IPが0001B758であるため、 コードセグメントの中にIPが収まっていません。
また、画面には以下のメッセージが出力されているため、GRUBの起動開始後にパニックしています。
Starting a virtual machine. Loading MBR. GRUB loading. Welcome to GRUB!
0004C8B0+0001B758=68008のメモリをダンプしてみたところ、命令列ではなさそうです。
debug> dp 68008 00068000 5E 00 00 00 01 01 00 00 ^....... 00068010 8B 00 00 00 01 09 00 00-93 00 00 00 01 09 00 00 ................ 00068020 9C 00 00 00 02 17 00 00-A2 00 00 00 01 0C 00 00 ................ 00068030 A9 00 00 00 01 09 00 00-B8 00 00 00 02 17 00 00 ................ 00068040 BE 00 00 00 01 0C 00 00-D0 00 00 00 01 02 00 00 ................ 00068050 D7 00 00 00 02 14 00 00-F7 00 00 00 01 02 00 00 ................ 00068060 FE 00 00 00 02 14 00 00-14 01 00 00 02 16 00 00 ................ 00068070 19 01 00 00 01 0C 00 00-52 01 00 00 02 0A 00 00 ........R....... 00068080 63 01 00 00 02 13 00 00 c.......
vt_vm_runでcsが4c8bの時パニックするようにしてみた。 VMMがcsを4c8bに書き換えてしまった可能性がある。
CPU0 panic : vt_vm_run 4c8b:667c <- 0:8410 VMM state of CPU0---- -------------------------- RAX 00000031 RCX 00000000 RDX 00000000 RBX 40143B1E RSP 4031FB70 RBP 4031FDC0 RSI 00000001 RDI 00000000 R8 4011E930 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 4031FDD0 R14 800000F259 R15 00000000 CR0 80000039 CR2 00000000 CR3 C794F000 CR4 00002660 RFLAGS 00000006 GDTR 402ECDA0+0000FFFF IDTR 401A0560+0000FFFF backtrace: 0x4031fb68: 0x4011cc87 0x4031fdc8: 0x4011d401 0x4031fe28: 0x4012c8d1 0x4031fe48: 0x4012da35 0x4031ff98: 0x40118359 0x4031ffc8: 0x4012616d 0x4031fff8: 0x0 ------------------------------------------------ Guest state of CPU0 ---------------------------- RAX 00004100 RCX 00000000 RDX 00000080 RBX CFB755AA RSP 00001FEE RBP 00001FF0 RSI 00000080 RDI CFB76350 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 00000010 CR2 00000000 CR3 00000000 CR4 00000000 ACR ES 000000F3 CS 000000F3 SS 000000F3 DS 000000F3 FS 000000F3 GS 000000F3 LIMIT ES 0000FFFF CS 0000FFFF SS 0000FFFF DS 0000FFFF FS 0000FFFF GS 0000FFFF BASE ES 00000000 CS 0004C8B0 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00000000 CS 00004C8B SS 00000000 DS 00000000 FS 00000000 GS 00000000 RIP 0000667C RFLAGS 00210046 GDTR 00008344+00000027 IDTR 00000000+000003FF EFER 00000000 Exit reason: 0x0 (Exception or NMI) Exit qualification 00000000 Exit intr info 80000b0d Exit intr errcode 00000000 VMCS IDTR 00000000+00000000 VMCS RFLAGS 00230046 pe=0 pg=0 sw:en=0x0 es=0x20 cs=0x18 ss=0x20 ds=0x20 fs=0x20 gs=0x20 ------------------------------------------------
次に、vt_write_realmode_segでcsを4c8bに書き換えようとした時にパニックさせてみた。 スタックトレースによると、Guest ソフトウェアが INT 命令を実行した可能性がある。
CPU0 panic : CS: 0x4C8B VMM state of CPU0---- -------------------------- RAX 00000031 RCX 00000000 RDX 00000000 RBX 40143CC7 RSP 4031F9F0 RBP 4031FC40 RSI 00000001 RDI 00000000 R8 4011E930 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 4031FC50 R14 4031FCEA R15 4031FCD8 CR0 80000039 CR2 00000000 CR3 C794F000 CR4 00002660 RFLAGS 00000002 GDTR 402ECDA0+0000FFFF IDTR 401A0560+0000FFFF backtrace: 0x4031f9e8: 0x4011cc87 0x4031fc48: 0x4011d401 0x4031fca8: 0x4012e9a7 <- vt_write_realmode_seg 0x4031fcb8: 0x401092e2 <- cpu_emul_realmode_int 0x4031fd28: 0x4010cb88 <- opcode_int 0x4031fe08: 0x4012d3b2 <- vt_exit_reason 0x4031fe48: 0x4012da22 0x4031ff98: 0x40118359 0x4031ffc8: 0x4012616d 0x4031fff8: 0x0 ------------------------------------------------ Guest state of CPU0 ---------------------------- RAX 00004100 RCX 00000000 RDX 00000080 RBX CFB755AA RSP 00001FF4 RBP 00001FF0 RSI 00000080 RDI CFB76350 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 00000010 CR2 00000000 CR3 00000000 CR4 00000000 ACR ES 000000F3 CS 000000F3 SS 000000F3 DS 000000F3 FS 000000F3 GS 000000F3 LIMIT ES 0000FFFF CS 0000FFFF SS 0000FFFF DS 0000FFFF FS 0000FFFF GS 0000FFFF BASE ES 00000000 CS 00000000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00000000 CS 00000000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 RIP 000089C5 RFLAGS 00210246 GDTR 00008344+00000027 IDTR 00000000+000003FF EFER 00000000 Exit reason: 0x0 (Exception or NMI) Exit qualification 00000000 Exit intr info 80000b0d Exit intr errcode 00000000 VMCS IDTR 00000000+00000000 VMCS RFLAGS 00230246 pe=0 pg=0 sw:en=0x0 es=0x20 cs=0x18 ss=0x20 ds=0x20 fs=0x20 gs=0x20 ------------------------------------------------
0x4010cb88 is in cpu_interpreter (cpu_interpreter.c:1252). 1247 opcode_int (struct op *op) 1248 { 1249 op->imm &= 0xFF; 1250 if (op->mode == CPUMODE_REAL) { 1251 UPDATE_IP (op); 1252 RET_IF_ERR (cpu_emul_realmode_int (op->imm)); 1253 return VMMERR_SUCCESS; 1254 } 1255 DEBUG_UNIMPLEMENTED (); 1256 return VMMERR_UNIMPLEMENTED_OPCODE;
CPU0 panic : cpu_emul_realmode_int(19), idtr_addr 0x4c cpu_emul_realmode_intでパニックさせてみた。 Guest ソフトウェアが実行していた INT 命令は、Int 13/AH=00h DISK - RESET DISK SYSTEMだった。 http://www.ctyme.com/intr/rb-0605.htm
VMM state of CPU0---- -------------------------- RAX 00000031 RCX 00000000 RDX 00000000 RBX 40144190 RSP 4031FA00 RBP 4031FC50 RSI 00000001 RDI 00000000 R8 4011E950 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 4031FC60 R14 0000004C R15 00000000 CR0 80000039 CR2 00000000 CR3 C794F000 CR4 00002660 RFLAGS 00000002 GDTR 402ECDA0+0000FFFF IDTR 401A0560+0000FFFF backtrace: 0x4031f9f8: 0x4011cca7 0x4031fc58: 0x4011d421 0x4031fcb8: 0x4010934d 0x4031fd28: 0x4010cba8 0x4031fe08: 0x4012d3b2 0x4031fe48: 0x4012da22 0x4031ff98: 0x40118379 0x4031ffc8: 0x4012616d 0x4031fff8: 0x0 ------------------------------------------------ Guest state of CPU0 ---------------------------- RAX 00004100 RCX 00000000 RDX 00000080 RBX CFB755AA RSP 00001FF4 RBP 00001FF0 RSI 00000080 RDI CFB76350 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 00000010 CR2 00000000 CR3 00000000 CR4 00000000 ACR ES 000000F3 CS 000000F3 SS 000000F3 DS 000000F3 FS 000000F3 GS 000000F3 LIMIT ES 0000FFFF CS 0000FFFF SS 0000FFFF DS 0000FFFF FS 0000FFFF GS 0000FFFF BASE ES 00000000 CS 00000000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00000000 CS 00000000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 RIP 000089C5 RFLAGS 00210246 GDTR 00008344+00000027 IDTR 00000000+000003FF EFER 00000000 Exit reason: 0x0 (Exception or NMI) Exit qualification 00000000 Exit intr info 80000b0d Exit intr errcode 00000000 VMCS IDTR 00000000+00000000 VMCS RFLAGS 00230246 pe=0 pg=0 sw:en=0x0 es=0x20 cs=0x18 ss=0x20 ds=0x20 fs=0x20 gs=0x20 ------------------------------------------------
debug> dp 0 00000000 EB 36 00 00 42 0C 36 00-01 00 00 00 00 00 00 00 .6..B.6......... 00000010 30 0C 34 00 42 0C 34 00-FF FF 00 00 00 9B CF 00 0.4.B.4......... 00000020 FF FF 00 00 00 93 8F 00-FF FF 00 00 00 9B 00 00 ................ 00000030 FF FF 00 00 00 93 00 00-FA 0E 1F 0E 17 BC FC 7F ................ 00000040 89 E5 E4 92 0C 02 E6 92-66 8D 36 00 7C 66 8B 4C ........f.6.|f.L 00000050 04 66 51 66 8D 5C 10 66-FF 77 04 66 FF 37 89 1F .fQf.\.f.w.f.7.. 00000060 66 89 5F 02 BB FF 01 66-01 D9 66 BF 00 00 10 00 f._....f..f..... 00000070 66 57 66 B8 4C 6F 61 64-E8 A4 00 66 C1 E9 09 74 fWf.Load...f...t
vm.boot_drive=81 で OS の起動を試みた場合 -> メモリ破壊が発生
debug> dp 0 00000000 EB 36 00 00 42 0C 36 00-01 00 00 00 00 00 00 00 .6..B.6......... 00000010 30 0C 34 00 42 0C 34 00-FF FF 00 00 00 9B CF 00 0.4.B.4......... 00000020 FF FF 00 00 00 93 8F 00-FF FF 00 00 00 9B 00 00 ................ 00000030 FF FF 00 00 00 93 00 00-FA 0E 1F 0E 17 BC FC 7F ................ 00000040 89 E5 E4 92 0C 02 E6 92-66 8D 36 00 7C 66 8B 4C ........f.6.|f.L 00000050 04 66 51 66 8D 5C 10 66-FF 77 04 66 FF 37 89 1F .fQf.\.f.w.f.7.. 00000060 66 89 5F 02 BB FF 01 66-01 D9 66 BF 00 00 10 00 f._....f..f..... 00000070 66 57 66 B8 4C 6F 61 64-E8 A4 00 66 C1 E9 09 74 fWf.Load...f...t
vm.boot_drive=81 shell=0 で OS の起動を抑止した場合 -> メモリ破壊は発生せず
debug> dp 0 00000000 16 E8 00 F0 16 E8 00 F0-C3 E2 00 F0 16 E8 00 F0 ................ 00000010 16 E8 00 F0 54 FF 00 F0-F8 72 00 F0 14 E8 00 F0 ....T....r...... 00000020 A5 FE 00 F0 87 E9 00 F0-6F EF 00 F0 6F EF 00 F0 ........o...o... 00000030 6F EF 00 F0 6F EF 00 F0-57 EF 00 F0 6F EF 00 F0 o...o...W...o... 00000040 FA 03 00 C0 4D F8 00 F0-41 F8 00 F0 30 99 00 F0 ....M...A...0... 00000050 39 E7 00 F0 55 02 00 00-2E E8 00 F0 D2 EF 00 F0 9...U........... 00000060 A4 E7 00 F0 F2 E6 00 F0-6E FE 00 F0 53 FF 00 F0 ........n...S... 00000070 53 FF 00 F0 A4 F0 00 F0-C7 EF 00 F0 8A 6D 00 C0 S............m..
vm.boot_int18 shell=1 で OS の起動を試みた場合 -> メモリ破壊は発生せず
debug> dp 0 > debug guest state not found debug> Dp 0 00000000 16 E8 00 F0 16 E8 00 F0-C3 E2 00 F0 16 E8 00 F0 ................ 00000010 16 E8 00 F0 54 FF 00 F0-F8 72 00 F0 14 E8 00 F0 ....T....r...... 00000020 A5 FE 00 F0 87 E9 00 F0-6F EF 00 F0 6F EF 00 F0 ........o...o... 00000030 6F EF 00 F0 6F EF 00 F0-57 EF 00 F0 6F EF 00 F0 o...o...W...o... 00000040 FA 03 00 C0 4D F8 00 F0-41 F8 00 F0 30 99 00 F0 ....M...A...0... 00000050 39 E7 00 F0 55 02 00 00-2E E8 00 F0 D2 EF 00 F0 9...U........... 00000060 A4 E7 00 F0 F2 E6 00 F0-6E FE 00 F0 53 FF 00 F0 ........n...S... 00000070 53 FF 00 F0 A4 F0 00 F0-C7 EF 00 F0 8A 6D 00 C0 S............m..
vmexit直後と、vmentry直前に0x4eの値が0x4cb8と一致しているかチェックし、一致している場合はパニックするようにしてみました。 vmentry直前でパニックしているため、VMMが該当アドレスを破壊している可能性があります。
パニック直前のvmexitの原因はPage Faultであり、さらに、Page Faultが発生したアドレスがc7900066とVMM用メモリのため、VMMのShadow Pagingに問題がある可能性があります。
VMM will use 0xC7800000-0xCF800000 (128 MiB).
CPU0 panic : vmentry 4e = 4cb8 VMM state of CPU0---- -------------------------- RAX 00000031 RCX 00000000 RDX 00000000 RBX 40143BDE RSP 4031FB60 RBP 4031FDB0 RSI 00000001 RDI 00000000 R8 4011E950 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 4031FDC0 R14 800000F259 R15 00000000 CR0 80000039 CR2 00000000 CR3 C794F000 CR4 00002660 RFLAGS 00000002 GDTR 402ECDA0+0000FFFF IDTR 401A0560+0000FFFF backtrace: 0x4031fb58: 0x4011cca7 0x4031fdb8: 0x4011d421 0x4031fe18: 0x4012c92b 0x4031fe48: 0x4012dab5 0x4031ff98: 0x40118379 0x4031ffc8: 0x4012616d 0x4031fff8: 0x0 ------------------------------------------------ Guest state of CPU0 ---------------------------- RAX 00000227 RCX 00000001 RDX 00000080 RBX 00000000 RSP 00001FC8 RBP 00001FF0 RSI 00070D08 RDI CFB50201 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 00000010 CR2 00000000 CR3 00000000 CR4 00000000 ACR ES 000000F3 CS 000000F3 SS 000000F3 DS 000000F3 FS 000000F3 GS 000000F3 LIMIT ES 0000FFFF CS 0000FFFF SS 0000FFFF DS 0000FFFF FS 0000FFFF GS 0000FFFF BASE ES 00068000 CS 000F0000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00006800 CS 0000F000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 RIP 00007532 RFLAGS 00210297 GDTR 00008344+00000027 IDTR 00000000+000003FF EFER 00000000 Exit reason: 0x0 (Exception or NMI) Exit qualification c7900066 Exit intr info 80000b0e Exit intr errcode 00000000 VMCS IDTR 00000000+00000000 VMCS RFLAGS 00230297 pe=0 pg=0 sw:en=0x0 es=0x20 cs=0x18 ss=0x20 ds=0x20 fs=0x20 gs=0x20 ------------------------------------------------
cpu interpriter を呼び出す前後で 4e が 4cb8 と一致する場合パニックするようにしてみました。OUT B2, AL命令を cpu interpriter が実行するときに、4e が書き換わっているようです。
interpriter 0xc7900066 CPU0 panic : interpriter after 4e = 4cb8, ip = 0x7530 VMM state of CPU0---- -------------------------- RAX 00000031 RCX 00000000 RDX 00000000 RBX 40144570 RSP 4031FA10 RBP 4031FC60 RSI 00000001 RDI 00000000 R8 4011EA80 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 4031FC70 R14 00000000 R15 00000000 CR0 80000039 CR2 00000000 CR3 C794F000 CR4 00002660 RFLAGS 00000006 GDTR 402ECDA0+0000FFFF IDTR 401A0560+0000FFFF backtrace: 0x4031fa08: 0x4011cdd7 0x4031fc68: 0x4011d551 0x4031fcc8: 0x4010f601 0x4031fe08: 0x4012d4db 0x4031fe48: 0x4012da9b 0x4031ff98: 0x401184a9 0x4031ffc8: 0x4012616d 0x4031fff8: 0x0 ------------------------------------------------ Guest state of CPU0 ---------------------------- RAX 00000227 RCX 00000001 RDX 00000080 RBX 00000000 RSP 00001FC8 RBP 00001FF0 RSI 00070D08 RDI CFB50201 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 00000010 CR2 00000000 CR3 00000000 CR4 00000000 ACR ES 000000F3 CS 000000F3 SS 000000F3 DS 000000F3 FS 000000F3 GS 000000F3 LIMIT ES 0000FFFF CS 0000FFFF SS 0000FFFF DS 0000FFFF FS 0000FFFF GS 0000FFFF BASE ES 00068000 CS 000F0000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00006800 CS 0000F000 SS 00000000 DS 00000000 FS 00000000 GS 00000000 RIP 00007532 RFLAGS 00210297 GDTR 00008344+00000027 IDTR 00000000+000003FF EFER 00000000 Exit reason: 0x0 (Exception or NMI) Exit qualification c7900066 Exit intr info 80000b0e Exit intr errcode 00000000 VMCS IDTR 00000000+00000000 VMCS RFLAGS 00230297 pe=0 pg=0 sw:en=0x0 es=0x20 cs=0x18 ss=0x20 ds=0x20 fs=0x20 gs=0x20 ------------------------------------------------
debug> dp f7530 000F7530 E6 B2 66 60 B9 FF 00 E6-EB E2 FC 66 61 C3 C3 C3 ..f`.......fa... 000F7540 BA 01 04 EC EE E8 12 CB-9A D2 CA 00 E0 9A 77 88 ..............w. 000F7550 00 E0 BA F9 0C B0 06 EE-EB FE C3 E8 8A FF 22 C3 ..............". 000F7560 0A C7 E8 8D FF C3 E8 7F-FF 0A C3 E8 84 FF C3 E8 ................ 000F7570 76 FF 22 C3 E8 7B FF C3-E8 6D FF E8 74 FF C3 E8 v."..{...m..t... 000F7580 66 FF CB E8 6C FF CB E8-D1 FF CB E8 D8 FF CB E8 f...l........... 000F7590 DD FF CB E8 E2 FF CB E8-67 81 CB E8 C5 81 CB E8 ........g....... 000F75A0 F2 81 CB E8 4A 81 CB E8-A2 81 CB E8 42 81 22 C3 ....J.......B.".
E6 OUT Ib, AL (I:Immediate data)
Immediate data が B2 なので、
OUT B2, AL
TinyVisorなしでOSを起動して、/proc/ioportsを表示してみたが、io port b2は使われていませんでした。
$ more /proc/ioports 0000-001f : dma1 0020-0021 : pic1 0040-0043 : timer0 0050-0053 : timer1 0060-0060 : keyboard 0064-0064 : keyboard 0070-0073 : rtc0 0080-008f : dma page reg 00a0-00a1 : pic2 00c0-00df : dma2 00f0-00ff : fpu 0290-029f : pnp 00:01 0290-0294 : pnp 00:01 0378-037a : parport0 03c0-03df : vga+ 03f2-03f2 : floppy 03f4-03f5 : floppy 03f7-03f7 : floppy 03f8-03ff : serial 0400-04cf : pnp 00:0b 0400-0403 : ACPI PM1a_EVT_BLK 0404-0405 : ACPI PM1a_CNT_BLK 0408-040b : ACPI PM_TMR 0410-0415 : ACPI CPU throttle 0420-042f : ACPI GPE0_BLK 0450-0450 : ACPI PM2_CNT_BLK 04d0-04d1 : pnp 00:01 04d2-04ff : pnp 00:0b 0500-051f : 0000:00:1f.3 0500-051f : i801_smbus 0800-087f : pnp 00:01 0880-088f : pnp 00:01 0cf8-0cff : PCI conf1 1000-1fff : PCI Bus 0000:05 a000-afff : PCI Bus 0000:06 af00-af7f : 0000:06:00.0 b000-bfff : PCI Bus 0000:04 bb00-bb0f : 0000:04:00.0 bb00-bb0f : ahci bc00-bc03 : 0000:04:00.0 bc00-bc03 : ahci bd00-bd07 : 0000:04:00.0 bd00-bd07 : ahci be00-be03 : 0000:04:00.0 be00-be03 : ahci bf00-bf07 : 0000:04:00.0 bf00-bf07 : ahci c000-cfff : PCI Bus 0000:03 ce00-ceff : 0000:03:00.0 ce00-ceff : r8169 d000-dfff : PCI Bus 0000:02 e000-efff : PCI Bus 0000:01 ee00-eeff : 0000:01:00.0 f400-f41f : 0000:00:1f.2 f400-f41f : ahci f500-f503 : 0000:00:1f.2 f500-f503 : ahci f600-f607 : 0000:00:1f.2 f600-f607 : ahci f700-f703 : 0000:00:1f.2 f700-f703 : ahci f800-f807 : 0000:00:1f.2 f800-f807 : ahci f900-f91f : 0000:00:1d.3 f900-f91f : uhci_hcd fa00-fa1f : 0000:00:1d.2 fa00-fa1f : uhci_hcd fb00-fb1f : 0000:00:1d.1 fb00-fb1f : uhci_hcd fc00-fc1f : 0000:00:1d.0 fc00-fc1f : uhci_hcd fd00-fd1f : 0000:00:1a.2 fd00-fd1f : uhci_hcd fe00-fe1f : 0000:00:1a.1 fe00-fe1f : uhci_hcd ff00-ff1f : 0000:00:1a.0 ff00-ff1f : uhci_hcd
思い立って、VT-dを無効化してみたが、結果は変わりませんでした。
yuichi_xy への返信
cpu interpriter を呼び出す前後で 4e が 4cb8 と一致する場合パニックするようにしてみました。OUT B2, AL命令を cpu interpriter が実行するときに、4e が書き換わっているようです。
cpu interpriterのコードを確認しましたが、問題は見つかりませんでした。
OUT命令が契機となって、0番地にDMAされてしまった可能性があります。
r55 でも再現しました。
./install_to_usb.sh -c 'vm0.boot_drive=81' /dev/sdd
CPU0 panic : General protection fault in real mode and can't emulate the instruction (err: 10) VMM state of CPU0---- -------------------------- RAX 00000031 RCX 00000000 RDX 00000000 RBX 40146A48 RSP 4031FB50 RBP 4031FDA0 RSI 00000001 RDI 00000000 R8 4011E9C0 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 4031FDB0 R14 800000F259 R15 00000000 CR0 80000039 CR2 00000000 CR3 C794F000 CR4 00002660 RFLAGS 00000006 GDTR 402ECDA0+0000FFFF IDTR 401A0560+0000FFFF backtrace: 0x4031fb48: 0x4011cd17 0x4031fda8: 0x4011d491 0x4031fe08: 0x4012d5db 0x4031fe58: 0x4012db85 0x4031ff98: 0x401183e3 0x4031ffc8: 0x4012616d 0x4031fff8: 0x0 ------------------------------------------------ Guest state of CPU0 ---------------------------- RAX 00004100 RCX 00000000 RDX 00000080 RBX CFB755AA RSP 00001FEE RBP 00001FF0 RSI 00000080 RDI CFB76350 R8 00000000 R9 00000000 R10 00000000 R11 00000000 R12 00000000 R13 00000000 R14 00000000 R15 00000000 CR0 00000010 CR2 00000000 CR3 00000000 CR4 00000000 ACR ES 000000F3 CS 000000F3 SS 000000F3 DS 000000F3 FS 000000F3 GS 000000F3 LIMIT ES 0000FFFF CS 0000FFFF SS 0000FFFF DS 0000FFFF FS 0000FFFF GS 0000FFFF BASE ES 00000000 CS 0004C8B0 SS 00000000 DS 00000000 FS 00000000 GS 00000000 SEL ES 00000000 CS 00004C8B SS 00000000 DS 00000000 FS 00000000 GS 00000000 RIP 0001B758 RFLAGS 00210046 GDTR 00008344+00000027 IDTR 00000000+000003FF EFER 00000000 Exit reason: 0x0 (Exception or NMI) Exit qualification 00000000 Exit intr info 80000b0d Exit intr errcode 00000000 VMCS IDTR 00000000+00000000 VMCS RFLAGS 00230046 pe=0 pg=0 sw:en=0x0 es=0x20 cs=0x18 ss=0x20 ds=0x20 fs=0x20 gs=0x20 ------------------------------------------------
yuichi_xy への返信
cpu interpriter を呼び出す前後で 4e が 4cb8 と一致する場合パニックするようにしてみました。OUT B2, AL命令を cpu interpriter が実行するときに、4e が書き換わっているようです。
main.c で DUMP_MEM_AND_PCI を定義して、各 PCI デバイスに割り当てられている I/O リソースを表示してみた。 b2 を含むI/Oリソースを割り当てられているデバイスは存在しませんでした。
仮に DMA でメモリが破壊されたなら、 SATAが b2 のリソースを持っているのではないかと思ったのですが、そうではないようです。
0000000000000000-000000000000ffff type 1 data 0 io_resource 00000000000003b0-00000000000003bb type 3 data 10 00:03.0 00000000000003c0-00000000000003df type 3 data 10 00:03.0 0000000000000500-000000000000051f type 3 data 0 00:1f.3 000000000000a000-000000000000afff type 3 data 10 00:1c.4 000000000000af00-000000000000af7f type 3 data 0 06:00.0 000000000000b000-000000000000bfff type 3 data 10 00:1c.2 000000000000bb00-000000000000bb0f type 3 data 0 04:00.0 ★ 拡張カードの SATA\ 000000000000bc00-000000000000bc03 type 3 data 0 04:00.0 ★ 拡張カードの SATA\ 000000000000bd00-000000000000bd07 type 3 data 0 04:00.0 ★ 拡張カードの SATA\ 000000000000be00-000000000000be03 type 3 data 0 04:00.0 ★ 拡張カードの SATA\ 000000000000bf00-000000000000bf07 type 3 data 0 04:00.0 ★ 拡張カードの SATA\ 000000000000c000-000000000000cfff type 3 data 10 00:1c.1 000000000000ce00-000000000000ceff type 3 data 0 03:00.0 000000000000d000-000000000000dfff type 3 data 10 00:1c.0 000000000000e000-000000000000efff type 3 data 10 00:03.0 000000000000ee00-000000000000eeff type 3 data 0 01:00.0 000000000000f400-000000000000f41f type 3 data 0 00:1f.2 ★ PCH の SATA 000000000000f500-000000000000f503 type 3 data 0 00:1f.2 ★ PCH の SATA 000000000000f600-000000000000f607 type 3 data 0 00:1f.2 ★ PCH の SATA 000000000000f700-000000000000f703 type 3 data 0 00:1f.2 ★ PCH の SATA 000000000000f800-000000000000f807 type 3 data 0 00:1f.2 ★ PCH の SATA 000000000000f900-000000000000f91f type 3 data 0 00:1d.3 000000000000fa00-000000000000fa1f type 3 data 0 00:1d.2 000000000000fb00-000000000000fb1f type 3 data 0 00:1d.1 000000000000fc00-000000000000fc1f type 3 data 0 00:1d.0 000000000000fd00-000000000000fd1f type 3 data 0 00:1a.2 000000000000fe00-000000000000fe1f type 3 data 0 00:1a.1 000000000000ff00-000000000000ff1f type 3 data 0 00:1a.0
BIOS が使用しているメモリを破壊してしまい BIOS が誤動作している可能性を考えて、特別に予約するなどの対処をせずに VMM がメモリへ書き込む処理を確認しました。
1. 0x255 から 0x25c までに INT 15 の hook 用コードが書き込む
/* 9 bytes hook program */ /* 0000:0255 E7 1F out %ax, $0x1F */ /* 0000:0257 EA ljmp */ /* 0000:0258 XX YY xx yy xxyy:XXYY */ /* 0000:025C CA 02 lret $2 */
2. 0x800 から 0xa47 までブートローダをロードするためのコードを書き込む
3. 0x7c00 から 0x7dff までブートセクタをロードする。
yuichi_xy への返信
vm.boot_drive=81 で OS の起動を試みた場合 -> メモリ破壊が発生
以下の物理アドレス0に書き込まれたデータは、VMMのbootloaderでした。
GRUBの起動中に、VMMのbootloaderが物理アドレス0に書き込まれたようです。
{{{ debug> dp 0 00000000 EB 36 00 00 42 0C 36 00-01 00 00 00 00 00 00 00 .6..B.6......... 00000010 30 0C 34 00 42 0C 34 00-FF FF 00 00 00 9B CF 00 0.4.B.4......... 00000020 FF FF 00 00 00 93 8F 00-FF FF 00 00 00 9B 00 00 ................ 00000030 FF FF 00 00 00 93 00 00-FA 0E 1F 0E 17 BC FC 7F ................ 00000040 89 E5 E4 92 0C 02 E6 92-66 8D 36 00 7C 66 8B 4C ........f.6.|f.L 00000050 04 66 51 66 8D 5C 10 66-FF 77 04 66 FF 37 89 1F .fQf.\.f.w.f.7.. 00000060 66 89 5F 02 BB FF 01 66-01 D9 66 BF 00 00 10 00 f._....f..f..... 00000070 66 57 66 B8 4C 6F 61 64-E8 A4 00 66 C1 E9 09 74 fWf.Load...f...t }}}
yuichi_xy への返信
BIOS が使用しているメモリを破壊してしまい BIOS が誤動作している可能性を考えて、特別に予約するなどの対処をせずに VMM がメモリへ書き込む処理を確認しました。 1. 0x255 から 0x25c までに INT 15 の hook 用コードが書き込む {{{ /* 9 bytes hook program */ /* 0000:0255 E7 1F out %ax, $0x1F */ /* 0000:0257 EA ljmp */ /* 0000:0258 XX YY xx yy xxyy:XXYY */ /* 0000:025C CA 02 lret $2 */ }}} 該当の領域は割り込みベクタテーブルのベクタ95h, 96h, 97hのエントリに相当しますが、これらのベクタは使用していないはずなので、問題にはならないと思います。 http://www.ctyme.com/intr/int-95.htm
http://www.ctyme.com/intr/int-96.htm
http://www.ctyme.com/intr/int-97.htm 2. 0x800 から 0xa47 までブートローダをロードするためのコードを書き込む #define GUEST_BOOT_OFFSET 0x800
#define GUEST_BOOT_LENGTH (guest_boot_end - guest_boot_start) 40111fe0 T guest_boot_start
40112228 T guest_boot_end 該当のアドレスは、「guaranteed free for use」のようです。 http://wiki.osdev.org/Memory_Map_(x86)#.22Low.22_memory_.28.3C_1_MiB.29 3. 0x7c00 から 0x7dff までブートセクタをロードする。 該当のアドレスは、「RAM - partially unusable (see above) 」ですが、OS BootSector用の場所なので問題なさそうです。 http://wiki.osdev.org/Memory_Map_(x86)#.22Low.22_memory_.28.3C_1_MiB.29
漏れがありました。
4. 0xf000 から 0xf271 まで2個目以降のプロセッサ起動用のコードを書き込む
r123 で IvyBridge マシンで再現評価しましたが、再現しませんでした。 リビジョンの違いか、マシンの違いかはわかりませんが、調査できないのでcloseします。
boot_drive=81でOSの起動したところ、General protection faultでPanicしました。
障害発生リビジョン: r42