Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 297727
b: refs/heads/master
c: fca460f
h: refs/heads/master
i:
  297725: 4532f4d
  297723: fc92583
  297719: 1a553e2
  297711: bf321e2
  297695: 036bbfb
  297663: 6dc0bc1
  297599: 1331ff4
  297471: f7adfc7
v: v3
  • Loading branch information
H. Peter Anvin committed Feb 20, 2012
1 parent f80bcd7 commit 0ae27b2
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9d3897630e14b3d33bcb24a3c0fa9d60a01d3058
refs/heads/master: fca460f95e928bae373daa8295877b6905bc62b8
13 changes: 11 additions & 2 deletions trunk/arch/x86/include/asm/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <linux/types.h>
#include <linux/sched.h>
#include <asm/user32.h>
#include <asm/unistd.h>

#define COMPAT_USER_HZ 100
#define COMPAT_UTS_MACHINE "i686\0\0"
Expand Down Expand Up @@ -212,9 +213,17 @@ static inline void __user *arch_compat_alloc_user_space(long len)
return (void __user *)regs->sp - len;
}

static inline int is_compat_task(void)
static inline bool is_compat_task(void)
{
return current_thread_info()->status & TS_COMPAT;
#ifdef CONFIG_IA32_EMULATION
if (current_thread_info()->status & TS_COMPAT)
return true;
#endif
#ifdef CONFIG_X86_X32_ABI
if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)
return true;
#endif
return false;
}

#endif /* _ASM_X86_COMPAT_H */
5 changes: 3 additions & 2 deletions trunk/arch/x86/include/asm/syscall.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/sched.h>
#include <linux/err.h>
#include <asm/asm-offsets.h> /* For NR_syscalls */
#include <asm/unistd.h>

extern const unsigned long sys_call_table[];

Expand All @@ -26,13 +27,13 @@ extern const unsigned long sys_call_table[];
*/
static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
{
return regs->orig_ax;
return regs->orig_ax & __SYSCALL_MASK;
}

static inline void syscall_rollback(struct task_struct *task,
struct pt_regs *regs)
{
regs->ax = regs->orig_ax;
regs->ax = regs->orig_ax & __SYSCALL_MASK;
}

static inline long syscall_get_error(struct task_struct *task,
Expand Down
7 changes: 7 additions & 0 deletions trunk/arch/x86/include/asm/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@
#define __X32_SYSCALL_BIT 0x40000000

#ifdef __KERNEL__

# ifdef CONFIG_X86_X32_ABI
# define __SYSCALL_MASK (~(__X32_SYSCALL_BIT))
# else
# define __SYSCALL_MASK (~0)
# endif

# ifdef CONFIG_X86_32

# include <asm/unistd_32.h>
Expand Down
10 changes: 10 additions & 0 deletions trunk/arch/x86/kernel/entry_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,12 @@ GLOBAL(system_call_after_swapgs)
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
jnz tracesys
system_call_fastpath:
#if __SYSCALL_MASK == ~0
cmpq $__NR_syscall_max,%rax
#else
andl $__SYSCALL_MASK,%eax
cmpl $__NR_syscall_max,%eax
#endif
ja badsys
movq %r10,%rcx
call *sys_call_table(,%rax,8) # XXX: rip relative
Expand Down Expand Up @@ -596,7 +601,12 @@ tracesys:
*/
LOAD_ARGS ARGOFFSET, 1
RESTORE_REST
#if __SYSCALL_MASK == ~0
cmpq $__NR_syscall_max,%rax
#else
andl $__SYSCALL_MASK,%eax
cmpl $__NR_syscall_max,%eax
#endif
ja int_ret_from_sys_call /* RAX(%rsp) set to -ENOSYS above */
movq %r10,%rcx /* fixup for C */
call *sys_call_table(,%rax,8)
Expand Down

0 comments on commit 0ae27b2

Please sign in to comment.