mem_size = bm[0].mem()
     else:
         mem_size = SysConfig().mem()
-    test_sys.bridge.filter_ranges_a=[AddrRange(0, Addr.max)]
+    # For x86, we need to poke a hole for interrupt messages to get back to the
+    # CPU. These use a portion of the physical address space which has a
+    # non-zero prefix in the top nibble. Normal memory accesses have a 0
+    # prefix.
+    if buildEnv['TARGET_ISA'] == 'x86':
+        test_sys.bridge.filter_ranges_a=[AddrRange(0, Addr.max >> 4)]
+    else:
+        test_sys.bridge.filter_ranges_a=[AddrRange(0, Addr.max)]
     test_sys.bridge.filter_ranges_b=[AddrRange(mem_size)]
     test_sys.iocache = IOCache(addr_range=mem_size)
     test_sys.iocache.cpu_side = test_sys.iobus.port