lkml.org 
[lkml]   [2022]   [Aug]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v5 32/44] objtool: kmsan: list KMSAN API functions as uaccess-safe
    From
    KMSAN inserts API function calls in a lot of places (function entries
    and exits, local variables, memory accesses), so they may get called
    from the uaccess regions as well.

    KMSAN API functions are used to update the metadata (shadow/origin pages)
    for kernel memory accesses. The metadata pages for kernel pointers are
    also located in the kernel memory, so touching them is not a problem.
    For userspace pointers, no metadata is allocated.

    If an API function is supposed to read or modify the metadata, it does so
    for kernel pointers and ignores userspace pointers.
    If an API function is supposed to return a pair of metadata pointers for
    the instrumentation to use (like all __msan_metadata_ptr_for_TYPE_SIZE()
    functions do), it returns the allocated metadata for kernel pointers and
    special dummy buffers residing in the kernel memory for userspace
    pointers.

    As a result, none of KMSAN API functions perform userspace accesses, but
    since they might be called from UACCESS regions they use
    user_access_save/restore().

    Signed-off-by: Alexander Potapenko <glider@google.com>
    ---
    v3:
    -- updated the patch description

    v4:
    -- add kmsan_unpoison_entry_regs()

    Link: https://linux-review.googlesource.com/id/I242bc9816273fecad4ea3d977393784396bb3c35
    ---
    tools/objtool/check.c | 20 ++++++++++++++++++++
    1 file changed, 20 insertions(+)

    diff --git a/tools/objtool/check.c b/tools/objtool/check.c
    index 91678252a9b67..577dfdca635e8 100644
    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -1060,6 +1060,26 @@ static const char *uaccess_safe_builtin[] = {
    "__sanitizer_cov_trace_cmp4",
    "__sanitizer_cov_trace_cmp8",
    "__sanitizer_cov_trace_switch",
    + /* KMSAN */
    + "kmsan_copy_to_user",
    + "kmsan_report",
    + "kmsan_unpoison_entry_regs",
    + "kmsan_unpoison_memory",
    + "__msan_chain_origin",
    + "__msan_get_context_state",
    + "__msan_instrument_asm_store",
    + "__msan_metadata_ptr_for_load_1",
    + "__msan_metadata_ptr_for_load_2",
    + "__msan_metadata_ptr_for_load_4",
    + "__msan_metadata_ptr_for_load_8",
    + "__msan_metadata_ptr_for_load_n",
    + "__msan_metadata_ptr_for_store_1",
    + "__msan_metadata_ptr_for_store_2",
    + "__msan_metadata_ptr_for_store_4",
    + "__msan_metadata_ptr_for_store_8",
    + "__msan_metadata_ptr_for_store_n",
    + "__msan_poison_alloca",
    + "__msan_warning",
    /* UBSAN */
    "ubsan_type_mismatch_common",
    "__ubsan_handle_type_mismatch",
    --
    2.37.2.672.g94769d06f0-goog
    \
     
     \ /
      Last update: 2022-08-26 17:15    [W:4.231 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site