[tip:x86/asm] sched: Remove __schedule() non-standard frame annotation

2016-08-24 Thread tip-bot for Brian Gerst
Commit-ID:  01175255fd8e3e993353a779f819ec8c0c59137e
Gitweb: http://git.kernel.org/tip/01175255fd8e3e993353a779f819ec8c0c59137e
Author: Brian Gerst 
AuthorDate: Sat, 13 Aug 2016 12:38:22 -0400
Committer:  Ingo Molnar 
CommitDate: Wed, 24 Aug 2016 12:31:51 +0200

sched: Remove __schedule() non-standard frame annotation

Now that the x86 switch_to() uses the standard C calling convention,
the STACK_FRAME_NON_STANDARD() annotation is no longer needed.

Suggested-by: Josh Poimboeuf 
Signed-off-by: Brian Gerst 
Reviewed-by: Josh Poimboeuf 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1471106302-10159-8-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 kernel/sched/core.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 2a906f2..3d91b63dd 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3381,7 +3381,6 @@ static void __sched notrace __schedule(bool preempt)
 
balance_callback(rq);
 }
-STACK_FRAME_NON_STANDARD(__schedule); /* switch_to() */
 
 static inline void sched_submit_work(struct task_struct *tsk)
 {


[tip:x86/asm] sched/x86/32, kgdb: Don't use thread.ip in sleeping_thread_to_gdb_regs()

2016-08-24 Thread tip-bot for Brian Gerst
Commit-ID:  4e047aa7f267c3449b6d323510d35864829aca70
Gitweb: http://git.kernel.org/tip/4e047aa7f267c3449b6d323510d35864829aca70
Author: Brian Gerst 
AuthorDate: Sat, 13 Aug 2016 12:38:16 -0400
Committer:  Ingo Molnar 
CommitDate: Wed, 24 Aug 2016 12:27:40 +0200

sched/x86/32, kgdb: Don't use thread.ip in sleeping_thread_to_gdb_regs()

Match 64-bit and set gdb_regs[GDB_PC] to zero.  thread.ip is always the
same point in the scheduler (except for newly forked processes), and will
be removed in a future patch.

Signed-off-by: Brian Gerst 
Reviewed-by: Josh Poimboeuf 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Jason Wessel 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1471106302-10159-2-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/kernel/kgdb.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
index 04cde52..fe649a5 100644
--- a/arch/x86/kernel/kgdb.c
+++ b/arch/x86/kernel/kgdb.c
@@ -172,7 +172,6 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, 
struct task_struct *p)
gdb_regs[GDB_ES]= __KERNEL_DS;
gdb_regs[GDB_PS]= 0;
gdb_regs[GDB_CS]= __KERNEL_CS;
-   gdb_regs[GDB_PC]= p->thread.ip;
gdb_regs[GDB_SS]= __KERNEL_DS;
gdb_regs[GDB_FS]= 0x;
gdb_regs[GDB_GS]= 0x;
@@ -180,7 +179,6 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, 
struct task_struct *p)
gdb_regs32[GDB_PS]  = *(unsigned long *)(p->thread.sp + 8);
gdb_regs32[GDB_CS]  = __KERNEL_CS;
gdb_regs32[GDB_SS]  = __KERNEL_DS;
-   gdb_regs[GDB_PC]= 0;
gdb_regs[GDB_R8]= 0;
gdb_regs[GDB_R9]= 0;
gdb_regs[GDB_R10]   = 0;
@@ -190,6 +188,7 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, 
struct task_struct *p)
gdb_regs[GDB_R14]   = 0;
gdb_regs[GDB_R15]   = 0;
 #endif
+   gdb_regs[GDB_PC]= 0;
gdb_regs[GDB_SP]= p->thread.sp;
 }
 


[tip:x86/asm] sched/x86/64, kgdb: Clear GDB_PS on 64-bit

2016-08-24 Thread tip-bot for Brian Gerst
Commit-ID:  163630191ecb0dd9e4146d3c910045aba1cfeec1
Gitweb: http://git.kernel.org/tip/163630191ecb0dd9e4146d3c910045aba1cfeec1
Author: Brian Gerst 
AuthorDate: Sat, 13 Aug 2016 12:38:17 -0400
Committer:  Ingo Molnar 
CommitDate: Wed, 24 Aug 2016 12:27:40 +0200

sched/x86/64, kgdb: Clear GDB_PS on 64-bit

switch_to() no longer saves EFLAGS, so it's bogus to look for it on the
stack.  Set it to zero like 32-bit.

Signed-off-by: Brian Gerst 
Reviewed-by: Josh Poimboeuf 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Jason Wessel 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1471106302-10159-3-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/kernel/kgdb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
index fe649a5..5e3f294 100644
--- a/arch/x86/kernel/kgdb.c
+++ b/arch/x86/kernel/kgdb.c
@@ -176,7 +176,7 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, 
struct task_struct *p)
gdb_regs[GDB_FS]= 0x;
gdb_regs[GDB_GS]= 0x;
 #else
-   gdb_regs32[GDB_PS]  = *(unsigned long *)(p->thread.sp + 8);
+   gdb_regs32[GDB_PS]  = 0;
gdb_regs32[GDB_CS]  = __KERNEL_CS;
gdb_regs32[GDB_SS]  = __KERNEL_DS;
gdb_regs[GDB_R8]= 0;


[tip:x86/asm] sched/x86: Rewrite the switch_to() code

2016-08-24 Thread tip-bot for Brian Gerst
Commit-ID:  0100301bfdf56a2a370c7157b5ab0fbf9313e1cd
Gitweb: http://git.kernel.org/tip/0100301bfdf56a2a370c7157b5ab0fbf9313e1cd
Author: Brian Gerst 
AuthorDate: Sat, 13 Aug 2016 12:38:19 -0400
Committer:  Ingo Molnar 
CommitDate: Wed, 24 Aug 2016 12:31:41 +0200

sched/x86: Rewrite the switch_to() code

Move the low-level context switch code to an out-of-line asm stub instead of
using complex inline asm.  This allows constructing a new stack frame for the
child process to make it seamlessly flow to ret_from_fork without an extra
test and branch in __switch_to().  It also improves code generation for
__schedule() by using the C calling convention instead of clobbering all
registers.

Signed-off-by: Brian Gerst 
Reviewed-by: Josh Poimboeuf 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1471106302-10159-5-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/entry/entry_32.S  |  37 ++
 arch/x86/entry/entry_64.S  |  41 ++-
 arch/x86/include/asm/processor.h   |   3 -
 arch/x86/include/asm/switch_to.h   | 139 ++---
 arch/x86/include/asm/thread_info.h |   2 -
 arch/x86/kernel/asm-offsets.c  |   6 ++
 arch/x86/kernel/asm-offsets_32.c   |   5 ++
 arch/x86/kernel/asm-offsets_64.c   |   5 ++
 arch/x86/kernel/process_32.c   |   9 ++-
 arch/x86/kernel/process_64.c   |   9 ++-
 arch/x86/kernel/smpboot.c  |   1 -
 11 files changed, 125 insertions(+), 132 deletions(-)

diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index 0b5..bf8f221 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -204,6 +204,43 @@
POP_GS_EX
 .endm
 
+/*
+ * %eax: prev task
+ * %edx: next task
+ */
+ENTRY(__switch_to_asm)
+   /*
+* Save callee-saved registers
+* This must match the order in struct inactive_task_frame
+*/
+   pushl   %ebp
+   pushl   %ebx
+   pushl   %edi
+   pushl   %esi
+
+   /* switch stack */
+   movl%esp, TASK_threadsp(%eax)
+   movlTASK_threadsp(%edx), %esp
+
+#ifdef CONFIG_CC_STACKPROTECTOR
+   movlTASK_stack_canary(%edx), %ebx
+   movl%ebx, PER_CPU_VAR(stack_canary)+stack_canary_offset
+#endif
+
+   /* restore callee-saved registers */
+   popl%esi
+   popl%edi
+   popl%ebx
+   popl%ebp
+
+   jmp __switch_to
+END(__switch_to_asm)
+
+/*
+ * A newly forked process directly context switches into this address.
+ *
+ * eax: prev task we switched from
+ */
 ENTRY(ret_from_fork)
pushl   %eax
callschedule_tail
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index f6b40e5..c1af8ac 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -368,13 +368,48 @@ END(ptregs_\func)
 #include 
 
 /*
+ * %rdi: prev task
+ * %rsi: next task
+ */
+ENTRY(__switch_to_asm)
+   /*
+* Save callee-saved registers
+* This must match the order in inactive_task_frame
+*/
+   pushq   %rbp
+   pushq   %rbx
+   pushq   %r12
+   pushq   %r13
+   pushq   %r14
+   pushq   %r15
+
+   /* switch stack */
+   movq%rsp, TASK_threadsp(%rdi)
+   movqTASK_threadsp(%rsi), %rsp
+
+#ifdef CONFIG_CC_STACKPROTECTOR
+   movqTASK_stack_canary(%rsi), %rbx
+   movq%rbx, PER_CPU_VAR(irq_stack_union)+stack_canary_offset
+#endif
+
+   /* restore callee-saved registers */
+   popq%r15
+   popq%r14
+   popq%r13
+   popq%r12
+   popq%rbx
+   popq%rbp
+
+   jmp __switch_to
+END(__switch_to_asm)
+
+/*
  * A newly forked process directly context switches into this address.
  *
- * rdi: prev task we switched from
+ * rax: prev task we switched from
  */
 ENTRY(ret_from_fork)
-   LOCK ; btr $TIF_FORK, TI_flags(%r8)
-
+   movq%rax, %rdi
callschedule_tail   /* rdi: 'prev' task parameter */
 
testb   $3, CS(%rsp)/* from kernel_thread? */
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 63def95..6fee863 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -389,9 +389,6 @@ struct thread_struct {
unsigned short  fsindex;
unsigned short  gsindex;
 #endif
-#ifdef CONFIG_X86_32
-   unsigned long   ip;
-#endif
 #ifdef CONFIG_X86_64
unsigned long   fsbase;
unsigned long   gsbase;
diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h
index ec689c6..886d5ea 100644
--- a/arch/x86/include/asm/switch_to.h
+++ b/arch/x86/include/asm/switch_to.h
@@ -2,8 +2,12 @@
 #define _ASM_X86_SWITCH_TO_H
 
 struct task_struct; /* one of the stranger aspects of C forward d

[tip:x86/asm] sched/x86: Fix thread_saved_pc()

2016-08-24 Thread tip-bot for Brian Gerst
Commit-ID:  ffcb043ba524d3fbd979a9dac2c9ce8ad352000d
Gitweb: http://git.kernel.org/tip/ffcb043ba524d3fbd979a9dac2c9ce8ad352000d
Author: Brian Gerst 
AuthorDate: Sat, 13 Aug 2016 12:38:21 -0400
Committer:  Ingo Molnar 
CommitDate: Wed, 24 Aug 2016 12:31:51 +0200

sched/x86: Fix thread_saved_pc()

thread_saved_pc() was using a completely bogus method to get the return
address.  Since switch_to() was previously inlined, there was no sane way
to know where on the stack the return address was stored.  Now with the
frame of a sleeping thread well defined, this can be implemented correctly.

Signed-off-by: Brian Gerst 
Reviewed-by: Josh Poimboeuf 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1471106302-10159-7-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/processor.h | 10 ++
 arch/x86/kernel/process.c| 11 +++
 arch/x86/kernel/process_32.c |  8 
 3 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 6fee863..b22fb5a 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -721,8 +721,6 @@ static inline void spin_lock_prefetch(const void *x)
.addr_limit = KERNEL_DS,  \
 }
 
-extern unsigned long thread_saved_pc(struct task_struct *tsk);
-
 /*
  * TOP_OF_KERNEL_STACK_PADDING reserves 8 bytes on top of the ring0 stack.
  * This is necessary to guarantee that the entire "struct pt_regs"
@@ -773,17 +771,13 @@ extern unsigned long thread_saved_pc(struct task_struct 
*tsk);
.addr_limit = KERNEL_DS,\
 }
 
-/*
- * Return saved PC of a blocked thread.
- * What is this good for? it will be always the scheduler or ret_from_fork.
- */
-#define thread_saved_pc(t) READ_ONCE_NOCHECK(*(unsigned long 
*)((t)->thread.sp - 8))
-
 #define task_pt_regs(tsk)  ((struct pt_regs *)(tsk)->thread.sp0 - 1)
 extern unsigned long KSTK_ESP(struct task_struct *task);
 
 #endif /* CONFIG_X86_64 */
 
+extern unsigned long thread_saved_pc(struct task_struct *tsk);
+
 extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
   unsigned long new_sp);
 
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 0115a4a..c1fa790 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -514,6 +514,17 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)
 }
 
 /*
+ * Return saved PC of a blocked thread.
+ * What is this good for? it will be always the scheduler or ret_from_fork.
+ */
+unsigned long thread_saved_pc(struct task_struct *tsk)
+{
+   struct inactive_task_frame *frame =
+   (struct inactive_task_frame *) READ_ONCE(tsk->thread.sp);
+   return READ_ONCE_NOCHECK(frame->ret_addr);
+}
+
+/*
  * Called from fs/proc with a reference on @p to find the function
  * which called into schedule(). This needs to be done carefully
  * because the task might wake up and we might look at a stack
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
index 18714a1..404efdf 100644
--- a/arch/x86/kernel/process_32.c
+++ b/arch/x86/kernel/process_32.c
@@ -55,14 +55,6 @@
 #include 
 #include 
 
-/*
- * Return saved PC of a blocked thread.
- */
-unsigned long thread_saved_pc(struct task_struct *tsk)
-{
-   return ((unsigned long *)tsk->thread.sp)[3];
-}
-
 void __show_regs(struct pt_regs *regs, int all)
 {
unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L;


[tip:x86/asm] sched/x86: Pass kernel thread parameters in 'struct fork_frame'

2016-08-24 Thread tip-bot for Brian Gerst
Commit-ID:  616d24835eeafa8ef3466479db028abfdfc77531
Gitweb: http://git.kernel.org/tip/616d24835eeafa8ef3466479db028abfdfc77531
Author: Brian Gerst 
AuthorDate: Sat, 13 Aug 2016 12:38:20 -0400
Committer:  Ingo Molnar 
CommitDate: Wed, 24 Aug 2016 12:31:50 +0200

sched/x86: Pass kernel thread parameters in 'struct fork_frame'

Instead of setting up a fake pt_regs context, put the kernel thread
function pointer and arg into the unused callee-restored registers
of 'struct fork_frame'.

Signed-off-by: Brian Gerst 
Reviewed-by: Josh Poimboeuf 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1471106302-10159-6-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/entry/entry_32.S| 31 +++
 arch/x86/entry/entry_64.S| 37 +
 arch/x86/include/asm/switch_to.h |  2 ++
 arch/x86/kernel/process_32.c | 18 --
 arch/x86/kernel/process_64.c | 12 +++-
 5 files changed, 41 insertions(+), 59 deletions(-)

diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index bf8f221..b75a8bc 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -240,35 +240,34 @@ END(__switch_to_asm)
  * A newly forked process directly context switches into this address.
  *
  * eax: prev task we switched from
+ * ebx: kernel thread func (NULL for user thread)
+ * edi: kernel thread arg
  */
 ENTRY(ret_from_fork)
pushl   %eax
callschedule_tail
popl%eax
 
+   testl   %ebx, %ebx
+   jnz 1f  /* kernel threads are uncommon */
+
+2:
/* When we fork, we trace the syscall return in the child, too. */
movl%esp, %eax
callsyscall_return_slowpath
jmp restore_all
-END(ret_from_fork)
-
-ENTRY(ret_from_kernel_thread)
-   pushl   %eax
-   callschedule_tail
-   popl%eax
-   movlPT_EBP(%esp), %eax
-   call*PT_EBX(%esp)
-   movl$0, PT_EAX(%esp)
 
+   /* kernel thread */
+1: movl%edi, %eax
+   call*%ebx
/*
-* Kernel threads return to userspace as if returning from a syscall.
-* We should check whether anything actually uses this path and, if so,
-* consider switching it over to ret_from_fork.
+* A kernel thread is allowed to return here after successfully
+* calling do_execve().  Exit to userspace to complete the execve()
+* syscall.
 */
-   movl%esp, %eax
-   callsyscall_return_slowpath
-   jmp restore_all
-ENDPROC(ret_from_kernel_thread)
+   movl$0, PT_EAX(%esp)
+   jmp 2b
+END(ret_from_fork)
 
 /*
  * Return to user mode is not as complex as all this looks,
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index c1af8ac..c0373d6 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -407,37 +407,34 @@ END(__switch_to_asm)
  * A newly forked process directly context switches into this address.
  *
  * rax: prev task we switched from
+ * rbx: kernel thread func (NULL for user thread)
+ * r12: kernel thread arg
  */
 ENTRY(ret_from_fork)
movq%rax, %rdi
callschedule_tail   /* rdi: 'prev' task parameter */
 
-   testb   $3, CS(%rsp)/* from kernel_thread? */
-   jnz 1f
-
-   /*
-* We came from kernel_thread.  This code path is quite twisted, and
-* someone should clean it up.
-*
-* copy_thread_tls stashes the function pointer in RBX and the
-* parameter to be passed in RBP.  The called function is permitted
-* to call do_execve and thereby jump to user mode.
-*/
-   movqRBP(%rsp), %rdi
-   call*RBX(%rsp)
-   movl$0, RAX(%rsp)
-
-   /*
-* Fall through as though we're exiting a syscall.  This makes a
-* twisted sort of sense if we just called do_execve.
-*/
+   testq   %rbx, %rbx  /* from kernel_thread? */
+   jnz 1f  /* kernel threads are uncommon 
*/
 
-1:
+2:
movq%rsp, %rdi
callsyscall_return_slowpath /* returns with IRQs disabled */
TRACE_IRQS_ON   /* user mode is traced as IRQS on */
SWAPGS
jmp restore_regs_and_iret
+
+1:
+   /* kernel thread */
+   movq%r12, %rdi
+   call*%rbx
+   /*
+* A kernel thread is allowed to return here after successfully
+* calling do_execve().  Exit to userspace to complete the execve()
+* syscall.
+*/
+   movq$0, RAX(%rsp)
+   jmp 2b
 END(ret_from_fork)
 
 /*
diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h
index 886d5ea..5cb436a 100644
--- a/a

[tip:x86/asm] sched/x86: Add 'struct inactive_task_frame' to better document the sleeping task stack frame

2016-08-24 Thread tip-bot for Brian Gerst
Commit-ID:  7b32aeadbc95d4a41402c1c0da6aa3ab51af4c10
Gitweb: http://git.kernel.org/tip/7b32aeadbc95d4a41402c1c0da6aa3ab51af4c10
Author: Brian Gerst 
AuthorDate: Sat, 13 Aug 2016 12:38:18 -0400
Committer:  Ingo Molnar 
CommitDate: Wed, 24 Aug 2016 12:27:41 +0200

sched/x86: Add 'struct inactive_task_frame' to better document the sleeping 
task stack frame

Add 'struct inactive_task_frame', which defines the layout of the stack for
a sleeping process.  For now, the only defined field is the BP register
(frame pointer).

Signed-off-by: Brian Gerst 
Reviewed-by: Josh Poimboeuf 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1471106302-10159-4-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/stacktrace.h | 4 ++--
 arch/x86/include/asm/switch_to.h  | 5 +
 arch/x86/kernel/kgdb.c| 3 ++-
 arch/x86/kernel/process.c | 3 ++-
 4 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/stacktrace.h 
b/arch/x86/include/asm/stacktrace.h
index 0944218..7646fb2 100644
--- a/arch/x86/include/asm/stacktrace.h
+++ b/arch/x86/include/asm/stacktrace.h
@@ -8,6 +8,7 @@
 
 #include 
 #include 
+#include 
 
 extern int kstack_depth_to_print;
 
@@ -70,8 +71,7 @@ stack_frame(struct task_struct *task, struct pt_regs *regs)
return bp;
}
 
-   /* bp is the last reg pushed by switch_to */
-   return *(unsigned long *)task->thread.sp;
+   return ((struct inactive_task_frame *)task->thread.sp)->bp;
 }
 #else
 static inline unsigned long
diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h
index 14e4b20..ec689c6 100644
--- a/arch/x86/include/asm/switch_to.h
+++ b/arch/x86/include/asm/switch_to.h
@@ -30,6 +30,11 @@ static inline void prepare_switch_to(struct task_struct 
*prev,
 #endif
 }
 
+/* data that is pointed to by thread.sp */
+struct inactive_task_frame {
+   unsigned long bp;
+};
+
 #ifdef CONFIG_X86_32
 
 #ifdef CONFIG_CC_STACKPROTECTOR
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
index 5e3f294..8e36f24 100644
--- a/arch/x86/kernel/kgdb.c
+++ b/arch/x86/kernel/kgdb.c
@@ -50,6 +50,7 @@
 #include 
 #include 
 #include 
+#include 
 
 struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] =
 {
@@ -166,7 +167,7 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, 
struct task_struct *p)
gdb_regs[GDB_DX]= 0;
gdb_regs[GDB_SI]= 0;
gdb_regs[GDB_DI]= 0;
-   gdb_regs[GDB_BP]= *(unsigned long *)p->thread.sp;
+   gdb_regs[GDB_BP]= ((struct inactive_task_frame 
*)p->thread.sp)->bp;
 #ifdef CONFIG_X86_32
gdb_regs[GDB_DS]= __KERNEL_DS;
gdb_regs[GDB_ES]= __KERNEL_DS;
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 62c0b0e..0115a4a 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -32,6 +32,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /*
  * per-CPU TSS segments. Threads are completely 'soft' on Linux,
@@ -556,7 +557,7 @@ unsigned long get_wchan(struct task_struct *p)
if (sp < bottom || sp > top)
return 0;
 
-   fp = READ_ONCE_NOCHECK(*(unsigned long *)sp);
+   fp = READ_ONCE_NOCHECK(((struct inactive_task_frame *)sp)->bp);
do {
if (fp < bottom || fp > top)
return 0;


[tip:x86/asm] x86/entry/32: Remove GET_THREAD_INFO() from entry code

2016-05-05 Thread tip-bot for Brian Gerst
Commit-ID:  1e17880371f85d3d866962e04ba3567c0654a125
Gitweb: http://git.kernel.org/tip/1e17880371f85d3d866962e04ba3567c0654a125
Author: Brian Gerst 
AuthorDate: Wed, 4 May 2016 22:44:37 -0400
Committer:  Ingo Molnar 
CommitDate: Thu, 5 May 2016 08:37:30 +0200

x86/entry/32: Remove GET_THREAD_INFO() from entry code

The entry code used to cache the thread_info pointer in the EBP register,
but all the code that used it has been moved to C.  Remove the unused
code to get the pointer.

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1462416278-11974-3-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/entry/entry_32.S | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index c84d99b..983e5d3 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -207,7 +207,6 @@
 ENTRY(ret_from_fork)
pushl   %eax
callschedule_tail
-   GET_THREAD_INFO(%ebp)
popl%eax
 
/* When we fork, we trace the syscall return in the child, too. */
@@ -219,7 +218,6 @@ END(ret_from_fork)
 ENTRY(ret_from_kernel_thread)
pushl   %eax
callschedule_tail
-   GET_THREAD_INFO(%ebp)
popl%eax
movlPT_EBP(%esp), %eax
call*PT_EBX(%esp)
@@ -247,7 +245,6 @@ ENDPROC(ret_from_kernel_thread)
 ret_from_exception:
preempt_stop(CLBR_ANY)
 ret_from_intr:
-   GET_THREAD_INFO(%ebp)
 #ifdef CONFIG_VM86
movlPT_EFLAGS(%esp), %eax   # mix EFLAGS and CS
movbPT_CS(%esp), %al


[tip:x86/asm] x86/entry/32: Remove asmlinkage_protect()

2016-05-05 Thread tip-bot for Brian Gerst
Commit-ID:  0676b4e0a1940a6b7ae3156bd212ca9032a29c30
Gitweb: http://git.kernel.org/tip/0676b4e0a1940a6b7ae3156bd212ca9032a29c30
Author: Brian Gerst 
AuthorDate: Wed, 4 May 2016 22:44:38 -0400
Committer:  Ingo Molnar 
CommitDate: Thu, 5 May 2016 08:37:31 +0200

x86/entry/32: Remove asmlinkage_protect()

Now that syscalls are called from C code, which copies the args to
new stack slots instead of overlaying pt_regs, asmlinkage_protect()
is no longer needed.

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1462416278-11974-4-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/linkage.h | 34 --
 1 file changed, 34 deletions(-)

diff --git a/arch/x86/include/asm/linkage.h b/arch/x86/include/asm/linkage.h
index 79327e9..0ccb26d 100644
--- a/arch/x86/include/asm/linkage.h
+++ b/arch/x86/include/asm/linkage.h
@@ -8,40 +8,6 @@
 
 #ifdef CONFIG_X86_32
 #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
-
-/*
- * Make sure the compiler doesn't do anything stupid with the
- * arguments on the stack - they are owned by the *caller*, not
- * the callee. This just fools gcc into not spilling into them,
- * and keeps it from doing tailcall recursion and/or using the
- * stack slots for temporaries, since they are live and "used"
- * all the way to the end of the function.
- *
- * NOTE! On x86-64, all the arguments are in registers, so this
- * only matters on a 32-bit kernel.
- */
-#define asmlinkage_protect(n, ret, args...) \
-   __asmlinkage_protect##n(ret, ##args)
-#define __asmlinkage_protect_n(ret, args...) \
-   __asm__ __volatile__ ("" : "=r" (ret) : "0" (ret), ##args)
-#define __asmlinkage_protect0(ret) \
-   __asmlinkage_protect_n(ret)
-#define __asmlinkage_protect1(ret, arg1) \
-   __asmlinkage_protect_n(ret, "m" (arg1))
-#define __asmlinkage_protect2(ret, arg1, arg2) \
-   __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2))
-#define __asmlinkage_protect3(ret, arg1, arg2, arg3) \
-   __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3))
-#define __asmlinkage_protect4(ret, arg1, arg2, arg3, arg4) \
-   __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \
- "m" (arg4))
-#define __asmlinkage_protect5(ret, arg1, arg2, arg3, arg4, arg5) \
-   __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \
- "m" (arg4), "m" (arg5))
-#define __asmlinkage_protect6(ret, arg1, arg2, arg3, arg4, arg5, arg6) \
-   __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \
- "m" (arg4), "m" (arg5), "m" (arg6))
-
 #endif /* CONFIG_X86_32 */
 
 #ifdef __ASSEMBLY__


[tip:x86/asm] x86/entry, sched/x86: Don't save/restore EFLAGS on task switch

2016-05-05 Thread tip-bot for Brian Gerst
Commit-ID:  092c74e420952c7cb68141731f2b562245b51eeb
Gitweb: http://git.kernel.org/tip/092c74e420952c7cb68141731f2b562245b51eeb
Author: Brian Gerst 
AuthorDate: Wed, 4 May 2016 22:44:36 -0400
Committer:  Ingo Molnar 
CommitDate: Thu, 5 May 2016 08:37:30 +0200

x86/entry, sched/x86: Don't save/restore EFLAGS on task switch

Now that NT is filtered by the SYSENTER entry code, it is safe to skip saving 
and
restoring flags on task switch.  Also remove a leftover reset of flags on 64-bit
fork.

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1462416278-11974-2-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/entry/entry_32.S| 4 
 arch/x86/entry/entry_64.S| 3 ---
 arch/x86/include/asm/switch_to.h | 4 +---
 3 files changed, 1 insertion(+), 10 deletions(-)

diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index 10868aa..c84d99b 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -209,8 +209,6 @@ ENTRY(ret_from_fork)
callschedule_tail
GET_THREAD_INFO(%ebp)
popl%eax
-   pushl   $0x0202 # Reset kernel eflags
-   popfl
 
/* When we fork, we trace the syscall return in the child, too. */
movl%esp, %eax
@@ -223,8 +221,6 @@ ENTRY(ret_from_kernel_thread)
callschedule_tail
GET_THREAD_INFO(%ebp)
popl%eax
-   pushl   $0x0202 # Reset kernel eflags
-   popfl
movlPT_EBP(%esp), %eax
call*PT_EBX(%esp)
movl$0, PT_EAX(%esp)
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index 6344629..9ee0da1 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -372,9 +372,6 @@ END(ptregs_\func)
 ENTRY(ret_from_fork)
LOCK ; btr $TIF_FORK, TI_flags(%r8)
 
-   pushq   $0x0002
-   popfq   /* reset kernel eflags */
-
callschedule_tail   /* rdi: 'prev' task parameter */
 
testb   $3, CS(%rsp)/* from kernel_thread? */
diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h
index 751bf4b..8f321a1 100644
--- a/arch/x86/include/asm/switch_to.h
+++ b/arch/x86/include/asm/switch_to.h
@@ -39,8 +39,7 @@ do {  
\
 */ \
unsigned long ebx, ecx, edx, esi, edi;  \
\
-   asm volatile("pushfl\n\t"   /* saveflags */ \
-"pushl %%ebp\n\t"  /* saveEBP   */ \
+   asm volatile("pushl %%ebp\n\t"  /* saveEBP   */ \
 "movl %%esp,%[prev_sp]\n\t"/* saveESP   */ \
 "movl %[next_sp],%%esp\n\t"/* restore ESP   */ \
 "movl $1f,%[prev_ip]\n\t"  /* saveEIP   */ \
@@ -49,7 +48,6 @@ do {  
\
 "jmp __switch_to\n"/* regparm call  */ \
 "1:\t" \
 "popl %%ebp\n\t"   /* restore EBP   */ \
-"popfl\n"  /* restore flags */ \
\
 /* output parameters */\
 : [prev_sp] "=m" (prev->thread.sp),\


[tip:x86/asm] x86/alternatives: Discard dynamic check after init

2016-01-30 Thread tip-bot for Brian Gerst
Commit-ID:  2476f2fa20568bd5d9e09cd35bcd73e99a6f4cc6
Gitweb: http://git.kernel.org/tip/2476f2fa20568bd5d9e09cd35bcd73e99a6f4cc6
Author: Brian Gerst 
AuthorDate: Wed, 27 Jan 2016 09:45:25 +0100
Committer:  Ingo Molnar 
CommitDate: Sat, 30 Jan 2016 11:22:22 +0100

x86/alternatives: Discard dynamic check after init

Move the code to do the dynamic check to the altinstr_aux
section so that it is discarded after alternatives have run and
a static branch has been chosen.

This way we're changing the dynamic branch from C code to
assembly, which makes it *substantially* smaller while avoiding
a completely unnecessary call to an out of line function.

Signed-off-by: Brian Gerst 
[ Changed it to do TESTB, as hpa suggested. ]
Signed-off-by: Borislav Petkov 
Cc: Andrew Morton 
Cc: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Boris Ostrovsky 
Cc: Borislav Petkov 
Cc: Dave Young 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Kristen Carlson Accardi 
Cc: Laura Abbott 
Cc: Linus Torvalds 
Cc: Peter Zijlstra (Intel) 
Cc: Peter Zijlstra 
Cc: Prarit Bhargava 
Cc: Ross Zwisler 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1452972124-7380-1-git-send-email-brge...@gmail.com
Link: http://lkml.kernel.org/r/20160127084525.gc30...@pd.tnic
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/cpufeature.h | 19 ---
 arch/x86/kernel/cpu/common.c  |  6 --
 2 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/arch/x86/include/asm/cpufeature.h 
b/arch/x86/include/asm/cpufeature.h
index 9048c1b..9fba7a5 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -130,8 +130,6 @@ extern const char * const x86_bug_flags[NBUGINTS*32];
  */
 
 #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_X86_FAST_FEATURE_TESTS)
-extern bool __static_cpu_has(u16 bit);
-
 /*
  * Static testing of CPU features.  Used the same as boot_cpu_has().
  * These will statically patch the target code for additional
@@ -139,7 +137,7 @@ extern bool __static_cpu_has(u16 bit);
  */
 static __always_inline __pure bool _static_cpu_has(u16 bit)
 {
-   asm_volatile_goto("1: jmp %l[t_dynamic]\n"
+   asm_volatile_goto("1: jmp 6f\n"
 "2:\n"
 ".skip -(((5f-4f) - (2b-1b)) > 0) * "
 "((5f-4f) - (2b-1b)),0x90\n"
@@ -164,13 +162,20 @@ static __always_inline __pure bool _static_cpu_has(u16 
bit)
 " .byte 0\n"   /* repl len */
 " .byte 0\n"   /* pad len */
 ".previous\n"
-: : "i" (bit), "i" (X86_FEATURE_ALWAYS)
-: : t_dynamic, t_no);
+".section .altinstr_aux,\"ax\"\n"
+"6:\n"
+" testb %[bitnum],%[cap_byte]\n"
+" jnz %l[t_yes]\n"
+" jmp %l[t_no]\n"
+".previous\n"
+: : "i" (bit), "i" (X86_FEATURE_ALWAYS),
+[bitnum] "i" (1 << (bit & 7)),
+[cap_byte] "m" (((const char 
*)boot_cpu_data.x86_capability)[bit >> 3])
+: : t_yes, t_no);
+   t_yes:
return true;
t_no:
return false;
-   t_dynamic:
-   return __static_cpu_has(bit);
 }
 
 #define static_cpu_has(bit)\
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index ee49981..079d83f 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1475,12 +1475,6 @@ void cpu_init(void)
 }
 #endif
 
-inline bool __static_cpu_has(u16 bit)
-{
-   return boot_cpu_has(bit);
-}
-EXPORT_SYMBOL_GPL(__static_cpu_has);
-
 static void bsp_resume(void)
 {
if (this_cpu->c_bsp_resume)


[tip:x86/asm] x86/vm86: Move fields from ' struct kernel_vm86_struct' to 'struct vm86'

2015-07-31 Thread tip-bot for Brian Gerst
Commit-ID:  d4ce0f26c790af8e829d3fad0a6787f40f98e24f
Gitweb: http://git.kernel.org/tip/d4ce0f26c790af8e829d3fad0a6787f40f98e24f
Author: Brian Gerst 
AuthorDate: Wed, 29 Jul 2015 01:41:17 -0400
Committer:  Ingo Molnar 
CommitDate: Fri, 31 Jul 2015 13:31:08 +0200

x86/vm86: Move fields from 'struct kernel_vm86_struct' to 'struct vm86'

Move the non-regs fields to the off-stack data.

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1438148483-11932-3-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/vm86.h | 16 
 arch/x86/kernel/vm86_32.c   | 42 ++
 2 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/arch/x86/include/asm/vm86.h b/arch/x86/include/asm/vm86.h
index 20b43b7..47c7648 100644
--- a/arch/x86/include/asm/vm86.h
+++ b/arch/x86/include/asm/vm86.h
@@ -37,13 +37,7 @@ struct kernel_vm86_struct {
  * Therefore, pt_regs in fact points to a complete 'kernel_vm86_struct'
  * in kernelspace, hence we need not reget the data from userspace.
  */
-#define VM86_TSS_ESP0 flags
-   unsigned long flags;
-   unsigned long screen_bitmap;
-   unsigned long cpu_type;
-   struct revectored_struct int_revectored;
-   struct revectored_struct int21_revectored;
-   struct vm86plus_info_struct vm86plus;
+#define VM86_TSS_ESP0 regs32
struct pt_regs *regs32;   /* here we save the pointer to the old regs */
 /*
  * The below is not part of the structure, but the stack layout continues
@@ -59,10 +53,16 @@ struct kernel_vm86_struct {
 
 struct vm86 {
struct vm86plus_struct __user *vm86_info;
-   unsigned long screen_bitmap;
unsigned long v86flags;
unsigned long v86mask;
unsigned long saved_sp0;
+
+   unsigned long flags;
+   unsigned long screen_bitmap;
+   unsigned long cpu_type;
+   struct revectored_struct int_revectored;
+   struct revectored_struct int21_revectored;
+   struct vm86plus_info_struct vm86plus;
 };
 
 #ifdef CONFIG_VM86
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index bfa59b1..f71b4b9 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -68,7 +68,6 @@
 
 
 #define KVM86  ((struct kernel_vm86_struct *)regs)
-#define VMPI   KVM86->vm86plus
 
 
 /*
@@ -114,7 +113,7 @@ struct pt_regs *save_v86_state(struct kernel_vm86_regs 
*regs)
set_flags(regs->pt.flags, VEFLAGS, X86_EFLAGS_VIF | vm86->v86mask);
user = vm86->vm86_info;
 
-   if (!access_ok(VERIFY_WRITE, user, VMPI.is_vm86pus ?
+   if (!access_ok(VERIFY_WRITE, user, vm86->vm86plus.is_vm86pus ?
   sizeof(struct vm86plus_struct) :
   sizeof(struct vm86_struct))) {
pr_alert("could not access userspace vm86_info\n");
@@ -282,25 +281,27 @@ static long do_sys_vm86(struct vm86plus_struct __user 
*v86, bool plus,
get_user_ex(info->regs.fs, &v86->regs.fs);
get_user_ex(info->regs.gs, &v86->regs.gs);
 
-   get_user_ex(info->flags, &v86->flags);
-   get_user_ex(info->screen_bitmap, &v86->screen_bitmap);
-   get_user_ex(info->cpu_type, &v86->cpu_type);
+   get_user_ex(vm86->flags, &v86->flags);
+   get_user_ex(vm86->screen_bitmap, &v86->screen_bitmap);
+   get_user_ex(vm86->cpu_type, &v86->cpu_type);
} get_user_catch(err);
if (err)
return err;
 
-   if (copy_from_user(&info->int_revectored, &v86->int_revectored,
+   if (copy_from_user(&vm86->int_revectored, &v86->int_revectored,
   sizeof(struct revectored_struct)))
return -EFAULT;
-   if (copy_from_user(&info->int21_revectored, &v86->int21_revectored,
+   if (copy_from_user(&vm86->int21_revectored, &v86->int21_revectored,
   sizeof(struct revectored_struct)))
return -EFAULT;
if (plus) {
-   if (copy_from_user(&info->vm86plus, &v86->vm86plus,
+   if (copy_from_user(&vm86->vm86plus, &v86->vm86plus,
   sizeof(struct vm86plus_info_struct)))
return -EFAULT;
-   info->vm86plus.is_vm86pus = 1;
-   }
+   vm86->vm86plus.is_vm86pus = 1;
+   } else
+   memset(&vm86->vm86plus, 0,
+  sizeof(struct vm86plus_info_struct));
 
info->regs32 = current_pt_regs();
vm86->vm86_info = v86;
@@ -317,7 +318,7 @@ static long do_sys_vm86(struct vm86plus_struct __user *v86, 
bool plus,
 
info->regs.pt.orig_ax = info->regs32->orig_ax;
 
-   switch (info->cpu_type) {
+   switch (vm86->cpu_type) {
case CPU_286:
vm86->v86mask

[tip:x86/asm] x86/vm86: Eliminate 'struct kernel_vm86_struct'

2015-07-31 Thread tip-bot for Brian Gerst
Commit-ID:  90c6085a248f8f964588617f51329688bcc9f2bc
Gitweb: http://git.kernel.org/tip/90c6085a248f8f964588617f51329688bcc9f2bc
Author: Brian Gerst 
AuthorDate: Wed, 29 Jul 2015 01:41:18 -0400
Committer:  Ingo Molnar 
CommitDate: Fri, 31 Jul 2015 13:31:08 +0200

x86/vm86: Eliminate 'struct kernel_vm86_struct'

Now there is no vm86-specific data left on the kernel stack
while in userspace, except for the 32-bit regs.

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1438148483-11932-4-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/vm86.h | 25 +---
 arch/x86/kernel/vm86_32.c   | 95 +++--
 2 files changed, 42 insertions(+), 78 deletions(-)

diff --git a/arch/x86/include/asm/vm86.h b/arch/x86/include/asm/vm86.h
index 47c7648..226d6c1 100644
--- a/arch/x86/include/asm/vm86.h
+++ b/arch/x86/include/asm/vm86.h
@@ -27,32 +27,9 @@ struct kernel_vm86_regs {
unsigned short gs, __gsh;
 };
 
-struct kernel_vm86_struct {
-   struct kernel_vm86_regs regs;
-/*
- * the below part remains on the kernel stack while we are in VM86 mode.
- * 'tss.esp0' then contains the address of VM86_TSS_ESP0 below, and when we
- * get forced back from VM86, the CPU and "SAVE_ALL" will restore the above
- * 'struct kernel_vm86_regs' with the then actual values.
- * Therefore, pt_regs in fact points to a complete 'kernel_vm86_struct'
- * in kernelspace, hence we need not reget the data from userspace.
- */
-#define VM86_TSS_ESP0 regs32
-   struct pt_regs *regs32;   /* here we save the pointer to the old regs */
-/*
- * The below is not part of the structure, but the stack layout continues
- * this way. In front of 'return-eip' may be some data, depending on
- * compilation, so we don't rely on this and save the pointer to 'oldregs'
- * in 'regs32' above.
- * However, with GCC-2.7.2 and the current CFLAGS you see exactly this:
-
-   long return-eip;from call to vm86()
-   struct pt_regs oldregs;  user space registers as saved by syscall
- */
-};
-
 struct vm86 {
struct vm86plus_struct __user *vm86_info;
+   struct pt_regs *regs32;
unsigned long v86flags;
unsigned long v86mask;
unsigned long saved_sp0;
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index f71b4b9..696ef76 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -67,9 +67,6 @@
  */
 
 
-#define KVM86  ((struct kernel_vm86_struct *)regs)
-
-
 /*
  * 8- and 16-bit register defines..
  */
@@ -152,7 +149,7 @@ struct pt_regs *save_v86_state(struct kernel_vm86_regs 
*regs)
vm86->saved_sp0 = 0;
put_cpu();
 
-   ret = KVM86->regs32;
+   ret = vm86->regs32;
 
lazy_load_gs(ret->gs);
 
@@ -194,29 +191,16 @@ out:
 
 
 static int do_vm86_irq_handling(int subfunction, int irqnumber);
-static long do_sys_vm86(struct vm86plus_struct __user *v86, bool plus,
-   struct kernel_vm86_struct *info);
+static long do_sys_vm86(struct vm86plus_struct __user *v86, bool plus);
 
 SYSCALL_DEFINE1(vm86old, struct vm86_struct __user *, v86)
 {
-   struct kernel_vm86_struct info; /* declare this _on top_,
-* this avoids wasting of stack space.
-* This remains on the stack until we
-* return to 32 bit user space.
-*/
-
-   return do_sys_vm86((struct vm86plus_struct __user *) v86, false, &info);
+   return do_sys_vm86((struct vm86plus_struct __user *) v86, false);
 }
 
 
 SYSCALL_DEFINE2(vm86, unsigned long, cmd, unsigned long, arg)
 {
-   struct kernel_vm86_struct info; /* declare this _on top_,
-* this avoids wasting of stack space.
-* This remains on the stack until we
-* return to 32 bit user space.
-*/
-
switch (cmd) {
case VM86_REQUEST_IRQ:
case VM86_FREE_IRQ:
@@ -234,16 +218,17 @@ SYSCALL_DEFINE2(vm86, unsigned long, cmd, unsigned long, 
arg)
}
 
/* we come here only for functions VM86_ENTER, VM86_ENTER_NO_BYPASS */
-   return do_sys_vm86((struct vm86plus_struct __user *) arg, true, &info);
+   return do_sys_vm86((struct vm86plus_struct __user *) arg, true);
 }
 
 
-static long do_sys_vm86(struct vm86plus_struct __user *v86, bool plus,
-   struct kernel_vm86_struct *info)
+static long do_sys_vm86(struct vm86plus_struct __user *v86, bool plus)
 {
struct tss_struct *tss;
struct task_struct *tsk = current;
struct vm86 *vm86 = tsk->thread.vm86;
+   struct kerne

[tip:x86/asm] x86/vm86: Clean up vm86.h includes

2015-07-31 Thread tip-bot for Brian Gerst
Commit-ID:  ba3e127ec105e790eeec4034d9769e018e4a1b54
Gitweb: http://git.kernel.org/tip/ba3e127ec105e790eeec4034d9769e018e4a1b54
Author: Brian Gerst 
AuthorDate: Wed, 29 Jul 2015 01:41:21 -0400
Committer:  Ingo Molnar 
CommitDate: Fri, 31 Jul 2015 13:31:10 +0200

x86/vm86: Clean up vm86.h includes

vm86.h was being implicitly included in alot of places via
processor.h, which in turn got it from math_emu.h.  Break that
chain and explicitly include vm86.h in all files that need it.
Also remove unused vm86 field from math_emu_info.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1438148483-11932-7-git-send-email-brge...@gmail.com
[ Fixed build failure. ]
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/math_emu.h | 6 +-
 arch/x86/include/asm/syscalls.h | 1 +
 arch/x86/kernel/process_32.c| 1 +
 arch/x86/kernel/signal.c| 1 +
 arch/x86/kernel/traps.c | 1 +
 arch/x86/kernel/vm86_32.c   | 1 +
 arch/x86/math-emu/get_address.c | 1 +
 arch/x86/mm/fault.c | 1 +
 drivers/scsi/dpt_i2o.c  | 3 +++
 9 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/arch/x86/include/asm/math_emu.h b/arch/x86/include/asm/math_emu.h
index 031f626..0d9b14f 100644
--- a/arch/x86/include/asm/math_emu.h
+++ b/arch/x86/include/asm/math_emu.h
@@ -2,7 +2,6 @@
 #define _ASM_X86_MATH_EMU_H
 
 #include 
-#include 
 
 /* This structure matches the layout of the data saved to the stack
following a device-not-present interrupt, part of it saved
@@ -10,9 +9,6 @@
*/
 struct math_emu_info {
long ___orig_eip;
-   union {
-   struct pt_regs *regs;
-   struct kernel_vm86_regs *vm86;
-   };
+   struct pt_regs *regs;
 };
 #endif /* _ASM_X86_MATH_EMU_H */
diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h
index 592a6a6..91dfcaf 100644
--- a/arch/x86/include/asm/syscalls.h
+++ b/arch/x86/include/asm/syscalls.h
@@ -37,6 +37,7 @@ asmlinkage long sys_get_thread_area(struct user_desc __user 
*);
 asmlinkage unsigned long sys_sigreturn(void);
 
 /* kernel/vm86_32.c */
+struct vm86_struct;
 asmlinkage long sys_vm86old(struct vm86_struct __user *);
 asmlinkage long sys_vm86(unsigned long, unsigned long);
 
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
index f73c962..c13df2c 100644
--- a/arch/x86/kernel/process_32.c
+++ b/arch/x86/kernel/process_32.c
@@ -53,6 +53,7 @@
 #include 
 #include 
 #include 
+#include 
 
 asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
 asmlinkage void ret_from_kernel_thread(void) __asm__("ret_from_kernel_thread");
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index bfd736e..07eb844 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -31,6 +31,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #ifdef CONFIG_X86_64
 #include 
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 8e65d8a..86a82ea 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -62,6 +62,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #ifdef CONFIG_X86_64
 #include 
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index ffe98ec..0de1f66 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -51,6 +51,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /*
  * Known problems:
diff --git a/arch/x86/math-emu/get_address.c b/arch/x86/math-emu/get_address.c
index 6ef5e99..a2eefb1 100644
--- a/arch/x86/math-emu/get_address.c
+++ b/arch/x86/math-emu/get_address.c
@@ -21,6 +21,7 @@
 
 #include 
 #include 
+#include 
 
 #include "fpu_system.h"
 #include "exception.h"
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 34a368d..eef44d9 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -20,6 +20,7 @@
 #include  /* kmemcheck_*(), ...   */
 #include /* VSYSCALL_ADDR
*/
 #include   /* emulate_vsyscall */
+#include   /* struct vm86  */
 
 #define CREATE_TRACE_POINTS
 #include 
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
index f35ed53..d4cda5e 100644
--- a/drivers/scsi/dpt_i2o.c
+++ b/drivers/scsi/dpt_i2o.c
@@ -1924,6 +1924,9 @@ static void adpt_alpha_info(sysInfo_S* si)
 #endif
 
 #if defined __i386__
+
+#include 
+
 static void adpt_i386_info(sysInfo_S* si)
 {
// This is all the info we need for now
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/vm86: Rename vm86->v86flags and v86mask

2015-07-31 Thread tip-bot for Brian Gerst
Commit-ID:  decd275e62d5eef4b947fab89652fa6afdadf2f2
Gitweb: http://git.kernel.org/tip/decd275e62d5eef4b947fab89652fa6afdadf2f2
Author: Brian Gerst 
AuthorDate: Wed, 29 Jul 2015 01:41:23 -0400
Committer:  Ingo Molnar 
CommitDate: Fri, 31 Jul 2015 13:31:11 +0200

x86/vm86: Rename vm86->v86flags and v86mask

Rename v86flags to veflags, and v86mask to veflags_mask.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1438148483-11932-9-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/vm86.h |  4 ++--
 arch/x86/kernel/vm86_32.c   | 20 ++--
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/arch/x86/include/asm/vm86.h b/arch/x86/include/asm/vm86.h
index c93ae73..1e491f3 100644
--- a/arch/x86/include/asm/vm86.h
+++ b/arch/x86/include/asm/vm86.h
@@ -30,8 +30,8 @@ struct kernel_vm86_regs {
 struct vm86 {
struct vm86plus_struct __user *user_vm86;
struct pt_regs regs32;
-   unsigned long v86flags;
-   unsigned long v86mask;
+   unsigned long veflags;
+   unsigned long veflags_mask;
unsigned long saved_sp0;
 
unsigned long flags;
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index 52aa33e..abd8b856 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -80,8 +80,8 @@
 /*
  * virtual flags (16 and 32-bit versions)
  */
-#define VFLAGS (*(unsigned short *)&(current->thread.vm86->v86flags))
-#define VEFLAGS(current->thread.vm86->v86flags)
+#define VFLAGS (*(unsigned short *)&(current->thread.vm86->veflags))
+#define VEFLAGS(current->thread.vm86->veflags)
 
 #define set_flags(X, new, mask) \
 ((X) = ((X) & ~(mask)) | ((new) & (mask)))
@@ -108,7 +108,7 @@ void save_v86_state(struct kernel_vm86_regs *regs, int 
retval)
pr_alert("no user_vm86: BAD\n");
do_exit(SIGSEGV);
}
-   set_flags(regs->pt.flags, VEFLAGS, X86_EFLAGS_VIF | vm86->v86mask);
+   set_flags(regs->pt.flags, VEFLAGS, X86_EFLAGS_VIF | vm86->veflags_mask);
user = vm86->user_vm86;
 
if (!access_ok(VERIFY_WRITE, user, vm86->vm86plus.is_vm86pus ?
@@ -308,16 +308,16 @@ static long do_sys_vm86(struct vm86plus_struct __user 
*user_vm86, bool plus)
 
switch (vm86->cpu_type) {
case CPU_286:
-   vm86->v86mask = 0;
+   vm86->veflags_mask = 0;
break;
case CPU_386:
-   vm86->v86mask = X86_EFLAGS_NT | X86_EFLAGS_IOPL;
+   vm86->veflags_mask = X86_EFLAGS_NT | X86_EFLAGS_IOPL;
break;
case CPU_486:
-   vm86->v86mask = X86_EFLAGS_AC | X86_EFLAGS_NT | X86_EFLAGS_IOPL;
+   vm86->veflags_mask = X86_EFLAGS_AC | X86_EFLAGS_NT | 
X86_EFLAGS_IOPL;
break;
default:
-   vm86->v86mask = X86_EFLAGS_ID | X86_EFLAGS_AC | X86_EFLAGS_NT | 
X86_EFLAGS_IOPL;
+   vm86->veflags_mask = X86_EFLAGS_ID | X86_EFLAGS_AC | 
X86_EFLAGS_NT | X86_EFLAGS_IOPL;
break;
}
 
@@ -377,7 +377,7 @@ static inline void clear_AC(struct kernel_vm86_regs *regs)
 
 static inline void set_vflags_long(unsigned long flags, struct 
kernel_vm86_regs *regs)
 {
-   set_flags(VEFLAGS, flags, current->thread.vm86->v86mask);
+   set_flags(VEFLAGS, flags, current->thread.vm86->veflags_mask);
set_flags(regs->pt.flags, flags, SAFE_MASK);
if (flags & X86_EFLAGS_IF)
set_IF(regs);
@@ -387,7 +387,7 @@ static inline void set_vflags_long(unsigned long flags, 
struct kernel_vm86_regs
 
 static inline void set_vflags_short(unsigned short flags, struct 
kernel_vm86_regs *regs)
 {
-   set_flags(VFLAGS, flags, current->thread.vm86->v86mask);
+   set_flags(VFLAGS, flags, current->thread.vm86->veflags_mask);
set_flags(regs->pt.flags, flags, SAFE_MASK);
if (flags & X86_EFLAGS_IF)
set_IF(regs);
@@ -402,7 +402,7 @@ static inline unsigned long get_vflags(struct 
kernel_vm86_regs *regs)
if (VEFLAGS & X86_EFLAGS_VIF)
flags |= X86_EFLAGS_IF;
flags |= X86_EFLAGS_IOPL;
-   return flags | (VEFLAGS & current->thread.vm86->v86mask);
+   return flags | (VEFLAGS & current->thread.vm86->veflags_mask);
 }
 
 static inline int is_revectored(int nr, struct revectored_struct *bitmap)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/vm86: Use the normal pt_regs area for vm86

2015-07-31 Thread tip-bot for Brian Gerst
Commit-ID:  5ed92a8ab71f8865ba07811429c988c72299b315
Gitweb: http://git.kernel.org/tip/5ed92a8ab71f8865ba07811429c988c72299b315
Author: Brian Gerst 
AuthorDate: Wed, 29 Jul 2015 01:41:19 -0400
Committer:  Ingo Molnar 
CommitDate: Fri, 31 Jul 2015 13:31:09 +0200

x86/vm86: Use the normal pt_regs area for vm86

Change to use the normal pt_regs area to enter and exit vm86
mode.  This is done by increasing the padding at the top of the
stack to make room for the extra vm86 segment slots in the IRET
frame.  It then saves the 32-bit regs in the off-stack vm86
data, and copies in the vm86 regs.  Exiting back to 32-bit mode
does the reverse.  This allows removing the hacks to jump
directly into the exit asm code due to having to change the
stack pointer.  Returning normally from the vm86 syscall and the
exception handlers allows things like ptrace and auditing to work properly.

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1438148483-11932-5-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/entry/entry_32.S  |  24 +---
 arch/x86/include/asm/thread_info.h |  11 ++--
 arch/x86/include/asm/vm86.h|   6 +-
 arch/x86/kernel/signal.c   |   3 +
 arch/x86/kernel/vm86_32.c  | 110 +++--
 5 files changed, 60 insertions(+), 94 deletions(-)

diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index 21dc60a..f940e24 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -525,34 +525,12 @@ work_resched:
 
 work_notifysig:# deal with pending 
signals and
# notify-resume requests
-#ifdef CONFIG_VM86
-   testl   $X86_EFLAGS_VM, PT_EFLAGS(%esp)
-   movl%esp, %eax
-   jnz work_notifysig_v86  # returning to kernel-space or
-   # vm86-space
-1:
-#else
-   movl%esp, %eax
-#endif
TRACE_IRQS_ON
ENABLE_INTERRUPTS(CLBR_NONE)
-   movbPT_CS(%esp), %bl
-   andb$SEGMENT_RPL_MASK, %bl
-   cmpb$USER_RPL, %bl
-   jb  resume_kernel
+   movl%esp, %eax
xorl%edx, %edx
calldo_notify_resume
jmp resume_userspace
-
-#ifdef CONFIG_VM86
-   ALIGN
-work_notifysig_v86:
-   pushl   %ecx# save ti_flags for 
do_notify_resume
-   callsave_v86_state  # %eax contains pt_regs pointer
-   popl%ecx
-   movl%eax, %esp
-   jmp 1b
-#endif
 END(work_pending)
 
# perform syscall exit tracing
diff --git a/arch/x86/include/asm/thread_info.h 
b/arch/x86/include/asm/thread_info.h
index 225ee54..fdad5c2 100644
--- a/arch/x86/include/asm/thread_info.h
+++ b/arch/x86/include/asm/thread_info.h
@@ -27,14 +27,17 @@
  * Without this offset, that can result in a page fault.  (We are
  * careful that, in this case, the value we read doesn't matter.)
  *
- * In vm86 mode, the hardware frame is much longer still, but we neither
- * access the extra members from NMI context, nor do we write such a
- * frame at sp0 at all.
+ * In vm86 mode, the hardware frame is much longer still, so add 16
+ * bytes to make room for the real-mode segments.
  *
  * x86_64 has a fixed-length stack frame.
  */
 #ifdef CONFIG_X86_32
-# define TOP_OF_KERNEL_STACK_PADDING 8
+# ifdef CONFIG_VM86
+#  define TOP_OF_KERNEL_STACK_PADDING 16
+# else
+#  define TOP_OF_KERNEL_STACK_PADDING 8
+# endif
 #else
 # define TOP_OF_KERNEL_STACK_PADDING 0
 #endif
diff --git a/arch/x86/include/asm/vm86.h b/arch/x86/include/asm/vm86.h
index 226d6c1..e45386e 100644
--- a/arch/x86/include/asm/vm86.h
+++ b/arch/x86/include/asm/vm86.h
@@ -29,7 +29,7 @@ struct kernel_vm86_regs {
 
 struct vm86 {
struct vm86plus_struct __user *vm86_info;
-   struct pt_regs *regs32;
+   struct pt_regs regs32;
unsigned long v86flags;
unsigned long v86mask;
unsigned long saved_sp0;
@@ -46,7 +46,7 @@ struct vm86 {
 
 void handle_vm86_fault(struct kernel_vm86_regs *, long);
 int handle_vm86_trap(struct kernel_vm86_regs *, long, int);
-struct pt_regs *save_v86_state(struct kernel_vm86_regs *);
+void save_v86_state(struct kernel_vm86_regs *, int);
 
 struct task_struct;
 void release_vm86_irqs(struct task_struct *);
@@ -69,6 +69,8 @@ static inline int handle_vm86_trap(struct kernel_vm86_regs 
*a, long b, int c)
return 0;
 }
 
+static inline void save_v86_state(struct kernel_vm86_regs *a, int b) { }
+
 #define free_vm86(t) do { } while(0)
 
 #endif /* CONFIG_VM86 */
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index 7e88cc7..bfd736e 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -635,6 +635,9 @@ handle_sign

[tip:x86/asm] x86/vm86: Rename vm86->vm86_info to user_vm86

2015-07-31 Thread tip-bot for Brian Gerst
Commit-ID:  1342635638cba9b7c8eac776da5e54390d14d313
Gitweb: http://git.kernel.org/tip/1342635638cba9b7c8eac776da5e54390d14d313
Author: Brian Gerst 
AuthorDate: Wed, 29 Jul 2015 01:41:22 -0400
Committer:  Ingo Molnar 
CommitDate: Fri, 31 Jul 2015 13:31:11 +0200

x86/vm86: Rename vm86->vm86_info to user_vm86

Make it clearer that this is the pointer to the userspace vm86
state area.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1438148483-11932-8-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/vm86.h |  2 +-
 arch/x86/kernel/vm86_32.c   | 70 +++--
 2 files changed, 37 insertions(+), 35 deletions(-)

diff --git a/arch/x86/include/asm/vm86.h b/arch/x86/include/asm/vm86.h
index b063196..c93ae73 100644
--- a/arch/x86/include/asm/vm86.h
+++ b/arch/x86/include/asm/vm86.h
@@ -28,7 +28,7 @@ struct kernel_vm86_regs {
 };
 
 struct vm86 {
-   struct vm86plus_struct __user *vm86_info;
+   struct vm86plus_struct __user *user_vm86;
struct pt_regs regs32;
unsigned long v86flags;
unsigned long v86mask;
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index 0de1f66..52aa33e 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -104,17 +104,17 @@ void save_v86_state(struct kernel_vm86_regs *regs, int 
retval)
 */
local_irq_enable();
 
-   if (!vm86 || !vm86->vm86_info) {
-   pr_alert("no vm86_info: BAD\n");
+   if (!vm86 || !vm86->user_vm86) {
+   pr_alert("no user_vm86: BAD\n");
do_exit(SIGSEGV);
}
set_flags(regs->pt.flags, VEFLAGS, X86_EFLAGS_VIF | vm86->v86mask);
-   user = vm86->vm86_info;
+   user = vm86->user_vm86;
 
if (!access_ok(VERIFY_WRITE, user, vm86->vm86plus.is_vm86pus ?
   sizeof(struct vm86plus_struct) :
   sizeof(struct vm86_struct))) {
-   pr_alert("could not access userspace vm86_info\n");
+   pr_alert("could not access userspace vm86 info\n");
do_exit(SIGSEGV);
}
 
@@ -139,7 +139,7 @@ void save_v86_state(struct kernel_vm86_regs *regs, int 
retval)
put_user_ex(vm86->screen_bitmap, &user->screen_bitmap);
} put_user_catch(err);
if (err) {
-   pr_alert("could not access userspace vm86_info\n");
+   pr_alert("could not access userspace vm86 info\n");
do_exit(SIGSEGV);
}
 
@@ -192,11 +192,11 @@ out:
 
 
 static int do_vm86_irq_handling(int subfunction, int irqnumber);
-static long do_sys_vm86(struct vm86plus_struct __user *v86, bool plus);
+static long do_sys_vm86(struct vm86plus_struct __user *user_vm86, bool plus);
 
-SYSCALL_DEFINE1(vm86old, struct vm86_struct __user *, v86)
+SYSCALL_DEFINE1(vm86old, struct vm86_struct __user *, user_vm86)
 {
-   return do_sys_vm86((struct vm86plus_struct __user *) v86, false);
+   return do_sys_vm86((struct vm86plus_struct __user *) user_vm86, false);
 }
 
 
@@ -223,7 +223,7 @@ SYSCALL_DEFINE2(vm86, unsigned long, cmd, unsigned long, 
arg)
 }
 
 
-static long do_sys_vm86(struct vm86plus_struct __user *v86, bool plus)
+static long do_sys_vm86(struct vm86plus_struct __user *user_vm86, bool plus)
 {
struct tss_struct *tss;
struct task_struct *tsk = current;
@@ -240,7 +240,7 @@ static long do_sys_vm86(struct vm86plus_struct __user *v86, 
bool plus)
if (vm86->saved_sp0)
return -EPERM;
 
-   if (!access_ok(VERIFY_READ, v86, plus ?
+   if (!access_ok(VERIFY_READ, user_vm86, plus ?
   sizeof(struct vm86_struct) :
   sizeof(struct vm86plus_struct)))
return -EFAULT;
@@ -248,40 +248,42 @@ static long do_sys_vm86(struct vm86plus_struct __user 
*v86, bool plus)
memset(&vm86regs, 0, sizeof(vm86regs));
get_user_try {
unsigned short seg;
-   get_user_ex(vm86regs.pt.bx, &v86->regs.ebx);
-   get_user_ex(vm86regs.pt.cx, &v86->regs.ecx);
-   get_user_ex(vm86regs.pt.dx, &v86->regs.edx);
-   get_user_ex(vm86regs.pt.si, &v86->regs.esi);
-   get_user_ex(vm86regs.pt.di, &v86->regs.edi);
-   get_user_ex(vm86regs.pt.bp, &v86->regs.ebp);
-   get_user_ex(vm86regs.pt.ax, &v86->regs.eax);
-   get_user_ex(vm86regs.pt.ip, &v86->regs.eip);
-   get_user_ex(seg, &v86->regs.cs);
+   get_user_ex(vm86regs.pt.bx, &user_vm86->regs.ebx);
+   get_user_ex(vm86regs.pt.cx, &user_vm86->regs.ecx);
+   get_user_ex(vm86regs.pt.dx, &user_vm86->regs.edx);
+   get_user_ex(vm86regs.pt.si, &user_vm86->regs.esi);
+   get_user_ex(vm86regs.pt.di, &user_vm8

[tip:x86/asm] x86/vm86: Move vm86 fields out of 'thread_struct'

2015-07-31 Thread tip-bot for Brian Gerst
Commit-ID:  9fda6a0681e070b496235b132bc70ceb80300211
Gitweb: http://git.kernel.org/tip/9fda6a0681e070b496235b132bc70ceb80300211
Author: Brian Gerst 
AuthorDate: Wed, 29 Jul 2015 01:41:16 -0400
Committer:  Ingo Molnar 
CommitDate: Fri, 31 Jul 2015 13:31:07 +0200

x86/vm86: Move vm86 fields out of 'thread_struct'

Allocate a separate structure for the vm86 fields.

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1438148483-11932-2-git-send-email-brge...@gmail.com
[ Build fixes. ]
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/processor.h | 11 +++---
 arch/x86/include/asm/vm86.h  | 19 -
 arch/x86/kernel/process.c|  3 +++
 arch/x86/kernel/vm86_32.c| 46 +++-
 arch/x86/mm/fault.c  |  6 --
 5 files changed, 55 insertions(+), 30 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index befc134..9615a4e 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -6,8 +6,8 @@
 /* Forward declaration, a strange C thing */
 struct task_struct;
 struct mm_struct;
+struct vm86;
 
-#include 
 #include 
 #include 
 #include 
@@ -400,13 +400,9 @@ struct thread_struct {
unsigned long   cr2;
unsigned long   trap_nr;
unsigned long   error_code;
-#ifdef CONFIG_X86_32
+#ifdef CONFIG_VM86
/* Virtual 86 mode info */
-   struct vm86plus_struct __user *vm86_info;
-   unsigned long   screen_bitmap;
-   unsigned long   v86flags;
-   unsigned long   v86mask;
-   unsigned long   saved_sp0;
+   struct vm86 *vm86;
 #endif
/* IO permissions: */
unsigned long   *io_bitmap_ptr;
@@ -718,7 +714,6 @@ static inline void spin_lock_prefetch(const void *x)
 
 #define INIT_THREAD  {   \
.sp0= TOP_OF_INIT_STACK,  \
-   .vm86_info  = NULL,   \
.sysenter_cs= __KERNEL_CS,\
.io_bitmap_ptr  = NULL,   \
 }
diff --git a/arch/x86/include/asm/vm86.h b/arch/x86/include/asm/vm86.h
index 1d8de3f..20b43b7 100644
--- a/arch/x86/include/asm/vm86.h
+++ b/arch/x86/include/asm/vm86.h
@@ -1,7 +1,6 @@
 #ifndef _ASM_X86_VM86_H
 #define _ASM_X86_VM86_H
 
-
 #include 
 #include 
 
@@ -58,6 +57,14 @@ struct kernel_vm86_struct {
  */
 };
 
+struct vm86 {
+   struct vm86plus_struct __user *vm86_info;
+   unsigned long screen_bitmap;
+   unsigned long v86flags;
+   unsigned long v86mask;
+   unsigned long saved_sp0;
+};
+
 #ifdef CONFIG_VM86
 
 void handle_vm86_fault(struct kernel_vm86_regs *, long);
@@ -67,6 +74,14 @@ struct pt_regs *save_v86_state(struct kernel_vm86_regs *);
 struct task_struct;
 void release_vm86_irqs(struct task_struct *);
 
+#define free_vm86(t) do {  \
+   struct thread_struct *__t = (t);\
+   if (__t->vm86 != NULL) {\
+   kfree(__t->vm86);   \
+   __t->vm86 = NULL;   \
+   }   \
+} while (0)
+
 #else
 
 #define handle_vm86_fault(a, b)
@@ -77,6 +92,8 @@ static inline int handle_vm86_trap(struct kernel_vm86_regs 
*a, long b, int c)
return 0;
 }
 
+#define free_vm86(t) do { } while(0)
+
 #endif /* CONFIG_VM86 */
 
 #endif /* _ASM_X86_VM86_H */
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 397688b..2199d9b 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -29,6 +29,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /*
  * per-CPU TSS segments. Threads are completely 'soft' on Linux,
@@ -110,6 +111,8 @@ void exit_thread(void)
kfree(bp);
}
 
+   free_vm86(t);
+
fpu__drop(fpu);
 }
 
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index e6c2b47..bfa59b1 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -44,6 +44,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -81,8 +82,8 @@
 /*
  * virtual flags (16 and 32-bit versions)
  */
-#define VFLAGS (*(unsigned short *)&(current->thread.v86flags))
-#define VEFLAGS(current->thread.v86flags)
+#define VFLAGS (*(unsigned short *)&(current->thread.vm86->v86flags))
+#define VEFLAGS(current->thread.vm86->v86flags)
 
 #define set_flags(X, new, mask) \
 ((X) = ((X) & ~(mask)) | ((new) & (mask)))
@@ -96,6 +97,7 @@ struct pt_regs *save_v86_state(struct kernel_vm86_regs *regs)
struct pt_regs *ret;

[tip:x86/asm] x86/entry/vm86: Move userspace accesses to do_sys_vm86()

2015-07-21 Thread tip-bot for Brian Gerst
Commit-ID:  ed0b2edb61ba4e557de759093d965654186f28b2
Gitweb: http://git.kernel.org/tip/ed0b2edb61ba4e557de759093d965654186f28b2
Author: Brian Gerst 
AuthorDate: Sun, 19 Jul 2015 21:09:06 -0400
Committer:  Ingo Molnar 
CommitDate: Tue, 21 Jul 2015 09:12:24 +0200

x86/entry/vm86: Move userspace accesses to do_sys_vm86()

Move the userspace accesses down into the common function in
preparation for the next set of patches.  Also change to copying
the fields explicitly instead of assuming a fixed order in
pt_regs and the kernel data structures.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Denys Vlasenko 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1437354550-25858-4-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/processor.h |   2 +-
 arch/x86/kernel/vm86_32.c| 189 +--
 2 files changed, 102 insertions(+), 89 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index f4e4e3f..35ad554 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -405,7 +405,7 @@ struct thread_struct {
unsigned long   error_code;
 #ifdef CONFIG_X86_32
/* Virtual 86 mode info */
-   struct vm86_struct __user *vm86_info;
+   struct vm86plus_struct __user *vm86_info;
unsigned long   screen_bitmap;
unsigned long   v86flags;
unsigned long   v86mask;
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index 9a2dc80..e6c2b47 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -90,46 +90,13 @@
 #define SAFE_MASK  (0xDD5)
 #define RETURN_MASK(0xDFF)
 
-/* convert kernel_vm86_regs to vm86_regs */
-static int copy_vm86_regs_to_user(struct vm86_regs __user *user,
- const struct kernel_vm86_regs *regs)
-{
-   int ret = 0;
-
-   /*
-* kernel_vm86_regs is missing gs, so copy everything up to
-* (but not including) orig_eax, and then rest including orig_eax.
-*/
-   ret += copy_to_user(user, regs, offsetof(struct kernel_vm86_regs, 
pt.orig_ax));
-   ret += copy_to_user(&user->orig_eax, ®s->pt.orig_ax,
-   sizeof(struct kernel_vm86_regs) -
-   offsetof(struct kernel_vm86_regs, pt.orig_ax));
-
-   return ret;
-}
-
-/* convert vm86_regs to kernel_vm86_regs */
-static int copy_vm86_regs_from_user(struct kernel_vm86_regs *regs,
-   const struct vm86_regs __user *user,
-   unsigned extra)
-{
-   int ret = 0;
-
-   /* copy ax-fs inclusive */
-   ret += copy_from_user(regs, user, offsetof(struct kernel_vm86_regs, 
pt.orig_ax));
-   /* copy orig_ax-__gsh+extra */
-   ret += copy_from_user(®s->pt.orig_ax, &user->orig_eax,
- sizeof(struct kernel_vm86_regs) -
- offsetof(struct kernel_vm86_regs, pt.orig_ax) +
- extra);
-   return ret;
-}
-
 struct pt_regs *save_v86_state(struct kernel_vm86_regs *regs)
 {
struct tss_struct *tss;
struct pt_regs *ret;
-   unsigned long tmp;
+   struct task_struct *tsk = current;
+   struct vm86plus_struct __user *user;
+   long err = 0;
 
/*
 * This gets called from entry.S with interrupts disabled, but
@@ -138,23 +105,50 @@ struct pt_regs *save_v86_state(struct kernel_vm86_regs 
*regs)
 */
local_irq_enable();
 
-   if (!current->thread.vm86_info) {
+   if (!tsk->thread.vm86_info) {
pr_alert("no vm86_info: BAD\n");
do_exit(SIGSEGV);
}
-   set_flags(regs->pt.flags, VEFLAGS, X86_EFLAGS_VIF | 
current->thread.v86mask);
-   tmp = copy_vm86_regs_to_user(¤t->thread.vm86_info->regs, regs);
-   tmp += put_user(current->thread.screen_bitmap, 
¤t->thread.vm86_info->screen_bitmap);
-   if (tmp) {
+   set_flags(regs->pt.flags, VEFLAGS, X86_EFLAGS_VIF | 
tsk->thread.v86mask);
+   user = tsk->thread.vm86_info;
+
+   if (!access_ok(VERIFY_WRITE, user, VMPI.is_vm86pus ?
+  sizeof(struct vm86plus_struct) :
+  sizeof(struct vm86_struct))) {
+   pr_alert("could not access userspace vm86_info\n");
+   do_exit(SIGSEGV);
+   }
+
+   put_user_try {
+   put_user_ex(regs->pt.bx, &user->regs.ebx);
+   put_user_ex(regs->pt.cx, &user->regs.ecx);
+   put_user_ex(regs->pt.dx, &user->regs.edx);
+   put_user_ex(regs->pt.si, &user->regs.esi);
+   put_user_ex(regs->pt.di, &user->regs.edi);
+   put_user_ex(regs->pt.bp, &user->regs.ebp);
+   put_user_ex(regs->pt.ax, &user->regs.eax);
+   put_user_ex(regs->pt.ip, &user->regs.eip);
+ 

[tip:x86/asm] x86/entry/vm86: Clean up saved_fs/gs

2015-07-21 Thread tip-bot for Brian Gerst
Commit-ID:  0233606ce5cf12c1a0e27cb197066ea5bc2bb488
Gitweb: http://git.kernel.org/tip/0233606ce5cf12c1a0e27cb197066ea5bc2bb488
Author: Brian Gerst 
AuthorDate: Sun, 19 Jul 2015 21:09:04 -0400
Committer:  Ingo Molnar 
CommitDate: Tue, 21 Jul 2015 09:12:23 +0200

x86/entry/vm86: Clean up saved_fs/gs

There is no need to save FS and non-lazy GS outside the 32-bit
regs.  Lazy GS still needs to be saved because it wasn't saved
on syscall entry.  Save it in the gs slot of regs32, which is
present but unused.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Denys Vlasenko 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1437354550-25858-2-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/processor.h | 2 --
 arch/x86/kernel/vm86_32.c| 6 ++
 2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 43e6519..f4e4e3f 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -410,8 +410,6 @@ struct thread_struct {
unsigned long   v86flags;
unsigned long   v86mask;
unsigned long   saved_sp0;
-   unsigned intsaved_fs;
-   unsigned intsaved_gs;
 #endif
/* IO permissions: */
unsigned long   *io_bitmap_ptr;
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index fc9db6e..761a2f9 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -159,8 +159,7 @@ struct pt_regs *save_v86_state(struct kernel_vm86_regs 
*regs)
 
ret = KVM86->regs32;
 
-   ret->fs = current->thread.saved_fs;
-   set_user_gs(ret, current->thread.saved_gs);
+   lazy_load_gs(ret->gs);
 
return ret;
 }
@@ -315,8 +314,7 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, 
struct task_struct *tsk
  */
info->regs32->ax = VM86_SIGNAL;
tsk->thread.saved_sp0 = tsk->thread.sp0;
-   tsk->thread.saved_fs = info->regs32->fs;
-   tsk->thread.saved_gs = get_user_gs(info->regs32);
+   lazy_save_gs(info->regs32->gs);
 
tss = &per_cpu(cpu_tss, get_cpu());
tsk->thread.sp0 = (unsigned long) &info->VM86_TSS_ESP0;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/entry/vm86: Preserve 'orig_ax'

2015-07-21 Thread tip-bot for Brian Gerst
Commit-ID:  df1ae9a5dc66d9fd57109240042372b1065d984a
Gitweb: http://git.kernel.org/tip/df1ae9a5dc66d9fd57109240042372b1065d984a
Author: Brian Gerst 
AuthorDate: Sun, 19 Jul 2015 21:09:05 -0400
Committer:  Ingo Molnar 
CommitDate: Tue, 21 Jul 2015 09:12:23 +0200

x86/entry/vm86: Preserve 'orig_ax'

There is no legitimate reason for usermode to modify the 'orig_ax'
field on entry to vm86 mode, so copy it from the 32-bit regs.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Denys Vlasenko 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1437354550-25858-3-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/kernel/vm86_32.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index 761a2f9..9a2dc80 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -294,6 +294,8 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, 
struct task_struct *tsk
info->regs.pt.flags |= info->regs32->flags & ~SAFE_MASK;
info->regs.pt.flags |= X86_VM_MASK;
 
+   info->regs.pt.orig_ax = info->regs32->orig_ax;
+
switch (info->cpu_type) {
case CPU_286:
tsk->thread.v86mask = 0;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Define ARCH_WANT_OLD_COMPAT_IPC only for 32-bit compat

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  3bead553ab657d482c3fd6559a1fd7f024414a63
Gitweb: http://git.kernel.org/tip/3bead553ab657d482c3fd6559a1fd7f024414a63
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:19 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:57 +0200

x86/compat: Define ARCH_WANT_OLD_COMPAT_IPC only for 32-bit compat

x32 does not need CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-11-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 55bced1..6e910ba 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2517,6 +2517,7 @@ config IA32_EMULATION
select BINFMT_ELF
select COMPAT_BINFMT_ELF
select HAVE_UID16
+   select ARCH_WANT_OLD_COMPAT_IPC
---help---
  Include code to run legacy 32-bit programs under a
  64-bit kernel. You should likely turn this on, unless you're
@@ -2544,7 +2545,6 @@ config X86_X32
 config COMPAT
def_bool y
depends on IA32_EMULATION || X86_X32
-   select ARCH_WANT_OLD_COMPAT_IPC
 
 if COMPAT
 config COMPAT_FOR_U64_ALIGNMENT
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Separate ia32 and x32 compat ABIs

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  9b54050bfe438d9e1108211d28cb0b995b1f347c
Gitweb: http://git.kernel.org/tip/9b54050bfe438d9e1108211d28cb0b995b1f347c
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:21 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:58 +0200

x86/compat: Separate ia32 and x32 compat ABIs

The x32 ABI is now independent of the ia32 compat ABI.  Common
code is now conditional on CONFIG_COMPAT, but unshared code like
syscall entry, signal handling, and the VDSO are under separate
config options.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-13-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index d823a33..aa94fd0 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2530,7 +2530,7 @@ config IA32_AOUT
 
 config X86_X32
bool "x32 ABI for 64-bit mode"
-   depends on X86_64 && IA32_EMULATION
+   depends on X86_64
---help---
  Include code to run binaries for the x32 native 32-bit ABI
  for 64-bit processors.  An x32 process gets access to the
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Clean up HAVE_UID16 config

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  0c3619ea6756833e5c636c886cb55ca5b77f5d73
Gitweb: http://git.kernel.org/tip/0c3619ea6756833e5c636c886cb55ca5b77f5d73
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:20 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:58 +0200

x86/compat: Clean up HAVE_UID16 config

Merge the 32-bit compat config setting for HAVE_UID16 with the
32-bit native one.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-12-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/Kconfig | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 6e910ba..d823a33 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -132,7 +132,7 @@ config X86
select HAVE_PERF_USER_STACK_DUMP
select HAVE_REGS_AND_STACK_ACCESS_API
select HAVE_SYSCALL_TRACEPOINTS
-   select HAVE_UID16   if X86_32
+   select HAVE_UID16   if X86_32 || IA32_EMULATION
select HAVE_UNSTABLE_SCHED_CLOCK
select HAVE_USER_RETURN_NOTIFIER
select IRQ_FORCED_THREADING
@@ -2516,7 +2516,6 @@ config IA32_EMULATION
depends on X86_64
select BINFMT_ELF
select COMPAT_BINFMT_ELF
-   select HAVE_UID16
select ARCH_WANT_OLD_COMPAT_IPC
---help---
  Include code to run legacy 32-bit programs under a
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Don' t build the 32-bit VDSO if not needed

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  ab8b82ee6dad7c9c257f450d14719a0e3f327244
Gitweb: http://git.kernel.org/tip/ab8b82ee6dad7c9c257f450d14719a0e3f327244
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:15 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:56 +0200

x86/compat: Don't build the 32-bit VDSO if not needed

Build the 32-bit vdso only for native 32-bit or 32-bit compat is
enabled.  x32 should not force it to build.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-7-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/entry/vdso/Makefile | 6 +++---
 arch/x86/entry/vdso/vma.c| 7 +--
 arch/x86/include/asm/elf.h   | 2 +-
 3 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/arch/x86/entry/vdso/Makefile b/arch/x86/entry/vdso/Makefile
index e970320..96c0617 100644
--- a/arch/x86/entry/vdso/Makefile
+++ b/arch/x86/entry/vdso/Makefile
@@ -8,7 +8,7 @@ KASAN_SANITIZE := n
 VDSO64-$(CONFIG_X86_64):= y
 VDSOX32-$(CONFIG_X86_X32_ABI)  := y
 VDSO32-$(CONFIG_X86_32):= y
-VDSO32-$(CONFIG_COMPAT):= y
+VDSO32-$(CONFIG_IA32_EMULATION):= y
 
 # files to link into the vdso
 vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o
@@ -20,7 +20,7 @@ obj-y += vma.o
 vdso_img-$(VDSO64-y)   += 64
 vdso_img-$(VDSOX32-y)  += x32
 vdso_img-$(VDSO32-y)   += 32-int80
-vdso_img-$(CONFIG_COMPAT)  += 32-syscall
+vdso_img-$(CONFIG_IA32_EMULATION)  += 32-syscall
 vdso_img-$(VDSO32-y)   += 32-sysenter
 
 obj-$(VDSO32-y)+= vdso32-setup.o
@@ -126,7 +126,7 @@ $(obj)/vdsox32.so.dbg: $(src)/vdsox32.lds $(vobjx32s) FORCE
 # Build multiple 32-bit vDSO images to choose from at boot time.
 #
 vdso32.so-$(VDSO32-y)  += int80
-vdso32.so-$(CONFIG_COMPAT) += syscall
+vdso32.so-$(CONFIG_IA32_EMULATION) += syscall
 vdso32.so-$(VDSO32-y)  += sysenter
 
 vdso32-images  = $(vdso32.so-y:%=vdso32-%.so)
diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index 1c9f750..4345431 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -177,7 +177,7 @@ up_fail:
return ret;
 }
 
-#if defined(CONFIG_X86_32) || defined(CONFIG_COMPAT)
+#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
 static int load_vdso32(void)
 {
int ret;
@@ -219,8 +219,11 @@ int compat_arch_setup_additional_pages(struct linux_binprm 
*bprm,
return map_vdso(&vdso_image_x32, true);
}
 #endif
-
+#ifdef CONFIG_IA32_EMULATION
return load_vdso32();
+#else
+   return 0;
+#endif
 }
 #endif
 #else
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
index 2bf67c0..141c561 100644
--- a/arch/x86/include/asm/elf.h
+++ b/arch/x86/include/asm/elf.h
@@ -78,7 +78,7 @@ typedef struct user_fxsr_struct elf_fpxregset_t;
 #ifdef CONFIG_X86_64
 extern unsigned int vdso64_enabled;
 #endif
-#if defined(CONFIG_X86_32) || defined(CONFIG_COMPAT)
+#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
 extern unsigned int vdso32_enabled;
 #endif
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Move copy_siginfo_*_user32() to signal_compat.c

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  c0bfd26e136cafc2b23c16225b4d7b1e14de81c1
Gitweb: http://git.kernel.org/tip/c0bfd26e136cafc2b23c16225b4d7b1e14de81c1
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:10 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:55 +0200

x86/compat: Move copy_siginfo_*_user32() to signal_compat.c

copy_siginfo_to_user32() and copy_siginfo_from_user32() are used
by both the 32-bit compat and x32 ABIs.  Move them to
signal_compat.c.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-2-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/ia32/ia32_signal.c | 93 
 arch/x86/kernel/Makefile|  1 +
 arch/x86/kernel/signal_compat.c | 95 +
 3 files changed, 96 insertions(+), 93 deletions(-)

diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index ae3a29a..a0a19b7 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -34,99 +34,6 @@
 #include 
 #include 
 
-int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
-{
-   int err = 0;
-   bool ia32 = test_thread_flag(TIF_IA32);
-
-   if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
-   return -EFAULT;
-
-   put_user_try {
-   /* If you change siginfo_t structure, please make sure that
-  this code is fixed accordingly.
-  It should never copy any pad contained in the structure
-  to avoid security leaks, but must copy the generic
-  3 ints plus the relevant union member.  */
-   put_user_ex(from->si_signo, &to->si_signo);
-   put_user_ex(from->si_errno, &to->si_errno);
-   put_user_ex((short)from->si_code, &to->si_code);
-
-   if (from->si_code < 0) {
-   put_user_ex(from->si_pid, &to->si_pid);
-   put_user_ex(from->si_uid, &to->si_uid);
-   put_user_ex(ptr_to_compat(from->si_ptr), &to->si_ptr);
-   } else {
-   /*
-* First 32bits of unions are always present:
-* si_pid === si_band === si_tid === si_addr(LS half)
-*/
-   put_user_ex(from->_sifields._pad[0],
- &to->_sifields._pad[0]);
-   switch (from->si_code >> 16) {
-   case __SI_FAULT >> 16:
-   break;
-   case __SI_SYS >> 16:
-   put_user_ex(from->si_syscall, &to->si_syscall);
-   put_user_ex(from->si_arch, &to->si_arch);
-   break;
-   case __SI_CHLD >> 16:
-   if (ia32) {
-   put_user_ex(from->si_utime, 
&to->si_utime);
-   put_user_ex(from->si_stime, 
&to->si_stime);
-   } else {
-   put_user_ex(from->si_utime, 
&to->_sifields._sigchld_x32._utime);
-   put_user_ex(from->si_stime, 
&to->_sifields._sigchld_x32._stime);
-   }
-   put_user_ex(from->si_status, &to->si_status);
-   /* FALL THROUGH */
-   default:
-   case __SI_KILL >> 16:
-   put_user_ex(from->si_uid, &to->si_uid);
-   break;
-   case __SI_POLL >> 16:
-   put_user_ex(from->si_fd, &to->si_fd);
-   break;
-   case __SI_TIMER >> 16:
-   put_user_ex(from->si_overrun, &to->si_overrun);
-   put_user_ex(ptr_to_compat(from->si_ptr),
-   &to->si_ptr);
-   break;
-/* This is not generated by the kernel as of 
now.  */
-   case __SI_RT >> 16:
-   case __SI_MESGQ >> 16:
-   put_user_ex(from->si_uid, &to->si_uid);
-   put_user_ex(from->si_int, &to->si_int);
-   break;
-   }
-   }
-   } put_user_catch(err);
-
-   return err;
-}
-
-int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
-{
-   int err = 0;
-   u32 ptr32;
-
-   if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
-   return -E

[tip:x86/asm] x86/compat: Move ucontext_x32 to sigframe.h

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  b829d1be20ab51a3b76ec003118c9260d1fa424e
Gitweb: http://git.kernel.org/tip/b829d1be20ab51a3b76ec003118c9260d1fa424e
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:12 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:55 +0200

x86/compat: Move ucontext_x32 to sigframe.h

ia32.h should only contain the code for 32-bit compatability.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-4-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/ia32.h |  9 -
 arch/x86/include/asm/sigframe.h | 10 ++
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/arch/x86/include/asm/ia32.h b/arch/x86/include/asm/ia32.h
index d0e8e01..2801976 100644
--- a/arch/x86/include/asm/ia32.h
+++ b/arch/x86/include/asm/ia32.h
@@ -22,15 +22,6 @@ struct ucontext_ia32 {
compat_sigset_t   uc_sigmask;   /* mask last for extensibility */
 };
 
-struct ucontext_x32 {
-   unsigned int  uc_flags;
-   unsigned int  uc_link;
-   compat_stack_tuc_stack;
-   unsigned int  uc__pad0; /* needed for alignment */
-   struct sigcontext uc_mcontext;  /* the 64-bit sigcontext type */
-   compat_sigset_t   uc_sigmask;   /* mask last for extensibility */
-};
-
 /* This matches struct stat64 in glibc2.2, hence the absolutely
  * insane amounts of padding around dev_t's.
  */
diff --git a/arch/x86/include/asm/sigframe.h b/arch/x86/include/asm/sigframe.h
index 7c7c27c..1f3175b 100644
--- a/arch/x86/include/asm/sigframe.h
+++ b/arch/x86/include/asm/sigframe.h
@@ -4,6 +4,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #ifdef CONFIG_X86_32
 #define sigframe_ia32  sigframe
@@ -69,6 +70,15 @@ struct rt_sigframe {
 
 #ifdef CONFIG_X86_X32_ABI
 
+struct ucontext_x32 {
+   unsigned int  uc_flags;
+   unsigned int  uc_link;
+   compat_stack_tuc_stack;
+   unsigned int  uc__pad0; /* needed for alignment */
+   struct sigcontext uc_mcontext;  /* the 64-bit sigcontext type */
+   compat_sigset_t   uc_sigmask;   /* mask last for extensibility */
+};
+
 struct rt_sigframe_x32 {
u64 pretcode;
struct ucontext_x32 uc;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Remove unneeded #include

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  5e2aad2460bd38d0777052486893b32902efcdcd
Gitweb: http://git.kernel.org/tip/5e2aad2460bd38d0777052486893b32902efcdcd
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:18 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:57 +0200

x86/compat: Remove unneeded #include

Including sys_ia32.h is not needed in signal.c.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-10-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/kernel/signal.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index 206996c..6c22aad 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -35,7 +35,6 @@
 #ifdef CONFIG_X86_64
 #include 
 #include 
-#include 
 #endif /* CONFIG_X86_64 */
 
 #include 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Factor out ia32 compat code from compat_arch_ptrace()

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  601275c3e04c43b3b34237ab36c27fc1cfb8a189
Gitweb: http://git.kernel.org/tip/601275c3e04c43b3b34237ab36c27fc1cfb8a189
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:14 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:56 +0200

x86/compat: Factor out ia32 compat code from compat_arch_ptrace()

Move the ia32-specific code in compat_arch_ptrace() into its
own function.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-6-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/kernel/ptrace.c | 138 +--
 1 file changed, 74 insertions(+), 64 deletions(-)

diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index 9be72bc..7155957 100644
--- a/arch/x86/kernel/ptrace.c
+++ b/arch/x86/kernel/ptrace.c
@@ -1123,6 +1123,73 @@ static int genregs32_set(struct task_struct *target,
return ret;
 }
 
+static long ia32_arch_ptrace(struct task_struct *child, compat_long_t request,
+compat_ulong_t caddr, compat_ulong_t cdata)
+{
+   unsigned long addr = caddr;
+   unsigned long data = cdata;
+   void __user *datap = compat_ptr(data);
+   int ret;
+   __u32 val;
+
+   switch (request) {
+   case PTRACE_PEEKUSR:
+   ret = getreg32(child, addr, &val);
+   if (ret == 0)
+   ret = put_user(val, (__u32 __user *)datap);
+   break;
+
+   case PTRACE_POKEUSR:
+   ret = putreg32(child, addr, data);
+   break;
+
+   case PTRACE_GETREGS:/* Get all gp regs from the child. */
+   return copy_regset_to_user(child, &user_x86_32_view,
+  REGSET_GENERAL,
+  0, sizeof(struct user_regs_struct32),
+  datap);
+
+   case PTRACE_SETREGS:/* Set all gp regs in the child. */
+   return copy_regset_from_user(child, &user_x86_32_view,
+REGSET_GENERAL, 0,
+sizeof(struct user_regs_struct32),
+datap);
+
+   case PTRACE_GETFPREGS:  /* Get the child FPU state. */
+   return copy_regset_to_user(child, &user_x86_32_view,
+  REGSET_FP, 0,
+  sizeof(struct user_i387_ia32_struct),
+  datap);
+
+   case PTRACE_SETFPREGS:  /* Set the child FPU state. */
+   return copy_regset_from_user(
+   child, &user_x86_32_view, REGSET_FP,
+   0, sizeof(struct user_i387_ia32_struct), datap);
+
+   case PTRACE_GETFPXREGS: /* Get the child extended FPU state. */
+   return copy_regset_to_user(child, &user_x86_32_view,
+  REGSET_XFP, 0,
+  sizeof(struct user32_fxsr_struct),
+  datap);
+
+   case PTRACE_SETFPXREGS: /* Set the child extended FPU state. */
+   return copy_regset_from_user(child, &user_x86_32_view,
+REGSET_XFP, 0,
+sizeof(struct user32_fxsr_struct),
+datap);
+
+   case PTRACE_GET_THREAD_AREA:
+   case PTRACE_SET_THREAD_AREA:
+   return arch_ptrace(child, request, addr, data);
+
+   default:
+   return compat_ptrace_request(child, request, addr, data);
+   }
+
+   return ret;
+}
+#endif /* CONFIG_IA32_EMULATION */
+
 #ifdef CONFIG_X86_X32_ABI
 static long x32_arch_ptrace(struct task_struct *child,
compat_long_t request, compat_ulong_t caddr,
@@ -1211,78 +1278,21 @@ static long x32_arch_ptrace(struct task_struct *child,
 }
 #endif
 
+#ifdef CONFIG_COMPAT
 long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
compat_ulong_t caddr, compat_ulong_t cdata)
 {
-   unsigned long addr = caddr;
-   unsigned long data = cdata;
-   void __user *datap = compat_ptr(data);
-   int ret;
-   __u32 val;
-
 #ifdef CONFIG_X86_X32_ABI
if (!is_ia32_task())
return x32_arch_ptrace(child, request, caddr, cdata);
 #endif
-
-   switch (request) {
-   case PTRACE_PEEKUSR:
-   ret = getreg32(child, addr, &val);
-   if (ret == 0)
-   ret = put_user(val, (__u32 __user *)datap);
-   break;
-
-   case PTRACE_POKEUSR:
-   ret = putreg32(child, addr, data);
-   break;
-
-  

[tip:x86/asm] x86/compat: Rename 'start_thread_ia32' to ' compat_start_thread'

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  7da770785f9740af1cb24b8fd63075543bd00711
Gitweb: http://git.kernel.org/tip/7da770785f9740af1cb24b8fd63075543bd00711
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:13 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:56 +0200

x86/compat: Rename 'start_thread_ia32' to 'compat_start_thread'

This function is shared between the 32-bit compat and x32 ABIs.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-5-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/elf.h   | 4 ++--
 arch/x86/kernel/process_64.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
index 180b6fe..2bf67c0 100644
--- a/arch/x86/include/asm/elf.h
+++ b/arch/x86/include/asm/elf.h
@@ -187,8 +187,8 @@ static inline void elf_common_init(struct thread_struct *t,
 #defineCOMPAT_ELF_PLAT_INIT(regs, load_addr)   \
elf_common_init(¤t->thread, regs, __USER_DS)
 
-void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp);
-#define compat_start_thread start_thread_ia32
+void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp);
+#define compat_start_thread compat_start_thread
 
 void set_personality_ia32(bool);
 #define COMPAT_SET_PERSONALITY(ex) \
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index 71d7849..0831ba3 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -248,8 +248,8 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, 
unsigned long new_sp)
__USER_CS, __USER_DS, 0);
 }
 
-#ifdef CONFIG_IA32_EMULATION
-void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp)
+#ifdef CONFIG_COMPAT
+void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp)
 {
start_thread_common(regs, new_ip, new_sp,
test_thread_flag(TIF_X32)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat, x86/perf: Don' t build perf_callchain_user32() on x32

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  10ed34935e7e828ce4ce566647a2d6b8240e4dee
Gitweb: http://git.kernel.org/tip/10ed34935e7e828ce4ce566647a2d6b8240e4dee
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:17 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:57 +0200

x86/compat, x86/perf: Don't build perf_callchain_user32() on x32

perf_callchain_user32() is not needed for x32.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-9-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/kernel/cpu/perf_event.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
index 3658de4..641413d 100644
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -2196,7 +2196,7 @@ static unsigned long get_segment_base(unsigned int 
segment)
return get_desc_base(desc + idx);
 }
 
-#ifdef CONFIG_COMPAT
+#ifdef CONFIG_IA32_EMULATION
 
 #include 
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Make mmap_is_ia32() common compat

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  b2e02b820d5b42479195b89d3d73f31bcedb264e
Gitweb: http://git.kernel.org/tip/b2e02b820d5b42479195b89d3d73f31bcedb264e
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:11 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:55 +0200

x86/compat: Make mmap_is_ia32() common compat

TIF_ADDR32 is set for both ia32 and x32 tasks, so change from
CONFIG_IA32_EMULATION to CONFIG_COMPAT.  Use config_enabled()
to make the function more readable.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-3-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/elf.h | 11 +++
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
index f161c18..180b6fe 100644
--- a/arch/x86/include/asm/elf.h
+++ b/arch/x86/include/asm/elf.h
@@ -344,14 +344,9 @@ extern int compat_arch_setup_additional_pages(struct 
linux_binprm *bprm,
  */
 static inline int mmap_is_ia32(void)
 {
-#ifdef CONFIG_X86_32
-   return 1;
-#endif
-#ifdef CONFIG_IA32_EMULATION
-   if (test_thread_flag(TIF_ADDR32))
-   return 1;
-#endif
-   return 0;
+   return config_enabled(CONFIG_X86_32) ||
+  (config_enabled(CONFIG_COMPAT) &&
+   test_thread_flag(TIF_ADDR32));
 }
 
 /* Do not change the values. See get_align_mask() */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Check for both 32-bit compat and x32 in get_gate_vma()

2015-07-06 Thread tip-bot for Brian Gerst
Commit-ID:  c338867d0e4224771c68d0a7727289b86c23eccd
Gitweb: http://git.kernel.org/tip/c338867d0e4224771c68d0a7727289b86c23eccd
Author: Brian Gerst 
AuthorDate: Mon, 22 Jun 2015 07:55:16 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Jul 2015 15:28:57 +0200

x86/compat: Check for both 32-bit compat and x32 in get_gate_vma()

Change this to CONFIG_COMPAT so both 32-bit compat and x32 will
do the check.

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1434974121-32575-8-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/entry/vsyscall/vsyscall_64.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c 
b/arch/x86/entry/vsyscall/vsyscall_64.c
index 2dcc6ff..26a46f4 100644
--- a/arch/x86/entry/vsyscall/vsyscall_64.c
+++ b/arch/x86/entry/vsyscall/vsyscall_64.c
@@ -290,7 +290,7 @@ static struct vm_area_struct gate_vma = {
 
 struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
 {
-#ifdef CONFIG_IA32_EMULATION
+#ifdef CONFIG_COMPAT
if (!mm || mm->context.ia32_compat)
return NULL;
 #endif
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/asm/entry: Remove SYSCALL_VECTOR

2015-05-10 Thread tip-bot for Brian Gerst
Commit-ID:  51bb92843edcba5a58138cad25ced97923048add
Gitweb: http://git.kernel.org/tip/51bb92843edcba5a58138cad25ced97923048add
Author: Brian Gerst 
AuthorDate: Sat, 9 May 2015 11:36:52 -0400
Committer:  Ingo Molnar 
CommitDate: Sun, 10 May 2015 12:34:28 +0200

x86/asm/entry: Remove SYSCALL_VECTOR

Use IA32_SYSCALL_VECTOR for both compat and native.

Signed-off-by: Brian Gerst 
Cc: Andrew Morton 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1431185813-15413-4-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/irq_vectors.h | 3 ---
 arch/x86/kernel/traps.c| 4 ++--
 arch/x86/lguest/boot.c | 4 ++--
 3 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/arch/x86/include/asm/irq_vectors.h 
b/arch/x86/include/asm/irq_vectors.h
index 666c89e..07f2792 100644
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -47,9 +47,6 @@
 #define IRQ_MOVE_CLEANUP_VECTORFIRST_EXTERNAL_VECTOR
 
 #define IA32_SYSCALL_VECTOR0x80
-#ifdef CONFIG_X86_32
-# define SYSCALL_VECTOR0x80
-#endif
 
 /*
  * Vectors 0x30-0x3f are used for ISA interrupts.
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 324ab52..5e0791f 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -997,8 +997,8 @@ void __init trap_init(void)
 #endif
 
 #ifdef CONFIG_X86_32
-   set_system_trap_gate(SYSCALL_VECTOR, &system_call);
-   set_bit(SYSCALL_VECTOR, used_vectors);
+   set_system_trap_gate(IA32_SYSCALL_VECTOR, &system_call);
+   set_bit(IA32_SYSCALL_VECTOR, used_vectors);
 #endif
 
/*
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
index 8f9a133..cab9aaa 100644
--- a/arch/x86/lguest/boot.c
+++ b/arch/x86/lguest/boot.c
@@ -90,7 +90,7 @@ struct lguest_data lguest_data = {
.noirq_iret = (u32)lguest_noirq_iret,
.kernel_address = PAGE_OFFSET,
.blocked_interrupts = { 1 }, /* Block timer interrupts */
-   .syscall_vec = SYSCALL_VECTOR,
+   .syscall_vec = IA32_SYSCALL_VECTOR,
 };
 
 /*G:037
@@ -866,7 +866,7 @@ static void __init lguest_init_IRQ(void)
for (i = FIRST_EXTERNAL_VECTOR; i < FIRST_SYSTEM_VECTOR; i++) {
/* Some systems map "vectors" to interrupts weirdly.  Not us! */
__this_cpu_write(vector_irq[i], i - FIRST_EXTERNAL_VECTOR);
-   if (i != SYSCALL_VECTOR)
+   if (i != IA32_SYSCALL_VECTOR)
set_intr_gate(i, irq_entries_start +
8 * (i - FIRST_EXTERNAL_VECTOR));
}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/asm/entry/irq: Clean up IRQn_VECTOR macros

2015-05-10 Thread tip-bot for Brian Gerst
Commit-ID:  8b455e6577f325289cf2d1b20f493b2fe5c6c316
Gitweb: http://git.kernel.org/tip/8b455e6577f325289cf2d1b20f493b2fe5c6c316
Author: Brian Gerst 
AuthorDate: Sat, 9 May 2015 11:36:53 -0400
Committer:  Ingo Molnar 
CommitDate: Sun, 10 May 2015 12:34:28 +0200

x86/asm/entry/irq: Clean up IRQn_VECTOR macros

Since the ISA irqs are in a single block, use
ISA_IRQ_VECTOR(irq) instead of individual macros.

Signed-off-by: Brian Gerst 
Cc: Andrew Morton 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1431185813-15413-5-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/irq_vectors.h | 18 +-
 arch/x86/kernel/apic/io_apic.c |  4 ++--
 arch/x86/kernel/apic/vector.c  |  2 +-
 arch/x86/kernel/i8259.c|  8 
 arch/x86/kernel/irqinit.c  |  4 ++--
 5 files changed, 10 insertions(+), 26 deletions(-)

diff --git a/arch/x86/include/asm/irq_vectors.h 
b/arch/x86/include/asm/irq_vectors.h
index 07f2792..117db96 100644
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -52,23 +52,7 @@
  * Vectors 0x30-0x3f are used for ISA interrupts.
  *   round up to the next 16-vector boundary
  */
-#define IRQ0_VECTOR((FIRST_EXTERNAL_VECTOR + 16) & ~15)
-
-#define IRQ1_VECTOR(IRQ0_VECTOR +  1)
-#define IRQ2_VECTOR(IRQ0_VECTOR +  2)
-#define IRQ3_VECTOR(IRQ0_VECTOR +  3)
-#define IRQ4_VECTOR(IRQ0_VECTOR +  4)
-#define IRQ5_VECTOR(IRQ0_VECTOR +  5)
-#define IRQ6_VECTOR(IRQ0_VECTOR +  6)
-#define IRQ7_VECTOR(IRQ0_VECTOR +  7)
-#define IRQ8_VECTOR(IRQ0_VECTOR +  8)
-#define IRQ9_VECTOR(IRQ0_VECTOR +  9)
-#define IRQ10_VECTOR   (IRQ0_VECTOR + 10)
-#define IRQ11_VECTOR   (IRQ0_VECTOR + 11)
-#define IRQ12_VECTOR   (IRQ0_VECTOR + 12)
-#define IRQ13_VECTOR   (IRQ0_VECTOR + 13)
-#define IRQ14_VECTOR   (IRQ0_VECTOR + 14)
-#define IRQ15_VECTOR   (IRQ0_VECTOR + 15)
+#define ISA_IRQ_VECTOR(irq)(((FIRST_EXTERNAL_VECTOR + 16) & ~15) + 
irq)
 
 /*
  * Special IRQ vectors used by the SMP architecture, 0xf0-0xff
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index f4dc246..e01e411 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -258,11 +258,11 @@ int __init arch_early_ioapic_init(void)
 
/*
 * For legacy IRQ's, start with assigning irq0 to irq15 to
-* IRQ0_VECTOR to IRQ15_VECTOR for all cpu's.
+* ISA_IRQ_VECTOR(irq) for all cpu's.
 */
for (i = 0; i < nr_legacy_irqs(); i++) {
cfg = alloc_irq_and_cfg_at(i, node);
-   cfg->vector = IRQ0_VECTOR + i;
+   cfg->vector = ISA_IRQ_VECTOR(i);
cpumask_setall(cfg->domain);
}
 
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index 6cedd79..82d44c3 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -314,7 +314,7 @@ void setup_vector_irq(int cpu)
 * legacy vector to irq mapping:
 */
for (irq = 0; irq < nr_legacy_irqs(); irq++)
-   per_cpu(vector_irq, cpu)[IRQ0_VECTOR + irq] = irq;
+   per_cpu(vector_irq, cpu)[ISA_IRQ_VECTOR(irq)] = irq;
 
__setup_vector_irq(cpu);
 }
diff --git a/arch/x86/kernel/i8259.c b/arch/x86/kernel/i8259.c
index e7cc537..16cb827 100644
--- a/arch/x86/kernel/i8259.c
+++ b/arch/x86/kernel/i8259.c
@@ -329,8 +329,8 @@ static void init_8259A(int auto_eoi)
 */
outb_pic(0x11, PIC_MASTER_CMD); /* ICW1: select 8259A-1 init */
 
-   /* ICW2: 8259A-1 IR0-7 mapped to 0x30-0x37 */
-   outb_pic(IRQ0_VECTOR, PIC_MASTER_IMR);
+   /* ICW2: 8259A-1 IR0-7 mapped to ISA_IRQ_VECTOR(0) */
+   outb_pic(ISA_IRQ_VECTOR(0), PIC_MASTER_IMR);
 
/* 8259A-1 (the master) has a slave on IR2 */
outb_pic(1U << PIC_CASCADE_IR, PIC_MASTER_IMR);
@@ -342,8 +342,8 @@ static void init_8259A(int auto_eoi)
 
outb_pic(0x11, PIC_SLAVE_CMD);  /* ICW1: select 8259A-2 init */
 
-   /* ICW2: 8259A-2 IR0-7 mapped to IRQ8_VECTOR */
-   outb_pic(IRQ8_VECTOR, PIC_SLAVE_IMR);
+   /* ICW2: 8259A-2 IR0-7 mapped to ISA_IRQ_VECTOR(8) */
+   outb_pic(ISA_IRQ_VECTOR(8), PIC_SLAVE_IMR);
/* 8259A-2 is a slave on master's IR2 */
outb_pic(PIC_CASCADE_IR, PIC_SLAVE_IMR);
/* (slave's support for AEOI in flat mode is to be investigated) */
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c
index cd10a64..dc1e08d 100644
--- a/arch/x86/kernel/irqinit.c
+++ b/arch/x86/kernel/irqinit.c
@@ -86,7 +86,7 @@ void __init init

[tip:x86/asm] x86/irq: Merge irq_regs & irq_stat

2015-05-10 Thread tip-bot for Brian Gerst
Commit-ID:  c5bde906d2916d214d78cd8b67d665bf09867033
Gitweb: http://git.kernel.org/tip/c5bde906d2916d214d78cd8b67d665bf09867033
Author: Brian Gerst 
AuthorDate: Sat, 9 May 2015 11:36:50 -0400
Committer:  Ingo Molnar 
CommitDate: Sun, 10 May 2015 12:34:27 +0200

x86/irq: Merge irq_regs & irq_stat

Move irq_regs and irq_stat definitions to irq.c.

Signed-off-by: Brian Gerst 
Cc: Andrew Morton 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1431185813-15413-2-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/kernel/irq.c| 6 ++
 arch/x86/kernel/irq_32.c | 6 --
 arch/x86/kernel/irq_64.c | 6 --
 3 files changed, 6 insertions(+), 12 deletions(-)

diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index e5952c2..fe2ed8b 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -22,6 +22,12 @@
 #define CREATE_TRACE_POINTS
 #include 
 
+DEFINE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat);
+EXPORT_PER_CPU_SYMBOL(irq_stat);
+
+DEFINE_PER_CPU(struct pt_regs *, irq_regs);
+EXPORT_PER_CPU_SYMBOL(irq_regs);
+
 atomic_t irq_err_count;
 
 /* Function pointer for generic interrupt vector handling */
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c
index f9fd86a..cd74f59 100644
--- a/arch/x86/kernel/irq_32.c
+++ b/arch/x86/kernel/irq_32.c
@@ -21,12 +21,6 @@
 
 #include 
 
-DEFINE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat);
-EXPORT_PER_CPU_SYMBOL(irq_stat);
-
-DEFINE_PER_CPU(struct pt_regs *, irq_regs);
-EXPORT_PER_CPU_SYMBOL(irq_regs);
-
 #ifdef CONFIG_DEBUG_STACKOVERFLOW
 
 int sysctl_panic_on_stackoverflow __read_mostly;
diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c
index 394e643..bc4604e 100644
--- a/arch/x86/kernel/irq_64.c
+++ b/arch/x86/kernel/irq_64.c
@@ -20,12 +20,6 @@
 #include 
 #include 
 
-DEFINE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat);
-EXPORT_PER_CPU_SYMBOL(irq_stat);
-
-DEFINE_PER_CPU(struct pt_regs *, irq_regs);
-EXPORT_PER_CPU_SYMBOL(irq_regs);
-
 int sysctl_panic_on_stackoverflow;
 
 /*
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/asm/entry/irq: Remove unused invalidate_interrupt prototypes

2015-05-10 Thread tip-bot for Brian Gerst
Commit-ID:  c6e692f95dacddff5f3607717fb2246c60bbb714
Gitweb: http://git.kernel.org/tip/c6e692f95dacddff5f3607717fb2246c60bbb714
Author: Brian Gerst 
AuthorDate: Sat, 9 May 2015 11:36:51 -0400
Committer:  Ingo Molnar 
CommitDate: Sun, 10 May 2015 12:34:28 +0200

x86/asm/entry/irq: Remove unused invalidate_interrupt prototypes

The invalidate_interrupt* functions no longer exist.

Signed-off-by: Brian Gerst 
Cc: Andrew Morton 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1431185813-15413-3-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/hw_irq.h | 35 ---
 1 file changed, 35 deletions(-)

diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index e9571dd..014c638 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -36,40 +36,6 @@ extern asmlinkage void spurious_interrupt(void);
 extern asmlinkage void thermal_interrupt(void);
 extern asmlinkage void reschedule_interrupt(void);
 
-extern asmlinkage void invalidate_interrupt(void);
-extern asmlinkage void invalidate_interrupt0(void);
-extern asmlinkage void invalidate_interrupt1(void);
-extern asmlinkage void invalidate_interrupt2(void);
-extern asmlinkage void invalidate_interrupt3(void);
-extern asmlinkage void invalidate_interrupt4(void);
-extern asmlinkage void invalidate_interrupt5(void);
-extern asmlinkage void invalidate_interrupt6(void);
-extern asmlinkage void invalidate_interrupt7(void);
-extern asmlinkage void invalidate_interrupt8(void);
-extern asmlinkage void invalidate_interrupt9(void);
-extern asmlinkage void invalidate_interrupt10(void);
-extern asmlinkage void invalidate_interrupt11(void);
-extern asmlinkage void invalidate_interrupt12(void);
-extern asmlinkage void invalidate_interrupt13(void);
-extern asmlinkage void invalidate_interrupt14(void);
-extern asmlinkage void invalidate_interrupt15(void);
-extern asmlinkage void invalidate_interrupt16(void);
-extern asmlinkage void invalidate_interrupt17(void);
-extern asmlinkage void invalidate_interrupt18(void);
-extern asmlinkage void invalidate_interrupt19(void);
-extern asmlinkage void invalidate_interrupt20(void);
-extern asmlinkage void invalidate_interrupt21(void);
-extern asmlinkage void invalidate_interrupt22(void);
-extern asmlinkage void invalidate_interrupt23(void);
-extern asmlinkage void invalidate_interrupt24(void);
-extern asmlinkage void invalidate_interrupt25(void);
-extern asmlinkage void invalidate_interrupt26(void);
-extern asmlinkage void invalidate_interrupt27(void);
-extern asmlinkage void invalidate_interrupt28(void);
-extern asmlinkage void invalidate_interrupt29(void);
-extern asmlinkage void invalidate_interrupt30(void);
-extern asmlinkage void invalidate_interrupt31(void);
-
 extern asmlinkage void irq_move_cleanup_interrupt(void);
 extern asmlinkage void reboot_interrupt(void);
 extern asmlinkage void threshold_interrupt(void);
@@ -178,7 +144,6 @@ extern asmlinkage void smp_irq_move_cleanup_interrupt(void);
 extern __visible void smp_reschedule_interrupt(struct pt_regs *);
 extern __visible void smp_call_function_interrupt(struct pt_regs *);
 extern __visible void smp_call_function_single_interrupt(struct pt_regs *);
-extern __visible void smp_invalidate_interrupt(struct pt_regs *);
 #endif
 
 extern char irq_entries_start[];
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/cleanups] x86: Merge common 32-bit values in asm-offsets.c

2015-05-05 Thread tip-bot for Brian Gerst
Commit-ID:  fd91784beb91239a697f855b6cda5035c1c5d6a7
Gitweb: http://git.kernel.org/tip/fd91784beb91239a697f855b6cda5035c1c5d6a7
Author: Brian Gerst 
AuthorDate: Sun, 12 Apr 2015 09:14:45 -0400
Committer:  Thomas Gleixner 
CommitDate: Tue, 5 May 2015 20:48:02 +0200

x86: Merge common 32-bit values in asm-offsets.c

Merge common values for 32-bit native and compat.

Signed-off-by: Brian Gerst 
Cc: Denys Vlasenko 
Acked-by: Andy Lutomirski 
Link: 
http://lkml.kernel.org/r/1428844486-6638-1-git-send-email-brge...@gmail.com
Signed-off-by: Thomas Gleixner 
---
 arch/x86/kernel/asm-offsets.c| 19 +++
 arch/x86/kernel/asm-offsets_32.c | 15 ---
 arch/x86/kernel/asm-offsets_64.c | 21 -
 3 files changed, 19 insertions(+), 36 deletions(-)

diff --git a/arch/x86/kernel/asm-offsets.c b/arch/x86/kernel/asm-offsets.c
index 9f6b934..b27f6ec 100644
--- a/arch/x86/kernel/asm-offsets.c
+++ b/arch/x86/kernel/asm-offsets.c
@@ -41,6 +41,25 @@ void common(void) {
OFFSET(pbe_orig_address, pbe, orig_address);
OFFSET(pbe_next, pbe, next);
 
+#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
+   BLANK();
+   OFFSET(IA32_SIGCONTEXT_ax, sigcontext_ia32, ax);
+   OFFSET(IA32_SIGCONTEXT_bx, sigcontext_ia32, bx);
+   OFFSET(IA32_SIGCONTEXT_cx, sigcontext_ia32, cx);
+   OFFSET(IA32_SIGCONTEXT_dx, sigcontext_ia32, dx);
+   OFFSET(IA32_SIGCONTEXT_si, sigcontext_ia32, si);
+   OFFSET(IA32_SIGCONTEXT_di, sigcontext_ia32, di);
+   OFFSET(IA32_SIGCONTEXT_bp, sigcontext_ia32, bp);
+   OFFSET(IA32_SIGCONTEXT_sp, sigcontext_ia32, sp);
+   OFFSET(IA32_SIGCONTEXT_ip, sigcontext_ia32, ip);
+
+   BLANK();
+   OFFSET(TI_sysenter_return, thread_info, sysenter_return);
+
+   BLANK();
+   OFFSET(IA32_RT_SIGFRAME_sigcontext, rt_sigframe_ia32, uc.uc_mcontext);
+#endif
+
 #ifdef CONFIG_PARAVIRT
BLANK();
OFFSET(PARAVIRT_enabled, pv_info, paravirt_enabled);
diff --git a/arch/x86/kernel/asm-offsets_32.c b/arch/x86/kernel/asm-offsets_32.c
index 47703ae..628bfd4c 100644
--- a/arch/x86/kernel/asm-offsets_32.c
+++ b/arch/x86/kernel/asm-offsets_32.c
@@ -17,17 +17,6 @@ void foo(void);
 
 void foo(void)
 {
-   OFFSET(IA32_SIGCONTEXT_ax, sigcontext, ax);
-   OFFSET(IA32_SIGCONTEXT_bx, sigcontext, bx);
-   OFFSET(IA32_SIGCONTEXT_cx, sigcontext, cx);
-   OFFSET(IA32_SIGCONTEXT_dx, sigcontext, dx);
-   OFFSET(IA32_SIGCONTEXT_si, sigcontext, si);
-   OFFSET(IA32_SIGCONTEXT_di, sigcontext, di);
-   OFFSET(IA32_SIGCONTEXT_bp, sigcontext, bp);
-   OFFSET(IA32_SIGCONTEXT_sp, sigcontext, sp);
-   OFFSET(IA32_SIGCONTEXT_ip, sigcontext, ip);
-   BLANK();
-
OFFSET(CPUINFO_x86, cpuinfo_x86, x86);
OFFSET(CPUINFO_x86_vendor, cpuinfo_x86, x86_vendor);
OFFSET(CPUINFO_x86_model, cpuinfo_x86, x86_model);
@@ -37,7 +26,6 @@ void foo(void)
OFFSET(CPUINFO_x86_vendor_id, cpuinfo_x86, x86_vendor_id);
BLANK();
 
-   OFFSET(TI_sysenter_return, thread_info, sysenter_return);
OFFSET(TI_cpu, thread_info, cpu);
BLANK();
 
@@ -60,9 +48,6 @@ void foo(void)
OFFSET(PT_OLDSS,  pt_regs, ss);
BLANK();
 
-   OFFSET(IA32_RT_SIGFRAME_sigcontext, rt_sigframe, uc.uc_mcontext);
-   BLANK();
-
OFFSET(saved_context_gdt_desc, saved_context, gdt_desc);
BLANK();
 
diff --git a/arch/x86/kernel/asm-offsets_64.c b/arch/x86/kernel/asm-offsets_64.c
index 5ce6f2d..dcaab87 100644
--- a/arch/x86/kernel/asm-offsets_64.c
+++ b/arch/x86/kernel/asm-offsets_64.c
@@ -29,27 +29,6 @@ int main(void)
BLANK();
 #endif
 
-#ifdef CONFIG_IA32_EMULATION
-   OFFSET(TI_sysenter_return, thread_info, sysenter_return);
-   BLANK();
-
-#define ENTRY(entry) OFFSET(IA32_SIGCONTEXT_ ## entry, sigcontext_ia32, entry)
-   ENTRY(ax);
-   ENTRY(bx);
-   ENTRY(cx);
-   ENTRY(dx);
-   ENTRY(si);
-   ENTRY(di);
-   ENTRY(bp);
-   ENTRY(sp);
-   ENTRY(ip);
-   BLANK();
-#undef ENTRY
-
-   OFFSET(IA32_RT_SIGFRAME_sigcontext, rt_sigframe_ia32, uc.uc_mcontext);
-   BLANK();
-#endif
-
 #define ENTRY(entry) OFFSET(pt_regs_ ## entry, pt_regs, entry)
ENTRY(bx);
ENTRY(cx);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/cleanups] x86: Remove unused TI_cpu

2015-05-05 Thread tip-bot for Brian Gerst
Commit-ID:  c07e5a542e41b87583a8bc0e2849d14bbe919be0
Gitweb: http://git.kernel.org/tip/c07e5a542e41b87583a8bc0e2849d14bbe919be0
Author: Brian Gerst 
AuthorDate: Sun, 12 Apr 2015 09:14:46 -0400
Committer:  Thomas Gleixner 
CommitDate: Tue, 5 May 2015 20:48:02 +0200

x86: Remove unused TI_cpu

Signed-off-by: Brian Gerst 
Cc: Denys Vlasenko 
Acked-by: Andy Lutomirski 
Link: 
http://lkml.kernel.org/r/1428844486-6638-2-git-send-email-brge...@gmail.com
Signed-off-by: Thomas Gleixner 
---
 arch/x86/kernel/asm-offsets_32.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/arch/x86/kernel/asm-offsets_32.c b/arch/x86/kernel/asm-offsets_32.c
index 628bfd4c..6ce3902 100644
--- a/arch/x86/kernel/asm-offsets_32.c
+++ b/arch/x86/kernel/asm-offsets_32.c
@@ -26,9 +26,6 @@ void foo(void)
OFFSET(CPUINFO_x86_vendor_id, cpuinfo_x86, x86_vendor_id);
BLANK();
 
-   OFFSET(TI_cpu, thread_info, cpu);
-   BLANK();
-
OFFSET(PT_EBX, pt_regs, bx);
OFFSET(PT_ECX, pt_regs, cx);
OFFSET(PT_EDX, pt_regs, dx);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/asm: Remove unused TI_cpu

2015-04-15 Thread tip-bot for Brian Gerst
Commit-ID:  14434052ffb3b7fe8f491e9d0a7793376fb79155
Gitweb: http://git.kernel.org/tip/14434052ffb3b7fe8f491e9d0a7793376fb79155
Author: Brian Gerst 
AuthorDate: Sun, 12 Apr 2015 09:14:46 -0400
Committer:  Ingo Molnar 
CommitDate: Wed, 15 Apr 2015 11:28:50 +0200

x86/asm: Remove unused TI_cpu

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Denys Vlasenko 
Link: 
http://lkml.kernel.org/r/1428844486-6638-2-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/kernel/asm-offsets_32.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/arch/x86/kernel/asm-offsets_32.c b/arch/x86/kernel/asm-offsets_32.c
index 628bfd4c..6ce3902 100644
--- a/arch/x86/kernel/asm-offsets_32.c
+++ b/arch/x86/kernel/asm-offsets_32.c
@@ -26,9 +26,6 @@ void foo(void)
OFFSET(CPUINFO_x86_vendor_id, cpuinfo_x86, x86_vendor_id);
BLANK();
 
-   OFFSET(TI_cpu, thread_info, cpu);
-   BLANK();
-
OFFSET(PT_EBX, pt_regs, bx);
OFFSET(PT_ECX, pt_regs, cx);
OFFSET(PT_EDX, pt_regs, dx);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/asm: Merge common 32-bit values in asm-offsets.c

2015-04-15 Thread tip-bot for Brian Gerst
Commit-ID:  4d178f94ebe123d462a51169b53854cb7f19
Gitweb: http://git.kernel.org/tip/4d178f94ebe123d462a51169b53854cb7f19
Author: Brian Gerst 
AuthorDate: Sun, 12 Apr 2015 09:14:45 -0400
Committer:  Ingo Molnar 
CommitDate: Wed, 15 Apr 2015 11:28:49 +0200

x86/asm: Merge common 32-bit values in asm-offsets.c

Merge common values for 32-bit native and compat.

Signed-off-by: Brian Gerst 
Acked-by: Andy Lutomirski 
Cc: Andy Lutomirski 
Cc: Denys Vlasenko 
Link: 
http://lkml.kernel.org/r/1428844486-6638-1-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/kernel/asm-offsets.c| 19 +++
 arch/x86/kernel/asm-offsets_32.c | 15 ---
 arch/x86/kernel/asm-offsets_64.c | 21 -
 3 files changed, 19 insertions(+), 36 deletions(-)

diff --git a/arch/x86/kernel/asm-offsets.c b/arch/x86/kernel/asm-offsets.c
index 9f6b934..b27f6ec 100644
--- a/arch/x86/kernel/asm-offsets.c
+++ b/arch/x86/kernel/asm-offsets.c
@@ -41,6 +41,25 @@ void common(void) {
OFFSET(pbe_orig_address, pbe, orig_address);
OFFSET(pbe_next, pbe, next);
 
+#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
+   BLANK();
+   OFFSET(IA32_SIGCONTEXT_ax, sigcontext_ia32, ax);
+   OFFSET(IA32_SIGCONTEXT_bx, sigcontext_ia32, bx);
+   OFFSET(IA32_SIGCONTEXT_cx, sigcontext_ia32, cx);
+   OFFSET(IA32_SIGCONTEXT_dx, sigcontext_ia32, dx);
+   OFFSET(IA32_SIGCONTEXT_si, sigcontext_ia32, si);
+   OFFSET(IA32_SIGCONTEXT_di, sigcontext_ia32, di);
+   OFFSET(IA32_SIGCONTEXT_bp, sigcontext_ia32, bp);
+   OFFSET(IA32_SIGCONTEXT_sp, sigcontext_ia32, sp);
+   OFFSET(IA32_SIGCONTEXT_ip, sigcontext_ia32, ip);
+
+   BLANK();
+   OFFSET(TI_sysenter_return, thread_info, sysenter_return);
+
+   BLANK();
+   OFFSET(IA32_RT_SIGFRAME_sigcontext, rt_sigframe_ia32, uc.uc_mcontext);
+#endif
+
 #ifdef CONFIG_PARAVIRT
BLANK();
OFFSET(PARAVIRT_enabled, pv_info, paravirt_enabled);
diff --git a/arch/x86/kernel/asm-offsets_32.c b/arch/x86/kernel/asm-offsets_32.c
index 47703ae..628bfd4c 100644
--- a/arch/x86/kernel/asm-offsets_32.c
+++ b/arch/x86/kernel/asm-offsets_32.c
@@ -17,17 +17,6 @@ void foo(void);
 
 void foo(void)
 {
-   OFFSET(IA32_SIGCONTEXT_ax, sigcontext, ax);
-   OFFSET(IA32_SIGCONTEXT_bx, sigcontext, bx);
-   OFFSET(IA32_SIGCONTEXT_cx, sigcontext, cx);
-   OFFSET(IA32_SIGCONTEXT_dx, sigcontext, dx);
-   OFFSET(IA32_SIGCONTEXT_si, sigcontext, si);
-   OFFSET(IA32_SIGCONTEXT_di, sigcontext, di);
-   OFFSET(IA32_SIGCONTEXT_bp, sigcontext, bp);
-   OFFSET(IA32_SIGCONTEXT_sp, sigcontext, sp);
-   OFFSET(IA32_SIGCONTEXT_ip, sigcontext, ip);
-   BLANK();
-
OFFSET(CPUINFO_x86, cpuinfo_x86, x86);
OFFSET(CPUINFO_x86_vendor, cpuinfo_x86, x86_vendor);
OFFSET(CPUINFO_x86_model, cpuinfo_x86, x86_model);
@@ -37,7 +26,6 @@ void foo(void)
OFFSET(CPUINFO_x86_vendor_id, cpuinfo_x86, x86_vendor_id);
BLANK();
 
-   OFFSET(TI_sysenter_return, thread_info, sysenter_return);
OFFSET(TI_cpu, thread_info, cpu);
BLANK();
 
@@ -60,9 +48,6 @@ void foo(void)
OFFSET(PT_OLDSS,  pt_regs, ss);
BLANK();
 
-   OFFSET(IA32_RT_SIGFRAME_sigcontext, rt_sigframe, uc.uc_mcontext);
-   BLANK();
-
OFFSET(saved_context_gdt_desc, saved_context, gdt_desc);
BLANK();
 
diff --git a/arch/x86/kernel/asm-offsets_64.c b/arch/x86/kernel/asm-offsets_64.c
index 5ce6f2d..dcaab87 100644
--- a/arch/x86/kernel/asm-offsets_64.c
+++ b/arch/x86/kernel/asm-offsets_64.c
@@ -29,27 +29,6 @@ int main(void)
BLANK();
 #endif
 
-#ifdef CONFIG_IA32_EMULATION
-   OFFSET(TI_sysenter_return, thread_info, sysenter_return);
-   BLANK();
-
-#define ENTRY(entry) OFFSET(IA32_SIGCONTEXT_ ## entry, sigcontext_ia32, entry)
-   ENTRY(ax);
-   ENTRY(bx);
-   ENTRY(cx);
-   ENTRY(dx);
-   ENTRY(si);
-   ENTRY(di);
-   ENTRY(bp);
-   ENTRY(sp);
-   ENTRY(ip);
-   BLANK();
-#undef ENTRY
-
-   OFFSET(IA32_RT_SIGFRAME_sigcontext, rt_sigframe_ia32, uc.uc_mcontext);
-   BLANK();
-#endif
-
 #define ENTRY(entry) OFFSET(pt_regs_ ## entry, pt_regs, entry)
ENTRY(bx);
ENTRY(cx);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/signal: Remove pax argument from restore_sigcontext

2015-04-07 Thread tip-bot for Brian Gerst
Commit-ID:  6a3713f001b3b53587e411ab0d3036ae9b0fb93b
Gitweb: http://git.kernel.org/tip/6a3713f001b3b53587e411ab0d3036ae9b0fb93b
Author: Brian Gerst 
AuthorDate: Sat, 4 Apr 2015 08:58:23 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 6 Apr 2015 09:06:39 +0200

x86/signal: Remove pax argument from restore_sigcontext

The 'pax' argument is unnecesary.  Instead, store the RAX value
directly in regs.

This pattern goes all the way back to 2.1.106pre1, when restore_sigcontext()
was changed to return an error code instead of EAX directly:

  
https://git.kernel.org/cgit/linux/kernel/git/history/history.git/diff/arch/i386/kernel/signal.c?id=9a8f8b7ca3f319bd668298d447bdf32730e51174

In 2007 sigaltstack syscall support was added, where the return
value of restore_sigcontext() was changed to carry the memory-copying
failure code.

But instead of putting 'ax' into regs->ax directly, it was carried
in via a pointer and then returned, where the generic syscall return
code copied it to regs->ax.

So there was never any deeper reason for this suboptimal pattern, it
was simply never noticed after being introduced.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1428152303-17154-1-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/ia32/ia32_signal.c| 17 ++---
 arch/x86/include/asm/sighandling.h |  4 +---
 arch/x86/kernel/signal.c   | 22 --
 3 files changed, 15 insertions(+), 28 deletions(-)

diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index 1f5e2b0..c81d35e6 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -161,8 +161,7 @@ int copy_siginfo_from_user32(siginfo_t *to, 
compat_siginfo_t __user *from)
 }
 
 static int ia32_restore_sigcontext(struct pt_regs *regs,
-  struct sigcontext_ia32 __user *sc,
-  unsigned int *pax)
+  struct sigcontext_ia32 __user *sc)
 {
unsigned int tmpflags, err = 0;
void __user *buf;
@@ -184,7 +183,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
RELOAD_SEG(es);
 
COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
-   COPY(dx); COPY(cx); COPY(ip);
+   COPY(dx); COPY(cx); COPY(ip); COPY(ax);
/* Don't touch extended registers */
 
COPY_SEG_CPL3(cs);
@@ -197,8 +196,6 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
 
get_user_ex(tmp, &sc->fpstate);
buf = compat_ptr(tmp);
-
-   get_user_ex(*pax, &sc->ax);
} get_user_catch(err);
 
err |= restore_xstate_sig(buf, 1);
@@ -213,7 +210,6 @@ asmlinkage long sys32_sigreturn(void)
struct pt_regs *regs = current_pt_regs();
struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user 
*)(regs->sp-8);
sigset_t set;
-   unsigned int ax;
 
if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
goto badframe;
@@ -226,9 +222,9 @@ asmlinkage long sys32_sigreturn(void)
 
set_current_blocked(&set);
 
-   if (ia32_restore_sigcontext(regs, &frame->sc, &ax))
+   if (ia32_restore_sigcontext(regs, &frame->sc))
goto badframe;
-   return ax;
+   return regs->ax;
 
 badframe:
signal_fault(regs, frame, "32bit sigreturn");
@@ -240,7 +236,6 @@ asmlinkage long sys32_rt_sigreturn(void)
struct pt_regs *regs = current_pt_regs();
struct rt_sigframe_ia32 __user *frame;
sigset_t set;
-   unsigned int ax;
 
frame = (struct rt_sigframe_ia32 __user *)(regs->sp - 4);
 
@@ -251,13 +246,13 @@ asmlinkage long sys32_rt_sigreturn(void)
 
set_current_blocked(&set);
 
-   if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
+   if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext))
goto badframe;
 
if (compat_restore_altstack(&frame->uc.uc_stack))
goto badframe;
 
-   return ax;
+   return regs->ax;
 
 badframe:
signal_fault(regs, frame, "32bit rt sigreturn");
diff --git a/arch/x86/include/asm/sighandling.h 
b/arch/x86/include/asm/sighandling.h
index 7a95816..89db467 100644
--- a/arch/x86/include/asm/sighandling.h
+++ b/arch/x86/include/asm/sighandling.h
@@ -13,9 +13,7 @@
 X86_EFLAGS_CF | X86_EFLAGS_RF)
 
 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
-
-int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
-  unsigned long *pax);
+int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc);
 int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate,
 struct pt_regs *regs, unsigned long mask);
 
d

[tip:x86/asm] x86/asm/entry: Fix execve() and sigreturn() syscalls to always return via IRET

2015-03-23 Thread tip-bot for Brian Gerst
Commit-ID:  1daeaa315164c60b937f56fe3848d4328c358eba
Gitweb: http://git.kernel.org/tip/1daeaa315164c60b937f56fe3848d4328c358eba
Author: Brian Gerst 
AuthorDate: Sat, 21 Mar 2015 18:54:21 -0400
Committer:  Ingo Molnar 
CommitDate: Mon, 23 Mar 2015 08:52:46 +0100

x86/asm/entry: Fix execve() and sigreturn() syscalls to always return via IRET

Both the execve() and sigreturn() family of syscalls have the
ability to change registers in ways that may not be compatabile
with the syscall path they were called from.

In particular, SYSRET and SYSEXIT can't handle non-default %cs and %ss,
and some bits in eflags.

These syscalls have stubs that are hardcoded to jump to the IRET path,
and not return to the original syscall path.

The following commit:

   76f5df43cab5e76 ("Always allocate a complete "struct pt_regs" on the kernel 
stack")

recently changed this for some 32-bit compat syscalls, but introduced a bug 
where
execve from a 32-bit program to a 64-bit program would fail because it still 
returned
via SYSRETL. This caused Wine to fail when built for both 32-bit and 64-bit.

This patch sets TIF_NOTIFY_RESUME for execve() and sigreturn() so
that the IRET path is always taken on exit to userspace.

Signed-off-by: Brian Gerst 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Link: 
http://lkml.kernel.org/r/1426978461-32089-1-git-send-email-brge...@gmail.com
[ Improved the changelog and comments. ]
Signed-off-by: Ingo Molnar 
---
 arch/x86/ia32/ia32_signal.c|  2 ++
 arch/x86/include/asm/ptrace.h  |  2 +-
 arch/x86/include/asm/thread_info.h | 10 ++
 arch/x86/kernel/process_32.c   |  6 +-
 arch/x86/kernel/process_64.c   |  1 +
 arch/x86/kernel/signal.c   |  2 ++
 6 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index d0165c9..1f5e2b0 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -203,6 +203,8 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
 
err |= restore_xstate_sig(buf, 1);
 
+   force_iret();
+
return err;
 }
 
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h
index 74bb2e0..83b874d 100644
--- a/arch/x86/include/asm/ptrace.h
+++ b/arch/x86/include/asm/ptrace.h
@@ -251,7 +251,7 @@ static inline unsigned long 
regs_get_kernel_stack_nth(struct pt_regs *regs,
  */
 #define arch_ptrace_stop_needed(code, info)\
 ({ \
-   set_thread_flag(TIF_NOTIFY_RESUME); \
+   force_iret();   \
false;  \
 })
 
diff --git a/arch/x86/include/asm/thread_info.h 
b/arch/x86/include/asm/thread_info.h
index ba115eb..0abf7ab 100644
--- a/arch/x86/include/asm/thread_info.h
+++ b/arch/x86/include/asm/thread_info.h
@@ -260,6 +260,16 @@ static inline bool is_ia32_task(void)
 #endif
return false;
 }
+
+/*
+ * Force syscall return via IRET by making it look as if there was
+ * some work pending. IRET is our most capable (but slowest) syscall
+ * return path, which is able to restore modified SS, CS and certain
+ * EFLAGS values that other (fast) syscall return instructions
+ * are not able to restore properly.
+ */
+#define force_iret() set_thread_flag(TIF_NOTIFY_RESUME)
+
 #endif /* !__ASSEMBLY__ */
 
 #ifndef __ASSEMBLY__
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
index 1b9963f..26c596d 100644
--- a/arch/x86/kernel/process_32.c
+++ b/arch/x86/kernel/process_32.c
@@ -206,11 +206,7 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, 
unsigned long new_sp)
regs->ip= new_ip;
regs->sp= new_sp;
regs->flags = X86_EFLAGS_IF;
-   /*
-* force it to the iret return path by making it look as if there was
-* some work pending.
-*/
-   set_thread_flag(TIF_NOTIFY_RESUME);
+   force_iret();
 }
 EXPORT_SYMBOL_GPL(start_thread);
 
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index 97f5658..da8b745 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -239,6 +239,7 @@ start_thread_common(struct pt_regs *regs, unsigned long 
new_ip,
regs->cs= _cs;
regs->ss= _ss;
regs->flags = X86_EFLAGS_IF;
+   force_iret();
 }
 
 void
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index edcb862..eaa2c5e 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -108,6 +108,8 @@ int restore_sigcontext(struct pt_regs *regs, struct 
sigcontext __user *sc,
 
err |= restore_xstate_sig(buf, config_enabled(CONFIG_X86_32));
 
+   force_iret();
+
return err;
 }
 
--
To 

[tip:x86/asm] x86/compat: Merge native and compat 32-bit syscall tables

2015-03-03 Thread tip-bot for Brian Gerst
Commit-ID:  2aa4a710928863e84cb71e60b7c839d12403f5ca
Gitweb: http://git.kernel.org/tip/2aa4a710928863e84cb71e60b7c839d12403f5ca
Author: Brian Gerst 
AuthorDate: Tue, 3 Mar 2015 22:31:33 -0500
Committer:  Ingo Molnar 
CommitDate: Wed, 4 Mar 2015 06:16:21 +0100

x86/compat: Merge native and compat 32-bit syscall tables

Combine the 32-bit syscall tables into one file.

Signed-off-by: Brian Gerst 
Cc: Borislav Petkov 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1425439896-8322-3-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/ia32/Makefile   |  1 -
 arch/x86/ia32/syscall_ia32.c | 25 -
 arch/x86/kernel/Makefile |  1 +
 arch/x86/kernel/syscall_32.c | 16 
 4 files changed, 13 insertions(+), 30 deletions(-)

diff --git a/arch/x86/ia32/Makefile b/arch/x86/ia32/Makefile
index e66d850..bb635c6 100644
--- a/arch/x86/ia32/Makefile
+++ b/arch/x86/ia32/Makefile
@@ -3,7 +3,6 @@
 #
 
 obj-$(CONFIG_IA32_EMULATION) := ia32entry.o sys_ia32.o ia32_signal.o
-obj-$(CONFIG_IA32_EMULATION) += syscall_ia32.o
 
 obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
 
diff --git a/arch/x86/ia32/syscall_ia32.c b/arch/x86/ia32/syscall_ia32.c
deleted file mode 100644
index 3429b14..000
--- a/arch/x86/ia32/syscall_ia32.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* System call table for ia32 emulation. */
-
-#include 
-#include 
-#include 
-#include 
-
-#define __SYSCALL_I386(nr, sym, compat) extern asmlinkage void compat(void) ;
-#include 
-#undef __SYSCALL_I386
-
-#define __SYSCALL_I386(nr, sym, compat) [nr] = compat,
-
-typedef void (*sys_call_ptr_t)(void);
-
-extern asmlinkage void sys_ni_syscall(void);
-
-const sys_call_ptr_t ia32_sys_call_table[__NR_ia32_syscall_max+1] = {
-   /*
-* Smells like a compiler bug -- it doesn't work
-* when the & below is removed.
-*/
-   [0 ... __NR_ia32_syscall_max] = &sys_ni_syscall,
-#include 
-};
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 5d4502c..62fbe71 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -28,6 +28,7 @@ obj-$(CONFIG_X86_32)  += i386_ksyms_32.o
 obj-$(CONFIG_X86_64)   += sys_x86_64.o x8664_ksyms_64.o
 obj-$(CONFIG_X86_64)   += mcount_64.o
 obj-y  += syscall_$(BITS).o vsyscall_gtod.o
+obj-$(CONFIG_IA32_EMULATION)   += syscall_32.o
 obj-$(CONFIG_X86_VSYSCALL_EMULATION)   += vsyscall_64.o vsyscall_emu_64.o
 obj-$(CONFIG_X86_ESPFIX64) += espfix_64.o
 obj-$(CONFIG_SYSFS)+= ksysfs.o
diff --git a/arch/x86/kernel/syscall_32.c b/arch/x86/kernel/syscall_32.c
index e9bcd57..3777189 100644
--- a/arch/x86/kernel/syscall_32.c
+++ b/arch/x86/kernel/syscall_32.c
@@ -5,21 +5,29 @@
 #include 
 #include 
 
-#define __SYSCALL_I386(nr, sym, compat) extern asmlinkage void sym(void) ;
+#ifdef CONFIG_IA32_EMULATION
+#define SYM(sym, compat) compat
+#else
+#define SYM(sym, compat) sym
+#define ia32_sys_call_table sys_call_table
+#define __NR_ia32_syscall_max __NR_syscall_max
+#endif
+
+#define __SYSCALL_I386(nr, sym, compat) extern asmlinkage void SYM(sym, 
compat)(void) ;
 #include 
 #undef __SYSCALL_I386
 
-#define __SYSCALL_I386(nr, sym, compat) [nr] = sym,
+#define __SYSCALL_I386(nr, sym, compat) [nr] = SYM(sym, compat),
 
 typedef asmlinkage void (*sys_call_ptr_t)(void);
 
 extern asmlinkage void sys_ni_syscall(void);
 
-__visible const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = {
+__visible const sys_call_ptr_t ia32_sys_call_table[__NR_ia32_syscall_max+1] = {
/*
 * Smells like a compiler bug -- it doesn't work
 * when the & below is removed.
 */
-   [0 ... __NR_syscall_max] = &sys_ni_syscall,
+   [0 ... __NR_ia32_syscall_max] = &sys_ni_syscall,
 #include 
 };
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Remove sys32_vm86_warning

2015-03-03 Thread tip-bot for Brian Gerst
Commit-ID:  7e8e385aaf6ed5b64b5d9108081cfcdcdd021b78
Gitweb: http://git.kernel.org/tip/7e8e385aaf6ed5b64b5d9108081cfcdcdd021b78
Author: Brian Gerst 
AuthorDate: Tue, 3 Mar 2015 22:31:34 -0500
Committer:  Ingo Molnar 
CommitDate: Wed, 4 Mar 2015 06:16:21 +0100

x86/compat: Remove sys32_vm86_warning

The check against lastcomm is racy, and the message it produces
isn't necessary.  vm86 support can be disabled on a 32-bit
kernel also, and doesn't have this message.  Switch to
sys_ni_syscall instead.

Signed-off-by: Brian Gerst 
Cc: Borislav Petkov 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1425439896-8322-4-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/ia32/sys_ia32.c | 14 --
 arch/x86/syscalls/syscall_32.tbl |  4 ++--
 2 files changed, 2 insertions(+), 16 deletions(-)

diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c
index 8e0ceec..719cd70 100644
--- a/arch/x86/ia32/sys_ia32.c
+++ b/arch/x86/ia32/sys_ia32.c
@@ -201,20 +201,6 @@ long sys32_fadvise64_64(int fd, __u32 offset_low, __u32 
offset_high,
advice);
 }
 
-long sys32_vm86_warning(void)
-{
-   struct task_struct *me = current;
-   static char lastcomm[sizeof(me->comm)];
-
-   if (strncmp(lastcomm, me->comm, sizeof(lastcomm))) {
-   compat_printk(KERN_INFO
- "%s: vm86 mode not supported on 64 bit kernel\n",
- me->comm);
-   strncpy(lastcomm, me->comm, sizeof(lastcomm));
-   }
-   return -ENOSYS;
-}
-
 asmlinkage ssize_t sys32_readahead(int fd, unsigned off_lo, unsigned off_hi,
   size_t count)
 {
diff --git a/arch/x86/syscalls/syscall_32.tbl b/arch/x86/syscalls/syscall_32.tbl
index b3560ec..ef8187f 100644
--- a/arch/x86/syscalls/syscall_32.tbl
+++ b/arch/x86/syscalls/syscall_32.tbl
@@ -119,7 +119,7 @@
 110i386ioplsys_iopl
 111i386vhangup sys_vhangup
 112i386idle
-113i386vm86old sys_vm86old 
sys32_vm86_warning
+113i386vm86old sys_vm86old 
sys_ni_syscall
 114i386wait4   sys_wait4   
compat_sys_wait4
 115i386swapoff sys_swapoff
 116i386sysinfo sys_sysinfo 
compat_sys_sysinfo
@@ -172,7 +172,7 @@
 163i386mremap  sys_mremap
 164i386setresuid   sys_setresuid16
 165i386getresuid   sys_getresuid16
-166i386vm86sys_vm86
sys32_vm86_warning
+166i386vm86sys_vm86
sys_ni_syscall
 167i386query_module
 168i386pollsys_poll
 169i386nfsservctl
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/asm] x86/compat: Remove compat_ni_syscall()

2015-03-03 Thread tip-bot for Brian Gerst
Commit-ID:  29a5ff97fa0d8045d262a772c3853e3ef1ed98d8
Gitweb: http://git.kernel.org/tip/29a5ff97fa0d8045d262a772c3853e3ef1ed98d8
Author: Brian Gerst 
AuthorDate: Tue, 3 Mar 2015 22:31:32 -0500
Committer:  Ingo Molnar 
CommitDate: Wed, 4 Mar 2015 06:16:21 +0100

x86/compat: Remove compat_ni_syscall()

compat_ni_syscall() does the same thing as sys_ni_syscall().

Signed-off-by: Brian Gerst 
Cc: Borislav Petkov 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/1425439896-8322-2-git-send-email-brge...@gmail.com
Signed-off-by: Ingo Molnar 
---
 arch/x86/ia32/Makefile   | 2 +-
 arch/x86/ia32/nosyscall.c| 7 ---
 arch/x86/ia32/syscall_ia32.c | 4 ++--
 3 files changed, 3 insertions(+), 10 deletions(-)

diff --git a/arch/x86/ia32/Makefile b/arch/x86/ia32/Makefile
index e785b42..e66d850 100644
--- a/arch/x86/ia32/Makefile
+++ b/arch/x86/ia32/Makefile
@@ -3,7 +3,7 @@
 #
 
 obj-$(CONFIG_IA32_EMULATION) := ia32entry.o sys_ia32.o ia32_signal.o
-obj-$(CONFIG_IA32_EMULATION) += nosyscall.o syscall_ia32.o
+obj-$(CONFIG_IA32_EMULATION) += syscall_ia32.o
 
 obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
 
diff --git a/arch/x86/ia32/nosyscall.c b/arch/x86/ia32/nosyscall.c
deleted file mode 100644
index 51ecd5b..000
--- a/arch/x86/ia32/nosyscall.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include 
-#include 
-
-long compat_ni_syscall(void)
-{
-   return -ENOSYS;
-}
diff --git a/arch/x86/ia32/syscall_ia32.c b/arch/x86/ia32/syscall_ia32.c
index 4754ba0..3429b14 100644
--- a/arch/x86/ia32/syscall_ia32.c
+++ b/arch/x86/ia32/syscall_ia32.c
@@ -13,13 +13,13 @@
 
 typedef void (*sys_call_ptr_t)(void);
 
-extern void compat_ni_syscall(void);
+extern asmlinkage void sys_ni_syscall(void);
 
 const sys_call_ptr_t ia32_sys_call_table[__NR_ia32_syscall_max+1] = {
/*
 * Smells like a compiler bug -- it doesn't work
 * when the & below is removed.
 */
-   [0 ... __NR_ia32_syscall_max] = &compat_ni_syscall,
+   [0 ... __NR_ia32_syscall_max] = &sys_ni_syscall,
 #include 
 };
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/