lkml.org 
[lkml]   [2022]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v3 28/46] kmsan: entry: handle register passing from uninstrumented code
    From
    Replace instrumentation_begin()	with instrumentation_begin_with_regs()
    to let KMSAN handle the non-instrumented code and unpoison pt_regs
    passed from the instrumented part.

    Signed-off-by: Alexander Potapenko <glider@google.com>
    ---
    Link: https://linux-review.googlesource.com/id/I7f0a9809b66bd85faae43142971d0095771b7a42
    ---
    kernel/entry/common.c | 22 +++++++++++-----------
    1 file changed, 11 insertions(+), 11 deletions(-)

    diff --git a/kernel/entry/common.c b/kernel/entry/common.c
    index 93c3b86e781c1..ce2324374882c 100644
    --- a/kernel/entry/common.c
    +++ b/kernel/entry/common.c
    @@ -23,7 +23,7 @@ static __always_inline void __enter_from_user_mode(struct pt_regs *regs)
    CT_WARN_ON(ct_state() != CONTEXT_USER);
    user_exit_irqoff();

    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    trace_hardirqs_off_finish();
    instrumentation_end();
    }
    @@ -105,7 +105,7 @@ noinstr long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall)

    __enter_from_user_mode(regs);

    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    local_irq_enable();
    ret = __syscall_enter_from_user_work(regs, syscall);
    instrumentation_end();
    @@ -116,7 +116,7 @@ noinstr long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall)
    noinstr void syscall_enter_from_user_mode_prepare(struct pt_regs *regs)
    {
    __enter_from_user_mode(regs);
    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    local_irq_enable();
    instrumentation_end();
    }
    @@ -290,7 +290,7 @@ void syscall_exit_to_user_mode_work(struct pt_regs *regs)

    __visible noinstr void syscall_exit_to_user_mode(struct pt_regs *regs)
    {
    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    __syscall_exit_to_user_mode_work(regs);
    instrumentation_end();
    __exit_to_user_mode();
    @@ -303,7 +303,7 @@ noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs)

    noinstr void irqentry_exit_to_user_mode(struct pt_regs *regs)
    {
    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    exit_to_user_mode_prepare(regs);
    instrumentation_end();
    __exit_to_user_mode();
    @@ -351,7 +351,7 @@ noinstr irqentry_state_t irqentry_enter(struct pt_regs *regs)
    */
    lockdep_hardirqs_off(CALLER_ADDR0);
    rcu_irq_enter();
    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    trace_hardirqs_off_finish();
    instrumentation_end();

    @@ -366,7 +366,7 @@ noinstr irqentry_state_t irqentry_enter(struct pt_regs *regs)
    * in having another one here.
    */
    lockdep_hardirqs_off(CALLER_ADDR0);
    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    rcu_irq_enter_check_tick();
    trace_hardirqs_off_finish();
    instrumentation_end();
    @@ -413,7 +413,7 @@ noinstr void irqentry_exit(struct pt_regs *regs, irqentry_state_t state)
    * and RCU as the return to user mode path.
    */
    if (state.exit_rcu) {
    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    /* Tell the tracer that IRET will enable interrupts */
    trace_hardirqs_on_prepare();
    lockdep_hardirqs_on_prepare(CALLER_ADDR0);
    @@ -423,7 +423,7 @@ noinstr void irqentry_exit(struct pt_regs *regs, irqentry_state_t state)
    return;
    }

    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    if (IS_ENABLED(CONFIG_PREEMPTION))
    irqentry_exit_cond_resched();

    @@ -451,7 +451,7 @@ irqentry_state_t noinstr irqentry_nmi_enter(struct pt_regs *regs)
    lockdep_hardirq_enter();
    rcu_nmi_enter();

    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    trace_hardirqs_off_finish();
    ftrace_nmi_enter();
    instrumentation_end();
    @@ -461,7 +461,7 @@ irqentry_state_t noinstr irqentry_nmi_enter(struct pt_regs *regs)

    void noinstr irqentry_nmi_exit(struct pt_regs *regs, irqentry_state_t irq_state)
    {
    - instrumentation_begin();
    + instrumentation_begin_with_regs(regs);
    ftrace_nmi_exit();
    if (irq_state.lockdep) {
    trace_hardirqs_on_prepare();
    --
    2.36.0.rc2.479.g8af0fa9b8e-goog
    \
     
     \ /
      Last update: 2022-04-26 18:49    [W:2.477 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site