hw/arm/smmuv3: Cache event fault record
The Record bit in the Context Descriptor tells the SMMU to report fault
events to the event queue. Since we don't cache the Record bit at the
moment, access faults from a cached Context Descriptor are never
reported. Store the Record bit in the cached SMMUTransCfg.
Fixes: 9bde7f0674
("hw/arm/smmuv3: Implement translate callback")
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Message-id: 20220427111543.124620-1-jean-philippe@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
8b7a5bbecf
commit
ced716942a
@ -387,7 +387,6 @@ typedef struct SMMUEventInfo {
|
||||
SMMUEventType type;
|
||||
uint32_t sid;
|
||||
bool recorded;
|
||||
bool record_trans_faults;
|
||||
bool inval_ste_allowed;
|
||||
union {
|
||||
struct {
|
||||
|
@ -527,7 +527,7 @@ static int decode_cd(SMMUTransCfg *cfg, CD *cd, SMMUEventInfo *event)
|
||||
trace_smmuv3_decode_cd_tt(i, tt->tsz, tt->ttb, tt->granule_sz, tt->had);
|
||||
}
|
||||
|
||||
event->record_trans_faults = CD_R(cd);
|
||||
cfg->record_faults = CD_R(cd);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -680,7 +680,7 @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
|
||||
|
||||
tt = select_tt(cfg, addr);
|
||||
if (!tt) {
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_TRANSLATION;
|
||||
event.u.f_translation.addr = addr;
|
||||
event.u.f_translation.rnw = flag & 0x1;
|
||||
@ -696,7 +696,7 @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
|
||||
if (cached_entry) {
|
||||
if ((flag & IOMMU_WO) && !(cached_entry->entry.perm & IOMMU_WO)) {
|
||||
status = SMMU_TRANS_ERROR;
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_PERMISSION;
|
||||
event.u.f_permission.addr = addr;
|
||||
event.u.f_permission.rnw = flag & 0x1;
|
||||
@ -720,28 +720,28 @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
|
||||
event.u.f_walk_eabt.addr2 = ptw_info.addr;
|
||||
break;
|
||||
case SMMU_PTW_ERR_TRANSLATION:
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_TRANSLATION;
|
||||
event.u.f_translation.addr = addr;
|
||||
event.u.f_translation.rnw = flag & 0x1;
|
||||
}
|
||||
break;
|
||||
case SMMU_PTW_ERR_ADDR_SIZE:
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_ADDR_SIZE;
|
||||
event.u.f_addr_size.addr = addr;
|
||||
event.u.f_addr_size.rnw = flag & 0x1;
|
||||
}
|
||||
break;
|
||||
case SMMU_PTW_ERR_ACCESS:
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_ACCESS;
|
||||
event.u.f_access.addr = addr;
|
||||
event.u.f_access.rnw = flag & 0x1;
|
||||
}
|
||||
break;
|
||||
case SMMU_PTW_ERR_PERMISSION:
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_PERMISSION;
|
||||
event.u.f_permission.addr = addr;
|
||||
event.u.f_permission.rnw = flag & 0x1;
|
||||
|
@ -71,6 +71,7 @@ typedef struct SMMUTransCfg {
|
||||
bool disabled; /* smmu is disabled */
|
||||
bool bypassed; /* translation is bypassed */
|
||||
bool aborted; /* translation is aborted */
|
||||
bool record_faults; /* record fault events */
|
||||
uint64_t ttb; /* TT base address */
|
||||
uint8_t oas; /* output address width */
|
||||
uint8_t tbi; /* Top Byte Ignore */
|
||||
|
Loading…
Reference in New Issue
Block a user