cortexa: Catch and report faults on address translation.
This commit is contained in:
parent
9e2b0a86d7
commit
ea9c2a2030
|
@ -83,6 +83,7 @@ struct cortexa_priv {
|
||||||
unsigned hw_breakpoint_max;
|
unsigned hw_breakpoint_max;
|
||||||
unsigned hw_breakpoint[16];
|
unsigned hw_breakpoint[16];
|
||||||
uint32_t bpc0;
|
uint32_t bpc0;
|
||||||
|
bool mmu_fault;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This may be specific to Cortex-A9 */
|
/* This may be specific to Cortex-A9 */
|
||||||
|
@ -213,10 +214,13 @@ static uint32_t apb_read(target *t, uint16_t reg)
|
||||||
|
|
||||||
static uint32_t va_to_pa(target *t, uint32_t va)
|
static uint32_t va_to_pa(target *t, uint32_t va)
|
||||||
{
|
{
|
||||||
|
struct cortexa_priv *priv = t->priv;
|
||||||
write_gpreg(t, 0, va);
|
write_gpreg(t, 0, va);
|
||||||
apb_write(t, DBGITR, MCR | ATS1CPR);
|
apb_write(t, DBGITR, MCR | ATS1CPR);
|
||||||
apb_write(t, DBGITR, MRC | PAR);
|
apb_write(t, DBGITR, MRC | PAR);
|
||||||
uint32_t par = read_gpreg(t, 0);
|
uint32_t par = read_gpreg(t, 0);
|
||||||
|
if (par & 1)
|
||||||
|
priv->mmu_fault = true;
|
||||||
uint32_t pa = (par & ~0xfff) | (va & 0xfff);
|
uint32_t pa = (par & ~0xfff) | (va & 0xfff);
|
||||||
DEBUG("%s: VA = 0x%08X, PAR = 0x%08X, PA = 0x%08X\n", __func__, va, par, pa);
|
DEBUG("%s: VA = 0x%08X, PAR = 0x%08X, PA = 0x%08X\n", __func__, va, par, pa);
|
||||||
return pa;
|
return pa;
|
||||||
|
@ -249,8 +253,11 @@ static void cortexa_mem_write(target *t, uint32_t dest, const void *src, size_t
|
||||||
|
|
||||||
static bool cortexa_check_error(target *t)
|
static bool cortexa_check_error(target *t)
|
||||||
{
|
{
|
||||||
ADIv5_AP_t *ahb = ((struct cortexa_priv*)t->priv)->ahb;
|
struct cortexa_priv *priv = t->priv;
|
||||||
return adiv5_dp_error(ahb->dp) != 0;
|
ADIv5_AP_t *ahb = priv->ahb;
|
||||||
|
bool err = (adiv5_dp_error(ahb->dp) != 0) || priv->mmu_fault;
|
||||||
|
priv->mmu_fault = false;
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue