On Wed, Jul 13, 2022 at 6:34 AM Guenter Roeck linux@roeck-us.net wrote:
Looking into the log, I don't think that message is related to the crash.
... [ 105.653777] Modules linked in: x86_pkg_temp_thermal [ 105.902123] ---[ end trace cec99cae36bcbfd7 ]--- [ 105.902124] RIP: 0010:xaddw_ax_dx+0x9/0x10 <--- crash [ 105.902126] Code: 00 0f bb d0 c3 cc cc cc cc 48 0f bb d0 c3 cc cc
Yeah, the code you snipped, shows
20: 66 0f c1 d0 xadd %dx,%ax 24: c3 ret 25: cc int3 26: cc int3 27: cc int3 28: cc int3 29:* 0f 1f 80 00 00 00 00 nopl 0x0(%rax) <-- trapping instruction 30: 0f c1 d0 xadd %edx,%eax 33: c3 ret 34: cc int3 35: cc int3 36: cc int3 37: cc int3 38: 48 0f c1 d0 xadd %rdx,%rax 3c: c3 ret 3d: cc int3
and that's a bit odd.
It says "xaddw_ax_dx+0x9/0x10", but I think somebody jumped to "xaddw_ax_dx+8", hit the 'int3', and the RIP points to the next instruction (because that's how int3 works).
And the fastop code says:
* fastop functions have a special calling convention: ... * Moreover, they are all exactly FASTOP_SIZE bytes long,
but that is clearly *NOT* the case for xaddw_ax_dx, because it's 16 bytes in size, and the other ones are 8 bytes. That's where the "nopl" comes from: it's the alignment instruction to the next fastop function.
Compare that to the word-sized 'xaddl' case rigth afterwards: that one *is* just 8 bytes in size, so the 64-byte 'xaddq' comes 8 bytes aftrer it, and there's no 7-byte padding nop-instruction.
So I think that that is where the "xaddw_ax_dx+8" comes from: some code assumes that FASTOP_SIZE is 8, but that xaddw_ax_dx case was actually 9 bytes and thus got that "int3 + padding" in the next 8 bytes.
The whole kvm x86 emulation thiing is quite complicated and has lots of instruction size #defines and magic.
I'm not familiar enough with it to go "Ahh, it's obviously XYZ", but I'm sure PeterZ and Borislav know exactly what's going on.
Linus