1
target-arm queue. This has the "plumb txattrs through various
1
Hi; this pullreq contains mainly a chunk of RTH's refactoring
2
bits of exec.c" patches, and a collection of bug fixes from
2
of the Arm pagetable walk code, plus a series from me fixing
3
various people.
3
configure checkpatch warnings, and some old patches to various
4
files all over the tree getting rid of dynamic stack allocation.
4
5
5
thanks
6
thanks
6
-- PMM
7
-- PMM
7
8
9
The following changes since commit 6338c30111d596d955e6bc933a82184a0b910c43:
8
10
9
11
Merge tag 'm68k-for-7.2-pull-request' of https://github.com/vivier/qemu-m68k into staging (2022-09-21 13:12:36 -0400)
10
The following changes since commit a3ac12fba028df90f7b3dbec924995c126c41022:
11
12
Merge remote-tracking branch 'remotes/ehabkost/tags/numa-next-pull-request' into staging (2018-05-31 11:12:36 +0100)
13
12
14
are available in the Git repository at:
13
are available in the Git repository at:
15
14
16
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180531
15
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220922
17
16
18
for you to fetch changes up to 49d1dca0520ea71bc21867fab6647f474fcf857b:
17
for you to fetch changes up to b3b5472db0ab7a53499441c1fe1dedec05b1e285:
19
18
20
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice (2018-05-31 14:52:53 +0100)
19
configure: Avoid use of 'local' as it is non-POSIX (2022-09-22 16:38:29 +0100)
21
20
22
----------------------------------------------------------------
21
----------------------------------------------------------------
23
target-arm queue:
22
target-arm queue:
24
* target/arm: Honour FPCR.FZ in FRECPX
23
* hw/net/can: fix Xilinx ZynqMP CAN RX FIFO logic
25
* MAINTAINERS: Add entries for newer MPS2 boards and devices
24
* Fix alignment for Neon VLD4.32
26
* hw/intc/arm_gicv3: Fix APxR<n> register dispatching
25
* Refactoring of page-table-walk code
27
* arm_gicv3_kvm: fix bug in writing zero bits back to the in-kernel
26
* hw/acpi: Add ospm_status hook implementation for acpi-ged
28
GIC state
27
* hw/net/lan9118: Signal TSFL_INT flag when TX FIFO reaches specified level
29
* tcg: Fix helper function vs host abi for float16
28
* chardev/baum: avoid variable-length arrays
30
* arm: fix qemu crash on startup with -bios option
29
* io/channel-websock: avoid variable-length arrays
31
* arm: fix malloc type mismatch
30
* hw/net/e1000e_core: Use definition to avoid dynamic stack allocation
32
* xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
31
* hw/ppc/pnv: Avoid dynamic stack allocation
33
* Correct CPACR reset value for v7 cores
32
* hw/intc/xics: Avoid dynamic stack allocation
34
* memory.h: Improve IOMMU related documentation
33
* hw/i386/multiboot: Avoid dynamic stack allocation
35
* exec: Plumb transaction attributes through various functions in
34
* hw/usb/hcd-ohci: Use definition to avoid dynamic stack allocation
36
preparation for allowing IOMMUs to see them
35
* ui/curses: Avoid dynamic stack allocation
37
* vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
36
* tests/unit/test-vmstate: Avoid dynamic stack allocation
38
* ARM: ACPI: Fix use-after-free due to memory realloc
37
* configure: fix various shellcheck-spotted issues and nits
39
* KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
40
38
41
----------------------------------------------------------------
39
----------------------------------------------------------------
42
Francisco Iglesias (1):
40
Anton Kochkov (1):
43
xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
41
hw/net/can: fix Xilinx ZynqMP CAN RX FIFO logic
44
42
45
Igor Mammedov (1):
43
Clément Chigot (1):
46
arm: fix qemu crash on startup with -bios option
44
target/arm: Fix alignment for VLD4.32
47
45
48
Jan Kiszka (1):
46
Keqian Zhu (1):
49
hw/intc/arm_gicv3: Fix APxR<n> register dispatching
47
hw/acpi: Add ospm_status hook implementation for acpi-ged
50
48
51
Paolo Bonzini (1):
49
Lucas Dietrich (1):
52
arm: fix malloc type mismatch
50
hw/net/lan9118: Signal TSFL_INT flag when TX FIFO reaches specified level
53
51
54
Peter Maydell (17):
52
Peter Maydell (7):
55
target/arm: Honour FPCR.FZ in FRECPX
53
configure: Remove unused python_version variable
56
MAINTAINERS: Add entries for newer MPS2 boards and devices
54
configure: Remove unused meson_args variable
57
Correct CPACR reset value for v7 cores
55
configure: Add missing quoting for some easy cases
58
memory.h: Improve IOMMU related documentation
56
configure: Add './' on front of glob of */config-devices.mak.d
59
Make tb_invalidate_phys_addr() take a MemTxAttrs argument
57
configure: Remove use of backtick `...` syntax
60
Make address_space_translate{, _cached}() take a MemTxAttrs argument
58
configure: Check mkdir result directly, not via $?
61
Make address_space_map() take a MemTxAttrs argument
59
configure: Avoid use of 'local' as it is non-POSIX
62
Make address_space_access_valid() take a MemTxAttrs argument
63
Make flatview_extend_translation() take a MemTxAttrs argument
64
Make memory_region_access_valid() take a MemTxAttrs argument
65
Make MemoryRegion valid.accepts callback take a MemTxAttrs argument
66
Make flatview_access_valid() take a MemTxAttrs argument
67
Make flatview_translate() take a MemTxAttrs argument
68
Make address_space_get_iotlb_entry() take a MemTxAttrs argument
69
Make flatview_do_translate() take a MemTxAttrs argument
70
Make address_space_translate_iommu take a MemTxAttrs argument
71
vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
72
60
73
Richard Henderson (1):
61
Philippe Mathieu-Daudé (11):
74
tcg: Fix helper function vs host abi for float16
62
chardev/baum: Replace magic values by X_MAX / Y_MAX definitions
63
chardev/baum: Use definitions to avoid dynamic stack allocation
64
chardev/baum: Avoid dynamic stack allocation
65
io/channel-websock: Replace strlen(const_str) by sizeof(const_str) - 1
66
hw/net/e1000e_core: Use definition to avoid dynamic stack allocation
67
hw/ppc/pnv: Avoid dynamic stack allocation
68
hw/intc/xics: Avoid dynamic stack allocation
69
hw/i386/multiboot: Avoid dynamic stack allocation
70
hw/usb/hcd-ohci: Use definition to avoid dynamic stack allocation
71
ui/curses: Avoid dynamic stack allocation
72
tests/unit/test-vmstate: Avoid dynamic stack allocation
75
73
76
Shannon Zhao (3):
74
Richard Henderson (17):
77
arm_gicv3_kvm: increase clroffset accordingly
75
target/arm: Create GetPhysAddrResult
78
ARM: ACPI: Fix use-after-free due to memory realloc
76
target/arm: Use GetPhysAddrResult in get_phys_addr_lpae
79
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
77
target/arm: Use GetPhysAddrResult in get_phys_addr_v6
78
target/arm: Use GetPhysAddrResult in get_phys_addr_v5
79
target/arm: Use GetPhysAddrResult in get_phys_addr_pmsav5
80
target/arm: Use GetPhysAddrResult in get_phys_addr_pmsav7
81
target/arm: Use GetPhysAddrResult in get_phys_addr_pmsav8
82
target/arm: Use GetPhysAddrResult in pmsav8_mpu_lookup
83
target/arm: Remove is_subpage argument to pmsav8_mpu_lookup
84
target/arm: Add is_secure parameter to v8m_security_lookup
85
target/arm: Add secure parameter to pmsav8_mpu_lookup
86
target/arm: Add is_secure parameter to get_phys_addr_v5
87
target/arm: Add is_secure parameter to get_phys_addr_v6
88
target/arm: Add secure parameter to get_phys_addr_pmsav8
89
target/arm: Add is_secure parameter to pmsav7_use_background_region
90
target/arm: Add secure parameter to get_phys_addr_pmsav7
91
target/arm: Add is_secure parameter to get_phys_addr_pmsav5
80
92
81
include/exec/exec-all.h | 5 +-
93
configure | 82 +++++-----
82
include/exec/helper-head.h | 2 +-
94
target/arm/internals.h | 26 +--
83
include/exec/memory-internal.h | 3 +-
95
chardev/baum.c | 22 ++-
84
include/exec/memory.h | 128 +++++++++++++++++++++++++++++++++++------
96
hw/acpi/generic_event_device.c | 8 +
85
include/migration/vmstate.h | 3 +
97
hw/i386/multiboot.c | 5 +-
86
include/sysemu/dma.h | 6 +-
98
hw/intc/xics.c | 2 +-
87
accel/tcg/translate-all.c | 4 +-
99
hw/net/can/xlnx-zynqmp-can.c | 32 ++--
88
exec.c | 95 ++++++++++++++++++------------
100
hw/net/e1000e_core.c | 7 +-
89
hw/arm/boot.c | 18 +++---
101
hw/net/lan9118.c | 8 +
90
hw/arm/virt-acpi-build.c | 20 +++++--
102
hw/ppc/pnv.c | 4 +-
91
hw/dma/xlnx-zdma.c | 10 +++-
103
hw/ppc/spapr.c | 8 +-
92
hw/hppa/dino.c | 3 +-
104
hw/ppc/spapr_pci_nvlink2.c | 2 +-
93
hw/intc/arm_gic_kvm.c | 1 -
105
hw/usb/hcd-ohci.c | 7 +-
94
hw/intc/arm_gicv3_cpuif.c | 12 ++--
106
io/channel-websock.c | 2 +-
95
hw/intc/arm_gicv3_kvm.c | 2 +-
107
target/arm/helper.c | 27 ++-
96
hw/nvram/fw_cfg.c | 12 ++--
108
target/arm/m_helper.c | 78 ++++-----
97
hw/s390x/s390-pci-inst.c | 3 +-
109
target/arm/ptw.c | 364 +++++++++++++++++++----------------------
98
hw/scsi/esp.c | 3 +-
110
target/arm/tlb_helper.c | 22 +--
99
hw/vfio/common.c | 3 +-
111
target/arm/translate-neon.c | 6 +-
100
hw/virtio/vhost.c | 3 +-
112
tests/unit/test-vmstate.c | 7 +-
101
hw/xen/xen_pt_msi.c | 3 +-
113
ui/curses.c | 2 +-
102
memory.c | 12 ++--
114
21 files changed, 347 insertions(+), 374 deletions(-)
103
memory_ldst.inc.c | 18 +++---
104
target/arm/gdbstub.c | 3 +-
105
target/arm/helper-a64.c | 41 +++++++------
106
target/arm/helper.c | 90 ++++++++++++++++-------------
107
target/ppc/mmu-hash64.c | 3 +-
108
target/riscv/helper.c | 2 +-
109
target/s390x/diag.c | 6 +-
110
target/s390x/excp_helper.c | 3 +-
111
target/s390x/mmu_helper.c | 3 +-
112
target/s390x/sigp.c | 3 +-
113
target/xtensa/op_helper.c | 3 +-
114
MAINTAINERS | 9 ++-
115
34 files changed, 353 insertions(+), 182 deletions(-)
116
115
diff view generated by jsdifflib
New patch
1
From: Anton Kochkov <anton.kochkov@proton.me>
1
2
3
For consistency, function "update_rx_fifo()" should use the RX FIFO
4
register field names, not the TX FIFO ones, even if they refer to the
5
same bit positions in the register.
6
7
Signed-off-by: Anton Kochkov <anton.kochkov@proton.me>
8
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
9
Message-id: 20220817141754.2105981-1-anton.kochkov@proton.me
10
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1123
11
[PMM: tweaked commit message]
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/net/can/xlnx-zynqmp-can.c | 32 ++++++++++++++++----------------
15
1 file changed, 16 insertions(+), 16 deletions(-)
16
17
diff --git a/hw/net/can/xlnx-zynqmp-can.c b/hw/net/can/xlnx-zynqmp-can.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/net/can/xlnx-zynqmp-can.c
20
+++ b/hw/net/can/xlnx-zynqmp-can.c
21
@@ -XXX,XX +XXX,XX @@ static void update_rx_fifo(XlnxZynqMPCANState *s, const qemu_can_frame *frame)
22
timestamp));
23
24
/* First 32 bit of the data. */
25
- fifo32_push(&s->rx_fifo, deposit32(0, R_TXFIFO_DATA1_DB3_SHIFT,
26
- R_TXFIFO_DATA1_DB3_LENGTH,
27
+ fifo32_push(&s->rx_fifo, deposit32(0, R_RXFIFO_DATA1_DB3_SHIFT,
28
+ R_RXFIFO_DATA1_DB3_LENGTH,
29
frame->data[0]) |
30
- deposit32(0, R_TXFIFO_DATA1_DB2_SHIFT,
31
- R_TXFIFO_DATA1_DB2_LENGTH,
32
+ deposit32(0, R_RXFIFO_DATA1_DB2_SHIFT,
33
+ R_RXFIFO_DATA1_DB2_LENGTH,
34
frame->data[1]) |
35
- deposit32(0, R_TXFIFO_DATA1_DB1_SHIFT,
36
- R_TXFIFO_DATA1_DB1_LENGTH,
37
+ deposit32(0, R_RXFIFO_DATA1_DB1_SHIFT,
38
+ R_RXFIFO_DATA1_DB1_LENGTH,
39
frame->data[2]) |
40
- deposit32(0, R_TXFIFO_DATA1_DB0_SHIFT,
41
- R_TXFIFO_DATA1_DB0_LENGTH,
42
+ deposit32(0, R_RXFIFO_DATA1_DB0_SHIFT,
43
+ R_RXFIFO_DATA1_DB0_LENGTH,
44
frame->data[3]));
45
/* Last 32 bit of the data. */
46
- fifo32_push(&s->rx_fifo, deposit32(0, R_TXFIFO_DATA2_DB7_SHIFT,
47
- R_TXFIFO_DATA2_DB7_LENGTH,
48
+ fifo32_push(&s->rx_fifo, deposit32(0, R_RXFIFO_DATA2_DB7_SHIFT,
49
+ R_RXFIFO_DATA2_DB7_LENGTH,
50
frame->data[4]) |
51
- deposit32(0, R_TXFIFO_DATA2_DB6_SHIFT,
52
- R_TXFIFO_DATA2_DB6_LENGTH,
53
+ deposit32(0, R_RXFIFO_DATA2_DB6_SHIFT,
54
+ R_RXFIFO_DATA2_DB6_LENGTH,
55
frame->data[5]) |
56
- deposit32(0, R_TXFIFO_DATA2_DB5_SHIFT,
57
- R_TXFIFO_DATA2_DB5_LENGTH,
58
+ deposit32(0, R_RXFIFO_DATA2_DB5_SHIFT,
59
+ R_RXFIFO_DATA2_DB5_LENGTH,
60
frame->data[6]) |
61
- deposit32(0, R_TXFIFO_DATA2_DB4_SHIFT,
62
- R_TXFIFO_DATA2_DB4_LENGTH,
63
+ deposit32(0, R_RXFIFO_DATA2_DB4_SHIFT,
64
+ R_RXFIFO_DATA2_DB4_LENGTH,
65
frame->data[7]));
66
67
ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOK, 1);
68
--
69
2.25.1
diff view generated by jsdifflib
New patch
1
From: Clément Chigot <chigot@adacore.com>
1
2
3
When requested, the alignment for VLD4.32 is 8 and not 16.
4
5
See ARM documentation about VLD4 encoding:
6
ebytes = 1 << UInt(size);
7
if size == '10' then
8
alignment = if a == '0' then 1 else 8;
9
else
10
alignment = if a == '0' then 1 else 4*ebytes;
11
12
Signed-off-by: Clément Chigot <chigot@adacore.com>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20220914105058.2787404-1-chigot@adacore.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
target/arm/translate-neon.c | 6 +++++-
18
1 file changed, 5 insertions(+), 1 deletion(-)
19
20
diff --git a/target/arm/translate-neon.c b/target/arm/translate-neon.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/translate-neon.c
23
+++ b/target/arm/translate-neon.c
24
@@ -XXX,XX +XXX,XX @@ static bool trans_VLD_all_lanes(DisasContext *s, arg_VLD_all_lanes *a)
25
case 3:
26
return false;
27
case 4:
28
- align = pow2_align(size + 2);
29
+ if (size == 2) {
30
+ align = pow2_align(3);
31
+ } else {
32
+ align = pow2_align(size + 2);
33
+ }
34
break;
35
default:
36
g_assert_not_reached();
37
--
38
2.25.1
39
40
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Depending on the host abi, float16, aka uint16_t, values are
3
Combine 5 output pointer arguments from get_phys_addr
4
passed and returned either zero-extended in the host register
4
into a single struct. Adjust all callers.
5
or with garbage at the top of the host register.
6
5
7
The tcg code generator has so far been assuming garbage, as that
8
matches the x86 abi, but this is incorrect for other host abis.
9
Further, target/arm has so far been assuming zero-extended results,
10
so that it may store the 16-bit value into a 32-bit slot with the
11
high 16-bits already clear.
12
13
Rectify both problems by mapping "f16" in the helper definition
14
to uint32_t instead of (a typedef for) uint16_t. This forces
15
the host compiler to assume garbage in the upper 16 bits on input
16
and to zero-extend the result on output.
17
18
Cc: qemu-stable@nongnu.org
19
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20220822152741.1617527-2-richard.henderson@linaro.org
21
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
22
Message-id: 20180522175629.24932-1-richard.henderson@linaro.org
23
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
10
---
26
include/exec/helper-head.h | 2 +-
11
target/arm/internals.h | 13 ++++-
27
target/arm/helper-a64.c | 35 +++++++++--------
12
target/arm/helper.c | 27 ++++-----
28
target/arm/helper.c | 80 +++++++++++++++++++-------------------
13
target/arm/m_helper.c | 52 ++++++-----------
29
3 files changed, 59 insertions(+), 58 deletions(-)
14
target/arm/ptw.c | 120 +++++++++++++++++++++-------------------
15
target/arm/tlb_helper.c | 22 +++-----
16
5 files changed, 109 insertions(+), 125 deletions(-)
30
17
31
diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h
18
diff --git a/target/arm/internals.h b/target/arm/internals.h
32
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
33
--- a/include/exec/helper-head.h
20
--- a/target/arm/internals.h
34
+++ b/include/exec/helper-head.h
21
+++ b/target/arm/internals.h
35
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ typedef struct ARMCacheAttrs {
36
#define dh_ctype_int int
23
bool is_s2_format:1;
37
#define dh_ctype_i64 uint64_t
24
} ARMCacheAttrs;
38
#define dh_ctype_s64 int64_t
25
39
-#define dh_ctype_f16 float16
26
+/* Fields that are valid upon success. */
40
+#define dh_ctype_f16 uint32_t
27
+typedef struct GetPhysAddrResult {
41
#define dh_ctype_f32 float32
28
+ hwaddr phys;
42
#define dh_ctype_f64 float64
29
+ target_ulong page_size;
43
#define dh_ctype_ptr void *
30
+ int prot;
44
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
31
+ MemTxAttrs attrs;
45
index XXXXXXX..XXXXXXX 100644
32
+ ARMCacheAttrs cacheattrs;
46
--- a/target/arm/helper-a64.c
33
+} GetPhysAddrResult;
47
+++ b/target/arm/helper-a64.c
34
+
48
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
35
bool get_phys_addr(CPUARMState *env, target_ulong address,
49
return flags;
36
MMUAccessType access_type, ARMMMUIdx mmu_idx,
50
}
37
- hwaddr *phys_ptr, MemTxAttrs *attrs, int *prot,
51
38
- target_ulong *page_size,
52
-uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
39
- ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
53
+uint64_t HELPER(vfp_cmph_a64)(uint32_t x, uint32_t y, void *fp_status)
40
+ GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
54
{
41
__attribute__((nonnull));
55
return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
42
56
}
43
void arm_log_exception(CPUState *cs);
57
58
-uint64_t HELPER(vfp_cmpeh_a64)(float16 x, float16 y, void *fp_status)
59
+uint64_t HELPER(vfp_cmpeh_a64)(uint32_t x, uint32_t y, void *fp_status)
60
{
61
return float_rel_to_flags(float16_compare(x, y, fp_status));
62
}
63
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, void *fpstp)
64
#define float64_three make_float64(0x4008000000000000ULL)
65
#define float64_one_point_five make_float64(0x3FF8000000000000ULL)
66
67
-float16 HELPER(recpsf_f16)(float16 a, float16 b, void *fpstp)
68
+uint32_t HELPER(recpsf_f16)(uint32_t a, uint32_t b, void *fpstp)
69
{
70
float_status *fpst = fpstp;
71
72
@@ -XXX,XX +XXX,XX @@ float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp)
73
return float64_muladd(a, b, float64_two, 0, fpst);
74
}
75
76
-float16 HELPER(rsqrtsf_f16)(float16 a, float16 b, void *fpstp)
77
+uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, void *fpstp)
78
{
79
float_status *fpst = fpstp;
80
81
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_addlp_u16)(uint64_t a)
82
}
83
84
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
85
-float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
86
+uint32_t HELPER(frecpx_f16)(uint32_t a, void *fpstp)
87
{
88
float_status *fpst = fpstp;
89
uint16_t val16, sbit;
90
@@ -XXX,XX +XXX,XX @@ void HELPER(casp_be_parallel)(CPUARMState *env, uint32_t rs, uint64_t addr,
91
#define ADVSIMD_HELPER(name, suffix) HELPER(glue(glue(advsimd_, name), suffix))
92
93
#define ADVSIMD_HALFOP(name) \
94
-float16 ADVSIMD_HELPER(name, h)(float16 a, float16 b, void *fpstp) \
95
+uint32_t ADVSIMD_HELPER(name, h)(uint32_t a, uint32_t b, void *fpstp) \
96
{ \
97
float_status *fpst = fpstp; \
98
return float16_ ## name(a, b, fpst); \
99
@@ -XXX,XX +XXX,XX @@ ADVSIMD_HALFOP(mulx)
100
ADVSIMD_TWOHALFOP(mulx)
101
102
/* fused multiply-accumulate */
103
-float16 HELPER(advsimd_muladdh)(float16 a, float16 b, float16 c, void *fpstp)
104
+uint32_t HELPER(advsimd_muladdh)(uint32_t a, uint32_t b, uint32_t c,
105
+ void *fpstp)
106
{
107
float_status *fpst = fpstp;
108
return float16_muladd(a, b, c, 0, fpst);
109
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_muladd2h)(uint32_t two_a, uint32_t two_b,
110
111
#define ADVSIMD_CMPRES(test) (test) ? 0xffff : 0
112
113
-uint32_t HELPER(advsimd_ceq_f16)(float16 a, float16 b, void *fpstp)
114
+uint32_t HELPER(advsimd_ceq_f16)(uint32_t a, uint32_t b, void *fpstp)
115
{
116
float_status *fpst = fpstp;
117
int compare = float16_compare_quiet(a, b, fpst);
118
return ADVSIMD_CMPRES(compare == float_relation_equal);
119
}
120
121
-uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
122
+uint32_t HELPER(advsimd_cge_f16)(uint32_t a, uint32_t b, void *fpstp)
123
{
124
float_status *fpst = fpstp;
125
int compare = float16_compare(a, b, fpst);
126
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
127
compare == float_relation_equal);
128
}
129
130
-uint32_t HELPER(advsimd_cgt_f16)(float16 a, float16 b, void *fpstp)
131
+uint32_t HELPER(advsimd_cgt_f16)(uint32_t a, uint32_t b, void *fpstp)
132
{
133
float_status *fpst = fpstp;
134
int compare = float16_compare(a, b, fpst);
135
return ADVSIMD_CMPRES(compare == float_relation_greater);
136
}
137
138
-uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
139
+uint32_t HELPER(advsimd_acge_f16)(uint32_t a, uint32_t b, void *fpstp)
140
{
141
float_status *fpst = fpstp;
142
float16 f0 = float16_abs(a);
143
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
144
compare == float_relation_equal);
145
}
146
147
-uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
148
+uint32_t HELPER(advsimd_acgt_f16)(uint32_t a, uint32_t b, void *fpstp)
149
{
150
float_status *fpst = fpstp;
151
float16 f0 = float16_abs(a);
152
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
153
}
154
155
/* round to integral */
156
-float16 HELPER(advsimd_rinth_exact)(float16 x, void *fp_status)
157
+uint32_t HELPER(advsimd_rinth_exact)(uint32_t x, void *fp_status)
158
{
159
return float16_round_to_int(x, fp_status);
160
}
161
162
-float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
163
+uint32_t HELPER(advsimd_rinth)(uint32_t x, void *fp_status)
164
{
165
int old_flags = get_float_exception_flags(fp_status), new_flags;
166
float16 ret;
167
@@ -XXX,XX +XXX,XX @@ float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
168
* setting the mode appropriately before calling the helper.
169
*/
170
171
-uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
172
+uint32_t HELPER(advsimd_f16tosinth)(uint32_t a, void *fpstp)
173
{
174
float_status *fpst = fpstp;
175
176
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
177
return float16_to_int16(a, fpst);
178
}
179
180
-uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
181
+uint32_t HELPER(advsimd_f16touinth)(uint32_t a, void *fpstp)
182
{
183
float_status *fpst = fpstp;
184
185
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
186
* Square Root and Reciprocal square root
187
*/
188
189
-float16 HELPER(sqrt_f16)(float16 a, void *fpstp)
190
+uint32_t HELPER(sqrt_f16)(uint32_t a, void *fpstp)
191
{
192
float_status *s = fpstp;
193
194
diff --git a/target/arm/helper.c b/target/arm/helper.c
44
diff --git a/target/arm/helper.c b/target/arm/helper.c
195
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
196
--- a/target/arm/helper.c
46
--- a/target/arm/helper.c
197
+++ b/target/arm/helper.c
47
+++ b/target/arm/helper.c
198
@@ -XXX,XX +XXX,XX @@ DO_VFP_cmp(d, float64)
48
@@ -XXX,XX +XXX,XX @@ static CPAccessResult ats_access(CPUARMState *env, const ARMCPRegInfo *ri,
199
49
static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
200
/* Integer to float and float to integer conversions */
50
MMUAccessType access_type, ARMMMUIdx mmu_idx)
201
51
{
202
-#define CONV_ITOF(name, fsz, sign) \
52
- hwaddr phys_addr;
203
- float##fsz HELPER(name)(uint32_t x, void *fpstp) \
53
- target_ulong page_size;
204
-{ \
54
- int prot;
205
- float_status *fpst = fpstp; \
55
bool ret;
206
- return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \
56
uint64_t par64;
207
+#define CONV_ITOF(name, ftype, fsz, sign) \
57
bool format64 = false;
208
+ftype HELPER(name)(uint32_t x, void *fpstp) \
58
- MemTxAttrs attrs = {};
209
+{ \
59
ARMMMUFaultInfo fi = {};
210
+ float_status *fpst = fpstp; \
60
- ARMCacheAttrs cacheattrs = {};
211
+ return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \
61
+ GetPhysAddrResult res = {};
62
63
- ret = get_phys_addr(env, value, access_type, mmu_idx, &phys_addr, &attrs,
64
- &prot, &page_size, &fi, &cacheattrs);
65
+ ret = get_phys_addr(env, value, access_type, mmu_idx, &res, &fi);
66
67
/*
68
* ATS operations only do S1 or S1+S2 translations, so we never
69
* have to deal with the ARMCacheAttrs format for S2 only.
70
*/
71
- assert(!cacheattrs.is_s2_format);
72
+ assert(!res.cacheattrs.is_s2_format);
73
74
if (ret) {
75
/*
76
@@ -XXX,XX +XXX,XX @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
77
/* Create a 64-bit PAR */
78
par64 = (1 << 11); /* LPAE bit always set */
79
if (!ret) {
80
- par64 |= phys_addr & ~0xfffULL;
81
- if (!attrs.secure) {
82
+ par64 |= res.phys & ~0xfffULL;
83
+ if (!res.attrs.secure) {
84
par64 |= (1 << 9); /* NS */
85
}
86
- par64 |= (uint64_t)cacheattrs.attrs << 56; /* ATTR */
87
- par64 |= cacheattrs.shareability << 7; /* SH */
88
+ par64 |= (uint64_t)res.cacheattrs.attrs << 56; /* ATTR */
89
+ par64 |= res.cacheattrs.shareability << 7; /* SH */
90
} else {
91
uint32_t fsr = arm_fi_to_lfsc(&fi);
92
93
@@ -XXX,XX +XXX,XX @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
94
*/
95
if (!ret) {
96
/* We do not set any attribute bits in the PAR */
97
- if (page_size == (1 << 24)
98
+ if (res.page_size == (1 << 24)
99
&& arm_feature(env, ARM_FEATURE_V7)) {
100
- par64 = (phys_addr & 0xff000000) | (1 << 1);
101
+ par64 = (res.phys & 0xff000000) | (1 << 1);
102
} else {
103
- par64 = phys_addr & 0xfffff000;
104
+ par64 = res.phys & 0xfffff000;
105
}
106
- if (!attrs.secure) {
107
+ if (!res.attrs.secure) {
108
par64 |= (1 << 9); /* NS */
109
}
110
} else {
111
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
112
index XXXXXXX..XXXXXXX 100644
113
--- a/target/arm/m_helper.c
114
+++ b/target/arm/m_helper.c
115
@@ -XXX,XX +XXX,XX @@ static bool v7m_stack_write(ARMCPU *cpu, uint32_t addr, uint32_t value,
116
{
117
CPUState *cs = CPU(cpu);
118
CPUARMState *env = &cpu->env;
119
- MemTxAttrs attrs = {};
120
MemTxResult txres;
121
- target_ulong page_size;
122
- hwaddr physaddr;
123
- int prot;
124
+ GetPhysAddrResult res = {};
125
ARMMMUFaultInfo fi = {};
126
- ARMCacheAttrs cacheattrs = {};
127
bool secure = mmu_idx & ARM_MMU_IDX_M_S;
128
int exc;
129
bool exc_secure;
130
131
- if (get_phys_addr(env, addr, MMU_DATA_STORE, mmu_idx, &physaddr,
132
- &attrs, &prot, &page_size, &fi, &cacheattrs)) {
133
+ if (get_phys_addr(env, addr, MMU_DATA_STORE, mmu_idx, &res, &fi)) {
134
/* MPU/SAU lookup failed */
135
if (fi.type == ARMFault_QEMU_SFault) {
136
if (mode == STACK_LAZYFP) {
137
@@ -XXX,XX +XXX,XX @@ static bool v7m_stack_write(ARMCPU *cpu, uint32_t addr, uint32_t value,
138
}
139
goto pend_fault;
140
}
141
- address_space_stl_le(arm_addressspace(cs, attrs), physaddr, value,
142
- attrs, &txres);
143
+ address_space_stl_le(arm_addressspace(cs, res.attrs), res.phys, value,
144
+ res.attrs, &txres);
145
if (txres != MEMTX_OK) {
146
/* BusFault trying to write the data */
147
if (mode == STACK_LAZYFP) {
148
@@ -XXX,XX +XXX,XX @@ static bool v7m_stack_read(ARMCPU *cpu, uint32_t *dest, uint32_t addr,
149
{
150
CPUState *cs = CPU(cpu);
151
CPUARMState *env = &cpu->env;
152
- MemTxAttrs attrs = {};
153
MemTxResult txres;
154
- target_ulong page_size;
155
- hwaddr physaddr;
156
- int prot;
157
+ GetPhysAddrResult res = {};
158
ARMMMUFaultInfo fi = {};
159
- ARMCacheAttrs cacheattrs = {};
160
bool secure = mmu_idx & ARM_MMU_IDX_M_S;
161
int exc;
162
bool exc_secure;
163
uint32_t value;
164
165
- if (get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &physaddr,
166
- &attrs, &prot, &page_size, &fi, &cacheattrs)) {
167
+ if (get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &res, &fi)) {
168
/* MPU/SAU lookup failed */
169
if (fi.type == ARMFault_QEMU_SFault) {
170
qemu_log_mask(CPU_LOG_INT,
171
@@ -XXX,XX +XXX,XX @@ static bool v7m_stack_read(ARMCPU *cpu, uint32_t *dest, uint32_t addr,
172
goto pend_fault;
173
}
174
175
- value = address_space_ldl(arm_addressspace(cs, attrs), physaddr,
176
- attrs, &txres);
177
+ value = address_space_ldl(arm_addressspace(cs, res.attrs), res.phys,
178
+ res.attrs, &txres);
179
if (txres != MEMTX_OK) {
180
/* BusFault trying to read the data */
181
qemu_log_mask(CPU_LOG_INT, "...BusFault with BFSR.UNSTKERR\n");
182
@@ -XXX,XX +XXX,XX @@ static bool v7m_read_half_insn(ARMCPU *cpu, ARMMMUIdx mmu_idx,
183
CPUState *cs = CPU(cpu);
184
CPUARMState *env = &cpu->env;
185
V8M_SAttributes sattrs = {};
186
- MemTxAttrs attrs = {};
187
+ GetPhysAddrResult res = {};
188
ARMMMUFaultInfo fi = {};
189
- ARMCacheAttrs cacheattrs = {};
190
MemTxResult txres;
191
- target_ulong page_size;
192
- hwaddr physaddr;
193
- int prot;
194
195
v8m_security_lookup(env, addr, MMU_INST_FETCH, mmu_idx, &sattrs);
196
if (!sattrs.nsc || sattrs.ns) {
197
@@ -XXX,XX +XXX,XX @@ static bool v7m_read_half_insn(ARMCPU *cpu, ARMMMUIdx mmu_idx,
198
"...really SecureFault with SFSR.INVEP\n");
199
return false;
200
}
201
- if (get_phys_addr(env, addr, MMU_INST_FETCH, mmu_idx, &physaddr,
202
- &attrs, &prot, &page_size, &fi, &cacheattrs)) {
203
+ if (get_phys_addr(env, addr, MMU_INST_FETCH, mmu_idx, &res, &fi)) {
204
/* the MPU lookup failed */
205
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_IACCVIOL_MASK;
206
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_MEM, env->v7m.secure);
207
qemu_log_mask(CPU_LOG_INT, "...really MemManage with CFSR.IACCVIOL\n");
208
return false;
209
}
210
- *insn = address_space_lduw_le(arm_addressspace(cs, attrs), physaddr,
211
- attrs, &txres);
212
+ *insn = address_space_lduw_le(arm_addressspace(cs, res.attrs), res.phys,
213
+ res.attrs, &txres);
214
if (txres != MEMTX_OK) {
215
env->v7m.cfsr[M_REG_NS] |= R_V7M_CFSR_IBUSERR_MASK;
216
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_BUS, false);
217
@@ -XXX,XX +XXX,XX @@ static bool v7m_read_sg_stack_word(ARMCPU *cpu, ARMMMUIdx mmu_idx,
218
*/
219
CPUState *cs = CPU(cpu);
220
CPUARMState *env = &cpu->env;
221
- MemTxAttrs attrs = {};
222
MemTxResult txres;
223
- target_ulong page_size;
224
- hwaddr physaddr;
225
- int prot;
226
+ GetPhysAddrResult res = {};
227
ARMMMUFaultInfo fi = {};
228
- ARMCacheAttrs cacheattrs = {};
229
uint32_t value;
230
231
- if (get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &physaddr,
232
- &attrs, &prot, &page_size, &fi, &cacheattrs)) {
233
+ if (get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &res, &fi)) {
234
/* MPU/SAU lookup failed */
235
if (fi.type == ARMFault_QEMU_SFault) {
236
qemu_log_mask(CPU_LOG_INT,
237
@@ -XXX,XX +XXX,XX @@ static bool v7m_read_sg_stack_word(ARMCPU *cpu, ARMMMUIdx mmu_idx,
238
}
239
return false;
240
}
241
- value = address_space_ldl(arm_addressspace(cs, attrs), physaddr,
242
- attrs, &txres);
243
+ value = address_space_ldl(arm_addressspace(cs, res.attrs), res.phys,
244
+ res.attrs, &txres);
245
if (txres != MEMTX_OK) {
246
/* BusFault trying to read the data */
247
qemu_log_mask(CPU_LOG_INT,
248
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
249
index XXXXXXX..XXXXXXX 100644
250
--- a/target/arm/ptw.c
251
+++ b/target/arm/ptw.c
252
@@ -XXX,XX +XXX,XX @@ static ARMCacheAttrs combine_cacheattrs(CPUARMState *env,
253
* @address: virtual address to get physical address for
254
* @access_type: 0 for read, 1 for write, 2 for execute
255
* @mmu_idx: MMU index indicating required translation regime
256
- * @phys_ptr: set to the physical address corresponding to the virtual address
257
- * @attrs: set to the memory transaction attributes to use
258
- * @prot: set to the permissions for the page containing phys_ptr
259
- * @page_size: set to the size of the page containing phys_ptr
260
+ * @result: set on translation success.
261
* @fi: set to fault info if the translation fails
262
- * @cacheattrs: (if non-NULL) set to the cacheability/shareability attributes
263
*/
264
bool get_phys_addr(CPUARMState *env, target_ulong address,
265
MMUAccessType access_type, ARMMMUIdx mmu_idx,
266
- hwaddr *phys_ptr, MemTxAttrs *attrs, int *prot,
267
- target_ulong *page_size,
268
- ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
269
+ GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
270
{
271
ARMMMUIdx s1_mmu_idx = stage_1_mmu_idx(mmu_idx);
272
273
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
274
*/
275
if (arm_feature(env, ARM_FEATURE_EL2)) {
276
hwaddr ipa;
277
- int s2_prot;
278
+ int s1_prot;
279
int ret;
280
bool ipa_secure;
281
- ARMCacheAttrs cacheattrs2 = {};
282
+ ARMCacheAttrs cacheattrs1;
283
ARMMMUIdx s2_mmu_idx;
284
bool is_el0;
285
286
- ret = get_phys_addr(env, address, access_type, s1_mmu_idx, &ipa,
287
- attrs, prot, page_size, fi, cacheattrs);
288
+ ret = get_phys_addr(env, address, access_type, s1_mmu_idx,
289
+ result, fi);
290
291
/* If S1 fails or S2 is disabled, return early. */
292
if (ret || regime_translation_disabled(env, ARMMMUIdx_Stage2)) {
293
- *phys_ptr = ipa;
294
return ret;
295
}
296
297
- ipa_secure = attrs->secure;
298
+ ipa = result->phys;
299
+ ipa_secure = result->attrs.secure;
300
if (arm_is_secure_below_el3(env)) {
301
if (ipa_secure) {
302
- attrs->secure = !(env->cp15.vstcr_el2 & VSTCR_SW);
303
+ result->attrs.secure = !(env->cp15.vstcr_el2 & VSTCR_SW);
304
} else {
305
- attrs->secure = !(env->cp15.vtcr_el2 & VTCR_NSW);
306
+ result->attrs.secure = !(env->cp15.vtcr_el2 & VTCR_NSW);
307
}
308
} else {
309
assert(!ipa_secure);
310
}
311
312
- s2_mmu_idx = attrs->secure ? ARMMMUIdx_Stage2_S : ARMMMUIdx_Stage2;
313
+ s2_mmu_idx = (result->attrs.secure
314
+ ? ARMMMUIdx_Stage2_S : ARMMMUIdx_Stage2);
315
is_el0 = mmu_idx == ARMMMUIdx_E10_0 || mmu_idx == ARMMMUIdx_SE10_0;
316
317
- /* S1 is done. Now do S2 translation. */
318
+ /*
319
+ * S1 is done, now do S2 translation.
320
+ * Save the stage1 results so that we may merge
321
+ * prot and cacheattrs later.
322
+ */
323
+ s1_prot = result->prot;
324
+ cacheattrs1 = result->cacheattrs;
325
+ memset(result, 0, sizeof(*result));
326
+
327
ret = get_phys_addr_lpae(env, ipa, access_type, s2_mmu_idx, is_el0,
328
- phys_ptr, attrs, &s2_prot,
329
- page_size, fi, &cacheattrs2);
330
+ &result->phys, &result->attrs,
331
+ &result->prot, &result->page_size,
332
+ fi, &result->cacheattrs);
333
fi->s2addr = ipa;
334
+
335
/* Combine the S1 and S2 perms. */
336
- *prot &= s2_prot;
337
+ result->prot &= s1_prot;
338
339
/* If S2 fails, return early. */
340
if (ret) {
341
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
342
* Outer Write-Back Read-Allocate Write-Allocate.
343
* Do not overwrite Tagged within attrs.
344
*/
345
- if (cacheattrs->attrs != 0xf0) {
346
- cacheattrs->attrs = 0xff;
347
+ if (cacheattrs1.attrs != 0xf0) {
348
+ cacheattrs1.attrs = 0xff;
349
}
350
- cacheattrs->shareability = 0;
351
+ cacheattrs1.shareability = 0;
352
}
353
- *cacheattrs = combine_cacheattrs(env, *cacheattrs, cacheattrs2);
354
+ result->cacheattrs = combine_cacheattrs(env, cacheattrs1,
355
+ result->cacheattrs);
356
357
/* Check if IPA translates to secure or non-secure PA space. */
358
if (arm_is_secure_below_el3(env)) {
359
if (ipa_secure) {
360
- attrs->secure =
361
+ result->attrs.secure =
362
!(env->cp15.vstcr_el2 & (VSTCR_SA | VSTCR_SW));
363
} else {
364
- attrs->secure =
365
+ result->attrs.secure =
366
!((env->cp15.vtcr_el2 & (VTCR_NSA | VTCR_NSW))
367
|| (env->cp15.vstcr_el2 & (VSTCR_SA | VSTCR_SW)));
368
}
369
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
370
* cannot upgrade an non-secure translation regime's attributes
371
* to secure.
372
*/
373
- attrs->secure = regime_is_secure(env, mmu_idx);
374
- attrs->user = regime_is_user(env, mmu_idx);
375
+ result->attrs.secure = regime_is_secure(env, mmu_idx);
376
+ result->attrs.user = regime_is_user(env, mmu_idx);
377
378
/*
379
* Fast Context Switch Extension. This doesn't exist at all in v8.
380
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
381
382
if (arm_feature(env, ARM_FEATURE_PMSA)) {
383
bool ret;
384
- *page_size = TARGET_PAGE_SIZE;
385
+ result->page_size = TARGET_PAGE_SIZE;
386
387
if (arm_feature(env, ARM_FEATURE_V8)) {
388
/* PMSAv8 */
389
ret = get_phys_addr_pmsav8(env, address, access_type, mmu_idx,
390
- phys_ptr, attrs, prot, page_size, fi);
391
+ &result->phys, &result->attrs,
392
+ &result->prot, &result->page_size, fi);
393
} else if (arm_feature(env, ARM_FEATURE_V7)) {
394
/* PMSAv7 */
395
ret = get_phys_addr_pmsav7(env, address, access_type, mmu_idx,
396
- phys_ptr, prot, page_size, fi);
397
+ &result->phys, &result->prot,
398
+ &result->page_size, fi);
399
} else {
400
/* Pre-v7 MPU */
401
ret = get_phys_addr_pmsav5(env, address, access_type, mmu_idx,
402
- phys_ptr, prot, fi);
403
+ &result->phys, &result->prot, fi);
404
}
405
qemu_log_mask(CPU_LOG_MMU, "PMSA MPU lookup for %s at 0x%08" PRIx32
406
" mmu_idx %u -> %s (prot %c%c%c)\n",
407
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
408
(access_type == MMU_DATA_STORE ? "writing" : "execute"),
409
(uint32_t)address, mmu_idx,
410
ret ? "Miss" : "Hit",
411
- *prot & PAGE_READ ? 'r' : '-',
412
- *prot & PAGE_WRITE ? 'w' : '-',
413
- *prot & PAGE_EXEC ? 'x' : '-');
414
+ result->prot & PAGE_READ ? 'r' : '-',
415
+ result->prot & PAGE_WRITE ? 'w' : '-',
416
+ result->prot & PAGE_EXEC ? 'x' : '-');
417
418
return ret;
419
}
420
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
421
address = extract64(address, 0, 52);
422
}
423
}
424
- *phys_ptr = address;
425
- *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
426
- *page_size = TARGET_PAGE_SIZE;
427
+ result->phys = address;
428
+ result->prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
429
+ result->page_size = TARGET_PAGE_SIZE;
430
431
/* Fill in cacheattr a-la AArch64.TranslateAddressS1Off. */
432
hcr = arm_hcr_el2_eff(env);
433
- cacheattrs->shareability = 0;
434
- cacheattrs->is_s2_format = false;
435
+ result->cacheattrs.shareability = 0;
436
+ result->cacheattrs.is_s2_format = false;
437
if (hcr & HCR_DC) {
438
if (hcr & HCR_DCT) {
439
memattr = 0xf0; /* Tagged, Normal, WB, RWA */
440
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
441
} else {
442
memattr = 0x44; /* Normal, NC, No */
443
}
444
- cacheattrs->shareability = 2; /* outer sharable */
445
+ result->cacheattrs.shareability = 2; /* outer sharable */
446
} else {
447
memattr = 0x00; /* Device, nGnRnE */
448
}
449
- cacheattrs->attrs = memattr;
450
+ result->cacheattrs.attrs = memattr;
451
return 0;
452
}
453
454
if (regime_using_lpae_format(env, mmu_idx)) {
455
return get_phys_addr_lpae(env, address, access_type, mmu_idx, false,
456
- phys_ptr, attrs, prot, page_size,
457
- fi, cacheattrs);
458
+ &result->phys, &result->attrs,
459
+ &result->prot, &result->page_size,
460
+ fi, &result->cacheattrs);
461
} else if (regime_sctlr(env, mmu_idx) & SCTLR_XP) {
462
return get_phys_addr_v6(env, address, access_type, mmu_idx,
463
- phys_ptr, attrs, prot, page_size, fi);
464
+ &result->phys, &result->attrs,
465
+ &result->prot, &result->page_size, fi);
466
} else {
467
return get_phys_addr_v5(env, address, access_type, mmu_idx,
468
- phys_ptr, prot, page_size, fi);
469
+ &result->phys, &result->prot,
470
+ &result->page_size, fi);
471
}
212
}
472
}
213
473
214
-#define CONV_FTOI(name, fsz, sign, round) \
474
@@ -XXX,XX +XXX,XX @@ hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
215
-uint32_t HELPER(name)(float##fsz x, void *fpstp) \
475
{
216
-{ \
476
ARMCPU *cpu = ARM_CPU(cs);
217
- float_status *fpst = fpstp; \
477
CPUARMState *env = &cpu->env;
218
- if (float##fsz##_is_any_nan(x)) { \
478
- hwaddr phys_addr;
219
- float_raise(float_flag_invalid, fpst); \
479
- target_ulong page_size;
220
- return 0; \
480
- int prot;
221
- } \
481
- bool ret;
222
- return float##fsz##_to_##sign##int32##round(x, fpst); \
482
+ GetPhysAddrResult res = {};
223
+#define CONV_FTOI(name, ftype, fsz, sign, round) \
483
ARMMMUFaultInfo fi = {};
224
+uint32_t HELPER(name)(ftype x, void *fpstp) \
484
ARMMMUIdx mmu_idx = arm_mmu_idx(env);
225
+{ \
485
- ARMCacheAttrs cacheattrs = {};
226
+ float_status *fpst = fpstp; \
486
+ bool ret;
227
+ if (float##fsz##_is_any_nan(x)) { \
487
228
+ float_raise(float_flag_invalid, fpst); \
488
- *attrs = (MemTxAttrs) {};
229
+ return 0; \
489
-
230
+ } \
490
- ret = get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &phys_addr,
231
+ return float##fsz##_to_##sign##int32##round(x, fpst); \
491
- attrs, &prot, &page_size, &fi, &cacheattrs);
492
+ ret = get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &res, &fi);
493
+ *attrs = res.attrs;
494
495
if (ret) {
496
return -1;
497
}
498
- return phys_addr;
499
+ return res.phys;
232
}
500
}
233
501
diff --git a/target/arm/tlb_helper.c b/target/arm/tlb_helper.c
234
-#define FLOAT_CONVS(name, p, fsz, sign) \
502
index XXXXXXX..XXXXXXX 100644
235
-CONV_ITOF(vfp_##name##to##p, fsz, sign) \
503
--- a/target/arm/tlb_helper.c
236
-CONV_FTOI(vfp_to##name##p, fsz, sign, ) \
504
+++ b/target/arm/tlb_helper.c
237
-CONV_FTOI(vfp_to##name##z##p, fsz, sign, _round_to_zero)
505
@@ -XXX,XX +XXX,XX @@ bool arm_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
238
+#define FLOAT_CONVS(name, p, ftype, fsz, sign) \
239
+ CONV_ITOF(vfp_##name##to##p, ftype, fsz, sign) \
240
+ CONV_FTOI(vfp_to##name##p, ftype, fsz, sign, ) \
241
+ CONV_FTOI(vfp_to##name##z##p, ftype, fsz, sign, _round_to_zero)
242
243
-FLOAT_CONVS(si, h, 16, )
244
-FLOAT_CONVS(si, s, 32, )
245
-FLOAT_CONVS(si, d, 64, )
246
-FLOAT_CONVS(ui, h, 16, u)
247
-FLOAT_CONVS(ui, s, 32, u)
248
-FLOAT_CONVS(ui, d, 64, u)
249
+FLOAT_CONVS(si, h, uint32_t, 16, )
250
+FLOAT_CONVS(si, s, float32, 32, )
251
+FLOAT_CONVS(si, d, float64, 64, )
252
+FLOAT_CONVS(ui, h, uint32_t, 16, u)
253
+FLOAT_CONVS(ui, s, float32, 32, u)
254
+FLOAT_CONVS(ui, d, float64, 64, u)
255
256
#undef CONV_ITOF
257
#undef CONV_FTOI
258
@@ -XXX,XX +XXX,XX @@ static float16 do_postscale_fp16(float64 f, int shift, float_status *fpst)
259
return float64_to_float16(float64_scalbn(f, -shift, fpst), true, fpst);
260
}
261
262
-float16 HELPER(vfp_sltoh)(uint32_t x, uint32_t shift, void *fpst)
263
+uint32_t HELPER(vfp_sltoh)(uint32_t x, uint32_t shift, void *fpst)
264
{
506
{
265
return do_postscale_fp16(int32_to_float64(x, fpst), shift, fpst);
507
ARMCPU *cpu = ARM_CPU(cs);
266
}
508
ARMMMUFaultInfo fi = {};
267
509
- hwaddr phys_addr;
268
-float16 HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
510
- target_ulong page_size;
269
+uint32_t HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
511
- int prot, ret;
270
{
512
- MemTxAttrs attrs = {};
271
return do_postscale_fp16(uint32_to_float64(x, fpst), shift, fpst);
513
- ARMCacheAttrs cacheattrs = {};
272
}
514
+ GetPhysAddrResult res = {};
273
515
+ int ret;
274
-float16 HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
516
275
+uint32_t HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
517
/*
276
{
518
* Walk the page table and (if the mapping exists) add the page
277
return do_postscale_fp16(int64_to_float64(x, fpst), shift, fpst);
519
@@ -XXX,XX +XXX,XX @@ bool arm_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
278
}
520
*/
279
521
ret = get_phys_addr(&cpu->env, address, access_type,
280
-float16 HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
522
core_to_arm_mmu_idx(&cpu->env, mmu_idx),
281
+uint32_t HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
523
- &phys_addr, &attrs, &prot, &page_size,
282
{
524
- &fi, &cacheattrs);
283
return do_postscale_fp16(uint64_to_float64(x, fpst), shift, fpst);
525
+ &res, &fi);
284
}
526
if (likely(!ret)) {
285
@@ -XXX,XX +XXX,XX @@ static float64 do_prescale_fp16(float16 f, int shift, float_status *fpst)
527
/*
286
}
528
* Map a single [sub]page. Regions smaller than our declared
287
}
529
* target page size are handled specially, so for those we
288
530
* pass in the exact addresses.
289
-uint32_t HELPER(vfp_toshh)(float16 x, uint32_t shift, void *fpst)
531
*/
290
+uint32_t HELPER(vfp_toshh)(uint32_t x, uint32_t shift, void *fpst)
532
- if (page_size >= TARGET_PAGE_SIZE) {
291
{
533
- phys_addr &= TARGET_PAGE_MASK;
292
return float64_to_int16(do_prescale_fp16(x, shift, fpst), fpst);
534
+ if (res.page_size >= TARGET_PAGE_SIZE) {
293
}
535
+ res.phys &= TARGET_PAGE_MASK;
294
536
address &= TARGET_PAGE_MASK;
295
-uint32_t HELPER(vfp_touhh)(float16 x, uint32_t shift, void *fpst)
537
}
296
+uint32_t HELPER(vfp_touhh)(uint32_t x, uint32_t shift, void *fpst)
538
/* Notice and record tagged memory. */
297
{
539
- if (cpu_isar_feature(aa64_mte, cpu) && cacheattrs.attrs == 0xf0) {
298
return float64_to_uint16(do_prescale_fp16(x, shift, fpst), fpst);
540
- arm_tlb_mte_tagged(&attrs) = true;
299
}
541
+ if (cpu_isar_feature(aa64_mte, cpu) && res.cacheattrs.attrs == 0xf0) {
300
542
+ arm_tlb_mte_tagged(&res.attrs) = true;
301
-uint32_t HELPER(vfp_toslh)(float16 x, uint32_t shift, void *fpst)
543
}
302
+uint32_t HELPER(vfp_toslh)(uint32_t x, uint32_t shift, void *fpst)
544
303
{
545
- tlb_set_page_with_attrs(cs, address, phys_addr, attrs,
304
return float64_to_int32(do_prescale_fp16(x, shift, fpst), fpst);
546
- prot, mmu_idx, page_size);
305
}
547
+ tlb_set_page_with_attrs(cs, address, res.phys, res.attrs,
306
548
+ res.prot, mmu_idx, res.page_size);
307
-uint32_t HELPER(vfp_toulh)(float16 x, uint32_t shift, void *fpst)
549
return true;
308
+uint32_t HELPER(vfp_toulh)(uint32_t x, uint32_t shift, void *fpst)
550
} else if (probe) {
309
{
551
return false;
310
return float64_to_uint32(do_prescale_fp16(x, shift, fpst), fpst);
311
}
312
313
-uint64_t HELPER(vfp_tosqh)(float16 x, uint32_t shift, void *fpst)
314
+uint64_t HELPER(vfp_tosqh)(uint32_t x, uint32_t shift, void *fpst)
315
{
316
return float64_to_int64(do_prescale_fp16(x, shift, fpst), fpst);
317
}
318
319
-uint64_t HELPER(vfp_touqh)(float16 x, uint32_t shift, void *fpst)
320
+uint64_t HELPER(vfp_touqh)(uint32_t x, uint32_t shift, void *fpst)
321
{
322
return float64_to_uint64(do_prescale_fp16(x, shift, fpst), fpst);
323
}
324
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(set_neon_rmode)(uint32_t rmode, CPUARMState *env)
325
}
326
327
/* Half precision conversions. */
328
-float32 HELPER(vfp_fcvt_f16_to_f32)(float16 a, void *fpstp, uint32_t ahp_mode)
329
+float32 HELPER(vfp_fcvt_f16_to_f32)(uint32_t a, void *fpstp, uint32_t ahp_mode)
330
{
331
/* Squash FZ16 to 0 for the duration of conversion. In this case,
332
* it would affect flushing input denormals.
333
@@ -XXX,XX +XXX,XX @@ float32 HELPER(vfp_fcvt_f16_to_f32)(float16 a, void *fpstp, uint32_t ahp_mode)
334
return r;
335
}
336
337
-float16 HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
338
+uint32_t HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
339
{
340
/* Squash FZ16 to 0 for the duration of conversion. In this case,
341
* it would affect flushing output denormals.
342
@@ -XXX,XX +XXX,XX @@ float16 HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
343
return r;
344
}
345
346
-float64 HELPER(vfp_fcvt_f16_to_f64)(float16 a, void *fpstp, uint32_t ahp_mode)
347
+float64 HELPER(vfp_fcvt_f16_to_f64)(uint32_t a, void *fpstp, uint32_t ahp_mode)
348
{
349
/* Squash FZ16 to 0 for the duration of conversion. In this case,
350
* it would affect flushing input denormals.
351
@@ -XXX,XX +XXX,XX @@ float64 HELPER(vfp_fcvt_f16_to_f64)(float16 a, void *fpstp, uint32_t ahp_mode)
352
return r;
353
}
354
355
-float16 HELPER(vfp_fcvt_f64_to_f16)(float64 a, void *fpstp, uint32_t ahp_mode)
356
+uint32_t HELPER(vfp_fcvt_f64_to_f16)(float64 a, void *fpstp, uint32_t ahp_mode)
357
{
358
/* Squash FZ16 to 0 for the duration of conversion. In this case,
359
* it would affect flushing output denormals.
360
@@ -XXX,XX +XXX,XX @@ static bool round_to_inf(float_status *fpst, bool sign_bit)
361
g_assert_not_reached();
362
}
363
364
-float16 HELPER(recpe_f16)(float16 input, void *fpstp)
365
+uint32_t HELPER(recpe_f16)(uint32_t input, void *fpstp)
366
{
367
float_status *fpst = fpstp;
368
float16 f16 = float16_squash_input_denormal(input, fpst);
369
@@ -XXX,XX +XXX,XX @@ static uint64_t recip_sqrt_estimate(int *exp , int exp_off, uint64_t frac)
370
return extract64(estimate, 0, 8) << 44;
371
}
372
373
-float16 HELPER(rsqrte_f16)(float16 input, void *fpstp)
374
+uint32_t HELPER(rsqrte_f16)(uint32_t input, void *fpstp)
375
{
376
float_status *s = fpstp;
377
float16 f16 = float16_squash_input_denormal(input, s);
378
--
552
--
379
2.17.1
553
2.25.1
380
381
diff view generated by jsdifflib
1
Add more detail to the documentation for memory_region_init_iommu()
1
From: Richard Henderson <richard.henderson@linaro.org>
2
and other IOMMU-related functions and data structures.
3
2
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220822152741.1617527-4-richard.henderson@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 20180521140402.23318-2-peter.maydell@linaro.org
9
---
8
---
10
include/exec/memory.h | 105 ++++++++++++++++++++++++++++++++++++++----
9
target/arm/ptw.c | 69 ++++++++++++++++++------------------------------
11
1 file changed, 95 insertions(+), 10 deletions(-)
10
1 file changed, 26 insertions(+), 43 deletions(-)
12
11
13
diff --git a/include/exec/memory.h b/include/exec/memory.h
12
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/include/exec/memory.h
14
--- a/target/arm/ptw.c
16
+++ b/include/exec/memory.h
15
+++ b/target/arm/ptw.c
17
@@ -XXX,XX +XXX,XX @@ enum IOMMUMemoryRegionAttr {
16
@@ -XXX,XX +XXX,XX @@
18
IOMMU_ATTR_SPAPR_TCE_FD
17
19
};
18
static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
20
19
MMUAccessType access_type, ARMMMUIdx mmu_idx,
21
+/**
20
- bool s1_is_el0, hwaddr *phys_ptr,
22
+ * IOMMUMemoryRegionClass:
21
- MemTxAttrs *txattrs, int *prot,
23
+ *
22
- target_ulong *page_size_ptr,
24
+ * All IOMMU implementations need to subclass TYPE_IOMMU_MEMORY_REGION
23
- ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
25
+ * and provide an implementation of at least the @translate method here
24
+ bool s1_is_el0, GetPhysAddrResult *result,
26
+ * to handle requests to the memory region. Other methods are optional.
25
+ ARMMMUFaultInfo *fi)
27
+ *
26
__attribute__((nonnull));
28
+ * The IOMMU implementation must use the IOMMU notifier infrastructure
27
29
+ * to report whenever mappings are changed, by calling
28
/* This mapping is common between ID_AA64MMFR0.PARANGE and TCR_ELx.{I}PS. */
30
+ * memory_region_notify_iommu() (or, if necessary, by calling
29
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
31
+ * memory_region_notify_one() for each registered notifier).
30
{
32
+ */
31
if (arm_mmu_idx_is_stage1_of_2(mmu_idx) &&
33
typedef struct IOMMUMemoryRegionClass {
32
!regime_translation_disabled(env, ARMMMUIdx_Stage2)) {
34
/* private */
33
- target_ulong s2size;
35
struct DeviceClass parent_class;
34
- hwaddr s2pa;
35
- int s2prot;
36
- int ret;
37
ARMMMUIdx s2_mmu_idx = *is_secure ? ARMMMUIdx_Stage2_S
38
: ARMMMUIdx_Stage2;
39
- ARMCacheAttrs cacheattrs = {};
40
- MemTxAttrs txattrs = {};
41
+ GetPhysAddrResult s2 = {};
42
+ int ret;
43
44
ret = get_phys_addr_lpae(env, addr, MMU_DATA_LOAD, s2_mmu_idx, false,
45
- &s2pa, &txattrs, &s2prot, &s2size, fi,
46
- &cacheattrs);
47
+ &s2, fi);
48
if (ret) {
49
assert(fi->type != ARMFault_None);
50
fi->s2addr = addr;
51
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
52
return ~0;
53
}
54
if ((arm_hcr_el2_eff(env) & HCR_PTW) &&
55
- ptw_attrs_are_device(env, cacheattrs)) {
56
+ ptw_attrs_are_device(env, s2.cacheattrs)) {
57
/*
58
* PTW set and S1 walk touched S2 Device memory:
59
* generate Permission fault.
60
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
61
assert(!*is_secure);
62
}
63
64
- addr = s2pa;
65
+ addr = s2.phys;
66
}
67
return addr;
68
}
69
@@ -XXX,XX +XXX,XX @@ static bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
70
* table walk), must be true if this is stage 2 of a stage 1+2
71
* walk for an EL0 access. If @mmu_idx is anything else,
72
* @s1_is_el0 is ignored.
73
- * @phys_ptr: set to the physical address corresponding to the virtual address
74
- * @attrs: set to the memory transaction attributes to use
75
- * @prot: set to the permissions for the page containing phys_ptr
76
- * @page_size_ptr: set to the size of the page containing phys_ptr
77
+ * @result: set on translation success,
78
* @fi: set to fault info if the translation fails
79
- * @cacheattrs: (if non-NULL) set to the cacheability/shareability attributes
80
*/
81
static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
82
MMUAccessType access_type, ARMMMUIdx mmu_idx,
83
- bool s1_is_el0, hwaddr *phys_ptr,
84
- MemTxAttrs *txattrs, int *prot,
85
- target_ulong *page_size_ptr,
86
- ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
87
+ bool s1_is_el0, GetPhysAddrResult *result,
88
+ ARMMMUFaultInfo *fi)
89
{
90
ARMCPU *cpu = env_archcpu(env);
91
/* Read an LPAE long-descriptor translation table. */
92
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
93
if (mmu_idx == ARMMMUIdx_Stage2 || mmu_idx == ARMMMUIdx_Stage2_S) {
94
ns = mmu_idx == ARMMMUIdx_Stage2;
95
xn = extract32(attrs, 11, 2);
96
- *prot = get_S2prot(env, ap, xn, s1_is_el0);
97
+ result->prot = get_S2prot(env, ap, xn, s1_is_el0);
98
} else {
99
ns = extract32(attrs, 3, 1);
100
xn = extract32(attrs, 12, 1);
101
pxn = extract32(attrs, 11, 1);
102
- *prot = get_S1prot(env, mmu_idx, aarch64, ap, ns, xn, pxn);
103
+ result->prot = get_S1prot(env, mmu_idx, aarch64, ap, ns, xn, pxn);
104
}
105
106
fault_type = ARMFault_Permission;
107
- if (!(*prot & (1 << access_type))) {
108
+ if (!(result->prot & (1 << access_type))) {
109
goto do_fault;
110
}
111
112
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
113
* the CPU doesn't support TZ or this is a non-secure translation
114
* regime, because the attribute will already be non-secure.
115
*/
116
- txattrs->secure = false;
117
+ result->attrs.secure = false;
118
}
119
/* When in aarch64 mode, and BTI is enabled, remember GP in the IOTLB. */
120
if (aarch64 && guarded && cpu_isar_feature(aa64_bti, cpu)) {
121
- arm_tlb_bti_gp(txattrs) = true;
122
+ arm_tlb_bti_gp(&result->attrs) = true;
123
}
124
125
if (mmu_idx == ARMMMUIdx_Stage2 || mmu_idx == ARMMMUIdx_Stage2_S) {
126
- cacheattrs->is_s2_format = true;
127
- cacheattrs->attrs = extract32(attrs, 0, 4);
128
+ result->cacheattrs.is_s2_format = true;
129
+ result->cacheattrs.attrs = extract32(attrs, 0, 4);
130
} else {
131
/* Index into MAIR registers for cache attributes */
132
uint8_t attrindx = extract32(attrs, 0, 3);
133
uint64_t mair = env->cp15.mair_el[regime_el(env, mmu_idx)];
134
assert(attrindx <= 7);
135
- cacheattrs->is_s2_format = false;
136
- cacheattrs->attrs = extract64(mair, attrindx * 8, 8);
137
+ result->cacheattrs.is_s2_format = false;
138
+ result->cacheattrs.attrs = extract64(mair, attrindx * 8, 8);
139
}
36
140
37
/*
141
/*
38
- * Return a TLB entry that contains a given address. Flag should
142
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
39
- * be the access permission of this translation operation. We can
143
* that case comes from TCR_ELx, which we extracted earlier.
40
- * set flag to IOMMU_NONE to mean that we don't need any
41
- * read/write permission checks, like, when for region replay.
42
+ * Return a TLB entry that contains a given address.
43
+ *
44
+ * The IOMMUAccessFlags indicated via @flag are optional and may
45
+ * be specified as IOMMU_NONE to indicate that the caller needs
46
+ * the full translation information for both reads and writes. If
47
+ * the access flags are specified then the IOMMU implementation
48
+ * may use this as an optimization, to stop doing a page table
49
+ * walk as soon as it knows that the requested permissions are not
50
+ * allowed. If IOMMU_NONE is passed then the IOMMU must do the
51
+ * full page table walk and report the permissions in the returned
52
+ * IOMMUTLBEntry. (Note that this implies that an IOMMU may not
53
+ * return different mappings for reads and writes.)
54
+ *
55
+ * The returned information remains valid while the caller is
56
+ * holding the big QEMU lock or is inside an RCU critical section;
57
+ * if the caller wishes to cache the mapping beyond that it must
58
+ * register an IOMMU notifier so it can invalidate its cached
59
+ * information when the IOMMU mapping changes.
60
+ *
61
+ * @iommu: the IOMMUMemoryRegion
62
+ * @hwaddr: address to be translated within the memory region
63
+ * @flag: requested access permissions
64
*/
144
*/
65
IOMMUTLBEntry (*translate)(IOMMUMemoryRegion *iommu, hwaddr addr,
145
if (param.ds) {
66
IOMMUAccessFlags flag);
146
- cacheattrs->shareability = param.sh;
67
- /* Returns minimum supported page size */
147
+ result->cacheattrs.shareability = param.sh;
68
+ /* Returns minimum supported page size in bytes.
148
} else {
69
+ * If this method is not provided then the minimum is assumed to
149
- cacheattrs->shareability = extract32(attrs, 6, 2);
70
+ * be TARGET_PAGE_SIZE.
150
+ result->cacheattrs.shareability = extract32(attrs, 6, 2);
71
+ *
151
}
72
+ * @iommu: the IOMMUMemoryRegion
152
73
+ */
153
- *phys_ptr = descaddr;
74
uint64_t (*get_min_page_size)(IOMMUMemoryRegion *iommu);
154
- *page_size_ptr = page_size;
75
- /* Called when IOMMU Notifier flag changed */
155
+ result->phys = descaddr;
76
+ /* Called when IOMMU Notifier flag changes (ie when the set of
156
+ result->page_size = page_size;
77
+ * events which IOMMU users are requesting notification for changes).
157
return false;
78
+ * Optional method -- need not be provided if the IOMMU does not
158
79
+ * need to know exactly which events must be notified.
159
do_fault:
80
+ *
160
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
81
+ * @iommu: the IOMMUMemoryRegion
161
cacheattrs1 = result->cacheattrs;
82
+ * @old_flags: events which previously needed to be notified
162
memset(result, 0, sizeof(*result));
83
+ * @new_flags: events which now need to be notified
163
84
+ */
164
- ret = get_phys_addr_lpae(env, ipa, access_type, s2_mmu_idx, is_el0,
85
void (*notify_flag_changed)(IOMMUMemoryRegion *iommu,
165
- &result->phys, &result->attrs,
86
IOMMUNotifierFlag old_flags,
166
- &result->prot, &result->page_size,
87
IOMMUNotifierFlag new_flags);
167
- fi, &result->cacheattrs);
88
- /* Set this up to provide customized IOMMU replay function */
168
+ ret = get_phys_addr_lpae(env, ipa, access_type, s2_mmu_idx,
89
+ /* Called to handle memory_region_iommu_replay().
169
+ is_el0, result, fi);
90
+ *
170
fi->s2addr = ipa;
91
+ * The default implementation of memory_region_iommu_replay() is to
171
92
+ * call the IOMMU translate method for every page in the address space
172
/* Combine the S1 and S2 perms. */
93
+ * with flag == IOMMU_NONE and then call the notifier if translate
173
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
94
+ * returns a valid mapping. If this method is implemented then it
174
95
+ * overrides the default behaviour, and must provide the full semantics
175
if (regime_using_lpae_format(env, mmu_idx)) {
96
+ * of memory_region_iommu_replay(), by calling @notifier for every
176
return get_phys_addr_lpae(env, address, access_type, mmu_idx, false,
97
+ * translation present in the IOMMU.
177
- &result->phys, &result->attrs,
98
+ *
178
- &result->prot, &result->page_size,
99
+ * Optional method -- an IOMMU only needs to provide this method
179
- fi, &result->cacheattrs);
100
+ * if the default is inefficient or produces undesirable side effects.
180
+ result, fi);
101
+ *
181
} else if (regime_sctlr(env, mmu_idx) & SCTLR_XP) {
102
+ * Note: this is not related to record-and-replay functionality.
182
return get_phys_addr_v6(env, address, access_type, mmu_idx,
103
+ */
183
&result->phys, &result->attrs,
104
void (*replay)(IOMMUMemoryRegion *iommu, IOMMUNotifier *notifier);
105
106
- /* Get IOMMU misc attributes */
107
- int (*get_attr)(IOMMUMemoryRegion *iommu, enum IOMMUMemoryRegionAttr,
108
+ /* Get IOMMU misc attributes. This is an optional method that
109
+ * can be used to allow users of the IOMMU to get implementation-specific
110
+ * information. The IOMMU implements this method to handle calls
111
+ * by IOMMU users to memory_region_iommu_get_attr() by filling in
112
+ * the arbitrary data pointer for any IOMMUMemoryRegionAttr values that
113
+ * the IOMMU supports. If the method is unimplemented then
114
+ * memory_region_iommu_get_attr() will always return -EINVAL.
115
+ *
116
+ * @iommu: the IOMMUMemoryRegion
117
+ * @attr: attribute being queried
118
+ * @data: memory to fill in with the attribute data
119
+ *
120
+ * Returns 0 on success, or a negative errno; in particular
121
+ * returns -EINVAL for unrecognized or unimplemented attribute types.
122
+ */
123
+ int (*get_attr)(IOMMUMemoryRegion *iommu, enum IOMMUMemoryRegionAttr attr,
124
void *data);
125
} IOMMUMemoryRegionClass;
126
127
@@ -XXX,XX +XXX,XX @@ static inline void memory_region_init_reservation(MemoryRegion *mr,
128
* An IOMMU region translates addresses and forwards accesses to a target
129
* memory region.
130
*
131
+ * The IOMMU implementation must define a subclass of TYPE_IOMMU_MEMORY_REGION.
132
+ * @_iommu_mr should be a pointer to enough memory for an instance of
133
+ * that subclass, @instance_size is the size of that subclass, and
134
+ * @mrtypename is its name. This function will initialize @_iommu_mr as an
135
+ * instance of the subclass, and its methods will then be called to handle
136
+ * accesses to the memory region. See the documentation of
137
+ * #IOMMUMemoryRegionClass for further details.
138
+ *
139
* @_iommu_mr: the #IOMMUMemoryRegion to be initialized
140
* @instance_size: the IOMMUMemoryRegion subclass instance size
141
* @mrtypename: the type name of the #IOMMUMemoryRegion
142
@@ -XXX,XX +XXX,XX @@ void memory_region_register_iommu_notifier(MemoryRegion *mr,
143
* a notifier with the minimum page granularity returned by
144
* mr->iommu_ops->get_page_size().
145
*
146
+ * Note: this is not related to record-and-replay functionality.
147
+ *
148
* @iommu_mr: the memory region to observe
149
* @n: the notifier to which to replay iommu mappings
150
*/
151
@@ -XXX,XX +XXX,XX @@ void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n);
152
* memory_region_iommu_replay_all: replay existing IOMMU translations
153
* to all the notifiers registered.
154
*
155
+ * Note: this is not related to record-and-replay functionality.
156
+ *
157
* @iommu_mr: the memory region to observe
158
*/
159
void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr);
160
@@ -XXX,XX +XXX,XX @@ void memory_region_unregister_iommu_notifier(MemoryRegion *mr,
161
* memory_region_iommu_get_attr: return an IOMMU attr if get_attr() is
162
* defined on the IOMMU.
163
*
164
- * Returns 0 if succeded, error code otherwise.
165
+ * Returns 0 on success, or a negative errno otherwise. In particular,
166
+ * -EINVAL indicates that the IOMMU does not support the requested
167
+ * attribute.
168
*
169
* @iommu_mr: the memory region
170
* @attr: the requested attribute
171
--
184
--
172
2.17.1
185
2.25.1
173
186
174
187
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220822152741.1617527-5-richard.henderson@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
target/arm/ptw.c | 30 ++++++++++++++----------------
10
1 file changed, 14 insertions(+), 16 deletions(-)
11
12
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/ptw.c
15
+++ b/target/arm/ptw.c
16
@@ -XXX,XX +XXX,XX @@ do_fault:
17
18
static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
19
MMUAccessType access_type, ARMMMUIdx mmu_idx,
20
- hwaddr *phys_ptr, MemTxAttrs *attrs, int *prot,
21
- target_ulong *page_size, ARMMMUFaultInfo *fi)
22
+ GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
23
{
24
ARMCPU *cpu = env_archcpu(env);
25
int level = 1;
26
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
27
phys_addr = (desc & 0xff000000) | (address & 0x00ffffff);
28
phys_addr |= (uint64_t)extract32(desc, 20, 4) << 32;
29
phys_addr |= (uint64_t)extract32(desc, 5, 4) << 36;
30
- *page_size = 0x1000000;
31
+ result->page_size = 0x1000000;
32
} else {
33
/* Section. */
34
phys_addr = (desc & 0xfff00000) | (address & 0x000fffff);
35
- *page_size = 0x100000;
36
+ result->page_size = 0x100000;
37
}
38
ap = ((desc >> 10) & 3) | ((desc >> 13) & 4);
39
xn = desc & (1 << 4);
40
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
41
case 1: /* 64k page. */
42
phys_addr = (desc & 0xffff0000) | (address & 0xffff);
43
xn = desc & (1 << 15);
44
- *page_size = 0x10000;
45
+ result->page_size = 0x10000;
46
break;
47
case 2: case 3: /* 4k page. */
48
phys_addr = (desc & 0xfffff000) | (address & 0xfff);
49
xn = desc & 1;
50
- *page_size = 0x1000;
51
+ result->page_size = 0x1000;
52
break;
53
default:
54
/* Never happens, but compiler isn't smart enough to tell. */
55
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
56
}
57
}
58
if (domain_prot == 3) {
59
- *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
60
+ result->prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
61
} else {
62
if (pxn && !regime_is_user(env, mmu_idx)) {
63
xn = 1;
64
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
65
fi->type = ARMFault_AccessFlag;
66
goto do_fault;
67
}
68
- *prot = simple_ap_to_rw_prot(env, mmu_idx, ap >> 1);
69
+ result->prot = simple_ap_to_rw_prot(env, mmu_idx, ap >> 1);
70
} else {
71
- *prot = ap_to_rw_prot(env, mmu_idx, ap, domain_prot);
72
+ result->prot = ap_to_rw_prot(env, mmu_idx, ap, domain_prot);
73
}
74
- if (*prot && !xn) {
75
- *prot |= PAGE_EXEC;
76
+ if (result->prot && !xn) {
77
+ result->prot |= PAGE_EXEC;
78
}
79
- if (!(*prot & (1 << access_type))) {
80
+ if (!(result->prot & (1 << access_type))) {
81
/* Access permission fault. */
82
fi->type = ARMFault_Permission;
83
goto do_fault;
84
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
85
* the CPU doesn't support TZ or this is a non-secure translation
86
* regime, because the attribute will already be non-secure.
87
*/
88
- attrs->secure = false;
89
+ result->attrs.secure = false;
90
}
91
- *phys_ptr = phys_addr;
92
+ result->phys = phys_addr;
93
return false;
94
do_fault:
95
fi->domain = domain;
96
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
97
result, fi);
98
} else if (regime_sctlr(env, mmu_idx) & SCTLR_XP) {
99
return get_phys_addr_v6(env, address, access_type, mmu_idx,
100
- &result->phys, &result->attrs,
101
- &result->prot, &result->page_size, fi);
102
+ result, fi);
103
} else {
104
return get_phys_addr_v5(env, address, access_type, mmu_idx,
105
&result->phys, &result->prot,
106
--
107
2.25.1
108
109
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to address_space_translate_iommu().
3
2
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220822152741.1617527-6-richard.henderson@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-14-peter.maydell@linaro.org
8
---
8
---
9
exec.c | 8 +++++---
9
target/arm/ptw.c | 25 +++++++++++--------------
10
1 file changed, 5 insertions(+), 3 deletions(-)
10
1 file changed, 11 insertions(+), 14 deletions(-)
11
11
12
diff --git a/exec.c b/exec.c
12
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
13
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
14
--- a/target/arm/ptw.c
15
+++ b/exec.c
15
+++ b/target/arm/ptw.c
16
@@ -XXX,XX +XXX,XX @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
16
@@ -XXX,XX +XXX,XX @@ static int simple_ap_to_rw_prot(CPUARMState *env, ARMMMUIdx mmu_idx, int ap)
17
* @is_write: whether the translation operation is for write
17
18
* @is_mmio: whether this can be MMIO, set true if it can
18
static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
19
* @target_as: the address space targeted by the IOMMU
19
MMUAccessType access_type, ARMMMUIdx mmu_idx,
20
+ * @attrs: transaction attributes
20
- hwaddr *phys_ptr, int *prot,
21
*
21
- target_ulong *page_size,
22
* This function is called from RCU critical section. It is the common
22
- ARMMMUFaultInfo *fi)
23
* part of flatview_do_translate and address_space_translate_cached.
23
+ GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection address_space_translate_iommu(IOMMUMemoryRegion *iomm
25
hwaddr *page_mask_out,
26
bool is_write,
27
bool is_mmio,
28
- AddressSpace **target_as)
29
+ AddressSpace **target_as,
30
+ MemTxAttrs attrs)
31
{
24
{
32
MemoryRegionSection *section;
25
int level = 1;
33
hwaddr page_mask = (hwaddr)-1;
26
uint32_t table;
34
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
27
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
35
return address_space_translate_iommu(iommu_mr, xlat,
28
/* 1Mb section. */
36
plen_out, page_mask_out,
29
phys_addr = (desc & 0xfff00000) | (address & 0x000fffff);
37
is_write, is_mmio,
30
ap = (desc >> 10) & 3;
38
- target_as);
31
- *page_size = 1024 * 1024;
39
+ target_as, attrs);
32
+ result->page_size = 1024 * 1024;
33
} else {
34
/* Lookup l2 entry. */
35
if (type == 1) {
36
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
37
case 1: /* 64k page. */
38
phys_addr = (desc & 0xffff0000) | (address & 0xffff);
39
ap = (desc >> (4 + ((address >> 13) & 6))) & 3;
40
- *page_size = 0x10000;
41
+ result->page_size = 0x10000;
42
break;
43
case 2: /* 4k page. */
44
phys_addr = (desc & 0xfffff000) | (address & 0xfff);
45
ap = (desc >> (4 + ((address >> 9) & 6))) & 3;
46
- *page_size = 0x1000;
47
+ result->page_size = 0x1000;
48
break;
49
case 3: /* 1k page, or ARMv6/XScale "extended small (4k) page" */
50
if (type == 1) {
51
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
52
if (arm_feature(env, ARM_FEATURE_XSCALE)
53
|| arm_feature(env, ARM_FEATURE_V6)) {
54
phys_addr = (desc & 0xfffff000) | (address & 0xfff);
55
- *page_size = 0x1000;
56
+ result->page_size = 0x1000;
57
} else {
58
/*
59
* UNPREDICTABLE in ARMv5; we choose to take a
60
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
61
}
62
} else {
63
phys_addr = (desc & 0xfffffc00) | (address & 0x3ff);
64
- *page_size = 0x400;
65
+ result->page_size = 0x400;
66
}
67
ap = (desc >> 4) & 3;
68
break;
69
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
70
g_assert_not_reached();
71
}
40
}
72
}
41
if (page_mask_out) {
73
- *prot = ap_to_rw_prot(env, mmu_idx, ap, domain_prot);
42
/* Not behind an IOMMU, use default page size. */
74
- *prot |= *prot ? PAGE_EXEC : 0;
43
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate_cached(
75
- if (!(*prot & (1 << access_type))) {
44
76
+ result->prot = ap_to_rw_prot(env, mmu_idx, ap, domain_prot);
45
section = address_space_translate_iommu(iommu_mr, xlat, plen,
77
+ result->prot |= result->prot ? PAGE_EXEC : 0;
46
NULL, is_write, true,
78
+ if (!(result->prot & (1 << access_type))) {
47
- &target_as);
79
/* Access permission fault. */
48
+ &target_as, attrs);
80
fi->type = ARMFault_Permission;
49
return section.mr;
81
goto do_fault;
82
}
83
- *phys_ptr = phys_addr;
84
+ result->phys = phys_addr;
85
return false;
86
do_fault:
87
fi->domain = domain;
88
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
89
result, fi);
90
} else {
91
return get_phys_addr_v5(env, address, access_type, mmu_idx,
92
- &result->phys, &result->prot,
93
- &result->page_size, fi);
94
+ result, fi);
95
}
50
}
96
}
51
97
52
--
98
--
53
2.17.1
99
2.25.1
54
100
55
101
diff view generated by jsdifflib
1
From: Francisco Iglesias <frasse.iglesias@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Coverity found that the string return by 'object_get_canonical_path' was not
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
being freed at two locations in the model (CID 1391294 and CID 1391293) and
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
also that a memset was being called with a value greater than the max of a byte
5
Message-id: 20220822152741.1617527-7-richard.henderson@linaro.org
6
on the second argument (CID 1391286). This patch corrects this by adding the
7
freeing of the strings and also changing to memset to zero instead on
8
descriptor unaligned errors.
9
10
Signed-off-by: Francisco Iglesias <frasse.iglesias@gmail.com>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180528184859.3530-1-frasse.iglesias@gmail.com
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
8
---
17
hw/dma/xlnx-zdma.c | 10 +++++++---
9
target/arm/ptw.c | 24 ++++++++++++------------
18
1 file changed, 7 insertions(+), 3 deletions(-)
10
1 file changed, 12 insertions(+), 12 deletions(-)
19
11
20
diff --git a/hw/dma/xlnx-zdma.c b/hw/dma/xlnx-zdma.c
12
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
21
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/dma/xlnx-zdma.c
14
--- a/target/arm/ptw.c
23
+++ b/hw/dma/xlnx-zdma.c
15
+++ b/target/arm/ptw.c
24
@@ -XXX,XX +XXX,XX @@ static bool zdma_load_descriptor(XlnxZDMA *s, uint64_t addr, void *buf)
16
@@ -XXX,XX +XXX,XX @@ do_fault:
25
qemu_log_mask(LOG_GUEST_ERROR,
17
26
"zdma: unaligned descriptor at %" PRIx64,
18
static bool get_phys_addr_pmsav5(CPUARMState *env, uint32_t address,
27
addr);
19
MMUAccessType access_type, ARMMMUIdx mmu_idx,
28
- memset(buf, 0xdeadbeef, sizeof(XlnxZDMADescr));
20
- hwaddr *phys_ptr, int *prot,
29
+ memset(buf, 0x0, sizeof(XlnxZDMADescr));
21
+ GetPhysAddrResult *result,
30
s->error = true;
22
ARMMMUFaultInfo *fi)
23
{
24
int n;
25
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav5(CPUARMState *env, uint32_t address,
26
27
if (regime_translation_disabled(env, mmu_idx)) {
28
/* MPU disabled. */
29
- *phys_ptr = address;
30
- *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
31
+ result->phys = address;
32
+ result->prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
31
return false;
33
return false;
32
}
34
}
33
@@ -XXX,XX +XXX,XX @@ static uint64_t zdma_read(void *opaque, hwaddr addr, unsigned size)
35
34
RegisterInfo *r = &s->regs_info[addr / 4];
36
- *phys_ptr = address;
35
37
+ result->phys = address;
36
if (!r->data) {
38
for (n = 7; n >= 0; n--) {
37
+ gchar *path = object_get_canonical_path(OBJECT(s));
39
base = env->cp15.c6_region[n];
38
qemu_log("%s: Decode error: read from %" HWADDR_PRIx "\n",
40
if ((base & 1) == 0) {
39
- object_get_canonical_path(OBJECT(s)),
41
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav5(CPUARMState *env, uint32_t address,
40
+ path,
42
fi->level = 1;
41
addr);
43
return true;
42
+ g_free(path);
44
}
43
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
45
- *prot = PAGE_READ | PAGE_WRITE;
44
zdma_ch_imr_update_irq(s);
46
+ result->prot = PAGE_READ | PAGE_WRITE;
45
return 0;
47
break;
46
@@ -XXX,XX +XXX,XX @@ static void zdma_write(void *opaque, hwaddr addr, uint64_t value,
48
case 2:
47
RegisterInfo *r = &s->regs_info[addr / 4];
49
- *prot = PAGE_READ;
48
50
+ result->prot = PAGE_READ;
49
if (!r->data) {
51
if (!is_user) {
50
+ gchar *path = object_get_canonical_path(OBJECT(s));
52
- *prot |= PAGE_WRITE;
51
qemu_log("%s: Decode error: write to %" HWADDR_PRIx "=%" PRIx64 "\n",
53
+ result->prot |= PAGE_WRITE;
52
- object_get_canonical_path(OBJECT(s)),
54
}
53
+ path,
55
break;
54
addr, value);
56
case 3:
55
+ g_free(path);
57
- *prot = PAGE_READ | PAGE_WRITE;
56
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
58
+ result->prot = PAGE_READ | PAGE_WRITE;
57
zdma_ch_imr_update_irq(s);
59
break;
58
return;
60
case 5:
61
if (is_user) {
62
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav5(CPUARMState *env, uint32_t address,
63
fi->level = 1;
64
return true;
65
}
66
- *prot = PAGE_READ;
67
+ result->prot = PAGE_READ;
68
break;
69
case 6:
70
- *prot = PAGE_READ;
71
+ result->prot = PAGE_READ;
72
break;
73
default:
74
/* Bad permission. */
75
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav5(CPUARMState *env, uint32_t address,
76
fi->level = 1;
77
return true;
78
}
79
- *prot |= PAGE_EXEC;
80
+ result->prot |= PAGE_EXEC;
81
return false;
82
}
83
84
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
85
} else {
86
/* Pre-v7 MPU */
87
ret = get_phys_addr_pmsav5(env, address, access_type, mmu_idx,
88
- &result->phys, &result->prot, fi);
89
+ result, fi);
90
}
91
qemu_log_mask(CPU_LOG_MMU, "PMSA MPU lookup for %s at 0x%08" PRIx32
92
" mmu_idx %u -> %s (prot %c%c%c)\n",
59
--
93
--
60
2.17.1
94
2.25.1
61
95
62
96
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to address_space_access_valid().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220822152741.1617527-8-richard.henderson@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-6-peter.maydell@linaro.org
10
---
8
---
11
include/exec/memory.h | 4 +++-
9
target/arm/ptw.c | 36 +++++++++++++++++-------------------
12
include/sysemu/dma.h | 3 ++-
10
1 file changed, 17 insertions(+), 19 deletions(-)
13
exec.c | 3 ++-
14
target/s390x/diag.c | 6 ++++--
15
target/s390x/excp_helper.c | 3 ++-
16
target/s390x/mmu_helper.c | 3 ++-
17
target/s390x/sigp.c | 3 ++-
18
7 files changed, 17 insertions(+), 8 deletions(-)
19
11
20
diff --git a/include/exec/memory.h b/include/exec/memory.h
12
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
21
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
22
--- a/include/exec/memory.h
14
--- a/target/arm/ptw.c
23
+++ b/include/exec/memory.h
15
+++ b/target/arm/ptw.c
24
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
16
@@ -XXX,XX +XXX,XX @@ static bool pmsav7_use_background_region(ARMCPU *cpu, ARMMMUIdx mmu_idx,
25
* @addr: address within that address space
17
26
* @len: length of the area to be checked
18
static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
27
* @is_write: indicates the transfer direction
19
MMUAccessType access_type, ARMMMUIdx mmu_idx,
28
+ * @attrs: memory attributes
20
- hwaddr *phys_ptr, int *prot,
29
*/
21
- target_ulong *page_size,
30
-bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write);
22
+ GetPhysAddrResult *result,
31
+bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len,
23
ARMMMUFaultInfo *fi)
32
+ bool is_write, MemTxAttrs attrs);
33
34
/* address_space_map: map a physical memory region into a host virtual address
35
*
36
diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
37
index XXXXXXX..XXXXXXX 100644
38
--- a/include/sysemu/dma.h
39
+++ b/include/sysemu/dma.h
40
@@ -XXX,XX +XXX,XX @@ static inline bool dma_memory_valid(AddressSpace *as,
41
DMADirection dir)
42
{
24
{
43
return address_space_access_valid(as, addr, len,
25
ARMCPU *cpu = env_archcpu(env);
44
- dir == DMA_DIRECTION_FROM_DEVICE);
26
int n;
45
+ dir == DMA_DIRECTION_FROM_DEVICE,
27
bool is_user = regime_is_user(env, mmu_idx);
46
+ MEMTXATTRS_UNSPECIFIED);
28
29
- *phys_ptr = address;
30
- *page_size = TARGET_PAGE_SIZE;
31
- *prot = 0;
32
+ result->phys = address;
33
+ result->page_size = TARGET_PAGE_SIZE;
34
+ result->prot = 0;
35
36
if (regime_translation_disabled(env, mmu_idx) ||
37
m_is_ppb_region(env, address)) {
38
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
39
* which always does a direct read using address_space_ldl(), rather
40
* than going via this function, so we don't need to check that here.
41
*/
42
- get_phys_addr_pmsav7_default(env, mmu_idx, address, prot);
43
+ get_phys_addr_pmsav7_default(env, mmu_idx, address, &result->prot);
44
} else { /* MPU enabled */
45
for (n = (int)cpu->pmsav7_dregion - 1; n >= 0; n--) {
46
/* region search */
47
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
48
if (ranges_overlap(base, rmask,
49
address & TARGET_PAGE_MASK,
50
TARGET_PAGE_SIZE)) {
51
- *page_size = 1;
52
+ result->page_size = 1;
53
}
54
continue;
55
}
56
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
57
continue;
58
}
59
if (rsize < TARGET_PAGE_BITS) {
60
- *page_size = 1 << rsize;
61
+ result->page_size = 1 << rsize;
62
}
63
break;
64
}
65
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
66
fi->type = ARMFault_Background;
67
return true;
68
}
69
- get_phys_addr_pmsav7_default(env, mmu_idx, address, prot);
70
+ get_phys_addr_pmsav7_default(env, mmu_idx, address, &result->prot);
71
} else { /* a MPU hit! */
72
uint32_t ap = extract32(env->pmsav7.dracr[n], 8, 3);
73
uint32_t xn = extract32(env->pmsav7.dracr[n], 12, 1);
74
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
75
case 5:
76
break; /* no access */
77
case 3:
78
- *prot |= PAGE_WRITE;
79
+ result->prot |= PAGE_WRITE;
80
/* fall through */
81
case 2:
82
case 6:
83
- *prot |= PAGE_READ | PAGE_EXEC;
84
+ result->prot |= PAGE_READ | PAGE_EXEC;
85
break;
86
case 7:
87
/* for v7M, same as 6; for R profile a reserved value */
88
if (arm_feature(env, ARM_FEATURE_M)) {
89
- *prot |= PAGE_READ | PAGE_EXEC;
90
+ result->prot |= PAGE_READ | PAGE_EXEC;
91
break;
92
}
93
/* fall through */
94
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
95
case 1:
96
case 2:
97
case 3:
98
- *prot |= PAGE_WRITE;
99
+ result->prot |= PAGE_WRITE;
100
/* fall through */
101
case 5:
102
case 6:
103
- *prot |= PAGE_READ | PAGE_EXEC;
104
+ result->prot |= PAGE_READ | PAGE_EXEC;
105
break;
106
case 7:
107
/* for v7M, same as 6; for R profile a reserved value */
108
if (arm_feature(env, ARM_FEATURE_M)) {
109
- *prot |= PAGE_READ | PAGE_EXEC;
110
+ result->prot |= PAGE_READ | PAGE_EXEC;
111
break;
112
}
113
/* fall through */
114
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
115
116
/* execute never */
117
if (xn) {
118
- *prot &= ~PAGE_EXEC;
119
+ result->prot &= ~PAGE_EXEC;
120
}
121
}
122
}
123
124
fi->type = ARMFault_Permission;
125
fi->level = 1;
126
- return !(*prot & (1 << access_type));
127
+ return !(result->prot & (1 << access_type));
47
}
128
}
48
129
49
static inline int dma_memory_rw_relaxed(AddressSpace *as, dma_addr_t addr,
130
bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
50
diff --git a/exec.c b/exec.c
131
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
51
index XXXXXXX..XXXXXXX 100644
132
} else if (arm_feature(env, ARM_FEATURE_V7)) {
52
--- a/exec.c
133
/* PMSAv7 */
53
+++ b/exec.c
134
ret = get_phys_addr_pmsav7(env, address, access_type, mmu_idx,
54
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
135
- &result->phys, &result->prot,
55
}
136
- &result->page_size, fi);
56
137
+ result, fi);
57
bool address_space_access_valid(AddressSpace *as, hwaddr addr,
138
} else {
58
- int len, bool is_write)
139
/* Pre-v7 MPU */
59
+ int len, bool is_write,
140
ret = get_phys_addr_pmsav5(env, address, access_type, mmu_idx,
60
+ MemTxAttrs attrs)
61
{
62
FlatView *fv;
63
bool result;
64
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/s390x/diag.c
67
+++ b/target/s390x/diag.c
68
@@ -XXX,XX +XXX,XX @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
69
return;
70
}
71
if (!address_space_access_valid(&address_space_memory, addr,
72
- sizeof(IplParameterBlock), false)) {
73
+ sizeof(IplParameterBlock), false,
74
+ MEMTXATTRS_UNSPECIFIED)) {
75
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
76
return;
77
}
78
@@ -XXX,XX +XXX,XX @@ out:
79
return;
80
}
81
if (!address_space_access_valid(&address_space_memory, addr,
82
- sizeof(IplParameterBlock), true)) {
83
+ sizeof(IplParameterBlock), true,
84
+ MEMTXATTRS_UNSPECIFIED)) {
85
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
86
return;
87
}
88
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
89
index XXXXXXX..XXXXXXX 100644
90
--- a/target/s390x/excp_helper.c
91
+++ b/target/s390x/excp_helper.c
92
@@ -XXX,XX +XXX,XX @@ int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr orig_vaddr, int size,
93
94
/* check out of RAM access */
95
if (!address_space_access_valid(&address_space_memory, raddr,
96
- TARGET_PAGE_SIZE, rw)) {
97
+ TARGET_PAGE_SIZE, rw,
98
+ MEMTXATTRS_UNSPECIFIED)) {
99
DPRINTF("%s: raddr %" PRIx64 " > ram_size %" PRIx64 "\n", __func__,
100
(uint64_t)raddr, (uint64_t)ram_size);
101
trigger_pgm_exception(env, PGM_ADDRESSING, ILEN_AUTO);
102
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
103
index XXXXXXX..XXXXXXX 100644
104
--- a/target/s390x/mmu_helper.c
105
+++ b/target/s390x/mmu_helper.c
106
@@ -XXX,XX +XXX,XX @@ static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages,
107
return ret;
108
}
109
if (!address_space_access_valid(&address_space_memory, pages[i],
110
- TARGET_PAGE_SIZE, is_write)) {
111
+ TARGET_PAGE_SIZE, is_write,
112
+ MEMTXATTRS_UNSPECIFIED)) {
113
trigger_access_exception(env, PGM_ADDRESSING, ILEN_AUTO, 0);
114
return -EFAULT;
115
}
116
diff --git a/target/s390x/sigp.c b/target/s390x/sigp.c
117
index XXXXXXX..XXXXXXX 100644
118
--- a/target/s390x/sigp.c
119
+++ b/target/s390x/sigp.c
120
@@ -XXX,XX +XXX,XX @@ static void sigp_set_prefix(CPUState *cs, run_on_cpu_data arg)
121
cpu_synchronize_state(cs);
122
123
if (!address_space_access_valid(&address_space_memory, addr,
124
- sizeof(struct LowCore), false)) {
125
+ sizeof(struct LowCore), false,
126
+ MEMTXATTRS_UNSPECIFIED)) {
127
set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER);
128
return;
129
}
130
--
141
--
131
2.17.1
142
2.25.1
132
143
133
144
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
acpi_data_push uses g_array_set_size to resize the memory size. If there
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
is no enough contiguous memory, the address will be changed. So previous
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
pointer could not be used any more. It must update the pointer and use
5
Message-id: 20220822152741.1617527-9-richard.henderson@linaro.org
6
the new one.
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
8
Also, previous codes wrongly use le32 conversion of iort->node_offset
9
for subsequent computations that will result incorrect value if host is
10
not litlle endian. So use the non-converted one instead.
11
12
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
13
Reviewed-by: Eric Auger <eric.auger@redhat.com>
14
Message-id: 1527663951-14552-1-git-send-email-zhaoshenglong@huawei.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
8
---
17
hw/arm/virt-acpi-build.c | 20 +++++++++++++++-----
9
target/arm/ptw.c | 28 ++++++++++++++--------------
18
1 file changed, 15 insertions(+), 5 deletions(-)
10
1 file changed, 14 insertions(+), 14 deletions(-)
19
11
20
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
12
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
21
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/virt-acpi-build.c
14
--- a/target/arm/ptw.c
23
+++ b/hw/arm/virt-acpi-build.c
15
+++ b/target/arm/ptw.c
24
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
16
@@ -XXX,XX +XXX,XX @@ void v8m_security_lookup(CPUARMState *env, uint32_t address,
25
AcpiIortItsGroup *its;
17
26
AcpiIortTable *iort;
18
static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
27
AcpiIortSmmu3 *smmu;
19
MMUAccessType access_type, ARMMMUIdx mmu_idx,
28
- size_t node_size, iort_length, smmu_offset = 0;
20
- hwaddr *phys_ptr, MemTxAttrs *txattrs,
29
+ size_t node_size, iort_node_offset, iort_length, smmu_offset = 0;
21
- int *prot, target_ulong *page_size,
30
AcpiIortRC *rc;
22
+ GetPhysAddrResult *result,
31
23
ARMMMUFaultInfo *fi)
32
iort = acpi_data_push(table_data, sizeof(*iort));
24
{
33
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
25
uint32_t secure = regime_is_secure(env, mmu_idx);
34
26
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
35
iort_length = sizeof(*iort);
27
} else {
36
iort->node_count = cpu_to_le32(nb_nodes);
28
fi->type = ARMFault_QEMU_SFault;
37
- iort->node_offset = cpu_to_le32(sizeof(*iort));
29
}
38
+ /*
30
- *page_size = sattrs.subpage ? 1 : TARGET_PAGE_SIZE;
39
+ * Use a copy in case table_data->data moves during acpi_data_push
31
- *phys_ptr = address;
40
+ * operations.
32
- *prot = 0;
41
+ */
33
+ result->page_size = sattrs.subpage ? 1 : TARGET_PAGE_SIZE;
42
+ iort_node_offset = sizeof(*iort);
34
+ result->phys = address;
43
+ iort->node_offset = cpu_to_le32(iort_node_offset);
35
+ result->prot = 0;
44
36
return true;
45
/* ITS group node */
37
}
46
node_size = sizeof(*its) + sizeof(uint32_t);
38
} else {
47
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
39
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
48
int irq = vms->irqmap[VIRT_SMMU];
40
* might downgrade a secure access to nonsecure.
49
41
*/
50
/* SMMUv3 node */
42
if (sattrs.ns) {
51
- smmu_offset = iort->node_offset + node_size;
43
- txattrs->secure = false;
52
+ smmu_offset = iort_node_offset + node_size;
44
+ result->attrs.secure = false;
53
node_size = sizeof(*smmu) + sizeof(*idmap);
45
} else if (!secure) {
54
iort_length += node_size;
46
/*
55
smmu = acpi_data_push(table_data, node_size);
47
* NS access to S memory must fault.
56
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
48
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
57
idmap->id_count = cpu_to_le32(0xFFFF);
49
* for M_FAKE_FSR_SFAULT in arm_v7m_cpu_do_interrupt().
58
idmap->output_base = 0;
50
*/
59
/* output IORT node is the ITS group node (the first node) */
51
fi->type = ARMFault_QEMU_SFault;
60
- idmap->output_reference = cpu_to_le32(iort->node_offset);
52
- *page_size = sattrs.subpage ? 1 : TARGET_PAGE_SIZE;
61
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
53
- *phys_ptr = address;
54
- *prot = 0;
55
+ result->page_size = sattrs.subpage ? 1 : TARGET_PAGE_SIZE;
56
+ result->phys = address;
57
+ result->prot = 0;
58
return true;
59
}
60
}
62
}
61
}
63
62
64
/* Root Complex Node */
63
- ret = pmsav8_mpu_lookup(env, address, access_type, mmu_idx, phys_ptr,
65
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
64
- txattrs, prot, &mpu_is_subpage, fi, NULL);
66
idmap->output_reference = cpu_to_le32(smmu_offset);
65
- *page_size = sattrs.subpage || mpu_is_subpage ? 1 : TARGET_PAGE_SIZE;
67
} else {
66
+ ret = pmsav8_mpu_lookup(env, address, access_type, mmu_idx,
68
/* output IORT node is the ITS group node (the first node) */
67
+ &result->phys, &result->attrs, &result->prot,
69
- idmap->output_reference = cpu_to_le32(iort->node_offset);
68
+ &mpu_is_subpage, fi, NULL);
70
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
69
+ result->page_size =
71
}
70
+ sattrs.subpage || mpu_is_subpage ? 1 : TARGET_PAGE_SIZE;
72
71
return ret;
73
+ /*
72
}
74
+ * Update the pointer address in case table_data->data moves during above
73
75
+ * acpi_data_push operations.
74
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
76
+ */
75
if (arm_feature(env, ARM_FEATURE_V8)) {
77
+ iort = (AcpiIortTable *)(table_data->data + iort_start);
76
/* PMSAv8 */
78
iort->length = cpu_to_le32(iort_length);
77
ret = get_phys_addr_pmsav8(env, address, access_type, mmu_idx,
79
78
- &result->phys, &result->attrs,
80
build_header(linker, table_data, (void *)(table_data->data + iort_start),
79
- &result->prot, &result->page_size, fi);
80
+ result, fi);
81
} else if (arm_feature(env, ARM_FEATURE_V7)) {
82
/* PMSAv7 */
83
ret = get_phys_addr_pmsav7(env, address, access_type, mmu_idx,
81
--
84
--
82
2.17.1
85
2.25.1
83
86
84
87
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to flatview_translate(); all its
3
callers now have attrs available.
4
2
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220822152741.1617527-10-richard.henderson@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20180521140402.23318-11-peter.maydell@linaro.org
9
---
8
---
10
include/exec/memory.h | 7 ++++---
9
target/arm/internals.h | 11 +++++------
11
exec.c | 17 +++++++++--------
10
target/arm/m_helper.c | 16 +++++++---------
12
2 files changed, 13 insertions(+), 11 deletions(-)
11
target/arm/ptw.c | 20 +++++++++-----------
12
3 files changed, 21 insertions(+), 26 deletions(-)
13
13
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/target/arm/internals.h b/target/arm/internals.h
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
16
--- a/target/arm/internals.h
17
+++ b/include/exec/memory.h
17
+++ b/target/arm/internals.h
18
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
18
@@ -XXX,XX +XXX,XX @@ void v8m_security_lookup(CPUARMState *env, uint32_t address,
19
*/
19
MMUAccessType access_type, ARMMMUIdx mmu_idx,
20
MemoryRegion *flatview_translate(FlatView *fv,
20
V8M_SAttributes *sattrs);
21
hwaddr addr, hwaddr *xlat,
21
22
- hwaddr *len, bool is_write);
22
-bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
23
+ hwaddr *len, bool is_write,
23
- MMUAccessType access_type, ARMMMUIdx mmu_idx,
24
+ MemTxAttrs attrs);
24
- hwaddr *phys_ptr, MemTxAttrs *txattrs,
25
25
- int *prot, bool *is_subpage,
26
static inline MemoryRegion *address_space_translate(AddressSpace *as,
26
- ARMMMUFaultInfo *fi, uint32_t *mregion);
27
hwaddr addr, hwaddr *xlat,
27
-
28
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
28
/* Cacheability and shareability attributes for a memory access */
29
MemTxAttrs attrs)
29
typedef struct ARMCacheAttrs {
30
/*
31
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
32
GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
33
__attribute__((nonnull));
34
35
+bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
36
+ MMUAccessType access_type, ARMMMUIdx mmu_idx,
37
+ GetPhysAddrResult *result, bool *is_subpage,
38
+ ARMMMUFaultInfo *fi, uint32_t *mregion);
39
+
40
void arm_log_exception(CPUState *cs);
41
42
#endif /* !CONFIG_USER_ONLY */
43
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/arm/m_helper.c
46
+++ b/target/arm/m_helper.c
47
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
48
V8M_SAttributes sattrs = {};
49
uint32_t tt_resp;
50
bool r, rw, nsr, nsrw, mrvalid;
51
- int prot;
52
- ARMMMUFaultInfo fi = {};
53
- MemTxAttrs attrs = {};
54
- hwaddr phys_addr;
55
ARMMMUIdx mmu_idx;
56
uint32_t mregion;
57
bool targetpriv;
58
bool targetsec = env->v7m.secure;
59
- bool is_subpage;
60
61
/*
62
* Work out what the security state and privilege level we're
63
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
64
* inspecting the other MPU state.
65
*/
66
if (arm_current_el(env) != 0 || alt) {
67
+ GetPhysAddrResult res = {};
68
+ ARMMMUFaultInfo fi = {};
69
+ bool is_subpage;
70
+
71
/* We can ignore the return value as prot is always set */
72
pmsav8_mpu_lookup(env, addr, MMU_DATA_LOAD, mmu_idx,
73
- &phys_addr, &attrs, &prot, &is_subpage,
74
- &fi, &mregion);
75
+ &res, &is_subpage, &fi, &mregion);
76
if (mregion == -1) {
77
mrvalid = false;
78
mregion = 0;
79
} else {
80
mrvalid = true;
81
}
82
- r = prot & PAGE_READ;
83
- rw = prot & PAGE_WRITE;
84
+ r = res.prot & PAGE_READ;
85
+ rw = res.prot & PAGE_WRITE;
86
} else {
87
r = false;
88
rw = false;
89
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
90
index XXXXXXX..XXXXXXX 100644
91
--- a/target/arm/ptw.c
92
+++ b/target/arm/ptw.c
93
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
94
95
bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
96
MMUAccessType access_type, ARMMMUIdx mmu_idx,
97
- hwaddr *phys_ptr, MemTxAttrs *txattrs,
98
- int *prot, bool *is_subpage,
99
+ GetPhysAddrResult *result, bool *is_subpage,
100
ARMMMUFaultInfo *fi, uint32_t *mregion)
30
{
101
{
31
return flatview_translate(address_space_to_flatview(as),
102
/*
32
- addr, xlat, len, is_write);
103
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
33
+ addr, xlat, len, is_write, attrs);
104
uint32_t addr_page_limit = addr_page_base + (TARGET_PAGE_SIZE - 1);
105
106
*is_subpage = false;
107
- *phys_ptr = address;
108
- *prot = 0;
109
+ result->phys = address;
110
+ result->prot = 0;
111
if (mregion) {
112
*mregion = -1;
113
}
114
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
115
116
if (matchregion == -1) {
117
/* hit using the background region */
118
- get_phys_addr_pmsav7_default(env, mmu_idx, address, prot);
119
+ get_phys_addr_pmsav7_default(env, mmu_idx, address, &result->prot);
120
} else {
121
uint32_t ap = extract32(env->pmsav8.rbar[secure][matchregion], 1, 2);
122
uint32_t xn = extract32(env->pmsav8.rbar[secure][matchregion], 0, 1);
123
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
124
xn = 1;
125
}
126
127
- *prot = simple_ap_to_rw_prot(env, mmu_idx, ap);
128
- if (*prot && !xn && !(pxn && !is_user)) {
129
- *prot |= PAGE_EXEC;
130
+ result->prot = simple_ap_to_rw_prot(env, mmu_idx, ap);
131
+ if (result->prot && !xn && !(pxn && !is_user)) {
132
+ result->prot |= PAGE_EXEC;
133
}
134
/*
135
* We don't need to look the attribute up in the MAIR0/MAIR1
136
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
137
138
fi->type = ARMFault_Permission;
139
fi->level = 1;
140
- return !(*prot & (1 << access_type));
141
+ return !(result->prot & (1 << access_type));
34
}
142
}
35
143
36
/* address_space_access_valid: check for validity of accessing an address
144
static bool v8m_is_sau_exempt(CPUARMState *env,
37
@@ -XXX,XX +XXX,XX @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
145
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
38
rcu_read_lock();
39
fv = address_space_to_flatview(as);
40
l = len;
41
- mr = flatview_translate(fv, addr, &addr1, &l, false);
42
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
43
if (len == l && memory_access_is_direct(mr, false)) {
44
ptr = qemu_map_ram_ptr(mr->ram_block, addr1);
45
memcpy(buf, ptr, len);
46
diff --git a/exec.c b/exec.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/exec.c
49
+++ b/exec.c
50
@@ -XXX,XX +XXX,XX @@ iotlb_fail:
51
52
/* Called from RCU critical section */
53
MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
54
- hwaddr *plen, bool is_write)
55
+ hwaddr *plen, bool is_write,
56
+ MemTxAttrs attrs)
57
{
58
MemoryRegion *mr;
59
MemoryRegionSection section;
60
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
61
}
62
63
l = len;
64
- mr = flatview_translate(fv, addr, &addr1, &l, true);
65
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
66
}
146
}
67
147
68
return result;
148
ret = pmsav8_mpu_lookup(env, address, access_type, mmu_idx,
69
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
149
- &result->phys, &result->attrs, &result->prot,
70
MemTxResult result = MEMTX_OK;
150
- &mpu_is_subpage, fi, NULL);
71
151
+ result, &mpu_is_subpage, fi, NULL);
72
l = len;
152
result->page_size =
73
- mr = flatview_translate(fv, addr, &addr1, &l, true);
153
sattrs.subpage || mpu_is_subpage ? 1 : TARGET_PAGE_SIZE;
74
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
154
return ret;
75
result = flatview_write_continue(fv, addr, attrs, buf, len,
76
addr1, l, mr);
77
78
@@ -XXX,XX +XXX,XX @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
79
}
80
81
l = len;
82
- mr = flatview_translate(fv, addr, &addr1, &l, false);
83
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
84
}
85
86
return result;
87
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
88
MemoryRegion *mr;
89
90
l = len;
91
- mr = flatview_translate(fv, addr, &addr1, &l, false);
92
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
93
return flatview_read_continue(fv, addr, attrs, buf, len,
94
addr1, l, mr);
95
}
96
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
97
98
while (len > 0) {
99
l = len;
100
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
101
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
102
if (!memory_access_is_direct(mr, is_write)) {
103
l = memory_access_size(mr, l, addr);
104
if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
105
@@ -XXX,XX +XXX,XX @@ flatview_extend_translation(FlatView *fv, hwaddr addr,
106
107
len = target_len;
108
this_mr = flatview_translate(fv, addr, &xlat,
109
- &len, is_write);
110
+ &len, is_write, attrs);
111
if (this_mr != mr || xlat != base + done) {
112
return done;
113
}
114
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
115
l = len;
116
rcu_read_lock();
117
fv = address_space_to_flatview(as);
118
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
119
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
120
121
if (!memory_access_is_direct(mr, is_write)) {
122
if (atomic_xchg(&bounce.in_use, true)) {
123
--
155
--
124
2.17.1
156
2.25.1
125
157
126
158
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
This can be made redundant with result->page_size, by moving the basic
4
set of page_size from get_phys_addr_pmsav8. We still need to overwrite
5
page_size when v8m_security_lookup signals a subpage.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220822152741.1617527-11-richard.henderson@linaro.org
9
[PMM: Update a comment that used to refer to is_subpage]
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/internals.h | 4 ++--
14
target/arm/m_helper.c | 3 +--
15
target/arm/ptw.c | 23 ++++++++++++-----------
16
3 files changed, 15 insertions(+), 15 deletions(-)
17
18
diff --git a/target/arm/internals.h b/target/arm/internals.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/internals.h
21
+++ b/target/arm/internals.h
22
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
23
24
bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
25
MMUAccessType access_type, ARMMMUIdx mmu_idx,
26
- GetPhysAddrResult *result, bool *is_subpage,
27
- ARMMMUFaultInfo *fi, uint32_t *mregion);
28
+ GetPhysAddrResult *result, ARMMMUFaultInfo *fi,
29
+ uint32_t *mregion);
30
31
void arm_log_exception(CPUState *cs);
32
33
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/m_helper.c
36
+++ b/target/arm/m_helper.c
37
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
38
if (arm_current_el(env) != 0 || alt) {
39
GetPhysAddrResult res = {};
40
ARMMMUFaultInfo fi = {};
41
- bool is_subpage;
42
43
/* We can ignore the return value as prot is always set */
44
pmsav8_mpu_lookup(env, addr, MMU_DATA_LOAD, mmu_idx,
45
- &res, &is_subpage, &fi, &mregion);
46
+ &res, &fi, &mregion);
47
if (mregion == -1) {
48
mrvalid = false;
49
mregion = 0;
50
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/arm/ptw.c
53
+++ b/target/arm/ptw.c
54
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
55
56
bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
57
MMUAccessType access_type, ARMMMUIdx mmu_idx,
58
- GetPhysAddrResult *result, bool *is_subpage,
59
- ARMMMUFaultInfo *fi, uint32_t *mregion)
60
+ GetPhysAddrResult *result, ARMMMUFaultInfo *fi,
61
+ uint32_t *mregion)
62
{
63
/*
64
* Perform a PMSAv8 MPU lookup (without also doing the SAU check
65
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
66
* mregion is (if not NULL) set to the region number which matched,
67
* or -1 if no region number is returned (MPU off, address did not
68
* hit a region, address hit in multiple regions).
69
- * We set is_subpage to true if the region hit doesn't cover the
70
- * entire TARGET_PAGE the address is within.
71
+ * If the region hit doesn't cover the entire TARGET_PAGE the address
72
+ * is within, then we set the result page_size to 1 to force the
73
+ * memory system to use a subpage.
74
*/
75
ARMCPU *cpu = env_archcpu(env);
76
bool is_user = regime_is_user(env, mmu_idx);
77
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
78
uint32_t addr_page_base = address & TARGET_PAGE_MASK;
79
uint32_t addr_page_limit = addr_page_base + (TARGET_PAGE_SIZE - 1);
80
81
- *is_subpage = false;
82
+ result->page_size = TARGET_PAGE_SIZE;
83
result->phys = address;
84
result->prot = 0;
85
if (mregion) {
86
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
87
ranges_overlap(base, limit - base + 1,
88
addr_page_base,
89
TARGET_PAGE_SIZE)) {
90
- *is_subpage = true;
91
+ result->page_size = 1;
92
}
93
continue;
94
}
95
96
if (base > addr_page_base || limit < addr_page_limit) {
97
- *is_subpage = true;
98
+ result->page_size = 1;
99
}
100
101
if (matchregion != -1) {
102
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
103
uint32_t secure = regime_is_secure(env, mmu_idx);
104
V8M_SAttributes sattrs = {};
105
bool ret;
106
- bool mpu_is_subpage;
107
108
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
109
v8m_security_lookup(env, address, access_type, mmu_idx, &sattrs);
110
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
111
}
112
113
ret = pmsav8_mpu_lookup(env, address, access_type, mmu_idx,
114
- result, &mpu_is_subpage, fi, NULL);
115
- result->page_size =
116
- sattrs.subpage || mpu_is_subpage ? 1 : TARGET_PAGE_SIZE;
117
+ result, fi, NULL);
118
+ if (sattrs.subpage) {
119
+ result->page_size = 1;
120
+ }
121
return ret;
122
}
123
124
--
125
2.25.1
diff view generated by jsdifflib
1
The FRECPX instructions should (like most other floating point operations)
1
From: Richard Henderson <richard.henderson@linaro.org>
2
honour the FPCR.FZ bit which specifies whether input denormals should
3
be flushed to zero (or FZ16 for the half-precision version).
4
We forgot to implement this, which doesn't affect the results (since
5
the calculation doesn't actually care about the mantissa bits) but did
6
mean we were failing to set the FPSR.IDC bit.
7
2
3
Remove the use of regime_is_secure from v8m_security_lookup,
4
passing the new parameter to the lookup instead.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220822152741.1617527-12-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180521172712.19930-1-peter.maydell@linaro.org
11
---
11
---
12
target/arm/helper-a64.c | 6 ++++++
12
target/arm/internals.h | 2 +-
13
1 file changed, 6 insertions(+)
13
target/arm/m_helper.c | 9 ++++++---
14
target/arm/ptw.c | 9 +++++----
15
3 files changed, 12 insertions(+), 8 deletions(-)
14
16
15
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
17
diff --git a/target/arm/internals.h b/target/arm/internals.h
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.c
19
--- a/target/arm/internals.h
18
+++ b/target/arm/helper-a64.c
20
+++ b/target/arm/internals.h
19
@@ -XXX,XX +XXX,XX @@ float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
21
@@ -XXX,XX +XXX,XX @@ typedef struct V8M_SAttributes {
20
return nan;
22
23
void v8m_security_lookup(CPUARMState *env, uint32_t address,
24
MMUAccessType access_type, ARMMMUIdx mmu_idx,
25
- V8M_SAttributes *sattrs);
26
+ bool secure, V8M_SAttributes *sattrs);
27
28
/* Cacheability and shareability attributes for a memory access */
29
typedef struct ARMCacheAttrs {
30
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/m_helper.c
33
+++ b/target/arm/m_helper.c
34
@@ -XXX,XX +XXX,XX @@ static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
35
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
36
V8M_SAttributes sattrs = {};
37
38
- v8m_security_lookup(env, addr, MMU_DATA_LOAD, mmu_idx, &sattrs);
39
+ v8m_security_lookup(env, addr, MMU_DATA_LOAD, mmu_idx,
40
+ targets_secure, &sattrs);
41
if (sattrs.ns) {
42
attrs.secure = false;
43
} else if (!targets_secure) {
44
@@ -XXX,XX +XXX,XX @@ static bool v7m_read_half_insn(ARMCPU *cpu, ARMMMUIdx mmu_idx,
45
ARMMMUFaultInfo fi = {};
46
MemTxResult txres;
47
48
- v8m_security_lookup(env, addr, MMU_INST_FETCH, mmu_idx, &sattrs);
49
+ v8m_security_lookup(env, addr, MMU_INST_FETCH, mmu_idx,
50
+ regime_is_secure(env, mmu_idx), &sattrs);
51
if (!sattrs.nsc || sattrs.ns) {
52
/*
53
* This must be the second half of the insn, and it straddles a
54
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
21
}
55
}
22
56
23
+ a = float16_squash_input_denormal(a, fpst);
57
if (env->v7m.secure) {
24
+
58
- v8m_security_lookup(env, addr, MMU_DATA_LOAD, mmu_idx, &sattrs);
25
val16 = float16_val(a);
59
+ v8m_security_lookup(env, addr, MMU_DATA_LOAD, mmu_idx,
26
sbit = 0x8000 & val16;
60
+ targetsec, &sattrs);
27
exp = extract32(val16, 10, 5);
61
nsr = sattrs.ns && r;
28
@@ -XXX,XX +XXX,XX @@ float32 HELPER(frecpx_f32)(float32 a, void *fpstp)
62
nsrw = sattrs.ns && rw;
29
return nan;
63
} else {
64
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/arm/ptw.c
67
+++ b/target/arm/ptw.c
68
@@ -XXX,XX +XXX,XX @@ static bool v8m_is_sau_exempt(CPUARMState *env,
69
}
70
71
void v8m_security_lookup(CPUARMState *env, uint32_t address,
72
- MMUAccessType access_type, ARMMMUIdx mmu_idx,
73
- V8M_SAttributes *sattrs)
74
+ MMUAccessType access_type, ARMMMUIdx mmu_idx,
75
+ bool is_secure, V8M_SAttributes *sattrs)
76
{
77
/*
78
* Look up the security attributes for this address. Compare the
79
@@ -XXX,XX +XXX,XX @@ void v8m_security_lookup(CPUARMState *env, uint32_t address,
30
}
80
}
31
81
32
+ a = float32_squash_input_denormal(a, fpst);
82
if (idau_exempt || v8m_is_sau_exempt(env, address, access_type)) {
33
+
83
- sattrs->ns = !regime_is_secure(env, mmu_idx);
34
val32 = float32_val(a);
84
+ sattrs->ns = !is_secure;
35
sbit = 0x80000000ULL & val32;
85
return;
36
exp = extract32(val32, 23, 8);
37
@@ -XXX,XX +XXX,XX @@ float64 HELPER(frecpx_f64)(float64 a, void *fpstp)
38
return nan;
39
}
86
}
40
87
41
+ a = float64_squash_input_denormal(a, fpst);
88
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
42
+
89
bool ret;
43
val64 = float64_val(a);
90
44
sbit = 0x8000000000000000ULL & val64;
91
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
45
exp = extract64(float64_val(a), 52, 11);
92
- v8m_security_lookup(env, address, access_type, mmu_idx, &sattrs);
93
+ v8m_security_lookup(env, address, access_type, mmu_idx,
94
+ secure, &sattrs);
95
if (access_type == MMU_INST_FETCH) {
96
/*
97
* Instruction fetches always use the MMU bank and the
46
--
98
--
47
2.17.1
99
2.25.1
48
100
49
101
diff view generated by jsdifflib
1
From: Igor Mammedov <imammedo@redhat.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
When QEMU is started with following CLI
3
Remove the use of regime_is_secure from pmsav8_mpu_lookup,
4
-machine virt,gic-version=3,accel=kvm -cpu host -bios AAVMF_CODE.fd
4
passing the new parameter to the lookup instead.
5
it crashes with abort at
6
accel/kvm/kvm-all.c:2164:
7
KVM_SET_DEVICE_ATTR failed: Group 6 attr 0x000000000000c665: Invalid argument
8
5
9
Which is caused by implicit dependency of kvm_arm_gicv3_reset() on
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
arm_gicv3_icc_reset() where the later is called by CPU reset
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
reset callback.
8
Message-id: 20220822152741.1617527-13-richard.henderson@linaro.org
12
13
However commit:
14
3b77f6c arm/boot: split load_dtb() from arm_load_kernel()
15
broke CPU reset callback registration in case
16
17
arm_load_kernel()
18
...
19
if (!info->kernel_filename || info->firmware_loaded)
20
21
branch is taken, i.e. it's sufficient to provide a firmware
22
or do not provide kernel on CLI to skip cpu reset callback
23
registration, where before offending commit the callback
24
has been registered unconditionally.
25
26
Fix it by registering the callback right at the beginning of
27
arm_load_kernel() unconditionally instead of doing it at the end.
28
29
NOTE:
30
we probably should eliminate that dependency anyways as well as
31
separate arch CPU reset parts from arm_load_kernel() into CPU
32
itself, but that refactoring that I probably would have to do
33
anyways later for CPU hotplug to work.
34
35
Reported-by: Auger Eric <eric.auger@redhat.com>
36
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
37
Reviewed-by: Eric Auger <eric.auger@redhat.com>
38
Tested-by: Eric Auger <eric.auger@redhat.com>
39
Message-id: 1527070950-208350-1-git-send-email-imammedo@redhat.com
40
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
42
---
11
---
43
hw/arm/boot.c | 18 +++++++++---------
12
target/arm/internals.h | 4 ++--
44
1 file changed, 9 insertions(+), 9 deletions(-)
13
target/arm/m_helper.c | 2 +-
14
target/arm/ptw.c | 7 +++----
15
3 files changed, 6 insertions(+), 7 deletions(-)
45
16
46
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
17
diff --git a/target/arm/internals.h b/target/arm/internals.h
47
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/boot.c
19
--- a/target/arm/internals.h
49
+++ b/hw/arm/boot.c
20
+++ b/target/arm/internals.h
50
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
21
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
51
static const ARMInsnFixup *primary_loader;
22
52
AddressSpace *as = arm_boot_address_space(cpu, info);
23
bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
53
24
MMUAccessType access_type, ARMMMUIdx mmu_idx,
54
+ /* CPU objects (unlike devices) are not automatically reset on system
25
- GetPhysAddrResult *result, ARMMMUFaultInfo *fi,
55
+ * reset, so we must always register a handler to do so. If we're
26
- uint32_t *mregion);
56
+ * actually loading a kernel, the handler is also responsible for
27
+ bool is_secure, GetPhysAddrResult *result,
57
+ * arranging that we start it correctly.
28
+ ARMMMUFaultInfo *fi, uint32_t *mregion);
58
+ */
29
59
+ for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
30
void arm_log_exception(CPUState *cs);
60
+ qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
31
61
+ }
32
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
62
+
33
index XXXXXXX..XXXXXXX 100644
63
/* The board code is not supposed to set secure_board_setup unless
34
--- a/target/arm/m_helper.c
64
* running its code in secure mode is actually possible, and KVM
35
+++ b/target/arm/m_helper.c
65
* doesn't support secure.
36
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
66
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
37
ARMMMUFaultInfo fi = {};
67
ARM_CPU(cs)->env.boot_info = info;
38
39
/* We can ignore the return value as prot is always set */
40
- pmsav8_mpu_lookup(env, addr, MMU_DATA_LOAD, mmu_idx,
41
+ pmsav8_mpu_lookup(env, addr, MMU_DATA_LOAD, mmu_idx, targetsec,
42
&res, &fi, &mregion);
43
if (mregion == -1) {
44
mrvalid = false;
45
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/arm/ptw.c
48
+++ b/target/arm/ptw.c
49
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
50
51
bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
52
MMUAccessType access_type, ARMMMUIdx mmu_idx,
53
- GetPhysAddrResult *result, ARMMMUFaultInfo *fi,
54
- uint32_t *mregion)
55
+ bool secure, GetPhysAddrResult *result,
56
+ ARMMMUFaultInfo *fi, uint32_t *mregion)
57
{
58
/*
59
* Perform a PMSAv8 MPU lookup (without also doing the SAU check
60
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
61
*/
62
ARMCPU *cpu = env_archcpu(env);
63
bool is_user = regime_is_user(env, mmu_idx);
64
- uint32_t secure = regime_is_secure(env, mmu_idx);
65
int n;
66
int matchregion = -1;
67
bool hit = false;
68
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
69
}
68
}
70
}
69
71
70
- /* CPU objects (unlike devices) are not automatically reset on system
72
- ret = pmsav8_mpu_lookup(env, address, access_type, mmu_idx,
71
- * reset, so we must always register a handler to do so. If we're
73
+ ret = pmsav8_mpu_lookup(env, address, access_type, mmu_idx, secure,
72
- * actually loading a kernel, the handler is also responsible for
74
result, fi, NULL);
73
- * arranging that we start it correctly.
75
if (sattrs.subpage) {
74
- */
76
result->page_size = 1;
75
- for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
76
- qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
77
- }
78
-
79
if (!info->skip_dtb_autoload && have_dtb(info)) {
80
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
81
exit(1);
82
--
77
--
83
2.17.1
78
2.25.1
84
79
85
80
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to tb_invalidate_phys_addr().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Remove the use of regime_is_secure from get_phys_addr_v5,
4
passing the new parameter to the lookup instead.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
[PMM: Folded in definition of local is_secure in get_phys_addr(),
9
since I dropped the earlier patch that would have provided it]
10
Message-id: 20220822152741.1617527-14-richard.henderson@linaro.org
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20180521140402.23318-3-peter.maydell@linaro.org
10
---
13
---
11
include/exec/exec-all.h | 5 +++--
14
target/arm/ptw.c | 14 +++++++-------
12
accel/tcg/translate-all.c | 2 +-
15
1 file changed, 7 insertions(+), 7 deletions(-)
13
exec.c | 2 +-
14
target/xtensa/op_helper.c | 3 ++-
15
4 files changed, 7 insertions(+), 5 deletions(-)
16
16
17
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
17
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
18
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/exec-all.h
19
--- a/target/arm/ptw.c
20
+++ b/include/exec/exec-all.h
20
+++ b/target/arm/ptw.c
21
@@ -XXX,XX +XXX,XX @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
21
@@ -XXX,XX +XXX,XX @@ static int simple_ap_to_rw_prot(CPUARMState *env, ARMMMUIdx mmu_idx, int ap)
22
void tlb_set_page(CPUState *cpu, target_ulong vaddr,
22
23
hwaddr paddr, int prot,
23
static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
24
int mmu_idx, target_ulong size);
24
MMUAccessType access_type, ARMMMUIdx mmu_idx,
25
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
25
- GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
26
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs);
26
+ bool is_secure, GetPhysAddrResult *result,
27
void probe_write(CPUArchState *env, target_ulong addr, int size, int mmu_idx,
27
+ ARMMMUFaultInfo *fi)
28
uintptr_t retaddr);
29
#else
30
@@ -XXX,XX +XXX,XX @@ static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
31
uint16_t idxmap)
32
{
28
{
33
}
29
int level = 1;
34
-static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
30
uint32_t table;
35
+static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr,
31
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
36
+ MemTxAttrs attrs)
32
fi->type = ARMFault_Translation;
33
goto do_fault;
34
}
35
- desc = arm_ldl_ptw(env, table, regime_is_secure(env, mmu_idx),
36
- mmu_idx, fi);
37
+ desc = arm_ldl_ptw(env, table, is_secure, mmu_idx, fi);
38
if (fi->type != ARMFault_None) {
39
goto do_fault;
40
}
41
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
42
/* Fine pagetable. */
43
table = (desc & 0xfffff000) | ((address >> 8) & 0xffc);
44
}
45
- desc = arm_ldl_ptw(env, table, regime_is_secure(env, mmu_idx),
46
- mmu_idx, fi);
47
+ desc = arm_ldl_ptw(env, table, is_secure, mmu_idx, fi);
48
if (fi->type != ARMFault_None) {
49
goto do_fault;
50
}
51
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
52
GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
37
{
53
{
38
}
54
ARMMMUIdx s1_mmu_idx = stage_1_mmu_idx(mmu_idx);
39
#endif
55
+ bool is_secure = regime_is_secure(env, mmu_idx);
40
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
56
41
index XXXXXXX..XXXXXXX 100644
57
if (mmu_idx != s1_mmu_idx) {
42
--- a/accel/tcg/translate-all.c
58
/*
43
+++ b/accel/tcg/translate-all.c
59
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
44
@@ -XXX,XX +XXX,XX @@ static TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
60
* cannot upgrade an non-secure translation regime's attributes
45
}
61
* to secure.
46
62
*/
47
#if !defined(CONFIG_USER_ONLY)
63
- result->attrs.secure = regime_is_secure(env, mmu_idx);
48
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
64
+ result->attrs.secure = is_secure;
49
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
65
result->attrs.user = regime_is_user(env, mmu_idx);
50
{
66
51
ram_addr_t ram_addr;
67
/*
52
MemoryRegion *mr;
68
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
53
diff --git a/exec.c b/exec.c
69
result, fi);
54
index XXXXXXX..XXXXXXX 100644
70
} else {
55
--- a/exec.c
71
return get_phys_addr_v5(env, address, access_type, mmu_idx,
56
+++ b/exec.c
72
- result, fi);
57
@@ -XXX,XX +XXX,XX @@ static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
73
+ is_secure, result, fi);
58
if (phys != -1) {
59
/* Locks grabbed by tb_invalidate_phys_addr */
60
tb_invalidate_phys_addr(cpu->cpu_ases[asidx].as,
61
- phys | (pc & ~TARGET_PAGE_MASK));
62
+ phys | (pc & ~TARGET_PAGE_MASK), attrs);
63
}
74
}
64
}
75
}
65
#endif
66
diff --git a/target/xtensa/op_helper.c b/target/xtensa/op_helper.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/xtensa/op_helper.c
69
+++ b/target/xtensa/op_helper.c
70
@@ -XXX,XX +XXX,XX @@ static void tb_invalidate_virtual_addr(CPUXtensaState *env, uint32_t vaddr)
71
int ret = xtensa_get_physical_addr(env, false, vaddr, 2, 0,
72
&paddr, &page_size, &access);
73
if (ret == 0) {
74
- tb_invalidate_phys_addr(&address_space_memory, paddr);
75
+ tb_invalidate_phys_addr(&address_space_memory, paddr,
76
+ MEMTXATTRS_UNSPECIFIED);
77
}
78
}
79
76
80
--
77
--
81
2.17.1
78
2.25.1
82
79
83
80
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Remove the use of regime_is_secure from get_phys_addr_v6,
4
passing the new parameter to the lookup instead.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220822152741.1617527-15-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/ptw.c | 11 +++++------
13
1 file changed, 5 insertions(+), 6 deletions(-)
14
15
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/ptw.c
18
+++ b/target/arm/ptw.c
19
@@ -XXX,XX +XXX,XX @@ do_fault:
20
21
static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
22
MMUAccessType access_type, ARMMMUIdx mmu_idx,
23
- GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
24
+ bool is_secure, GetPhysAddrResult *result,
25
+ ARMMMUFaultInfo *fi)
26
{
27
ARMCPU *cpu = env_archcpu(env);
28
int level = 1;
29
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
30
fi->type = ARMFault_Translation;
31
goto do_fault;
32
}
33
- desc = arm_ldl_ptw(env, table, regime_is_secure(env, mmu_idx),
34
- mmu_idx, fi);
35
+ desc = arm_ldl_ptw(env, table, is_secure, mmu_idx, fi);
36
if (fi->type != ARMFault_None) {
37
goto do_fault;
38
}
39
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
40
ns = extract32(desc, 3, 1);
41
/* Lookup l2 entry. */
42
table = (desc & 0xfffffc00) | ((address >> 10) & 0x3fc);
43
- desc = arm_ldl_ptw(env, table, regime_is_secure(env, mmu_idx),
44
- mmu_idx, fi);
45
+ desc = arm_ldl_ptw(env, table, is_secure, mmu_idx, fi);
46
if (fi->type != ARMFault_None) {
47
goto do_fault;
48
}
49
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
50
result, fi);
51
} else if (regime_sctlr(env, mmu_idx) & SCTLR_XP) {
52
return get_phys_addr_v6(env, address, access_type, mmu_idx,
53
- result, fi);
54
+ is_secure, result, fi);
55
} else {
56
return get_phys_addr_v5(env, address, access_type, mmu_idx,
57
is_secure, result, fi);
58
--
59
2.25.1
60
61
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
kvm_irqchip_create called by kvm_init will call kvm_init_irq_routing to
3
Remove the use of regime_is_secure from get_phys_addr_pmsav8.
4
initialize global capability variables. If we call kvm_init_irq_routing in
4
Since we already had a local variable named secure, use that.
5
GIC realize function, previous allocated memory will leak.
6
5
7
Fix this by deleting the unnecessary call.
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
8
Message-id: 20220822152741.1617527-16-richard.henderson@linaro.org
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 1527750994-14360-1-git-send-email-zhaoshenglong@huawei.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
11
---
14
hw/intc/arm_gic_kvm.c | 1 -
12
target/arm/ptw.c | 5 ++---
15
hw/intc/arm_gicv3_kvm.c | 1 -
13
1 file changed, 2 insertions(+), 3 deletions(-)
16
2 files changed, 2 deletions(-)
17
14
18
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
15
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
19
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/intc/arm_gic_kvm.c
17
--- a/target/arm/ptw.c
21
+++ b/hw/intc/arm_gic_kvm.c
18
+++ b/target/arm/ptw.c
22
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
19
@@ -XXX,XX +XXX,XX @@ void v8m_security_lookup(CPUARMState *env, uint32_t address,
23
20
24
if (kvm_has_gsi_routing()) {
21
static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
25
/* set up irq routing */
22
MMUAccessType access_type, ARMMMUIdx mmu_idx,
26
- kvm_init_irq_routing(kvm_state);
23
- GetPhysAddrResult *result,
27
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
24
+ bool secure, GetPhysAddrResult *result,
28
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
25
ARMMMUFaultInfo *fi)
29
}
26
{
30
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
27
- uint32_t secure = regime_is_secure(env, mmu_idx);
31
index XXXXXXX..XXXXXXX 100644
28
V8M_SAttributes sattrs = {};
32
--- a/hw/intc/arm_gicv3_kvm.c
29
bool ret;
33
+++ b/hw/intc/arm_gicv3_kvm.c
30
34
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
31
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
35
32
if (arm_feature(env, ARM_FEATURE_V8)) {
36
if (kvm_has_gsi_routing()) {
33
/* PMSAv8 */
37
/* set up irq routing */
34
ret = get_phys_addr_pmsav8(env, address, access_type, mmu_idx,
38
- kvm_init_irq_routing(kvm_state);
35
- result, fi);
39
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
36
+ is_secure, result, fi);
40
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
37
} else if (arm_feature(env, ARM_FEATURE_V7)) {
41
}
38
/* PMSAv7 */
39
ret = get_phys_addr_pmsav7(env, address, access_type, mmu_idx,
42
--
40
--
43
2.17.1
41
2.25.1
44
42
45
43
diff view generated by jsdifflib
1
From: Jan Kiszka <jan.kiszka@siemens.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
There was a nasty flip in identifying which register group an access is
3
Remove the use of regime_is_secure from pmsav7_use_background_region,
4
targeting. The issue caused spuriously raised priorities of the guest
4
using the new parameter instead.
5
when handing CPUs over in the Jailhouse hypervisor.
6
5
7
Cc: qemu-stable@nongnu.org
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 28b927d3-da58-bce4-cc13-bfec7f9b1cb9@siemens.com
8
Message-id: 20220822152741.1617527-17-richard.henderson@linaro.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
11
---
13
hw/intc/arm_gicv3_cpuif.c | 12 ++++++------
12
target/arm/ptw.c | 10 +++++-----
14
1 file changed, 6 insertions(+), 6 deletions(-)
13
1 file changed, 5 insertions(+), 5 deletions(-)
15
14
16
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
15
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/arm_gicv3_cpuif.c
17
--- a/target/arm/ptw.c
19
+++ b/hw/intc/arm_gicv3_cpuif.c
18
+++ b/target/arm/ptw.c
20
@@ -XXX,XX +XXX,XX @@ static uint64_t icv_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
19
@@ -XXX,XX +XXX,XX @@ static bool m_is_system_region(CPUARMState *env, uint32_t address)
20
}
21
22
static bool pmsav7_use_background_region(ARMCPU *cpu, ARMMMUIdx mmu_idx,
23
- bool is_user)
24
+ bool is_secure, bool is_user)
21
{
25
{
22
GICv3CPUState *cs = icc_cs_from_env(env);
26
/*
23
int regno = ri->opc2 & 3;
27
* Return true if we should use the default memory map as a
24
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
28
@@ -XXX,XX +XXX,XX @@ static bool pmsav7_use_background_region(ARMCPU *cpu, ARMMMUIdx mmu_idx,
25
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
29
}
26
uint64_t value = cs->ich_apr[grp][regno];
30
27
31
if (arm_feature(env, ARM_FEATURE_M)) {
28
trace_gicv3_icv_ap_read(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
32
- return env->v7m.mpu_ctrl[regime_is_secure(env, mmu_idx)]
29
@@ -XXX,XX +XXX,XX @@ static void icv_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
33
- & R_V7M_MPU_CTRL_PRIVDEFENA_MASK;
34
+ return env->v7m.mpu_ctrl[is_secure] & R_V7M_MPU_CTRL_PRIVDEFENA_MASK;
35
} else {
36
return regime_sctlr(env, mmu_idx) & SCTLR_BR;
37
}
38
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
30
{
39
{
31
GICv3CPUState *cs = icc_cs_from_env(env);
40
ARMCPU *cpu = env_archcpu(env);
32
int regno = ri->opc2 & 3;
41
int n;
33
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
42
+ bool secure = regime_is_secure(env, mmu_idx);
34
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
43
bool is_user = regime_is_user(env, mmu_idx);
35
44
36
trace_gicv3_icv_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
45
result->phys = address;
37
46
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
38
@@ -XXX,XX +XXX,XX @@ static uint64_t icc_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
47
}
39
uint64_t value;
48
40
49
if (n == -1) { /* no hits */
41
int regno = ri->opc2 & 3;
50
- if (!pmsav7_use_background_region(cpu, mmu_idx, is_user)) {
42
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
51
+ if (!pmsav7_use_background_region(cpu, mmu_idx, secure, is_user)) {
43
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
52
/* background fault */
44
53
fi->type = ARMFault_Background;
45
if (icv_access(env, grp == GICV3_G0 ? HCR_FMO : HCR_IMO)) {
54
return true;
46
return icv_ap_read(env, ri);
55
@@ -XXX,XX +XXX,XX @@ bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
47
@@ -XXX,XX +XXX,XX @@ static void icc_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
56
} else if (m_is_ppb_region(env, address)) {
48
GICv3CPUState *cs = icc_cs_from_env(env);
57
hit = true;
49
58
} else {
50
int regno = ri->opc2 & 3;
59
- if (pmsav7_use_background_region(cpu, mmu_idx, is_user)) {
51
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
60
+ if (pmsav7_use_background_region(cpu, mmu_idx, secure, is_user)) {
52
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
61
hit = true;
53
62
}
54
if (icv_access(env, grp == GICV3_G0 ? HCR_FMO : HCR_IMO)) {
55
icv_ap_write(env, ri, value);
56
@@ -XXX,XX +XXX,XX @@ static uint64_t ich_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
57
{
58
GICv3CPUState *cs = icc_cs_from_env(env);
59
int regno = ri->opc2 & 3;
60
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
61
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
62
uint64_t value;
63
64
value = cs->ich_apr[grp][regno];
65
@@ -XXX,XX +XXX,XX @@ static void ich_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
66
{
67
GICv3CPUState *cs = icc_cs_from_env(env);
68
int regno = ri->opc2 & 3;
69
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
70
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
71
72
trace_gicv3_ich_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
73
63
74
--
64
--
75
2.17.1
65
2.25.1
76
66
77
67
diff view generated by jsdifflib
1
From: Paolo Bonzini <pbonzini@redhat.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
cpregs_keys is an uint32_t* so the allocation should use uint32_t.
3
Remove the use of regime_is_secure from get_phys_addr_pmsav7,
4
g_new is even better because it is type-safe.
4
using the new parameter instead.
5
5
6
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220822152741.1617527-19-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
target/arm/gdbstub.c | 3 +--
12
target/arm/ptw.c | 5 ++---
12
1 file changed, 1 insertion(+), 2 deletions(-)
13
1 file changed, 2 insertions(+), 3 deletions(-)
13
14
14
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
15
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/gdbstub.c
17
--- a/target/arm/ptw.c
17
+++ b/target/arm/gdbstub.c
18
+++ b/target/arm/ptw.c
18
@@ -XXX,XX +XXX,XX @@ int arm_gen_dynamic_xml(CPUState *cs)
19
@@ -XXX,XX +XXX,XX @@ static bool pmsav7_use_background_region(ARMCPU *cpu, ARMMMUIdx mmu_idx,
19
RegisterSysregXmlParam param = {cs, s};
20
20
21
static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
21
cpu->dyn_xml.num_cpregs = 0;
22
MMUAccessType access_type, ARMMMUIdx mmu_idx,
22
- cpu->dyn_xml.cpregs_keys = g_malloc(sizeof(uint32_t *) *
23
- GetPhysAddrResult *result,
23
- g_hash_table_size(cpu->cp_regs));
24
+ bool secure, GetPhysAddrResult *result,
24
+ cpu->dyn_xml.cpregs_keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
25
ARMMMUFaultInfo *fi)
25
g_string_printf(s, "<?xml version=\"1.0\"?>");
26
{
26
g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
27
ARMCPU *cpu = env_archcpu(env);
27
g_string_append_printf(s, "<feature name=\"org.qemu.gdb.arm.sys.regs\">");
28
int n;
29
- bool secure = regime_is_secure(env, mmu_idx);
30
bool is_user = regime_is_user(env, mmu_idx);
31
32
result->phys = address;
33
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
34
} else if (arm_feature(env, ARM_FEATURE_V7)) {
35
/* PMSAv7 */
36
ret = get_phys_addr_pmsav7(env, address, access_type, mmu_idx,
37
- result, fi);
38
+ is_secure, result, fi);
39
} else {
40
/* Pre-v7 MPU */
41
ret = get_phys_addr_pmsav5(env, address, access_type, mmu_idx,
28
--
42
--
29
2.17.1
43
2.25.1
30
44
31
45
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
It forgot to increase clroffset during the loop. So it only clear the
3
Remove the use of regime_is_secure from get_phys_addr_pmsav5.
4
first 4 bytes.
5
4
6
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Cc: qemu-stable@nongnu.org
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
7
Message-id: 20220822152741.1617527-21-richard.henderson@linaro.org
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 1527047633-12368-1-git-send-email-zhaoshenglong@huawei.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
10
---
14
hw/intc/arm_gicv3_kvm.c | 1 +
11
target/arm/ptw.c | 4 ++--
15
1 file changed, 1 insertion(+)
12
1 file changed, 2 insertions(+), 2 deletions(-)
16
13
17
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
14
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/arm_gicv3_kvm.c
16
--- a/target/arm/ptw.c
20
+++ b/hw/intc/arm_gicv3_kvm.c
17
+++ b/target/arm/ptw.c
21
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
18
@@ -XXX,XX +XXX,XX @@ do_fault:
22
if (clroffset != 0) {
19
23
reg = 0;
20
static bool get_phys_addr_pmsav5(CPUARMState *env, uint32_t address,
24
kvm_gicd_access(s, clroffset, &reg, true);
21
MMUAccessType access_type, ARMMMUIdx mmu_idx,
25
+ clroffset += 4;
22
- GetPhysAddrResult *result,
23
+ bool is_secure, GetPhysAddrResult *result,
24
ARMMMUFaultInfo *fi)
25
{
26
int n;
27
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
28
} else {
29
/* Pre-v7 MPU */
30
ret = get_phys_addr_pmsav5(env, address, access_type, mmu_idx,
31
- result, fi);
32
+ is_secure, result, fi);
26
}
33
}
27
reg = *gic_bmp_ptr32(bmp, irq);
34
qemu_log_mask(CPU_LOG_MMU, "PMSA MPU lookup for %s at 0x%08" PRIx32
28
kvm_gicd_access(s, offset, &reg, true);
35
" mmu_idx %u -> %s (prot %c%c%c)\n",
29
--
36
--
30
2.17.1
37
2.25.1
31
38
32
39
diff view generated by jsdifflib
New patch
1
From: Keqian Zhu <zhukeqian1@huawei.com>
1
2
3
Setup an ARM virtual machine of machine virt and execute qmp "query-acpi-ospm-status"
4
causes segmentation fault with following dumpstack:
5
#1 0x0000aaaaab64235c in qmp_query_acpi_ospm_status (errp=errp@entry=0xfffffffff030) at ../monitor/qmp-cmds.c:312
6
#2 0x0000aaaaabfc4e20 in qmp_marshal_query_acpi_ospm_status (args=<optimized out>, ret=0xffffea4ffe90, errp=0xffffea4ffe88) at qapi/qapi-commands-acpi.c:63
7
#3 0x0000aaaaabff8ba0 in do_qmp_dispatch_bh (opaque=0xffffea4ffe98) at ../qapi/qmp-dispatch.c:128
8
#4 0x0000aaaaac02e594 in aio_bh_call (bh=0xffffe0004d80) at ../util/async.c:150
9
#5 aio_bh_poll (ctx=ctx@entry=0xaaaaad0f6040) at ../util/async.c:178
10
#6 0x0000aaaaac00bd40 in aio_dispatch (ctx=ctx@entry=0xaaaaad0f6040) at ../util/aio-posix.c:421
11
#7 0x0000aaaaac02e010 in aio_ctx_dispatch (source=0xaaaaad0f6040, callback=<optimized out>, user_data=<optimized out>) at ../util/async.c:320
12
#8 0x0000fffff76f6884 in g_main_context_dispatch () at /usr/lib64/libglib-2.0.so.0
13
#9 0x0000aaaaac0452d4 in glib_pollfds_poll () at ../util/main-loop.c:297
14
#10 os_host_main_loop_wait (timeout=0) at ../util/main-loop.c:320
15
#11 main_loop_wait (nonblocking=nonblocking@entry=0) at ../util/main-loop.c:596
16
#12 0x0000aaaaab5c9e50 in qemu_main_loop () at ../softmmu/runstate.c:734
17
#13 0x0000aaaaab185370 in qemu_main (argc=argc@entry=47, argv=argv@entry=0xfffffffff518, envp=envp@entry=0x0) at ../softmmu/main.c:38
18
#14 0x0000aaaaab16f99c in main (argc=47, argv=0xfffffffff518) at ../softmmu/main.c:47
19
20
Fixes: ebb62075021a ("hw/acpi: Add ACPI Generic Event Device Support")
21
Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
22
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
23
Message-id: 20220816094957.31700-1-zhukeqian1@huawei.com
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
26
hw/acpi/generic_event_device.c | 8 ++++++++
27
1 file changed, 8 insertions(+)
28
29
diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/acpi/generic_event_device.c
32
+++ b/hw/acpi/generic_event_device.c
33
@@ -XXX,XX +XXX,XX @@ static void acpi_ged_unplug_cb(HotplugHandler *hotplug_dev,
34
}
35
}
36
37
+static void acpi_ged_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list)
38
+{
39
+ AcpiGedState *s = ACPI_GED(adev);
40
+
41
+ acpi_memory_ospm_status(&s->memhp_state, list);
42
+}
43
+
44
static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
45
{
46
AcpiGedState *s = ACPI_GED(adev);
47
@@ -XXX,XX +XXX,XX @@ static void acpi_ged_class_init(ObjectClass *class, void *data)
48
hc->unplug_request = acpi_ged_unplug_request_cb;
49
hc->unplug = acpi_ged_unplug_cb;
50
51
+ adevc->ospm_status = acpi_ged_ospm_status;
52
adevc->send_event = acpi_ged_send_event;
53
}
54
55
--
56
2.25.1
diff view generated by jsdifflib
New patch
1
From: Lucas Dietrich <ld.adecy@gmail.com>
1
2
3
The LAN9118 allows the guest to specify a level for both the TX and
4
RX FIFOs at which an interrupt will be generated. We implement the
5
RSFL_INT interrupt for the RX FIFO but are missing the handling of
6
the equivalent TSFL_INT for the TX FIFO. Add the missing test to set
7
the interrupt if the TX FIFO has exceeded the guest-specified level.
8
9
This flag is required for Micrium lan911x ethernet driver to work.
10
11
Signed-off-by: Lucas Dietrich <ld.adecy@gmail.com>
12
[PMM: Tweaked commit message and comment]
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/net/lan9118.c | 8 ++++++++
17
1 file changed, 8 insertions(+)
18
19
diff --git a/hw/net/lan9118.c b/hw/net/lan9118.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/net/lan9118.c
22
+++ b/hw/net/lan9118.c
23
@@ -XXX,XX +XXX,XX @@ static void do_tx_packet(lan9118_state *s)
24
n = (s->tx_status_fifo_head + s->tx_status_fifo_used) & 511;
25
s->tx_status_fifo[n] = status;
26
s->tx_status_fifo_used++;
27
+
28
+ /*
29
+ * Generate TSFL interrupt if TX FIFO level exceeds the level
30
+ * specified in the FIFO_INT TX Status Level field.
31
+ */
32
+ if (s->tx_status_fifo_used > ((s->fifo_int >> 16) & 0xff)) {
33
+ s->int_sts |= TSFL_INT;
34
+ }
35
if (s->tx_status_fifo_used == 512) {
36
s->int_sts |= TSFF_INT;
37
/* TODO: Stop transmission. */
38
--
39
2.25.1
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
add MemTxAttrs as an argument to memory_region_access_valid().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
6
The callsite in flatview_access_valid() is part of a recursive
3
Replace '84' magic value by the X_MAX definition, and '1' by Y_MAX.
7
loop flatview_access_valid() -> memory_region_access_valid() ->
8
subpage_accepts() -> flatview_access_valid(); we make it pass
9
MEMTXATTRS_UNSPECIFIED for now, until the next several commits
10
have plumbed an attrs parameter through the rest of the loop
11
and we can add an attrs parameter to flatview_access_valid().
12
4
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
7
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20220819153931.3147384-2-peter.maydell@linaro.org
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Message-id: 20180521140402.23318-8-peter.maydell@linaro.org
17
---
10
---
18
include/exec/memory-internal.h | 3 ++-
11
chardev/baum.c | 11 +++++++----
19
exec.c | 4 +++-
12
1 file changed, 7 insertions(+), 4 deletions(-)
20
hw/s390x/s390-pci-inst.c | 3 ++-
21
memory.c | 7 ++++---
22
4 files changed, 11 insertions(+), 6 deletions(-)
23
13
24
diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h
14
diff --git a/chardev/baum.c b/chardev/baum.c
25
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory-internal.h
16
--- a/chardev/baum.c
27
+++ b/include/exec/memory-internal.h
17
+++ b/chardev/baum.c
28
@@ -XXX,XX +XXX,XX @@ void flatview_unref(FlatView *view);
18
@@ -XXX,XX +XXX,XX @@
29
extern const MemoryRegionOps unassigned_mem_ops;
19
30
20
#define BUF_SIZE 256
31
bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,
21
32
- unsigned size, bool is_write);
22
+#define X_MAX 84
33
+ unsigned size, bool is_write,
23
+#define Y_MAX 1
34
+ MemTxAttrs attrs);
24
+
35
25
struct BaumChardev {
36
void flatview_add_to_dispatch(FlatView *fv, MemoryRegionSection *section);
26
Chardev parent;
37
AddressSpaceDispatch *address_space_dispatch_new(FlatView *fv);
27
38
diff --git a/exec.c b/exec.c
28
@@ -XXX,XX +XXX,XX @@ static int baum_deferred_init(BaumChardev *baum)
39
index XXXXXXX..XXXXXXX 100644
29
brlapi_perror("baum: brlapi__getDisplaySize");
40
--- a/exec.c
41
+++ b/exec.c
42
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
43
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
44
if (!memory_access_is_direct(mr, is_write)) {
45
l = memory_access_size(mr, l, addr);
46
- if (!memory_region_access_valid(mr, xlat, l, is_write)) {
47
+ /* When our callers all have attrs we'll pass them through here */
48
+ if (!memory_region_access_valid(mr, xlat, l, is_write,
49
+ MEMTXATTRS_UNSPECIFIED)) {
50
return false;
51
}
52
}
53
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/s390x/s390-pci-inst.c
56
+++ b/hw/s390x/s390-pci-inst.c
57
@@ -XXX,XX +XXX,XX @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr,
58
mr = s390_get_subregion(mr, offset, len);
59
offset -= mr->addr;
60
61
- if (!memory_region_access_valid(mr, offset, len, true)) {
62
+ if (!memory_region_access_valid(mr, offset, len, true,
63
+ MEMTXATTRS_UNSPECIFIED)) {
64
s390_program_interrupt(env, PGM_OPERAND, 6, ra);
65
return 0;
30
return 0;
66
}
31
}
67
diff --git a/memory.c b/memory.c
32
- if (baum->y > 1) {
68
index XXXXXXX..XXXXXXX 100644
33
- baum->y = 1;
69
--- a/memory.c
34
+ if (baum->y > Y_MAX) {
70
+++ b/memory.c
35
+ baum->y = Y_MAX;
71
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps ram_device_mem_ops = {
72
bool memory_region_access_valid(MemoryRegion *mr,
73
hwaddr addr,
74
unsigned size,
75
- bool is_write)
76
+ bool is_write,
77
+ MemTxAttrs attrs)
78
{
79
int access_size_min, access_size_max;
80
int access_size, i;
81
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_read(MemoryRegion *mr,
82
{
83
MemTxResult r;
84
85
- if (!memory_region_access_valid(mr, addr, size, false)) {
86
+ if (!memory_region_access_valid(mr, addr, size, false, attrs)) {
87
*pval = unassigned_mem_read(mr, addr, size);
88
return MEMTX_DECODE_ERROR;
89
}
36
}
90
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_write(MemoryRegion *mr,
37
- if (baum->x > 84) {
91
unsigned size,
38
- baum->x = 84;
92
MemTxAttrs attrs)
39
+ if (baum->x > X_MAX) {
93
{
40
+ baum->x = X_MAX;
94
- if (!memory_region_access_valid(mr, addr, size, true)) {
95
+ if (!memory_region_access_valid(mr, addr, size, true, attrs)) {
96
unassigned_mem_write(mr, addr, data, size);
97
return MEMTX_DECODE_ERROR;
98
}
41
}
42
43
con = qemu_console_lookup_by_index(0);
99
--
44
--
100
2.17.1
45
2.25.1
101
46
102
47
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
We know 'x * y' will be at most 'X_MAX * Y_MAX' (which is not
4
a big value, it is actually 84). Instead of having the compiler
5
use variable-length array, declare an array able to hold the
6
maximum 'x * y'.
7
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
10
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Message-id: 20220819153931.3147384-3-peter.maydell@linaro.org
13
---
14
chardev/baum.c | 8 ++++----
15
1 file changed, 4 insertions(+), 4 deletions(-)
16
17
diff --git a/chardev/baum.c b/chardev/baum.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/chardev/baum.c
20
+++ b/chardev/baum.c
21
@@ -XXX,XX +XXX,XX @@ static int baum_eat_packet(BaumChardev *baum, const uint8_t *buf, int len)
22
switch (req) {
23
case BAUM_REQ_DisplayData:
24
{
25
- uint8_t cells[baum->x * baum->y], c;
26
- uint8_t text[baum->x * baum->y];
27
- uint8_t zero[baum->x * baum->y];
28
+ uint8_t cells[X_MAX * Y_MAX], c;
29
+ uint8_t text[X_MAX * Y_MAX];
30
+ uint8_t zero[X_MAX * Y_MAX];
31
int cursor = BRLAPI_CURSOR_OFF;
32
int i;
33
34
@@ -XXX,XX +XXX,XX @@ static int baum_eat_packet(BaumChardev *baum, const uint8_t *buf, int len)
35
}
36
timer_del(baum->cellCount_timer);
37
38
- memset(zero, 0, sizeof(zero));
39
+ memset(zero, 0, baum->x * baum->y);
40
41
brlapi_writeArguments_t wa = {
42
.displayNumber = BRLAPI_DISPLAY_DEFAULT,
43
--
44
2.25.1
45
46
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
Use autofree heap allocation instead of variable-length
4
array on the stack.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
8
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Message-id: 20220819153931.3147384-4-peter.maydell@linaro.org
11
---
12
chardev/baum.c | 3 ++-
13
1 file changed, 2 insertions(+), 1 deletion(-)
14
15
diff --git a/chardev/baum.c b/chardev/baum.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/chardev/baum.c
18
+++ b/chardev/baum.c
19
@@ -XXX,XX +XXX,XX @@ static void baum_chr_accept_input(struct Chardev *chr)
20
static void baum_write_packet(BaumChardev *baum, const uint8_t *buf, int len)
21
{
22
Chardev *chr = CHARDEV(baum);
23
- uint8_t io_buf[1 + 2 * len], *cur = io_buf;
24
+ g_autofree uint8_t *io_buf = g_malloc(1 + 2 * len);
25
+ uint8_t *cur = io_buf;
26
int room;
27
*cur++ = ESC;
28
while (len--)
29
--
30
2.25.1
31
32
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
The combined_key[... QIO_CHANNEL_WEBSOCK_GUID_LEN ...] array in
4
qio_channel_websock_handshake_send_res_ok() expands to a call
5
to strlen(QIO_CHANNEL_WEBSOCK_GUID), and the compiler doesn't
6
realize the string is const, so consider combined_key[] being
7
a variable-length array.
8
9
To remove the variable-length array, we provide it a hint to
10
the compiler by using sizeof() - 1 instead of strlen().
11
12
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Message-id: 20220819153931.3147384-5-peter.maydell@linaro.org
16
---
17
io/channel-websock.c | 2 +-
18
1 file changed, 1 insertion(+), 1 deletion(-)
19
20
diff --git a/io/channel-websock.c b/io/channel-websock.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/io/channel-websock.c
23
+++ b/io/channel-websock.c
24
@@ -XXX,XX +XXX,XX @@
25
26
#define QIO_CHANNEL_WEBSOCK_CLIENT_KEY_LEN 24
27
#define QIO_CHANNEL_WEBSOCK_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
28
-#define QIO_CHANNEL_WEBSOCK_GUID_LEN strlen(QIO_CHANNEL_WEBSOCK_GUID)
29
+#define QIO_CHANNEL_WEBSOCK_GUID_LEN (sizeof(QIO_CHANNEL_WEBSOCK_GUID) - 1)
30
31
#define QIO_CHANNEL_WEBSOCK_HEADER_PROTOCOL "sec-websocket-protocol"
32
#define QIO_CHANNEL_WEBSOCK_HEADER_VERSION "sec-websocket-version"
33
--
34
2.25.1
35
36
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
add MemTxAttrs as an argument to the MemoryRegion valid.accepts
3
callback. We'll need this for subpage_accepts().
4
2
5
We could take the approach we used with the read and write
3
The compiler isn't clever enough to figure 'min_buf_size'
6
callbacks and add new a new _with_attrs version, but since there
4
is a constant, so help it by using a definitions instead.
7
are so few implementations of the accepts hook we just change
8
them all.
9
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Acked-by: Jason Wang <jasowang@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Message-id: 20220819153931.3147384-6-peter.maydell@linaro.org
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20180521140402.23318-9-peter.maydell@linaro.org
14
---
11
---
15
include/exec/memory.h | 3 ++-
12
hw/net/e1000e_core.c | 7 ++++---
16
exec.c | 9 ++++++---
13
1 file changed, 4 insertions(+), 3 deletions(-)
17
hw/hppa/dino.c | 3 ++-
18
hw/nvram/fw_cfg.c | 12 ++++++++----
19
hw/scsi/esp.c | 3 ++-
20
hw/xen/xen_pt_msi.c | 3 ++-
21
memory.c | 5 +++--
22
7 files changed, 25 insertions(+), 13 deletions(-)
23
14
24
diff --git a/include/exec/memory.h b/include/exec/memory.h
15
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
25
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory.h
17
--- a/hw/net/e1000e_core.c
27
+++ b/include/exec/memory.h
18
+++ b/hw/net/e1000e_core.c
28
@@ -XXX,XX +XXX,XX @@ struct MemoryRegionOps {
19
@@ -XXX,XX +XXX,XX @@ e1000e_rx_fix_l4_csum(E1000ECore *core, struct NetRxPkt *pkt)
29
* as a machine check exception).
20
}
30
*/
31
bool (*accepts)(void *opaque, hwaddr addr,
32
- unsigned size, bool is_write);
33
+ unsigned size, bool is_write,
34
+ MemTxAttrs attrs);
35
} valid;
36
/* Internal implementation constraints: */
37
struct {
38
diff --git a/exec.c b/exec.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/exec.c
41
+++ b/exec.c
42
@@ -XXX,XX +XXX,XX @@ static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
43
}
21
}
44
22
45
static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
23
+/* Min. octets in an ethernet frame sans FCS */
46
- unsigned size, bool is_write)
24
+#define MIN_BUF_SIZE 60
47
+ unsigned size, bool is_write,
25
+
48
+ MemTxAttrs attrs)
26
ssize_t
27
e1000e_receive_iov(E1000ECore *core, const struct iovec *iov, int iovcnt)
49
{
28
{
50
return is_write;
29
static const int maximum_ethernet_hdr_len = (14 + 4);
51
}
30
- /* Min. octets in an ethernet frame sans FCS */
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult subpage_write(void *opaque, hwaddr addr,
31
- static const int min_buf_size = 60;
53
}
32
54
33
uint32_t n = 0;
55
static bool subpage_accepts(void *opaque, hwaddr addr,
34
- uint8_t min_buf[min_buf_size];
56
- unsigned len, bool is_write)
35
+ uint8_t min_buf[MIN_BUF_SIZE];
57
+ unsigned len, bool is_write,
36
struct iovec min_iov;
58
+ MemTxAttrs attrs)
37
uint8_t *filter_buf;
59
{
38
size_t size, orig_size;
60
subpage_t *subpage = opaque;
61
#if defined(DEBUG_SUBPAGE)
62
@@ -XXX,XX +XXX,XX @@ static void readonly_mem_write(void *opaque, hwaddr addr,
63
}
64
65
static bool readonly_mem_accepts(void *opaque, hwaddr addr,
66
- unsigned size, bool is_write)
67
+ unsigned size, bool is_write,
68
+ MemTxAttrs attrs)
69
{
70
return is_write;
71
}
72
diff --git a/hw/hppa/dino.c b/hw/hppa/dino.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/hppa/dino.c
75
+++ b/hw/hppa/dino.c
76
@@ -XXX,XX +XXX,XX @@ static void gsc_to_pci_forwarding(DinoState *s)
77
}
78
79
static bool dino_chip_mem_valid(void *opaque, hwaddr addr,
80
- unsigned size, bool is_write)
81
+ unsigned size, bool is_write,
82
+ MemTxAttrs attrs)
83
{
84
switch (addr) {
85
case DINO_IAR0:
86
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/nvram/fw_cfg.c
89
+++ b/hw/nvram/fw_cfg.c
90
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_dma_mem_write(void *opaque, hwaddr addr,
91
}
92
93
static bool fw_cfg_dma_mem_valid(void *opaque, hwaddr addr,
94
- unsigned size, bool is_write)
95
+ unsigned size, bool is_write,
96
+ MemTxAttrs attrs)
97
{
98
return !is_write || ((size == 4 && (addr == 0 || addr == 4)) ||
99
(size == 8 && addr == 0));
100
}
101
102
static bool fw_cfg_data_mem_valid(void *opaque, hwaddr addr,
103
- unsigned size, bool is_write)
104
+ unsigned size, bool is_write,
105
+ MemTxAttrs attrs)
106
{
107
return addr == 0;
108
}
109
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_ctl_mem_write(void *opaque, hwaddr addr,
110
}
111
112
static bool fw_cfg_ctl_mem_valid(void *opaque, hwaddr addr,
113
- unsigned size, bool is_write)
114
+ unsigned size, bool is_write,
115
+ MemTxAttrs attrs)
116
{
117
return is_write && size == 2;
118
}
119
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_comb_write(void *opaque, hwaddr addr,
120
}
121
122
static bool fw_cfg_comb_valid(void *opaque, hwaddr addr,
123
- unsigned size, bool is_write)
124
+ unsigned size, bool is_write,
125
+ MemTxAttrs attrs)
126
{
127
return (size == 1) || (is_write && size == 2);
128
}
129
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
130
index XXXXXXX..XXXXXXX 100644
131
--- a/hw/scsi/esp.c
132
+++ b/hw/scsi/esp.c
133
@@ -XXX,XX +XXX,XX @@ void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val)
134
}
135
136
static bool esp_mem_accepts(void *opaque, hwaddr addr,
137
- unsigned size, bool is_write)
138
+ unsigned size, bool is_write,
139
+ MemTxAttrs attrs)
140
{
141
return (size == 1) || (is_write && size == 4);
142
}
143
diff --git a/hw/xen/xen_pt_msi.c b/hw/xen/xen_pt_msi.c
144
index XXXXXXX..XXXXXXX 100644
145
--- a/hw/xen/xen_pt_msi.c
146
+++ b/hw/xen/xen_pt_msi.c
147
@@ -XXX,XX +XXX,XX @@ static uint64_t pci_msix_read(void *opaque, hwaddr addr,
148
}
149
150
static bool pci_msix_accepts(void *opaque, hwaddr addr,
151
- unsigned size, bool is_write)
152
+ unsigned size, bool is_write,
153
+ MemTxAttrs attrs)
154
{
155
return !(addr & (size - 1));
156
}
157
diff --git a/memory.c b/memory.c
158
index XXXXXXX..XXXXXXX 100644
159
--- a/memory.c
160
+++ b/memory.c
161
@@ -XXX,XX +XXX,XX @@ static void unassigned_mem_write(void *opaque, hwaddr addr,
162
}
163
164
static bool unassigned_mem_accepts(void *opaque, hwaddr addr,
165
- unsigned size, bool is_write)
166
+ unsigned size, bool is_write,
167
+ MemTxAttrs attrs)
168
{
169
return false;
170
}
171
@@ -XXX,XX +XXX,XX @@ bool memory_region_access_valid(MemoryRegion *mr,
172
access_size = MAX(MIN(size, access_size_max), access_size_min);
173
for (i = 0; i < size; i += access_size) {
174
if (!mr->ops->valid.accepts(mr->opaque, addr + i, access_size,
175
- is_write)) {
176
+ is_write, attrs)) {
177
return false;
178
}
179
}
180
--
39
--
181
2.17.1
40
2.25.1
182
41
183
42
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
add MemTxAttrs as an argument to flatview_access_valid().
3
Its callers now all have an attrs value to hand, so we can
4
correct our earlier temporary use of MEMTXATTRS_UNSPECIFIED.
5
2
3
Use autofree heap allocation instead of variable-length
4
array on the stack.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Acked-by: David Gibson <david@gibson.dropbear.id.au>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
9
Message-id: 20180521140402.23318-10-peter.maydell@linaro.org
11
Message-id: 20220819153931.3147384-7-peter.maydell@linaro.org
10
---
12
---
11
exec.c | 12 +++++-------
13
hw/ppc/pnv.c | 4 ++--
12
1 file changed, 5 insertions(+), 7 deletions(-)
14
hw/ppc/spapr.c | 8 ++++----
15
hw/ppc/spapr_pci_nvlink2.c | 2 +-
16
3 files changed, 7 insertions(+), 7 deletions(-)
13
17
14
diff --git a/exec.c b/exec.c
18
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
15
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
20
--- a/hw/ppc/pnv.c
17
+++ b/exec.c
21
+++ b/hw/ppc/pnv.c
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
22
@@ -XXX,XX +XXX,XX @@ static void pnv_dt_core(PnvChip *chip, PnvCore *pc, void *fdt)
19
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
23
int smt_threads = CPU_CORE(pc)->nr_threads;
20
const uint8_t *buf, int len);
24
CPUPPCState *env = &cpu->env;
21
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
25
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
22
- bool is_write);
26
- uint32_t servers_prop[smt_threads];
23
+ bool is_write, MemTxAttrs attrs);
27
+ g_autofree uint32_t *servers_prop = g_new(uint32_t, smt_threads);
24
28
int i;
25
static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,
29
uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
26
unsigned len, MemTxAttrs attrs)
30
0xffffffff, 0xffffffff};
27
@@ -XXX,XX +XXX,XX @@ static bool subpage_accepts(void *opaque, hwaddr addr,
31
@@ -XXX,XX +XXX,XX @@ static void pnv_dt_core(PnvChip *chip, PnvCore *pc, void *fdt)
28
#endif
32
servers_prop[i] = cpu_to_be32(pc->pir + i);
29
33
}
30
return flatview_access_valid(subpage->fv, addr + subpage->base,
34
_FDT((fdt_setprop(fdt, offset, "ibm,ppc-interrupt-server#s",
31
- len, is_write);
35
- servers_prop, sizeof(servers_prop))));
32
+ len, is_write, attrs);
36
+ servers_prop, sizeof(*servers_prop) * smt_threads)));
33
}
37
}
34
38
35
static const MemoryRegionOps subpage_ops = {
39
static void pnv_dt_icp(PnvChip *chip, void *fdt, uint32_t pir,
36
@@ -XXX,XX +XXX,XX @@ static void cpu_notify_map_clients(void)
40
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/ppc/spapr.c
43
+++ b/hw/ppc/spapr.c
44
@@ -XXX,XX +XXX,XX @@ static int spapr_fixup_cpu_smt_dt(void *fdt, int offset, PowerPCCPU *cpu,
45
int smt_threads)
46
{
47
int i, ret = 0;
48
- uint32_t servers_prop[smt_threads];
49
- uint32_t gservers_prop[smt_threads * 2];
50
+ g_autofree uint32_t *servers_prop = g_new(uint32_t, smt_threads);
51
+ g_autofree uint32_t *gservers_prop = g_new(uint32_t, smt_threads * 2);
52
int index = spapr_get_vcpu_id(cpu);
53
54
if (cpu->compat_pvr) {
55
@@ -XXX,XX +XXX,XX @@ static int spapr_fixup_cpu_smt_dt(void *fdt, int offset, PowerPCCPU *cpu,
56
gservers_prop[i*2 + 1] = 0;
57
}
58
ret = fdt_setprop(fdt, offset, "ibm,ppc-interrupt-server#s",
59
- servers_prop, sizeof(servers_prop));
60
+ servers_prop, sizeof(*servers_prop) * smt_threads);
61
if (ret < 0) {
62
return ret;
63
}
64
ret = fdt_setprop(fdt, offset, "ibm,ppc-interrupt-gserver#s",
65
- gservers_prop, sizeof(gservers_prop));
66
+ gservers_prop, sizeof(*gservers_prop) * smt_threads * 2);
67
68
return ret;
37
}
69
}
38
70
diff --git a/hw/ppc/spapr_pci_nvlink2.c b/hw/ppc/spapr_pci_nvlink2.c
39
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
71
index XXXXXXX..XXXXXXX 100644
40
- bool is_write)
72
--- a/hw/ppc/spapr_pci_nvlink2.c
41
+ bool is_write, MemTxAttrs attrs)
73
+++ b/hw/ppc/spapr_pci_nvlink2.c
42
{
74
@@ -XXX,XX +XXX,XX @@ void spapr_phb_nvgpu_populate_pcidev_dt(PCIDevice *dev, void *fdt, int offset,
43
MemoryRegion *mr;
75
continue;
44
hwaddr l, xlat;
45
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
46
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
47
if (!memory_access_is_direct(mr, is_write)) {
48
l = memory_access_size(mr, l, addr);
49
- /* When our callers all have attrs we'll pass them through here */
50
- if (!memory_region_access_valid(mr, xlat, l, is_write,
51
- MEMTXATTRS_UNSPECIFIED)) {
52
+ if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
53
return false;
54
}
55
}
76
}
56
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
77
if (dev == nvslot->gpdev) {
57
78
- uint32_t npus[nvslot->linknum];
58
rcu_read_lock();
79
+ g_autofree uint32_t *npus = g_new(uint32_t, nvslot->linknum);
59
fv = address_space_to_flatview(as);
80
60
- result = flatview_access_valid(fv, addr, len, is_write);
81
for (j = 0; j < nvslot->linknum; ++j) {
61
+ result = flatview_access_valid(fv, addr, len, is_write, attrs);
82
PCIDevice *npdev = nvslot->links[j].npdev;
62
rcu_read_unlock();
63
return result;
64
}
65
--
83
--
66
2.17.1
84
2.25.1
67
85
68
86
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
Use autofree heap allocation instead of variable-length
4
array on the stack.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Acked-by: David Gibson <david@gibson.dropbear.id.au>
8
Reviewed-by: Greg Kurz <groug@kaod.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Message-id: 20220819153931.3147384-8-peter.maydell@linaro.org
11
---
12
hw/intc/xics.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/intc/xics.c
18
+++ b/hw/intc/xics.c
19
@@ -XXX,XX +XXX,XX @@ static void ics_reset_irq(ICSIRQState *irq)
20
static void ics_reset(DeviceState *dev)
21
{
22
ICSState *ics = ICS(dev);
23
+ g_autofree uint8_t *flags = g_malloc(ics->nr_irqs);
24
int i;
25
- uint8_t flags[ics->nr_irqs];
26
27
for (i = 0; i < ics->nr_irqs; i++) {
28
flags[i] = ics->irqs[i].flags;
29
--
30
2.25.1
31
32
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
add MemTxAttrs as an argument to address_space_map().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Use autofree heap allocation instead of variable-length array on
4
the stack. Replace the snprintf() call by g_strdup_printf().
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20220819153931.3147384-9-peter.maydell@linaro.org
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-5-peter.maydell@linaro.org
10
---
10
---
11
include/exec/memory.h | 3 ++-
11
hw/i386/multiboot.c | 5 ++---
12
include/sysemu/dma.h | 3 ++-
12
1 file changed, 2 insertions(+), 3 deletions(-)
13
exec.c | 6 ++++--
14
target/ppc/mmu-hash64.c | 3 ++-
15
4 files changed, 10 insertions(+), 5 deletions(-)
16
13
17
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/hw/i386/multiboot.c b/hw/i386/multiboot.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/memory.h
16
--- a/hw/i386/multiboot.c
20
+++ b/include/exec/memory.h
17
+++ b/hw/i386/multiboot.c
21
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_
18
@@ -XXX,XX +XXX,XX @@ int load_multiboot(X86MachineState *x86ms,
22
* @addr: address within that address space
19
uint8_t *mb_bootinfo_data;
23
* @plen: pointer to length of buffer; updated on return
20
uint32_t cmdline_len;
24
* @is_write: indicates the transfer direction
21
GList *mods = NULL;
25
+ * @attrs: memory attributes
22
+ g_autofree char *kcmdline = NULL;
26
*/
23
27
void *address_space_map(AddressSpace *as, hwaddr addr,
24
/* Ok, let's see if it is a multiboot image.
28
- hwaddr *plen, bool is_write);
25
The header is 12x32bit long, so the latest entry may be 8192 - 48. */
29
+ hwaddr *plen, bool is_write, MemTxAttrs attrs);
26
@@ -XXX,XX +XXX,XX @@ int load_multiboot(X86MachineState *x86ms,
30
31
/* address_space_unmap: Unmaps a memory region previously mapped by address_space_map()
32
*
33
diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
34
index XXXXXXX..XXXXXXX 100644
35
--- a/include/sysemu/dma.h
36
+++ b/include/sysemu/dma.h
37
@@ -XXX,XX +XXX,XX @@ static inline void *dma_memory_map(AddressSpace *as,
38
hwaddr xlen = *len;
39
void *p;
40
41
- p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE);
42
+ p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE,
43
+ MEMTXATTRS_UNSPECIFIED);
44
*len = xlen;
45
return p;
46
}
47
diff --git a/exec.c b/exec.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/exec.c
50
+++ b/exec.c
51
@@ -XXX,XX +XXX,XX @@ flatview_extend_translation(FlatView *fv, hwaddr addr,
52
void *address_space_map(AddressSpace *as,
53
hwaddr addr,
54
hwaddr *plen,
55
- bool is_write)
56
+ bool is_write,
57
+ MemTxAttrs attrs)
58
{
59
hwaddr len = *plen;
60
hwaddr l, xlat;
61
@@ -XXX,XX +XXX,XX @@ void *cpu_physical_memory_map(hwaddr addr,
62
hwaddr *plen,
63
int is_write)
64
{
65
- return address_space_map(&address_space_memory, addr, plen, is_write);
66
+ return address_space_map(&address_space_memory, addr, plen, is_write,
67
+ MEMTXATTRS_UNSPECIFIED);
68
}
69
70
void cpu_physical_memory_unmap(void *buffer, hwaddr len,
71
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/ppc/mmu-hash64.c
74
+++ b/target/ppc/mmu-hash64.c
75
@@ -XXX,XX +XXX,XX @@ const ppc_hash_pte64_t *ppc_hash64_map_hptes(PowerPCCPU *cpu,
76
return NULL;
77
}
27
}
78
28
79
- hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false);
29
/* Commandline support */
80
+ hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false,
30
- char kcmdline[strlen(kernel_filename) + strlen(kernel_cmdline) + 2];
81
+ MEMTXATTRS_UNSPECIFIED);
31
- snprintf(kcmdline, sizeof(kcmdline), "%s %s",
82
if (plen < (n * HASH_PTE_SIZE_64)) {
32
- kernel_filename, kernel_cmdline);
83
hw_error("%s: Unable to map all requested HPTEs\n", __func__);
33
+ kcmdline = g_strdup_printf("%s %s", kernel_filename, kernel_cmdline);
84
}
34
stl_p(bootinfo + MBI_CMDLINE, mb_add_cmdline(&mbs, kcmdline));
35
36
stl_p(bootinfo + MBI_BOOTLOADER, mb_add_bootloader(&mbs, bootloader_name));
85
--
37
--
86
2.17.1
38
2.25.1
87
39
88
40
diff view generated by jsdifflib
1
In commit f0aff255700 we made cpacr_write() enforce that some CPACR
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
bits are RAZ/WI and some are RAO/WI for ARMv7 cores. Unfortunately
3
we forgot to also update the register's reset value. The effect
4
was that (a) a guest that read CPACR on reset would not see ones in
5
the RAO bits, and (b) if you did a migration before the guest did
6
a write to the CPACR then the migration would fail because the
7
destination would enforce the RAO bits and then complain that they
8
didn't match the zero value from the source.
9
2
10
Implement reset for the CPACR using a custom reset function
3
The compiler isn't clever enough to figure 'width' is a constant,
11
that just calls cpacr_write(), to avoid having to duplicate
4
so help it by using a definitions instead.
12
the logic for which bits are RAO.
13
5
14
This bug would affect migration for TCG CPUs which are ARMv7
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
with VFP but without one of Neon or VFPv3.
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220819153931.3147384-10-peter.maydell@linaro.org
10
---
11
hw/usb/hcd-ohci.c | 7 ++++---
12
1 file changed, 4 insertions(+), 3 deletions(-)
16
13
17
Reported-by: Cédric Le Goater <clg@kaod.org>
14
diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Tested-by: Cédric Le Goater <clg@kaod.org>
20
Message-id: 20180522173713.26282-1-peter.maydell@linaro.org
21
---
22
target/arm/helper.c | 10 +++++++++-
23
1 file changed, 9 insertions(+), 1 deletion(-)
24
25
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/helper.c
16
--- a/hw/usb/hcd-ohci.c
28
+++ b/target/arm/helper.c
17
+++ b/hw/usb/hcd-ohci.c
29
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
18
@@ -XXX,XX +XXX,XX @@ static int ohci_service_iso_td(OHCIState *ohci, struct ohci_ed *ed)
30
env->cp15.cpacr_el1 = value;
19
return 1;
31
}
20
}
32
21
33
+static void cpacr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
22
+#define HEX_CHAR_PER_LINE 16
34
+{
35
+ /* Call cpacr_write() so that we reset with the correct RAO bits set
36
+ * for our CPU features.
37
+ */
38
+ cpacr_write(env, ri, 0);
39
+}
40
+
23
+
41
static CPAccessResult cpacr_access(CPUARMState *env, const ARMCPRegInfo *ri,
24
static void ohci_td_pkt(const char *msg, const uint8_t *buf, size_t len)
42
bool isread)
43
{
25
{
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
26
bool print16;
45
{ .name = "CPACR", .state = ARM_CP_STATE_BOTH, .opc0 = 3,
27
bool printall;
46
.crn = 1, .crm = 0, .opc1 = 0, .opc2 = 2, .accessfn = cpacr_access,
28
- const int width = 16;
47
.access = PL1_RW, .fieldoffset = offsetof(CPUARMState, cp15.cpacr_el1),
29
int i;
48
- .resetvalue = 0, .writefn = cpacr_write },
30
- char tmp[3 * width + 1];
49
+ .resetfn = cpacr_reset, .writefn = cpacr_write },
31
+ char tmp[3 * HEX_CHAR_PER_LINE + 1];
50
REGINFO_SENTINEL
32
char *p = tmp;
51
};
33
52
34
print16 = !!trace_event_get_state_backends(TRACE_USB_OHCI_TD_PKT_SHORT);
35
@@ -XXX,XX +XXX,XX @@ static void ohci_td_pkt(const char *msg, const uint8_t *buf, size_t len)
36
}
37
38
for (i = 0; ; i++) {
39
- if (i && (!(i % width) || (i == len))) {
40
+ if (i && (!(i % HEX_CHAR_PER_LINE) || (i == len))) {
41
if (!printall) {
42
trace_usb_ohci_td_pkt_short(msg, tmp);
43
break;
53
--
44
--
54
2.17.1
45
2.25.1
55
46
56
47
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
Use autofree heap allocation instead of variable-length
4
array on the stack.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220819153931.3147384-11-peter.maydell@linaro.org
10
---
11
ui/curses.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/ui/curses.c b/ui/curses.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/ui/curses.c
17
+++ b/ui/curses.c
18
@@ -XXX,XX +XXX,XX @@ static void curses_update(DisplayChangeListener *dcl,
19
int x, int y, int w, int h)
20
{
21
console_ch_t *line;
22
- cchar_t curses_line[width];
23
+ g_autofree cchar_t *curses_line = g_new(cchar_t, width);
24
wchar_t wch[CCHARW_MAX];
25
attr_t attrs;
26
short colors;
27
--
28
2.25.1
29
30
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
Use autofree heap allocation instead of variable-length
4
array on the stack.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220819153931.3147384-12-peter.maydell@linaro.org
10
---
11
tests/unit/test-vmstate.c | 7 +++----
12
1 file changed, 3 insertions(+), 4 deletions(-)
13
14
diff --git a/tests/unit/test-vmstate.c b/tests/unit/test-vmstate.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/tests/unit/test-vmstate.c
17
+++ b/tests/unit/test-vmstate.c
18
@@ -XXX,XX +XXX,XX @@ static void save_buffer(const uint8_t *buf, size_t buf_size)
19
static void compare_vmstate(const uint8_t *wire, size_t size)
20
{
21
QEMUFile *f = open_test_file(false);
22
- uint8_t result[size];
23
+ g_autofree uint8_t *result = g_malloc(size);
24
25
/* read back as binary */
26
27
- g_assert_cmpint(qemu_get_buffer(f, result, sizeof(result)), ==,
28
- sizeof(result));
29
+ g_assert_cmpint(qemu_get_buffer(f, result, size), ==, size);
30
g_assert(!qemu_file_get_error(f));
31
32
/* Compare that what is on the file is the same that what we
33
expected to be there */
34
- SUCCESS(memcmp(result, wire, sizeof(result)));
35
+ SUCCESS(memcmp(result, wire, size));
36
37
/* Must reach EOF */
38
qemu_get_byte(f);
39
--
40
2.25.1
41
42
diff view generated by jsdifflib
1
Provide a VMSTATE_BOOL_SUB_ARRAY to go with VMSTATE_UINT8_SUB_ARRAY
1
Shellcheck correctly reports that we set python_version and never use
2
and friends.
2
it. This is a leftover from commit f9332757898a7: we used to use
3
python_version purely to as part of the summary information printed
4
at the end of a configure run, and that commit changed to printing
5
the information from meson (which looks up the python version
6
itself). Remove the unused variable.
3
7
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
6
Message-id: 20180521140402.23318-23-peter.maydell@linaro.org
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20220825150703.4074125-2-peter.maydell@linaro.org
7
---
12
---
8
include/migration/vmstate.h | 3 +++
13
configure | 3 ---
9
1 file changed, 3 insertions(+)
14
1 file changed, 3 deletions(-)
10
15
11
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
16
diff --git a/configure b/configure
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100755
13
--- a/include/migration/vmstate.h
18
--- a/configure
14
+++ b/include/migration/vmstate.h
19
+++ b/configure
15
@@ -XXX,XX +XXX,XX @@ extern const VMStateInfo vmstate_info_qtailq;
20
@@ -XXX,XX +XXX,XX @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
16
#define VMSTATE_BOOL_ARRAY(_f, _s, _n) \
21
"Use --python=/path/to/python to specify a supported Python."
17
VMSTATE_BOOL_ARRAY_V(_f, _s, _n, 0)
22
fi
18
23
19
+#define VMSTATE_BOOL_SUB_ARRAY(_f, _s, _start, _num) \
24
-# Preserve python version since some functionality is dependent on it
20
+ VMSTATE_SUB_ARRAY(_f, _s, _start, _num, 0, vmstate_info_bool, bool)
25
-python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
21
+
26
-
22
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v) \
27
# Suppress writing compiled files
23
VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
28
python="$python -B"
24
29
25
--
30
--
26
2.17.1
31
2.25.1
27
32
28
33
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
The meson_args variable was added in commit 3b4da13293482134b, but
2
add MemTxAttrs as an argument to flatview_do_translate().
2
was not used in that commit and isn't used today. Delete the
3
unnecessary assignment.
3
4
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20180521140402.23318-13-peter.maydell@linaro.org
8
Message-id: 20220825150703.4074125-3-peter.maydell@linaro.org
8
---
9
---
9
exec.c | 9 ++++++---
10
configure | 1 -
10
1 file changed, 6 insertions(+), 3 deletions(-)
11
1 file changed, 1 deletion(-)
11
12
12
diff --git a/exec.c b/exec.c
13
diff --git a/configure b/configure
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100755
14
--- a/exec.c
15
--- a/configure
15
+++ b/exec.c
16
+++ b/configure
16
@@ -XXX,XX +XXX,XX @@ unassigned:
17
@@ -XXX,XX +XXX,XX @@ pie=""
17
* @is_write: whether the translation operation is for write
18
coroutine=""
18
* @is_mmio: whether this can be MMIO, set true if it can
19
plugins="$default_feature"
19
* @target_as: the address space targeted by the IOMMU
20
meson=""
20
+ * @attrs: memory transaction attributes
21
-meson_args=""
21
*
22
ninja=""
22
* This function is called from RCU critical section
23
bindir="bin"
23
*/
24
skip_meson=no
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
25
hwaddr *page_mask_out,
26
bool is_write,
27
bool is_mmio,
28
- AddressSpace **target_as)
29
+ AddressSpace **target_as,
30
+ MemTxAttrs attrs)
31
{
32
MemoryRegionSection *section;
33
IOMMUMemoryRegion *iommu_mr;
34
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
35
* but page mask.
36
*/
37
section = flatview_do_translate(address_space_to_flatview(as), addr, &xlat,
38
- NULL, &page_mask, is_write, false, &as);
39
+ NULL, &page_mask, is_write, false, &as,
40
+ attrs);
41
42
/* Illegal translation */
43
if (section.mr == &io_mem_unassigned) {
44
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
45
46
/* This can be MMIO, so setup MMIO bit. */
47
section = flatview_do_translate(fv, addr, xlat, plen, NULL,
48
- is_write, true, &as);
49
+ is_write, true, &as, attrs);
50
mr = section.mr;
51
52
if (xen_enabled() && memory_access_is_direct(mr, is_write)) {
53
--
25
--
54
2.17.1
26
2.25.1
55
27
56
28
diff view generated by jsdifflib
New patch
1
1
This commit adds quotes in some places which:
2
* are spotted by shellcheck
3
* are obviously incorrect
4
* are easy to fix just by adding the quotes
5
6
It doesn't attempt fix all of the places shellcheck finds errors,
7
or even all the ones which are easy to fix. It's just a random
8
sampling which is hopefully easy to review and which cuts
9
down the size of the problem for next time somebody wants to
10
try to look at shellcheck errors.
11
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20220825150703.4074125-4-peter.maydell@linaro.org
16
---
17
configure | 64 +++++++++++++++++++++++++++----------------------------
18
1 file changed, 32 insertions(+), 32 deletions(-)
19
20
diff --git a/configure b/configure
21
index XXXXXXX..XXXXXXX 100755
22
--- a/configure
23
+++ b/configure
24
@@ -XXX,XX +XXX,XX @@ GNUmakefile: ;
25
26
EOF
27
cd build
28
- exec $source_path/configure "$@"
29
+ exec "$source_path/configure" "$@"
30
fi
31
32
# Temporary directory used for files created while
33
@@ -XXX,XX +XXX,XX @@ meson_option_build_array() {
34
printf ']\n'
35
}
36
37
-. $source_path/scripts/meson-buildoptions.sh
38
+. "$source_path/scripts/meson-buildoptions.sh"
39
40
meson_options=
41
meson_option_add() {
42
@@ -XXX,XX +XXX,XX @@ for opt do
43
case "$opt" in
44
--help|-h) show_help=yes
45
;;
46
- --version|-V) exec cat $source_path/VERSION
47
+ --version|-V) exec cat "$source_path/VERSION"
48
;;
49
--prefix=*) prefix="$optarg"
50
;;
51
@@ -XXX,XX +XXX,XX @@ default_target_list=""
52
mak_wilds=""
53
54
if [ "$linux_user" != no ]; then
55
- if [ "$targetos" = linux ] && [ -d $source_path/linux-user/include/host/$cpu ]; then
56
+ if [ "$targetos" = linux ] && [ -d "$source_path/linux-user/include/host/$cpu" ]; then
57
linux_user=yes
58
elif [ "$linux_user" = yes ]; then
59
error_exit "linux-user not supported on this architecture"
60
@@ -XXX,XX +XXX,XX @@ if [ "$bsd_user" != no ]; then
61
if [ "$bsd_user" = "" ]; then
62
test $targetos = freebsd && bsd_user=yes
63
fi
64
- if [ "$bsd_user" = yes ] && ! [ -d $source_path/bsd-user/$targetos ]; then
65
+ if [ "$bsd_user" = yes ] && ! [ -d "$source_path/bsd-user/$targetos" ]; then
66
error_exit "bsd-user not supported on this host OS"
67
fi
68
fi
69
@@ -XXX,XX +XXX,XX @@ python="$python -B"
70
if test -z "$meson"; then
71
if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.59.3; then
72
meson=meson
73
- elif test $git_submodules_action != 'ignore' ; then
74
+ elif test "$git_submodules_action" != 'ignore' ; then
75
meson=git
76
elif test -e "${source_path}/meson/meson.py" ; then
77
meson=internal
78
@@ -XXX,XX +XXX,XX @@ esac
79
container="no"
80
if test $use_containers = "yes"; then
81
if has "docker" || has "podman"; then
82
- container=$($python $source_path/tests/docker/docker.py probe)
83
+ container=$($python "$source_path"/tests/docker/docker.py probe)
84
fi
85
fi
86
87
@@ -XXX,XX +XXX,XX @@ if test "$QEMU_GA_DISTRO" = ""; then
88
QEMU_GA_DISTRO=Linux
89
fi
90
if test "$QEMU_GA_VERSION" = ""; then
91
- QEMU_GA_VERSION=$(cat $source_path/VERSION)
92
+ QEMU_GA_VERSION=$(cat "$source_path"/VERSION)
93
fi
94
95
96
@@ -XXX,XX +XXX,XX @@ fi
97
for target in $target_list; do
98
target_dir="$target"
99
target_name=$(echo $target | cut -d '-' -f 1)$EXESUF
100
- mkdir -p $target_dir
101
+ mkdir -p "$target_dir"
102
case $target in
103
*-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
104
*) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
105
@@ -XXX,XX +XXX,XX @@ for target in $target_list; do
106
config_target_mak=tests/tcg/config-$target.mak
107
108
echo "# Automatically generated by configure - do not modify" > $config_target_mak
109
- echo "TARGET_NAME=$arch" >> $config_target_mak
110
+ echo "TARGET_NAME=$arch" >> "$config_target_mak"
111
case $target in
112
xtensa*-linux-user)
113
# the toolchain is not complete with headers, only build softmmu tests
114
continue
115
;;
116
*-softmmu)
117
- test -f $source_path/tests/tcg/$arch/Makefile.softmmu-target || continue
118
+ test -f "$source_path/tests/tcg/$arch/Makefile.softmmu-target" || continue
119
qemu="qemu-system-$arch"
120
;;
121
*-linux-user|*-bsd-user)
122
@@ -XXX,XX +XXX,XX @@ for target in $target_list; do
123
# compilers is a requirememt for adding a new test that needs a
124
# compiler feature.
125
126
- echo "BUILD_STATIC=$build_static" >> $config_target_mak
127
- write_target_makefile >> $config_target_mak
128
+ echo "BUILD_STATIC=$build_static" >> "$config_target_mak"
129
+ write_target_makefile >> "$config_target_mak"
130
case $target in
131
aarch64-*)
132
if do_compiler "$target_cc" $target_cflags \
133
-march=armv8.1-a+sve -o $TMPE $TMPC; then
134
- echo "CROSS_CC_HAS_SVE=y" >> $config_target_mak
135
+ echo "CROSS_CC_HAS_SVE=y" >> "$config_target_mak"
136
fi
137
if do_compiler "$target_cc" $target_cflags \
138
-march=armv8.1-a+sve2 -o $TMPE $TMPC; then
139
- echo "CROSS_CC_HAS_SVE2=y" >> $config_target_mak
140
+ echo "CROSS_CC_HAS_SVE2=y" >> "$config_target_mak"
141
fi
142
if do_compiler "$target_cc" $target_cflags \
143
-march=armv8.3-a -o $TMPE $TMPC; then
144
- echo "CROSS_CC_HAS_ARMV8_3=y" >> $config_target_mak
145
+ echo "CROSS_CC_HAS_ARMV8_3=y" >> "$config_target_mak"
146
fi
147
if do_compiler "$target_cc" $target_cflags \
148
-mbranch-protection=standard -o $TMPE $TMPC; then
149
- echo "CROSS_CC_HAS_ARMV8_BTI=y" >> $config_target_mak
150
+ echo "CROSS_CC_HAS_ARMV8_BTI=y" >> "$config_target_mak"
151
fi
152
if do_compiler "$target_cc" $target_cflags \
153
-march=armv8.5-a+memtag -o $TMPE $TMPC; then
154
- echo "CROSS_CC_HAS_ARMV8_MTE=y" >> $config_target_mak
155
+ echo "CROSS_CC_HAS_ARMV8_MTE=y" >> "$config_target_mak"
156
fi
157
;;
158
ppc*)
159
if do_compiler "$target_cc" $target_cflags \
160
-mpower8-vector -o $TMPE $TMPC; then
161
- echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> $config_target_mak
162
+ echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> "$config_target_mak"
163
fi
164
if do_compiler "$target_cc" $target_cflags \
165
-mpower10 -o $TMPE $TMPC; then
166
- echo "CROSS_CC_HAS_POWER10=y" >> $config_target_mak
167
+ echo "CROSS_CC_HAS_POWER10=y" >> "$config_target_mak"
168
fi
169
;;
170
i386-linux-user)
171
if do_compiler "$target_cc" $target_cflags \
172
-Werror -fno-pie -o $TMPE $TMPC; then
173
- echo "CROSS_CC_HAS_I386_NOPIE=y" >> $config_target_mak
174
+ echo "CROSS_CC_HAS_I386_NOPIE=y" >> "$config_target_mak"
175
fi
176
;;
177
esac
178
elif test -n "$container_image"; then
179
echo "build-tcg-tests-$target: docker-image-$container_image" >> $makefile
180
- echo "BUILD_STATIC=y" >> $config_target_mak
181
- write_container_target_makefile >> $config_target_mak
182
+ echo "BUILD_STATIC=y" >> "$config_target_mak"
183
+ write_container_target_makefile >> "$config_target_mak"
184
case $target in
185
aarch64-*)
186
- echo "CROSS_CC_HAS_SVE=y" >> $config_target_mak
187
- echo "CROSS_CC_HAS_SVE2=y" >> $config_target_mak
188
- echo "CROSS_CC_HAS_ARMV8_3=y" >> $config_target_mak
189
- echo "CROSS_CC_HAS_ARMV8_BTI=y" >> $config_target_mak
190
- echo "CROSS_CC_HAS_ARMV8_MTE=y" >> $config_target_mak
191
+ echo "CROSS_CC_HAS_SVE=y" >> "$config_target_mak"
192
+ echo "CROSS_CC_HAS_SVE2=y" >> "$config_target_mak"
193
+ echo "CROSS_CC_HAS_ARMV8_3=y" >> "$config_target_mak"
194
+ echo "CROSS_CC_HAS_ARMV8_BTI=y" >> "$config_target_mak"
195
+ echo "CROSS_CC_HAS_ARMV8_MTE=y" >> "$config_target_mak"
196
;;
197
ppc*)
198
- echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> $config_target_mak
199
- echo "CROSS_CC_HAS_POWER10=y" >> $config_target_mak
200
+ echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> "$config_target_mak"
201
+ echo "CROSS_CC_HAS_POWER10=y" >> "$config_target_mak"
202
;;
203
i386-linux-user)
204
- echo "CROSS_CC_HAS_I386_NOPIE=y" >> $config_target_mak
205
+ echo "CROSS_CC_HAS_I386_NOPIE=y" >> "$config_target_mak"
206
;;
207
esac
208
got_cross_cc=yes
209
fi
210
if test $got_cross_cc = yes; then
211
mkdir -p tests/tcg/$target
212
- echo "QEMU=$PWD/$qemu" >> $config_target_mak
213
+ echo "QEMU=$PWD/$qemu" >> "$config_target_mak"
214
echo "run-tcg-tests-$target: $qemu\$(EXESUF)" >> $makefile
215
tcg_tests_targets="$tcg_tests_targets $target"
216
fi
217
--
218
2.25.1
219
220
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Shellcheck warns that in
2
add MemTxAttrs as an argument to address_space_get_iotlb_entry().
2
rm -f */config-devices.mak.d
3
the glob might expand to something with a '-' in it, which would
4
then be misinterpreted as an option to rm. Fix this by adding './'.
3
5
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20180521140402.23318-12-peter.maydell@linaro.org
9
Message-id: 20220825150703.4074125-5-peter.maydell@linaro.org
8
---
10
---
9
include/exec/memory.h | 2 +-
11
configure | 2 +-
10
exec.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
11
hw/virtio/vhost.c | 3 ++-
12
3 files changed, 4 insertions(+), 3 deletions(-)
13
13
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/configure b/configure
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100755
16
--- a/include/exec/memory.h
16
--- a/configure
17
+++ b/include/exec/memory.h
17
+++ b/configure
18
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache);
18
@@ -XXX,XX +XXX,XX @@ exit 0
19
* entry. Should be called from an RCU critical section.
19
fi
20
*/
20
21
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
21
# Remove old dependency files to make sure that they get properly regenerated
22
- bool is_write);
22
-rm -f */config-devices.mak.d
23
+ bool is_write, MemTxAttrs attrs);
23
+rm -f ./*/config-devices.mak.d
24
24
25
/* address_space_translate: translate an address range into an address space
25
if test -z "$python"
26
* into a MemoryRegion and an address range into that section. Should be
26
then
27
diff --git a/exec.c b/exec.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/exec.c
30
+++ b/exec.c
31
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
32
33
/* Called from RCU critical section */
34
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
35
- bool is_write)
36
+ bool is_write, MemTxAttrs attrs)
37
{
38
MemoryRegionSection section;
39
hwaddr xlat, page_mask;
40
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/virtio/vhost.c
43
+++ b/hw/virtio/vhost.c
44
@@ -XXX,XX +XXX,XX @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
45
trace_vhost_iotlb_miss(dev, 1);
46
47
iotlb = address_space_get_iotlb_entry(dev->vdev->dma_as,
48
- iova, write);
49
+ iova, write,
50
+ MEMTXATTRS_UNSPECIFIED);
51
if (iotlb.target_as != NULL) {
52
ret = vhost_memory_region_lookup(dev, iotlb.translated_addr,
53
&uaddr, &len);
54
--
27
--
55
2.17.1
28
2.25.1
56
29
57
30
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
There's only one place in configure where we use `...` to execute a
2
add MemTxAttrs as an argument to flatview_extend_translation().
2
command and capture the result. Switch to $() to match the rest of
3
Its callers either have an attrs value to hand, or don't care
3
the script. This silences a shellcheck warning.
4
and can use MEMTXATTRS_UNSPECIFIED.
5
4
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180521140402.23318-7-peter.maydell@linaro.org
8
Message-id: 20220825150703.4074125-6-peter.maydell@linaro.org
10
---
9
---
11
exec.c | 15 ++++++++++-----
10
configure | 2 +-
12
1 file changed, 10 insertions(+), 5 deletions(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
13
12
14
diff --git a/exec.c b/exec.c
13
diff --git a/configure b/configure
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100755
16
--- a/exec.c
15
--- a/configure
17
+++ b/exec.c
16
+++ b/configure
18
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
17
@@ -XXX,XX +XXX,XX @@ LINKS="$LINKS python"
19
18
LINKS="$LINKS contrib/plugins/Makefile "
20
static hwaddr
19
for f in $LINKS ; do
21
flatview_extend_translation(FlatView *fv, hwaddr addr,
20
if [ -e "$source_path/$f" ]; then
22
- hwaddr target_len,
21
- mkdir -p `dirname ./$f`
23
- MemoryRegion *mr, hwaddr base, hwaddr len,
22
+ mkdir -p "$(dirname ./"$f")"
24
- bool is_write)
23
symlink "$source_path/$f" "$f"
25
+ hwaddr target_len,
24
fi
26
+ MemoryRegion *mr, hwaddr base, hwaddr len,
25
done
27
+ bool is_write, MemTxAttrs attrs)
28
{
29
hwaddr done = 0;
30
hwaddr xlat;
31
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
32
33
memory_region_ref(mr);
34
*plen = flatview_extend_translation(fv, addr, len, mr, xlat,
35
- l, is_write);
36
+ l, is_write, attrs);
37
ptr = qemu_ram_ptr_length(mr->ram_block, xlat, plen, true);
38
rcu_read_unlock();
39
40
@@ -XXX,XX +XXX,XX @@ int64_t address_space_cache_init(MemoryRegionCache *cache,
41
mr = cache->mrs.mr;
42
memory_region_ref(mr);
43
if (memory_access_is_direct(mr, is_write)) {
44
+ /* We don't care about the memory attributes here as we're only
45
+ * doing this if we found actual RAM, which behaves the same
46
+ * regardless of attributes; so UNSPECIFIED is fine.
47
+ */
48
l = flatview_extend_translation(cache->fv, addr, len, mr,
49
- cache->xlat, l, is_write);
50
+ cache->xlat, l, is_write,
51
+ MEMTXATTRS_UNSPECIFIED);
52
cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true);
53
} else {
54
cache->ptr = NULL;
55
--
26
--
56
2.17.1
27
2.25.1
57
28
58
29
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Shellcheck warns that we have one place where we run a command and
2
add MemTxAttrs as an argument to address_space_translate()
2
then check if it failed using $?; this is better written to simply
3
and address_space_translate_cached(). Callers either have an
3
check the command in the 'if' statement directly.
4
attrs value to hand, or don't care and can use MEMTXATTRS_UNSPECIFIED.
5
4
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180521140402.23318-4-peter.maydell@linaro.org
8
Message-id: 20220825150703.4074125-7-peter.maydell@linaro.org
10
---
9
---
11
include/exec/memory.h | 4 +++-
10
configure | 3 +--
12
accel/tcg/translate-all.c | 2 +-
11
1 file changed, 1 insertion(+), 2 deletions(-)
13
exec.c | 14 +++++++++-----
14
hw/vfio/common.c | 3 ++-
15
memory_ldst.inc.c | 18 +++++++++---------
16
target/riscv/helper.c | 2 +-
17
6 files changed, 25 insertions(+), 18 deletions(-)
18
12
19
diff --git a/include/exec/memory.h b/include/exec/memory.h
13
diff --git a/configure b/configure
20
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100755
21
--- a/include/exec/memory.h
15
--- a/configure
22
+++ b/include/exec/memory.h
16
+++ b/configure
23
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
17
@@ -XXX,XX +XXX,XX @@ fi
24
* #MemoryRegion.
18
# it when configure exits.)
25
* @len: pointer to length
19
TMPDIR1="config-temp"
26
* @is_write: indicates the transfer direction
20
rm -rf "${TMPDIR1}"
27
+ * @attrs: memory attributes
21
-mkdir -p "${TMPDIR1}"
28
*/
22
-if [ $? -ne 0 ]; then
29
MemoryRegion *flatview_translate(FlatView *fv,
23
+if ! mkdir -p "${TMPDIR1}"; then
30
hwaddr addr, hwaddr *xlat,
24
echo "ERROR: failed to create temporary directory"
31
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv,
25
exit 1
32
26
fi
33
static inline MemoryRegion *address_space_translate(AddressSpace *as,
34
hwaddr addr, hwaddr *xlat,
35
- hwaddr *len, bool is_write)
36
+ hwaddr *len, bool is_write,
37
+ MemTxAttrs attrs)
38
{
39
return flatview_translate(address_space_to_flatview(as),
40
addr, xlat, len, is_write);
41
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/accel/tcg/translate-all.c
44
+++ b/accel/tcg/translate-all.c
45
@@ -XXX,XX +XXX,XX @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
46
hwaddr l = 1;
47
48
rcu_read_lock();
49
- mr = address_space_translate(as, addr, &addr, &l, false);
50
+ mr = address_space_translate(as, addr, &addr, &l, false, attrs);
51
if (!(memory_region_is_ram(mr)
52
|| memory_region_is_romd(mr))) {
53
rcu_read_unlock();
54
diff --git a/exec.c b/exec.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/exec.c
57
+++ b/exec.c
58
@@ -XXX,XX +XXX,XX @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
59
rcu_read_lock();
60
while (len > 0) {
61
l = len;
62
- mr = address_space_translate(as, addr, &addr1, &l, true);
63
+ mr = address_space_translate(as, addr, &addr1, &l, true,
64
+ MEMTXATTRS_UNSPECIFIED);
65
66
if (!(memory_region_is_ram(mr) ||
67
memory_region_is_romd(mr))) {
68
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache)
69
*/
70
static inline MemoryRegion *address_space_translate_cached(
71
MemoryRegionCache *cache, hwaddr addr, hwaddr *xlat,
72
- hwaddr *plen, bool is_write)
73
+ hwaddr *plen, bool is_write, MemTxAttrs attrs)
74
{
75
MemoryRegionSection section;
76
MemoryRegion *mr;
77
@@ -XXX,XX +XXX,XX @@ address_space_read_cached_slow(MemoryRegionCache *cache, hwaddr addr,
78
MemoryRegion *mr;
79
80
l = len;
81
- mr = address_space_translate_cached(cache, addr, &addr1, &l, false);
82
+ mr = address_space_translate_cached(cache, addr, &addr1, &l, false,
83
+ MEMTXATTRS_UNSPECIFIED);
84
flatview_read_continue(cache->fv,
85
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
86
addr1, l, mr);
87
@@ -XXX,XX +XXX,XX @@ address_space_write_cached_slow(MemoryRegionCache *cache, hwaddr addr,
88
MemoryRegion *mr;
89
90
l = len;
91
- mr = address_space_translate_cached(cache, addr, &addr1, &l, true);
92
+ mr = address_space_translate_cached(cache, addr, &addr1, &l, true,
93
+ MEMTXATTRS_UNSPECIFIED);
94
flatview_write_continue(cache->fv,
95
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
96
addr1, l, mr);
97
@@ -XXX,XX +XXX,XX @@ bool cpu_physical_memory_is_io(hwaddr phys_addr)
98
99
rcu_read_lock();
100
mr = address_space_translate(&address_space_memory,
101
- phys_addr, &phys_addr, &l, false);
102
+ phys_addr, &phys_addr, &l, false,
103
+ MEMTXATTRS_UNSPECIFIED);
104
105
res = !(memory_region_is_ram(mr) || memory_region_is_romd(mr));
106
rcu_read_unlock();
107
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
108
index XXXXXXX..XXXXXXX 100644
109
--- a/hw/vfio/common.c
110
+++ b/hw/vfio/common.c
111
@@ -XXX,XX +XXX,XX @@ static bool vfio_get_vaddr(IOMMUTLBEntry *iotlb, void **vaddr,
112
*/
113
mr = address_space_translate(&address_space_memory,
114
iotlb->translated_addr,
115
- &xlat, &len, writable);
116
+ &xlat, &len, writable,
117
+ MEMTXATTRS_UNSPECIFIED);
118
if (!memory_region_is_ram(mr)) {
119
error_report("iommu map to non memory area %"HWADDR_PRIx"",
120
xlat);
121
diff --git a/memory_ldst.inc.c b/memory_ldst.inc.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/memory_ldst.inc.c
124
+++ b/memory_ldst.inc.c
125
@@ -XXX,XX +XXX,XX @@ static inline uint32_t glue(address_space_ldl_internal, SUFFIX)(ARG1_DECL,
126
bool release_lock = false;
127
128
RCU_READ_LOCK();
129
- mr = TRANSLATE(addr, &addr1, &l, false);
130
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
131
if (l < 4 || !IS_DIRECT(mr, false)) {
132
release_lock |= prepare_mmio_access(mr);
133
134
@@ -XXX,XX +XXX,XX @@ static inline uint64_t glue(address_space_ldq_internal, SUFFIX)(ARG1_DECL,
135
bool release_lock = false;
136
137
RCU_READ_LOCK();
138
- mr = TRANSLATE(addr, &addr1, &l, false);
139
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
140
if (l < 8 || !IS_DIRECT(mr, false)) {
141
release_lock |= prepare_mmio_access(mr);
142
143
@@ -XXX,XX +XXX,XX @@ uint32_t glue(address_space_ldub, SUFFIX)(ARG1_DECL,
144
bool release_lock = false;
145
146
RCU_READ_LOCK();
147
- mr = TRANSLATE(addr, &addr1, &l, false);
148
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
149
if (!IS_DIRECT(mr, false)) {
150
release_lock |= prepare_mmio_access(mr);
151
152
@@ -XXX,XX +XXX,XX @@ static inline uint32_t glue(address_space_lduw_internal, SUFFIX)(ARG1_DECL,
153
bool release_lock = false;
154
155
RCU_READ_LOCK();
156
- mr = TRANSLATE(addr, &addr1, &l, false);
157
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
158
if (l < 2 || !IS_DIRECT(mr, false)) {
159
release_lock |= prepare_mmio_access(mr);
160
161
@@ -XXX,XX +XXX,XX @@ void glue(address_space_stl_notdirty, SUFFIX)(ARG1_DECL,
162
bool release_lock = false;
163
164
RCU_READ_LOCK();
165
- mr = TRANSLATE(addr, &addr1, &l, true);
166
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
167
if (l < 4 || !IS_DIRECT(mr, true)) {
168
release_lock |= prepare_mmio_access(mr);
169
170
@@ -XXX,XX +XXX,XX @@ static inline void glue(address_space_stl_internal, SUFFIX)(ARG1_DECL,
171
bool release_lock = false;
172
173
RCU_READ_LOCK();
174
- mr = TRANSLATE(addr, &addr1, &l, true);
175
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
176
if (l < 4 || !IS_DIRECT(mr, true)) {
177
release_lock |= prepare_mmio_access(mr);
178
179
@@ -XXX,XX +XXX,XX @@ void glue(address_space_stb, SUFFIX)(ARG1_DECL,
180
bool release_lock = false;
181
182
RCU_READ_LOCK();
183
- mr = TRANSLATE(addr, &addr1, &l, true);
184
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
185
if (!IS_DIRECT(mr, true)) {
186
release_lock |= prepare_mmio_access(mr);
187
r = memory_region_dispatch_write(mr, addr1, val, 1, attrs);
188
@@ -XXX,XX +XXX,XX @@ static inline void glue(address_space_stw_internal, SUFFIX)(ARG1_DECL,
189
bool release_lock = false;
190
191
RCU_READ_LOCK();
192
- mr = TRANSLATE(addr, &addr1, &l, true);
193
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
194
if (l < 2 || !IS_DIRECT(mr, true)) {
195
release_lock |= prepare_mmio_access(mr);
196
197
@@ -XXX,XX +XXX,XX @@ static void glue(address_space_stq_internal, SUFFIX)(ARG1_DECL,
198
bool release_lock = false;
199
200
RCU_READ_LOCK();
201
- mr = TRANSLATE(addr, &addr1, &l, true);
202
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
203
if (l < 8 || !IS_DIRECT(mr, true)) {
204
release_lock |= prepare_mmio_access(mr);
205
206
diff --git a/target/riscv/helper.c b/target/riscv/helper.c
207
index XXXXXXX..XXXXXXX 100644
208
--- a/target/riscv/helper.c
209
+++ b/target/riscv/helper.c
210
@@ -XXX,XX +XXX,XX @@ restart:
211
MemoryRegion *mr;
212
hwaddr l = sizeof(target_ulong), addr1;
213
mr = address_space_translate(cs->as, pte_addr,
214
- &addr1, &l, false);
215
+ &addr1, &l, false, MEMTXATTRS_UNSPECIFIED);
216
if (memory_access_is_direct(mr, true)) {
217
target_ulong *pte_pa =
218
qemu_map_ram_ptr(mr->ram_block, addr1);
219
--
27
--
220
2.17.1
28
2.25.1
221
29
222
30
diff view generated by jsdifflib
1
Add entries to MAINTAINERS to cover the newer MPS2 boards and
1
We use the non-POSIX 'local' keyword in just two places in configure;
2
the new devices they use.
2
rewrite to avoid it.
3
4
In do_compiler(), just drop the 'local' keyword. The variable
5
'compiler' is only used elsewhere in the do_compiler_werror()
6
function, which already uses the variable as a normal non-local one.
7
8
In probe_target_compiler(), $try and $t are both local; make them
9
normal variables and use a more obviously distinct variable name
10
for $t.
3
11
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180518153157.14899-1-peter.maydell@linaro.org
13
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20220825150703.4074125-8-peter.maydell@linaro.org
6
---
16
---
7
MAINTAINERS | 9 +++++++--
17
configure | 7 +++----
8
1 file changed, 7 insertions(+), 2 deletions(-)
18
1 file changed, 3 insertions(+), 4 deletions(-)
9
19
10
diff --git a/MAINTAINERS b/MAINTAINERS
20
diff --git a/configure b/configure
11
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100755
12
--- a/MAINTAINERS
22
--- a/configure
13
+++ b/MAINTAINERS
23
+++ b/configure
14
@@ -XXX,XX +XXX,XX @@ F: hw/timer/cmsdk-apb-timer.c
24
@@ -XXX,XX +XXX,XX @@ error_exit() {
15
F: include/hw/timer/cmsdk-apb-timer.h
25
do_compiler() {
16
F: hw/char/cmsdk-apb-uart.c
26
# Run the compiler, capturing its output to the log. First argument
17
F: include/hw/char/cmsdk-apb-uart.h
27
# is compiler binary to execute.
18
+F: hw/misc/tz-ppc.c
28
- local compiler="$1"
19
+F: include/hw/misc/tz-ppc.h
29
+ compiler="$1"
20
30
shift
21
ARM cores
31
if test -n "$BASH_VERSION"; then eval '
22
M: Peter Maydell <peter.maydell@linaro.org>
32
echo >>config.log "
23
@@ -XXX,XX +XXX,XX @@ M: Peter Maydell <peter.maydell@linaro.org>
33
@@ -XXX,XX +XXX,XX @@ probe_target_compiler() {
24
L: qemu-arm@nongnu.org
34
: ${container_cross_strip:=${container_cross_prefix}strip}
25
S: Maintained
35
done
26
F: hw/arm/mps2.c
36
27
-F: hw/misc/mps2-scc.c
37
- local t try
28
-F: include/hw/misc/mps2-scc.h
38
try=cross
29
+F: hw/arm/mps2-tz.c
39
case "$target_arch:$cpu" in
30
+F: hw/misc/mps2-*.c
40
aarch64_be:aarch64 | \
31
+F: include/hw/misc/mps2-*.h
41
@@ -XXX,XX +XXX,XX @@ probe_target_compiler() {
32
+F: hw/arm/iotkit.c
42
try='native cross' ;;
33
+F: include/hw/arm/iotkit.h
43
esac
34
44
eval "target_cflags=\${cross_cc_cflags_$target_arch}"
35
Musicpal
45
- for t in $try; do
36
M: Jan Kiszka <jan.kiszka@web.de>
46
- case $t in
47
+ for thistry in $try; do
48
+ case $thistry in
49
native)
50
target_cc=$cc
51
target_ccas=$ccas
37
--
52
--
38
2.17.1
53
2.25.1
39
54
40
55
diff view generated by jsdifflib