blob: 389b0e4bb2771b5454b77b1f85228971a8c6206a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
id = 1503
title = "Writing to readonly memory should call cpu_transaction_failed"
state = "opened"
created_at = "2023-02-23T03:30:17.223Z"
closed_at = "n/a"
labels = ["accel: TCG", "workflow::Needs Info"]
url = "https://gitlab.com/qemu-project/qemu/-/issues/1503"
host-os = "n/a"
host-arch = "n/a"
qemu-version = "n/a"
guest-os = "n/a"
guest-arch = "n/a"
description = """Currently if a guest writes to ROM memory on a system that doesn't have some other form of memory protection enabled, QEMU will silently ignore the write (https://gitlab.com/qemu-project/qemu/-/blob/master/accel/tcg/cputlb.c#L2432). Instead, it should call cpu_transaction_failed (similar to what happens when a MMIO operation fails in `io_writex` and other places). For CPUs that don't care, it'll continue to be ignored, but for other CPUs the user will get a warning (with `-d guest_errors`) or an exception as appropriate."""
reproduce = """N/A"""
additional = """The documentation for do_transaction_failed says:
```
@do_transaction_failed: Callback for handling failed memory transactions
(ie bus faults or external aborts; not MMU faults)
```
which seems reasonably well suited for this case. Here's an overview of what different CPUs currently do if do_transaction_failed is called:
alpha_cpu_do_transaction_failed:
* raises a EXCP_MCHK
arm_cpu_do_transaction_failed:
* raises ARMFault_SyncExternal with EXCP_DATA_ABORT
loongarch_cpu_do_transaction_failed:
* raises EXCCODE_ADEM
m68k_cpu_transaction_failed:
* raises EXCP_ACCESS (M68040 only)
mb_cpu_transaction_failed:
* raises EXCP_HW_EXCP with ESR_EC_DATA_BUS
mips_cpu_do_transaction_failed:
* raises EXCP_DBE (data bus error)
riscv_cpu_do_transaction_failed:
* raises RISCV_EXCP_STORE_AMO_ACCESS_FAULT
sparc_cpu_do_transaction_failed:
* raises an MMU fault
xtensa_cpu_do_transaction_failed
* raises LOAD_STORE_PIF_ADDR_ERROR_CAUSE"""
|