Skip to content

x86 CVT* series instructions fault

Host environment

  • Operating system: Windows 10 20H2
  • OS/kernel version: WSL2 Ubuntu 20.04.4 LTS (GNU/Linux 5.10.102.1-microsoft-standard-WSL2 x86_64)
  • Architecture: x86
  • QEMU flavor: qemu-x86_64
  • QEMU version: 7.1.90 (v7.2.0-rc0)
  • QEMU command line: qemu-x86_64 -cpu max a.out

Emulated/Virtualized environment

  • Operating system: None
  • OS/kernel version: None
  • Architecture: x86

Description of problem

For example, CVTSD2SS instruction converts SRC[63:0] double precision floating point to DEST[31:0] single precision floating point. Although the CVTSD2SS instruction uses only 8 bytes, if it overlaps page boundary, I think QEMU tries to access over the valid memory and crashes.

Steps to reproduce

  1. Compile this code
void main() {
    mmap(0x555555559000, 0x1000, flag, ~~, 0);
    asm("cvtsd2ss xmm1, qword ptr [0x555555559ff8]");
}
  1. Execute. QEMU crashes but CPU does not.

Additional information

This bug is discovered by research conducted by KAIST SoftSec.

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