[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [RFC v2 12/16] gic-v2: avoid HCR reading for GICv2



From: Andrii Anisov <andrii_anisov@xxxxxxxx>

Because the HCR value is only changed by the hypervisor,
we can rely on a cached value and do not do peripheral register
reads for this register.

Signed-off-by: Andrii Anisov <andrii_anisov@xxxxxxxx>
---
 xen/arch/arm/gic-v2.c     | 43 +++++++++++++++++++++++++------------------
 xen/arch/arm/gic-v3.c     |  2 +-
 xen/include/asm-arm/gic.h |  2 +-
 3 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c
index 25147bd..cc7571e 100644
--- a/xen/arch/arm/gic-v2.c
+++ b/xen/arch/arm/gic-v2.c
@@ -174,6 +174,28 @@ static unsigned int gicv2_cpu_mask(const cpumask_t 
*cpumask)
     return mask;
 }
 
+static void _gicv2_hcr_status(struct vcpu *v, uint32_t flag, bool status)
+{
+    uint32_t hcr, ohcr;
+
+    ohcr = hcr = v->arch.gic.v2.hcr;
+
+    if ( status )
+        hcr |= flag;
+    else
+        hcr &= (~flag);
+
+    if ( hcr != ohcr )
+        writel_gich(hcr, GICH_HCR);
+
+     v->arch.gic.v2.hcr = hcr;
+}
+
+static void gicv2_hcr_status(uint32_t flag, bool status)
+{
+    _gicv2_hcr_status(current, flag, status);
+}
+
 static void gicv2_save_state(struct vcpu *v)
 {
     int i;
@@ -188,10 +210,10 @@ static void gicv2_save_state(struct vcpu *v)
     v->arch.gic.v2.apr = readl_gich(GICH_APR);
     v->arch.gic.v2.vmcr = readl_gich(GICH_VMCR);
     /* Disable until next VCPU scheduled */
-    writel_gich(0, GICH_HCR);
+    _gicv2_hcr_status(v, GICH_HCR_EN, false);
 }
 
-static void gicv2_restore_state(const struct vcpu *v)
+static void gicv2_restore_state(struct vcpu *v)
 {
     int i;
 
@@ -200,7 +222,7 @@ static void gicv2_restore_state(const struct vcpu *v)
 
     writel_gich(v->arch.gic.v2.apr, GICH_APR);
     writel_gich(v->arch.gic.v2.vmcr, GICH_VMCR);
-    writel_gich(GICH_HCR_EN, GICH_HCR);
+    _gicv2_hcr_status(v, GICH_HCR_EN, true);
 }
 
 static void gicv2_dump_state(const struct vcpu *v)
@@ -577,21 +599,6 @@ static void gicv2_write_lr(int lr, const struct gic_lr 
*lr_reg)
     writel_gich(lrv, GICH_LR + lr * 4);
 }
 
-static void gicv2_hcr_status(uint32_t flag, bool status)
-{
-    uint32_t hcr, ohcr;
-
-    ohcr = hcr = readl_gich(GICH_HCR);
-
-    if ( status )
-        hcr |= flag;
-    else
-        hcr &= (~flag);
-
-    if ( hcr != ohcr )
-        writel_gich(hcr, GICH_HCR);
-}
-
 static unsigned int gicv2_read_vmcr_priority(void)
 {
    return ((readl_gich(GICH_VMCR) >> GICH_V2_VMCR_PRIORITY_SHIFT)
diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
index 8e835b5..6269425 100644
--- a/xen/arch/arm/gic-v3.c
+++ b/xen/arch/arm/gic-v3.c
@@ -377,7 +377,7 @@ static void gicv3_save_state(struct vcpu *v)
     v->arch.gic.v3.sre_el1 = READ_SYSREG32(ICC_SRE_EL1);
 }
 
-static void gicv3_restore_state(const struct vcpu *v)
+static void gicv3_restore_state(struct vcpu *v)
 {
     uint32_t val;
 
diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h
index 3d7394d..ea9bbed 100644
--- a/xen/include/asm-arm/gic.h
+++ b/xen/include/asm-arm/gic.h
@@ -323,7 +323,7 @@ struct gic_hw_operations {
     /* Save GIC registers */
     void (*save_state)(struct vcpu *);
     /* Restore GIC registers */
-    void (*restore_state)(const struct vcpu *);
+    void (*restore_state)(struct vcpu *);
     /* Dump GIC LR register information */
     void (*dump_state)(const struct vcpu *);
 
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.