On Sun, 2020-02-16 at 23:57 -0600, Segher Boessenkool wrote: > On Mon, Feb 17, 2020 at 12:07:31PM +1100, Michael Neuling wrote: > > On Thu, 2020-02-13 at 10:15 -0500, Gustavo Romero wrote: > > > On P9 DD2.2 due to a CPU defect some TM instructions need to be emulated > > > by > > > KVM. This is handled at first by the hardware raising a softpatch > > > interrupt > > > when certain TM instructions that need KVM assistance are executed in the > > > guest. Some TM instructions, although not defined in the Power ISA, might > > > raise a softpatch interrupt. For instance, 'tresume.' instruction as > > > defined in the ISA must have bit 31 set (1), but an instruction that > > > matches 'tresume.' OP and XO opcodes but has bit 31 not set (0), like > > > 0x7cfe9ddc, also raises a softpatch interrupt, for example, if a code > > > like the following is executed in the guest it will raise a softpatch > > > interrupt just like a 'tresume.' when the TM facility is enabled: > > > > > > int main() { asm("tabort. 0; .long 0x7cfe9ddc;"); } > > > and then treats the executed instruction as 'nop' whilst it should > > > actually > > > be treated as an illegal instruction since it's not defined by the ISA. > > > > The ISA has this: > > > > 1.3.3 Reserved Fields, Reserved Values, and Reserved SPRs > > > > Reserved fields in instructions are ignored by the pro- > > cessor. > > > > Hence the hardware will ignore reserved bits. For example executing your > > little > > program on P8 just exits normally with 0x7cfe9ddc being executed as a NOP. > > > > Hence, we should NOP this, not generate an illegal. > > It is not a reserved bit. > > The IMC entry for it matches op1=011111 op2=1////01110 presumably, which > catches all TM instructions and nothing else (bits 0..5 and bits 21..30). > That does not look at bit 31, the softpatch handler has to deal with this. > > Some TM insns have bit 31 as 1 and some have it as /. All instructions > with a "." in the mnemonic have bit 31 is 1, all other have it reserved. > The tables in appendices D, E, F show tend. and tsr. as having it > reserved, which contradicts the individual instruction description (and > does not make much sense). (Only tcheck has /, everything else has 1; > everything else has a mnemonic with a dot, and does write CR0 always). Wow, interesting. P8 seems to be treating 31 as a reserved bit (with the table definition rather than the individual instruction description). I'm inclined to match P8 even though it's inconsistent with the dot mnemonic as you say. Mikey