]> rtime.felk.cvut.cz Git - jailhouse.git/blobdiff - hypervisor/arch/arm/mmio.c
Merge remote-tracking branch 'kiszka/master'
[jailhouse.git] / hypervisor / arch / arm / mmio.c
index b89ffbad4570b729d688d110c4f552444e35bae6..1098e8df57dbbca53ccad00de15ac4c4922652b8 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <jailhouse/mmio.h>
+#include <asm/bitops.h>
 #include <asm/irqchip.h>
 #include <asm/processor.h>
 #include <asm/smp.h>
@@ -18,7 +19,7 @@
 
 unsigned int arch_mmio_count_regions(struct cell *cell)
 {
-       return smp_mmio_regions;
+       return irqchip_mmio_count_regions(cell) + smp_mmio_regions;
 }
 
 /* Taken from the ARM ARM pseudocode for taking a data abort */
@@ -60,46 +61,12 @@ static void arch_inject_dabt(struct trap_context *ctx, unsigned long addr)
        arm_write_sysreg(DFAR, addr);
 }
 
-void arm_mmio_perform_access(struct mmio_access *mmio)
-{
-       void *addr = (void *)mmio->address;
-
-       if (mmio->is_write)
-               switch (mmio->size) {
-               case 1:
-                       mmio_write8(addr, mmio->value);
-                       return;
-               case 2:
-                       mmio_write16(addr, mmio->value);
-                       return;
-               case 4:
-                       mmio_write32(addr, mmio->value);
-                       return;
-               }
-       else
-               switch (mmio->size) {
-               case 1:
-                       mmio->value = mmio_read8(addr);
-                       return;
-               case 2:
-                       mmio->value = mmio_read16(addr);
-                       return;
-               case 4:
-                       mmio->value = mmio_read32(addr);
-                       return;
-               }
-
-       printk("WARNING: Ignoring unsupported MMIO access size %d\n",
-              mmio->size);
-}
-
 int arch_handle_dabt(struct trap_context *ctx)
 {
        enum mmio_result mmio_result;
        struct mmio_access mmio;
        unsigned long hpfar;
        unsigned long hdfar;
-       int ret         = TRAP_UNHANDLED;
        /* Decode the syndrome fields */
        u32 icc         = ESR_ICC(ctx->esr);
        u32 isv         = icc >> 24;
@@ -146,14 +113,8 @@ int arch_handle_dabt(struct trap_context *ctx)
        mmio_result = mmio_handle_access(&mmio);
        if (mmio_result == MMIO_ERROR)
                return TRAP_FORBIDDEN;
-       if (mmio_result == MMIO_UNHANDLED) {
-               ret = irqchip_mmio_access(&mmio);
-
-               if (ret == TRAP_FORBIDDEN)
-                       return TRAP_FORBIDDEN;
-               if (ret == TRAP_UNHANDLED)
-                       goto error_unhandled;
-       }
+       if (mmio_result == MMIO_UNHANDLED)
+               goto error_unhandled;
 
        /* Put the read value into the dest register */
        if (!is_write) {