Construct init thread stack in the linker script rather than by union
Construct the init thread stack in the linker script rather than doing it by means of a union so that ia64's init_task.c can be got rid of. The following symbols are then made available from INIT_TASK_DATA() linker script macro: init_thread_union init_stack INIT_TASK_DATA() also expands the region to THREAD_SIZE to accommodate the size of the init stack. init_thread_union is given its own section so that it can be placed into the stack space in the right order. I'm assuming that the ia64 ordering is correct and that the task_struct is first and the thread_info second. Signed-off-by: David Howells <dhowells@redhat.com> Tested-by: Tony Luck <tony.luck@intel.com> Tested-by: Will Deacon <will.deacon@arm.com> (arm64) Tested-by: Palmer Dabbelt <palmer@sifive.com> Acked-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
1381019320
commit
0500871f21
|
@ -234,8 +234,8 @@ config ARCH_HAS_FORTIFY_SOURCE
|
||||||
config ARCH_HAS_SET_MEMORY
|
config ARCH_HAS_SET_MEMORY
|
||||||
bool
|
bool
|
||||||
|
|
||||||
# Select if arch init_task initializer is different to init/init_task.c
|
# Select if arch init_task must go in the __init_task_data section
|
||||||
config ARCH_INIT_TASK
|
config ARCH_TASK_STRUCT_ON_STACK
|
||||||
bool
|
bool
|
||||||
|
|
||||||
# Select if arch has its private alloc_task_struct() function
|
# Select if arch has its private alloc_task_struct() function
|
||||||
|
|
|
@ -39,9 +39,6 @@ struct thread_info {
|
||||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* How to get the thread information struct from C. */
|
/* How to get the thread information struct from C. */
|
||||||
register struct thread_info *__current_thread_info __asm__("$8");
|
register struct thread_info *__current_thread_info __asm__("$8");
|
||||||
#define current_thread_info() __current_thread_info
|
#define current_thread_info() __current_thread_info
|
||||||
|
|
|
@ -62,9 +62,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
static inline __attribute_const__ struct thread_info *current_thread_info(void)
|
static inline __attribute_const__ struct thread_info *current_thread_info(void)
|
||||||
{
|
{
|
||||||
register unsigned long sp asm("sp");
|
register unsigned long sp asm("sp");
|
||||||
|
|
|
@ -75,9 +75,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* how to get the current stack pointer in C
|
* how to get the current stack pointer in C
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -51,8 +51,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
#define thread_saved_pc(tsk) \
|
#define thread_saved_pc(tsk) \
|
||||||
((unsigned long)(tsk->thread.cpu_context.pc))
|
((unsigned long)(tsk->thread.cpu_context.pc))
|
||||||
#define thread_saved_sp(tsk) \
|
#define thread_saved_sp(tsk) \
|
||||||
|
|
|
@ -56,8 +56,6 @@ struct thread_info {
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
}
|
}
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* Given a task stack pointer, you can find its corresponding
|
/* Given a task stack pointer, you can find its corresponding
|
||||||
* thread_info structure just by masking it to the THREAD_SIZE
|
* thread_info structure just by masking it to the THREAD_SIZE
|
||||||
|
|
|
@ -60,9 +60,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* get the thread information struct of current task */
|
/* get the thread information struct of current task */
|
||||||
static inline __attribute__((const))
|
static inline __attribute__((const))
|
||||||
struct thread_info *current_thread_info(void)
|
struct thread_info *current_thread_info(void)
|
||||||
|
|
|
@ -52,8 +52,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
||||||
/* Nothing needs to be done. */
|
/* Nothing needs to be done. */
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
#define cpu_relax() barrier()
|
#define cpu_relax() barrier()
|
||||||
|
|
||||||
void default_idle(void);
|
void default_idle(void);
|
||||||
|
|
|
@ -63,8 +63,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -64,9 +64,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
register struct thread_info *__current_thread_info asm("gr15");
|
register struct thread_info *__current_thread_info asm("gr15");
|
||||||
|
|
||||||
|
|
|
@ -46,9 +46,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
static inline struct thread_info *current_thread_info(void)
|
static inline struct thread_info *current_thread_info(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -84,9 +84,6 @@ struct thread_info {
|
||||||
.regs = NULL, \
|
.regs = NULL, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* Tacky preprocessor trickery */
|
/* Tacky preprocessor trickery */
|
||||||
#define qqstr(s) qstr(s)
|
#define qqstr(s) qstr(s)
|
||||||
#define qstr(s) #s
|
#define qstr(s) #s
|
||||||
|
|
|
@ -43,7 +43,7 @@ config IA64
|
||||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||||
select GENERIC_IOMAP
|
select GENERIC_IOMAP
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select ARCH_INIT_TASK
|
select ARCH_TASK_STRUCT_ON_STACK
|
||||||
select ARCH_TASK_STRUCT_ALLOCATOR
|
select ARCH_TASK_STRUCT_ALLOCATOR
|
||||||
select ARCH_THREAD_STACK_ALLOCATOR
|
select ARCH_THREAD_STACK_ALLOCATOR
|
||||||
select ARCH_CLOCKSOURCE_DATA
|
select ARCH_CLOCKSOURCE_DATA
|
||||||
|
|
|
@ -42,7 +42,7 @@ $(error Sorry, you need a newer version of the assember, one that is built from
|
||||||
endif
|
endif
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(cflags-y)
|
KBUILD_CFLAGS += $(cflags-y)
|
||||||
head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o
|
head-y := arch/ia64/kernel/head.o
|
||||||
|
|
||||||
libs-y += arch/ia64/lib/
|
libs-y += arch/ia64/lib/
|
||||||
core-y += arch/ia64/kernel/ arch/ia64/mm/
|
core-y += arch/ia64/kernel/ arch/ia64/mm/
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
|
#define THREAD_SIZE KERNEL_STACK_SIZE
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -41,8 +43,6 @@ struct thread_info {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define THREAD_SIZE KERNEL_STACK_SIZE
|
|
||||||
|
|
||||||
#define INIT_THREAD_INFO(tsk) \
|
#define INIT_THREAD_INFO(tsk) \
|
||||||
{ \
|
{ \
|
||||||
.task = &tsk, \
|
.task = &tsk, \
|
||||||
|
|
|
@ -7,7 +7,7 @@ ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
CFLAGS_REMOVE_ftrace.o = -pg
|
CFLAGS_REMOVE_ftrace.o = -pg
|
||||||
endif
|
endif
|
||||||
|
|
||||||
extra-y := head.o init_task.o vmlinux.lds
|
extra-y := head.o vmlinux.lds
|
||||||
|
|
||||||
obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \
|
obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \
|
||||||
irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \
|
irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0
|
|
||||||
/*
|
|
||||||
* This is where we statically allocate and initialize the initial
|
|
||||||
* task.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1999, 2002-2003 Hewlett-Packard Co
|
|
||||||
* David Mosberger-Tang <davidm@hpl.hp.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/fs.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/init_task.h>
|
|
||||||
#include <linux/mqueue.h>
|
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
|
||||||
#include <asm/pgtable.h>
|
|
||||||
|
|
||||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
|
||||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
|
||||||
/*
|
|
||||||
* Initial task structure.
|
|
||||||
*
|
|
||||||
* We need to make sure that this is properly aligned due to the way process stacks are
|
|
||||||
* handled. This is done by having a special ".data..init_task" section...
|
|
||||||
*/
|
|
||||||
#define init_thread_info init_task_mem.s.thread_info
|
|
||||||
#define init_stack init_task_mem.stack
|
|
||||||
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
struct task_struct task;
|
|
||||||
struct thread_info thread_info;
|
|
||||||
} s;
|
|
||||||
unsigned long stack[KERNEL_STACK_SIZE/sizeof (unsigned long)];
|
|
||||||
} init_task_mem asm ("init_task") __init_task_data =
|
|
||||||
{{
|
|
||||||
.task = INIT_TASK(init_task_mem.s.task),
|
|
||||||
.thread_info = INIT_THREAD_INFO(init_task_mem.s.task)
|
|
||||||
}};
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(init_task);
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
|
|
||||||
|
|
|
@ -56,9 +56,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
static inline struct thread_info *current_thread_info(void)
|
static inline struct thread_info *current_thread_info(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -41,8 +41,6 @@ struct thread_info {
|
||||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
static inline struct thread_info *current_thread_info(void)
|
static inline struct thread_info *current_thread_info(void)
|
||||||
|
@ -58,8 +56,6 @@ static inline struct thread_info *current_thread_info(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
|
|
||||||
/* entry.S relies on these definitions!
|
/* entry.S relies on these definitions!
|
||||||
* bits 0-7 are tested at every exception exit
|
* bits 0-7 are tested at every exception exit
|
||||||
* bits 8-15 are also tested at syscall exit
|
* bits 8-15 are also tested at syscall exit
|
||||||
|
|
|
@ -74,9 +74,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the current stack pointer from C */
|
/* how to get the current stack pointer from C */
|
||||||
register unsigned long current_stack_pointer asm("A0StP") __used;
|
register unsigned long current_stack_pointer asm("A0StP") __used;
|
||||||
|
|
||||||
|
|
|
@ -86,9 +86,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
static inline struct thread_info *current_thread_info(void)
|
static inline struct thread_info *current_thread_info(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -49,9 +49,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* How to get the thread information struct from C. */
|
/* How to get the thread information struct from C. */
|
||||||
register struct thread_info *__current_thread_info __asm__("$28");
|
register struct thread_info *__current_thread_info __asm__("$28");
|
||||||
|
|
||||||
|
|
|
@ -79,8 +79,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
#define init_uregs \
|
#define init_uregs \
|
||||||
((struct pt_regs *) \
|
((struct pt_regs *) \
|
||||||
((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs)))
|
((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs)))
|
||||||
|
|
|
@ -63,9 +63,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
static inline struct thread_info *current_thread_info(void)
|
static inline struct thread_info *current_thread_info(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -84,8 +84,6 @@ void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp);
|
||||||
void release_thread(struct task_struct *);
|
void release_thread(struct task_struct *);
|
||||||
unsigned long get_wchan(struct task_struct *p);
|
unsigned long get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
#define cpu_relax() barrier()
|
#define cpu_relax() barrier()
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
|
@ -79,8 +79,6 @@ struct thread_info {
|
||||||
.ksp = 0, \
|
.ksp = 0, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
register struct thread_info *current_thread_info_reg asm("r10");
|
register struct thread_info *current_thread_info_reg asm("r10");
|
||||||
#define current_thread_info() (current_thread_info_reg)
|
#define current_thread_info() (current_thread_info_reg)
|
||||||
|
|
|
@ -25,9 +25,6 @@ struct thread_info {
|
||||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
#define current_thread_info() ((struct thread_info *)mfctl(30))
|
#define current_thread_info() ((struct thread_info *)mfctl(30))
|
||||||
|
|
||||||
|
|
|
@ -58,9 +58,6 @@ struct thread_info {
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
#define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT)
|
#define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT)
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
|
|
|
@ -64,8 +64,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -42,8 +42,6 @@ struct thread_info {
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
void arch_release_task_struct(struct task_struct *tsk);
|
void arch_release_task_struct(struct task_struct *tsk);
|
||||||
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
|
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
|
||||||
|
|
||||||
|
|
|
@ -58,9 +58,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* How to get the thread information struct from C. */
|
/* How to get the thread information struct from C. */
|
||||||
register struct thread_info *__current_thread_info __asm__("r28");
|
register struct thread_info *__current_thread_info __asm__("r28");
|
||||||
#define current_thread_info() __current_thread_info
|
#define current_thread_info() __current_thread_info
|
||||||
|
|
|
@ -63,9 +63,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the current stack pointer from C */
|
/* how to get the current stack pointer from C */
|
||||||
register unsigned long current_stack_pointer asm("r15") __used;
|
register unsigned long current_stack_pointer asm("r15") __used;
|
||||||
|
|
||||||
|
|
|
@ -63,9 +63,6 @@ struct thread_info {
|
||||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
register struct thread_info *current_thread_info_reg asm("g6");
|
register struct thread_info *current_thread_info_reg asm("g6");
|
||||||
#define current_thread_info() (current_thread_info_reg)
|
#define current_thread_info() (current_thread_info_reg)
|
||||||
|
|
|
@ -120,9 +120,6 @@ struct thread_info {
|
||||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
register struct thread_info *current_thread_info_reg asm("g6");
|
register struct thread_info *current_thread_info_reg asm("g6");
|
||||||
#define current_thread_info() (current_thread_info_reg)
|
#define current_thread_info() (current_thread_info_reg)
|
||||||
|
|
|
@ -59,9 +59,6 @@ struct thread_info {
|
||||||
.align_ctl = 0, \
|
.align_ctl = 0, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
#if PAGE_SIZE < 8192
|
#if PAGE_SIZE < 8192
|
||||||
|
|
|
@ -58,7 +58,10 @@ static inline void release_thread(struct task_struct *task)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_stack (init_thread_union.stack)
|
static inline void mm_copy_segments(struct mm_struct *from_mm,
|
||||||
|
struct mm_struct *new_mm)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* User space process size: 3GB (default).
|
* User space process size: 3GB (default).
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
#ifndef __UM_THREAD_INFO_H
|
#ifndef __UM_THREAD_INFO_H
|
||||||
#define __UM_THREAD_INFO_H
|
#define __UM_THREAD_INFO_H
|
||||||
|
|
||||||
|
#define THREAD_SIZE_ORDER CONFIG_KERNEL_STACK_ORDER
|
||||||
|
#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
|
@ -37,10 +40,6 @@ struct thread_info {
|
||||||
.real_thread = NULL, \
|
.real_thread = NULL, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
static inline struct thread_info *current_thread_info(void)
|
static inline struct thread_info *current_thread_info(void)
|
||||||
{
|
{
|
||||||
|
@ -53,8 +52,6 @@ static inline struct thread_info *current_thread_info(void)
|
||||||
return ti;
|
return ti;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define THREAD_SIZE_ORDER CONFIG_KERNEL_STACK_ORDER
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
|
#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
|
||||||
|
|
2
arch/um/include/asm/vmlinux.lds.h
Normal file
2
arch/um/include/asm/vmlinux.lds.h
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
#include <asm-generic/vmlinux.lds.h>
|
|
@ -1,5 +1,4 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
#include <asm/vmlinux.lds.h>
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
|
||||||
OUTPUT_FORMAT(ELF_FORMAT)
|
OUTPUT_FORMAT(ELF_FORMAT)
|
||||||
|
|
|
@ -54,7 +54,7 @@ struct cpuinfo_um boot_cpu_data = {
|
||||||
|
|
||||||
union thread_union cpu0_irqstack
|
union thread_union cpu0_irqstack
|
||||||
__attribute__((__section__(".data..init_irqstack"))) =
|
__attribute__((__section__(".data..init_irqstack"))) =
|
||||||
{ INIT_THREAD_INFO(init_task) };
|
{ .thread_info = INIT_THREAD_INFO(init_task) };
|
||||||
|
|
||||||
/* Changed in setup_arch, which is called in early boot */
|
/* Changed in setup_arch, which is called in early boot */
|
||||||
static char host_info[(__NEW_UTS_LEN + 1) * 5];
|
static char host_info[(__NEW_UTS_LEN + 1) * 5];
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm/vmlinux.lds.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
|
||||||
OUTPUT_FORMAT(ELF_FORMAT)
|
OUTPUT_FORMAT(ELF_FORMAT)
|
||||||
|
|
|
@ -87,9 +87,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* how to get the thread information struct from C
|
* how to get the thread information struct from C
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -62,8 +62,6 @@ struct thread_info {
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
#else /* !__ASSEMBLY__ */
|
#else /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
|
|
|
@ -77,9 +77,6 @@ struct thread_info {
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
|
||||||
#define init_stack (init_thread_union.stack)
|
|
||||||
|
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
static inline struct thread_info *current_thread_info(void)
|
static inline struct thread_info *current_thread_info(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -268,7 +268,11 @@
|
||||||
#define INIT_TASK_DATA(align) \
|
#define INIT_TASK_DATA(align) \
|
||||||
. = ALIGN(align); \
|
. = ALIGN(align); \
|
||||||
VMLINUX_SYMBOL(__start_init_task) = .; \
|
VMLINUX_SYMBOL(__start_init_task) = .; \
|
||||||
|
VMLINUX_SYMBOL(init_thread_union) = .; \
|
||||||
|
VMLINUX_SYMBOL(init_stack) = .; \
|
||||||
*(.data..init_task) \
|
*(.data..init_task) \
|
||||||
|
*(.data..init_thread_info) \
|
||||||
|
. = VMLINUX_SYMBOL(__start_init_task) + THREAD_SIZE; \
|
||||||
VMLINUX_SYMBOL(__end_init_task) = .;
|
VMLINUX_SYMBOL(__end_init_task) = .;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -304,5 +304,8 @@ extern struct cred init_cred;
|
||||||
/* Attach to the init_task data structure for proper alignment */
|
/* Attach to the init_task data structure for proper alignment */
|
||||||
#define __init_task_data __attribute__((__section__(".data..init_task")))
|
#define __init_task_data __attribute__((__section__(".data..init_task")))
|
||||||
|
|
||||||
|
/* Attach to the thread_info data structure for proper alignment */
|
||||||
|
#define __init_thread_info __attribute__((__section__(".data..init_thread_info")))
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1446,12 +1446,21 @@ extern void ia64_set_curr_task(int cpu, struct task_struct *p);
|
||||||
void yield(void);
|
void yield(void);
|
||||||
|
|
||||||
union thread_union {
|
union thread_union {
|
||||||
|
#ifndef CONFIG_ARCH_TASK_STRUCT_ON_STACK
|
||||||
|
struct task_struct task;
|
||||||
|
#endif
|
||||||
#ifndef CONFIG_THREAD_INFO_IN_TASK
|
#ifndef CONFIG_THREAD_INFO_IN_TASK
|
||||||
struct thread_info thread_info;
|
struct thread_info thread_info;
|
||||||
#endif
|
#endif
|
||||||
unsigned long stack[THREAD_SIZE/sizeof(long)];
|
unsigned long stack[THREAD_SIZE/sizeof(long)];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef CONFIG_THREAD_INFO_IN_TASK
|
||||||
|
extern struct thread_info init_thread_info;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)];
|
||||||
|
|
||||||
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
||||||
static inline struct thread_info *task_thread_info(struct task_struct *task)
|
static inline struct thread_info *task_thread_info(struct task_struct *task)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,9 +13,7 @@ obj-$(CONFIG_BLK_DEV_INITRD) += initramfs.o
|
||||||
endif
|
endif
|
||||||
obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o
|
obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o
|
||||||
|
|
||||||
ifneq ($(CONFIG_ARCH_INIT_TASK),y)
|
|
||||||
obj-y += init_task.o
|
obj-y += init_task.o
|
||||||
endif
|
|
||||||
|
|
||||||
mounts-y := do_mounts.o
|
mounts-y := do_mounts.o
|
||||||
mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o
|
mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o
|
||||||
|
|
|
@ -17,15 +17,17 @@ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||||
|
|
||||||
/* Initial task structure */
|
/* Initial task structure */
|
||||||
struct task_struct init_task = INIT_TASK(init_task);
|
struct task_struct init_task
|
||||||
|
#ifdef CONFIG_ARCH_TASK_STRUCT_ON_STACK
|
||||||
|
__init_task_data
|
||||||
|
#endif
|
||||||
|
= INIT_TASK(init_task);
|
||||||
EXPORT_SYMBOL(init_task);
|
EXPORT_SYMBOL(init_task);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initial thread structure. Alignment of this is handled by a special
|
* Initial thread structure. Alignment of this is handled by a special
|
||||||
* linker map entry.
|
* linker map entry.
|
||||||
*/
|
*/
|
||||||
union thread_union init_thread_union __init_task_data = {
|
|
||||||
#ifndef CONFIG_THREAD_INFO_IN_TASK
|
#ifndef CONFIG_THREAD_INFO_IN_TASK
|
||||||
INIT_THREAD_INFO(init_task)
|
struct thread_info init_thread_info __init_thread_info = INIT_THREAD_INFO(init_task);
|
||||||
#endif
|
#endif
|
||||||
};
|
|
||||||
|
|
Loading…
Reference in a new issue