@samitouri / QOSamiQemu / commits / b6d36a1af7

hw/intc/exynos4210_combiner: Avoid hw_error for guest errors

In the exynos4210_combiner device, several cases of bad register offsets passed by the guest are handled by calling hw_error(). This causes QEMU to abort with a guest register dump. These days we prefer to handle "guest does something wrong" by logging it and continuing. Update the hw_error() calls to qemu_log_mask(LOG_GUEST_ERROR). Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3396 Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-id: 20260529143624.158935-2-peter.maydell@linaro.org

Peter Maydell committed May 29, 2026 at 15:36 UTC b6d36a1af790b8ec02e3aa37897331980965c686
1 file changed +18 -11
hw/intc/exynos4210_combiner.c
+18 -11
@@ -28,12 +28,12 @@
28 */
29
30 #include "qemu/osdep.h"
31 +#include "qemu/log.h"
32 #include "hw/core/sysbus.h"
33 #include "migration/vmstate.h"
34 #include "qemu/module.h"
35 #include "hw/intc/exynos4210_combiner.h"
36 #include "hw/arm/exynos4210.h"
36 -#include "hw/core/hw-error.h"
37 #include "hw/core/irq.h"
38 #include "hw/core/qdev-properties.h"
39 #include "qom/object.h"
@@ -119,8 +119,10 @@ exynos4210_combiner_read(void *opaque, hwaddr offset, unsigned size)
119 break;
120 default:
121 if (offset >> 2 >= IIC_REGSET_SIZE) {
122 - hw_error("exynos4210.combiner: overflow of reg_set by 0x"
123 - HWADDR_FMT_plx "offset\n", offset);
122 + qemu_log_mask(LOG_GUEST_ERROR,
123 + "exynos4210.combiner: overflow of reg_set by 0x"
124 + HWADDR_FMT_plx "offset\n", offset);
125 + return 0;
126 }
127 val = s->reg_set[offset >> 2];
128 }
@@ -183,20 +185,24 @@ static void exynos4210_combiner_write(void *opaque, hwaddr offset,
185 reg_n = (offset - (req_quad_base_n << 4)) >> 2;
186
187 if (req_quad_base_n >= IIC_NGRP) {
186 - hw_error("exynos4210.combiner: unallowed write access at offset 0x"
187 - HWADDR_FMT_plx "\n", offset);
188 + qemu_log_mask(LOG_GUEST_ERROR,
189 + "exynos4210.combiner: unallowed write access at offset 0x"
190 + HWADDR_FMT_plx "\n", offset);
191 return;
192 }
193
194 if (reg_n > 1) {
192 - hw_error("exynos4210.combiner: unallowed write access at offset 0x"
193 - HWADDR_FMT_plx "\n", offset);
195 + qemu_log_mask(LOG_GUEST_ERROR,
196 + "exynos4210.combiner: unallowed write access at offset 0x"
197 + HWADDR_FMT_plx "\n", offset);
198 return;
199 }
200
201 if (offset >> 2 >= IIC_REGSET_SIZE) {
198 - hw_error("exynos4210.combiner: overflow of reg_set by 0x"
199 - HWADDR_FMT_plx "offset\n", offset);
202 + qemu_log_mask(LOG_GUEST_ERROR,
203 + "exynos4210.combiner: overflow of reg_set by 0x"
204 + HWADDR_FMT_plx "offset\n", offset);
205 + return;
206 }
207 s->reg_set[offset >> 2] = val;
208
@@ -245,8 +251,9 @@ static void exynos4210_combiner_write(void *opaque, hwaddr offset,
251 exynos4210_combiner_update(s, grp_quad_base_n + 3);
252 break;
253 default:
248 - hw_error("exynos4210.combiner: unallowed write access at offset 0x"
249 - HWADDR_FMT_plx "\n", offset);
254 + qemu_log_mask(LOG_GUEST_ERROR,
255 + "exynos4210.combiner: unallowed write access at offset 0x"
256 + HWADDR_FMT_plx "\n", offset);
257 break;
258 }
259 }