Construct init thread stack in the linker script rather than by union
authorDavid Howells <dhowells@redhat.com>
Tue, 2 Jan 2018 15:12:01 +0000 (15:12 +0000)
committerDavid Howells <dhowells@redhat.com>
Tue, 9 Jan 2018 23:21:02 +0000 (23:21 +0000)
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>
50 files changed:
arch/Kconfig
arch/alpha/include/asm/thread_info.h
arch/arc/include/asm/thread_info.h
arch/arm/include/asm/thread_info.h
arch/arm64/include/asm/thread_info.h
arch/blackfin/include/asm/thread_info.h
arch/c6x/include/asm/thread_info.h
arch/cris/include/asm/processor.h
arch/cris/include/asm/thread_info.h
arch/frv/include/asm/thread_info.h
arch/h8300/include/asm/thread_info.h
arch/hexagon/include/asm/thread_info.h
arch/ia64/Kconfig
arch/ia64/Makefile
arch/ia64/include/asm/thread_info.h
arch/ia64/kernel/Makefile
arch/ia64/kernel/init_task.c [deleted file]
arch/ia64/kernel/vmlinux.lds.S
arch/m32r/include/asm/thread_info.h
arch/m68k/include/asm/thread_info.h
arch/metag/include/asm/thread_info.h
arch/microblaze/include/asm/thread_info.h
arch/mips/include/asm/thread_info.h
arch/mn10300/include/asm/thread_info.h
arch/nios2/include/asm/thread_info.h
arch/openrisc/include/asm/processor.h
arch/openrisc/include/asm/thread_info.h
arch/parisc/include/asm/thread_info.h
arch/powerpc/include/asm/thread_info.h
arch/riscv/include/asm/thread_info.h
arch/s390/include/asm/thread_info.h
arch/score/include/asm/thread_info.h
arch/sh/include/asm/thread_info.h
arch/sparc/include/asm/thread_info_32.h
arch/sparc/include/asm/thread_info_64.h
arch/tile/include/asm/thread_info.h
arch/um/include/asm/processor-generic.h
arch/um/include/asm/thread_info.h
arch/um/include/asm/vmlinux.lds.h [new file with mode: 0644]
arch/um/kernel/dyn.lds.S
arch/um/kernel/um_arch.c
arch/um/kernel/uml.lds.S
arch/unicore32/include/asm/thread_info.h
arch/x86/include/asm/thread_info.h
arch/xtensa/include/asm/thread_info.h
include/asm-generic/vmlinux.lds.h
include/linux/init_task.h
include/linux/sched.h
init/Makefile
init/init_task.c

index 400b9e1b2f275d2f253a54087c137bedf0a491ea..a26d6f8ab9678d625b77e28516a0f6d96d1f2e34 100644 (file)
@@ -234,8 +234,8 @@ config ARCH_HAS_FORTIFY_SOURCE
 config ARCH_HAS_SET_MEMORY
        bool
 
-# Select if arch init_task initializer is different to init/init_task.c
-config ARCH_INIT_TASK
+# Select if arch init_task must go in the __init_task_data section
+config ARCH_TASK_STRUCT_ON_STACK
        bool
 
 # Select if arch has its private alloc_task_struct() function
index 8c20c5e35432b3ba3b8f07fd24cda9fa1b2e48da..807d7b9a18604d24ccf66784aee6164ce44f625e 100644 (file)
@@ -39,9 +39,6 @@ struct thread_info {
        .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.  */
 register struct thread_info *__current_thread_info __asm__("$8");
 #define current_thread_info()  __current_thread_info
index 2d79e527fa50a305e932259d336423d9d89c3fae..c85947bac5e51365a1e5949b9f86dc0af8e4bcf0 100644 (file)
@@ -62,9 +62,6 @@ struct thread_info {
        .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)
 {
        register unsigned long sp asm("sp");
index 776757d1604ab3901996bb24bb02748e54c2aee7..e71cc35de16335af87a878abaf5530166111a8fd 100644 (file)
@@ -75,9 +75,6 @@ struct thread_info {
        .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
  */
index eb431286bacd057b8766ebe2af1b021bd29f2949..740aa03c5f0dc8bd6ead32b57453e4537895f56e 100644 (file)
@@ -51,8 +51,6 @@ struct thread_info {
        .addr_limit     = KERNEL_DS,                                    \
 }
 
-#define init_stack             (init_thread_union.stack)
-
 #define thread_saved_pc(tsk)   \
        ((unsigned long)(tsk->thread.cpu_context.pc))
 #define thread_saved_sp(tsk)   \
index 2966b93850a1d1f85e736ad2806787db8124afa0..a5aeab4e5f2de4d032c7130e6f20c9c153167cdd 100644 (file)
@@ -56,8 +56,6 @@ struct thread_info {
        .cpu            = 0,                    \
        .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
  * thread_info structure just by masking it to the THREAD_SIZE
index acc70c135ab850d60d212699e0d42a18cb09ff43..59a5697fe0f38b854cc5254d855af8e1138d48a9 100644 (file)
@@ -60,9 +60,6 @@ struct thread_info {
        .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 */
 static inline __attribute__((const))
 struct thread_info *current_thread_info(void)
index b50907799cb229732d1e4032f4986a1c33eb5a0d..ee4d8b03d0484b3aded4bd65e91ceb03ae1fa4fb 100644 (file)
@@ -52,8 +52,6 @@ static inline void release_thread(struct task_struct *dead_task)
         /* Nothing needs to be done.  */
 }
 
-#define init_stack      (init_thread_union.stack)
-
 #define cpu_relax()     barrier()
 
 void default_idle(void);
index 108f77081a3c5fb42766652a61c185fb452bd819..996fef3be1d584201a308fac0c17de28753158ec 100644 (file)
@@ -63,8 +63,6 @@ struct thread_info {
        .addr_limit     = KERNEL_DS,                    \
 }
 
-#define init_thread_info       (init_thread_union.thread_info)
-
 #endif /* !__ASSEMBLY__ */
 
 /*
index ccba3b6ce918e64e9cd4ec106003b4e878ca4ca8..0f950845fad9df8f960d7640150a83cda22ffa38 100644 (file)
@@ -64,9 +64,6 @@ struct thread_info {
        .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 */
 register struct thread_info *__current_thread_info asm("gr15");
 
index 072b92c0d8b5017f666605c7d29f4797e10db583..0cdaa302d3d28239bc9295be4917e4239cc4c423 100644 (file)
@@ -46,9 +46,6 @@ struct thread_info {
        .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 */
 static inline struct thread_info *current_thread_info(void)
 {
index b80fe1db7b6484883e3ebfdfe0973b1883c8183a..f41f9c6f0e3100958651920847fc76bb78d8442b 100644 (file)
@@ -84,9 +84,6 @@ struct thread_info {
        .regs = NULL,                   \
 }
 
-#define init_thread_info        (init_thread_union.thread_info)
-#define init_stack              (init_thread_union.stack)
-
 /* Tacky preprocessor trickery */
 #define        qqstr(s) qstr(s)
 #define qstr(s) #s
index 49583c5a5d446afa2fec5b0ef220229848c53a01..315c51f58811e74a9213b8a030fc8f6fd023698d 100644 (file)
@@ -43,7 +43,7 @@ config IA64
        select ARCH_HAVE_NMI_SAFE_CMPXCHG
        select GENERIC_IOMAP
        select GENERIC_SMP_IDLE_THREAD
-       select ARCH_INIT_TASK
+       select ARCH_TASK_STRUCT_ON_STACK
        select ARCH_TASK_STRUCT_ALLOCATOR
        select ARCH_THREAD_STACK_ALLOCATOR
        select ARCH_CLOCKSOURCE_DATA
index c100d780f1eb21f8b5c38ad33c3c562dc626eca5..2dd7f519ad0b9832f335430836dde7671b123390 100644 (file)
@@ -42,7 +42,7 @@ $(error Sorry, you need a newer version of the assember, one that is built from
 endif
 
 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/
 core-y                         += arch/ia64/kernel/ arch/ia64/mm/
index 1d172a4119a7100ad448ae4fd60f086ba5817326..64a1011f681210b445de33aaefc2e820bcad1b28 100644 (file)
@@ -12,6 +12,8 @@
 #include <asm/processor.h>
 #include <asm/ptrace.h>
 
+#define THREAD_SIZE                    KERNEL_STACK_SIZE
+
 #ifndef __ASSEMBLY__
 
 /*
@@ -41,8 +43,6 @@ struct thread_info {
 #endif
 };
 
-#define THREAD_SIZE                    KERNEL_STACK_SIZE
-
 #define INIT_THREAD_INFO(tsk)                  \
 {                                              \
        .task           = &tsk,                 \
index 14ad79f394e50fa7071d0c15a5ff0c4e8f5103c7..0b4c65a1af25fbe264766ee1e14c4c0bf19bc5e6 100644 (file)
@@ -7,7 +7,7 @@ ifdef CONFIG_DYNAMIC_FTRACE
 CFLAGS_REMOVE_ftrace.o = -pg
 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     \
         irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o          \
diff --git a/arch/ia64/kernel/init_task.c b/arch/ia64/kernel/init_task.c
deleted file mode 100644 (file)
index 8df9245..0000000
+++ /dev/null
@@ -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);
index 58db59da0bd87042c8d0d457a77268f7b043e40f..b0b2070e0591babfa3fbe8879fe53a209fda7f92 100644 (file)
@@ -3,6 +3,7 @@
 #include <asm/cache.h>
 #include <asm/ptrace.h>
 #include <asm/pgtable.h>
+#include <asm/thread_info.h>
 
 #include <asm-generic/vmlinux.lds.h>
 
index b3a215b0ce0aaa15a947c89bbf48eacd69b4b4b4..ba00f1032587d2a8040c5f1080cce52be21c2ebc 100644 (file)
@@ -56,9 +56,6 @@ struct thread_info {
        .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 */
 static inline struct thread_info *current_thread_info(void)
 {
index 928035591f2e8447e68f3d8489fd6e62f047f56d..015f1ca383053a39f007e31437e93fbea305572b 100644 (file)
@@ -41,8 +41,6 @@ struct thread_info {
        .preempt_count  = INIT_PREEMPT_COUNT,   \
 }
 
-#define init_stack             (init_thread_union.stack)
-
 #ifndef __ASSEMBLY__
 /* how to get the thread information struct from C */
 static inline struct thread_info *current_thread_info(void)
@@ -58,8 +56,6 @@ static inline struct thread_info *current_thread_info(void)
 }
 #endif
 
-#define init_thread_info       (init_thread_union.thread_info)
-
 /* entry.S relies on these definitions!
  * bits 0-7 are tested at every exception exit
  * bits 8-15 are also tested at syscall exit
index 554f73a77e6e38229264d0f5a5b7aa013aeb77f7..a1a9c7f5ca8c1e3e4bb917c1c9216bb70dedac75 100644 (file)
@@ -74,9 +74,6 @@ struct thread_info {
        .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 */
 register unsigned long current_stack_pointer asm("A0StP") __used;
 
index e7e8954e9815d0a336b59a2af9a4fc058ed4715c..9afe4b5bd6c85f221f4606ce179de2cff3cdbdcd 100644 (file)
@@ -86,9 +86,6 @@ struct thread_info {
        .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 */
 static inline struct thread_info *current_thread_info(void)
 {
index 5e8927f99a766b76420a867f6982363a63adf255..4993db40482c80fa17cacec1ef54f4e356b6d26d 100644 (file)
@@ -49,9 +49,6 @@ struct thread_info {
        .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.  */
 register struct thread_info *__current_thread_info __asm__("$28");
 
index f5f90bbf019d6842c0cf2cb2b4ae11fcdc362b07..1748a7b25bf8c520b659c1fd0c8b0558ec4378e8 100644 (file)
@@ -79,8 +79,6 @@ struct thread_info {
        .addr_limit     = KERNEL_DS,            \
 }
 
-#define init_thread_info       (init_thread_union.thread_info)
-#define init_stack             (init_thread_union.stack)
 #define init_uregs                                                     \
        ((struct pt_regs *)                                             \
         ((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs)))
index d69c338bd19c37dfa88b1ff9c1eadf3490d478cb..7349a4fa635beafbaef4d0396f786908c00f5b75 100644 (file)
@@ -63,9 +63,6 @@ struct thread_info {
        .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 */
 static inline struct thread_info *current_thread_info(void)
 {
index 396d8f306c21b6c24f872780b9500cb8ebc1b963..af31a9fe736a85dbadafad8712ca9c1f212b94b5 100644 (file)
@@ -84,8 +84,6 @@ void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp);
 void release_thread(struct task_struct *);
 unsigned long get_wchan(struct task_struct *p);
 
-#define init_stack      (init_thread_union.stack)
-
 #define cpu_relax()     barrier()
 
 #endif /* __ASSEMBLY__ */
index c229aa6bb502b744e748d2e37aeff7625a19ce47..5c15dfa2fd4f760447ddc037020020a3fd6af959 100644 (file)
@@ -79,8 +79,6 @@ struct thread_info {
        .ksp            = 0,                            \
 }
 
-#define init_thread_info       (init_thread_union.thread_info)
-
 /* how to get the thread information struct from C */
 register struct thread_info *current_thread_info_reg asm("r10");
 #define current_thread_info()   (current_thread_info_reg)
index 598c8d60fa5e602cc9303e1986ada9680d64feb3..285757544cca230d5714bf72fb7679ef70096a48 100644 (file)
@@ -25,9 +25,6 @@ struct thread_info {
        .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 */
 #define current_thread_info()  ((struct thread_info *)mfctl(30))
 
index a264c3ad366b785399279858071df3afe4625aeb..4a12c00f8de3ec1aa90069d01a9b1de3f3174d00 100644 (file)
@@ -58,9 +58,6 @@ struct thread_info {
        .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)
 
 /* how to get the thread information struct from C */
index 22c3536ed2816ea887ae865af507f24c7f27438f..f8fa1cd2dad99abfb370dfcc2113f21832dc7367 100644 (file)
@@ -64,8 +64,6 @@ struct thread_info {
        .addr_limit     = KERNEL_DS,            \
 }
 
-#define init_stack             (init_thread_union.stack)
-
 #endif /* !__ASSEMBLY__ */
 
 /*
index 0880a37b6d3befe6baf5afbf345c3a4b19397897..25d6ec3aaddda8a69b300a7f7904148a29f17d02 100644 (file)
@@ -42,8 +42,6 @@ struct thread_info {
        .flags          = 0,                    \
 }
 
-#define init_stack             (init_thread_union.stack)
-
 void arch_release_task_struct(struct task_struct *tsk);
 int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
 
index ad51b56e51bd6c4b3874e4db3e640b60f5b0c3c6..bc4c7c90550fe182ed367bc3c4c95b745b2905b6 100644 (file)
@@ -58,9 +58,6 @@ struct thread_info {
        .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. */
 register struct thread_info *__current_thread_info __asm__("r28");
 #define current_thread_info()  __current_thread_info
index becb798f1b04dea236f2def06c442a6c355f9e0e..cf5c792bf70b74ff855edfd416c4f7d591eeff04 100644 (file)
@@ -63,9 +63,6 @@ struct thread_info {
        .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 */
 register unsigned long current_stack_pointer asm("r15") __used;
 
index febaaeb1a0feed5052aeb10d672de96e03929133..548b366165dd19f7df59d5a76ca5104979608116 100644 (file)
@@ -63,9 +63,6 @@ struct thread_info {
        .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 */
 register struct thread_info *current_thread_info_reg asm("g6");
 #define current_thread_info()   (current_thread_info_reg)
index caf915321ba9f492ff007853ac921be8317d97d8..f7e7b0baec9fe7ec27b175c4ca69437f2117938b 100644 (file)
@@ -120,9 +120,6 @@ struct thread_info {
        .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 */
 register struct thread_info *current_thread_info_reg asm("g6");
 #define current_thread_info()  (current_thread_info_reg)
index b7659b8f1117d9f94222cc63c8d7fc78d3eb734b..2adcacd85749e82daa288ec0dc82058f9f611dc1 100644 (file)
@@ -59,9 +59,6 @@ struct thread_info {
        .align_ctl      = 0,                    \
 }
 
-#define init_thread_info       (init_thread_union.thread_info)
-#define init_stack             (init_thread_union.stack)
-
 #endif /* !__ASSEMBLY__ */
 
 #if PAGE_SIZE < 8192
index 86942a492454c296bcc5cfc7f5fdd23544a46dc9..b58b746d3f2ca90b594be73388576aee9f20788f 100644 (file)
@@ -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).
index 9300f7630d2ad8f0bfa6e3360bd5af5c04e98181..4eecd960ee8c17586742b1b11745b056c122167e 100644 (file)
@@ -6,6 +6,9 @@
 #ifndef __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__
 
 #include <asm/types.h>
@@ -37,10 +40,6 @@ struct thread_info {
        .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 */
 static inline struct thread_info *current_thread_info(void)
 {
@@ -53,8 +52,6 @@ static inline struct thread_info *current_thread_info(void)
        return ti;
 }
 
-#define THREAD_SIZE_ORDER CONFIG_KERNEL_STACK_ORDER
-
 #endif
 
 #define TIF_SYSCALL_TRACE      0       /* syscall trace active */
diff --git a/arch/um/include/asm/vmlinux.lds.h b/arch/um/include/asm/vmlinux.lds.h
new file mode 100644 (file)
index 0000000..149494a
--- /dev/null
@@ -0,0 +1,2 @@
+#include <asm/thread_info.h>
+#include <asm-generic/vmlinux.lds.h>
index d417e3899700e056be233132f2c6e9d8b2caced4..5568cf88237118dfa6d754926eb6f3128fefbc18 100644 (file)
@@ -1,5 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#include <asm-generic/vmlinux.lds.h>
+#include <asm/vmlinux.lds.h>
 #include <asm/page.h>
 
 OUTPUT_FORMAT(ELF_FORMAT)
index f433690b9b377981265362858fc9727503040b5e..a818ccef30ca2a4a3685c4bc1d89d58ea4922236 100644 (file)
@@ -54,7 +54,7 @@ struct cpuinfo_um boot_cpu_data = {
 
 union thread_union cpu0_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 */
 static char host_info[(__NEW_UTS_LEN + 1) * 5];
index 3d6ed6ba5b78dbedc03e0ee8849158165f59fb3c..36b07ec09742ae088c55affb18874c1ef0f09c6b 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-#include <asm-generic/vmlinux.lds.h>
+#include <asm/vmlinux.lds.h>
 #include <asm/page.h>
 
 OUTPUT_FORMAT(ELF_FORMAT)
index e79ad6d5b5b2983c9a6d5464a6788a5fea20da2d..5fb728f3b49a7e8626b5b0b57db422b4a116eb53 100644 (file)
@@ -87,9 +87,6 @@ struct thread_info {
        .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
  */
index 00223333821a96616647a9cbb6fe729c4a18b7b6..d25a638a2720b63da5dbdfbb6a947959f23cb511 100644 (file)
@@ -62,8 +62,6 @@ struct thread_info {
        .flags          = 0,                    \
 }
 
-#define init_stack             (init_thread_union.stack)
-
 #else /* !__ASSEMBLY__ */
 
 #include <asm/asm-offsets.h>
index 7be2400f745a088d553bbbdf6c2cc232fc1d18a0..2ccd37510aaa3ed5b22b51457f1853b2bab42192 100644 (file)
@@ -77,9 +77,6 @@ struct thread_info {
        .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 */
 static inline struct thread_info *current_thread_info(void)
 {
index ee8b707d9fa9c6b5ed1e15f655c2b8f118868bf2..a564b83bf01383b2fe46c7d3cf08f7112f7adc17 100644 (file)
 #define INIT_TASK_DATA(align)                                          \
        . = ALIGN(align);                                               \
        VMLINUX_SYMBOL(__start_init_task) = .;                          \
+       VMLINUX_SYMBOL(init_thread_union) = .;                          \
+       VMLINUX_SYMBOL(init_stack) = .;                                 \
        *(.data..init_task)                                             \
+       *(.data..init_thread_info)                                      \
+       . = VMLINUX_SYMBOL(__start_init_task) + THREAD_SIZE;            \
        VMLINUX_SYMBOL(__end_init_task) = .;
 
 /*
index 6a532629c98350fcf8c3d6b4d4ed99a8c58e5cc9..30a89b99a5af8b9348b4168015b18d48759aaa54 100644 (file)
@@ -304,5 +304,8 @@ extern struct cred init_cred;
 /* Attach to the init_task data structure for proper alignment */
 #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
index d2588263a9893caa04d8854607207c41080927cc..68a504f6e474fa67198cdddc0b249ee8bc237d78 100644 (file)
@@ -1446,12 +1446,21 @@ extern void ia64_set_curr_task(int cpu, struct task_struct *p);
 void yield(void);
 
 union thread_union {
+#ifndef CONFIG_ARCH_TASK_STRUCT_ON_STACK
+       struct task_struct task;
+#endif
 #ifndef CONFIG_THREAD_INFO_IN_TASK
        struct thread_info thread_info;
 #endif
        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
 static inline struct thread_info *task_thread_info(struct task_struct *task)
 {
index 1dbb23787290081a834162ce35bffbbb96acfaf7..a3e5ce2bcf08bf2bee9c6139ac61360055dd4949 100644 (file)
@@ -13,9 +13,7 @@ obj-$(CONFIG_BLK_DEV_INITRD)   += initramfs.o
 endif
 obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o
 
-ifneq ($(CONFIG_ARCH_INIT_TASK),y)
 obj-y                          += init_task.o
-endif
 
 mounts-y                       := do_mounts.o
 mounts-$(CONFIG_BLK_DEV_RAM)   += do_mounts_rd.o
index 9325fee7dc821557ca8ee1c056109303cf0e988a..2285aa42cbe17796f94b94af68f03dae4dbb9dbe 100644 (file)
@@ -17,15 +17,17 @@ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
 static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
 
 /* 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);
 
 /*
  * Initial thread structure. Alignment of this is handled by a special
  * linker map entry.
  */
-union thread_union init_thread_union __init_task_data = {
 #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
-};