
oss-sec mailing list archives
MOV{H,L}PS instructions can fail on Genoa (Zen 4)
From: Tavis Ormandy <taviso () gmail com>
Date: Thu, 21 Sep 2023 07:21:21 -0700
Hey, when fuzzing Genoa (AMD Zen 4) I noticed that sometimes the MOV{H,L}PS instructions don't seem to work? I asked AMD if they consider this a vulnerability, and they didn't.. so I'll just document it here for reference... Quick background, these instructions load two 32-bit packed singles from the source operand into the low (movlps) or high (movhps) 64-bits of a vector register. Consider this minimal example: section .data a: dq 0x1111111111111111 b: dq 0x2222222222222222 section .text movhps xmm0, [rel a] movlps xmm0, [rel b] The result should be xmm0 has the value 0x11111111111111112222222222222222. Genoa added support for AVX512, which gives you a bunch more vector registers, so now you can do: movhps xmm28, [rel b] However, I've found that non-deterministically, when using any register above xmm15, previous (pipelined?) operations on other registers fail. Here is an example: section .data data: dd 0x11111111, 0x22222222, 0x33333333, 0x44444444 zero: dd 0,0,0,0 section .text vmovdqu xmm0, [rel data] vmovlps xmm1, xmm0, [rel zero] vmovhps xmm17, xmm0, [rel zero] I think the expected result would be: xmm0 = 0x44444444333333332222222211111111 xmm1 = 0x44444444333333330000000000000000 xmm17 = 0x00000000000000002222222211111111 However, on genoa we non-deterministically get xmm1=0. I don't know the cause or where the bug is, any feedback welcome. I've attached a testcase (I ported it to C from a raw fuzzer generated testcase, hopefully it compiles consistently!). I can reproduce it with pure intrinsics too (no asm), but the output is not consistent across gcc versions. The attached version does use some inline asm. I think it should produce no output at all, but on Genoa it does sometimes produce output for me. Compile with: $ gcc -mavx512vl -o movhps movhps.c Tavis. -- _o) $ lynx lock.cmpxchg8b.com /\\ _o) _o) $ finger taviso () sdf org _\_V _( ) _( ) @taviso
Attachment:
movhps.c
Description:
Current thread:
- MOV{H,L}PS instructions can fail on Genoa (Zen 4) Tavis Ormandy (Sep 21)