Skip to content

Single stepping Windows 10 bootloader results in Assertion `ret < cpu->num_ases && ret >= 0' failed.

Host environment

  • Operating system: Debian 11
  • OS/kernel version: 5.10.0-14-amd64
  • Architecture: x86_64
  • QEMU flavor: qemu-system-i386
  • QEMU version: QEMU emulator version 7.0.0
  • QEMU command line:
    ./qemu-system-i386 --drive media=disk,file=w.img,format=raw,index=1 -s -S -enable-kvm

Emulated/Virtualized environment

  • Operating system: Windows 10
  • OS/kernel version: 21H2
  • Architecture: x64
  • The guest can be simplified as w.img. It is can be downloaded / constructed using
    • Download as an attachment with this bug: w.img.xz
    • Download from Google Drive
    • Install Windows 7 or Windows 10 in QEMU. Use MBR and BIOS (i.e. do not use GPT and UEFI). For example, I installed Windows on a 32G disk, and it results in around 3 partitions: 50M, 31.5G (this is C:), 450M. Only the MBR header (around 1 M) and the 50M disk is needed.

Description of problem

When I am trying to debug Windows bootloader, I see an assertion error in QEMU when single stepping some instructions in SeaBIOS.

qemu-system-i386: ../hw/core/cpu-sysemu.c:77: cpu_asidx_from_attrs: Assertion `ret < cpu->num_ases && ret >= 0' failed.                                        

Steps to reproduce

  1. Download / construct w.img, see above
  2. Start QEMU using ./qemu-system-i386 --drive media=disk,file=w.img,format=raw,index=1 -s -S -enable-kvm
  3. Start GDB using gdb --ex 'target remote :::1234' --ex 'hb *0x7c00' --ex c --ex 'si 1000' --ex q
  4. See error message

Expected behavior

I am not sure whether the BIOS (default SeaBIOS used) or KVM is bad, but I think at least QEMU should not run into assertion error.

Additional information

The GDB script first breaks at 0x7c00, then tries to execute 1000 instructions using single step (si). On my machine, after executing around 772 instructions, the assertion error in QEMU happens. Here is an interactive GDB session on my machine.

(gdb) hb *0x7c00
Hardware assisted breakpoint 1 at 0x7c00
(gdb) c
Continuing.

Breakpoint 1, 0x00007c00 in ?? ()
(gdb) d
Delete all breakpoints? (y or n) y
(gdb) si 770
0x000f7d7b in ?? ()
(gdb) x/10i $eip
=> 0xf7d7b:	mov    $0x7d85,%ebx
   0xf7d80:	out    %al,$0xb2
   0xf7d82:	pause  
   0xf7d84:	hlt    
   0xf7d85:	mov    %bp,%sp
   0xf7d88:	jmp    0xf7dd1
   0xf7d8a:	mov    %cx,%si
   0xf7d8d:	mov    $0x1,%ax
   0xf7d91:	add    %al,(%eax)
   0xf7d93:	callw  0x6b66
(gdb) si
0x000f7d80 in ?? ()
(gdb) info reg
eax            0xb5                181
ecx            0x5678              22136
edx            0x0                 0
ebx            0x7d85              32133
esp            0xe96d4             0xe96d4
ebp            0xfed4              0xfed4
esi            0xe0346             918342
edi            0xefd91             982417
eip            0xf7d80             0xf7d80
eflags         0x6                 [ IOPL=0 PF ]
cs             0x8                 8
ss             0x10                16
ds             0x10                16
es             0x10                16
fs             0x10                16
gs             0x10                16
fs_base        0x0                 0
gs_base        0x0                 0
k_gs_base      0x0                 0
cr0            0x11                [ ET PE ]
cr2            0x0                 0
cr3            0x0                 [ PDBR=0 PCID=0 ]
cr4            0x0                 [ ]
cr8            0x0                 0
efer           0x0                 [ ]
...
mxcsr          0x1f80              [ IM DM ZM OM UM PM ]
(gdb) si
0x000f7d82 in ?? ()
(gdb) info reg
eax            0xb5                181
ecx            0x5678              22136
edx            0x0                 0
ebx            0x7d85              32133
esp            0xe96d4             0xe96d4
ebp            0xfed4              0xfed4
esi            0xe0346             918342
edi            0xefd91             982417
eip            0xf7d82             0xf7d82
eflags         0x6                 [ IOPL=0 PF ]
cs             0x8                 8
ss             0x10                16
ds             0x10                16
es             0x10                16
fs             0x10                16
gs             0x10                16
fs_base        0x0                 0
gs_base        0x0                 0
k_gs_base      0x0                 0
cr0            0x11                [ ET PE ]
cr2            0x0                 0
cr3            0x0                 [ PDBR=0 PCID=0 ]
cr4            0x0                 [ ]
cr8            0x0                 0
efer           0x0                 [ ]
...
mxcsr          0x1f80              [ IM DM ZM OM UM PM ]
(gdb) si
Remote connection closed
(gdb) 

This bug was first incorrectly filed in KVM's bug tracker at https://bugzilla.kernel.org/show_bug.cgi?id=216003.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information