Skip to content

Commit b9d989c

Browse files
amlutoIngo Molnar
authored andcommitted
x86/asm: Move the thread_info::status field to thread_struct
Because sched.h and thread_info.h are a tangled mess, I turned in_compat_syscall() into a macro. If we had current_thread_struct() or similar and we could use it from thread_info.h, then this would be a bit cleaner. Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Jann Horn <jann@thejh.net> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/ccc8a1b2f41f9c264a41f771bb4a6539a642ad72.1473801993.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent d4b80af commit b9d989c

File tree

9 files changed

+27
-42
lines changed

9 files changed

+27
-42
lines changed

arch/x86/entry/common.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ __visible inline void prepare_exit_to_usermode(struct pt_regs *regs)
209209
* special case only applies after poking regs and before the
210210
* very next return to user mode.
211211
*/
212-
ti->status &= ~(TS_COMPAT|TS_I386_REGS_POKED);
212+
current->thread.status &= ~(TS_COMPAT|TS_I386_REGS_POKED);
213213
#endif
214214

215215
user_enter_irqoff();
@@ -307,7 +307,7 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs)
307307
unsigned int nr = (unsigned int)regs->orig_ax;
308308

309309
#ifdef CONFIG_IA32_EMULATION
310-
ti->status |= TS_COMPAT;
310+
current->thread.status |= TS_COMPAT;
311311
#endif
312312

313313
if (READ_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY) {

arch/x86/include/asm/processor.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,9 @@ struct thread_struct {
389389
unsigned short fsindex;
390390
unsigned short gsindex;
391391
#endif
392+
393+
u32 status; /* thread synchronous flags */
394+
392395
#ifdef CONFIG_X86_64
393396
unsigned long fsbase;
394397
unsigned long gsbase;
@@ -434,6 +437,15 @@ struct thread_struct {
434437
*/
435438
};
436439

440+
/*
441+
* Thread-synchronous status.
442+
*
443+
* This is different from the flags in that nobody else
444+
* ever touches our thread-synchronous status, so we don't
445+
* have to worry about atomic accesses.
446+
*/
447+
#define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/
448+
437449
/*
438450
* Set IOPL bits in EFLAGS from given mask
439451
*/

arch/x86/include/asm/syscall.h

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static inline long syscall_get_error(struct task_struct *task,
6060
* TS_COMPAT is set for 32-bit syscall entries and then
6161
* remains set until we return to user mode.
6262
*/
63-
if (task_thread_info(task)->status & (TS_COMPAT|TS_I386_REGS_POKED))
63+
if (task->thread.status & (TS_COMPAT|TS_I386_REGS_POKED))
6464
/*
6565
* Sign-extend the value so (int)-EFOO becomes (long)-EFOO
6666
* and will match correctly in comparisons.
@@ -116,7 +116,7 @@ static inline void syscall_get_arguments(struct task_struct *task,
116116
unsigned long *args)
117117
{
118118
# ifdef CONFIG_IA32_EMULATION
119-
if (task_thread_info(task)->status & TS_COMPAT)
119+
if (task->thread.status & TS_COMPAT)
120120
switch (i) {
121121
case 0:
122122
if (!n--) break;
@@ -177,7 +177,7 @@ static inline void syscall_set_arguments(struct task_struct *task,
177177
const unsigned long *args)
178178
{
179179
# ifdef CONFIG_IA32_EMULATION
180-
if (task_thread_info(task)->status & TS_COMPAT)
180+
if (task->thread.status & TS_COMPAT)
181181
switch (i) {
182182
case 0:
183183
if (!n--) break;
@@ -234,18 +234,8 @@ static inline void syscall_set_arguments(struct task_struct *task,
234234

235235
static inline int syscall_get_arch(void)
236236
{
237-
#ifdef CONFIG_IA32_EMULATION
238-
/*
239-
* TS_COMPAT is set for 32-bit syscall entry and then
240-
* remains set until we return to user mode.
241-
*
242-
* x32 tasks should be considered AUDIT_ARCH_X86_64.
243-
*/
244-
if (task_thread_info(current)->status & TS_COMPAT)
245-
return AUDIT_ARCH_I386;
246-
#endif
247-
/* Both x32 and x86_64 are considered "64-bit". */
248-
return AUDIT_ARCH_X86_64;
237+
/* x32 tasks should be considered AUDIT_ARCH_X86_64. */
238+
return in_ia32_syscall() ? AUDIT_ARCH_I386 : AUDIT_ARCH_X86_64;
249239
}
250240
#endif /* CONFIG_X86_32 */
251241

arch/x86/include/asm/thread_info.h

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ struct task_struct;
5555
struct thread_info {
5656
struct task_struct *task; /* main task structure */
5757
__u32 flags; /* low level flags */
58-
__u32 status; /* thread synchronous flags */
5958
__u32 cpu; /* current CPU */
6059
};
6160

@@ -253,31 +252,17 @@ static inline int arch_within_stack_frames(const void * const stack,
253252

254253
#endif
255254

256-
/*
257-
* Thread-synchronous status.
258-
*
259-
* This is different from the flags in that nobody else
260-
* ever touches our thread-synchronous status, so we don't
261-
* have to worry about atomic accesses.
262-
*/
263-
#define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/
264255
#ifdef CONFIG_COMPAT
265256
#define TS_I386_REGS_POKED 0x0004 /* regs poked by 32-bit ptracer */
266257
#endif
267-
268258
#ifndef __ASSEMBLY__
269259

270-
static inline bool in_ia32_syscall(void)
271-
{
272260
#ifdef CONFIG_X86_32
273-
return true;
274-
#endif
275-
#ifdef CONFIG_IA32_EMULATION
276-
if (current_thread_info()->status & TS_COMPAT)
277-
return true;
261+
#define in_ia32_syscall() true
262+
#else
263+
#define in_ia32_syscall() (IS_ENABLED(CONFIG_IA32_EMULATION) && \
264+
current->thread.status & TS_COMPAT)
278265
#endif
279-
return false;
280-
}
281266

282267
/*
283268
* Force syscall return via IRET by making it look as if there was

arch/x86/kernel/asm-offsets.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ void common(void) {
3636

3737
BLANK();
3838
OFFSET(TI_flags, thread_info, flags);
39-
OFFSET(TI_status, thread_info, status);
4039

4140
BLANK();
4241
OFFSET(TASK_addr_limit, task_struct, thread.addr_limit);

arch/x86/kernel/fpu/init.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,6 @@ static void __init fpu__init_system_ctx_switch(void)
317317
on_boot_cpu = 0;
318318

319319
WARN_ON_FPU(current->thread.fpu.fpstate_active);
320-
current_thread_info()->status = 0;
321320

322321
if (boot_cpu_has(X86_FEATURE_XSAVEOPT) && eagerfpu != DISABLE)
323322
eagerfpu = ENABLE;

arch/x86/kernel/process_64.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -510,15 +510,15 @@ void set_personality_ia32(bool x32)
510510
current->personality &= ~READ_IMPLIES_EXEC;
511511
/* in_compat_syscall() uses the presence of the x32
512512
syscall bit flag to determine compat status */
513-
current_thread_info()->status &= ~TS_COMPAT;
513+
current->thread.status &= ~TS_COMPAT;
514514
} else {
515515
set_thread_flag(TIF_IA32);
516516
clear_thread_flag(TIF_X32);
517517
if (current->mm)
518518
current->mm->context.ia32_compat = TIF_IA32;
519519
current->personality |= force_personality32;
520520
/* Prepare the first "return" to user space */
521-
current_thread_info()->status |= TS_COMPAT;
521+
current->thread.status |= TS_COMPAT;
522522
}
523523
}
524524
EXPORT_SYMBOL_GPL(set_personality_ia32);

arch/x86/kernel/ptrace.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 value)
934934
*/
935935
regs->orig_ax = value;
936936
if (syscall_get_nr(child, regs) >= 0)
937-
task_thread_info(child)->status |= TS_I386_REGS_POKED;
937+
child->thread.status |= TS_I386_REGS_POKED;
938938
break;
939939

940940
case offsetof(struct user32, regs.eflags):

arch/x86/kernel/signal.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ static inline unsigned long get_nr_restart_syscall(const struct pt_regs *regs)
783783
* than the tracee.
784784
*/
785785
#ifdef CONFIG_IA32_EMULATION
786-
if (current_thread_info()->status & (TS_COMPAT|TS_I386_REGS_POKED))
786+
if (current->thread.status & (TS_COMPAT|TS_I386_REGS_POKED))
787787
return __NR_ia32_restart_syscall;
788788
#endif
789789
#ifdef CONFIG_X86_X32_ABI

0 commit comments

Comments
 (0)