• Paul Mackerras's avatar
    powerpc/mm: Preserve CFAR value on SLB miss caused by access to bogus address · f0f558b1
    Paul Mackerras authored
    Currently, if userspace or the kernel accesses a completely bogus address,
    for example with any of bits 46-59 set, we first take an SLB miss interrupt,
    install a corresponding SLB entry with VSID 0, retry the instruction, then
    take a DSI/ISI interrupt because there is no HPT entry mapping the address.
    However, by the time of the second interrupt, the Come-From Address Register
    (CFAR) has been overwritten by the rfid instruction at the end of the SLB
    miss interrupt handler.  Since bogus accesses can often be caused by a
    function return after the stack has been overwritten, the CFAR value would
    be very useful as it could indicate which function it was whose return had
    led to the bogus address.
    
    This patch adds code to create a full exception frame in the SLB miss handler
    in the case of a bogus address, rather than inserting an SLB entry with a
    zero VSID field.  Then we call a new slb_miss_bad_addr() function in C code,
    which delivers a signal for a user access or creates an oops for a kernel
    access.  In the latter case the oops message will show the CFAR value at the
    time of the access.
    
    In the case of the radix MMU, a segment miss interrupt indicates an access
    outside the ranges mapped by the page tables.  Previously this was handled
    by the code for an unrecoverable SLB miss (one with MSR[RI] = 0), which is
    not really correct.  With this patch, we now handle these interrupts with
    slb_miss_bad_addr(), which is much more consistent.
    Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
    Reviewed-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    f0f558b1
traps.c 50.8 KB