x86: Merge sys_iopl
authorBrian Gerst <brgerst@gmail.com>
Thu, 10 Dec 2009 00:01:52 +0000 (19:01 -0500)
committerH. Peter Anvin <hpa@zytor.com>
Thu, 10 Dec 2009 00:28:10 +0000 (16:28 -0800)
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>
arch/x86/include/asm/syscalls.h
arch/x86/kernel/entry_32.S
arch/x86/kernel/ioport.c

index 372b76edd63f69053c76bcf7501eb71c35bb8f93..4b694cd904c45c27ed8facf7a5401e191cf964d5 100644 (file)
@@ -18,6 +18,7 @@
 /* Common in X86_32 and X86_64 */
 /* kernel/ioport.c */
 asmlinkage long sys_ioperm(unsigned long, unsigned long, int);
+long sys_iopl(unsigned int, struct pt_regs *);
 
 /* kernel/process.c */
 int sys_fork(struct pt_regs *);
@@ -35,8 +36,6 @@ asmlinkage int sys_get_thread_area(struct user_desc __user *);
 
 /* X86_32 only */
 #ifdef CONFIG_X86_32
-/* kernel/ioport.c */
-long sys_iopl(struct pt_regs *);
 
 /* kernel/process_32.c */
 int sys_clone(struct pt_regs *);
@@ -70,9 +69,6 @@ int sys_vm86(struct pt_regs *);
 #else /* CONFIG_X86_32 */
 
 /* X86_64 only */
-/* kernel/ioport.c */
-asmlinkage long sys_iopl(unsigned int, struct pt_regs *);
-
 /* kernel/process_64.c */
 asmlinkage long sys_clone(unsigned long, unsigned long,
                          void __user *, void __user *,
index 34dbfa909dd7bd410f91e605345b0be969e29367..ab7fcef374533dad74e58505714591863cfaf626 100644 (file)
@@ -758,7 +758,7 @@ ptregs_##name: \
        addl $4,%esp; \
        ret
 
-PTREGSCALL0(iopl)
+PTREGSCALL1(iopl)
 PTREGSCALL0(fork)
 PTREGSCALL0(clone)
 PTREGSCALL0(vfork)
index 99c4d308f16b0db61ca0821adca78d3bec2e8b96..85ecc7c57ba69480d78eba5a4392139dfc2cb407 100644 (file)
@@ -103,9 +103,10 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
  * on system-call entry - see also fork() and the signal handling
  * code.
  */
-static int do_iopl(unsigned int level, struct pt_regs *regs)
+long sys_iopl(unsigned int level, struct pt_regs *regs)
 {
        unsigned int old = (regs->flags >> 12) & 3;
+       struct thread_struct *t = &current->thread;
 
        if (level > 3)
                return -EINVAL;
@@ -115,29 +116,10 @@ static int do_iopl(unsigned int level, struct pt_regs *regs)
                        return -EPERM;
        }
        regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12);
-
-       return 0;
-}
-
 #ifdef CONFIG_X86_32
-long sys_iopl(struct pt_regs *regs)
-{
-       unsigned int level = regs->bx;
-       struct thread_struct *t = &current->thread;
-       int rc;
-
-       rc = do_iopl(level, regs);
-       if (rc < 0)
-               goto out;
-
        t->iopl = level << 12;
        set_iopl_mask(t->iopl);
-out:
-       return rc;
-}
-#else
-asmlinkage long sys_iopl(unsigned int level, struct pt_regs *regs)
-{
-       return do_iopl(level, regs);
-}
 #endif
+
+       return 0;
+}