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

[Xen-changelog] [xen master] xen: arm: TCR_EL1 is 64-bit on arm64



commit 17d34efd6751f93bec943ccc8f5b8c56c8fbb483
Author:     Ian Campbell <ian.campbell@xxxxxxxxxx>
AuthorDate: Tue Dec 3 15:13:36 2013 +0000
Commit:     Ian Campbell <ian.campbell@xxxxxxxxxx>
CommitDate: Wed Dec 4 14:32:19 2013 +0000

    xen: arm: TCR_EL1 is 64-bit on arm64
    
    Storing it in a 32-bit variable in struct arch_vcpu caused breakage over
    context switch.
    
    There were also several other places which stored this as the 32-bit value.
    Update them all.
    
    The "struct vcpu_guest_context" case needs special consideration. This 
struct
    is in theory is exposed to guests, via the VCPUOP_initialise hypercall.
    However as discussed in
    http://lists.xen.org/archives/html/xen-devel/2013-10/msg00912.html this 
isn't
    really a guest visible interface since ARM uses PSCI for VCPU bringup
    (VCPUOP_initialise simply isn't available) The other users of this interface
    are the domctls, which are not a stable API. Therefore while fixing the 
ttbcr
    size also surround the struct in ifdefs to restrict the struct to the
    hypervisor and the tools only (omitting the extra complexity of renaming as 
I
    suggested in the referenced thread).
    
    NB TCR_EL1 on arm64 is known as TTBCR on arm32, hence the apparent naming
    inconsistencies.
    
    Spotted-by: Pranavkumar Sawargaonkar <pranavkumar@xxxxxxxxxx>
    Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
    Acked-by: Julien Grall <julien.grall@xxxxxxxxxx>
    Acked-by: Pranavkumar Sawargaonkar <pranavkumar@xxxxxxxxxx>
    Cc: Anup Patel <anup.patel@xxxxxxxxxx>
    Cc: patches@xxxxxxxxxx
    Cc: patches@xxxxxxx
---
 tools/include/xen-foreign/reference.size |    2 +-
 tools/xentrace/xenctx.c                  |    2 +-
 xen/arch/arm/traps.c                     |   11 ++++++-----
 xen/include/asm-arm/domain.h             |    2 +-
 xen/include/public/arch-arm.h            |    6 ++++--
 5 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/tools/include/xen-foreign/reference.size 
b/tools/include/xen-foreign/reference.size
index b3347b4..60ee262 100644
--- a/tools/include/xen-foreign/reference.size
+++ b/tools/include/xen-foreign/reference.size
@@ -5,7 +5,7 @@ start_info                |       -       -    1112    1168
 trap_info                 |       -       -       8      16
 cpu_user_regs             |       -       -      68     200
 vcpu_guest_core_regs      |     304     304       -       -
-vcpu_guest_context        |     336     336    2800    5168
+vcpu_guest_context        |     344     344    2800    5168
 arch_vcpu_info            |       0       0      24      16
 vcpu_time_info            |      32      32      32      32
 vcpu_info                 |      48      48      64      64
diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c
index ba502fd..7275a00 100644
--- a/tools/xentrace/xenctx.c
+++ b/tools/xentrace/xenctx.c
@@ -578,7 +578,7 @@ static void print_ctx(vcpu_guest_context_any_t *ctx_any)
 #endif
 
     printf("SCTLR: %08"PRIx32"\n", ctx->sctlr);
-    printf("TTBCR: %08"PRIx32"\n", ctx->ttbcr);
+    printf("TTBCR: %016"PRIx64"\n", ctx->ttbcr);
     printf("TTBR0: %016"PRIx64"\n", ctx->ttbr0);
     printf("TTBR1: %016"PRIx64"\n", ctx->ttbr1);
 }
diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
index 8144b2b..458128e 100644
--- a/xen/arch/arm/traps.c
+++ b/xen/arch/arm/traps.c
@@ -330,7 +330,8 @@ static void inject_undef64_exception(struct cpu_user_regs 
*regs, int instr_len)
 
 struct reg_ctxt {
     /* Guest-side state */
-    uint32_t sctlr_el1, tcr_el1;
+    uint32_t sctlr_el1;
+    register_t tcr_el1;
     uint64_t ttbr0_el1, ttbr1_el1;
 #ifdef CONFIG_ARM_32
     uint32_t dfsr, ifsr;
@@ -433,7 +434,7 @@ static void show_registers_32(struct cpu_user_regs *regs,
     if ( guest_mode )
     {
         printk("     SCTLR: %08"PRIx32"\n", ctxt->sctlr_el1);
-        printk("       TCR: %08"PRIx32"\n", ctxt->tcr_el1);
+        printk("       TCR: %08"PRIregister"\n", ctxt->tcr_el1);
         printk("     TTBR0: %016"PRIx64"\n", ctxt->ttbr0_el1);
         printk("     TTBR1: %016"PRIx64"\n", ctxt->ttbr1_el1);
         printk("      IFAR: %08"PRIx32", IFSR: %08"PRIx32"\n"
@@ -505,7 +506,7 @@ static void show_registers_64(struct cpu_user_regs *regs,
         printk("   FAR_EL1: %016"PRIx64"\n", ctxt->far);
         printk("\n");
         printk(" SCTLR_EL1: %08"PRIx32"\n", ctxt->sctlr_el1);
-        printk("   TCR_EL1: %08"PRIx32"\n", ctxt->tcr_el1);
+        printk("   TCR_EL1: %08"PRIregister"\n", ctxt->tcr_el1);
         printk(" TTBR0_EL1: %016"PRIx64"\n", ctxt->ttbr0_el1);
         printk(" TTBR1_EL1: %016"PRIx64"\n", ctxt->ttbr1_el1);
         printk("\n");
@@ -1257,14 +1258,14 @@ static void do_sysreg(struct cpu_user_regs *regs,
 
 void dump_guest_s1_walk(struct domain *d, vaddr_t addr)
 {
-    uint32_t ttbcr = READ_SYSREG32(TCR_EL1);
+    register_t ttbcr = READ_SYSREG(TCR_EL1);
     uint64_t ttbr0 = READ_SYSREG64(TTBR0_EL1);
     paddr_t paddr;
     uint32_t offset;
     uint32_t *first = NULL, *second = NULL;
 
     printk("dom%d VA 0x%08"PRIvaddr"\n", d->domain_id, addr);
-    printk("    TTBCR: 0x%08"PRIx32"\n", ttbcr);
+    printk("    TTBCR: 0x%08"PRIregister"\n", ttbcr);
     printk("    TTBR0: 0x%016"PRIx64" = 0x%"PRIpaddr"\n",
            ttbr0, p2m_lookup(d, ttbr0 & PAGE_MASK));
 
diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h
index d5cae2e..8ebee3e 100644
--- a/xen/include/asm-arm/domain.h
+++ b/xen/include/asm-arm/domain.h
@@ -165,7 +165,7 @@ struct arch_vcpu
 
     /* MMU */
     register_t vbar;
-    uint32_t ttbcr;
+    register_t ttbcr;
     uint64_t ttbr0, ttbr1;
 
     uint32_t dacr; /* 32-bit guests only */
diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h
index cb41ddc..475cb4a 100644
--- a/xen/include/public/arch-arm.h
+++ b/xen/include/public/arch-arm.h
@@ -278,6 +278,7 @@ typedef uint64_t xen_pfn_t;
 typedef uint64_t xen_ulong_t;
 #define PRI_xen_ulong PRIx64
 
+#if defined(__XEN__) || defined(__XEN_TOOLS__)
 struct vcpu_guest_context {
 #define _VGCF_online                   0
 #define VGCF_online                    (1<<_VGCF_online)
@@ -285,11 +286,12 @@ struct vcpu_guest_context {
 
     struct vcpu_guest_core_regs user_regs;  /* Core CPU registers */
 
-    uint32_t sctlr, ttbcr;
-    uint64_t ttbr0, ttbr1;
+    uint32_t sctlr;
+    uint64_t ttbcr, ttbr0, ttbr1;
 };
 typedef struct vcpu_guest_context vcpu_guest_context_t;
 DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
+#endif
 
 struct arch_vcpu_info {
 };
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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