|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/3] xen/arm: Move p2m context save/restore in a separate function
At 15:43 +0000 on 19 Mar (1395240217), Julien Grall wrote:
> Introduce p2m_{save,restore}_state to save/restore p2m context.
>
> The both functions will take care of:
> - VTTBR: contains the pointer to the domain P2M
> - Update HCR_RW if the domain is 64 bit
> - SCTLR: contains bit to know if the MMU is enabled or not
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
> ---
> xen/arch/arm/domain.c | 21 +++------------------
> xen/arch/arm/p2m.c | 28 ++++++++++++++++++++++++++++
> xen/include/asm-arm/p2m.h | 4 ++++
> 3 files changed, 35 insertions(+), 18 deletions(-)
>
> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
> index 46ee486..b125857 100644
> --- a/xen/arch/arm/domain.c
> +++ b/xen/arch/arm/domain.c
> @@ -59,11 +59,12 @@ void idle_loop(void)
>
> static void ctxt_switch_from(struct vcpu *p)
> {
> + p2m_save_state(p);
> +
> /* CP 15 */
> p->arch.csselr = READ_SYSREG(CSSELR_EL1);
>
> /* Control Registers */
> - p->arch.sctlr = READ_SYSREG(SCTLR_EL1);
> p->arch.cpacr = READ_SYSREG(CPACR_EL1);
>
> p->arch.contextidr = READ_SYSREG(CONTEXTIDR_EL1);
> @@ -134,14 +135,7 @@ static void ctxt_switch_from(struct vcpu *p)
>
> static void ctxt_switch_to(struct vcpu *n)
> {
> - register_t hcr;
> -
> - hcr = READ_SYSREG(HCR_EL2);
> - WRITE_SYSREG(hcr & ~HCR_VM, HCR_EL2);
> - isb();
> -
> - p2m_load_VTTBR(n->domain);
> - isb();
> + p2m_restore_state(n);
>
> WRITE_SYSREG32(n->domain->arch.vpidr, VPIDR_EL2);
> WRITE_SYSREG(n->arch.vmpidr, VMPIDR_EL2);
> @@ -189,7 +183,6 @@ static void ctxt_switch_to(struct vcpu *n)
> isb();
>
> /* Control Registers */
> - WRITE_SYSREG(n->arch.sctlr, SCTLR_EL1);
> WRITE_SYSREG(n->arch.cpacr, CPACR_EL1);
>
> WRITE_SYSREG(n->arch.contextidr, CONTEXTIDR_EL1);
> @@ -214,14 +207,6 @@ static void ctxt_switch_to(struct vcpu *n)
>
> isb();
>
> - if ( is_32bit_domain(n->domain) )
> - hcr &= ~HCR_RW;
> - else
> - hcr |= HCR_RW;
> -
> - WRITE_SYSREG(hcr, HCR_EL2);
> - isb();
> -
> /* This is could trigger an hardware interrupt from the virtual
> * timer. The interrupt needs to be injected into the guest. */
> virt_timer_restore(n);
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index b9d8ca6..979fe5b 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -44,6 +44,34 @@ void p2m_load_VTTBR(struct domain *d)
> isb(); /* Ensure update is visible */
> }
>
> +void p2m_save_state(struct vcpu *p)
> +{
> + p->arch.sctlr = READ_SYSREG(SCTLR_EL1);
> +}
> +
> +void p2m_restore_state(struct vcpu *n)
> +{
> + register_t hcr;
> +
> + hcr = READ_SYSREG(HCR_EL2);
> + WRITE_SYSREG(hcr & ~HCR_VM, HCR_EL2);
> + isb();
> +
> + p2m_load_VTTBR(n->domain);
> + isb();
> +
> + if ( is_32bit_domain(n->domain) )
> + hcr &= ~HCR_RW;
> + else
> + hcr |= HCR_RW;
> +
> + WRITE_SYSREG(n->arch.sctlr, SCTLR_EL1);
> + isb();
> +
> + WRITE_SYSREG(hcr, HCR_EL2);
> + isb();
> +}
Are all of these isb()s necessary? I guess this is only code motion,
so in any case, Acked-by: Tim Deegan <tim@xxxxxxx> (for the whole series)
but it seems like at least the one after the VTTBR write could go?
Tim.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |