On Thu, Jul 5, 2012 at 11:28 AM, Marc Zyngier <marc.zyngier@xxxxxxx> wrote: > Enable the VGIC control interface to be save-restored on world switch. > > Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx> > --- > arch/arm/include/asm/kvm_arm.h | 12 ++++++++ > arch/arm/kernel/asm-offsets.c | 11 +++++++ > arch/arm/kvm/interrupts.S | 62 ++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 85 insertions(+) > > diff --git a/arch/arm/include/asm/kvm_arm.h b/arch/arm/include/asm/kvm_arm.h > index 1efa452..4142d18 100644 > --- a/arch/arm/include/asm/kvm_arm.h > +++ b/arch/arm/include/asm/kvm_arm.h > @@ -181,4 +181,16 @@ > #define HSR_EC_DABT (0x24) > #define HSR_EC_DABT_HYP (0x25) > > +/* GICH offsets */ > +#define GICH_HCR 0x0 > +#define GICH_VTR 0x4 > +#define GICH_VMCR 0x8 > +#define GICH_MISR 0x10 > +#define GICH_EISR0 0x20 > +#define GICH_EISR1 0x24 > +#define GICH_ELRSR0 0x30 > +#define GICH_ELRSR1 0x34 > +#define GICH_APR 0xf0 > +#define GICH_LR0 0x100 > + > #endif /* __ARM_KVM_ARM_H__ */ > diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c > index 9c76b53..af1b62fc 100644 > --- a/arch/arm/kernel/asm-offsets.c > +++ b/arch/arm/kernel/asm-offsets.c > @@ -185,6 +185,17 @@ int main(void) > DEFINE(VCPU_PC_IPA, offsetof(struct kvm_vcpu, arch.pc_ipa)); > DEFINE(VCPU_PC_IPA2, offsetof(struct kvm_vcpu, arch.pc_ipa2)); > DEFINE(VCPU_HYP_PC, offsetof(struct kvm_vcpu, arch.hyp_pc)); > +#ifdef CONFIG_KVM_ARM_VGIC > + DEFINE(VCPU_VGIC_HCR, offsetof(struct kvm_vcpu, arch.vgic_cpu.vgic_hcr)); > + DEFINE(VCPU_VGIC_VMCR, offsetof(struct kvm_vcpu, arch.vgic_cpu.vgic_vmcr)); > + DEFINE(VCPU_VGIC_MISR, offsetof(struct kvm_vcpu, arch.vgic_cpu.vgic_misr)); > + DEFINE(VCPU_VGIC_EISR, offsetof(struct kvm_vcpu, arch.vgic_cpu.vgic_eisr)); > + DEFINE(VCPU_VGIC_ELRSR, offsetof(struct kvm_vcpu, arch.vgic_cpu.vgic_elrsr)); > + DEFINE(VCPU_VGIC_APR, offsetof(struct kvm_vcpu, arch.vgic_cpu.vgic_apr)); > + DEFINE(VCPU_VGIC_LR, offsetof(struct kvm_vcpu, arch.vgic_cpu.vgic_lr)); > + DEFINE(VCPU_VGIC_NR_LR, offsetof(struct kvm_vcpu, arch.vgic_cpu.nr_lr)); > + DEFINE(KVM_VGIC_VCTRL, offsetof(struct kvm, arch.vgic.vctrl_base)); > +#endif > DEFINE(KVM_VTTBR, offsetof(struct kvm, arch.vttbr)); > #endif > return 0; > diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S > index f3e4c3c..40c3c9f 100644 > --- a/arch/arm/kvm/interrupts.S > +++ b/arch/arm/kvm/interrupts.S > @@ -272,6 +272,42 @@ ENDPROC(__kvm_flush_vm_context) > * @vcpup: Register pointing to VCPU struct > */ > .macro save_vgic_state vcpup > +#ifdef CONFIG_KVM_ARM_VGIC > + /* Get VGIC VCTRL base into r2 */ > + ldr r2, [\vcpup, #VCPU_KVM] > + ldr r2, [r2, #KVM_VGIC_VCTRL] > + cmp r2, #0 > + beq 2f > + > + /* Save all interesting registers */ > + ldr r3, [r2, #GICH_HCR] > + ldr r4, [r2, #GICH_VMCR] > + ldr r5, [r2, #GICH_MISR] > + ldr r6, [r2, #GICH_EISR0] > + ldr r7, [r2, #GICH_EISR1] > + ldr r8, [r2, #GICH_ELRSR0] > + ldr r9, [r2, #GICH_ELRSR1] > + ldr r10, [r2, #GICH_APR] > + > + str r3, [\vcpup, #VCPU_VGIC_HCR] > + str r4, [\vcpup, #VCPU_VGIC_VMCR] > + str r5, [\vcpup, #VCPU_VGIC_MISR] > + str r6, [\vcpup, #VCPU_VGIC_EISR] > + str r7, [\vcpup, #(VCPU_VGIC_EISR + 4)] > + str r8, [\vcpup, #VCPU_VGIC_ELRSR] > + str r9, [\vcpup, #(VCPU_VGIC_ELRSR + 4)] > + str r10, [\vcpup, #VCPU_VGIC_APR] > + > + /* Save list registers */ > + add r2, r2, #GICH_LR0 > + add r3, \vcpup, #VCPU_VGIC_LR > + ldr r4, [\vcpup, #VCPU_VGIC_NR_LR] > +1: ldr r6, [r2], #4 > + str r6, [r3], #4 > + subs r4, r4, #1 > + bne 1b > +2: > +#endif > .endm > > /* > @@ -279,6 +315,32 @@ ENDPROC(__kvm_flush_vm_context) > * @vcpup: Register pointing to VCPU struct > */ > .macro restore_vgic_state vcpup > +#ifdef CONFIG_KVM_ARM_VGIC > + /* Get VGIC VCTRL base into r2 */ > + ldr r2, [\vcpup, #VCPU_KVM] > + ldr r2, [r2, #KVM_VGIC_VCTRL] > + cmp r2, #0 > + beq 2f > + > + /* We only restore a minimal set of registers */ > + ldr r3, [\vcpup, #VCPU_VGIC_HCR] > + ldr r4, [\vcpup, #VCPU_VGIC_VMCR] > + ldr r8, [\vcpup, #VCPU_VGIC_APR] > + > + str r3, [r2, #GICH_HCR] > + str r4, [r2, #GICH_VMCR] > + str r8, [r2, #GICH_APR] > + > + /* Restore list registers */ > + add r2, r2, #GICH_LR0 > + add r3, \vcpup, #VCPU_VGIC_LR > + ldr r4, [\vcpup, #VCPU_VGIC_NR_LR] > +1: ldr r6, [r3], #4 > + str r6, [r2], #4 > + subs r4, r4, #1 > + bne 1b > +2: > +#endif > .endm > > /* Configures the HSTR (Hyp System Trap Register) on entry/return > -- > 1.7.10.3 > > looks good enough to me. _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm