diff --git a/hw/pci_host.h b/hw/pci_host.h
index 4b9c300..c1ec7eb 100644
--- a/hw/pci_host.h
+++ b/hw/pci_host.h
@@ -41,10 +41,19 @@ struct PCIHostState {
     MemoryRegion data_mem;
     MemoryRegion mmcfg;
     MemoryRegion *address_space;
+    MemoryRegion bar0;
     uint32_t config_reg;
     PCIBus *bus;
 };
 
+typedef struct PPCE500CCSRState {
+    SysBusDevice *parent;
+    MemoryRegion ccsr_space;
+} PPCE500CCSRState;
+
+#define TYPE_CCSR "e500-ccsr"
+#define CCSR(obj) OBJECT_CHECK(PPCE500CCSRState, (obj), TYPE_CCSR)
+
 /* common internal helpers for PCI/PCIe hosts, cut off overflows */
 void pci_host_config_write_common(PCIDevice *pci_dev, uint32_t addr,
                                   uint32_t limit, uint32_t val, uint32_t len);
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 6f0de6d..1f5da28 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -31,6 +31,7 @@
 #include "hw/loader.h"
 #include "elf.h"
 #include "hw/sysbus.h"
+#include "hw/pci_host.h"
 #include "exec-memory.h"
 #include "host-utils.h"
 
@@ -587,3 +588,23 @@ void ppce500_init(PPCE500Params *params)
         kvmppc_init();
     }
 }
+
+static void e500_ccsr_type_init(Object *obj)
+{
+    PPCE500CCSRState *ccsr = CCSR(obj);
+    ccsr->ccsr_space.size = int128_make64(MPC8544_CCSRBAR_SIZE);
+}
+
+static const TypeInfo e500_ccsr_info = {
+    .name          = TYPE_CCSR,
+    .parent        =  TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(PPCE500CCSRState),
+    .instance_init = e500_ccsr_type_init,
+};
+
+static void e500_ccsr_register_types(void)
+{
+    type_register_static(&e500_ccsr_info);
+}
+
+type_init(e500_ccsr_register_types)
diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c
index 92b1dc0..135f2a6 100644
--- a/hw/ppce500_pci.c
+++ b/hw/ppce500_pci.c
@@ -315,6 +315,8 @@ static int e500_pcihost_initfn(SysBusDevice *dev)
     int i;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *address_space_io = get_system_io();
+    PPCE500CCSRState *ccsr;
+    PCIDevice *pdev;
 
     h = PCI_HOST_BRIDGE(dev);
     s = PPC_E500_PCI_HOST_BRIDGE(dev);
@@ -342,6 +344,11 @@ static int e500_pcihost_initfn(SysBusDevice *dev)
     memory_region_add_subregion(&s->container, PCIE500_REG_BASE, &s->iomem);
     sysbus_init_mmio(dev, &s->container);
 
+    ccsr = CCSR(object_new(TYPE_CCSR));
+    memory_region_init_io(&h->bar0, &pci_host_conf_be_ops, h,
+                          "pci-bar0", memory_region_size(&ccsr->ccsr_space));
+    pdev = pci_find_device(b, 0, 0);
+    pci_register_bar(pdev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &h->bar0);
     return 0;
 }
 
