mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-12-16 15:49:12 +01:00
arch: copy_thread: pass clone_flags as u64
[ Upstream commitbbc46b23af] With the introduction of clone3 in commit7f192e3cd3("fork: add clone3") the effective bit width of clone_flags on all architectures was increased from 32-bit to 64-bit, with a new type of u64 for the flags. However, for most consumers of clone_flags the interface was not changed from the previous type of unsigned long. While this works fine as long as none of the new 64-bit flag bits (CLONE_CLEAR_SIGHAND and CLONE_INTO_CGROUP) are evaluated, this is still undesirable in terms of the principle of least surprise. Thus, this commit fixes all relevant interfaces of the copy_thread function that is called from copy_process to consistently pass clone_flags as u64, so that no truncation to 32-bit integers occurs on 32-bit architectures. Signed-off-by: Simon Schuster <schuster.simon@siemens-energy.com> Link: https://lore.kernel.org/20250901-nios2-implement-clone3-v2-3-53fcf5577d57@siemens-energy.com Fixes:c5febea095("fork: Pass struct kernel_clone_args into copy_thread") Acked-by: Guo Ren (Alibaba Damo Academy) <guoren@kernel.org> Acked-by: Andreas Larsson <andreas@gaisler.com> # sparc Acked-by: David Hildenbrand <david@redhat.com> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> # m68k Reviewed-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
449d48b1b9
commit
e0d6fb7923
|
|
@ -231,7 +231,7 @@ flush_thread(void)
|
|||
*/
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
extern void ret_from_fork(void);
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ asmlinkage void ret_from_fork(void);
|
|||
*/
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct pt_regs *c_regs; /* child's pt_regs */
|
||||
|
|
|
|||
|
|
@ -234,7 +234,7 @@ asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long stack_start = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct thread_info *thread = task_thread_info(p);
|
||||
|
|
|
|||
|
|
@ -409,7 +409,7 @@ asmlinkage void ret_from_fork(void) asm("ret_from_fork");
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long stack_start = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct pt_regs *childregs = task_pt_regs(p);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ void flush_thread(void){}
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct switch_stack *childstack;
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ void arch_cpu_idle(void)
|
|||
*/
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct thread_info *ti = task_thread_info(p);
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
|||
unsigned long childksp;
|
||||
unsigned long tls = args->tls;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
struct pt_regs *childregs, *regs = current_pt_regs();
|
||||
|
||||
childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE;
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ asmlinkage int m68k_clone3(struct pt_regs *regs)
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct fork_frame {
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ void flush_thread(void)
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct pt_regs *childregs = task_pt_regs(p);
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
|
|||
*/
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct thread_info *ti = task_thread_info(p);
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ void flush_thread(void)
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct pt_regs *childregs = task_pt_regs(p);
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ extern asmlinkage void ret_from_fork(void);
|
|||
int
|
||||
copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct pt_regs *userregs;
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ arch_initcall(parisc_idle_init);
|
|||
int
|
||||
copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct pt_regs *cregs = &(p->thread.regs);
|
||||
|
|
|
|||
|
|
@ -1805,7 +1805,7 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
|||
f = ret_from_kernel_user_thread;
|
||||
} else {
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
|
||||
/* Copy registers */
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@ asmlinkage void ret_from_fork_user(struct pt_regs *regs)
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct pt_regs *childregs = task_pt_regs(p);
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long new_stackp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct fake_frame
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ asmlinkage void ret_from_kernel_thread(void);
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct thread_info *ti = task_thread_info(p);
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ extern void ret_from_kernel_thread(void);
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long sp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct thread_info *ti = task_thread_info(p);
|
||||
|
|
|
|||
|
|
@ -567,7 +567,7 @@ barf:
|
|||
*/
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long sp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct thread_info *t = task_thread_info(p);
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ static void fork_handler(void)
|
|||
|
||||
int copy_thread(struct task_struct * p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long sp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
void (*handler)(void);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
extern void save_fpregs_to_fpstate(struct fpu *fpu);
|
||||
extern void fpu__drop(struct task_struct *tsk);
|
||||
extern int fpu_clone(struct task_struct *dst, unsigned long clone_flags, bool minimal,
|
||||
extern int fpu_clone(struct task_struct *dst, u64 clone_flags, bool minimal,
|
||||
unsigned long shstk_addr);
|
||||
extern void fpu_flush_thread(void);
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ struct thread_shstk {
|
|||
|
||||
long shstk_prctl(struct task_struct *task, int option, unsigned long arg2);
|
||||
void reset_thread_features(void);
|
||||
unsigned long shstk_alloc_thread_stack(struct task_struct *p, unsigned long clone_flags,
|
||||
unsigned long shstk_alloc_thread_stack(struct task_struct *p, u64 clone_flags,
|
||||
unsigned long stack_size);
|
||||
void shstk_free(struct task_struct *p);
|
||||
int setup_signal_shadow_stack(struct ksignal *ksig);
|
||||
|
|
@ -28,7 +28,7 @@ static inline long shstk_prctl(struct task_struct *task, int option,
|
|||
unsigned long arg2) { return -EINVAL; }
|
||||
static inline void reset_thread_features(void) {}
|
||||
static inline unsigned long shstk_alloc_thread_stack(struct task_struct *p,
|
||||
unsigned long clone_flags,
|
||||
u64 clone_flags,
|
||||
unsigned long stack_size) { return 0; }
|
||||
static inline void shstk_free(struct task_struct *p) {}
|
||||
static inline int setup_signal_shadow_stack(struct ksignal *ksig) { return 0; }
|
||||
|
|
|
|||
|
|
@ -631,7 +631,7 @@ static int update_fpu_shstk(struct task_struct *dst, unsigned long ssp)
|
|||
}
|
||||
|
||||
/* Clone current's FPU state on fork */
|
||||
int fpu_clone(struct task_struct *dst, unsigned long clone_flags, bool minimal,
|
||||
int fpu_clone(struct task_struct *dst, u64 clone_flags, bool minimal,
|
||||
unsigned long ssp)
|
||||
{
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ __visible void ret_from_fork(struct task_struct *prev, struct pt_regs *regs,
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long sp = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct inactive_task_frame *frame;
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ void reset_thread_features(void)
|
|||
current->thread.features_locked = 0;
|
||||
}
|
||||
|
||||
unsigned long shstk_alloc_thread_stack(struct task_struct *tsk, unsigned long clone_flags,
|
||||
unsigned long shstk_alloc_thread_stack(struct task_struct *tsk, u64 clone_flags,
|
||||
unsigned long stack_size)
|
||||
{
|
||||
struct thread_shstk *shstk = &tsk->thread.shstk;
|
||||
|
|
|
|||
|
|
@ -267,7 +267,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
|
|||
|
||||
int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
{
|
||||
unsigned long clone_flags = args->flags;
|
||||
u64 clone_flags = args->flags;
|
||||
unsigned long usp_thread_fn = args->stack;
|
||||
unsigned long tls = args->tls;
|
||||
struct pt_regs *childregs = task_pt_regs(p);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user