Ticket #28765

boot_drive=81でOSの起動したところ、General protection faultが発生しPanic

Date d'ouverture: 2012-06-16 22:26 Dernière mise à jour: 2013-11-23 18:51

Rapporteur:
Propriétaire:
Type:
État:
Atteints
Composant:
(Aucun)
Jalon:
(Aucun)
Priorité:
5 - moyen
Sévérité:
5 - moyen
Résolution:
Works For Me
Fichier:
Aucun

Détails

boot_drive=81でOSの起動したところ、General protection faultでPanicしました。

PU0 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 40145790
RSP 4031FB60    RBP 4031FDB0    RSI 00000001    RDI 00000000
R8  4011E860    R9  00000000    R10 00000000    R11 00000000
R12 00000000    R13 4031FDC0    R14 800000F259    R15 00000000
CR0 80000039    CR2 00000000    CR3 C794E000    CR4 00002660
RFLAGS 00000002  GDTR 402EBDA0+0000FFFF  IDTR 4019F560+0000FFFF
backtrace:
    0x4031fb58: 0x4011cbb7
    0x4031fdb8: 0x4011d331
    0x4031fe18: 0x4012c358
    0x4031fe58: 0x4012c967
    0x4031ff98: 0x40118289
    0x4031ffc8: 0x4012516d
    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
------------------------------------------------

障害発生リビジョン: r42

Ticket History (3/18 Histories)

2012-06-16 22:26 Updated by: yuichi_xy
  • New Ticket "boot_drive=81でOSの起動したところ、General protection faultが発生しPanic" created
2012-06-16 22:31 Updated by: yuichi_xy
Commentaire

デバッグメッセージを有効にしてみたところ、0x5eというオペコードの命令を実行した時にGeneral Protection Faultが発生したようです。

DEBUG: Unsupported opcode: 0x5e (type 0)

オペコードマップによると、pop命令であるようで、General Protection Faultが発生した原因が良く分かりません。

pop into general register rSI/r14

2012-06-16 22:44 Updated by: yuichi_xy
Commentaire

コードセグメントが0004C8B0:0000FFFFで IPが0001B758であるため、 コードセグメントの中にIPが収まっていません。

また、画面には以下のメッセージが出力されているため、GRUBの起動開始後にパニックしています。

Starting a virtual machine.
Loading MBR.
GRUB loading.
Welcome to GRUB!
2012-06-16 22:50 Updated by: yuichi_xy
Commentaire

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.......
2012-06-17 14:52 Updated by: yuichi_xy
Commentaire

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
2012-06-17 15:17 Updated by: yuichi_xy
Commentaire

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..
2012-06-17 17:50 Updated by: yuichi_xy
Commentaire

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
------------------------------------------------
2012-06-17 21:56 Updated by: yuichi_xy
Commentaire

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

2012-06-17 23:26 Updated by: yuichi_xy
Commentaire

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
2012-06-18 22:16 Updated by: yuichi_xy
Commentaire

思い立って、VT-dを無効化してみたが、結果は変わりませんでした。

2012-06-24 14:09 Updated by: yuichi_xy
Commentaire

yuichi_xy への返信

cpu interpriter を呼び出す前後で 4e が 4cb8 と一致する場合パニックするようにしてみました。OUT B2, AL命令を cpu interpriter が実行するときに、4e が書き換わっているようです。

cpu interpriterのコードを確認しましたが、問題は見つかりませんでした。

OUT命令が契機となって、0番地にDMAされてしまった可能性があります。

2012-08-07 09:11 Updated by: yuichi_xy
Commentaire

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
------------------------------------------------
2012-08-07 12:03 Updated by: yuichi_xy
Commentaire

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
2012-08-07 15:35 Updated by: yuichi_xy
Commentaire

yuichi_xy への返信

r55 でも再現しました。 {{{ ./install_to_usb.sh -c 'vm0.boot_drive=81' /dev/sdd }}}

次のようにBIOSドライブ番号を82にしたら、FreeBSDが起動しました。

81のドライブにはLinux、82のドライブにはFreeBSDがインストールされています。 82のドライブをLinuxに入れ替えた場合はpanicするため、VMMとOSのブートローダの間に相性があるのかもしれません。

./install_to_usb.sh -c 'vm0.boot_drive=82' /dev/sdd
2012-08-07 17:05 Updated by: yuichi_xy
  • Details Updated
Commentaire

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のエントリに相当しますが、これらのベクタは使用していないはずなので、問題にはならないと思います。

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」のようです。

3. 0x7c00 から 0x7dff までブートセクタをロードする。

該当のアドレスは、「RAM - partially unusable (see above) 」ですが、OS BootSector用の場所なので問題なさそうです。
2012-08-12 15:36 Updated by: yuichi_xy
Commentaire

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 }}}

2012-08-12 22:48 Updated by: yuichi_xy
Commentaire

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個目以降のプロセッサ起動用のコードを書き込む

#define APINIT_OFFSET 0xF000
#define APINIT_SIZE (cpuinit_end - cpuinit_start)
40101097 T cpuinit_start
40101308 T cpuinit_end
「RAM (guaranteed free for use)」なので問題なさそうです。
2013-11-23 18:51 Updated by: yuichi_xy
  • Résolution Update from Aucun to Works For Me
  • État Update from Ouvert to Atteints
  • Ticket Close date is changed to 2013-11-23 18:51
Commentaire

r123 で IvyBridge マシンで再現評価しましたが、再現しませんでした。 リビジョンの違いか、マシンの違いかはわかりませんが、調査できないのでcloseします。

Attachment File List

No attachments

Modifier

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