lkml.org 
[lkml]   [2023]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 03/12] x86/alternatives: Disable LASS when patching kernel alternatives
    Date
    From: Sohil Mehta <sohil.mehta@intel.com>

    For patching, the kernel initializes a temporary mm area in the lower
    half of the address range. See commit 4fc19708b165 ("x86/alternatives:
    Initialize temporary mm for patching").

    Disable LASS enforcement during patching using the stac()/clac()
    instructions to avoid triggering a #GP fault.

    The objtool warns due to a call to a non-allowed function that exists
    outside of the stac/clac guard, or references to any function with a
    dynamic function pointer inside the guard. See the Objtool warnings
    section #9 in the document tools/objtool/Documentation/objtool.txt.

    Considering that patching is usually small, replace the memcpy and
    memset functions in the text poking functions with their inline versions
    respectively.

    Signed-off-by: Sohil Mehta <sohil.mehta@intel.com>
    Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    ---
    arch/x86/kernel/alternative.c | 12 ++++++++++--
    1 file changed, 10 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
    index f615e0cb6d93..eac6a5406d39 100644
    --- a/arch/x86/kernel/alternative.c
    +++ b/arch/x86/kernel/alternative.c
    @@ -1526,16 +1526,24 @@ static inline void unuse_temporary_mm(temp_mm_state_t prev_state)
    __ro_after_init struct mm_struct *poking_mm;
    __ro_after_init unsigned long poking_addr;

    +/*
    + * poking_init() initializes the text poking address from the lower half of the
    + * address space. Relax LASS enforcement when accessing the poking address.
    + */
    static void text_poke_memcpy(void *dst, const void *src, size_t len)
    {
    - memcpy(dst, src, len);
    + stac();
    + __inline_memcpy(dst, src, len);
    + clac();
    }

    static void text_poke_memset(void *dst, const void *src, size_t len)
    {
    int c = *(const int *)src;

    - memset(dst, c, len);
    + stac();
    + __inline_memset(dst, c, len);
    + clac();
    }

    typedef void text_poke_f(void *dst, const void *src, size_t len);
    --
    2.39.2
    \
     
     \ /
      Last update: 2023-06-09 20:37    [W:2.498 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site