lkml.org 
[lkml]   [2016]   [Mar]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.2.y-ckt 121/218] x86/iopl: Fix iopl capability check on Xen PV
    Date
    4.2.8-ckt7 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    From: Andy Lutomirski <luto@kernel.org>

    commit c29016cf41fe9fa994a5ecca607cf5f1cd98801e upstream.

    iopl(3) is supposed to work if iopl is already 3, even if
    unprivileged. This didn't work right on Xen PV. Fix it.

    Reviewewd-by: Jan Beulich <JBeulich@suse.com>
    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    Cc: Andrew Cooper <andrew.cooper3@citrix.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: David Vrabel <david.vrabel@citrix.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Jan Beulich <JBeulich@suse.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/8ce12013e6e4c0a44a97e316be4a6faff31bd5ea.1458162709.git.luto@kernel.org
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    arch/x86/kernel/ioport.c | 12 +++++++++---
    1 file changed, 9 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
    index 37dae79..589b319 100644
    --- a/arch/x86/kernel/ioport.c
    +++ b/arch/x86/kernel/ioport.c
    @@ -96,9 +96,14 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
    SYSCALL_DEFINE1(iopl, unsigned int, level)
    {
    struct pt_regs *regs = current_pt_regs();
    - unsigned int old = (regs->flags >> 12) & 3;
    struct thread_struct *t = &current->thread;

    + /*
    + * Careful: the IOPL bits in regs->flags are undefined under Xen PV
    + * and changing them has no effect.
    + */
    + unsigned int old = t->iopl >> X86_EFLAGS_IOPL_BIT;
    +
    if (level > 3)
    return -EINVAL;
    /* Trying to gain more privileges? */
    @@ -106,8 +111,9 @@ SYSCALL_DEFINE1(iopl, unsigned int, level)
    if (!capable(CAP_SYS_RAWIO))
    return -EPERM;
    }
    - regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12);
    - t->iopl = level << 12;
    + regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) |
    + (level << X86_EFLAGS_IOPL_BIT);
    + t->iopl = level << X86_EFLAGS_IOPL_BIT;
    set_iopl_mask(t->iopl);

    return 0;
    --
    2.7.4
    \
     
     \ /
      Last update: 2016-03-31 23:01    [W:2.820 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site