x86: Merge thread_info_32/64 to thread_info.h
cover x86: Merge thread_info_32/64 to thread_info.h
The following patchset merges the 32 and 64 bit thread_info files into one.
First just move the stuff into a single file and then gradually extract common code. Ends up with pretty small differences. Had some time last Saturday to play with it. Feedback/takeover appreciated.
Patch against git tree of today.
PATCH 1/9 x86: merge thread_info.h
Simple merge of both thread_info_32.h and thread_info_64.h into thread_info.h.
Comments for #ifndef __ASM_THREAD_INFO_H and #ifdef __KERNEL__ are the same.
--- include/asm-x86/thread_info.h | 366 ++++++++++++++++++++++++++++++++++++++- include/asm-x86/thread_info_32.h | 196 -------------------- include/asm-x86/thread_info_64.h | 186 ------------------- 3 files changed, 364 insertions(+), 384 deletions(-)
include/asm-x86/thread_info.h +364 -2
@@ -1,10 +1,372 @@ +/* thread_info.h: low-level thread information +* +* Copyright (C) 2002 David Howells ([email protected]) +* - Incorporating suggestions made by Linus Torvalds and Dave Miller +*/ +#ifndef _ASM_X86_THREAD_INFO_H +#define _ASM_X86_THREAD_INFO_H +#ifdef CONFIG_X86_32 -# include "thread_info_32.h" +#include <linux/compiler.h> +#include <asm/page.h> + +#ifndef __ASSEMBLY__ +#include <asm/processor.h> +#endif + +/* +* low level task data that entry.S needs immediate access to +* - this struct should fit entirely inside of one cache line +* - this struct shares the supervisor stack pages +* - if the contents of this structure are changed, +* the assembly constants must also be changed +*/ +#ifndef __ASSEMBLY__ + +struct thread_info { +struct task_struct *task;/* main task structure */ +struct exec_domain *exec_domain;/* execution domain */ +unsigned long flags;/* low level flags */ +unsigned long status;/* thread-synchronous flags */ +__u32 cpu;/* current CPU */ +int preempt_count;/* 0 => preemptable, +<0 => BUG */ +mm_segment_t addr_limit;/* thread address space: +0-0xBFFFFFFF user-thread +0-0xFFFFFFFF kernel-thread +*/ +void *sysenter_return; +struct restart_block restart_block; +unsigned long previous_esp;/* ESP of the previous stack in +case of nested (IRQ) stacks +*/ +__u8 supervisor_stack[0 ]; +}; + +#else /* !__ASSEMBLY__ */ + +#include <asm/asm-offsets.h> + +#endif + +#define PREEMPT_ACTIVE 0x10000000 +#ifdef CONFIG_4KSTACKS +#define THREAD_SIZE (4096)#else -# include "thread_info_64.h" +#define THREAD_SIZE (8192)#endif +#define STACK_WARN (THREAD_SIZE/8) +/* +* macros/functions for gaining access to the thread information structure +* +* preempt_count needs to be 1 initially, until the scheduler is functional. +*/ +#ifndef __ASSEMBLY__ + +#define INIT_THREAD_INFO (tsk) \ +{ \ + .task = &tsk, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ + .preempt_count = 1, \ + .addr_limit = KERNEL_DS, \ + .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ +} + +#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 */ +registerunsigned long current_stack_pointer asm("esp" )__used ; + +/* how to get the thread information struct from C */ +static inline struct thread_info *current_thread_info (void ) +{ +return (struct thread_info *) + (current_stack_pointer & ~(THREAD_SIZE -1 )); +} + +/* thread information allocation */ +#ifdef CONFIG_DEBUG_STACK_USAGE +#define alloc_thread_info (tsk) ((struct thread_info *) \ + __get_free_pages(GFP_KERNEL | __GFP_ZERO, get_order(THREAD_SIZE))) +#else +#define alloc_thread_info (tsk) ((struct thread_info *) \ + __get_free_pages(GFP_KERNEL, get_order(THREAD_SIZE))) +#endif + +#else /* !__ASSEMBLY__ */ + +/* how to get the thread information struct from ASM */ +#define GET_THREAD_INFO (reg) \ + movl $-THREAD_SIZE, reg; \ + andl %esp, reg + +/* use this one if reg already contains %esp */ +#define GET_THREAD_INFO_WITH_ESP (reg) \ + andl $-THREAD_SIZE, reg + +#endif + +/* +* thread information flags +* - these are process state flags that various +* assembly files may need to access +* - pending work-to-be-done flags are in LSW +* - other flags in MSW +*/ +#define TIF_SYSCALL_TRACE 0/* syscall trace active */ +#define TIF_SIGPENDING 1/* signal pending */ +#define TIF_NEED_RESCHED 2/* rescheduling necessary */ +#define TIF_SINGLESTEP 3/* restore singlestep on return to +user mode */ +#define TIF_IRET 4/* return with iret */ +#define TIF_SYSCALL_EMU 5/* syscall emulation active */ +#define TIF_SYSCALL_AUDIT 6/* syscall auditing active */ +#define TIF_SECCOMP 7/* secure computing */ +#define TIF_RESTORE_SIGMASK 8/* restore signal mask in do_signal() */ +#define TIF_HRTICK_RESCHED 9/* reprogram hrtick timer */ +#define TIF_MEMDIE 16 +#define TIF_DEBUG 17/* uses debug registers */ +#define TIF_IO_BITMAP 18/* uses I/O bitmap */ +#define TIF_FREEZE 19/* is freezing for suspend */ +#define TIF_NOTSC 20/* TSC is not accessible in userland */ +#define TIF_FORCED_TF 21/* true if TF in eflags artificially */ +#define TIF_DEBUGCTLMSR 22/* uses thread_struct.debugctlmsr */ +#define TIF_DS_AREA_MSR 23/* uses thread_struct.ds_area_msr */ +#define TIF_BTS_TRACE_TS 24/* record scheduling event timestamps */ + +#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) +#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) +#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) +#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) +#define _TIF_IRET (1 << TIF_IRET) +#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU) +#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) +#define _TIF_SECCOMP (1 << TIF_SECCOMP) +#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) +#define _TIF_HRTICK_RESCHED (1 << TIF_HRTICK_RESCHED) +#define _TIF_DEBUG (1 << TIF_DEBUG) +#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) +#define _TIF_FREEZE (1 << TIF_FREEZE) +#define _TIF_NOTSC (1 << TIF_NOTSC) +#define _TIF_FORCED_TF (1 << TIF_FORCED_TF) +#define _TIF_DEBUGCTLMSR (1 << TIF_DEBUGCTLMSR) +#define _TIF_DS_AREA_MSR (1 << TIF_DS_AREA_MSR) +#define _TIF_BTS_TRACE_TS (1 << TIF_BTS_TRACE_TS) + +/* work to do on interrupt/exception return */ +#define _TIF_WORK_MASK \ + (0x0000FFFF & ~(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ + _TIF_SECCOMP | _TIF_SYSCALL_EMU)) +/* work to do on any return to u-space */ +#define _TIF_ALLWORK_MASK (0x0000FFFF & ~_TIF_SECCOMP) + +/* flags to check in __switch_to() */ +#define _TIF_WORK_CTXSW \ + (_TIF_IO_BITMAP | _TIF_NOTSC | _TIF_DEBUGCTLMSR | \ + _TIF_DS_AREA_MSR | _TIF_BTS_TRACE_TS) +#define _TIF_WORK_CTXSW_PREV _TIF_WORK_CTXSW +#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW | _TIF_DEBUG) + + +/* +* Thread-synchronous status. +* +* This is different from the flags in that nobody else +* ever touches our thread-synchronous status, so we don't +* have to worry about atomic accesses. +*/ +#define TS_USEDFPU 0x0001/* FPU was used by this task +this quantum (SMP) */ +#define TS_POLLING 0x0002/* True if in idle loop +and not sleeping */ + +#define tsk_is_polling (t) (task_thread_info(t)->status & TS_POLLING) + +#else /* X86_32 */ + +#include <asm/page.h> +#include <asm/types.h> +#include <asm/pda.h> + +/* +* low level task data that entry.S needs immediate access to +* - this struct should fit entirely inside of one cache line +* - this struct shares the supervisor stack pages +*/ +#ifndef __ASSEMBLY__ +struct task_struct ; +struct exec_domain ; +#include <asm/processor.h> + +struct thread_info { +struct task_struct *task;/* main task structure */ +struct exec_domain *exec_domain;/* execution domain */ +__u32 flags;/* low level flags */ +__u32 status;/* thread synchronous flags */ +__u32 cpu;/* current CPU */ +int preempt_count;/* 0 => preemptable, +<0 => BUG */ +mm_segment_t addr_limit; +struct restart_block restart_block; +#ifdef CONFIG_IA32_EMULATION +void __user *sysenter_return; +#endif +}; +#endif + +/* +* macros/functions for gaining access to the thread information structure +* preempt_count needs to be 1 initially, until the scheduler is functional. +*/ +#ifndef __ASSEMBLY__ +#define INIT_THREAD_INFO (tsk) \ +{ \ + .task = &tsk, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ + .preempt_count = 1, \ + .addr_limit = KERNEL_DS, \ + .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ +} + +#define init_thread_info (init_thread_union.thread_info) +#define init_stack (init_thread_union.stack) + +static inline struct thread_info *current_thread_info (void ) +{ +struct thread_info *ti; + ti = (void *)(read_pda (kernelstack) +PDA_STACKOFFSET -THREAD_SIZE ); +return ti; +} + +/* do not use in interrupt context */ +static inline struct thread_info *stack_thread_info (void ) +{ +struct thread_info *ti; + asm("andq %%rsp,%0; " :"=r" (ti) :"0" (~(THREAD_SIZE -1 ))); +return ti; +} + +/* thread information allocation */ +#ifdef CONFIG_DEBUG_STACK_USAGE +#define THREAD_FLAGS (GFP_KERNEL | __GFP_ZERO) +#else +#define THREAD_FLAGS GFP_KERNEL +#endif + +#define alloc_thread_info (tsk) \ + ((struct thread_info *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER)) + +#else /* !__ASSEMBLY__ */ + +/* how to get the thread information struct from ASM */ +#define GET_THREAD_INFO (reg) \ + movq %gs:pda_kernelstack,reg ; \ + subq $(THREAD_SIZE-PDA_STACKOFFSET),reg + +#endif + +/* +* thread information flags +* - these are process state flags that various assembly files +* may need to access +* - pending work-to-be-done flags are in LSW +* - other flags in MSW +* Warning: layout of LSW is hardcoded in entry.S +*/ +#define TIF_SYSCALL_TRACE 0/* syscall trace active */ +#define TIF_SIGPENDING 2/* signal pending */ +#define TIF_NEED_RESCHED 3/* rescheduling necessary */ +#define TIF_SINGLESTEP 4/* reenable singlestep on user return*/ +#define TIF_IRET 5/* force IRET */ +#define TIF_SYSCALL_AUDIT 7/* syscall auditing active */ +#define TIF_SECCOMP 8/* secure computing */ +#define TIF_RESTORE_SIGMASK 9/* restore signal mask in do_signal */ +#define TIF_MCE_NOTIFY 10/* notify userspace of an MCE */ +#define TIF_HRTICK_RESCHED 11/* reprogram hrtick timer */ +/* 16 free */ +#define TIF_IA32 17/* 32bit process */ +#define TIF_FORK 18/* ret_from_fork */ +#define TIF_ABI_PENDING 19 +#define TIF_MEMDIE 20 +#define TIF_DEBUG 21/* uses debug registers */ +#define TIF_IO_BITMAP 22/* uses I/O bitmap */ +#define TIF_FREEZE 23/* is freezing for suspend */ +#define TIF_FORCED_TF 24/* true if TF in eflags artificially */ +#define TIF_DEBUGCTLMSR 25/* uses thread_struct.debugctlmsr */ +#define TIF_DS_AREA_MSR 26/* uses thread_struct.ds_area_msr */ +#define TIF_BTS_TRACE_TS 27/* record scheduling event timestamps */ +#define TIF_NOTSC 28/* TSC is not accessible in userland */ + +#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) +#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) +#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) +#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) +#define _TIF_IRET (1 << TIF_IRET) +#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) +#define _TIF_SECCOMP (1 << TIF_SECCOMP) +#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) +#define _TIF_MCE_NOTIFY (1 << TIF_MCE_NOTIFY) +#define _TIF_HRTICK_RESCHED (1 << TIF_HRTICK_RESCHED) +#define _TIF_IA32 (1 << TIF_IA32) +#define _TIF_FORK (1 << TIF_FORK) +#define _TIF_ABI_PENDING (1 << TIF_ABI_PENDING) +#define _TIF_DEBUG (1 << TIF_DEBUG) +#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) +#define _TIF_FREEZE (1 << TIF_FREEZE) +#define _TIF_FORCED_TF (1 << TIF_FORCED_TF) +#define _TIF_DEBUGCTLMSR (1 << TIF_DEBUGCTLMSR) +#define _TIF_DS_AREA_MSR (1 << TIF_DS_AREA_MSR) +#define _TIF_BTS_TRACE_TS (1 << TIF_BTS_TRACE_TS) +#define _TIF_NOTSC (1 << TIF_NOTSC) + +/* work to do on interrupt/exception return */ +#define _TIF_WORK_MASK \ + (0x0000FFFF & \ + ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP|_TIF_SECCOMP)) +/* work to do on any return to user space */ +#define _TIF_ALLWORK_MASK (0x0000FFFF & ~_TIF_SECCOMP) + +#define _TIF_DO_NOTIFY_MASK \ + (_TIF_SIGPENDING|_TIF_SINGLESTEP|_TIF_MCE_NOTIFY|_TIF_HRTICK_RESCHED) + +/* flags to check in __switch_to() */ +#define _TIF_WORK_CTXSW \ + (_TIF_IO_BITMAP|_TIF_DEBUGCTLMSR|_TIF_DS_AREA_MSR|_TIF_BTS_TRACE_TS|_TIF_NOTSC) +#define _TIF_WORK_CTXSW_PREV _TIF_WORK_CTXSW +#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW|_TIF_DEBUG) + +#define PREEMPT_ACTIVE 0x10000000 + +/* +* Thread-synchronous status. +* +* This is different from the flags in that nobody else +* ever touches our thread-synchronous status, so we don't +* have to worry about atomic accesses. +*/ +#define TS_USEDFPU 0x0001/* FPU was used by this task +this quantum (SMP) */ +#define TS_COMPAT 0x0002/* 32bit syscall active */ +#define TS_POLLING 0x0004/* true if in idle loop +and not sleeping */ + +#define tsk_is_polling (t) (task_thread_info(t)->status & TS_POLLING) + +#endif /* !X86_32 */ + +#ifndef __ASSEMBLY__extern void arch_task_cache_init (void );extern void free_thread_info (struct thread_info *ti);
include/asm-x86/thread_info_32.h deleted +0 -196
196 lines not on this page · raw message
include/asm-x86/thread_info_64.h deleted +0 -186
186 lines not on this page · raw message
PATCH 2/9 x86: threadinfo: Common include files
In reply to Christoph LameterMove shared includes to a common area in thread_info.h
Adds asm/types.h for x86_64 and linux/compiler.h for x86_32. Not needed but we can avoid some ifdeffing and it simplifies later joining.
--- include/asm-x86/thread_info.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
include/asm-x86/thread_info.h +3 -3
@@ -7,9 +7,11 @@#ifndef _ASM_X86_THREAD_INFO_H#define _ASM_X86_THREAD_INFO_H -#ifdef CONFIG_X86_32 #include <linux/compiler.h> #include <asm/page.h> +#include <asm/types.h> + +#ifdef CONFIG_X86_32 #ifndef __ASSEMBLY__#include <asm/processor.h>
@@ -192,8 +194,6 @@ static inline struct thread_info *curren#else /* X86_32 */ -#include <asm/page.h> -#include <asm/types.h> #include <asm/pda.h> /*
PATCH 3/9 x86: threadinfo: Merge thread sync state definitions
In reply to Christoph LameterMerge both. x86_64 has an additional TS_COMPAT that is harmless for 32 bit.
--- include/asm-x86/thread_info.h | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-)
include/asm-x86/thread_info.h +3 -19
@@ -177,21 +177,6 @@ static inline struct thread_info *curren#define _TIF_WORK_CTXSW_PREV _TIF_WORK_CTXSW#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW | _TIF_DEBUG) - -/* -* Thread-synchronous status. -* -* This is different from the flags in that nobody else -* ever touches our thread-synchronous status, so we don't -* have to worry about atomic accesses. -*/ -#define TS_USEDFPU 0x0001/* FPU was used by this task -this quantum (SMP) */ -#define TS_POLLING 0x0002/* True if in idle loop -and not sleeping */ - -#define tsk_is_polling (t) (task_thread_info(t)->status & TS_POLLING) -#else /* X86_32 */ #include <asm/pda.h>
@@ -349,6 +334,8 @@ static inline struct thread_info *stack_#define PREEMPT_ACTIVE 0x10000000 +#endif /* !X86_32 */ +/* * Thread-synchronous status. *
@@ -358,15 +345,12 @@ static inline struct thread_info *stack_*/ #define TS_USEDFPU 0x0001/* FPU was used by this task this quantum (SMP) */ -#define TS_COMPAT 0x0002/* 32bit syscall active */ +#define TS_COMPAT 0x0002/* 32bit syscall active (64BIT)*/ #define TS_POLLING 0x0004/* true if in idle loop and not sleeping */ #define tsk_is_polling (t) (task_thread_info(t)->status & TS_POLLING) -#endif /* !X86_32 */ - -#ifndef __ASSEMBLY__extern void arch_task_cache_init (void );extern void free_thread_info (struct thread_info *ti);
PATCH 4/9 x86: common thread_info definitions
In reply to Christoph LameterMerge the thread_info definition into one structure definition for both arches.
The __u32 is equal to unsigned long for 32 bit.
sysenter_return is used both for the IA32 emulation for 64 and x86_32. Avoid complicated #ifdef by simply always including it.
--- include/asm-x86/thread_info.h | 55 +++++++++--------------------------------- 1 file changed, 12 insertions(+), 43 deletions(-)
include/asm-x86/thread_info.h +12 -43
@@ -11,47 +11,42 @@#include <asm/page.h> #include <asm/types.h> -#ifdef CONFIG_X86_32 - -#ifndef __ASSEMBLY__ -#include <asm/processor.h> -#endif -/* * low level task data that entry.S needs immediate access to * - this struct should fit entirely inside of one cache line * - this struct shares the supervisor stack pages -* - if the contents of this structure are changed, -* the assembly constants must also be changed */ #ifndef __ASSEMBLY__ +struct task_struct ; +struct exec_domain ; +#include <asm/processor.h> struct thread_info {struct task_struct *task;/* main task structure */ struct exec_domain *exec_domain;/* execution domain */ -unsigned long flags;/* low level flags */ -unsigned long status;/* thread-synchronous flags */ +__u32 flags;/* low level flags */ +__u32 status;/* thread synchronous flags */ __u32 cpu;/* current CPU */ -int preempt_count;/* 0 => preemptable, +int preempt_count;/* 0 => preemptable, <0 => BUG */ -mm_segment_t addr_limit;/* thread address space: -0-0xBFFFFFFF user-thread -0-0xFFFFFFFF kernel-thread -*/ -void *sysenter_return; +mm_segment_t addr_limit;struct restart_block restart_block; +void __user *sysenter_return; +#ifdef CONFIG_X86_32 unsigned long previous_esp;/* ESP of the previous stack in case of nested (IRQ) stacks */ __u8 supervisor_stack[0 ]; +#endif }; -#else /* !__ASSEMBLY__ */ #include <asm/asm-offsets.h> #endif +#ifdef CONFIG_X86_32 +#define PREEMPT_ACTIVE 0x10000000#ifdef CONFIG_4KSTACKS #define THREAD_SIZE (4096)
@@ -182,32 +177,6 @@ static inline struct thread_info *curren#include <asm/pda.h> /* -* low level task data that entry.S needs immediate access to -* - this struct should fit entirely inside of one cache line -* - this struct shares the supervisor stack pages -*/ -#ifndef __ASSEMBLY__ -struct task_struct ; -struct exec_domain ; -#include <asm/processor.h> - -struct thread_info { -struct task_struct *task;/* main task structure */ -struct exec_domain *exec_domain;/* execution domain */ -__u32 flags;/* low level flags */ -__u32 status;/* thread synchronous flags */ -__u32 cpu;/* current CPU */ -int preempt_count;/* 0 => preemptable, -<0 => BUG */ -mm_segment_t addr_limit; -struct restart_block restart_block; -#ifdef CONFIG_IA32_EMULATION -void __user *sysenter_return; -#endif -}; -#endif - -/* * macros/functions for gaining access to the thread information structure * preempt_count needs to be 1 initially, until the scheduler is functional. */
PATCH 5/9 x86: threadinfo: Merge INIT_THREAD_INFO
In reply to Christoph LameterBoth definitions are the same. So move to common x86 area.
--- include/asm-x86/thread_info.h | 49 ++++++++++++++---------------------------- 1 file changed, 17 insertions(+), 32 deletions(-)
include/asm-x86/thread_info.h +17 -32
@@ -39,6 +39,23 @@ struct thread_info {__u8 supervisor_stack[0 ];#endif }; + +#define INIT_THREAD_INFO (tsk) \ +{ \ + .task = &tsk, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ + .preempt_count = 1, \ + .addr_limit = KERNEL_DS, \ + .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ +} + +#define init_thread_info (init_thread_union.thread_info) +#define init_stack (init_thread_union.stack) +#else /* !__ASSEMBLY__ */ #include <asm/asm-offsets.h>
@@ -62,22 +79,6 @@ struct thread_info {*/ #ifndef __ASSEMBLY__ -#define INIT_THREAD_INFO (tsk) \ -{ \ - .task = &tsk, \ - .exec_domain = &default_exec_domain, \ - .flags = 0, \ - .cpu = 0, \ - .preempt_count = 1, \ - .addr_limit = KERNEL_DS, \ - .restart_block = { \ - .fn = do_no_restart_syscall, \ - }, \ -} - -#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 */ registerunsigned long current_stack_pointer asm("esp" )__used ;
@@ -181,22 +182,6 @@ static inline struct thread_info *curren* preempt_count needs to be 1 initially, until the scheduler is functional. */ #ifndef __ASSEMBLY__ -#define INIT_THREAD_INFO (tsk) \ -{ \ - .task = &tsk, \ - .exec_domain = &default_exec_domain, \ - .flags = 0, \ - .cpu = 0, \ - .preempt_count = 1, \ - .addr_limit = KERNEL_DS, \ - .restart_block = { \ - .fn = do_no_restart_syscall, \ - }, \ -} - -#define init_thread_info (init_thread_union.thread_info) -#define init_stack (init_thread_union.stack) -static inline struct thread_info *current_thread_info (void ) {struct thread_info *ti;
PATCH 6/9 x86: thread_info: PREEMPT_ACTIVE
In reply to Christoph LameterSame for both 32 and 64 bit so simply put it in to the common area.
--- include/asm-x86/thread_info.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
include/asm-x86/thread_info.h +2 -3
@@ -62,9 +62,10 @@ struct thread_info {#endif +#define PREEMPT_ACTIVE 0x10000000 +#ifdef CONFIG_X86_32 -#define PREEMPT_ACTIVE 0x10000000#ifdef CONFIG_4KSTACKS #define THREAD_SIZE (4096)#else
@@ -286,8 +287,6 @@ static inline struct thread_info *stack_#define _TIF_WORK_CTXSW_PREV _TIF_WORK_CTXSW#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW|_TIF_DEBUG) -#define PREEMPT_ACTIVE 0x10000000 -#endif /* !X86_32 */ /*
PATCH 7/9 x86: thread_info: Merget TIF_ flags.
In reply to Christoph LameterBoth TIF lists are essentially the same. x86_32 also has TIF_SYSCALL_EMU which must be undefined for the 64 bit case.
--- include/asm-x86/thread_info.h | 162 +++++++++++++++--------------------------- 1 file changed, 61 insertions(+), 101 deletions(-)
include/asm-x86/thread_info.h +61 -101
@@ -62,6 +62,67 @@ struct thread_info {#endif +/* +* thread information flags +* - these are process state flags that various assembly files +* may need to access +* - pending work-to-be-done flags are in LSW +* - other flags in MSW +* Warning: layout of LSW is hardcoded in entry.S +*/ +#define TIF_SYSCALL_TRACE 0/* syscall trace active */ +#define TIF_SIGPENDING 2/* signal pending */ +#define TIF_NEED_RESCHED 3/* rescheduling necessary */ +#define TIF_SINGLESTEP 4/* reenable singlestep on user return*/ +#define TIF_IRET 5/* force IRET */ +#ifdef CONFIG_X86_32 +#define TIF_SYSCALL_EMU 6/* syscall emulation active */ +#endif +#define TIF_SYSCALL_AUDIT 7/* syscall auditing active */ +#define TIF_SECCOMP 8/* secure computing */ +#define TIF_RESTORE_SIGMASK 9/* restore signal mask in do_signal */ +#define TIF_MCE_NOTIFY 10/* notify userspace of an MCE */ +#define TIF_HRTICK_RESCHED 11/* reprogram hrtick timer */ +#define TIF_NOTSC 16/* TSC is not accessible in userland */ +#define TIF_IA32 17/* 32bit process */ +#define TIF_FORK 18/* ret_from_fork */ +#define TIF_ABI_PENDING 19 +#define TIF_MEMDIE 20 +#define TIF_DEBUG 21/* uses debug registers */ +#define TIF_IO_BITMAP 22/* uses I/O bitmap */ +#define TIF_FREEZE 23/* is freezing for suspend */ +#define TIF_FORCED_TF 24/* true if TF in eflags artificially */ +#define TIF_DEBUGCTLMSR 25/* uses thread_struct.debugctlmsr */ +#define TIF_DS_AREA_MSR 26/* uses thread_struct.ds_area_msr */ +#define TIF_BTS_TRACE_TS 27/* record scheduling event timestamps */ + +#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) +#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) +#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) +#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) +#define _TIF_IRET (1 << TIF_IRET) +#ifdef CONFIG_X86_32 +#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU) +#else +#define _TIF_SYSCALL_EMU 0 +#endif +#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) +#define _TIF_SECCOMP (1 << TIF_SECCOMP) +#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) +#define _TIF_MCE_NOTIFY (1 << TIF_MCE_NOTIFY) +#define _TIF_HRTICK_RESCHED (1 << TIF_HRTICK_RESCHED) +#define _TIF_NOTSC (1 << TIF_NOTSC) +#define _TIF_IA32 (1 << TIF_IA32) +#define _TIF_FORK (1 << TIF_FORK) +#define _TIF_ABI_PENDING (1 << TIF_ABI_PENDING) +#define _TIF_DEBUG (1 << TIF_DEBUG) +#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) +#define _TIF_FREEZE (1 << TIF_FREEZE) +#define _TIF_FORCED_TF (1 << TIF_FORCED_TF) +#define _TIF_DEBUGCTLMSR (1 << TIF_DEBUGCTLMSR) +#define _TIF_DS_AREA_MSR (1 << TIF_DS_AREA_MSR) +#define _TIF_BTS_TRACE_TS (1 << TIF_BTS_TRACE_TS) +#define PREEMPT_ACTIVE 0x10000000#ifdef CONFIG_X86_32
@@ -113,53 +174,6 @@ static inline struct thread_info *curren#endif -/* -* thread information flags -* - these are process state flags that various -* assembly files may need to access -* - pending work-to-be-done flags are in LSW -* - other flags in MSW -*/ -#define TIF_SYSCALL_TRACE 0/* syscall trace active */ -#define TIF_SIGPENDING 1/* signal pending */ -#define TIF_NEED_RESCHED 2/* rescheduling necessary */ -#define TIF_SINGLESTEP 3/* restore singlestep on return to -user mode */ -#define TIF_IRET 4/* return with iret */ -#define TIF_SYSCALL_EMU 5/* syscall emulation active */ -#define TIF_SYSCALL_AUDIT 6/* syscall auditing active */ -#define TIF_SECCOMP 7/* secure computing */ -#define TIF_RESTORE_SIGMASK 8/* restore signal mask in do_signal() */ -#define TIF_HRTICK_RESCHED 9/* reprogram hrtick timer */ -#define TIF_MEMDIE 16 -#define TIF_DEBUG 17/* uses debug registers */ -#define TIF_IO_BITMAP 18/* uses I/O bitmap */ -#define TIF_FREEZE 19/* is freezing for suspend */ -#define TIF_NOTSC 20/* TSC is not accessible in userland */ -#define TIF_FORCED_TF 21/* true if TF in eflags artificially */ -#define TIF_DEBUGCTLMSR 22/* uses thread_struct.debugctlmsr */ -#define TIF_DS_AREA_MSR 23/* uses thread_struct.ds_area_msr */ -#define TIF_BTS_TRACE_TS 24/* record scheduling event timestamps */ - -#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) -#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) -#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) -#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) -#define _TIF_IRET (1 << TIF_IRET) -#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU) -#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) -#define _TIF_SECCOMP (1 << TIF_SECCOMP) -#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) -#define _TIF_HRTICK_RESCHED (1 << TIF_HRTICK_RESCHED) -#define _TIF_DEBUG (1 << TIF_DEBUG) -#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) -#define _TIF_FREEZE (1 << TIF_FREEZE) -#define _TIF_NOTSC (1 << TIF_NOTSC) -#define _TIF_FORCED_TF (1 << TIF_FORCED_TF) -#define _TIF_DEBUGCTLMSR (1 << TIF_DEBUGCTLMSR) -#define _TIF_DS_AREA_MSR (1 << TIF_DS_AREA_MSR) -#define _TIF_BTS_TRACE_TS (1 << TIF_BTS_TRACE_TS) -/* work to do on interrupt/exception return */ #define _TIF_WORK_MASK \ (0x0000FFFF & ~(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
@@ -217,60 +231,6 @@ static inline struct thread_info *stack_#endif -/* -* thread information flags -* - these are process state flags that various assembly files -* may need to access -* - pending work-to-be-done flags are in LSW -* - other flags in MSW -* Warning: layout of LSW is hardcoded in entry.S -*/ -#define TIF_SYSCALL_TRACE 0/* syscall trace active */ -#define TIF_SIGPENDING 2/* signal pending */ -#define TIF_NEED_RESCHED 3/* rescheduling necessary */ -#define TIF_SINGLESTEP 4/* reenable singlestep on user return*/ -#define TIF_IRET 5/* force IRET */ -#define TIF_SYSCALL_AUDIT 7/* syscall auditing active */ -#define TIF_SECCOMP 8/* secure computing */ -#define TIF_RESTORE_SIGMASK 9/* restore signal mask in do_signal */ -#define TIF_MCE_NOTIFY 10/* notify userspace of an MCE */ -#define TIF_HRTICK_RESCHED 11/* reprogram hrtick timer */ -/* 16 free */ -#define TIF_IA32 17/* 32bit process */ -#define TIF_FORK 18/* ret_from_fork */ -#define TIF_ABI_PENDING 19 -#define TIF_MEMDIE 20 -#define TIF_DEBUG 21/* uses debug registers */ -#define TIF_IO_BITMAP 22/* uses I/O bitmap */ -#define TIF_FREEZE 23/* is freezing for suspend */ -#define TIF_FORCED_TF 24/* true if TF in eflags artificially */ -#define TIF_DEBUGCTLMSR 25/* uses thread_struct.debugctlmsr */ -#define TIF_DS_AREA_MSR 26/* uses thread_struct.ds_area_msr */ -#define TIF_BTS_TRACE_TS 27/* record scheduling event timestamps */ -#define TIF_NOTSC 28/* TSC is not accessible in userland */ - -#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) -#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) -#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) -#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) -#define _TIF_IRET (1 << TIF_IRET) -#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) -#define _TIF_SECCOMP (1 << TIF_SECCOMP) -#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) -#define _TIF_MCE_NOTIFY (1 << TIF_MCE_NOTIFY) -#define _TIF_HRTICK_RESCHED (1 << TIF_HRTICK_RESCHED) -#define _TIF_IA32 (1 << TIF_IA32) -#define _TIF_FORK (1 << TIF_FORK) -#define _TIF_ABI_PENDING (1 << TIF_ABI_PENDING) -#define _TIF_DEBUG (1 << TIF_DEBUG) -#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) -#define _TIF_FREEZE (1 << TIF_FREEZE) -#define _TIF_FORCED_TF (1 << TIF_FORCED_TF) -#define _TIF_DEBUGCTLMSR (1 << TIF_DEBUGCTLMSR) -#define _TIF_DS_AREA_MSR (1 << TIF_DS_AREA_MSR) -#define _TIF_BTS_TRACE_TS (1 << TIF_BTS_TRACE_TS) -#define _TIF_NOTSC (1 << TIF_NOTSC) -/* work to do on interrupt/exception return */ #define _TIF_WORK_MASK \ (0x0000FFFF & \
PATCH 8/9 x86: thread_info: merge tif masks.
In reply to Christoph LameterThe TIF masks are basically the same. x86_32 also has _TIF_SYSCALL_EMU which is zero for the 64 bit case. The tif masks become the same.
x86_64 has an additional _TIF_DONOTIFY_MASK. Does not hurt for the 32 bit case since it is only used in x86_64 arch code.
--- include/asm-x86/thread_info.h | 51 +++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 30 deletions(-)
include/asm-x86/thread_info.h +21 -30
@@ -123,6 +123,27 @@ struct thread_info {#define _TIF_DS_AREA_MSR (1 << TIF_DS_AREA_MSR)#define _TIF_BTS_TRACE_TS (1 << TIF_BTS_TRACE_TS) +/* work to do on interrupt/exception return */ +#define _TIF_WORK_MASK \ + (0x0000FFFF & \ + ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP| \ + _TIF_SECCOMP|_TIF_SYSCALL_EMU)) + +/* work to do on any return to user space */ +#define _TIF_ALLWORK_MASK (0x0000FFFF & ~_TIF_SECCOMP) + +#define _TIF_DO_NOTIFY_MASK \ + (_TIF_SIGPENDING|_TIF_SINGLESTEP|_TIF_MCE_NOTIFY|_TIF_HRTICK_RESCHED) + +/* flags to check in __switch_to() */ +#define _TIF_WORK_CTXSW \ + (_TIF_IO_BITMAP|_TIF_DEBUGCTLMSR|_TIF_DS_AREA_MSR|_TIF_BTS_TRACE_TS| \ + _TIF_NOTSC) + +#define _TIF_WORK_CTXSW_PREV _TIF_WORK_CTXSW +#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW|_TIF_DEBUG) + +#define PREEMPT_ACTIVE 0x10000000#ifdef CONFIG_X86_32
@@ -174,20 +195,6 @@ static inline struct thread_info *curren#endif -/* work to do on interrupt/exception return */ -#define _TIF_WORK_MASK \ - (0x0000FFFF & ~(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ - _TIF_SECCOMP | _TIF_SYSCALL_EMU)) -/* work to do on any return to u-space */ -#define _TIF_ALLWORK_MASK (0x0000FFFF & ~_TIF_SECCOMP) - -/* flags to check in __switch_to() */ -#define _TIF_WORK_CTXSW \ - (_TIF_IO_BITMAP | _TIF_NOTSC | _TIF_DEBUGCTLMSR | \ - _TIF_DS_AREA_MSR | _TIF_BTS_TRACE_TS) -#define _TIF_WORK_CTXSW_PREV _TIF_WORK_CTXSW -#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW | _TIF_DEBUG) -#else /* X86_32 */ #include <asm/pda.h>
@@ -231,22 +238,6 @@ static inline struct thread_info *stack_#endif -/* work to do on interrupt/exception return */ -#define _TIF_WORK_MASK \ - (0x0000FFFF & \ - ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP|_TIF_SECCOMP)) -/* work to do on any return to user space */ -#define _TIF_ALLWORK_MASK (0x0000FFFF & ~_TIF_SECCOMP) - -#define _TIF_DO_NOTIFY_MASK \ - (_TIF_SIGPENDING|_TIF_SINGLESTEP|_TIF_MCE_NOTIFY|_TIF_HRTICK_RESCHED) - -/* flags to check in __switch_to() */ -#define _TIF_WORK_CTXSW \ - (_TIF_IO_BITMAP|_TIF_DEBUGCTLMSR|_TIF_DS_AREA_MSR|_TIF_BTS_TRACE_TS|_TIF_NOTSC) -#define _TIF_WORK_CTXSW_PREV _TIF_WORK_CTXSW -#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW|_TIF_DEBUG) -#endif /* !X86_32 */ /*
PATCH 9/9 x86: thread_info: Merge thread_info allocation
In reply to Christoph LameterMake them similar so that both use THREAD_ORDER and THREAD_FLAGS and have a THREAD_SIZE definition that is setup in asm/page_xx.h
--- include/asm-x86/page_32.h | 8 ++++++++ include/asm-x86/thread_info.h | 37 +++++++++++-------------------------- 2 files changed, 19 insertions(+), 26 deletions(-)
include/asm-x86/thread_info.h +11 -26
@@ -132,6 +132,7 @@ struct thread_info {/* work to do on any return to user space */ #define _TIF_ALLWORK_MASK (0x0000FFFF & ~_TIF_SECCOMP) +/* Only used for 64 bit */ #define _TIF_DO_NOTIFY_MASK \ (_TIF_SIGPENDING|_TIF_SINGLESTEP|_TIF_MCE_NOTIFY|_TIF_HRTICK_RESCHED)
@@ -143,18 +144,21 @@ struct thread_info {#define _TIF_WORK_CTXSW_PREV _TIF_WORK_CTXSW#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW|_TIF_DEBUG) -#define PREEMPT_ACTIVE 0x10000000 -#ifdef CONFIG_X86_32 - -#ifdef CONFIG_4KSTACKS -#define THREAD_SIZE (4096) +/* thread information allocation */ +#ifdef CONFIG_DEBUG_STACK_USAGE +#define THREAD_FLAGS (GFP_KERNEL | __GFP_ZERO)#else -#define THREAD_SIZE (8192) +#define THREAD_FLAGS GFP_KERNEL#endif -#define STACK_WARN (THREAD_SIZE/8) +#define alloc_thread_info (tsk) \ + ((struct thread_info *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER)) + +#ifdef CONFIG_X86_32 + +#define STACK_WARN (THREAD_SIZE/8)/* * macros/functions for gaining access to the thread information structure *
@@ -173,15 +177,6 @@ static inline struct thread_info *curren (current_stack_pointer & ~(THREAD_SIZE - 1)); } -/* thread information allocation */ -#ifdef CONFIG_DEBUG_STACK_USAGE -#define alloc_thread_info (tsk) ((struct thread_info *) \ - __get_free_pages(GFP_KERNEL | __GFP_ZERO, get_order(THREAD_SIZE))) -#else -#define alloc_thread_info (tsk) ((struct thread_info *) \ - __get_free_pages(GFP_KERNEL, get_order(THREAD_SIZE))) -#endif -#else /* !__ASSEMBLY__ */ /* how to get the thread information struct from ASM */
@@ -219,16 +214,6 @@ static inline struct thread_info *stack_ return ti; } -/* thread information allocation */ -#ifdef CONFIG_DEBUG_STACK_USAGE -#define THREAD_FLAGS (GFP_KERNEL | __GFP_ZERO) -#else -#define THREAD_FLAGS GFP_KERNEL -#endif - -#define alloc_thread_info (tsk) \ - ((struct thread_info *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER)) -#else /* !__ASSEMBLY__ */ /* how to get the thread information struct from ASM */
include/asm-x86/page_32.h +8 -0
@@ -13,6 +13,14 @@*/ #define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) +#ifdef CONFIG_4KSTACKS +#define THREAD_ORDER 0 +#else +#define THREAD_ORDER 1 +#endif +#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) + +#ifdef CONFIG_X86_PAE #define __PHYSICAL_MASK_SHIFT 36#define __VIRTUAL_MASK_SHIFT 32
Quoted 8 lines · Christoph Lameter
The following patchset merges the 32 and 64 bit
thread_infofiles into one.First just move the stuff into a single file and then gradually extract common code. Ends up with pretty small differences. Had some time last Saturday to play with it. Feedback/takeover appreciated.
Patch against git tree of today.
this unification looks very nicely structured. I'll throw it into the x86 testbed, lets see what happens.
Ingo