Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / arch / x86 / mm / extable.c
index c3521e2be39610c3d932c34126fadd5203f28958..9fe656c42aa5b16560e139cebba247ca52756c80 100644 (file)
@@ -1,6 +1,7 @@
 #include <linux/extable.h>
 #include <linux/uaccess.h>
 #include <linux/sched/debug.h>
+#include <xen/xen.h>
 
 #include <asm/fpu/internal.h>
 #include <asm/traps.h>
@@ -67,17 +68,22 @@ bool ex_handler_refcount(const struct exception_table_entry *fixup,
         * wrapped around) will be set. Additionally, seeing the refcount
         * reach 0 will set ZF (Zero Flag: result was zero). In each of
         * these cases we want a report, since it's a boundary condition.
-        *
+        * The SF case is not reported since it indicates post-boundary
+        * manipulations below zero or above INT_MAX. And if none of the
+        * flags are set, something has gone very wrong, so report it.
         */
        if (regs->flags & (X86_EFLAGS_OF | X86_EFLAGS_ZF)) {
                bool zero = regs->flags & X86_EFLAGS_ZF;
 
                refcount_error_report(regs, zero ? "hit zero" : "overflow");
+       } else if ((regs->flags & X86_EFLAGS_SF) == 0) {
+               /* Report if none of OF, ZF, nor SF are set. */
+               refcount_error_report(regs, "unexpected saturation");
        }
 
        return true;
 }
-EXPORT_SYMBOL_GPL(ex_handler_refcount);
+EXPORT_SYMBOL(ex_handler_refcount);
 
 /*
  * Handler for when we fail to restore a task's FPU state.  We should never get
@@ -207,8 +213,9 @@ void __init early_fixup_exception(struct pt_regs *regs, int trapnr)
         * Old CPUs leave the high bits of CS on the stack
         * undefined.  I'm not sure which CPUs do this, but at least
         * the 486 DX works this way.
+        * Xen pv domains are not using the default __KERNEL_CS.
         */
-       if (regs->cs != __KERNEL_CS)
+       if (!xen_pv_domain() && regs->cs != __KERNEL_CS)
                goto fail;
 
        /*