On 2021/02/04 01:37PM, Sandipan Das wrote: > The Power ISA says that the fixed-point load and update > instructions must neither use R0 for the base address (RA) > nor have the destination (RT) and the base address (RA) as > the same register. Similarly, for fixed-point stores and > floating-point loads and stores, the instruction is invalid > when R0 is used as the base address (RA). > > This is applicable to the following instructions. > * Load Byte and Zero with Update (lbzu) > * Load Byte and Zero with Update Indexed (lbzux) > * Load Halfword and Zero with Update (lhzu) > * Load Halfword and Zero with Update Indexed (lhzux) > * Load Halfword Algebraic with Update (lhau) > * Load Halfword Algebraic with Update Indexed (lhaux) > * Load Word and Zero with Update (lwzu) > * Load Word and Zero with Update Indexed (lwzux) > * Load Word Algebraic with Update Indexed (lwaux) > * Load Doubleword with Update (ldu) > * Load Doubleword with Update Indexed (ldux) > * Load Floating Single with Update (lfsu) > * Load Floating Single with Update Indexed (lfsux) > * Load Floating Double with Update (lfdu) > * Load Floating Double with Update Indexed (lfdux) > * Store Byte with Update (stbu) > * Store Byte with Update Indexed (stbux) > * Store Halfword with Update (sthu) > * Store Halfword with Update Indexed (sthux) > * Store Word with Update (stwu) > * Store Word with Update Indexed (stwux) > * Store Doubleword with Update (stdu) > * Store Doubleword with Update Indexed (stdux) > * Store Floating Single with Update (stfsu) > * Store Floating Single with Update Indexed (stfsux) > * Store Floating Double with Update (stfdu) > * Store Floating Double with Update Indexed (stfdux) > > E.g. the following behaviour is observed for an invalid > load and update instruction having RA = RT. > > While a userspace program having an instruction word like > 0xe9ce0001, i.e. ldu r14, 0(r14), runs without getting > receiving a SIGILL on a Power system (observed on P8 and > P9), the outcome of executing that instruction word varies > and its behaviour can be considered to be undefined. > > Attaching an uprobe at that instruction's address results > in emulation which currently performs the load as well as > writes the effective address back to the base register. > This might not match the outcome from hardware. > > To remove any inconsistencies, this adds additional checks > for the aforementioned instructions to make sure that the > emulation infrastructure treats them as unknown. The kernel > can then fallback to executing such instructions on hardware. > > Fixes: 0016a4cf5582 ("powerpc: Emulate most Book I instructions in > emulate_step()") > Signed-off-by: Sandipan Das <sandi...@linux.ibm.com> > --- > Previous versions can be found at: > v3: > https://lore.kernel.org/linuxppc-dev/20210204071432.116439-1-sandi...@linux.ibm.com/ > v2: > https://lore.kernel.org/linuxppc-dev/20210203063841.431063-1-sandi...@linux.ibm.com/ > v1: > https://lore.kernel.org/linuxppc-dev/20201119054139.244083-1-sandi...@linux.ibm.com/ > > Changes in v4: > - Fixed grammar and switch-case alignment. > > Changes in v3: > - Consolidated the checks as suggested by Naveen. > - Consolidated load/store changes into a single patch. > - Included floating-point load/store and update instructions. > > Changes in v2: > - Jump to unknown_opcode instead of returning -1 for invalid > instruction forms. > > --- > arch/powerpc/lib/sstep.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+)
For the series: Reviewed-by: Naveen N. Rao <naveen.n....@linux.vnet.ibm.com> - Naveen