KVM ARM interrupt virtualization
bill4carson at gmail.com
Wed Sep 7 21:44:45 EDT 2011
2011/9/7 Catalin Marinas <catalin.marinas at arm.com>:
> On 2 September 2011 04:01, carson bill <bill4carson at gmail.com> wrote:
>> I am trying to put interrupt virtualization support into KVM ARM
>> implementation by Christoffer.
>> The approach is like this:
>> Distributor emulation stays in Qemu, whenever Guest OS touch
>> Distributor iomem, this action is handled by Qemu as it is.
>> Each time a device in Qemu call 'gic_update' to inject an
>> interrupt, the emulated Distributor figure out the 'best_irq'.
>> With the help of GIC virtulization, this "best_irq" can be routed
>> to virtual cpu interface which Guest OS has directly access into.
>> Of course, when Guest OS query which interrupt fired, it need not
>> trapped out into Qemu anymore.
>> I did the experiment, and found the biggest obstoble on the way
>> is creating the mapping.
>> #define CT_CA9X4_MPIC (0x1e000000)
>> #define A9_MPCORE_SCU (CT_CA9X4_MPIC + 0x0000)
>> #define A9_MPCORE_GIC_CPU (CT_CA9X4_MPIC + 0x0100)
>> #define A9_MPCORE_GIT (CT_CA9X4_MPIC + 0x0200)
>> #define A9_MPCORE_TWD (CT_CA9X4_MPIC + 0x0600)
>> #define A9_MPCORE_GIC_DIST (CT_CA9X4_MPIC + 0x1000)
>> If I create an identical mapping at A9_MPCORE_GIC_CPU, all the iomem
>> from CT_CA9X4_MPIC ~ CT_CA9X4_MPIC + 0x1000 could be access for
>> Guest OS, which means access to SCU/GIT/TWD will not been trapped
>> any more.
> Shouldn't you use the CT_CA15X4_MPIC base address? As for TWD, with
> A15 we use the generic timers (which also have support for
> virtualisation). The SCU doesn't need to be touched on A15, AFAIK.
> With the VE/A15 memory map, the GIC Dist is placed at offset 0x1000
> and the GIC CPU interface a 0x2000. I think the VGIC interfaces are
> placed as follows:
> base + 0x4000 - GICV (Virtual Machine CPU interface - same registers
> as the physical GIC CPU interface)
> base + 0x6000 - GICH (GIC Hypervisor control registers)
> So you would have to map GICH inside the host OS to control the VGIC.
> The guest OS would most likely want to use the same address as the
> physical GIC CPU interface (at offset 0x2000). In this case, the host
> OS needs to set up a stage 2 translation from the GIC CPU interface
> physical page at offset 0x2000 to offset 0x4000 where the VGIC is
Thanks Catalin for your reply :)
Do you mean Guest OS have to be built with A15 too ?
Currently Versatile Express Cortex-A9x4 tile is used as Guest OS.
That's why I have to map A9_MPCORE_GIC_CPU from Guest OS into
A15_MPCORE_GIC_CPU at host side.
More information about the linux-arm-kernel