1
target-arm queue. This has the "plumb txattrs through various
1
target-arm queue: this time around is all small fixes
2
bits of exec.c" patches, and a collection of bug fixes from
2
and changes.
3
various people.
4
3
5
thanks
4
thanks
6
-- PMM
5
-- PMM
7
6
7
The following changes since commit fec105c2abda8567ec15230429c41429b5ee307c:
8
8
9
9
Merge remote-tracking branch 'remotes/kraxel/tags/audio-20190828-pull-request' into staging (2019-09-03 14:03:15 +0100)
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
10
14
are available in the Git repository at:
11
are available in the Git repository at:
15
12
16
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180531
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190903
17
14
18
for you to fetch changes up to 49d1dca0520ea71bc21867fab6647f474fcf857b:
15
for you to fetch changes up to 5e5584c89f36b302c666bc6db535fd3f7ff35ad2:
19
16
20
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice (2018-05-31 14:52:53 +0100)
17
target/arm: Don't abort on M-profile exception return in linux-user mode (2019-09-03 16:20:35 +0100)
21
18
22
----------------------------------------------------------------
19
----------------------------------------------------------------
23
target-arm queue:
20
target-arm queue:
24
* target/arm: Honour FPCR.FZ in FRECPX
21
* Revert and correctly fix refactoring of unallocated_encoding()
25
* MAINTAINERS: Add entries for newer MPS2 boards and devices
22
* Take exceptions on ATS instructions when needed
26
* hw/intc/arm_gicv3: Fix APxR<n> register dispatching
23
* aspeed/timer: Provide back-pressure information for short periods
27
* arm_gicv3_kvm: fix bug in writing zero bits back to the in-kernel
24
* memory: Remove unused memory_region_iommu_replay_all()
28
GIC state
25
* hw/arm/smmuv3: Log a guest error when decoding an invalid STE
29
* tcg: Fix helper function vs host abi for float16
26
* hw/arm/smmuv3: Remove spurious error messages on IOVA invalidations
30
* arm: fix qemu crash on startup with -bios option
27
* target/arm: Fix SMMLS argument order
31
* arm: fix malloc type mismatch
28
* hw/arm: Use ARM_CPU_TYPE_NAME() macro when appropriate
32
* xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
29
* hw/arm: Correct reference counting for creation of various objects
33
* Correct CPACR reset value for v7 cores
30
* includes: remove stale [smp|max]_cpus externs
34
* memory.h: Improve IOMMU related documentation
31
* tcg/README: fix typo
35
* exec: Plumb transaction attributes through various functions in
32
* atomic_template: fix indentation in GEN_ATOMIC_HELPER
36
preparation for allowing IOMMUs to see them
33
* include/exec/cpu-defs.h: fix typo
37
* vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
34
* target/arm: Free TCG temps in trans_VMOV_64_sp()
38
* ARM: ACPI: Fix use-after-free due to memory realloc
35
* target/arm: Don't abort on M-profile exception return in linux-user mode
39
* KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
40
36
41
----------------------------------------------------------------
37
----------------------------------------------------------------
42
Francisco Iglesias (1):
38
Alex Bennée (2):
43
xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
39
includes: remove stale [smp|max]_cpus externs
40
include/exec/cpu-defs.h: fix typo
44
41
45
Igor Mammedov (1):
42
Andrew Jeffery (1):
46
arm: fix qemu crash on startup with -bios option
43
aspeed/timer: Provide back-pressure information for short periods
47
44
48
Jan Kiszka (1):
45
Emilio G. Cota (2):
49
hw/intc/arm_gicv3: Fix APxR<n> register dispatching
46
tcg/README: fix typo s/afterwise/afterwards/
47
atomic_template: fix indentation in GEN_ATOMIC_HELPER
50
48
51
Paolo Bonzini (1):
49
Eric Auger (3):
52
arm: fix malloc type mismatch
50
memory: Remove unused memory_region_iommu_replay_all()
51
hw/arm/smmuv3: Log a guest error when decoding an invalid STE
52
hw/arm/smmuv3: Remove spurious error messages on IOVA invalidations
53
53
54
Peter Maydell (17):
54
Peter Maydell (4):
55
target/arm: Honour FPCR.FZ in FRECPX
55
target/arm: Allow ARMCPRegInfo read/write functions to throw exceptions
56
MAINTAINERS: Add entries for newer MPS2 boards and devices
56
target/arm: Take exceptions on ATS instructions when needed
57
Correct CPACR reset value for v7 cores
57
target/arm: Free TCG temps in trans_VMOV_64_sp()
58
memory.h: Improve IOMMU related documentation
58
target/arm: Don't abort on M-profile exception return in linux-user mode
59
Make tb_invalidate_phys_addr() take a MemTxAttrs argument
60
Make address_space_translate{, _cached}() take a MemTxAttrs argument
61
Make address_space_map() take a MemTxAttrs argument
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
59
73
Richard Henderson (1):
60
Philippe Mathieu-Daudé (6):
74
tcg: Fix helper function vs host abi for float16
61
hw/arm: Use ARM_CPU_TYPE_NAME() macro when appropriate
62
hw/arm: Use object_initialize_child for correct reference counting
63
hw/arm: Use sysbus_init_child_obj for correct reference counting
64
hw/arm/fsl-imx: Add the cpu as child of the SoC object
65
hw/dma/xilinx_axi: Use object_initialize_child for correct ref. counting
66
hw/net/xilinx_axi: Use object_initialize_child for correct ref. counting
75
67
76
Shannon Zhao (3):
68
Richard Henderson (3):
77
arm_gicv3_kvm: increase clroffset accordingly
69
Revert "target/arm: Use unallocated_encoding for aarch32"
78
ARM: ACPI: Fix use-after-free due to memory realloc
70
target/arm: Factor out unallocated_encoding for aarch32
79
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
71
target/arm: Fix SMMLS argument order
80
72
81
include/exec/exec-all.h | 5 +-
73
accel/tcg/atomic_template.h | 2 +-
82
include/exec/helper-head.h | 2 +-
74
hw/arm/smmuv3-internal.h | 1 +
83
include/exec/memory-internal.h | 3 +-
75
include/exec/cpu-defs.h | 2 +-
84
include/exec/memory.h | 128 +++++++++++++++++++++++++++++++++++------
76
include/exec/memory.h | 10 ----
85
include/migration/vmstate.h | 3 +
77
include/sysemu/sysemu.h | 2 -
86
include/sysemu/dma.h | 6 +-
78
target/arm/cpu.h | 6 ++-
87
accel/tcg/translate-all.c | 4 +-
79
target/arm/translate-a64.h | 2 +
88
exec.c | 95 ++++++++++++++++++------------
80
target/arm/translate.h | 2 -
89
hw/arm/boot.c | 18 +++---
81
hw/arm/allwinner-a10.c | 3 +-
90
hw/arm/virt-acpi-build.c | 20 +++++--
82
hw/arm/cubieboard.c | 3 +-
91
hw/dma/xlnx-zdma.c | 10 +++-
83
hw/arm/digic.c | 3 +-
92
hw/hppa/dino.c | 3 +-
84
hw/arm/exynos4_boards.c | 4 +-
93
hw/intc/arm_gic_kvm.c | 1 -
85
hw/arm/fsl-imx25.c | 4 +-
94
hw/intc/arm_gicv3_cpuif.c | 12 ++--
86
hw/arm/fsl-imx31.c | 4 +-
95
hw/intc/arm_gicv3_kvm.c | 2 +-
87
hw/arm/fsl-imx6.c | 3 +-
96
hw/nvram/fw_cfg.c | 12 ++--
88
hw/arm/fsl-imx6ul.c | 2 +-
97
hw/s390x/s390-pci-inst.c | 3 +-
89
hw/arm/mcimx7d-sabre.c | 9 ++--
98
hw/scsi/esp.c | 3 +-
90
hw/arm/mps2-tz.c | 15 +++---
99
hw/vfio/common.c | 3 +-
91
hw/arm/musca.c | 9 ++--
100
hw/virtio/vhost.c | 3 +-
92
hw/arm/smmuv3.c | 18 ++++---
101
hw/xen/xen_pt_msi.c | 3 +-
93
hw/arm/xlnx-zynqmp.c | 8 +--
102
memory.c | 12 ++--
94
hw/dma/xilinx_axidma.c | 16 +++---
103
memory_ldst.inc.c | 18 +++---
95
hw/net/xilinx_axienet.c | 17 +++----
104
target/arm/gdbstub.c | 3 +-
96
hw/timer/aspeed_timer.c | 17 ++++++-
105
target/arm/helper-a64.c | 41 +++++++------
97
memory.c | 9 ----
106
target/arm/helper.c | 90 ++++++++++++++++-------------
98
target/arm/helper.c | 107 +++++++++++++++++++++++++++++++++++------
107
target/ppc/mmu-hash64.c | 3 +-
99
target/arm/translate-a64.c | 13 +++++
108
target/riscv/helper.c | 2 +-
100
target/arm/translate-vfp.inc.c | 2 +
109
target/s390x/diag.c | 6 +-
101
target/arm/translate.c | 50 +++++++++++++++++--
110
target/s390x/excp_helper.c | 3 +-
102
tcg/README | 2 +-
111
target/s390x/mmu_helper.c | 3 +-
103
30 files changed, 244 insertions(+), 101 deletions(-)
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
104
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
This reverts commit 3cb36637157088892e9e33ddb1034bffd1251d3b.
4
passed and returned either zero-extended in the host register
5
or with garbage at the top of the host register.
6
4
7
The tcg code generator has so far been assuming garbage, as that
5
Despite the fact that the text for the call to gen_exception_insn
8
matches the x86 abi, but this is incorrect for other host abis.
6
is identical for aarch64 and aarch32, the implementation inside
9
Further, target/arm has so far been assuming zero-extended results,
7
gen_exception_insn is totally different.
10
so that it may store the 16-bit value into a 32-bit slot with the
11
high 16-bits already clear.
12
8
13
Rectify both problems by mapping "f16" in the helper definition
9
This fixes exceptions raised from aarch64.
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
10
18
Cc: qemu-stable@nongnu.org
11
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
19
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
21
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
14
Message-id: 20190826151536.6771-2-richard.henderson@linaro.org
22
Message-id: 20180522175629.24932-1-richard.henderson@linaro.org
23
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
16
---
26
include/exec/helper-head.h | 2 +-
17
target/arm/translate-a64.h | 2 ++
27
target/arm/helper-a64.c | 35 +++++++++--------
18
target/arm/translate.h | 2 --
28
target/arm/helper.c | 80 +++++++++++++++++++-------------------
19
target/arm/translate-a64.c | 7 +++++++
29
3 files changed, 59 insertions(+), 58 deletions(-)
20
target/arm/translate-vfp.inc.c | 3 ++-
21
target/arm/translate.c | 22 ++++++++++------------
22
5 files changed, 21 insertions(+), 15 deletions(-)
30
23
31
diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h
24
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
32
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
33
--- a/include/exec/helper-head.h
26
--- a/target/arm/translate-a64.h
34
+++ b/include/exec/helper-head.h
27
+++ b/target/arm/translate-a64.h
35
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@
36
#define dh_ctype_int int
29
#ifndef TARGET_ARM_TRANSLATE_A64_H
37
#define dh_ctype_i64 uint64_t
30
#define TARGET_ARM_TRANSLATE_A64_H
38
#define dh_ctype_s64 int64_t
31
39
-#define dh_ctype_f16 float16
32
+void unallocated_encoding(DisasContext *s);
40
+#define dh_ctype_f16 uint32_t
33
+
41
#define dh_ctype_f32 float32
34
#define unsupported_encoding(s, insn) \
42
#define dh_ctype_f64 float64
35
do { \
43
#define dh_ctype_ptr void *
36
qemu_log_mask(LOG_UNIMP, \
44
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
37
diff --git a/target/arm/translate.h b/target/arm/translate.h
45
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/helper-a64.c
39
--- a/target/arm/translate.h
47
+++ b/target/arm/helper-a64.c
40
+++ b/target/arm/translate.h
48
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
41
@@ -XXX,XX +XXX,XX @@ typedef struct DisasCompare {
49
return flags;
42
bool value_global;
50
}
43
} DisasCompare;
51
44
52
-uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
45
-void unallocated_encoding(DisasContext *s);
53
+uint64_t HELPER(vfp_cmph_a64)(uint32_t x, uint32_t y, void *fp_status)
46
-
54
{
47
/* Share the TCG temporaries common between 32 and 64 bit modes. */
55
return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
48
extern TCGv_i32 cpu_NF, cpu_ZF, cpu_CF, cpu_VF;
56
}
49
extern TCGv_i64 cpu_exclusive_addr;
57
50
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
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
195
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
196
--- a/target/arm/helper.c
52
--- a/target/arm/translate-a64.c
197
+++ b/target/arm/helper.c
53
+++ b/target/arm/translate-a64.c
198
@@ -XXX,XX +XXX,XX @@ DO_VFP_cmp(d, float64)
54
@@ -XXX,XX +XXX,XX @@ static inline void gen_goto_tb(DisasContext *s, int n, uint64_t dest)
199
200
/* Integer to float and float to integer conversions */
201
202
-#define CONV_ITOF(name, fsz, sign) \
203
- float##fsz HELPER(name)(uint32_t x, void *fpstp) \
204
-{ \
205
- float_status *fpst = fpstp; \
206
- return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \
207
+#define CONV_ITOF(name, ftype, fsz, sign) \
208
+ftype HELPER(name)(uint32_t x, void *fpstp) \
209
+{ \
210
+ float_status *fpst = fpstp; \
211
+ return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \
212
}
213
214
-#define CONV_FTOI(name, fsz, sign, round) \
215
-uint32_t HELPER(name)(float##fsz x, void *fpstp) \
216
-{ \
217
- float_status *fpst = fpstp; \
218
- if (float##fsz##_is_any_nan(x)) { \
219
- float_raise(float_flag_invalid, fpst); \
220
- return 0; \
221
- } \
222
- return float##fsz##_to_##sign##int32##round(x, fpst); \
223
+#define CONV_FTOI(name, ftype, fsz, sign, round) \
224
+uint32_t HELPER(name)(ftype x, void *fpstp) \
225
+{ \
226
+ float_status *fpst = fpstp; \
227
+ if (float##fsz##_is_any_nan(x)) { \
228
+ float_raise(float_flag_invalid, fpst); \
229
+ return 0; \
230
+ } \
231
+ return float##fsz##_to_##sign##int32##round(x, fpst); \
232
}
233
234
-#define FLOAT_CONVS(name, p, fsz, sign) \
235
-CONV_ITOF(vfp_##name##to##p, fsz, sign) \
236
-CONV_FTOI(vfp_to##name##p, fsz, sign, ) \
237
-CONV_FTOI(vfp_to##name##z##p, fsz, sign, _round_to_zero)
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
{
265
return do_postscale_fp16(int32_to_float64(x, fpst), shift, fpst);
266
}
267
268
-float16 HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
269
+uint32_t HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
270
{
271
return do_postscale_fp16(uint32_to_float64(x, fpst), shift, fpst);
272
}
273
274
-float16 HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
275
+uint32_t HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
276
{
277
return do_postscale_fp16(int64_to_float64(x, fpst), shift, fpst);
278
}
279
280
-float16 HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
281
+uint32_t HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
282
{
283
return do_postscale_fp16(uint64_to_float64(x, fpst), shift, fpst);
284
}
285
@@ -XXX,XX +XXX,XX @@ static float64 do_prescale_fp16(float16 f, int shift, float_status *fpst)
286
}
55
}
287
}
56
}
288
57
289
-uint32_t HELPER(vfp_toshh)(float16 x, uint32_t shift, void *fpst)
58
+void unallocated_encoding(DisasContext *s)
290
+uint32_t HELPER(vfp_toshh)(uint32_t x, uint32_t shift, void *fpst)
59
+{
60
+ /* Unallocated and reserved encodings are uncategorized */
61
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
62
+ default_exception_el(s));
63
+}
64
+
65
static void init_tmp_a64_array(DisasContext *s)
291
{
66
{
292
return float64_to_int16(do_prescale_fp16(x, shift, fpst), fpst);
67
#ifdef CONFIG_DEBUG_TCG
68
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/target/arm/translate-vfp.inc.c
71
+++ b/target/arm/translate-vfp.inc.c
72
@@ -XXX,XX +XXX,XX @@ static bool full_vfp_access_check(DisasContext *s, bool ignore_vfp_enabled)
73
74
if (!s->vfp_enabled && !ignore_vfp_enabled) {
75
assert(!arm_dc_feature(s, ARM_FEATURE_M));
76
- unallocated_encoding(s);
77
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
78
+ default_exception_el(s));
79
return false;
80
}
81
82
diff --git a/target/arm/translate.c b/target/arm/translate.c
83
index XXXXXXX..XXXXXXX 100644
84
--- a/target/arm/translate.c
85
+++ b/target/arm/translate.c
86
@@ -XXX,XX +XXX,XX @@ static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
87
s->base.is_jmp = DISAS_NORETURN;
293
}
88
}
294
89
295
-uint32_t HELPER(vfp_touhh)(float16 x, uint32_t shift, void *fpst)
90
-void unallocated_encoding(DisasContext *s)
296
+uint32_t HELPER(vfp_touhh)(uint32_t x, uint32_t shift, void *fpst)
91
-{
92
- /* Unallocated and reserved encodings are uncategorized */
93
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
94
- default_exception_el(s));
95
-}
96
-
97
/* Force a TB lookup after an instruction that changes the CPU state. */
98
static inline void gen_lookup_tb(DisasContext *s)
297
{
99
{
298
return float64_to_uint16(do_prescale_fp16(x, shift, fpst), fpst);
100
@@ -XXX,XX +XXX,XX @@ static inline void gen_hlt(DisasContext *s, int imm)
101
return;
102
}
103
104
- unallocated_encoding(s);
105
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
106
+ default_exception_el(s));
299
}
107
}
300
108
301
-uint32_t HELPER(vfp_toslh)(float16 x, uint32_t shift, void *fpst)
109
static inline void gen_add_data_offset(DisasContext *s, unsigned int insn,
302
+uint32_t HELPER(vfp_toslh)(uint32_t x, uint32_t shift, void *fpst)
110
@@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s,
303
{
111
}
304
return float64_to_int32(do_prescale_fp16(x, shift, fpst), fpst);
112
113
if (undef) {
114
- unallocated_encoding(s);
115
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
116
+ default_exception_el(s));
117
return;
118
}
119
120
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
121
break;
122
default:
123
illegal_op:
124
- unallocated_encoding(s);
125
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
126
+ default_exception_el(s));
127
break;
128
}
129
}
130
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
131
}
132
return;
133
illegal_op:
134
- unallocated_encoding(s);
135
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
136
+ default_exception_el(s));
305
}
137
}
306
138
307
-uint32_t HELPER(vfp_toulh)(float16 x, uint32_t shift, void *fpst)
139
static void disas_thumb_insn(DisasContext *s, uint32_t insn)
308
+uint32_t HELPER(vfp_toulh)(uint32_t x, uint32_t shift, void *fpst)
140
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn)
309
{
141
return;
310
return float64_to_uint32(do_prescale_fp16(x, shift, fpst), fpst);
142
illegal_op:
143
undef:
144
- unallocated_encoding(s);
145
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
146
+ default_exception_el(s));
311
}
147
}
312
148
313
-uint64_t HELPER(vfp_tosqh)(float16 x, uint32_t shift, void *fpst)
149
static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
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
--
150
--
379
2.17.1
151
2.20.1
380
152
381
153
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
Make this a static function private to translate.c.
4
is no enough contiguous memory, the address will be changed. So previous
4
Thus we can use the same idiom between aarch64 and aarch32
5
pointer could not be used any more. It must update the pointer and use
5
without actually sharing function implementations.
6
the new one.
7
6
8
Also, previous codes wrongly use le32 conversion of iort->node_offset
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
for subsequent computations that will result incorrect value if host is
8
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
not litlle endian. So use the non-converted one instead.
9
Message-id: 20190826151536.6771-3-richard.henderson@linaro.org
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>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
11
---
17
hw/arm/virt-acpi-build.c | 20 +++++++++++++++-----
12
target/arm/translate-vfp.inc.c | 3 +--
18
1 file changed, 15 insertions(+), 5 deletions(-)
13
target/arm/translate.c | 22 ++++++++++++----------
14
2 files changed, 13 insertions(+), 12 deletions(-)
19
15
20
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
16
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/virt-acpi-build.c
18
--- a/target/arm/translate-vfp.inc.c
23
+++ b/hw/arm/virt-acpi-build.c
19
+++ b/target/arm/translate-vfp.inc.c
24
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
20
@@ -XXX,XX +XXX,XX @@ static bool full_vfp_access_check(DisasContext *s, bool ignore_vfp_enabled)
25
AcpiIortItsGroup *its;
21
26
AcpiIortTable *iort;
22
if (!s->vfp_enabled && !ignore_vfp_enabled) {
27
AcpiIortSmmu3 *smmu;
23
assert(!arm_dc_feature(s, ARM_FEATURE_M));
28
- size_t node_size, iort_length, smmu_offset = 0;
24
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
29
+ size_t node_size, iort_node_offset, iort_length, smmu_offset = 0;
25
- default_exception_el(s));
30
AcpiIortRC *rc;
26
+ unallocated_encoding(s);
31
27
return false;
32
iort = acpi_data_push(table_data, sizeof(*iort));
33
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
34
35
iort_length = sizeof(*iort);
36
iort->node_count = cpu_to_le32(nb_nodes);
37
- iort->node_offset = cpu_to_le32(sizeof(*iort));
38
+ /*
39
+ * Use a copy in case table_data->data moves during acpi_data_push
40
+ * operations.
41
+ */
42
+ iort_node_offset = sizeof(*iort);
43
+ iort->node_offset = cpu_to_le32(iort_node_offset);
44
45
/* ITS group node */
46
node_size = sizeof(*its) + sizeof(uint32_t);
47
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
48
int irq = vms->irqmap[VIRT_SMMU];
49
50
/* SMMUv3 node */
51
- smmu_offset = iort->node_offset + node_size;
52
+ smmu_offset = iort_node_offset + node_size;
53
node_size = sizeof(*smmu) + sizeof(*idmap);
54
iort_length += node_size;
55
smmu = acpi_data_push(table_data, node_size);
56
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
57
idmap->id_count = cpu_to_le32(0xFFFF);
58
idmap->output_base = 0;
59
/* output IORT node is the ITS group node (the first node) */
60
- idmap->output_reference = cpu_to_le32(iort->node_offset);
61
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
62
}
28
}
63
29
64
/* Root Complex Node */
30
diff --git a/target/arm/translate.c b/target/arm/translate.c
65
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
31
index XXXXXXX..XXXXXXX 100644
66
idmap->output_reference = cpu_to_le32(smmu_offset);
32
--- a/target/arm/translate.c
67
} else {
33
+++ b/target/arm/translate.c
68
/* output IORT node is the ITS group node (the first node) */
34
@@ -XXX,XX +XXX,XX @@ static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
69
- idmap->output_reference = cpu_to_le32(iort->node_offset);
35
s->base.is_jmp = DISAS_NORETURN;
70
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
36
}
37
38
+static void unallocated_encoding(DisasContext *s)
39
+{
40
+ /* Unallocated and reserved encodings are uncategorized */
41
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
42
+ default_exception_el(s));
43
+}
44
+
45
/* Force a TB lookup after an instruction that changes the CPU state. */
46
static inline void gen_lookup_tb(DisasContext *s)
47
{
48
@@ -XXX,XX +XXX,XX @@ static inline void gen_hlt(DisasContext *s, int imm)
49
return;
71
}
50
}
72
51
73
+ /*
52
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
74
+ * Update the pointer address in case table_data->data moves during above
53
- default_exception_el(s));
75
+ * acpi_data_push operations.
54
+ unallocated_encoding(s);
76
+ */
55
}
77
+ iort = (AcpiIortTable *)(table_data->data + iort_start);
56
78
iort->length = cpu_to_le32(iort_length);
57
static inline void gen_add_data_offset(DisasContext *s, unsigned int insn,
79
58
@@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s,
80
build_header(linker, table_data, (void *)(table_data->data + iort_start),
59
}
60
61
if (undef) {
62
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
63
- default_exception_el(s));
64
+ unallocated_encoding(s);
65
return;
66
}
67
68
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
69
break;
70
default:
71
illegal_op:
72
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
73
- default_exception_el(s));
74
+ unallocated_encoding(s);
75
break;
76
}
77
}
78
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
79
}
80
return;
81
illegal_op:
82
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
83
- default_exception_el(s));
84
+ unallocated_encoding(s);
85
}
86
87
static void disas_thumb_insn(DisasContext *s, uint32_t insn)
88
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn)
89
return;
90
illegal_op:
91
undef:
92
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
93
- default_exception_el(s));
94
+ unallocated_encoding(s);
95
}
96
97
static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
81
--
98
--
82
2.17.1
99
2.20.1
83
100
84
101
diff view generated by jsdifflib
1
The FRECPX instructions should (like most other floating point operations)
1
Currently the only part of an ARMCPRegInfo which is allowed to cause
2
honour the FPCR.FZ bit which specifies whether input denormals should
2
a CPU exception is the access function, which returns a value indicating
3
be flushed to zero (or FZ16 for the half-precision version).
3
that some flavour of UNDEF should be generated.
4
We forgot to implement this, which doesn't affect the results (since
4
5
the calculation doesn't actually care about the mantissa bits) but did
5
For the ATS system instructions, we would like to conditionally
6
mean we were failing to set the FPSR.IDC bit.
6
generate exceptions as part of the writefn, because some faults
7
during the page table walk (like external aborts) should cause
8
an exception to be raised rather than returning a value.
9
10
There are several ways we could do this:
11
* plumb the GETPC() value from the top level set_cp_reg/get_cp_reg
12
helper functions through into the readfn and writefn hooks
13
* add extra readfn_with_ra/writefn_with_ra hooks that take the GETPC()
14
value
15
* require the ATS instructions to provide a dummy accessfn,
16
which serves no purpose except to cause the code generation
17
to emit TCG ops to sync the CPU state
18
* add an ARM_CP_ flag to mark the ARMCPRegInfo as possibly
19
throwing an exception in its read/write hooks, and make the
20
codegen sync the CPU state before calling the hooks if the
21
flag is set
22
23
This patch opts for the last of these, as it is fairly simple
24
to implement and doesn't require invasive changes like updating
25
the readfn/writefn hook function prototype signature.
7
26
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
28
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180521172712.19930-1-peter.maydell@linaro.org
29
Tested-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
30
Message-id: 20190816125802.25877-2-peter.maydell@linaro.org
11
---
31
---
12
target/arm/helper-a64.c | 6 ++++++
32
target/arm/cpu.h | 6 +++++-
13
1 file changed, 6 insertions(+)
33
target/arm/translate-a64.c | 6 ++++++
34
target/arm/translate.c | 7 +++++++
35
3 files changed, 18 insertions(+), 1 deletion(-)
14
36
15
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
37
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.c
39
--- a/target/arm/cpu.h
18
+++ b/target/arm/helper-a64.c
40
+++ b/target/arm/cpu.h
19
@@ -XXX,XX +XXX,XX @@ float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
41
@@ -XXX,XX +XXX,XX @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
20
return nan;
42
* IO indicates that this register does I/O and therefore its accesses
43
* need to be surrounded by gen_io_start()/gen_io_end(). In particular,
44
* registers which implement clocks or timers require this.
45
+ * RAISES_EXC is for when the read or write hook might raise an exception;
46
+ * the generated code will synchronize the CPU state before calling the hook
47
+ * so that it is safe for the hook to call raise_exception().
48
*/
49
#define ARM_CP_SPECIAL 0x0001
50
#define ARM_CP_CONST 0x0002
51
@@ -XXX,XX +XXX,XX @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
52
#define ARM_CP_FPU 0x1000
53
#define ARM_CP_SVE 0x2000
54
#define ARM_CP_NO_GDB 0x4000
55
+#define ARM_CP_RAISES_EXC 0x8000
56
/* Used only as a terminator for ARMCPRegInfo lists */
57
#define ARM_CP_SENTINEL 0xffff
58
/* Mask of only the flag bits in a type field */
59
-#define ARM_CP_FLAG_MASK 0x70ff
60
+#define ARM_CP_FLAG_MASK 0xf0ff
61
62
/* Valid values for ARMCPRegInfo state field, indicating which of
63
* the AArch32 and AArch64 execution states this register is visible in.
64
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/arm/translate-a64.c
67
+++ b/target/arm/translate-a64.c
68
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
69
tcg_temp_free_ptr(tmpptr);
70
tcg_temp_free_i32(tcg_syn);
71
tcg_temp_free_i32(tcg_isread);
72
+ } else if (ri->type & ARM_CP_RAISES_EXC) {
73
+ /*
74
+ * The readfn or writefn might raise an exception;
75
+ * synchronize the CPU state in case it does.
76
+ */
77
+ gen_a64_set_pc_im(s->pc_curr);
21
}
78
}
22
79
23
+ a = float16_squash_input_denormal(a, fpst);
80
/* Handle special cases first */
24
+
81
diff --git a/target/arm/translate.c b/target/arm/translate.c
25
val16 = float16_val(a);
82
index XXXXXXX..XXXXXXX 100644
26
sbit = 0x8000 & val16;
83
--- a/target/arm/translate.c
27
exp = extract32(val16, 10, 5);
84
+++ b/target/arm/translate.c
28
@@ -XXX,XX +XXX,XX @@ float32 HELPER(frecpx_f32)(float32 a, void *fpstp)
85
@@ -XXX,XX +XXX,XX @@ static int disas_coproc_insn(DisasContext *s, uint32_t insn)
29
return nan;
86
tcg_temp_free_ptr(tmpptr);
30
}
87
tcg_temp_free_i32(tcg_syn);
31
88
tcg_temp_free_i32(tcg_isread);
32
+ a = float32_squash_input_denormal(a, fpst);
89
+ } else if (ri->type & ARM_CP_RAISES_EXC) {
33
+
90
+ /*
34
val32 = float32_val(a);
91
+ * The readfn or writefn might raise an exception;
35
sbit = 0x80000000ULL & val32;
92
+ * synchronize the CPU state in case it does.
36
exp = extract32(val32, 23, 8);
93
+ */
37
@@ -XXX,XX +XXX,XX @@ float64 HELPER(frecpx_f64)(float64 a, void *fpstp)
94
+ gen_set_condexec(s);
38
return nan;
95
+ gen_set_pc_im(s, s->pc_curr);
39
}
96
}
40
97
41
+ a = float64_squash_input_denormal(a, fpst);
98
/* Handle special cases first */
42
+
43
val64 = float64_val(a);
44
sbit = 0x8000000000000000ULL & val64;
45
exp = extract64(float64_val(a), 52, 11);
46
--
99
--
47
2.17.1
100
2.20.1
48
101
49
102
diff view generated by jsdifflib
Deleted patch
1
Add entries to MAINTAINERS to cover the newer MPS2 boards and
2
the new devices they use.
3
1
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180518153157.14899-1-peter.maydell@linaro.org
6
---
7
MAINTAINERS | 9 +++++++--
8
1 file changed, 7 insertions(+), 2 deletions(-)
9
10
diff --git a/MAINTAINERS b/MAINTAINERS
11
index XXXXXXX..XXXXXXX 100644
12
--- a/MAINTAINERS
13
+++ b/MAINTAINERS
14
@@ -XXX,XX +XXX,XX @@ F: hw/timer/cmsdk-apb-timer.c
15
F: include/hw/timer/cmsdk-apb-timer.h
16
F: hw/char/cmsdk-apb-uart.c
17
F: include/hw/char/cmsdk-apb-uart.h
18
+F: hw/misc/tz-ppc.c
19
+F: include/hw/misc/tz-ppc.h
20
21
ARM cores
22
M: Peter Maydell <peter.maydell@linaro.org>
23
@@ -XXX,XX +XXX,XX @@ M: Peter Maydell <peter.maydell@linaro.org>
24
L: qemu-arm@nongnu.org
25
S: Maintained
26
F: hw/arm/mps2.c
27
-F: hw/misc/mps2-scc.c
28
-F: include/hw/misc/mps2-scc.h
29
+F: hw/arm/mps2-tz.c
30
+F: hw/misc/mps2-*.c
31
+F: include/hw/misc/mps2-*.h
32
+F: hw/arm/iotkit.c
33
+F: include/hw/arm/iotkit.h
34
35
Musicpal
36
M: Jan Kiszka <jan.kiszka@web.de>
37
--
38
2.17.1
39
40
diff view generated by jsdifflib
1
In commit f0aff255700 we made cpacr_write() enforce that some CPACR
1
The translation table walk for an ATS instruction can result in
2
bits are RAZ/WI and some are RAO/WI for ARMv7 cores. Unfortunately
2
various faults. In general these are just reported back via the
3
we forgot to also update the register's reset value. The effect
3
PAR_EL1 fault status fields, but in some cases the architecture
4
was that (a) a guest that read CPACR on reset would not see ones in
4
requires that the fault is turned into an exception:
5
the RAO bits, and (b) if you did a migration before the guest did
5
* synchronous stage 2 faults of any kind during AT S1E0* and
6
a write to the CPACR then the migration would fail because the
6
AT S1E1* instructions executed from NS EL1 fault to EL2 or EL3
7
destination would enforce the RAO bits and then complain that they
7
* synchronous external aborts are taken as Data Abort exceptions
8
didn't match the zero value from the source.
9
8
10
Implement reset for the CPACR using a custom reset function
9
(This is documented in the v8A Arm ARM DDI0487A.e D5.2.11 and
11
that just calls cpacr_write(), to avoid having to duplicate
10
G5.13.4.)
12
the logic for which bits are RAO.
13
11
14
This bug would affect migration for TCG CPUs which are ARMv7
15
with VFP but without one of Neon or VFPv3.
16
17
Reported-by: Cédric Le Goater <clg@kaod.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Tested-by: Cédric Le Goater <clg@kaod.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Message-id: 20180522173713.26282-1-peter.maydell@linaro.org
14
Tested-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
15
Message-id: 20190816125802.25877-3-peter.maydell@linaro.org
21
---
16
---
22
target/arm/helper.c | 10 +++++++++-
17
target/arm/helper.c | 107 +++++++++++++++++++++++++++++++++++++-------
23
1 file changed, 9 insertions(+), 1 deletion(-)
18
1 file changed, 92 insertions(+), 15 deletions(-)
24
19
25
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/helper.c
22
--- a/target/arm/helper.c
28
+++ b/target/arm/helper.c
23
+++ b/target/arm/helper.c
29
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
24
@@ -XXX,XX +XXX,XX @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
30
env->cp15.cpacr_el1 = value;
25
ret = get_phys_addr(env, value, access_type, mmu_idx, &phys_addr, &attrs,
31
}
26
&prot, &page_size, &fi, &cacheattrs);
32
27
33
+static void cpacr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
28
+ if (ret) {
34
+{
29
+ /*
35
+ /* Call cpacr_write() so that we reset with the correct RAO bits set
30
+ * Some kinds of translation fault must cause exceptions rather
36
+ * for our CPU features.
31
+ * than being reported in the PAR.
37
+ */
32
+ */
38
+ cpacr_write(env, ri, 0);
33
+ int current_el = arm_current_el(env);
39
+}
34
+ int target_el;
35
+ uint32_t syn, fsr, fsc;
36
+ bool take_exc = false;
40
+
37
+
41
static CPAccessResult cpacr_access(CPUARMState *env, const ARMCPRegInfo *ri,
38
+ if (fi.s1ptw && current_el == 1 && !arm_is_secure(env)
42
bool isread)
39
+ && (mmu_idx == ARMMMUIdx_S1NSE1 || mmu_idx == ARMMMUIdx_S1NSE0)) {
43
{
40
+ /*
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
41
+ * Synchronous stage 2 fault on an access made as part of the
45
{ .name = "CPACR", .state = ARM_CP_STATE_BOTH, .opc0 = 3,
42
+ * translation table walk for AT S1E0* or AT S1E1* insn
46
.crn = 1, .crm = 0, .opc1 = 0, .opc2 = 2, .accessfn = cpacr_access,
43
+ * executed from NS EL1. If this is a synchronous external abort
47
.access = PL1_RW, .fieldoffset = offsetof(CPUARMState, cp15.cpacr_el1),
44
+ * and SCR_EL3.EA == 1, then we take a synchronous external abort
48
- .resetvalue = 0, .writefn = cpacr_write },
45
+ * to EL3. Otherwise the fault is taken as an exception to EL2,
49
+ .resetfn = cpacr_reset, .writefn = cpacr_write },
46
+ * and HPFAR_EL2 holds the faulting IPA.
47
+ */
48
+ if (fi.type == ARMFault_SyncExternalOnWalk &&
49
+ (env->cp15.scr_el3 & SCR_EA)) {
50
+ target_el = 3;
51
+ } else {
52
+ env->cp15.hpfar_el2 = extract64(fi.s2addr, 12, 47) << 4;
53
+ target_el = 2;
54
+ }
55
+ take_exc = true;
56
+ } else if (fi.type == ARMFault_SyncExternalOnWalk) {
57
+ /*
58
+ * Synchronous external aborts during a translation table walk
59
+ * are taken as Data Abort exceptions.
60
+ */
61
+ if (fi.stage2) {
62
+ if (current_el == 3) {
63
+ target_el = 3;
64
+ } else {
65
+ target_el = 2;
66
+ }
67
+ } else {
68
+ target_el = exception_target_el(env);
69
+ }
70
+ take_exc = true;
71
+ }
72
+
73
+ if (take_exc) {
74
+ /* Construct FSR and FSC using same logic as arm_deliver_fault() */
75
+ if (target_el == 2 || arm_el_is_aa64(env, target_el) ||
76
+ arm_s1_regime_using_lpae_format(env, mmu_idx)) {
77
+ fsr = arm_fi_to_lfsc(&fi);
78
+ fsc = extract32(fsr, 0, 6);
79
+ } else {
80
+ fsr = arm_fi_to_sfsc(&fi);
81
+ fsc = 0x3f;
82
+ }
83
+ /*
84
+ * Report exception with ESR indicating a fault due to a
85
+ * translation table walk for a cache maintenance instruction.
86
+ */
87
+ syn = syn_data_abort_no_iss(current_el == target_el,
88
+ fi.ea, 1, fi.s1ptw, 1, fsc);
89
+ env->exception.vaddress = value;
90
+ env->exception.fsr = fsr;
91
+ raise_exception(env, EXCP_DATA_ABORT, syn, target_el);
92
+ }
93
+ }
94
+
95
if (is_a64(env)) {
96
format64 = true;
97
} else if (arm_feature(env, ARM_FEATURE_LPAE)) {
98
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vapa_cp_reginfo[] = {
99
/* This underdecoding is safe because the reginfo is NO_RAW. */
100
{ .name = "ATS", .cp = 15, .crn = 7, .crm = 8, .opc1 = 0, .opc2 = CP_ANY,
101
.access = PL1_W, .accessfn = ats_access,
102
- .writefn = ats_write, .type = ARM_CP_NO_RAW },
103
+ .writefn = ats_write, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC },
104
#endif
50
REGINFO_SENTINEL
105
REGINFO_SENTINEL
51
};
106
};
52
107
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
108
/* 64 bit address translation operations */
109
{ .name = "AT_S1E1R", .state = ARM_CP_STATE_AA64,
110
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 0,
111
- .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
112
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
113
+ .writefn = ats_write64 },
114
{ .name = "AT_S1E1W", .state = ARM_CP_STATE_AA64,
115
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 1,
116
- .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
117
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
118
+ .writefn = ats_write64 },
119
{ .name = "AT_S1E0R", .state = ARM_CP_STATE_AA64,
120
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 2,
121
- .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
122
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
123
+ .writefn = ats_write64 },
124
{ .name = "AT_S1E0W", .state = ARM_CP_STATE_AA64,
125
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 3,
126
- .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
127
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
128
+ .writefn = ats_write64 },
129
{ .name = "AT_S12E1R", .state = ARM_CP_STATE_AA64,
130
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 4,
131
- .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
132
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
133
+ .writefn = ats_write64 },
134
{ .name = "AT_S12E1W", .state = ARM_CP_STATE_AA64,
135
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 5,
136
- .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
137
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
138
+ .writefn = ats_write64 },
139
{ .name = "AT_S12E0R", .state = ARM_CP_STATE_AA64,
140
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 6,
141
- .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
142
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
143
+ .writefn = ats_write64 },
144
{ .name = "AT_S12E0W", .state = ARM_CP_STATE_AA64,
145
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 7,
146
- .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
147
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
148
+ .writefn = ats_write64 },
149
/* AT S1E2* are elsewhere as they UNDEF from EL3 if EL2 is not present */
150
{ .name = "AT_S1E3R", .state = ARM_CP_STATE_AA64,
151
.opc0 = 1, .opc1 = 6, .crn = 7, .crm = 8, .opc2 = 0,
152
- .access = PL3_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
153
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
154
+ .writefn = ats_write64 },
155
{ .name = "AT_S1E3W", .state = ARM_CP_STATE_AA64,
156
.opc0 = 1, .opc1 = 6, .crn = 7, .crm = 8, .opc2 = 1,
157
- .access = PL3_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
158
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
159
+ .writefn = ats_write64 },
160
{ .name = "PAR_EL1", .state = ARM_CP_STATE_AA64,
161
.type = ARM_CP_ALIAS,
162
.opc0 = 3, .opc1 = 0, .crn = 7, .crm = 4, .opc2 = 0,
163
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
164
{ .name = "AT_S1E2R", .state = ARM_CP_STATE_AA64,
165
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 0,
166
.access = PL2_W, .accessfn = at_s1e2_access,
167
- .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
168
+ .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC, .writefn = ats_write64 },
169
{ .name = "AT_S1E2W", .state = ARM_CP_STATE_AA64,
170
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
171
.access = PL2_W, .accessfn = at_s1e2_access,
172
- .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
173
+ .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC, .writefn = ats_write64 },
174
/* The AArch32 ATS1H* operations are CONSTRAINED UNPREDICTABLE
175
* if EL2 is not implemented; we choose to UNDEF. Behaviour at EL3
176
* with SCR.NS == 0 outside Monitor mode is UNPREDICTABLE; we choose
177
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
178
*/
179
{ .name = "ATS1HR", .cp = 15, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 0,
180
.access = PL2_W,
181
- .writefn = ats1h_write, .type = ARM_CP_NO_RAW },
182
+ .writefn = ats1h_write, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC },
183
{ .name = "ATS1HW", .cp = 15, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
184
.access = PL2_W,
185
- .writefn = ats1h_write, .type = ARM_CP_NO_RAW },
186
+ .writefn = ats1h_write, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC },
187
{ .name = "CNTHCTL_EL2", .state = ARM_CP_STATE_BOTH,
188
.opc0 = 3, .opc1 = 4, .crn = 14, .crm = 1, .opc2 = 0,
189
/* ARMv7 requires bit 0 and 1 to reset to 1. ARMv8 defines the
53
--
190
--
54
2.17.1
191
2.20.1
55
192
56
193
diff view generated by jsdifflib
1
Add more detail to the documentation for memory_region_init_iommu()
1
From: Andrew Jeffery <andrew@aj.id.au>
2
and other IOMMU-related functions and data structures.
3
2
3
First up: This is not the way the hardware behaves.
4
5
However, it helps resolve real-world problems with short periods being
6
used under Linux. Commit 4451d3f59f2a ("clocksource/drivers/fttmr010:
7
Fix set_next_event handler") in Linux fixed the timer driver to
8
correctly schedule the next event for the Aspeed controller, and in
9
combination with 5daa8212c08e ("ARM: dts: aspeed: Describe random number
10
device") Linux will now set a timer with a period as low as 1us.
11
12
Configuring a qemu timer with such a short period results in spending
13
time handling the interrupt in the model rather than executing guest
14
code, leading to noticeable "sticky" behaviour in the guest.
15
16
The behaviour of Linux is correct with respect to the hardware, so we
17
need to improve our handling under emulation. The approach chosen is to
18
provide back-pressure information by calculating an acceptable minimum
19
number of ticks to be set on the model. Under Linux an additional read
20
is added in the timer configuration path to detect back-pressure, which
21
will never occur on hardware. However if back-pressure is observed, the
22
driver alerts the clock event subsystem, which then performs its own
23
next event dilation via a config option - d1748302f70b ("clockevents:
24
Make minimum delay adjustments configurable")
25
26
A minimum period of 5us was experimentally determined on a Lenovo
27
T480s, which I've increased to 20us for "safety".
28
29
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
30
Reviewed-by: Joel Stanley <joel@jms.id.au>
31
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
32
Tested-by: Joel Stanley <joel@jms.id.au>
33
Signed-off-by: Cédric Le Goater <clg@kaod.org>
34
Message-id: 20190704055150.4899-1-clg@kaod.org
35
[clg: - changed the computation of min_ticks to be done each time the
36
timer value is reloaded. It removes the ordering issue of the
37
timer and scu reset handlers but is slightly slower ]
38
- introduced TIMER_MIN_NS
39
- introduced calculate_min_ticks() ]
40
Signed-off-by: Cédric Le Goater <clg@kaod.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
41
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
---
42
---
10
include/exec/memory.h | 105 ++++++++++++++++++++++++++++++++++++++----
43
hw/timer/aspeed_timer.c | 17 ++++++++++++++++-
11
1 file changed, 95 insertions(+), 10 deletions(-)
44
1 file changed, 16 insertions(+), 1 deletion(-)
12
45
13
diff --git a/include/exec/memory.h b/include/exec/memory.h
46
diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c
14
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
15
--- a/include/exec/memory.h
48
--- a/hw/timer/aspeed_timer.c
16
+++ b/include/exec/memory.h
49
+++ b/hw/timer/aspeed_timer.c
17
@@ -XXX,XX +XXX,XX @@ enum IOMMUMemoryRegionAttr {
50
@@ -XXX,XX +XXX,XX @@ enum timer_ctrl_op {
18
IOMMU_ATTR_SPAPR_TCE_FD
51
op_pulse_enable
19
};
52
};
20
53
21
+/**
54
+/*
22
+ * IOMMUMemoryRegionClass:
55
+ * Minimum value of the reload register to filter out short period
23
+ *
56
+ * timers which have a noticeable impact in emulation. 5us should be
24
+ * All IOMMU implementations need to subclass TYPE_IOMMU_MEMORY_REGION
57
+ * enough, use 20us for "safety".
25
+ * and provide an implementation of at least the @translate method here
26
+ * to handle requests to the memory region. Other methods are optional.
27
+ *
28
+ * The IOMMU implementation must use the IOMMU notifier infrastructure
29
+ * to report whenever mappings are changed, by calling
30
+ * memory_region_notify_iommu() (or, if necessary, by calling
31
+ * memory_region_notify_one() for each registered notifier).
32
+ */
58
+ */
33
typedef struct IOMMUMemoryRegionClass {
59
+#define TIMER_MIN_NS (20 * SCALE_US)
34
/* private */
60
+
35
struct DeviceClass parent_class;
61
/**
36
62
* Avoid mutual references between AspeedTimerCtrlState and AspeedTimer
37
/*
63
* structs, as it's a waste of memory. The ptimer BH callback needs to know
38
- * Return a TLB entry that contains a given address. Flag should
64
@@ -XXX,XX +XXX,XX @@ static inline uint32_t calculate_ticks(struct AspeedTimer *t, uint64_t now_ns)
39
- * be the access permission of this translation operation. We can
65
return t->reload - MIN(t->reload, ticks);
40
- * set flag to IOMMU_NONE to mean that we don't need any
66
}
41
- * read/write permission checks, like, when for region replay.
67
42
+ * Return a TLB entry that contains a given address.
68
+static uint32_t calculate_min_ticks(AspeedTimer *t, uint32_t value)
43
+ *
69
+{
44
+ * The IOMMUAccessFlags indicated via @flag are optional and may
70
+ uint32_t rate = calculate_rate(t);
45
+ * be specified as IOMMU_NONE to indicate that the caller needs
71
+ uint32_t min_ticks = muldiv64(TIMER_MIN_NS, rate, NANOSECONDS_PER_SECOND);
46
+ * the full translation information for both reads and writes. If
72
+
47
+ * the access flags are specified then the IOMMU implementation
73
+ return value < min_ticks ? min_ticks : value;
48
+ * may use this as an optimization, to stop doing a page table
74
+}
49
+ * walk as soon as it knows that the requested permissions are not
75
+
50
+ * allowed. If IOMMU_NONE is passed then the IOMMU must do the
76
static inline uint64_t calculate_time(struct AspeedTimer *t, uint32_t ticks)
51
+ * full page table walk and report the permissions in the returned
77
{
52
+ * IOMMUTLBEntry. (Note that this implies that an IOMMU may not
78
uint64_t delta_ns;
53
+ * return different mappings for reads and writes.)
79
@@ -XXX,XX +XXX,XX @@ static void aspeed_timer_set_value(AspeedTimerCtrlState *s, int timer, int reg,
54
+ *
80
switch (reg) {
55
+ * The returned information remains valid while the caller is
81
case TIMER_REG_RELOAD:
56
+ * holding the big QEMU lock or is inside an RCU critical section;
82
old_reload = t->reload;
57
+ * if the caller wishes to cache the mapping beyond that it must
83
- t->reload = value;
58
+ * register an IOMMU notifier so it can invalidate its cached
84
+ t->reload = calculate_min_ticks(t, value);
59
+ * information when the IOMMU mapping changes.
85
60
+ *
86
/* If the reload value was not previously set, or zero, and
61
+ * @iommu: the IOMMUMemoryRegion
87
* the current value is valid, try to start the timer if it is
62
+ * @hwaddr: address to be translated within the memory region
63
+ * @flag: requested access permissions
64
*/
65
IOMMUTLBEntry (*translate)(IOMMUMemoryRegion *iommu, hwaddr addr,
66
IOMMUAccessFlags flag);
67
- /* Returns minimum supported page size */
68
+ /* Returns minimum supported page size in bytes.
69
+ * If this method is not provided then the minimum is assumed to
70
+ * be TARGET_PAGE_SIZE.
71
+ *
72
+ * @iommu: the IOMMUMemoryRegion
73
+ */
74
uint64_t (*get_min_page_size)(IOMMUMemoryRegion *iommu);
75
- /* Called when IOMMU Notifier flag changed */
76
+ /* Called when IOMMU Notifier flag changes (ie when the set of
77
+ * events which IOMMU users are requesting notification for changes).
78
+ * Optional method -- need not be provided if the IOMMU does not
79
+ * need to know exactly which events must be notified.
80
+ *
81
+ * @iommu: the IOMMUMemoryRegion
82
+ * @old_flags: events which previously needed to be notified
83
+ * @new_flags: events which now need to be notified
84
+ */
85
void (*notify_flag_changed)(IOMMUMemoryRegion *iommu,
86
IOMMUNotifierFlag old_flags,
87
IOMMUNotifierFlag new_flags);
88
- /* Set this up to provide customized IOMMU replay function */
89
+ /* Called to handle memory_region_iommu_replay().
90
+ *
91
+ * The default implementation of memory_region_iommu_replay() is to
92
+ * call the IOMMU translate method for every page in the address space
93
+ * with flag == IOMMU_NONE and then call the notifier if translate
94
+ * returns a valid mapping. If this method is implemented then it
95
+ * overrides the default behaviour, and must provide the full semantics
96
+ * of memory_region_iommu_replay(), by calling @notifier for every
97
+ * translation present in the IOMMU.
98
+ *
99
+ * Optional method -- an IOMMU only needs to provide this method
100
+ * if the default is inefficient or produces undesirable side effects.
101
+ *
102
+ * Note: this is not related to record-and-replay functionality.
103
+ */
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
--
88
--
172
2.17.1
89
2.20.1
173
90
174
91
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Eric Auger <eric.auger@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
memory_region_iommu_replay_all is not used. Remove it.
6
callbacks and add new a new _with_attrs version, but since there
7
are so few implementations of the accepts hook we just change
8
them all.
9
4
5
Signed-off-by: Eric Auger <eric.auger@redhat.com>
6
Reported-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Peter Xu <peterx@redhat.com>
9
Message-id: 20190822172350.12008-2-eric.auger@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Alex Bennée <alex.bennee@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
include/exec/memory.h | 10 ----------
16
exec.c | 9 ++++++---
13
memory.c | 9 ---------
17
hw/hppa/dino.c | 3 ++-
14
2 files changed, 19 deletions(-)
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
15
24
diff --git a/include/exec/memory.h b/include/exec/memory.h
16
diff --git a/include/exec/memory.h b/include/exec/memory.h
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory.h
18
--- a/include/exec/memory.h
27
+++ b/include/exec/memory.h
19
+++ b/include/exec/memory.h
28
@@ -XXX,XX +XXX,XX @@ struct MemoryRegionOps {
20
@@ -XXX,XX +XXX,XX @@ void memory_region_register_iommu_notifier(MemoryRegion *mr,
29
* as a machine check exception).
21
*/
30
*/
22
void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n);
31
bool (*accepts)(void *opaque, hwaddr addr,
23
32
- unsigned size, bool is_write);
24
-/**
33
+ unsigned size, bool is_write,
25
- * memory_region_iommu_replay_all: replay existing IOMMU translations
34
+ MemTxAttrs attrs);
26
- * to all the notifiers registered.
35
} valid;
27
- *
36
/* Internal implementation constraints: */
28
- * Note: this is not related to record-and-replay functionality.
37
struct {
29
- *
38
diff --git a/exec.c b/exec.c
30
- * @iommu_mr: the memory region to observe
39
index XXXXXXX..XXXXXXX 100644
31
- */
40
--- a/exec.c
32
-void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr);
41
+++ b/exec.c
33
-
42
@@ -XXX,XX +XXX,XX @@ static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
34
/**
43
}
35
* memory_region_unregister_iommu_notifier: unregister a notifier for
44
36
* changes to IOMMU translation entries.
45
static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
46
- unsigned size, bool is_write)
47
+ unsigned size, bool is_write,
48
+ MemTxAttrs attrs)
49
{
50
return is_write;
51
}
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult subpage_write(void *opaque, hwaddr addr,
53
}
54
55
static bool subpage_accepts(void *opaque, hwaddr addr,
56
- unsigned len, bool is_write)
57
+ unsigned len, bool is_write,
58
+ MemTxAttrs attrs)
59
{
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
37
diff --git a/memory.c b/memory.c
158
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
159
--- a/memory.c
39
--- a/memory.c
160
+++ b/memory.c
40
+++ b/memory.c
161
@@ -XXX,XX +XXX,XX @@ static void unassigned_mem_write(void *opaque, hwaddr addr,
41
@@ -XXX,XX +XXX,XX @@ void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n)
42
}
162
}
43
}
163
44
164
static bool unassigned_mem_accepts(void *opaque, hwaddr addr,
45
-void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr)
165
- unsigned size, bool is_write)
46
-{
166
+ unsigned size, bool is_write,
47
- IOMMUNotifier *notifier;
167
+ MemTxAttrs attrs)
48
-
49
- IOMMU_NOTIFIER_FOREACH(notifier, iommu_mr) {
50
- memory_region_iommu_replay(iommu_mr, notifier);
51
- }
52
-}
53
-
54
void memory_region_unregister_iommu_notifier(MemoryRegion *mr,
55
IOMMUNotifier *n)
168
{
56
{
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
--
57
--
181
2.17.1
58
2.20.1
182
59
183
60
diff view generated by jsdifflib
1
Provide a VMSTATE_BOOL_SUB_ARRAY to go with VMSTATE_UINT8_SUB_ARRAY
1
From: Eric Auger <eric.auger@redhat.com>
2
and friends.
3
2
3
Log a guest error when encountering an invalid STE.
4
5
Signed-off-by: Eric Auger <eric.auger@redhat.com>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Message-id: 20190822172350.12008-5-eric.auger@redhat.com
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>
6
Message-id: 20180521140402.23318-23-peter.maydell@linaro.org
7
---
9
---
8
include/migration/vmstate.h | 3 +++
10
hw/arm/smmuv3.c | 1 +
9
1 file changed, 3 insertions(+)
11
1 file changed, 1 insertion(+)
10
12
11
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
13
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/include/migration/vmstate.h
15
--- a/hw/arm/smmuv3.c
14
+++ b/include/migration/vmstate.h
16
+++ b/hw/arm/smmuv3.c
15
@@ -XXX,XX +XXX,XX @@ extern const VMStateInfo vmstate_info_qtailq;
17
@@ -XXX,XX +XXX,XX @@ static int decode_ste(SMMUv3State *s, SMMUTransCfg *cfg,
16
#define VMSTATE_BOOL_ARRAY(_f, _s, _n) \
18
uint32_t config;
17
VMSTATE_BOOL_ARRAY_V(_f, _s, _n, 0)
19
18
20
if (!STE_VALID(ste)) {
19
+#define VMSTATE_BOOL_SUB_ARRAY(_f, _s, _start, _num) \
21
+ qemu_log_mask(LOG_GUEST_ERROR, "invalid STE\n");
20
+ VMSTATE_SUB_ARRAY(_f, _s, _start, _num, 0, vmstate_info_bool, bool)
22
goto bad_ste;
21
+
23
}
22
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v) \
23
VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
24
24
25
--
25
--
26
2.17.1
26
2.20.1
27
27
28
28
diff view generated by jsdifflib
1
From: Igor Mammedov <imammedo@redhat.com>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
When QEMU is started with following CLI
3
An IOVA/ASID invalidation is notified to all IOMMU Memory Regions
4
-machine virt,gic-version=3,accel=kvm -cpu host -bios AAVMF_CODE.fd
4
through smmuv3_inv_notifiers_iova/smmuv3_notify_iova.
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
When the notification occurs it is possible that some of the
10
arm_gicv3_icc_reset() where the later is called by CPU reset
7
PCIe devices associated to the notified regions do not have a
11
reset callback.
8
valid stream table entry. In that case we output a LOG_GUEST_ERROR
9
message, for example:
12
10
13
However commit:
11
invalid sid=<SID> (L1STD span=0)
14
3b77f6c arm/boot: split load_dtb() from arm_load_kernel()
12
"smmuv3_notify_iova error decoding the configuration for iommu mr=<MR>
15
broke CPU reset callback registration in case
16
13
17
arm_load_kernel()
14
This is unfortunate as the user gets the impression that there
18
...
15
are some translation decoding errors whereas there are not.
19
if (!info->kernel_filename || info->firmware_loaded)
20
16
21
branch is taken, i.e. it's sufficient to provide a firmware
17
This patch adds a new field in SMMUEventInfo that tells whether
22
or do not provide kernel on CLI to skip cpu reset callback
18
the detection of an invalid STE must lead to an error report.
23
registration, where before offending commit the callback
19
invalid_ste_allowed is set before doing the invalidations and
24
has been registered unconditionally.
20
kept unset on actual translation.
25
21
26
Fix it by registering the callback right at the beginning of
22
The other configuration decoding error messages are kept since if the
27
arm_load_kernel() unconditionally instead of doing it at the end.
23
STE is valid then the rest of the config must be correct.
28
24
29
NOTE:
25
Signed-off-by: Eric Auger <eric.auger@redhat.com>
30
we probably should eliminate that dependency anyways as well as
26
Message-id: 20190822172350.12008-6-eric.auger@redhat.com
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>
27
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
42
---
29
---
43
hw/arm/boot.c | 18 +++++++++---------
30
hw/arm/smmuv3-internal.h | 1 +
44
1 file changed, 9 insertions(+), 9 deletions(-)
31
hw/arm/smmuv3.c | 19 +++++++++++--------
32
2 files changed, 12 insertions(+), 8 deletions(-)
45
33
46
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
34
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
47
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/boot.c
36
--- a/hw/arm/smmuv3-internal.h
49
+++ b/hw/arm/boot.c
37
+++ b/hw/arm/smmuv3-internal.h
50
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
38
@@ -XXX,XX +XXX,XX @@ typedef struct SMMUEventInfo {
51
static const ARMInsnFixup *primary_loader;
39
uint32_t sid;
52
AddressSpace *as = arm_boot_address_space(cpu, info);
40
bool recorded;
53
41
bool record_trans_faults;
54
+ /* CPU objects (unlike devices) are not automatically reset on system
42
+ bool inval_ste_allowed;
55
+ * reset, so we must always register a handler to do so. If we're
43
union {
56
+ * actually loading a kernel, the handler is also responsible for
44
struct {
57
+ * arranging that we start it correctly.
45
uint32_t ssid;
58
+ */
46
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
59
+ for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
47
index XXXXXXX..XXXXXXX 100644
60
+ qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
48
--- a/hw/arm/smmuv3.c
61
+ }
49
+++ b/hw/arm/smmuv3.c
62
+
50
@@ -XXX,XX +XXX,XX @@ static int decode_ste(SMMUv3State *s, SMMUTransCfg *cfg,
63
/* The board code is not supposed to set secure_board_setup unless
51
uint32_t config;
64
* running its code in secure mode is actually possible, and KVM
52
65
* doesn't support secure.
53
if (!STE_VALID(ste)) {
66
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
54
- qemu_log_mask(LOG_GUEST_ERROR, "invalid STE\n");
67
ARM_CPU(cs)->env.boot_info = info;
55
+ if (!event->inval_ste_allowed) {
56
+ qemu_log_mask(LOG_GUEST_ERROR, "invalid STE\n");
57
+ }
58
goto bad_ste;
68
}
59
}
69
60
70
- /* CPU objects (unlike devices) are not automatically reset on system
61
@@ -XXX,XX +XXX,XX @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
71
- * reset, so we must always register a handler to do so. If we're
62
72
- * actually loading a kernel, the handler is also responsible for
63
if (!span) {
73
- * arranging that we start it correctly.
64
/* l2ptr is not valid */
74
- */
65
- qemu_log_mask(LOG_GUEST_ERROR,
75
- for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
66
- "invalid sid=%d (L1STD span=0)\n", sid);
76
- qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
67
+ if (!event->inval_ste_allowed) {
77
- }
68
+ qemu_log_mask(LOG_GUEST_ERROR,
78
-
69
+ "invalid sid=%d (L1STD span=0)\n", sid);
79
if (!info->skip_dtb_autoload && have_dtb(info)) {
70
+ }
80
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
71
event->type = SMMU_EVT_C_BAD_STREAMID;
81
exit(1);
72
return -EINVAL;
73
}
74
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
75
SMMUDevice *sdev = container_of(mr, SMMUDevice, iommu);
76
SMMUv3State *s = sdev->smmu;
77
uint32_t sid = smmu_get_sid(sdev);
78
- SMMUEventInfo event = {.type = SMMU_EVT_NONE, .sid = sid};
79
+ SMMUEventInfo event = {.type = SMMU_EVT_NONE,
80
+ .sid = sid,
81
+ .inval_ste_allowed = false};
82
SMMUPTWEventInfo ptw_info = {};
83
SMMUTranslationStatus status;
84
SMMUState *bs = ARM_SMMU(s);
85
@@ -XXX,XX +XXX,XX @@ static void smmuv3_notify_iova(IOMMUMemoryRegion *mr,
86
dma_addr_t iova)
87
{
88
SMMUDevice *sdev = container_of(mr, SMMUDevice, iommu);
89
- SMMUEventInfo event = {};
90
+ SMMUEventInfo event = {.inval_ste_allowed = true};
91
SMMUTransTableInfo *tt;
92
SMMUTransCfg *cfg;
93
IOMMUTLBEntry entry;
94
95
cfg = smmuv3_get_config(sdev, &event);
96
if (!cfg) {
97
- qemu_log_mask(LOG_GUEST_ERROR,
98
- "%s error decoding the configuration for iommu mr=%s\n",
99
- __func__, mr->parent_obj.name);
100
return;
101
}
102
82
--
103
--
83
2.17.1
104
2.20.1
84
105
85
106
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
The previous simplification got the order of operands to the
4
first 4 bytes.
4
subtraction wrong. Since the 64-bit product is the subtrahend,
5
we must use a 64-bit subtract to properly compute the borrow
6
from the low-part of the product.
5
7
6
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
8
Fixes: 5f8cd06ebcf5 ("target/arm: Simplify SMMLA, SMMLAR, SMMLS, SMMLSR")
7
Cc: qemu-stable@nongnu.org
9
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
8
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
11
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Message-id: 1527047633-12368-1-git-send-email-zhaoshenglong@huawei.com
12
Message-id: 20190829013258.16102-1-richard.henderson@linaro.org
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
15
---
14
hw/intc/arm_gicv3_kvm.c | 1 +
16
target/arm/translate.c | 20 ++++++++++++++++++--
15
1 file changed, 1 insertion(+)
17
1 file changed, 18 insertions(+), 2 deletions(-)
16
18
17
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
19
diff --git a/target/arm/translate.c b/target/arm/translate.c
18
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/arm_gicv3_kvm.c
21
--- a/target/arm/translate.c
20
+++ b/hw/intc/arm_gicv3_kvm.c
22
+++ b/target/arm/translate.c
21
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
23
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
22
if (clroffset != 0) {
24
if (rd != 15) {
23
reg = 0;
25
tmp3 = load_reg(s, rd);
24
kvm_gicd_access(s, clroffset, &reg, true);
26
if (insn & (1 << 6)) {
25
+ clroffset += 4;
27
- tcg_gen_sub_i32(tmp, tmp, tmp3);
26
}
28
+ /*
27
reg = *gic_bmp_ptr32(bmp, irq);
29
+ * For SMMLS, we need a 64-bit subtract.
28
kvm_gicd_access(s, offset, &reg, true);
30
+ * Borrow caused by a non-zero multiplicand
31
+ * lowpart, and the correct result lowpart
32
+ * for rounding.
33
+ */
34
+ TCGv_i32 zero = tcg_const_i32(0);
35
+ tcg_gen_sub2_i32(tmp2, tmp, zero, tmp3,
36
+ tmp2, tmp);
37
+ tcg_temp_free_i32(zero);
38
} else {
39
tcg_gen_add_i32(tmp, tmp, tmp3);
40
}
41
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
42
if (insn & (1 << 20)) {
43
tcg_gen_add_i32(tmp, tmp, tmp3);
44
} else {
45
- tcg_gen_sub_i32(tmp, tmp, tmp3);
46
+ /*
47
+ * For SMMLS, we need a 64-bit subtract.
48
+ * Borrow caused by a non-zero multiplicand lowpart,
49
+ * and the correct result lowpart for rounding.
50
+ */
51
+ TCGv_i32 zero = tcg_const_i32(0);
52
+ tcg_gen_sub2_i32(tmp2, tmp, zero, tmp3, tmp2, tmp);
53
+ tcg_temp_free_i32(zero);
54
}
55
tcg_temp_free_i32(tmp3);
56
}
29
--
57
--
30
2.17.1
58
2.20.1
31
59
32
60
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_translate(); all its
3
callers now have attrs available.
4
2
3
Commit ba1ba5cca introduce the ARM_CPU_TYPE_NAME() macro.
4
Unify the code base by use it in all places.
5
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20190823143249.8096-2-philmd@redhat.com
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
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
---
11
---
10
include/exec/memory.h | 7 ++++---
12
hw/arm/allwinner-a10.c | 3 ++-
11
exec.c | 17 +++++++++--------
13
hw/arm/cubieboard.c | 3 ++-
12
2 files changed, 13 insertions(+), 11 deletions(-)
14
hw/arm/digic.c | 3 ++-
15
hw/arm/fsl-imx25.c | 2 +-
16
hw/arm/fsl-imx31.c | 2 +-
17
hw/arm/fsl-imx6.c | 3 ++-
18
hw/arm/fsl-imx6ul.c | 2 +-
19
hw/arm/xlnx-zynqmp.c | 8 ++++----
20
8 files changed, 15 insertions(+), 11 deletions(-)
13
21
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
22
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
15
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
24
--- a/hw/arm/allwinner-a10.c
17
+++ b/include/exec/memory.h
25
+++ b/hw/arm/allwinner-a10.c
18
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
26
@@ -XXX,XX +XXX,XX @@ static void aw_a10_init(Object *obj)
19
*/
27
AwA10State *s = AW_A10(obj);
20
MemoryRegion *flatview_translate(FlatView *fv,
28
21
hwaddr addr, hwaddr *xlat,
29
object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
22
- hwaddr *len, bool is_write);
30
- "cortex-a8-" TYPE_ARM_CPU, &error_abort, NULL);
23
+ hwaddr *len, bool is_write,
31
+ ARM_CPU_TYPE_NAME("cortex-a8"),
24
+ MemTxAttrs attrs);
32
+ &error_abort, NULL);
25
33
26
static inline MemoryRegion *address_space_translate(AddressSpace *as,
34
sysbus_init_child_obj(obj, "intc", &s->intc, sizeof(s->intc),
27
hwaddr addr, hwaddr *xlat,
35
TYPE_AW_A10_PIC);
28
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
36
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
29
MemTxAttrs attrs)
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/arm/cubieboard.c
39
+++ b/hw/arm/cubieboard.c
40
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
41
42
static void cubieboard_machine_init(MachineClass *mc)
30
{
43
{
31
return flatview_translate(address_space_to_flatview(as),
44
- mc->desc = "cubietech cubieboard";
32
- addr, xlat, len, is_write);
45
+ mc->desc = "cubietech cubieboard (Cortex-A9)";
33
+ addr, xlat, len, is_write, attrs);
46
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
34
}
47
mc->init = cubieboard_init;
35
48
mc->block_default_type = IF_IDE;
36
/* address_space_access_valid: check for validity of accessing an address
49
mc->units_per_default_bus = 1;
37
@@ -XXX,XX +XXX,XX @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
50
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
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
51
index XXXXXXX..XXXXXXX 100644
48
--- a/exec.c
52
--- a/hw/arm/digic.c
49
+++ b/exec.c
53
+++ b/hw/arm/digic.c
50
@@ -XXX,XX +XXX,XX @@ iotlb_fail:
54
@@ -XXX,XX +XXX,XX @@ static void digic_init(Object *obj)
51
55
int i;
52
/* Called from RCU critical section */
56
53
MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
57
object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
54
- hwaddr *plen, bool is_write)
58
- "arm946-" TYPE_ARM_CPU, &error_abort, NULL);
55
+ hwaddr *plen, bool is_write,
59
+ ARM_CPU_TYPE_NAME("arm946"),
56
+ MemTxAttrs attrs)
60
+ &error_abort, NULL);
57
{
61
58
MemoryRegion *mr;
62
for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
59
MemoryRegionSection section;
63
#define DIGIC_TIMER_NAME_MLEN 11
60
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
64
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
61
}
65
index XXXXXXX..XXXXXXX 100644
62
66
--- a/hw/arm/fsl-imx25.c
63
l = len;
67
+++ b/hw/arm/fsl-imx25.c
64
- mr = flatview_translate(fv, addr, &addr1, &l, true);
68
@@ -XXX,XX +XXX,XX @@ static void fsl_imx25_init(Object *obj)
65
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
69
FslIMX25State *s = FSL_IMX25(obj);
70
int i;
71
72
- object_initialize(&s->cpu, sizeof(s->cpu), "arm926-" TYPE_ARM_CPU);
73
+ object_initialize(&s->cpu, sizeof(s->cpu), ARM_CPU_TYPE_NAME("arm926"));
74
75
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
76
TYPE_IMX_AVIC);
77
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/arm/fsl-imx31.c
80
+++ b/hw/arm/fsl-imx31.c
81
@@ -XXX,XX +XXX,XX @@ static void fsl_imx31_init(Object *obj)
82
FslIMX31State *s = FSL_IMX31(obj);
83
int i;
84
85
- object_initialize(&s->cpu, sizeof(s->cpu), "arm1136-" TYPE_ARM_CPU);
86
+ object_initialize(&s->cpu, sizeof(s->cpu), ARM_CPU_TYPE_NAME("arm1136"));
87
88
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
89
TYPE_IMX_AVIC);
90
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/hw/arm/fsl-imx6.c
93
+++ b/hw/arm/fsl-imx6.c
94
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_init(Object *obj)
95
for (i = 0; i < MIN(ms->smp.cpus, FSL_IMX6_NUM_CPUS); i++) {
96
snprintf(name, NAME_SIZE, "cpu%d", i);
97
object_initialize_child(obj, name, &s->cpu[i], sizeof(s->cpu[i]),
98
- "cortex-a9-" TYPE_ARM_CPU, &error_abort, NULL);
99
+ ARM_CPU_TYPE_NAME("cortex-a9"),
100
+ &error_abort, NULL);
66
}
101
}
67
102
68
return result;
103
sysbus_init_child_obj(obj, "a9mpcore", &s->a9mpcore, sizeof(s->a9mpcore),
69
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
104
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
70
MemTxResult result = MEMTX_OK;
105
index XXXXXXX..XXXXXXX 100644
71
106
--- a/hw/arm/fsl-imx6ul.c
72
l = len;
107
+++ b/hw/arm/fsl-imx6ul.c
73
- mr = flatview_translate(fv, addr, &addr1, &l, true);
108
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_init(Object *obj)
74
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
109
int i;
75
result = flatview_write_continue(fv, addr, attrs, buf, len,
110
76
addr1, l, mr);
111
object_initialize_child(obj, "cpu0", &s->cpu, sizeof(s->cpu),
77
112
- "cortex-a7-" TYPE_ARM_CPU, &error_abort, NULL);
78
@@ -XXX,XX +XXX,XX @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
113
+ ARM_CPU_TYPE_NAME("cortex-a7"), &error_abort, NULL);
79
}
114
80
115
/*
81
l = len;
116
* A7MPCORE
82
- mr = flatview_translate(fv, addr, &addr1, &l, false);
117
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
83
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
118
index XXXXXXX..XXXXXXX 100644
119
--- a/hw/arm/xlnx-zynqmp.c
120
+++ b/hw/arm/xlnx-zynqmp.c
121
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
122
123
object_initialize_child(OBJECT(&s->rpu_cluster), "rpu-cpu[*]",
124
&s->rpu_cpu[i], sizeof(s->rpu_cpu[i]),
125
- "cortex-r5f-" TYPE_ARM_CPU, &error_abort,
126
- NULL);
127
+ ARM_CPU_TYPE_NAME("cortex-r5f"),
128
+ &error_abort, NULL);
129
130
name = object_get_canonical_path_component(OBJECT(&s->rpu_cpu[i]));
131
if (strcmp(name, boot_cpu)) {
132
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(Object *obj)
133
for (i = 0; i < num_apus; i++) {
134
object_initialize_child(OBJECT(&s->apu_cluster), "apu-cpu[*]",
135
&s->apu_cpu[i], sizeof(s->apu_cpu[i]),
136
- "cortex-a53-" TYPE_ARM_CPU, &error_abort,
137
- NULL);
138
+ ARM_CPU_TYPE_NAME("cortex-a53"),
139
+ &error_abort, NULL);
84
}
140
}
85
141
86
return result;
142
sysbus_init_child_obj(obj, "gic", &s->gic, sizeof(s->gic),
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
--
143
--
124
2.17.1
144
2.20.1
125
145
126
146
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_do_translate().
3
2
3
As explained in commit aff39be0ed97:
4
5
Both functions, object_initialize() and object_property_add_child()
6
increase the reference counter of the new object, so one of the
7
references has to be dropped afterwards to get the reference
8
counting right. Otherwise the child object will not be properly
9
cleaned up when the parent gets destroyed.
10
Thus let's use now object_initialize_child() instead to get the
11
reference counting here right.
12
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Reviewed-by: Thomas Huth <thuth@redhat.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20190823143249.8096-3-philmd@redhat.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
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-13-peter.maydell@linaro.org
8
---
19
---
9
exec.c | 9 ++++++---
20
hw/arm/mcimx7d-sabre.c | 9 ++++-----
10
1 file changed, 6 insertions(+), 3 deletions(-)
21
hw/arm/mps2-tz.c | 15 +++++++--------
22
hw/arm/musca.c | 9 +++++----
23
3 files changed, 16 insertions(+), 17 deletions(-)
11
24
12
diff --git a/exec.c b/exec.c
25
diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
13
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
27
--- a/hw/arm/mcimx7d-sabre.c
15
+++ b/exec.c
28
+++ b/hw/arm/mcimx7d-sabre.c
16
@@ -XXX,XX +XXX,XX @@ unassigned:
29
@@ -XXX,XX +XXX,XX @@ static void mcimx7d_sabre_init(MachineState *machine)
17
* @is_write: whether the translation operation is for write
18
* @is_mmio: whether this can be MMIO, set true if it can
19
* @target_as: the address space targeted by the IOMMU
20
+ * @attrs: memory transaction attributes
21
*
22
* This function is called from RCU critical section
23
*/
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
{
30
{
32
MemoryRegionSection *section;
31
static struct arm_boot_info boot_info;
33
IOMMUMemoryRegion *iommu_mr;
32
MCIMX7Sabre *s = g_new0(MCIMX7Sabre, 1);
34
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
33
- Object *soc;
35
* but page mask.
34
int i;
35
36
if (machine->ram_size > FSL_IMX7_MMDC_SIZE) {
37
@@ -XXX,XX +XXX,XX @@ static void mcimx7d_sabre_init(MachineState *machine)
38
.nb_cpus = machine->smp.cpus,
39
};
40
41
- object_initialize(&s->soc, sizeof(s->soc), TYPE_FSL_IMX7);
42
- soc = OBJECT(&s->soc);
43
- object_property_add_child(OBJECT(machine), "soc", soc, &error_fatal);
44
- object_property_set_bool(soc, true, "realized", &error_fatal);
45
+ object_initialize_child(OBJECT(machine), "soc",
46
+ &s->soc, sizeof(s->soc),
47
+ TYPE_FSL_IMX7, &error_fatal, NULL);
48
+ object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
49
50
memory_region_allocate_system_memory(&s->ram, NULL, "mcimx7d-sabre.ram",
51
machine->ram_size);
52
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/hw/arm/mps2-tz.c
55
+++ b/hw/arm/mps2-tz.c
56
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
57
/* The sec_resp_cfg output from the IoTKit must be split into multiple
58
* lines, one for each of the PPCs we create here, plus one per MSC.
36
*/
59
*/
37
section = flatview_do_translate(address_space_to_flatview(as), addr, &xlat,
60
- object_initialize(&mms->sec_resp_splitter, sizeof(mms->sec_resp_splitter),
38
- NULL, &page_mask, is_write, false, &as);
61
- TYPE_SPLIT_IRQ);
39
+ NULL, &page_mask, is_write, false, &as,
62
- object_property_add_child(OBJECT(machine), "sec-resp-splitter",
40
+ attrs);
63
- OBJECT(&mms->sec_resp_splitter), &error_abort);
41
64
+ object_initialize_child(OBJECT(machine), "sec-resp-splitter",
42
/* Illegal translation */
65
+ &mms->sec_resp_splitter,
43
if (section.mr == &io_mem_unassigned) {
66
+ sizeof(mms->sec_resp_splitter),
44
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
67
+ TYPE_SPLIT_IRQ, &error_abort, NULL);
45
68
object_property_set_int(OBJECT(&mms->sec_resp_splitter),
46
/* This can be MMIO, so setup MMIO bit. */
69
ARRAY_SIZE(mms->ppc) + ARRAY_SIZE(mms->msc),
47
section = flatview_do_translate(fv, addr, xlat, plen, NULL,
70
"num-lines", &error_fatal);
48
- is_write, true, &as);
71
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
49
+ is_write, true, &as, attrs);
72
* Tx, Rx and "combined" IRQs are sent to the NVIC separately.
50
mr = section.mr;
73
* Create the OR gate for this.
51
74
*/
52
if (xen_enabled() && memory_access_is_direct(mr, is_write)) {
75
- object_initialize(&mms->uart_irq_orgate, sizeof(mms->uart_irq_orgate),
76
- TYPE_OR_IRQ);
77
- object_property_add_child(OBJECT(mms), "uart-irq-orgate",
78
- OBJECT(&mms->uart_irq_orgate), &error_abort);
79
+ object_initialize_child(OBJECT(mms), "uart-irq-orgate",
80
+ &mms->uart_irq_orgate, sizeof(mms->uart_irq_orgate),
81
+ TYPE_OR_IRQ, &error_abort, NULL);
82
object_property_set_int(OBJECT(&mms->uart_irq_orgate), 10, "num-lines",
83
&error_fatal);
84
object_property_set_bool(OBJECT(&mms->uart_irq_orgate), true,
85
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/hw/arm/musca.c
88
+++ b/hw/arm/musca.c
89
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
90
* The sec_resp_cfg output from the SSE-200 must be split into multiple
91
* lines, one for each of the PPCs we create here.
92
*/
93
- object_initialize(&mms->sec_resp_splitter, sizeof(mms->sec_resp_splitter),
94
- TYPE_SPLIT_IRQ);
95
- object_property_add_child(OBJECT(machine), "sec-resp-splitter",
96
- OBJECT(&mms->sec_resp_splitter), &error_fatal);
97
+ object_initialize_child(OBJECT(machine), "sec-resp-splitter",
98
+ &mms->sec_resp_splitter,
99
+ sizeof(mms->sec_resp_splitter),
100
+ TYPE_SPLIT_IRQ, &error_fatal, NULL);
101
+
102
object_property_set_int(OBJECT(&mms->sec_resp_splitter),
103
ARRAY_SIZE(mms->ppc), "num-lines", &error_fatal);
104
object_property_set_bool(OBJECT(&mms->sec_resp_splitter), true,
53
--
105
--
54
2.17.1
106
2.20.1
55
107
56
108
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_translate_iommu().
3
2
3
Both object_initialize() and qdev_set_parent_bus() increase the
4
reference counter of the new object, so one of the references has
5
to be dropped afterwards to get the reference counting right.
6
In machine model code this refcount leak is not particularly
7
problematic because (unlike devices) machines will never be
8
created on demand via QMP, and they are never destroyed.
9
But in any case let's use the new sysbus_init_child_obj() instead
10
to get the reference counting here right.
11
12
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20190823143249.8096-4-philmd@redhat.com
15
[PMM: rewrote commit message]
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
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
---
17
---
9
exec.c | 8 +++++---
18
hw/arm/exynos4_boards.c | 4 ++--
10
1 file changed, 5 insertions(+), 3 deletions(-)
19
1 file changed, 2 insertions(+), 2 deletions(-)
11
20
12
diff --git a/exec.c b/exec.c
21
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
13
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
23
--- a/hw/arm/exynos4_boards.c
15
+++ b/exec.c
24
+++ b/hw/arm/exynos4_boards.c
16
@@ -XXX,XX +XXX,XX @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
25
@@ -XXX,XX +XXX,XX @@ exynos4_boards_init_common(MachineState *machine,
17
* @is_write: whether the translation operation is for write
26
exynos4_boards_init_ram(s, get_system_memory(),
18
* @is_mmio: whether this can be MMIO, set true if it can
27
exynos4_board_ram_size[board_type]);
19
* @target_as: the address space targeted by the IOMMU
28
20
+ * @attrs: transaction attributes
29
- object_initialize(&s->soc, sizeof(s->soc), TYPE_EXYNOS4210_SOC);
21
*
30
- qdev_set_parent_bus(DEVICE(&s->soc), sysbus_get_default());
22
* This function is called from RCU critical section. It is the common
31
+ sysbus_init_child_obj(OBJECT(machine), "soc",
23
* part of flatview_do_translate and address_space_translate_cached.
32
+ &s->soc, sizeof(s->soc), TYPE_EXYNOS4210_SOC);
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection address_space_translate_iommu(IOMMUMemoryRegion *iomm
33
object_property_set_bool(OBJECT(&s->soc), true, "realized",
25
hwaddr *page_mask_out,
34
&error_fatal);
26
bool is_write,
27
bool is_mmio,
28
- AddressSpace **target_as)
29
+ AddressSpace **target_as,
30
+ MemTxAttrs attrs)
31
{
32
MemoryRegionSection *section;
33
hwaddr page_mask = (hwaddr)-1;
34
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
35
return address_space_translate_iommu(iommu_mr, xlat,
36
plen_out, page_mask_out,
37
is_write, is_mmio,
38
- target_as);
39
+ target_as, attrs);
40
}
41
if (page_mask_out) {
42
/* Not behind an IOMMU, use default page size. */
43
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate_cached(
44
45
section = address_space_translate_iommu(iommu_mr, xlat, plen,
46
NULL, is_write, true,
47
- &target_as);
48
+ &target_as, attrs);
49
return section.mr;
50
}
51
35
52
--
36
--
53
2.17.1
37
2.20.1
54
38
55
39
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_get_iotlb_entry().
3
2
3
Child properties form the composition tree. All objects need to be
4
a child of another object. Objects can only be a child of one object.
5
6
Respect this with the i.MX SoC, to get a cleaner composition tree.
7
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20190823143249.8096-5-philmd@redhat.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
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-12-peter.maydell@linaro.org
8
---
12
---
9
include/exec/memory.h | 2 +-
13
hw/arm/fsl-imx25.c | 4 +++-
10
exec.c | 2 +-
14
hw/arm/fsl-imx31.c | 4 +++-
11
hw/virtio/vhost.c | 3 ++-
15
2 files changed, 6 insertions(+), 2 deletions(-)
12
3 files changed, 4 insertions(+), 3 deletions(-)
13
16
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
17
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
19
--- a/hw/arm/fsl-imx25.c
17
+++ b/include/exec/memory.h
20
+++ b/hw/arm/fsl-imx25.c
18
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache);
21
@@ -XXX,XX +XXX,XX @@ static void fsl_imx25_init(Object *obj)
19
* entry. Should be called from an RCU critical section.
22
FslIMX25State *s = FSL_IMX25(obj);
20
*/
23
int i;
21
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
24
22
- bool is_write);
25
- object_initialize(&s->cpu, sizeof(s->cpu), ARM_CPU_TYPE_NAME("arm926"));
23
+ bool is_write, MemTxAttrs attrs);
26
+ object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
24
27
+ ARM_CPU_TYPE_NAME("arm926"),
25
/* address_space_translate: translate an address range into an address space
28
+ &error_abort, NULL);
26
* into a MemoryRegion and an address range into that section. Should be
29
27
diff --git a/exec.c b/exec.c
30
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
31
TYPE_IMX_AVIC);
32
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
28
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
29
--- a/exec.c
34
--- a/hw/arm/fsl-imx31.c
30
+++ b/exec.c
35
+++ b/hw/arm/fsl-imx31.c
31
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
36
@@ -XXX,XX +XXX,XX @@ static void fsl_imx31_init(Object *obj)
32
37
FslIMX31State *s = FSL_IMX31(obj);
33
/* Called from RCU critical section */
38
int i;
34
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
39
35
- bool is_write)
40
- object_initialize(&s->cpu, sizeof(s->cpu), ARM_CPU_TYPE_NAME("arm1136"));
36
+ bool is_write, MemTxAttrs attrs)
41
+ object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
37
{
42
+ ARM_CPU_TYPE_NAME("arm1136"),
38
MemoryRegionSection section;
43
+ &error_abort, NULL);
39
hwaddr xlat, page_mask;
44
40
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
45
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
41
index XXXXXXX..XXXXXXX 100644
46
TYPE_IMX_AVIC);
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
--
47
--
55
2.17.1
48
2.20.1
56
49
57
50
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
kvm_irqchip_create called by kvm_init will call kvm_init_irq_routing to
3
As explained in commit aff39be0ed97:
4
initialize global capability variables. If we call kvm_init_irq_routing in
5
GIC realize function, previous allocated memory will leak.
6
4
7
Fix this by deleting the unnecessary call.
5
Both functions, object_initialize() and object_property_add_child()
6
increase the reference counter of the new object, so one of the
7
references has to be dropped afterwards to get the reference
8
counting right. Otherwise the child object will not be properly
9
cleaned up when the parent gets destroyed.
10
Thus let's use now object_initialize_child() instead to get the
11
reference counting here right.
8
12
9
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
14
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 1527750994-14360-1-git-send-email-zhaoshenglong@huawei.com
15
Reviewed-by: Thomas Huth <thuth@redhat.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20190823143249.8096-6-philmd@redhat.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
19
---
14
hw/intc/arm_gic_kvm.c | 1 -
20
hw/dma/xilinx_axidma.c | 16 ++++++++--------
15
hw/intc/arm_gicv3_kvm.c | 1 -
21
1 file changed, 8 insertions(+), 8 deletions(-)
16
2 files changed, 2 deletions(-)
17
22
18
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
23
diff --git a/hw/dma/xilinx_axidma.c b/hw/dma/xilinx_axidma.c
19
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/intc/arm_gic_kvm.c
25
--- a/hw/dma/xilinx_axidma.c
21
+++ b/hw/intc/arm_gic_kvm.c
26
+++ b/hw/dma/xilinx_axidma.c
22
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
27
@@ -XXX,XX +XXX,XX @@ static void xilinx_axidma_init(Object *obj)
23
28
XilinxAXIDMA *s = XILINX_AXI_DMA(obj);
24
if (kvm_has_gsi_routing()) {
29
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
25
/* set up irq routing */
30
26
- kvm_init_irq_routing(kvm_state);
31
- object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
27
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
32
- TYPE_XILINX_AXI_DMA_DATA_STREAM);
28
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
33
- object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
29
}
34
- TYPE_XILINX_AXI_DMA_CONTROL_STREAM);
30
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
35
- object_property_add_child(OBJECT(s), "axistream-connected-target",
31
index XXXXXXX..XXXXXXX 100644
36
- (Object *)&s->rx_data_dev, &error_abort);
32
--- a/hw/intc/arm_gicv3_kvm.c
37
- object_property_add_child(OBJECT(s), "axistream-control-connected-target",
33
+++ b/hw/intc/arm_gicv3_kvm.c
38
- (Object *)&s->rx_control_dev, &error_abort);
34
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
39
+ object_initialize_child(OBJECT(s), "axistream-connected-target",
35
40
+ &s->rx_data_dev, sizeof(s->rx_data_dev),
36
if (kvm_has_gsi_routing()) {
41
+ TYPE_XILINX_AXI_DMA_DATA_STREAM, &error_abort,
37
/* set up irq routing */
42
+ NULL);
38
- kvm_init_irq_routing(kvm_state);
43
+ object_initialize_child(OBJECT(s), "axistream-control-connected-target",
39
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
44
+ &s->rx_control_dev, sizeof(s->rx_control_dev),
40
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
45
+ TYPE_XILINX_AXI_DMA_CONTROL_STREAM, &error_abort,
41
}
46
+ NULL);
47
48
sysbus_init_irq(sbd, &s->streams[0].irq);
49
sysbus_init_irq(sbd, &s->streams[1].irq);
42
--
50
--
43
2.17.1
51
2.20.1
44
52
45
53
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
As explained in commit aff39be0ed97:
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
Both functions, object_initialize() and object_property_add_child()
6
increase the reference counter of the new object, so one of the
7
references has to be dropped afterwards to get the reference
8
counting right. Otherwise the child object will not be properly
9
cleaned up when the parent gets destroyed.
10
Thus let's use now object_initialize_child() instead to get the
11
reference counting here right.
12
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Reviewed-by: Thomas Huth <thuth@redhat.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20190823143249.8096-7-philmd@redhat.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Message-id: 20180521140402.23318-8-peter.maydell@linaro.org
17
---
19
---
18
include/exec/memory-internal.h | 3 ++-
20
hw/net/xilinx_axienet.c | 17 ++++++++---------
19
exec.c | 4 +++-
21
1 file changed, 8 insertions(+), 9 deletions(-)
20
hw/s390x/s390-pci-inst.c | 3 ++-
21
memory.c | 7 ++++---
22
4 files changed, 11 insertions(+), 6 deletions(-)
23
22
24
diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h
23
diff --git a/hw/net/xilinx_axienet.c b/hw/net/xilinx_axienet.c
25
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory-internal.h
25
--- a/hw/net/xilinx_axienet.c
27
+++ b/include/exec/memory-internal.h
26
+++ b/hw/net/xilinx_axienet.c
28
@@ -XXX,XX +XXX,XX @@ void flatview_unref(FlatView *view);
27
@@ -XXX,XX +XXX,XX @@ static void xilinx_enet_init(Object *obj)
29
extern const MemoryRegionOps unassigned_mem_ops;
28
XilinxAXIEnet *s = XILINX_AXI_ENET(obj);
30
29
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
31
bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,
30
32
- unsigned size, bool is_write);
31
- object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
33
+ unsigned size, bool is_write,
32
- TYPE_XILINX_AXI_ENET_DATA_STREAM);
34
+ MemTxAttrs attrs);
33
- object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
35
34
- TYPE_XILINX_AXI_ENET_CONTROL_STREAM);
36
void flatview_add_to_dispatch(FlatView *fv, MemoryRegionSection *section);
35
- object_property_add_child(OBJECT(s), "axistream-connected-target",
37
AddressSpaceDispatch *address_space_dispatch_new(FlatView *fv);
36
- (Object *)&s->rx_data_dev, &error_abort);
38
diff --git a/exec.c b/exec.c
37
- object_property_add_child(OBJECT(s), "axistream-control-connected-target",
39
index XXXXXXX..XXXXXXX 100644
38
- (Object *)&s->rx_control_dev, &error_abort);
40
--- a/exec.c
39
-
41
+++ b/exec.c
40
+ object_initialize_child(OBJECT(s), "axistream-connected-target",
42
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
41
+ &s->rx_data_dev, sizeof(s->rx_data_dev),
43
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
42
+ TYPE_XILINX_AXI_ENET_DATA_STREAM, &error_abort,
44
if (!memory_access_is_direct(mr, is_write)) {
43
+ NULL);
45
l = memory_access_size(mr, l, addr);
44
+ object_initialize_child(OBJECT(s), "axistream-control-connected-target",
46
- if (!memory_region_access_valid(mr, xlat, l, is_write)) {
45
+ &s->rx_control_dev, sizeof(s->rx_control_dev),
47
+ /* When our callers all have attrs we'll pass them through here */
46
+ TYPE_XILINX_AXI_ENET_CONTROL_STREAM, &error_abort,
48
+ if (!memory_region_access_valid(mr, xlat, l, is_write,
47
+ NULL);
49
+ MEMTXATTRS_UNSPECIFIED)) {
48
sysbus_init_irq(sbd, &s->irq);
50
return false;
49
51
}
50
memory_region_init_io(&s->iomem, OBJECT(s), &enet_ops, s, "enet", 0x40000);
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;
66
}
67
diff --git a/memory.c b/memory.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/memory.c
70
+++ b/memory.c
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
}
90
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_write(MemoryRegion *mr,
91
unsigned size,
92
MemTxAttrs attrs)
93
{
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
}
99
--
51
--
100
2.17.1
52
2.20.1
101
53
102
54
diff view generated by jsdifflib
1
From: Paolo Bonzini <pbonzini@redhat.com>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
cpregs_keys is an uint32_t* so the allocation should use uint32_t.
3
Commit a5e0b3311 removed these in favour of querying machine
4
g_new is even better because it is type-safe.
4
properties. Remove the extern declarations as well.
5
5
6
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20190828165307.18321-6-alex.bennee@linaro.org
10
Cc: Like Xu <like.xu@linux.intel.com>
11
Message-Id: <20190711130546.18578-1-alex.bennee@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
13
---
11
target/arm/gdbstub.c | 3 +--
14
include/sysemu/sysemu.h | 2 --
12
1 file changed, 1 insertion(+), 2 deletions(-)
15
1 file changed, 2 deletions(-)
13
16
14
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
17
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/gdbstub.c
19
--- a/include/sysemu/sysemu.h
17
+++ b/target/arm/gdbstub.c
20
+++ b/include/sysemu/sysemu.h
18
@@ -XXX,XX +XXX,XX @@ int arm_gen_dynamic_xml(CPUState *cs)
21
@@ -XXX,XX +XXX,XX @@ extern const char *keyboard_layout;
19
RegisterSysregXmlParam param = {cs, s};
22
extern int win2k_install_hack;
20
23
extern int alt_grab;
21
cpu->dyn_xml.num_cpregs = 0;
24
extern int ctrl_grab;
22
- cpu->dyn_xml.cpregs_keys = g_malloc(sizeof(uint32_t *) *
25
-extern int smp_cpus;
23
- g_hash_table_size(cpu->cp_regs));
26
-extern unsigned int max_cpus;
24
+ cpu->dyn_xml.cpregs_keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
27
extern int cursor_hide;
25
g_string_printf(s, "<?xml version=\"1.0\"?>");
28
extern int graphic_rotate;
26
g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
29
extern int no_quit;
27
g_string_append_printf(s, "<feature name=\"org.qemu.gdb.arm.sys.regs\">");
28
--
30
--
29
2.17.1
31
2.20.1
30
32
31
33
diff view generated by jsdifflib
1
From: Jan Kiszka <jan.kiszka@siemens.com>
1
From: "Emilio G. Cota" <cota@braap.org>
2
2
3
There was a nasty flip in identifying which register group an access is
3
Afterwise is "wise after the fact", as in "hindsight".
4
targeting. The issue caused spuriously raised priorities of the guest
4
Here we meant "afterwards" (as in "subsequently"). Fix it.
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: Emilio G. Cota <cota@braap.org>
9
Message-id: 28b927d3-da58-bce4-cc13-bfec7f9b1cb9@siemens.com
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20190828165307.18321-7-alex.bennee@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
---
13
hw/intc/arm_gicv3_cpuif.c | 12 ++++++------
14
tcg/README | 2 +-
14
1 file changed, 6 insertions(+), 6 deletions(-)
15
1 file changed, 1 insertion(+), 1 deletion(-)
15
16
16
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
17
diff --git a/tcg/README b/tcg/README
17
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/arm_gicv3_cpuif.c
19
--- a/tcg/README
19
+++ b/hw/intc/arm_gicv3_cpuif.c
20
+++ b/tcg/README
20
@@ -XXX,XX +XXX,XX @@ static uint64_t icv_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
21
@@ -XXX,XX +XXX,XX @@ This can be overridden using the following function modifiers:
21
{
22
canonical locations before calling the helper.
22
GICv3CPUState *cs = icc_cs_from_env(env);
23
- TCG_CALL_NO_WRITE_GLOBALS means that the helper does not modify any globals.
23
int regno = ri->opc2 & 3;
24
They will only be saved to their canonical location before calling helpers,
24
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
25
- but they won't be reloaded afterwise.
25
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
26
+ but they won't be reloaded afterwards.
26
uint64_t value = cs->ich_apr[grp][regno];
27
- TCG_CALL_NO_SIDE_EFFECTS means that the call to the function is removed if
27
28
the return value is not used.
28
trace_gicv3_icv_ap_read(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
29
@@ -XXX,XX +XXX,XX @@ static void icv_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
30
{
31
GICv3CPUState *cs = icc_cs_from_env(env);
32
int regno = ri->opc2 & 3;
33
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
34
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
35
36
trace_gicv3_icv_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
37
38
@@ -XXX,XX +XXX,XX @@ static uint64_t icc_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
39
uint64_t value;
40
41
int regno = ri->opc2 & 3;
42
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
43
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
44
45
if (icv_access(env, grp == GICV3_G0 ? HCR_FMO : HCR_IMO)) {
46
return icv_ap_read(env, ri);
47
@@ -XXX,XX +XXX,XX @@ static void icc_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
48
GICv3CPUState *cs = icc_cs_from_env(env);
49
50
int regno = ri->opc2 & 3;
51
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
52
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
53
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
29
74
--
30
--
75
2.17.1
31
2.20.1
76
32
77
33
diff view generated by jsdifflib
1
From: Francisco Iglesias <frasse.iglesias@gmail.com>
1
From: "Emilio G. Cota" <cota@braap.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: Emilio G. Cota <cota@braap.org>
5
also that a memset was being called with a value greater than the max of a byte
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
on the second argument (CID 1391286). This patch corrects this by adding the
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
freeing of the strings and also changing to memset to zero instead on
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
descriptor unaligned errors.
8
Message-id: 20190828165307.18321-8-alex.bennee@linaro.org
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>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
10
---
17
hw/dma/xlnx-zdma.c | 10 +++++++---
11
accel/tcg/atomic_template.h | 2 +-
18
1 file changed, 7 insertions(+), 3 deletions(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
19
13
20
diff --git a/hw/dma/xlnx-zdma.c b/hw/dma/xlnx-zdma.c
14
diff --git a/accel/tcg/atomic_template.h b/accel/tcg/atomic_template.h
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/dma/xlnx-zdma.c
16
--- a/accel/tcg/atomic_template.h
23
+++ b/hw/dma/xlnx-zdma.c
17
+++ b/accel/tcg/atomic_template.h
24
@@ -XXX,XX +XXX,XX @@ static bool zdma_load_descriptor(XlnxZDMA *s, uint64_t addr, void *buf)
18
@@ -XXX,XX +XXX,XX @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr,
25
qemu_log_mask(LOG_GUEST_ERROR,
19
26
"zdma: unaligned descriptor at %" PRIx64,
20
#define GEN_ATOMIC_HELPER(X) \
27
addr);
21
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
28
- memset(buf, 0xdeadbeef, sizeof(XlnxZDMADescr));
22
- ABI_TYPE val EXTRA_ARGS) \
29
+ memset(buf, 0x0, sizeof(XlnxZDMADescr));
23
+ ABI_TYPE val EXTRA_ARGS) \
30
s->error = true;
24
{ \
31
return false;
25
ATOMIC_MMU_DECLS; \
32
}
26
DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; \
33
@@ -XXX,XX +XXX,XX @@ static uint64_t zdma_read(void *opaque, hwaddr addr, unsigned size)
34
RegisterInfo *r = &s->regs_info[addr / 4];
35
36
if (!r->data) {
37
+ gchar *path = object_get_canonical_path(OBJECT(s));
38
qemu_log("%s: Decode error: read from %" HWADDR_PRIx "\n",
39
- object_get_canonical_path(OBJECT(s)),
40
+ path,
41
addr);
42
+ g_free(path);
43
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
44
zdma_ch_imr_update_irq(s);
45
return 0;
46
@@ -XXX,XX +XXX,XX @@ static void zdma_write(void *opaque, hwaddr addr, uint64_t value,
47
RegisterInfo *r = &s->regs_info[addr / 4];
48
49
if (!r->data) {
50
+ gchar *path = object_get_canonical_path(OBJECT(s));
51
qemu_log("%s: Decode error: write to %" HWADDR_PRIx "=%" PRIx64 "\n",
52
- object_get_canonical_path(OBJECT(s)),
53
+ path,
54
addr, value);
55
+ g_free(path);
56
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
57
zdma_ch_imr_update_irq(s);
58
return;
59
--
27
--
60
2.17.1
28
2.20.1
61
29
62
30
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Alex Bennée <alex.bennee@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
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20180521140402.23318-3-peter.maydell@linaro.org
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Message-id: 20190828165307.18321-10-alex.bennee@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
include/exec/exec-all.h | 5 +++--
10
include/exec/cpu-defs.h | 2 +-
12
accel/tcg/translate-all.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
13
exec.c | 2 +-
14
target/xtensa/op_helper.c | 3 ++-
15
4 files changed, 7 insertions(+), 5 deletions(-)
16
12
17
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
13
diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/exec-all.h
15
--- a/include/exec/cpu-defs.h
20
+++ b/include/exec/exec-all.h
16
+++ b/include/exec/cpu-defs.h
21
@@ -XXX,XX +XXX,XX @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
17
@@ -XXX,XX +XXX,XX @@ typedef struct CPUTLB { } CPUTLB;
22
void tlb_set_page(CPUState *cpu, target_ulong vaddr,
18
#endif /* !CONFIG_USER_ONLY && CONFIG_TCG */
23
hwaddr paddr, int prot,
19
24
int mmu_idx, target_ulong size);
20
/*
25
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
21
- * This structure must be placed in ArchCPU immedately
26
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs);
22
+ * This structure must be placed in ArchCPU immediately
27
void probe_write(CPUArchState *env, target_ulong addr, int size, int mmu_idx,
23
* before CPUArchState, as a field named "neg".
28
uintptr_t retaddr);
24
*/
29
#else
25
typedef struct CPUNegativeOffsetState {
30
@@ -XXX,XX +XXX,XX @@ static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
31
uint16_t idxmap)
32
{
33
}
34
-static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
35
+static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr,
36
+ MemTxAttrs attrs)
37
{
38
}
39
#endif
40
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/accel/tcg/translate-all.c
43
+++ b/accel/tcg/translate-all.c
44
@@ -XXX,XX +XXX,XX @@ static TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
45
}
46
47
#if !defined(CONFIG_USER_ONLY)
48
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
49
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
50
{
51
ram_addr_t ram_addr;
52
MemoryRegion *mr;
53
diff --git a/exec.c b/exec.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/exec.c
56
+++ b/exec.c
57
@@ -XXX,XX +XXX,XX @@ static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
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
}
64
}
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
80
--
26
--
81
2.17.1
27
2.20.1
82
28
83
29
diff view generated by jsdifflib
Deleted patch
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
2
add MemTxAttrs as an argument to address_space_translate()
3
and address_space_translate_cached(). Callers either have an
4
attrs value to hand, or don't care and can use MEMTXATTRS_UNSPECIFIED.
5
1
6
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-4-peter.maydell@linaro.org
10
---
11
include/exec/memory.h | 4 +++-
12
accel/tcg/translate-all.c | 2 +-
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
19
diff --git a/include/exec/memory.h b/include/exec/memory.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/exec/memory.h
22
+++ b/include/exec/memory.h
23
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
24
* #MemoryRegion.
25
* @len: pointer to length
26
* @is_write: indicates the transfer direction
27
+ * @attrs: memory attributes
28
*/
29
MemoryRegion *flatview_translate(FlatView *fv,
30
hwaddr addr, hwaddr *xlat,
31
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv,
32
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
--
220
2.17.1
221
222
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
The function neon_store_reg32() doesn't free the TCG temp that it
2
add MemTxAttrs as an argument to address_space_map().
2
is passed, so the caller must do that. We got this right in most
3
Its callers either have an attrs value to hand, or don't care
3
places but forgot to free the TCG temps in trans_VMOV_64_sp().
4
and can use MEMTXATTRS_UNSPECIFIED.
5
4
5
Cc: qemu-stable@nongnu.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
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>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-5-peter.maydell@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20190827121931.26836-1-peter.maydell@linaro.org
10
---
10
---
11
include/exec/memory.h | 3 ++-
11
target/arm/translate-vfp.inc.c | 2 ++
12
include/sysemu/dma.h | 3 ++-
12
1 file changed, 2 insertions(+)
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/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/memory.h
16
--- a/target/arm/translate-vfp.inc.c
20
+++ b/include/exec/memory.h
17
+++ b/target/arm/translate-vfp.inc.c
21
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_
18
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_64_sp(DisasContext *s, arg_VMOV_64_sp *a)
22
* @addr: address within that address space
19
/* gpreg to fpreg */
23
* @plen: pointer to length of buffer; updated on return
20
tmp = load_reg(s, a->rt);
24
* @is_write: indicates the transfer direction
21
neon_store_reg32(tmp, a->vm);
25
+ * @attrs: memory attributes
22
+ tcg_temp_free_i32(tmp);
26
*/
23
tmp = load_reg(s, a->rt2);
27
void *address_space_map(AddressSpace *as, hwaddr addr,
24
neon_store_reg32(tmp, a->vm + 1);
28
- hwaddr *plen, bool is_write);
25
+ tcg_temp_free_i32(tmp);
29
+ hwaddr *plen, bool is_write, MemTxAttrs attrs);
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
}
26
}
78
27
79
- hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false);
28
return true;
80
+ hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false,
81
+ MEMTXATTRS_UNSPECIFIED);
82
if (plen < (n * HASH_PTE_SIZE_64)) {
83
hw_error("%s: Unable to map all requested HPTEs\n", __func__);
84
}
85
--
29
--
86
2.17.1
30
2.20.1
87
31
88
32
diff view generated by jsdifflib
Deleted patch
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
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
1
6
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
---
11
include/exec/memory.h | 4 +++-
12
include/sysemu/dma.h | 3 ++-
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
20
diff --git a/include/exec/memory.h b/include/exec/memory.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/exec/memory.h
23
+++ b/include/exec/memory.h
24
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
25
* @addr: address within that address space
26
* @len: length of the area to be checked
27
* @is_write: indicates the transfer direction
28
+ * @attrs: memory attributes
29
*/
30
-bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write);
31
+bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len,
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
{
43
return address_space_access_valid(as, addr, len,
44
- dir == DMA_DIRECTION_FROM_DEVICE);
45
+ dir == DMA_DIRECTION_FROM_DEVICE,
46
+ MEMTXATTRS_UNSPECIFIED);
47
}
48
49
static inline int dma_memory_rw_relaxed(AddressSpace *as, dma_addr_t addr,
50
diff --git a/exec.c b/exec.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/exec.c
53
+++ b/exec.c
54
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
55
}
56
57
bool address_space_access_valid(AddressSpace *as, hwaddr addr,
58
- int len, bool is_write)
59
+ int len, bool is_write,
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
--
131
2.17.1
132
133
diff view generated by jsdifflib
Deleted patch
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
2
add MemTxAttrs as an argument to flatview_extend_translation().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
1
6
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-7-peter.maydell@linaro.org
10
---
11
exec.c | 15 ++++++++++-----
12
1 file changed, 10 insertions(+), 5 deletions(-)
13
14
diff --git a/exec.c b/exec.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
17
+++ b/exec.c
18
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
19
20
static hwaddr
21
flatview_extend_translation(FlatView *fv, hwaddr addr,
22
- hwaddr target_len,
23
- MemoryRegion *mr, hwaddr base, hwaddr len,
24
- bool is_write)
25
+ hwaddr target_len,
26
+ MemoryRegion *mr, hwaddr base, hwaddr len,
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
--
56
2.17.1
57
58
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
An attempt to do an exception-return (branch to one of the magic
2
add MemTxAttrs as an argument to flatview_access_valid().
2
addresses) in linux-user mode for M-profile should behave like
3
Its callers now all have an attrs value to hand, so we can
3
a normal branch, because linux-user mode is always going to be
4
correct our earlier temporary use of MEMTXATTRS_UNSPECIFIED.
4
in 'handler' mode. This used to work, but we broke it when we added
5
support for the M-profile security extension in commit d02a8698d7ae2bfed.
5
6
7
In that commit we allowed even handler-mode calls to magic return
8
values to be checked for and dealt with by causing an
9
EXCP_EXCEPTION_EXIT exception to be taken, because this is
10
needed for the FNC_RETURN return-from-non-secure-function-call
11
handling. For system mode we added a check in do_v7m_exception_exit()
12
to make any spurious calls from Handler mode behave correctly, but
13
forgot that linux-user mode would also be affected.
14
15
How an attempted return-from-non-secure-function-call in linux-user
16
mode should be handled is not clear -- on real hardware it would
17
result in return to secure code (not to the Linux kernel) which
18
could then handle the error in any way it chose. For QEMU we take
19
the simple approach of treating this erroneous return the same way
20
it would be handled on a CPU without the security extensions --
21
treat it as a normal branch.
22
23
The upshot of all this is that for linux-user mode we should never
24
do any of the bx_excret magic, so the code change is simple.
25
26
This ought to be a weird corner case that only affects broken guest
27
code (because Linux user processes should never be attempting to do
28
exception returns or NS function returns), except that the code that
29
assigns addresses in RAM for the process and stack in our linux-user
30
code does not attempt to avoid this magic address range, so
31
legitimate code attempting to return to a trampoline routine on the
32
stack can fall into this case. This change fixes those programs,
33
but we should also look at restricting the range of memory we
34
use for M-profile linux-user guests to the area that would be
35
real RAM in hardware.
36
37
Cc: qemu-stable@nongnu.org
38
Reported-by: Christophe Lyon <christophe.lyon@linaro.org>
39
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
40
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
41
Message-id: 20190822131534.16602-1-peter.maydell@linaro.org
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
42
Fixes: https://bugs.launchpad.net/qemu/+bug/1840922
9
Message-id: 20180521140402.23318-10-peter.maydell@linaro.org
43
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
44
---
11
exec.c | 12 +++++-------
45
target/arm/translate.c | 21 ++++++++++++++++++++-
12
1 file changed, 5 insertions(+), 7 deletions(-)
46
1 file changed, 20 insertions(+), 1 deletion(-)
13
47
14
diff --git a/exec.c b/exec.c
48
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
index XXXXXXX..XXXXXXX 100644
49
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
50
--- a/target/arm/translate.c
17
+++ b/exec.c
51
+++ b/target/arm/translate.c
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
52
@@ -XXX,XX +XXX,XX @@ static inline void gen_bx(DisasContext *s, TCGv_i32 var)
19
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
53
store_cpu_field(var, thumb);
20
const uint8_t *buf, int len);
21
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
22
- bool is_write);
23
+ bool is_write, MemTxAttrs attrs);
24
25
static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,
26
unsigned len, MemTxAttrs attrs)
27
@@ -XXX,XX +XXX,XX @@ static bool subpage_accepts(void *opaque, hwaddr addr,
28
#endif
29
30
return flatview_access_valid(subpage->fv, addr + subpage->base,
31
- len, is_write);
32
+ len, is_write, attrs);
33
}
54
}
34
55
35
static const MemoryRegionOps subpage_ops = {
56
-/* Set PC and Thumb state from var. var is marked as dead.
36
@@ -XXX,XX +XXX,XX @@ static void cpu_notify_map_clients(void)
57
+/*
58
+ * Set PC and Thumb state from var. var is marked as dead.
59
* For M-profile CPUs, include logic to detect exception-return
60
* branches and handle them. This is needed for Thumb POP/LDM to PC, LDR to PC,
61
* and BX reg, and no others, and happens only for code in Handler mode.
62
+ * The Security Extension also requires us to check for the FNC_RETURN
63
+ * which signals a function return from non-secure state; this can happen
64
+ * in both Handler and Thread mode.
65
+ * To avoid having to do multiple comparisons in inline generated code,
66
+ * we make the check we do here loose, so it will match for EXC_RETURN
67
+ * in Thread mode. For system emulation do_v7m_exception_exit() checks
68
+ * for these spurious cases and returns without doing anything (giving
69
+ * the same behaviour as for a branch to a non-magic address).
70
+ *
71
+ * In linux-user mode it is unclear what the right behaviour for an
72
+ * attempted FNC_RETURN should be, because in real hardware this will go
73
+ * directly to Secure code (ie not the Linux kernel) which will then treat
74
+ * the error in any way it chooses. For QEMU we opt to make the FNC_RETURN
75
+ * attempt behave the way it would on a CPU without the security extension,
76
+ * which is to say "like a normal branch". That means we can simply treat
77
+ * all branches as normal with no magic address behaviour.
78
*/
79
static inline void gen_bx_excret(DisasContext *s, TCGv_i32 var)
80
{
81
@@ -XXX,XX +XXX,XX @@ static inline void gen_bx_excret(DisasContext *s, TCGv_i32 var)
82
* s->base.is_jmp that we need to do the rest of the work later.
83
*/
84
gen_bx(s, var);
85
+#ifndef CONFIG_USER_ONLY
86
if (arm_dc_feature(s, ARM_FEATURE_M_SECURITY) ||
87
(s->v7m_handler_mode && arm_dc_feature(s, ARM_FEATURE_M))) {
88
s->base.is_jmp = DISAS_BX_EXCRET;
89
}
90
+#endif
37
}
91
}
38
92
39
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
93
static inline void gen_bx_excret_final_code(DisasContext *s)
40
- bool is_write)
41
+ bool is_write, MemTxAttrs attrs)
42
{
43
MemoryRegion *mr;
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
}
56
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
57
58
rcu_read_lock();
59
fv = address_space_to_flatview(as);
60
- result = flatview_access_valid(fv, addr, len, is_write);
61
+ result = flatview_access_valid(fv, addr, len, is_write, attrs);
62
rcu_read_unlock();
63
return result;
64
}
65
--
94
--
66
2.17.1
95
2.20.1
67
96
68
97
diff view generated by jsdifflib