[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC 5/6] arm64: call enter_hypervisor_head only when it is needed
From: Andrii Anisov <andrii_anisov@xxxxxxxx> On ARM64 we know exactly if trap happened from hypervisor or guest, so we do not need to take that decision. This reduces a condition for all enter_hypervisor_head calls and the function call for traps from the hypervisor mode. Currently, it is implemented for ARM64 only. Integrating the stuff with ARM32 requires moving ` if ( guest_mode(regs) )` condition into ARM32 specific traps.c Signed-off-by: Andrii Anisov <andrii_anisov@xxxxxxxx> --- xen/arch/arm/arm64/entry.S | 6 ++-- xen/arch/arm/traps.c | 75 ++++++++++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/xen/arch/arm/arm64/entry.S b/xen/arch/arm/arm64/entry.S index 8f28789..21c710d 100644 --- a/xen/arch/arm/arm64/entry.S +++ b/xen/arch/arm/arm64/entry.S @@ -211,7 +211,7 @@ hyp_irq: entry hyp=1 msr daifclr, #4 mov x0, sp - bl do_trap_irq + bl do_trap_hyp_irq exit hyp=1 guest_sync: @@ -321,7 +321,7 @@ guest_irq: SKIP_SYNCHRONIZE_SERROR_ENTRY_EXIT) msr daifclr, #4 mov x0, sp - bl do_trap_irq + bl do_trap_guest_irq 1: exit hyp=0, compat=0 @@ -364,7 +364,7 @@ guest_irq_compat: SKIP_SYNCHRONIZE_SERROR_ENTRY_EXIT) msr daifclr, #4 mov x0, sp - bl do_trap_irq + bl do_trap_guest_irq 1: exit hyp=0, compat=1 diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 5a9dc66..13726db 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -2011,48 +2011,45 @@ static inline bool needs_ssbd_flip(struct vcpu *v) cpu_require_ssbd_mitigation(); } -static void enter_hypervisor_head(struct cpu_user_regs *regs) +static void enter_hypervisor_head(void) { - if ( guest_mode(regs) ) - { - struct vcpu *v = current; + struct vcpu *v = current; - ASSERT(!local_irq_is_enabled()); + ASSERT(!local_irq_is_enabled()); - /* If the guest has disabled the workaround, bring it back on. */ - if ( needs_ssbd_flip(v) ) - arm_smccc_1_1_smc(ARM_SMCCC_ARCH_WORKAROUND_2_FID, 1, NULL); + /* If the guest has disabled the workaround, bring it back on. */ + if ( needs_ssbd_flip(v) ) + arm_smccc_1_1_smc(ARM_SMCCC_ARCH_WORKAROUND_2_FID, 1, NULL); - /* - * If we pended a virtual abort, preserve it until it gets cleared. - * See ARM ARM DDI 0487A.j D1.14.3 (Virtual Interrupts) for details, - * but the crucial bit is "On taking a vSError interrupt, HCR_EL2.VSE - * (alias of HCR.VA) is cleared to 0." - */ - if ( v->arch.hcr_el2 & HCR_VA ) - v->arch.hcr_el2 = READ_SYSREG(HCR_EL2); + /* + * If we pended a virtual abort, preserve it until it gets cleared. + * See ARM ARM DDI 0487A.j D1.14.3 (Virtual Interrupts) for details, + * but the crucial bit is "On taking a vSError interrupt, HCR_EL2.VSE + * (alias of HCR.VA) is cleared to 0." + */ + if ( v->arch.hcr_el2 & HCR_VA ) + v->arch.hcr_el2 = READ_SYSREG(HCR_EL2); #ifdef CONFIG_NEW_VGIC - /* - * We need to update the state of our emulated devices using level - * triggered interrupts before syncing back the VGIC state. - * - * TODO: Investigate whether this is necessary to do on every - * trap and how it can be optimised. - */ - vtimer_update_irqs(v); - vcpu_update_evtchn_irq(v); + /* + * We need to update the state of our emulated devices using level + * triggered interrupts before syncing back the VGIC state. + * + * TODO: Investigate whether this is necessary to do on every + * trap and how it can be optimised. + */ + vtimer_update_irqs(v); + vcpu_update_evtchn_irq(v); #endif - vgic_sync_from_lrs(v); - } + vgic_sync_from_lrs(v); } void do_trap_guest_sync(struct cpu_user_regs *regs) { const union hsr hsr = { .bits = regs->hsr }; - enter_hypervisor_head(regs); + enter_hypervisor_head(); local_irq_enable(); switch ( hsr.ec ) @@ -2188,7 +2185,6 @@ void do_trap_hyp_sync(struct cpu_user_regs *regs) { const union hsr hsr = { .bits = regs->hsr }; - enter_hypervisor_head(regs); local_irq_enable(); switch ( hsr.ec ) @@ -2227,7 +2223,6 @@ void do_trap_hyp_sync(struct cpu_user_regs *regs) void do_trap_hyp_serror(struct cpu_user_regs *regs) { - enter_hypervisor_head(regs); local_irq_enable(); __do_trap_serror(regs, VABORT_GEN_BY_GUEST(regs)); @@ -2235,21 +2230,31 @@ void do_trap_hyp_serror(struct cpu_user_regs *regs) void do_trap_guest_serror(struct cpu_user_regs *regs) { - enter_hypervisor_head(regs); + enter_hypervisor_head(); local_irq_enable(); __do_trap_serror(regs, true); } -void do_trap_irq(struct cpu_user_regs *regs) +void do_trap_guest_irq(struct cpu_user_regs *regs) +{ + enter_hypervisor_head(); + gic_interrupt(regs, 0); +} + +void do_trap_guest_fiq(struct cpu_user_regs *regs) +{ + enter_hypervisor_head(); + gic_interrupt(regs, 1); +} + +void do_trap_hyp_irq(struct cpu_user_regs *regs) { - enter_hypervisor_head(regs); gic_interrupt(regs, 0); } -void do_trap_fiq(struct cpu_user_regs *regs) +void do_trap_hyp_fiq(struct cpu_user_regs *regs) { - enter_hypervisor_head(regs); gic_interrupt(regs, 1); } -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |