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(-)
> 

Reply via email to