MIPS: seccomp: Support compat with both O32 and N32
[cascardo/linux.git] / drivers / bus / brcmstb_gisb.c
index f364fa4..72fe0a5 100644 (file)
 #include <asm/signal.h>
 #endif
 
+#ifdef CONFIG_MIPS
+#include <asm/traps.h>
+#endif
+
 #define  ARB_ERR_CAP_CLEAR             (1 << 0)
 #define  ARB_ERR_CAP_STATUS_TIMEOUT    (1 << 12)
 #define  ARB_ERR_CAP_STATUS_TEA                (1 << 11)
@@ -238,6 +242,29 @@ static int brcmstb_bus_error_handler(unsigned long addr, unsigned int fsr,
 }
 #endif
 
+#ifdef CONFIG_MIPS
+static int brcmstb_bus_error_handler(struct pt_regs *regs, int is_fixup)
+{
+       int ret = 0;
+       struct brcmstb_gisb_arb_device *gdev;
+       u32 cap_status;
+
+       list_for_each_entry(gdev, &brcmstb_gisb_arb_device_list, next) {
+               cap_status = gisb_read(gdev, ARB_ERR_CAP_STATUS);
+
+               /* Invalid captured address, bail out */
+               if (!(cap_status & ARB_ERR_CAP_STATUS_VALID)) {
+                       is_fixup = 1;
+                       goto out;
+               }
+
+               ret |= brcmstb_gisb_arb_decode_addr(gdev, "bus error");
+       }
+out:
+       return is_fixup ? MIPS_BE_FIXUP : MIPS_BE_FATAL;
+}
+#endif
+
 static irqreturn_t brcmstb_gisb_timeout_handler(int irq, void *dev_id)
 {
        brcmstb_gisb_arb_decode_addr(dev_id, "timeout");
@@ -355,6 +382,9 @@ static int __init brcmstb_gisb_arb_probe(struct platform_device *pdev)
        hook_fault_code(22, brcmstb_bus_error_handler, SIGBUS, 0,
                        "imprecise external abort");
 #endif
+#ifdef CONFIG_MIPS
+       board_be_handler = brcmstb_bus_error_handler;
+#endif
 
        dev_info(&pdev->dev, "registered mem: %p, irqs: %d, %d\n",
                        gdev->base, timeout_irq, tea_irq);