|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4] xen/arm: Implement a dummy debug monitor for ARM32
On Thu, 2014-04-24 at 23:45 +0100, Julien Grall wrote:
> XSA-93 (commit 0b18220 "xen/arm: Don't let guess access to Debug and
> Performance
> Monitors registers") disable Debug Registers access.
>
> When CONFIG_PERF_EVENTS is enabled in the Linux Kernel, it will try to
> initialize the debug monitors. If an error occured Linux won't use this
> feature.
>
> The implementation made Xen expose a minimal set of registers which let think
> the guest (i.e.) thinks HW debug won't work.
Why only for arm32?
I think arm64 makes more use than arm32 (unconditionally touches
MDSCR_EL1 on the ctx switch path).
I think we should be considering allow the guest to access these and
context switching them instead.
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
>
> ---
> This commit is candidate for backporting on Xen 4.4. Distribution may
> enable HW DEBUG (e.g. Linaro Ubuntu image), therefore Linux will try
> to initialize it.
> ---
> xen/arch/arm/traps.c | 77
> ++++++++++++++++++++++++++++++++++++++++--
> xen/include/asm-arm/cpregs.h | 14 ++++++++
> 2 files changed, 89 insertions(+), 2 deletions(-)
>
> diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
> index 319bbe9..1f61e6e 100644
> --- a/xen/arch/arm/traps.c
> +++ b/xen/arch/arm/traps.c
> @@ -1468,7 +1468,76 @@ static void do_cp15_64(struct cpu_user_regs *regs,
> advance_pc(regs, hsr);
> }
>
> -static void do_cp14(struct cpu_user_regs *regs, union hsr hsr)
> +static void do_cp14_32(struct cpu_user_regs *regs, union hsr hsr)
> +{
> + struct hsr_cp32 cp32 = hsr.cp32;
> + uint32_t *r = (uint32_t *)select_user_reg(regs, cp32.reg);
> + struct domain *d = current->domain;
> +
> + if ( !check_conditional_instr(regs, hsr) )
> + {
> + advance_pc(regs, hsr);
> + return;
> + }
> +
> + switch ( hsr.bits & HSR_CP32_REGS_MASK )
> + {
> + case HSR_CPREG32(DBGDIDR):
> +
> + /* Read-only register */
> + if ( !cp32.read )
> + goto bad_cp;
> +
> + /* Implement the minimum requirements:
> + * - Number of watchpoints: 1
> + * - Number of breakpoints: 2
> + * - Version: ARMv7 v7.1
> + * - Variant and Revision bits match MDIR
> + */
> + *r = (1 << 24) | (5 << 16);
> + *r |= ((d->arch.vpidr >> 20) & 0xf) | (d->arch.vpidr & 0xf);
> + break;
> +
> + case HSR_CPREG32(DBGDSCRINT):
> + case HSR_CPREG32(DBGDSCREXT):
> + /* Implement debug status and control register as RAZ/WI.
> + * The OS won't use Hardware debug if MDBGen not set
> + */
> + if ( cp32.read )
> + *r = 0;
> + break;
> + case HSR_CPREG32(DBGVCR):
> + case HSR_CPREG32(DBGOSLAR):
> + case HSR_CPREG32(DBGBVR0):
> + case HSR_CPREG32(DBGCR0):
> + case HSR_CPREG32(DBGWVR0):
> + case HSR_CPREG32(DBGWCR0):
> + case HSR_CPREG32(DBGBVR1):
> + case HSR_CPREG32(DBGCR1):
> + case HSR_CPREG32(DBGOSDLR):
> + /* RAZ/WI */
> + if ( cp32.read )
> + *r = 0;
> + break;
> +
> + default:
> +bad_cp:
> +#ifndef NDEBUG
> + gdprintk(XENLOG_ERR,
> + "%s p14, %d, r%d, cr%d, cr%d, %d @ 0x%"PRIregister"\n",
> + cp32.read ? "mrc" : "mcr",
> + cp32.op1, cp32.reg, cp32.crn, cp32.crm, cp32.op2,
> regs->pc);
> + gdprintk(XENLOG_ERR, "unhandled 32-bit cp14 access %#x\n",
> + hsr.bits & HSR_CP32_REGS_MASK);
> +#endif
> + inject_undef32_exception(regs);
> + return;
> + }
> +
> + advance_pc(regs, hsr);
> +}
> +
> +static void do_cp14_dbg(struct cpu_user_regs *regs, union hsr hsr)
> {
> if ( !check_conditional_instr(regs, hsr) )
> {
> @@ -1720,10 +1789,14 @@ asmlinkage void do_trap_hypervisor(struct
> cpu_user_regs *regs)
> do_cp15_64(regs, hsr);
> break;
> case HSR_EC_CP14_32:
> + if ( !is_32bit_domain(current->domain) )
> + goto bad_trap;
> + do_cp14_32(regs, hsr);
> + break;
> case HSR_EC_CP14_DBG:
> if ( !is_32bit_domain(current->domain) )
> goto bad_trap;
> - do_cp14(regs, hsr);
> + do_cp14_dbg(regs, hsr);
> break;
> case HSR_EC_CP:
> if ( !is_32bit_domain(current->domain) )
> diff --git a/xen/include/asm-arm/cpregs.h b/xen/include/asm-arm/cpregs.h
> index f44e3b5..306e506 100644
> --- a/xen/include/asm-arm/cpregs.h
> +++ b/xen/include/asm-arm/cpregs.h
> @@ -71,6 +71,20 @@
>
> /* Coprocessor 14 */
>
> +/* CP14 0: Debug Register interface */
> +#define DBGDIDR p14,0,c0,c0,0 /* Debug ID Register */
> +#define DBGDSCRINT p14,0,c0,c1,0 /* Debug Status and Control Internal
> */
> +#define DBGDSCREXT p14,0,c0,c2,2 /* Debug Status and Control External
> */
> +#define DBGVCR p14,0,c0,c7,0 /* Vector Catch */
> +#define DBGBVR0 p14,0,c0,c0,4 /* Breakpoint Value 0 */
> +#define DBGCR0 p14,0,c0,c0,5 /* Breakpoint Control 0 */
> +#define DBGWVR0 p14,0,c0,c0,6 /* Watchpoint Value 0 */
> +#define DBGWCR0 p14,0,c0,c0,7 /* Watchpoint Control 0 */
> +#define DBGBVR1 p14,0,c0,c1,4 /* Breakpoint Value 1 */
> +#define DBGCR1 p14,0,c0,c1,5 /* Breakpoint Control 1 */
> +#define DBGOSLAR p14,0,c1,c0,4 /* OS Lock Access */
> +#define DBGOSDLR p14,0,c1,c3,4 /* OS Double Lock */
> +
> /* CP14 CR0: */
> #define TEECR p14,6,c0,c0,0 /* ThumbEE Configuration Register */
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |