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 /arch | |
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>
Diffstat (limited to 'arch')
-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 | } | ||