[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 32/45] xen: arm: show_registers() support for 64-bit.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/traps.c | 180 +++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 155 insertions(+), 25 deletions(-) diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 590e00f..af0b700 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -219,12 +219,19 @@ void panic_PAR(uint64_t par) } struct reg_ctxt { - uint32_t sctlr, ttbcr; + uint32_t sctlr, tcr; uint64_t ttbr0, ttbr1; +#ifdef CONFIG_ARM_32 + uint32_t dfar, ifar; +#else + uint64_t far; +#endif }; -static void _show_registers(struct cpu_user_regs *regs, - struct reg_ctxt *ctxt, - int guest_mode) + +static void _show_registers_32(struct cpu_user_regs *regs, + struct reg_ctxt *ctxt, + int guest_mode, + const struct vcpu *v) { static const char *mode_strings[] = { [PSR_MODE_USR] = "USR", @@ -238,25 +245,34 @@ static void _show_registers(struct cpu_user_regs *regs, [PSR_MODE_SYS] = "SYS" }; - print_xen_info(); - printk("CPU: %d\n", smp_processor_id()); +#ifdef CONFIG_ARM_64 + printk("PC: %08"PRIx32"\n", regs->pc32); +#else printk("PC: %08"PRIx32, regs->pc); if ( !guest_mode ) - print_symbol(" %s", regs->pc); + print_symbol(" %s", regs->pc); printk("\n"); - printk("CPSR: %08"PRIx32" MODE:%s\n", regs->cpsr, - mode_strings[regs->cpsr & PSR_MODE_MASK]); +#endif + printk("CPSR: %08"PRIx32" MODE:%s%s\n", regs->cpsr, + guest_mode ? "32-bit Guest " : "Hypervisor", + guest_mode ? mode_strings[regs->cpsr & PSR_MODE_MASK] : ""); printk(" R0: %08"PRIx32" R1: %08"PRIx32" R2: %08"PRIx32" R3: %08"PRIx32"\n", regs->r0, regs->r1, regs->r2, regs->r3); printk(" R4: %08"PRIx32" R5: %08"PRIx32" R6: %08"PRIx32" R7: %08"PRIx32"\n", regs->r4, regs->r5, regs->r6, regs->r7); printk(" R8: %08"PRIx32" R9: %08"PRIx32" R10:%08"PRIx32" R11:%08"PRIx32" R12:%08"PRIx32"\n", - regs->r8, regs->r9, regs->r10, regs->r11, regs->r12); + regs->r8, regs->r9, regs->r10, +#ifdef CONFIG_ARM_64 + regs->r11, +#else + regs->fp, +#endif + regs->r12); if ( guest_mode ) { - printk("USR: SP: %08"PRIx32" LR: %08"PRIx32" CPSR:%08"PRIx32"\n", - regs->sp_usr, regs->lr_usr, regs->cpsr); + printk("USR: SP: %08"PRIx32" LR: %08"PRIregister"\n", + regs->sp_usr, regs->lr); printk("SVC: SP: %08"PRIx32" LR: %08"PRIx32" SPSR:%08"PRIx32"\n", regs->sp_svc, regs->lr_svc, regs->spsr_svc); printk("ABT: SP: %08"PRIx32" LR: %08"PRIx32" SPSR:%08"PRIx32"\n", @@ -269,50 +285,164 @@ static void _show_registers(struct cpu_user_regs *regs, regs->sp_fiq, regs->lr_fiq, regs->spsr_fiq); printk("FIQ: R8: %08"PRIx32" R9: %08"PRIx32" R10:%08"PRIx32" R11:%08"PRIx32" R12:%08"PRIx32"\n", regs->r8_fiq, regs->r9_fiq, regs->r10_fiq, regs->r11_fiq, regs->r11_fiq); - printk("\n"); - printk("TTBR0 %010"PRIx64" TTBR1 %010"PRIx64" TTBCR %08"PRIx32"\n", - ctxt->ttbr0, ctxt->ttbr1, ctxt->ttbcr); + } +#ifndef CONFIG_ARM_64 + else + { + printk("HYP: SP: %08"PRIx32" LR: %08"PRIregister"\n", regs->sp, regs->lr); + } +#endif + printk("\n"); + + if ( guest_mode ) + { + printk("TTBR0 %010"PRIx64" TTBR1 %010"PRIx64" TCR %08"PRIx32"\n", + ctxt->ttbr0, ctxt->ttbr1, ctxt->tcr); printk("SCTLR %08"PRIx32"\n", ctxt->sctlr); - printk("VTTBR %010"PRIx64"\n", READ_CP64(VTTBR)); + printk("IFAR %08"PRIx32" DFAR %08"PRIx32"\n", +#ifdef CONFIG_ARM_64 + (uint32_t)(ctxt->far >> 32), + (uint32_t)(ctxt->far & 0xffffffff) +#else + ctxt->ifar, ctxt->dfar +#endif + ); printk("\n"); } - else +} + +#ifdef CONFIG_ARM_64 +static void _show_registers_64(struct cpu_user_regs *regs, + struct reg_ctxt *ctxt, + int guest_mode, + const struct vcpu *v) +{ + printk("PC: %016"PRIx64, regs->pc); + if ( !guest_mode ) + print_symbol(" %s", regs->pc); + printk("\n"); + printk("SP: %08"PRIx64"\n", regs->sp); + printk("CPSR: %08"PRIx32" MODE:%s\n", regs->cpsr, + guest_mode ? "64-bit Guest" : "Hypervisor"); + printk(" X0: %016"PRIx64" X1: %016"PRIx64" X2: %016"PRIx64"\n", + regs->x0, regs->x1, regs->x2); + printk(" X3: %016"PRIx64" X4: %016"PRIx64" X5: %016"PRIx64"\n", + regs->x3, regs->x4, regs->x5); + printk(" X6: %016"PRIx64" X7: %016"PRIx64" X8: %016"PRIx64"\n", + regs->x6, regs->x7, regs->x8); + printk(" X9: %016"PRIx64" X10: %016"PRIx64" X11: %016"PRIx64"\n", + regs->x9, regs->x10, regs->x11); + printk(" X12: %016"PRIx64" X13: %016"PRIx64" X14: %016"PRIx64"\n", + regs->x12, regs->x13, regs->x14); + printk(" X15: %016"PRIx64" X16: %016"PRIx64" X17: %016"PRIx64"\n", + regs->x15, regs->x16, regs->x17); + printk(" X18: %016"PRIx64" X19: %016"PRIx64" X20: %016"PRIx64"\n", + regs->x18, regs->x19, regs->x20); + printk(" X21: %016"PRIx64" X22: %016"PRIx64" X23: %016"PRIx64"\n", + regs->x21, regs->x22, regs->x23); + printk(" X24: %016"PRIx64" X25: %016"PRIx64" X26: %016"PRIx64"\n", + regs->x24, regs->x25, regs->x26); + printk(" X27: %016"PRIx64" X28: %016"PRIx64" X29: %016"PRIx64"\n", + regs->x27, regs->x28, regs->lr); + printk("\n"); + + if ( guest_mode ) { - printk(" SP: %08"PRIx32" LR: %08"PRIx32"\n", regs->sp, regs->lr); + printk("SCTLR_EL1: %08"PRIx32"\n", ctxt->sctlr); + printk(" TCR_EL1: %08"PRIx32"\n",ctxt->tcr); + printk("TTBR0_EL1: %010"PRIx64"\n", ctxt->ttbr0); + printk("TTBR1_EL1: %010"PRIx64"\n", ctxt->ttbr1); + printk(" FAR_EL1: %010"PRIx64"\n", ctxt->far); printk("\n"); } +} +#endif + +static void _show_registers(struct cpu_user_regs *regs, + struct reg_ctxt *ctxt, + int guest_mode, + const struct vcpu *v) +{ +#ifdef CONFIG_ARM_64 + uint64_t reg; +#endif + print_xen_info(); + + printk("CPU: %d\n", smp_processor_id()); + + if ( guest_mode ) + { + if ( is_pv32_domain(v->domain) ) + _show_registers_32(regs, ctxt, guest_mode, v); +#ifdef CONFIG_ARM_64 + else if ( is_pv64_domain(v->domain) ) + _show_registers_64(regs, ctxt, guest_mode, v); +#endif + } + else + { +#ifdef CONFIG_ARM_64 + _show_registers_64(regs, ctxt, guest_mode, v); +#else + _show_registers_32(regs, ctxt, guest_mode, v); +#endif + } + +#ifdef CONFIG_ARM_32 printk("HTTBR %"PRIx64"\n", READ_CP64(HTTBR)); printk("HDFAR %"PRIx32"\n", READ_CP32(HDFAR)); printk("HIFAR %"PRIx32"\n", READ_CP32(HIFAR)); printk("HPFAR %"PRIx32"\n", READ_CP32(HPFAR)); printk("HCR %08"PRIx32"\n", READ_CP32(HCR)); printk("HSR %"PRIx32"\n", READ_CP32(HSR)); + printk("VTTBR %010"PRIx64"\n", READ_CP64(VTTBR)); printk("\n"); printk("DFSR %"PRIx32" DFAR %"PRIx32"\n", READ_CP32(DFSR), READ_CP32(DFAR)); printk("IFSR %"PRIx32" IFAR %"PRIx32"\n", READ_CP32(IFSR), READ_CP32(IFAR)); printk("\n"); +#else + reg = READ_SYSREG64(TTBR0_EL2); printk("TTBR0_EL2: %"PRIx64"\n", reg); + reg = READ_SYSREG64(FAR_EL2); printk(" FAR_EL2: %"PRIx64"\n", reg); + reg = READ_SYSREG64(HPFAR_EL2); printk("HPFAR_EL2: %"PRIx64"\n", reg); + reg = READ_SYSREG64(HCR_EL2); printk(" HCR_EL2: %"PRIx64"\n", reg); + reg = READ_SYSREG64(ESR_EL2); printk(" ESR_EL2: %"PRIx64"\n", reg); + reg = READ_SYSREG64(VTTBR_EL2); printk("VTTBR_EL2: %"PRIx64"\n", reg); + printk("\n"); +#endif } void show_registers(struct cpu_user_regs *regs) { struct reg_ctxt ctxt; - ctxt.sctlr = READ_CP32(SCTLR); - ctxt.ttbcr = READ_CP32(TTBCR); - ctxt.ttbr0 = READ_CP64(TTBR0); - ctxt.ttbr1 = READ_CP64(TTBR1); - _show_registers(regs, &ctxt, guest_mode(regs)); + ctxt.sctlr = READ_SYSREG(SCTLR_EL1); + ctxt.tcr = READ_SYSREG(TCR_EL1); + ctxt.ttbr0 = READ_SYSREG64(TTBR0_EL1); + ctxt.ttbr1 = READ_SYSREG64(TTBR1_EL1); +#ifdef CONFIG_ARM_32 + ctxt.dfar = READ_CP32(DFAR); + ctxt.ifar = READ_CP32(IFAR); +#else + ctxt.far = READ_SYSREG(FAR_EL1); +#endif + _show_registers(regs, &ctxt, guest_mode(regs), current); } void vcpu_show_registers(const struct vcpu *v) { struct reg_ctxt ctxt; ctxt.sctlr = v->arch.sctlr; - ctxt.ttbcr = v->arch.ttbcr; + ctxt.tcr = v->arch.ttbcr; ctxt.ttbr0 = v->arch.ttbr0; ctxt.ttbr1 = v->arch.ttbr1; - _show_registers(&v->arch.cpu_info->guest_cpu_user_regs, &ctxt, 1); +#ifdef CONFIG_ARM_32 + ctxt.dfar = v->arch.dfar; + ctxt.ifar = v->arch.ifar; +#else + ctxt.far = v->arch.far; +#endif + _show_registers(&v->arch.cpu_info->guest_cpu_user_regs, &ctxt, 1, v); } static void show_guest_stack(struct cpu_user_regs *regs) -- 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |