mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

This selects the THREAD_INFO_IN_TASK option for UM and changes the way that the current task is discovered. This is trivial though, as UML already tracks the current task in cpu_tasks[] and this can be used to retrieve it. Also remove the signal handler code that copies the thread information into the IRQ stack. It is obsolete now, which also means that the mentioned race condition cannot happen anymore. Signed-off-by: Benjamin Berg <benjamin.berg@intel.com> Reviewed-by: Hajime Tazaki <thehajime@gmail.com> Link: https://patch.msgid.link/20241111102910.46512-1-benjamin@sipsolutions.net Signed-off-by: Johannes Berg <johannes.berg@intel.com>
68 lines
1.3 KiB
C
68 lines
1.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/sched/mm.h>
|
|
#include <linux/sched/task_stack.h>
|
|
#include <linux/sched/task.h>
|
|
|
|
#include <asm/tlbflush.h>
|
|
|
|
#include <as-layout.h>
|
|
#include <kern.h>
|
|
#include <os.h>
|
|
#include <skas.h>
|
|
#include <kern_util.h>
|
|
|
|
extern void start_kernel(void);
|
|
|
|
static int __init start_kernel_proc(void *unused)
|
|
{
|
|
block_signals_trace();
|
|
|
|
start_kernel();
|
|
return 0;
|
|
}
|
|
|
|
extern int userspace_pid[];
|
|
|
|
static char cpu0_irqstack[THREAD_SIZE] __aligned(THREAD_SIZE);
|
|
|
|
int __init start_uml(void)
|
|
{
|
|
stack_protections((unsigned long) &cpu0_irqstack);
|
|
set_sigstack(cpu0_irqstack, THREAD_SIZE);
|
|
|
|
init_new_thread_signals();
|
|
|
|
init_task.thread.request.thread.proc = start_kernel_proc;
|
|
init_task.thread.request.thread.arg = NULL;
|
|
return start_idle_thread(task_stack_page(&init_task),
|
|
&init_task.thread.switch_buf);
|
|
}
|
|
|
|
unsigned long current_stub_stack(void)
|
|
{
|
|
if (current->mm == NULL)
|
|
return 0;
|
|
|
|
return current->mm->context.id.stack;
|
|
}
|
|
|
|
struct mm_id *current_mm_id(void)
|
|
{
|
|
if (current->mm == NULL)
|
|
return NULL;
|
|
|
|
return ¤t->mm->context.id;
|
|
}
|
|
|
|
void current_mm_sync(void)
|
|
{
|
|
if (current->mm == NULL)
|
|
return;
|
|
|
|
um_tlb_sync(current->mm);
|
|
}
|