Upcast mask value to work with 64-bit physical (#436)
Change-Id: I00f0d2a3c79a431e1aa49c7478fa6c17e2fa5256
This commit is contained in:
parent
2c3f099b73
commit
8b8db033ee
|
@ -1453,6 +1453,9 @@ static int riscv_address_translate(struct target *target,
|
||||||
else
|
else
|
||||||
pte = buf_get_u64(buffer, 0, 64);
|
pte = buf_get_u64(buffer, 0, 64);
|
||||||
|
|
||||||
|
LOG_DEBUG("i=%d; PTE @0x%" TARGET_PRIxADDR " = 0x%" PRIx64, i,
|
||||||
|
pte_address, pte);
|
||||||
|
|
||||||
if (!(pte & PTE_V) || (!(pte & PTE_R) && (pte & PTE_W)))
|
if (!(pte & PTE_V) || (!(pte & PTE_R) && (pte & PTE_W)))
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
|
|
||||||
|
@ -1476,12 +1479,13 @@ static int riscv_address_translate(struct target *target,
|
||||||
while (i < info->level) {
|
while (i < info->level) {
|
||||||
ppn_value = pte >> info->pte_ppn_shift[i];
|
ppn_value = pte >> info->pte_ppn_shift[i];
|
||||||
ppn_value &= info->pte_ppn_mask[i];
|
ppn_value &= info->pte_ppn_mask[i];
|
||||||
*physical &= ~(info->pa_ppn_mask[i] << info->pa_ppn_shift[i]);
|
*physical &= ~(((target_addr_t) info->pa_ppn_mask[i]) <<
|
||||||
|
info->pa_ppn_shift[i]);
|
||||||
*physical |= (ppn_value << info->pa_ppn_shift[i]);
|
*physical |= (ppn_value << info->pa_ppn_shift[i]);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
LOG_DEBUG("Virtual address: 0x%" TARGET_PRIxADDR, virtual);
|
LOG_DEBUG("0x%" TARGET_PRIxADDR " -> 0x%" TARGET_PRIxADDR, virtual,
|
||||||
LOG_DEBUG("Physical address: 0x%" TARGET_PRIxADDR, *physical);
|
*physical);
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue