entry: Provide [syscall_]enter_from_user_mode_randomize_stack()

Randomizing the syscall stack can only happen after state is established
via enter_from_user_mode() or syscall_enter_from_user_mode(). The earlier
it happens the better.

Provide two new macros to consolidate that:

  - enter_from_user_mode_randomize_stack()
	enter_from_user_mode();
	add_random_kstack_offset_irqsoff();

  - syscall_enter_from_user_mode_randomize_stack()
	enter_from_user_mode_randomize_stack();
	syscall_enter_from_user_mode_work();

to reduce boiler plate code.

Those are macros and not inline functions as the latter would limit the
stack randomization scope to the inline function itself.

Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Tested-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
Reviewed-by: Radu Rendec <radu@rendec.net>
Reviewed-by: Jinjie Ruan <ruanjinjie@huawei.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Reviewed-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
Link: https://patch.msgid.link/20260707190253.816918647@kernel.org
This commit is contained in:
Thomas Gleixner
2026-07-12 12:38:01 +02:00
parent 0b9a305753
commit 855c103f86
+56
View File
@@ -6,6 +6,7 @@
#include <linux/irq-entry-common.h>
#include <linux/livepatch.h>
#include <linux/ptrace.h>
#include <linux/randomize_kstack.h>
#include <linux/resume_user_mode.h>
#include <linux/seccomp.h>
#include <linux/sched.h>
@@ -149,6 +150,61 @@ static __always_inline long syscall_enter_from_user_mode_work(struct pt_regs *re
return syscall;
}
/**
* enter_from_user_mode_randomize_stack - Establish state and add stack randomization
* before invoking syscall_enter_from_user_mode_work()
* @regs: Pointer to currents pt_regs
*
* Invoked from architecture specific syscall entry code with interrupts
* disabled. The calling code has to be non-instrumentable. When the function
* returns all state is correct, interrupts are still disabled and the
* subsequent functions can be instrumented.
*
* Implemented as a macro so that the stack randomization is effective
* throughout the function in which it is invoked. An inline would only make it
* effective in the scope of the inline function.
*/
#define enter_from_user_mode_randomize_stack(regs) \
do { \
enter_from_user_mode(regs); \
instrumentation_begin(); \
add_random_kstack_offset_irqsoff(); \
instrumentation_end(); \
} while (0)
/**
* syscall_enter_from_user_mode_randomize_stack - Establish state and check and handle work
* before invoking a syscall
* @regs: Pointer to currents pt_regs
* @syscall: The syscall number
*
* Invoked from architecture specific syscall entry code with interrupts
* disabled. The calling code has to be non-instrumentable. When the
* function returns all state is correct, interrupts are enabled and the
* subsequent functions can be instrumented.
*
* This is the combination of enter_from_user_mode_randomize_stack() and
* syscall_enter_from_user_mode_work() to be used when there is no
* architecture specific work to be done between the two.
*
* Returns: The original or a modified syscall number. See
* syscall_enter_from_user_mode_work() for further explanation.
*
* Implemented as a macro to make stack randomization effective in the calling
* scope.
*/
#define syscall_enter_from_user_mode_randomize_stack(regs, syscall) \
({ \
enter_from_user_mode_randomize_stack(regs); \
\
instrumentation_begin(); \
local_irq_enable(); \
long _ret = syscall_enter_from_user_mode_work(regs, syscall); \
instrumentation_end(); \
\
_ret; \
})
/**
* syscall_enter_from_user_mode - Establish state and check and handle work
* before invoking a syscall