diff options
Diffstat (limited to 'results/classifier/105/assembly/2180')
| -rw-r--r-- | results/classifier/105/assembly/2180 | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/results/classifier/105/assembly/2180 b/results/classifier/105/assembly/2180 new file mode 100644 index 00000000..5cc18e79 --- /dev/null +++ b/results/classifier/105/assembly/2180 @@ -0,0 +1,49 @@ +assembly: 0.960 +instruction: 0.823 +device: 0.808 +other: 0.766 +graphic: 0.744 +socket: 0.738 +KVM: 0.663 +vnc: 0.656 +boot: 0.619 +network: 0.609 +semantic: 0.550 +mistranslation: 0.301 + +QEMU crashes when an interrupt is triggered whose descriptor is not in physical memory +Description of problem: +When an interrupt is triggered whose descriptor is mapped but not in physical memory, QEMU crashes with the following message: +``` +** +ERROR:../system/cpus.c:524:bql_lock_impl: assertion failed: (!bql_locked()) +Bail out! ERROR:../system/cpus.c:524:bql_lock_impl: assertion failed: (!bql_locked()) +Aborted (core dumped) +``` + +The given code triggers the bug by moving the IDT's base address, but it can also be triggered by any other method of moving the IDT's physical memory location, f.ex paging. With KVM enabled, this specific example loops forever instead of crashing, but if the code is altered to use paging, an internal KVM error is reported and the VM is paused. +Steps to reproduce: +1. Assemble the code listed below using NASM: `nasm test.asm -o test.bin` +2. Run the code using `qemu-system-i386 -drive format=raw,file=test.bin`. Note that the given code only triggers the bug if the guest has 2 gigabytes or less of physical memory. +3. QEMU crashes. +Additional information: +NASM assembly of the code used: +``` +bits 16 +org 0x7c00 + +_start: + ; Disable interrupts and load new IDT + cli + o32 lidt [idtdesc] + ; Descriptor for INT 0 is in nonexistent physical memory, which crashes QEMU. + int 0x00 + +idtdesc: + dw 0x3ff ; Limit: 1 KiB for IDT + dd 0x80000000 ; Base: 2 GiB + +; Like most BIOSes, SeaBIOS requires this magic number to boot +times 510-($-$$) db 0 +dw 0xaa55 +``` |