|
@@ -817,6 +817,13 @@ MemTxResult gicv3_dist_read(void *opaque, hwaddr offset, uint64_t *data,
|
|
|
"%s: invalid guest read at offset " TARGET_FMT_plx
|
|
|
"size %u\n", __func__, offset, size);
|
|
|
trace_gicv3_dist_badread(offset, size, attrs.secure);
|
|
|
+ /* The spec requires that reserved registers are RAZ/WI;
|
|
|
+ * so use MEMTX_ERROR returns from leaf functions as a way to
|
|
|
+ * trigger the guest-error logging but don't return it to
|
|
|
+ * the caller, or we'll cause a spurious guest data abort.
|
|
|
+ */
|
|
|
+ r = MEMTX_OK;
|
|
|
+ *data = 0;
|
|
|
} else {
|
|
|
trace_gicv3_dist_read(offset, *data, size, attrs.secure);
|
|
|
}
|
|
@@ -852,6 +859,12 @@ MemTxResult gicv3_dist_write(void *opaque, hwaddr offset, uint64_t data,
|
|
|
"%s: invalid guest write at offset " TARGET_FMT_plx
|
|
|
"size %u\n", __func__, offset, size);
|
|
|
trace_gicv3_dist_badwrite(offset, data, size, attrs.secure);
|
|
|
+ /* The spec requires that reserved registers are RAZ/WI;
|
|
|
+ * so use MEMTX_ERROR returns from leaf functions as a way to
|
|
|
+ * trigger the guest-error logging but don't return it to
|
|
|
+ * the caller, or we'll cause a spurious guest data abort.
|
|
|
+ */
|
|
|
+ r = MEMTX_OK;
|
|
|
} else {
|
|
|
trace_gicv3_dist_write(offset, data, size, attrs.secure);
|
|
|
}
|