2016-10-10

「BTX halted」発生時のレジスタダンプから場所を特定

「BTX halted」が発生した時のレジスタダンプは以下のとおりでした。
-
int=0000000d  err=00000038  efl=00010046  eip=00009094
eax=00000011  ebx=00002820  ecx=00000038  edx=000008ee
esi=24009601  edi=00025f98  ebp=40000892 esp=fedfbe3a
cs=0008  ds=0000 es=0000    fs=0000  gs=0000  ss=0010
cs:ip=0f 00 d9 ba 00 a0 00 00-36 0f b7 05 13 04 00 00
       c1 e0 0a 2d 00 10 00 00-29 d0 b1 33 51 50 68 02
ss:esp=ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff
       ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff
BTX halted
EIPが9094を指しているということはBTX関連だと考えられます。objdumpを使ってbtx.oを逆アセンブルしてみると次のようになりました。
0000008c <init.8>:
  8c:   31 c9                   xor    %ecx,%ecx
  8e:   b1 10                   mov    $0x10,%cl
  90:   8e d1                   mov    %ecx,%ss
  92:   b1 38                   mov    $0x38,%cl
  94:   0f 00 d9                ltr    %cx
  97:   ba 00 a0 00 00          mov    $0xa000,%edx
  9c:   36 0f b7 05 13 04 00    movzwl %ss:0x413,%eax
  a3:   00
  a4:   c1 e0 0a                shl    $0xa,%eax
  a7:   2d 00 10 00 00          sub    $0x1000,%eax
これに該当するのは/usr/src/sys/boot/i386/btx/btx/btx.Sの次の辺りです。
 init.8:         xorl %ecx,%ecx                  # Zero
                movb $SEL_SDATA,%cl             # To 32-bit
                movw %cx,%ss                    #  stack
/*
 * Launch user task.
 */
                movb $SEL_TSS,%cl               # Set task
                ltr %cx                         #  register
                movl $MEM_USR,%edx              # User base address
                movzwl %ss:BDA_MEM,%eax         # Get free memory
                shll $0xa,%eax                  # To bytes
                subl $ARGSPACE,%eax             # Less arg space
objdumpで表示されている94番地以降のバイト列が、レジスタダンプにおけるCS:IPの表示と一致しているので、おそらくここが問題の箇所でしょう。「ltr %cx」でGPF(int=0d)が発生したということになると思います。

この辺りのコードにバグがあるとは思えないし、ここを通過しないとプロテクトモードに遷移できないのでFreeBSD/i386が立ち上がらないということになってしまいます。

問題解決に向けて少し前進した気がしますが、まだまだ解決には遠い感じです。

0 件のコメント:

コメントを投稿