Tested-by: Michael Neuling <mi...@neuling.org> FWIW I've written a test case for alignment faults (which I'll convert to a selftest and upstream). It tests all load stores supported by POWER9 (results below).
VSX: 2.06B Doing lxvd2x: PASSED Doing lxvw4x: PASSED Doing lxsdx: PASSED Doing lxvdsx: PASSED Doing stxvd2x: PASSED Doing stxvw4x: PASSED Doing stxsdx: PASSED VSX: 2.07B Doing lxsspx: PASSED Doing lxsiwax: PASSED Doing lxsiwzx: PASSED Doing stxsspx: PASSED Doing stxsiwx: PASSED VSX: 3.00B Doing lxsd: PASSED Doing lxsibzx: PASSED Doing lxsihzx: PASSED Doing lxssp: PASSED Doing lxv: PASSED Doing lxvb16x: PASSED Doing lxvh8x: PASSED Doing lxvx: PASSED Doing lxvwsx: PASSED Doing lxvl: PASSED Doing lxvll: PASSED Doing stxsd: PASSED Doing stxsibx: PASSED Doing stxsihx: PASSED Doing stxssp: PASSED Doing stxv: PASSED Doing stxvb16x: PASSED Doing stxvh8x: PASSED Doing stxvx: PASSED Doing stxvl: PASSED Doing stxvll: PASSED Integer Doing lbz: PASSED Doing lbzu: PASSED Doing lbzx: PASSED Doing lbzux: PASSED Doing lhz: PASSED Doing lhzu: PASSED Doing lhzx: PASSED Doing lhzux: PASSED Doing lha: PASSED Doing lhau: PASSED Doing lhax: PASSED Doing lhaux: PASSED Doing lhbrx: PASSED Doing lwz: PASSED Doing lwzu: PASSED Doing lwzx: PASSED Doing lwzux: PASSED Doing lwa: PASSED Doing lwax: PASSED Doing lwaux: PASSED Doing lwbrx: PASSED Doing ld: PASSED Doing ldu: PASSED Doing ldx: PASSED Doing ldux: PASSED Doing ldbrx: PASSED Doing lmw: PASSED Doing stb: PASSED Doing stbx: PASSED Doing stbu: PASSED Doing stbux: PASSED Doing sth: PASSED Doing sthx: PASSED Doing sthu: PASSED Doing sthux: PASSED Doing sthbrx: PASSED Doing stw: PASSED Doing stwx: PASSED Doing stwu: PASSED Doing stwux: PASSED Doing stwbrx: PASSED Doing std: PASSED Doing stdx: PASSED Doing stdu: PASSED Doing stdux: PASSED Doing stdbrx: PASSED Doing stmw: PASSED VMX Doing stvx: PASSED Doing stvebx: PASSED Doing stvehx: PASSED Doing stvewx: PASSED Doing stvxl: PASSED Floating point Doing lfd: PASSED Doing lfdx: PASSED Doing lfdp: PASSED Doing lfdpx: PASSED Doing lfdu: PASSED Doing lfdux: PASSED Doing lfs: PASSED Doing lfsx: PASSED Doing lfsu: PASSED Doing lfsux: PASSED Doing lfiwzx: PASSED Doing lfiwax: PASSED Doing stfd: PASSED Doing stfdx: PASSED Doing stfdp: PASSED Doing stfdpx: PASSED Doing stfdu: PASSED Doing stfdux: PASSED Doing stfs: PASSED Doing stfsx: PASSED Doing stfsu: PASSED Doing stfsux: PASSED Doing stfiwx: PASSED On Wed, 2017-08-30 at 14:12 +1000, Paul Mackerras wrote: > This series extends the instruction emulation infrastructure in > arch/powerpc/lib/sstep.c and uses it for emulating instructions when > we get an alignment interrupt. The advantage of this is that we only > have to add the new POWER9 instructions in one place, and it fixes > several bugs in alignment interrupt handling that have been identified > recently. > > With this, analyse_instr() and emulate_step() handle almost all load > and store instructions in Power ISA v3.00 -- all except the atomic > memory operations (lwat, stwat, etc.). We now always use the largest > possible aligned memory accesses (up to 8 bytes) to emulate unaligned > accesses. If we get a fault, the faulting address is accurately > recorded in regs->dar. We also can now access FP/VMX/VSX registers > directly if they are live, without having to spill them all to the > thread_struct and the reload them all later. There are also various > other fixes in the series. > > This version is based on the current powerpc next branch. > > Paul. > > arch/powerpc/Kconfig | 4 - > arch/powerpc/include/asm/ppc-opcode.h | 10 +- > arch/powerpc/include/asm/sstep.h | 90 +- > arch/powerpc/kernel/align.c | 774 +----------- > arch/powerpc/lib/Makefile | 3 +- > arch/powerpc/lib/ldstfp.S | 307 ++--- > arch/powerpc/lib/quad.S | 62 + > arch/powerpc/lib/sstep.c | 2139 +++++++++++++++++++++++--------- > - > 8 files changed, 1802 insertions(+), 1587 deletions(-) >