Use MemTxAttrs interface read_with_attrs/write_with_attrs
for virt_iocsr_misc_ops.
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
hw/loongarch/virt.c | 26 ++++++++++++++++----------
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index e7edc6c9f9..0ab2b6860a 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -866,8 +866,9 @@ static void virt_firmware_init(LoongArchVirtMachineState *lvms)
}
}
-static void virt_iocsr_misc_write(void *opaque, hwaddr addr,
- uint64_t val, unsigned size)
+static MemTxResult virt_iocsr_misc_write(void *opaque, hwaddr addr,
+ uint64_t val, unsigned size,
+ MemTxAttrs attrs)
{
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(opaque);
uint64_t features;
@@ -875,12 +876,12 @@ static void virt_iocsr_misc_write(void *opaque, hwaddr addr,
switch (addr) {
case MISC_FUNC_REG:
if (!virt_is_veiointc_enabled(lvms)) {
- return;
+ return MEMTX_OK;
}
features = address_space_ldl(&lvms->as_iocsr,
EXTIOI_VIRT_BASE + EXTIOI_VIRT_CONFIG,
- MEMTXATTRS_UNSPECIFIED, NULL);
+ attrs, NULL);
if (val & BIT_ULL(IOCSRM_EXTIOI_EN)) {
features |= BIT(EXTIOI_ENABLE);
}
@@ -890,11 +891,15 @@ static void virt_iocsr_misc_write(void *opaque, hwaddr addr,
address_space_stl(&lvms->as_iocsr,
EXTIOI_VIRT_BASE + EXTIOI_VIRT_CONFIG,
- features, MEMTXATTRS_UNSPECIFIED, NULL);
+ features, attrs, NULL);
}
+
+ return MEMTX_OK;
}
-static uint64_t virt_iocsr_misc_read(void *opaque, hwaddr addr, unsigned size)
+static MemTxResult virt_iocsr_misc_read(void *opaque, hwaddr addr,
+ uint64_t *data,
+ unsigned size, MemTxAttrs attrs)
{
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(opaque);
uint64_t ret = 0;
@@ -924,7 +929,7 @@ static uint64_t virt_iocsr_misc_read(void *opaque, hwaddr addr, unsigned size)
features = address_space_ldl(&lvms->as_iocsr,
EXTIOI_VIRT_BASE + EXTIOI_VIRT_CONFIG,
- MEMTXATTRS_UNSPECIFIED, NULL);
+ attrs, NULL);
if (features & BIT(EXTIOI_ENABLE)) {
ret |= BIT_ULL(IOCSRM_EXTIOI_EN);
}
@@ -933,12 +938,13 @@ static uint64_t virt_iocsr_misc_read(void *opaque, hwaddr addr, unsigned size)
}
}
- return ret;
+ *data = ret;
+ return MEMTX_OK;
}
static const MemoryRegionOps virt_iocsr_misc_ops = {
- .read = virt_iocsr_misc_read,
- .write = virt_iocsr_misc_write,
+ .read_with_attrs = virt_iocsr_misc_read,
+ .write_with_attrs = virt_iocsr_misc_write,
.endianness = DEVICE_LITTLE_ENDIAN,
.valid = {
.min_access_size = 4,
--
2.34.1
On 2024/5/21 下午8:32, Song Gao wrote:
> Use MemTxAttrs interface read_with_attrs/write_with_attrs
> for virt_iocsr_misc_ops.
>
> Signed-off-by: Song Gao <gaosong@loongson.cn>
> ---
> hw/loongarch/virt.c | 26 ++++++++++++++++----------
> 1 file changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index e7edc6c9f9..0ab2b6860a 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -866,8 +866,9 @@ static void virt_firmware_init(LoongArchVirtMachineState *lvms)
> }
> }
>
> -static void virt_iocsr_misc_write(void *opaque, hwaddr addr,
> - uint64_t val, unsigned size)
> +static MemTxResult virt_iocsr_misc_write(void *opaque, hwaddr addr,
> + uint64_t val, unsigned size,
> + MemTxAttrs attrs)
> {
> LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(opaque);
> uint64_t features;
> @@ -875,12 +876,12 @@ static void virt_iocsr_misc_write(void *opaque, hwaddr addr,
> switch (addr) {
> case MISC_FUNC_REG:
> if (!virt_is_veiointc_enabled(lvms)) {
> - return;
> + return MEMTX_OK;
> }
>
> features = address_space_ldl(&lvms->as_iocsr,
> EXTIOI_VIRT_BASE + EXTIOI_VIRT_CONFIG,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> + attrs, NULL);
> if (val & BIT_ULL(IOCSRM_EXTIOI_EN)) {
> features |= BIT(EXTIOI_ENABLE);
> }
> @@ -890,11 +891,15 @@ static void virt_iocsr_misc_write(void *opaque, hwaddr addr,
>
> address_space_stl(&lvms->as_iocsr,
> EXTIOI_VIRT_BASE + EXTIOI_VIRT_CONFIG,
> - features, MEMTXATTRS_UNSPECIFIED, NULL);
> + features, attrs, NULL);
> }
> +
> + return MEMTX_OK;
> }
>
> -static uint64_t virt_iocsr_misc_read(void *opaque, hwaddr addr, unsigned size)
> +static MemTxResult virt_iocsr_misc_read(void *opaque, hwaddr addr,
> + uint64_t *data,
> + unsigned size, MemTxAttrs attrs)
> {
> LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(opaque);
> uint64_t ret = 0;
> @@ -924,7 +929,7 @@ static uint64_t virt_iocsr_misc_read(void *opaque, hwaddr addr, unsigned size)
>
> features = address_space_ldl(&lvms->as_iocsr,
> EXTIOI_VIRT_BASE + EXTIOI_VIRT_CONFIG,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> + attrs, NULL);
> if (features & BIT(EXTIOI_ENABLE)) {
> ret |= BIT_ULL(IOCSRM_EXTIOI_EN);
> }
> @@ -933,12 +938,13 @@ static uint64_t virt_iocsr_misc_read(void *opaque, hwaddr addr, unsigned size)
> }
> }
>
> - return ret;
> + *data = ret;
> + return MEMTX_OK;
> }
>
> static const MemoryRegionOps virt_iocsr_misc_ops = {
> - .read = virt_iocsr_misc_read,
> - .write = virt_iocsr_misc_write,
> + .read_with_attrs = virt_iocsr_misc_read,
> + .write_with_attrs = virt_iocsr_misc_write,
> .endianness = DEVICE_LITTLE_ENDIAN,
> .valid = {
> .min_access_size = 4,
>
I think patch3 should be put ahead of patch2. Without patch3, there is
potential problem to access iocsr EXTIOI_VIRT_CONFIG register with
MEMTXATTRS_UNSPECIFIED attr.
Now extioi is emulated in user space, it will be better if hypervisor
and VM know whether v-extioi extension is supported.
Regards
Bibo Mao
© 2016 - 2026 Red Hat, Inc.