diff options
| author | Brian Gerst <brgerst@gmail.com> | 2009-12-09 19:01:52 -0500 |
|---|---|---|
| committer | H. Peter Anvin <hpa@zytor.com> | 2009-12-09 19:28:10 -0500 |
| commit | 27f59559d63375a4d59e7c720a439d9f0b47edad (patch) | |
| tree | 7990a73f63b67ea6123f9be4767aad82911877c4 | |
| parent | e258e4e0b495e6ecbd073d6bef1eafb62a58919a (diff) | |
x86: Merge sys_iopl
Change 32-bit sys_iopl to PTREGSCALL1, and merge with 64-bit.
Signed-off-by: Brian Gerst <brgerst@gmail.com>
LKML-Reference: <1260403316-5679-3-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
| -rw-r--r-- | arch/x86/include/asm/syscalls.h | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_32.S | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/ioport.c | 28 |
3 files changed, 7 insertions, 29 deletions
diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h index 372b76edd63f..4b694cd904c4 100644 --- a/arch/x86/include/asm/syscalls.h +++ b/arch/x86/include/asm/syscalls.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | /* Common in X86_32 and X86_64 */ | 18 | /* Common in X86_32 and X86_64 */ |
| 19 | /* kernel/ioport.c */ | 19 | /* kernel/ioport.c */ |
| 20 | asmlinkage long sys_ioperm(unsigned long, unsigned long, int); | 20 | asmlinkage long sys_ioperm(unsigned long, unsigned long, int); |
| 21 | long sys_iopl(unsigned int, struct pt_regs *); | ||
| 21 | 22 | ||
| 22 | /* kernel/process.c */ | 23 | /* kernel/process.c */ |
| 23 | int sys_fork(struct pt_regs *); | 24 | int sys_fork(struct pt_regs *); |
| @@ -35,8 +36,6 @@ asmlinkage int sys_get_thread_area(struct user_desc __user *); | |||
| 35 | 36 | ||
| 36 | /* X86_32 only */ | 37 | /* X86_32 only */ |
| 37 | #ifdef CONFIG_X86_32 | 38 | #ifdef CONFIG_X86_32 |
| 38 | /* kernel/ioport.c */ | ||
| 39 | long sys_iopl(struct pt_regs *); | ||
| 40 | 39 | ||
| 41 | /* kernel/process_32.c */ | 40 | /* kernel/process_32.c */ |
| 42 | int sys_clone(struct pt_regs *); | 41 | int sys_clone(struct pt_regs *); |
| @@ -70,9 +69,6 @@ int sys_vm86(struct pt_regs *); | |||
| 70 | #else /* CONFIG_X86_32 */ | 69 | #else /* CONFIG_X86_32 */ |
| 71 | 70 | ||
| 72 | /* X86_64 only */ | 71 | /* X86_64 only */ |
| 73 | /* kernel/ioport.c */ | ||
| 74 | asmlinkage long sys_iopl(unsigned int, struct pt_regs *); | ||
| 75 | |||
| 76 | /* kernel/process_64.c */ | 72 | /* kernel/process_64.c */ |
| 77 | asmlinkage long sys_clone(unsigned long, unsigned long, | 73 | asmlinkage long sys_clone(unsigned long, unsigned long, |
| 78 | void __user *, void __user *, | 74 | void __user *, void __user *, |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 34dbfa909dd7..ab7fcef37453 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -758,7 +758,7 @@ ptregs_##name: \ | |||
| 758 | addl $4,%esp; \ | 758 | addl $4,%esp; \ |
| 759 | ret | 759 | ret |
| 760 | 760 | ||
| 761 | PTREGSCALL0(iopl) | 761 | PTREGSCALL1(iopl) |
| 762 | PTREGSCALL0(fork) | 762 | PTREGSCALL0(fork) |
| 763 | PTREGSCALL0(clone) | 763 | PTREGSCALL0(clone) |
| 764 | PTREGSCALL0(vfork) | 764 | PTREGSCALL0(vfork) |
diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c index 99c4d308f16b..85ecc7c57ba6 100644 --- a/arch/x86/kernel/ioport.c +++ b/arch/x86/kernel/ioport.c | |||
| @@ -103,9 +103,10 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) | |||
| 103 | * on system-call entry - see also fork() and the signal handling | 103 | * on system-call entry - see also fork() and the signal handling |
| 104 | * code. | 104 | * code. |
| 105 | */ | 105 | */ |
| 106 | static int do_iopl(unsigned int level, struct pt_regs *regs) | 106 | long sys_iopl(unsigned int level, struct pt_regs *regs) |
| 107 | { | 107 | { |
| 108 | unsigned int old = (regs->flags >> 12) & 3; | 108 | unsigned int old = (regs->flags >> 12) & 3; |
| 109 | struct thread_struct *t = ¤t->thread; | ||
| 109 | 110 | ||
| 110 | if (level > 3) | 111 | if (level > 3) |
| 111 | return -EINVAL; | 112 | return -EINVAL; |
| @@ -115,29 +116,10 @@ static int do_iopl(unsigned int level, struct pt_regs *regs) | |||
| 115 | return -EPERM; | 116 | return -EPERM; |
| 116 | } | 117 | } |
| 117 | regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12); | 118 | regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12); |
| 118 | |||
| 119 | return 0; | ||
| 120 | } | ||
| 121 | |||
| 122 | #ifdef CONFIG_X86_32 | 119 | #ifdef CONFIG_X86_32 |
| 123 | long sys_iopl(struct pt_regs *regs) | ||
| 124 | { | ||
| 125 | unsigned int level = regs->bx; | ||
| 126 | struct thread_struct *t = ¤t->thread; | ||
| 127 | int rc; | ||
| 128 | |||
| 129 | rc = do_iopl(level, regs); | ||
| 130 | if (rc < 0) | ||
| 131 | goto out; | ||
| 132 | |||
| 133 | t->iopl = level << 12; | 120 | t->iopl = level << 12; |
| 134 | set_iopl_mask(t->iopl); | 121 | set_iopl_mask(t->iopl); |
| 135 | out: | ||
| 136 | return rc; | ||
| 137 | } | ||
| 138 | #else | ||
| 139 | asmlinkage long sys_iopl(unsigned int level, struct pt_regs *regs) | ||
| 140 | { | ||
| 141 | return do_iopl(level, regs); | ||
| 142 | } | ||
| 143 | #endif | 122 | #endif |
| 123 | |||
| 124 | return 0; | ||
| 125 | } | ||
