• Paul Mackerras's avatar
    powerpc: Save CFAR before branching in interrupt entry paths · 1707dd16
    Paul Mackerras authored
    Some of the interrupt vectors on 64-bit POWER server processors are
    only 32 bytes long, which is not enough for the full first-level
    interrupt handler.  For these we currently just have a branch to an
    out-of-line handler.  However, this means that we corrupt the CFAR
    (come-from address register) on POWER7 and later processors.
    
    To fix this, we split the EXCEPTION_PROLOG_1 macro into two pieces:
    EXCEPTION_PROLOG_0 contains the part up to the point where the CFAR
    is saved in the PACA, and EXCEPTION_PROLOG_1 contains the rest.  We
    then put EXCEPTION_PROLOG_0 in the short interrupt vectors before
    we branch to the out-of-line handler, which contains the rest of the
    first-level interrupt handler.  To facilitate this, we define new
    _OOL (out of line) variants of STD_EXCEPTION_PSERIES, etc.
    
    In order to get EXCEPTION_PROLOG_0 to be short enough, i.e., no more
    than 6 instructions, it was necessary to move the stores that move
    the PPR and CFAR values into the PACA into __EXCEPTION_PROLOG_1 and
    to get rid of one of the two HMT_MEDIUM instructions.  Previously
    there was a HMT_MEDIUM_PPR_DISCARD before the prolog, which was
    nop'd out on processors with the PPR (POWER7 and later), and then
    another HMT_MEDIUM inside the HMT_MEDIUM_PPR_SAVE macro call inside
    __EXCEPTION_PROLOG_1, which was nop'd out on processors without PPR.
    Now the HMT_MEDIUM inside EXCEPTION_PROLOG_0 is there unconditionally
    and the HMT_MEDIUM_PPR_DISCARD is not strictly necessary, although
    this leaves it in for the interrupt vectors where there is room for
    it.
    
    Previously we had a handler for hypervisor maintenance interrupts at
    0xe50, which doesn't leave enough room for the vector for hypervisor
    emulation assist interrupts at 0xe40, since we need 8 instructions.
    The 0xe50 vector was only used on POWER6, as the HMI vector was moved
    to 0xe60 on POWER7.  Since we don't support running in hypervisor mode
    on POWER6, we just remove the handler at 0xe50.
    
    This also changes denorm_exception_hv to use EXCEPTION_PROLOG_0
    instead of open-coding it, and removes the HMT_MEDIUM_PPR_DISCARD
    from the relocation-on vectors (since any CPU that supports
    relocation-on interrupts also has the PPR).
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    1707dd16
exception-64s.h 17.3 KB