• Benjamin Gray's avatar
    powerpc/code-patching: Use dedicated memory routines for patching · c3710ee7
    Benjamin Gray authored
    The patching page set up as a writable alias may be in quadrant 0
    (userspace) if the temporary mm path is used. This causes sanitiser
    failures if so. Sanitiser failures also occur on the non-mm path
    because the plain memset family is instrumented, and KASAN treats the
    patching window as poisoned.
    
    Introduce locally defined patch_* variants of memset that perform an
    uninstrumented lower level set, as well as detecting write errors like
    the original single patch variant does.
    
    copy_to_user() is not correct here, as the PTE makes it a proper kernel
    page (the EAA is privileged access only, RW). It just happens to be in
    quadrant 0 because that's the hardware's mechanism for using the current
    PID vs PID 0 in translations. Importantly, it's incorrect to allow user
    page accesses.
    
    Now that the patching memsets are used, we also propagate a failure up
    to the caller as the single patch variant does.
    Signed-off-by: default avatarBenjamin Gray <bgray@linux.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://msgid.link/20240325052815.854044-2-bgray@linux.ibm.com
    c3710ee7
code-patching.c 16 KB