1
target-arm queue. This has the "plumb txattrs through various
1
Last lot of target-arm changes to squeeze in before rc1:
2
bits of exec.c" patches, and a collection of bug fixes from
2
* various minor Arm bug fixes
3
various people.
3
* David Carlier's Haiku build portability fixes
4
* Wentong Wu's fixes for icount handling in the nios2 target
4
5
5
thanks
6
The following changes since commit 00ce6c36b35e0eb8cc5d68a28f288a6335848813:
6
-- PMM
7
7
8
8
Merge remote-tracking branch 'remotes/huth-gitlab/tags/pull-request-2020-07-13' into staging (2020-07-13 13:01:30 +0100)
9
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
9
14
are available in the Git repository at:
10
are available in the Git repository at:
15
11
16
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180531
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200713
17
13
18
for you to fetch changes up to 49d1dca0520ea71bc21867fab6647f474fcf857b:
14
for you to fetch changes up to 756f739b1682bf131994ec96dad7fbdf8b54493a:
19
15
20
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice (2018-05-31 14:52:53 +0100)
16
hw/arm/aspeed: Do not create and attach empty SD cards by default (2020-07-13 14:36:12 +0100)
21
17
22
----------------------------------------------------------------
18
----------------------------------------------------------------
23
target-arm queue:
19
target-arm queue:
24
* target/arm: Honour FPCR.FZ in FRECPX
20
* hw/arm/bcm2836: Remove unused 'cpu_type' field
25
* MAINTAINERS: Add entries for newer MPS2 boards and devices
21
* target/arm: Fix mtedesc for do_mem_zpz
26
* hw/intc/arm_gicv3: Fix APxR<n> register dispatching
22
* Add the ability to change the FEC PHY MDIO device number on i.MX25/i.MX6/i.MX7
27
* arm_gicv3_kvm: fix bug in writing zero bits back to the in-kernel
23
* target/arm: Don't do raw writes for PMINTENCLR
28
GIC state
24
* virtio-iommu: Fix coverity issue in virtio_iommu_handle_command()
29
* tcg: Fix helper function vs host abi for float16
25
* build: Fix various issues with building on Haiku
30
* arm: fix qemu crash on startup with -bios option
26
* target/nios2: fix wrctl behaviour when using icount
31
* arm: fix malloc type mismatch
27
* hw/arm/tosa: Encapsulate misc GPIO handling in a device
32
* xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
28
* hw/arm/palm.c: Encapsulate misc GPIO handling in a device
33
* Correct CPACR reset value for v7 cores
29
* hw/arm/aspeed: Do not create and attach empty SD cards by default
34
* memory.h: Improve IOMMU related documentation
35
* exec: Plumb transaction attributes through various functions in
36
preparation for allowing IOMMUs to see them
37
* vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
38
* ARM: ACPI: Fix use-after-free due to memory realloc
39
* KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
40
30
41
----------------------------------------------------------------
31
----------------------------------------------------------------
42
Francisco Iglesias (1):
32
Aaron Lindsay (1):
43
xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
33
target/arm: Don't do raw writes for PMINTENCLR
44
34
45
Igor Mammedov (1):
35
David CARLIER (8):
46
arm: fix qemu crash on startup with -bios option
36
build: Enable BSD symbols for Haiku
37
util/qemu-openpty.c: Don't assume pty.h is glibc-only
38
build: Check that mlockall() exists
39
osdep.h: Always include <sys/signal.h> if it exists
40
osdep.h: For Haiku, define SIGIO as equivalent to SIGPOLL
41
bswap.h: Include <endian.h> on Haiku for bswap operations
42
util/compatfd.c: Only include <sys/syscall.h> if CONFIG_SIGNALFD
43
util/oslib-posix.c: Implement qemu_init_exec_dir() for Haiku
47
44
48
Jan Kiszka (1):
45
Eric Auger (1):
49
hw/intc/arm_gicv3: Fix APxR<n> register dispatching
46
virtio-iommu: Fix coverity issue in virtio_iommu_handle_command()
50
47
51
Paolo Bonzini (1):
48
Gerd Hoffmann (1):
52
arm: fix malloc type mismatch
49
util/drm: make portable by avoiding struct dirent d_type
53
50
54
Peter Maydell (17):
51
Jean-Christophe Dubois (3):
55
target/arm: Honour FPCR.FZ in FRECPX
52
Add the ability to change the FEC PHY MDIO device number on i.MX25 processor
56
MAINTAINERS: Add entries for newer MPS2 boards and devices
53
Add the ability to change the FEC PHY MDIO device number on i.MX6 processor
57
Correct CPACR reset value for v7 cores
54
Add the ability to change the FEC PHY MDIO devices numbers on i.MX7 processor
58
memory.h: Improve IOMMU related documentation
55
59
Make tb_invalidate_phys_addr() take a MemTxAttrs argument
56
Peter Maydell (4):
60
Make address_space_translate{, _cached}() take a MemTxAttrs argument
57
hw/arm/tosa.c: Detabify
61
Make address_space_map() take a MemTxAttrs argument
58
hw/arm/tosa: Encapsulate misc GPIO handling in a device
62
Make address_space_access_valid() take a MemTxAttrs argument
59
hw/arm/palm.c: Detabify
63
Make flatview_extend_translation() take a MemTxAttrs argument
60
hw/arm/palm.c: Encapsulate misc GPIO handling in a device
64
Make memory_region_access_valid() take a MemTxAttrs argument
61
65
Make MemoryRegion valid.accepts callback take a MemTxAttrs argument
62
Philippe Mathieu-Daudé (2):
66
Make flatview_access_valid() take a MemTxAttrs argument
63
hw/arm/bcm2836: Remove unused 'cpu_type' field
67
Make flatview_translate() take a MemTxAttrs argument
64
hw/arm/aspeed: Do not create and attach empty SD cards by default
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
65
73
Richard Henderson (1):
66
Richard Henderson (1):
74
tcg: Fix helper function vs host abi for float16
67
target/arm: Fix mtedesc for do_mem_zpz
75
68
76
Shannon Zhao (3):
69
Wentong Wu (4):
77
arm_gicv3_kvm: increase clroffset accordingly
70
target/nios2: add DISAS_NORETURN case for nothing more to generate
78
ARM: ACPI: Fix use-after-free due to memory realloc
71
target/nios2: in line the semantics of DISAS_UPDATE with other targets
79
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
72
target/nios2: Use gen_io_start around wrctl instruction
73
hw/nios2: exit to main CPU loop only when unmasking interrupts
80
74
81
include/exec/exec-all.h | 5 +-
75
configure | 38 ++++++++++++-
82
include/exec/helper-head.h | 2 +-
76
include/hw/arm/bcm2836.h | 1 -
83
include/exec/memory-internal.h | 3 +-
77
include/hw/arm/fsl-imx25.h | 1 +
84
include/exec/memory.h | 128 +++++++++++++++++++++++++++++++++++------
78
include/hw/arm/fsl-imx6.h | 1 +
85
include/migration/vmstate.h | 3 +
79
include/hw/arm/fsl-imx7.h | 1 +
86
include/sysemu/dma.h | 6 +-
80
include/qemu/bswap.h | 2 +
87
accel/tcg/translate-all.c | 4 +-
81
include/qemu/osdep.h | 6 +-
88
exec.c | 95 ++++++++++++++++++------------
82
hw/arm/aspeed.c | 9 +--
89
hw/arm/boot.c | 18 +++---
83
hw/arm/fsl-imx25.c | 7 +++
90
hw/arm/virt-acpi-build.c | 20 +++++--
84
hw/arm/fsl-imx6.c | 7 +++
91
hw/dma/xlnx-zdma.c | 10 +++-
85
hw/arm/fsl-imx7.c | 9 +++
92
hw/hppa/dino.c | 3 +-
86
hw/arm/palm.c | 111 +++++++++++++++++++++++++------------
93
hw/intc/arm_gic_kvm.c | 1 -
87
hw/arm/tosa.c | 132 +++++++++++++++++++++++++++++---------------
94
hw/intc/arm_gicv3_cpuif.c | 12 ++--
88
hw/nios2/cpu_pic.c | 3 +-
95
hw/intc/arm_gicv3_kvm.c | 2 +-
89
hw/virtio/virtio-iommu.c | 1 +
96
hw/nvram/fw_cfg.c | 12 ++--
90
hw/xen/xen-legacy-backend.c | 1 -
97
hw/s390x/s390-pci-inst.c | 3 +-
91
os-posix.c | 4 ++
98
hw/scsi/esp.c | 3 +-
92
target/arm/helper.c | 4 +-
99
hw/vfio/common.c | 3 +-
93
target/arm/translate-sve.c | 2 +-
100
hw/virtio/vhost.c | 3 +-
94
target/nios2/translate.c | 12 +++-
101
hw/xen/xen_pt_msi.c | 3 +-
95
util/compatfd.c | 2 +
102
memory.c | 12 ++--
96
util/drm.c | 19 +++++--
103
memory_ldst.inc.c | 18 +++---
97
util/oslib-posix.c | 20 ++++++-
104
target/arm/gdbstub.c | 3 +-
98
util/qemu-openpty.c | 2 +-
105
target/arm/helper-a64.c | 41 +++++++------
99
24 files changed, 292 insertions(+), 103 deletions(-)
106
target/arm/helper.c | 90 ++++++++++++++++-------------
107
target/ppc/mmu-hash64.c | 3 +-
108
target/riscv/helper.c | 2 +-
109
target/s390x/diag.c | 6 +-
110
target/s390x/excp_helper.c | 3 +-
111
target/s390x/mmu_helper.c | 3 +-
112
target/s390x/sigp.c | 3 +-
113
target/xtensa/op_helper.c | 3 +-
114
MAINTAINERS | 9 ++-
115
34 files changed, 353 insertions(+), 182 deletions(-)
116
100
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
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
The 'cpu_type' has been moved from BCM283XState to BCM283XClass
7
loop flatview_access_valid() -> memory_region_access_valid() ->
4
in commit 210f47840d, but we forgot to remove the old variable.
8
subpage_accepts() -> flatview_access_valid(); we make it pass
5
Do it now.
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
6
7
Fixes: 210f47840d ("hw/arm/bcm2836: Hardcode correct CPU type")
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20200703200459.23294-1-f4bug@amsat.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
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
---
12
---
18
include/exec/memory-internal.h | 3 ++-
13
include/hw/arm/bcm2836.h | 1 -
19
exec.c | 4 +++-
14
1 file changed, 1 deletion(-)
20
hw/s390x/s390-pci-inst.c | 3 ++-
21
memory.c | 7 ++++---
22
4 files changed, 11 insertions(+), 6 deletions(-)
23
15
24
diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h
16
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory-internal.h
18
--- a/include/hw/arm/bcm2836.h
27
+++ b/include/exec/memory-internal.h
19
+++ b/include/hw/arm/bcm2836.h
28
@@ -XXX,XX +XXX,XX @@ void flatview_unref(FlatView *view);
20
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
29
extern const MemoryRegionOps unassigned_mem_ops;
21
DeviceState parent_obj;
30
22
/*< public >*/
31
bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,
23
32
- unsigned size, bool is_write);
24
- char *cpu_type;
33
+ unsigned size, bool is_write,
25
uint32_t enabled_cpus;
34
+ MemTxAttrs attrs);
26
35
27
struct {
36
void flatview_add_to_dispatch(FlatView *fv, MemoryRegionSection *section);
37
AddressSpaceDispatch *address_space_dispatch_new(FlatView *fv);
38
diff --git a/exec.c b/exec.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/exec.c
41
+++ b/exec.c
42
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
43
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
44
if (!memory_access_is_direct(mr, is_write)) {
45
l = memory_access_size(mr, l, addr);
46
- if (!memory_region_access_valid(mr, xlat, l, is_write)) {
47
+ /* When our callers all have attrs we'll pass them through here */
48
+ if (!memory_region_access_valid(mr, xlat, l, is_write,
49
+ MEMTXATTRS_UNSPECIFIED)) {
50
return false;
51
}
52
}
53
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/s390x/s390-pci-inst.c
56
+++ b/hw/s390x/s390-pci-inst.c
57
@@ -XXX,XX +XXX,XX @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr,
58
mr = s390_get_subregion(mr, offset, len);
59
offset -= mr->addr;
60
61
- if (!memory_region_access_valid(mr, offset, len, true)) {
62
+ if (!memory_region_access_valid(mr, offset, len, true,
63
+ MEMTXATTRS_UNSPECIFIED)) {
64
s390_program_interrupt(env, PGM_OPERAND, 6, ra);
65
return 0;
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
--
28
--
100
2.17.1
29
2.20.1
101
30
102
31
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
The mtedesc that was constructed was not actually passed in.
4
passed and returned either zero-extended in the host register
4
Found by Coverity (CID 1429996).
5
or with garbage at the top of the host register.
6
5
7
The tcg code generator has so far been assuming garbage, as that
6
Fixes: d28d12f008e
8
matches the x86 abi, but this is incorrect for other host abis.
9
Further, target/arm has so far been assuming zero-extended results,
10
so that it may store the 16-bit value into a 32-bit slot with the
11
high 16-bits already clear.
12
13
Rectify both problems by mapping "f16" in the helper definition
14
to uint32_t instead of (a typedef for) uint16_t. This forces
15
the host compiler to assume garbage in the upper 16 bits on input
16
and to zero-extend the result on output.
17
18
Cc: qemu-stable@nongnu.org
19
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
9
Message-id: 20200706202345.193676-1-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>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
11
---
26
include/exec/helper-head.h | 2 +-
12
target/arm/translate-sve.c | 2 +-
27
target/arm/helper-a64.c | 35 +++++++++--------
13
1 file changed, 1 insertion(+), 1 deletion(-)
28
target/arm/helper.c | 80 +++++++++++++++++++-------------------
29
3 files changed, 59 insertions(+), 58 deletions(-)
30
14
31
diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
32
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
33
--- a/include/exec/helper-head.h
17
--- a/target/arm/translate-sve.c
34
+++ b/include/exec/helper-head.h
18
+++ b/target/arm/translate-sve.c
35
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static void do_mem_zpz(DisasContext *s, int zt, int pg, int zm,
36
#define dh_ctype_int int
20
desc = FIELD_DP32(desc, MTEDESC, ESIZE, 1 << msz);
37
#define dh_ctype_i64 uint64_t
21
desc <<= SVE_MTEDESC_SHIFT;
38
#define dh_ctype_s64 int64_t
39
-#define dh_ctype_f16 float16
40
+#define dh_ctype_f16 uint32_t
41
#define dh_ctype_f32 float32
42
#define dh_ctype_f64 float64
43
#define dh_ctype_ptr void *
44
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/helper-a64.c
47
+++ b/target/arm/helper-a64.c
48
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
49
return flags;
50
}
51
52
-uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
53
+uint64_t HELPER(vfp_cmph_a64)(uint32_t x, uint32_t y, void *fp_status)
54
{
55
return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
56
}
57
58
-uint64_t HELPER(vfp_cmpeh_a64)(float16 x, float16 y, void *fp_status)
59
+uint64_t HELPER(vfp_cmpeh_a64)(uint32_t x, uint32_t y, void *fp_status)
60
{
61
return float_rel_to_flags(float16_compare(x, y, fp_status));
62
}
63
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, void *fpstp)
64
#define float64_three make_float64(0x4008000000000000ULL)
65
#define float64_one_point_five make_float64(0x3FF8000000000000ULL)
66
67
-float16 HELPER(recpsf_f16)(float16 a, float16 b, void *fpstp)
68
+uint32_t HELPER(recpsf_f16)(uint32_t a, uint32_t b, void *fpstp)
69
{
70
float_status *fpst = fpstp;
71
72
@@ -XXX,XX +XXX,XX @@ float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp)
73
return float64_muladd(a, b, float64_two, 0, fpst);
74
}
75
76
-float16 HELPER(rsqrtsf_f16)(float16 a, float16 b, void *fpstp)
77
+uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, void *fpstp)
78
{
79
float_status *fpst = fpstp;
80
81
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_addlp_u16)(uint64_t a)
82
}
83
84
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
85
-float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
86
+uint32_t HELPER(frecpx_f16)(uint32_t a, void *fpstp)
87
{
88
float_status *fpst = fpstp;
89
uint16_t val16, sbit;
90
@@ -XXX,XX +XXX,XX @@ void HELPER(casp_be_parallel)(CPUARMState *env, uint32_t rs, uint64_t addr,
91
#define ADVSIMD_HELPER(name, suffix) HELPER(glue(glue(advsimd_, name), suffix))
92
93
#define ADVSIMD_HALFOP(name) \
94
-float16 ADVSIMD_HELPER(name, h)(float16 a, float16 b, void *fpstp) \
95
+uint32_t ADVSIMD_HELPER(name, h)(uint32_t a, uint32_t b, void *fpstp) \
96
{ \
97
float_status *fpst = fpstp; \
98
return float16_ ## name(a, b, fpst); \
99
@@ -XXX,XX +XXX,XX @@ ADVSIMD_HALFOP(mulx)
100
ADVSIMD_TWOHALFOP(mulx)
101
102
/* fused multiply-accumulate */
103
-float16 HELPER(advsimd_muladdh)(float16 a, float16 b, float16 c, void *fpstp)
104
+uint32_t HELPER(advsimd_muladdh)(uint32_t a, uint32_t b, uint32_t c,
105
+ void *fpstp)
106
{
107
float_status *fpst = fpstp;
108
return float16_muladd(a, b, c, 0, fpst);
109
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_muladd2h)(uint32_t two_a, uint32_t two_b,
110
111
#define ADVSIMD_CMPRES(test) (test) ? 0xffff : 0
112
113
-uint32_t HELPER(advsimd_ceq_f16)(float16 a, float16 b, void *fpstp)
114
+uint32_t HELPER(advsimd_ceq_f16)(uint32_t a, uint32_t b, void *fpstp)
115
{
116
float_status *fpst = fpstp;
117
int compare = float16_compare_quiet(a, b, fpst);
118
return ADVSIMD_CMPRES(compare == float_relation_equal);
119
}
120
121
-uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
122
+uint32_t HELPER(advsimd_cge_f16)(uint32_t a, uint32_t b, void *fpstp)
123
{
124
float_status *fpst = fpstp;
125
int compare = float16_compare(a, b, fpst);
126
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
127
compare == float_relation_equal);
128
}
129
130
-uint32_t HELPER(advsimd_cgt_f16)(float16 a, float16 b, void *fpstp)
131
+uint32_t HELPER(advsimd_cgt_f16)(uint32_t a, uint32_t b, void *fpstp)
132
{
133
float_status *fpst = fpstp;
134
int compare = float16_compare(a, b, fpst);
135
return ADVSIMD_CMPRES(compare == float_relation_greater);
136
}
137
138
-uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
139
+uint32_t HELPER(advsimd_acge_f16)(uint32_t a, uint32_t b, void *fpstp)
140
{
141
float_status *fpst = fpstp;
142
float16 f0 = float16_abs(a);
143
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
144
compare == float_relation_equal);
145
}
146
147
-uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
148
+uint32_t HELPER(advsimd_acgt_f16)(uint32_t a, uint32_t b, void *fpstp)
149
{
150
float_status *fpst = fpstp;
151
float16 f0 = float16_abs(a);
152
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
153
}
154
155
/* round to integral */
156
-float16 HELPER(advsimd_rinth_exact)(float16 x, void *fp_status)
157
+uint32_t HELPER(advsimd_rinth_exact)(uint32_t x, void *fp_status)
158
{
159
return float16_round_to_int(x, fp_status);
160
}
161
162
-float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
163
+uint32_t HELPER(advsimd_rinth)(uint32_t x, void *fp_status)
164
{
165
int old_flags = get_float_exception_flags(fp_status), new_flags;
166
float16 ret;
167
@@ -XXX,XX +XXX,XX @@ float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
168
* setting the mode appropriately before calling the helper.
169
*/
170
171
-uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
172
+uint32_t HELPER(advsimd_f16tosinth)(uint32_t a, void *fpstp)
173
{
174
float_status *fpst = fpstp;
175
176
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
177
return float16_to_int16(a, fpst);
178
}
179
180
-uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
181
+uint32_t HELPER(advsimd_f16touinth)(uint32_t a, void *fpstp)
182
{
183
float_status *fpst = fpstp;
184
185
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
186
* Square Root and Reciprocal square root
187
*/
188
189
-float16 HELPER(sqrt_f16)(float16 a, void *fpstp)
190
+uint32_t HELPER(sqrt_f16)(uint32_t a, void *fpstp)
191
{
192
float_status *s = fpstp;
193
194
diff --git a/target/arm/helper.c b/target/arm/helper.c
195
index XXXXXXX..XXXXXXX 100644
196
--- a/target/arm/helper.c
197
+++ b/target/arm/helper.c
198
@@ -XXX,XX +XXX,XX @@ DO_VFP_cmp(d, float64)
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
}
22
}
287
}
23
- desc = simd_desc(vsz, vsz, scale);
288
24
+ desc = simd_desc(vsz, vsz, desc | scale);
289
-uint32_t HELPER(vfp_toshh)(float16 x, uint32_t shift, void *fpst)
25
t_desc = tcg_const_i32(desc);
290
+uint32_t HELPER(vfp_toshh)(uint32_t x, uint32_t shift, void *fpst)
26
291
{
27
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
292
return float64_to_int16(do_prescale_fp16(x, shift, fpst), fpst);
293
}
294
295
-uint32_t HELPER(vfp_touhh)(float16 x, uint32_t shift, void *fpst)
296
+uint32_t HELPER(vfp_touhh)(uint32_t x, uint32_t shift, void *fpst)
297
{
298
return float64_to_uint16(do_prescale_fp16(x, shift, fpst), fpst);
299
}
300
301
-uint32_t HELPER(vfp_toslh)(float16 x, uint32_t shift, void *fpst)
302
+uint32_t HELPER(vfp_toslh)(uint32_t x, uint32_t shift, void *fpst)
303
{
304
return float64_to_int32(do_prescale_fp16(x, shift, fpst), fpst);
305
}
306
307
-uint32_t HELPER(vfp_toulh)(float16 x, uint32_t shift, void *fpst)
308
+uint32_t HELPER(vfp_toulh)(uint32_t x, uint32_t shift, void *fpst)
309
{
310
return float64_to_uint32(do_prescale_fp16(x, shift, fpst), fpst);
311
}
312
313
-uint64_t HELPER(vfp_tosqh)(float16 x, uint32_t shift, void *fpst)
314
+uint64_t HELPER(vfp_tosqh)(uint32_t x, uint32_t shift, void *fpst)
315
{
316
return float64_to_int64(do_prescale_fp16(x, shift, fpst), fpst);
317
}
318
319
-uint64_t HELPER(vfp_touqh)(float16 x, uint32_t shift, void *fpst)
320
+uint64_t HELPER(vfp_touqh)(uint32_t x, uint32_t shift, void *fpst)
321
{
322
return float64_to_uint64(do_prescale_fp16(x, shift, fpst), fpst);
323
}
324
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(set_neon_rmode)(uint32_t rmode, CPUARMState *env)
325
}
326
327
/* Half precision conversions. */
328
-float32 HELPER(vfp_fcvt_f16_to_f32)(float16 a, void *fpstp, uint32_t ahp_mode)
329
+float32 HELPER(vfp_fcvt_f16_to_f32)(uint32_t a, void *fpstp, uint32_t ahp_mode)
330
{
331
/* Squash FZ16 to 0 for the duration of conversion. In this case,
332
* it would affect flushing input denormals.
333
@@ -XXX,XX +XXX,XX @@ float32 HELPER(vfp_fcvt_f16_to_f32)(float16 a, void *fpstp, uint32_t ahp_mode)
334
return r;
335
}
336
337
-float16 HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
338
+uint32_t HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
339
{
340
/* Squash FZ16 to 0 for the duration of conversion. In this case,
341
* it would affect flushing output denormals.
342
@@ -XXX,XX +XXX,XX @@ float16 HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
343
return r;
344
}
345
346
-float64 HELPER(vfp_fcvt_f16_to_f64)(float16 a, void *fpstp, uint32_t ahp_mode)
347
+float64 HELPER(vfp_fcvt_f16_to_f64)(uint32_t a, void *fpstp, uint32_t ahp_mode)
348
{
349
/* Squash FZ16 to 0 for the duration of conversion. In this case,
350
* it would affect flushing input denormals.
351
@@ -XXX,XX +XXX,XX @@ float64 HELPER(vfp_fcvt_f16_to_f64)(float16 a, void *fpstp, uint32_t ahp_mode)
352
return r;
353
}
354
355
-float16 HELPER(vfp_fcvt_f64_to_f16)(float64 a, void *fpstp, uint32_t ahp_mode)
356
+uint32_t HELPER(vfp_fcvt_f64_to_f16)(float64 a, void *fpstp, uint32_t ahp_mode)
357
{
358
/* Squash FZ16 to 0 for the duration of conversion. In this case,
359
* it would affect flushing output denormals.
360
@@ -XXX,XX +XXX,XX @@ static bool round_to_inf(float_status *fpst, bool sign_bit)
361
g_assert_not_reached();
362
}
363
364
-float16 HELPER(recpe_f16)(float16 input, void *fpstp)
365
+uint32_t HELPER(recpe_f16)(uint32_t input, void *fpstp)
366
{
367
float_status *fpst = fpstp;
368
float16 f16 = float16_squash_input_denormal(input, fpst);
369
@@ -XXX,XX +XXX,XX @@ static uint64_t recip_sqrt_estimate(int *exp , int exp_off, uint64_t frac)
370
return extract64(estimate, 0, 8) << 44;
371
}
372
373
-float16 HELPER(rsqrte_f16)(float16 input, void *fpstp)
374
+uint32_t HELPER(rsqrte_f16)(uint32_t input, void *fpstp)
375
{
376
float_status *s = fpstp;
377
float16 f16 = float16_squash_input_denormal(input, s);
378
--
28
--
379
2.17.1
29
2.20.1
380
30
381
31
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
acpi_data_push uses g_array_set_size to resize the memory size. If there
3
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
4
is no enough contiguous memory, the address will be changed. So previous
4
Message-id: 9f8923ecd974160ae8f634c275b1100c2cbe66d7.1593806826.git.jcd@tribudubois.net
5
pointer could not be used any more. It must update the pointer and use
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
the new one.
6
[PMM: updated for object_property_set_uint() argument reordering]
7
8
Also, previous codes wrongly use le32 conversion of iort->node_offset
9
for subsequent computations that will result incorrect value if host is
10
not litlle endian. So use the non-converted one instead.
11
12
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
13
Reviewed-by: Eric Auger <eric.auger@redhat.com>
14
Message-id: 1527663951-14552-1-git-send-email-zhaoshenglong@huawei.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
8
---
17
hw/arm/virt-acpi-build.c | 20 +++++++++++++++-----
9
include/hw/arm/fsl-imx25.h | 1 +
18
1 file changed, 15 insertions(+), 5 deletions(-)
10
hw/arm/fsl-imx25.c | 7 +++++++
11
2 files changed, 8 insertions(+)
19
12
20
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
13
diff --git a/include/hw/arm/fsl-imx25.h b/include/hw/arm/fsl-imx25.h
21
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/virt-acpi-build.c
15
--- a/include/hw/arm/fsl-imx25.h
23
+++ b/hw/arm/virt-acpi-build.c
16
+++ b/include/hw/arm/fsl-imx25.h
24
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
17
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX25State {
25
AcpiIortItsGroup *its;
18
MemoryRegion rom[2];
26
AcpiIortTable *iort;
19
MemoryRegion iram;
27
AcpiIortSmmu3 *smmu;
20
MemoryRegion iram_alias;
28
- size_t node_size, iort_length, smmu_offset = 0;
21
+ uint32_t phy_num;
29
+ size_t node_size, iort_node_offset, iort_length, smmu_offset = 0;
22
} FslIMX25State;
30
AcpiIortRC *rc;
23
31
24
/**
32
iort = acpi_data_push(table_data, sizeof(*iort));
25
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
33
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
26
index XXXXXXX..XXXXXXX 100644
34
27
--- a/hw/arm/fsl-imx25.c
35
iort_length = sizeof(*iort);
28
+++ b/hw/arm/fsl-imx25.c
36
iort->node_count = cpu_to_le32(nb_nodes);
29
@@ -XXX,XX +XXX,XX @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
37
- iort->node_offset = cpu_to_le32(sizeof(*iort));
30
epit_table[i].irq));
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
}
31
}
63
32
64
/* Root Complex Node */
33
+ object_property_set_uint(OBJECT(&s->fec), "phy-num", s->phy_num, &err);
65
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
34
qdev_set_nic_properties(DEVICE(&s->fec), &nd_table[0]);
66
idmap->output_reference = cpu_to_le32(smmu_offset);
35
67
} else {
36
if (!sysbus_realize(SYS_BUS_DEVICE(&s->fec), errp)) {
68
/* output IORT node is the ITS group node (the first node) */
37
@@ -XXX,XX +XXX,XX @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
69
- idmap->output_reference = cpu_to_le32(iort->node_offset);
38
&s->iram_alias);
70
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
39
}
71
}
40
72
41
+static Property fsl_imx25_properties[] = {
73
+ /*
42
+ DEFINE_PROP_UINT32("fec-phy-num", FslIMX25State, phy_num, 0),
74
+ * Update the pointer address in case table_data->data moves during above
43
+ DEFINE_PROP_END_OF_LIST(),
75
+ * acpi_data_push operations.
44
+};
76
+ */
45
+
77
+ iort = (AcpiIortTable *)(table_data->data + iort_start);
46
static void fsl_imx25_class_init(ObjectClass *oc, void *data)
78
iort->length = cpu_to_le32(iort_length);
47
{
79
48
DeviceClass *dc = DEVICE_CLASS(oc);
80
build_header(linker, table_data, (void *)(table_data->data + iort_start),
49
50
+ device_class_set_props(dc, fsl_imx25_properties);
51
dc->realize = fsl_imx25_realize;
52
dc->desc = "i.MX25 SOC";
53
/*
81
--
54
--
82
2.17.1
55
2.20.1
83
56
84
57
diff view generated by jsdifflib
1
The FRECPX instructions should (like most other floating point operations)
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
honour the FPCR.FZ bit which specifies whether input denormals should
3
be flushed to zero (or FZ16 for the half-precision version).
4
We forgot to implement this, which doesn't affect the results (since
5
the calculation doesn't actually care about the mantissa bits) but did
6
mean we were failing to set the FPSR.IDC bit.
7
2
3
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
4
Message-id: 05a64e83eb1c0c865ac077b22c599425c024c02c.1593806826.git.jcd@tribudubois.net
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
[PMM: updated for object_property_set_uint() argument reordering]
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180521172712.19930-1-peter.maydell@linaro.org
11
---
8
---
12
target/arm/helper-a64.c | 6 ++++++
9
include/hw/arm/fsl-imx6.h | 1 +
13
1 file changed, 6 insertions(+)
10
hw/arm/fsl-imx6.c | 7 +++++++
11
2 files changed, 8 insertions(+)
14
12
15
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
13
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.c
15
--- a/include/hw/arm/fsl-imx6.h
18
+++ b/target/arm/helper-a64.c
16
+++ b/include/hw/arm/fsl-imx6.h
19
@@ -XXX,XX +XXX,XX @@ float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
17
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
20
return nan;
18
MemoryRegion caam;
19
MemoryRegion ocram;
20
MemoryRegion ocram_alias;
21
+ uint32_t phy_num;
22
} FslIMX6State;
23
24
25
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/arm/fsl-imx6.c
28
+++ b/hw/arm/fsl-imx6.c
29
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
30
spi_table[i].irq));
21
}
31
}
22
32
23
+ a = float16_squash_input_denormal(a, fpst);
33
+ object_property_set_uint(OBJECT(&s->eth), "phy-num", s->phy_num, &err);
34
qdev_set_nic_properties(DEVICE(&s->eth), &nd_table[0]);
35
if (!sysbus_realize(SYS_BUS_DEVICE(&s->eth), errp)) {
36
return;
37
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
38
&s->ocram_alias);
39
}
40
41
+static Property fsl_imx6_properties[] = {
42
+ DEFINE_PROP_UINT32("fec-phy-num", FslIMX6State, phy_num, 0),
43
+ DEFINE_PROP_END_OF_LIST(),
44
+};
24
+
45
+
25
val16 = float16_val(a);
46
static void fsl_imx6_class_init(ObjectClass *oc, void *data)
26
sbit = 0x8000 & val16;
47
{
27
exp = extract32(val16, 10, 5);
48
DeviceClass *dc = DEVICE_CLASS(oc);
28
@@ -XXX,XX +XXX,XX @@ float32 HELPER(frecpx_f32)(float32 a, void *fpstp)
49
29
return nan;
50
+ device_class_set_props(dc, fsl_imx6_properties);
30
}
51
dc->realize = fsl_imx6_realize;
31
52
dc->desc = "i.MX6 SOC";
32
+ a = float32_squash_input_denormal(a, fpst);
53
/* Reason: Uses serial_hd() in the realize() function */
33
+
34
val32 = float32_val(a);
35
sbit = 0x80000000ULL & val32;
36
exp = extract32(val32, 23, 8);
37
@@ -XXX,XX +XXX,XX @@ float64 HELPER(frecpx_f64)(float64 a, void *fpstp)
38
return nan;
39
}
40
41
+ a = float64_squash_input_denormal(a, fpst);
42
+
43
val64 = float64_val(a);
44
sbit = 0x8000000000000000ULL & val64;
45
exp = extract64(float64_val(a), 52, 11);
46
--
54
--
47
2.17.1
55
2.20.1
48
56
49
57
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
kvm_irqchip_create called by kvm_init will call kvm_init_irq_routing to
3
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
4
initialize global capability variables. If we call kvm_init_irq_routing in
4
Message-id: c850187322be9930e47c8b234c385a7d0da245cb.1593806826.git.jcd@tribudubois.net
5
GIC realize function, previous allocated memory will leak.
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
6
[PMM: updated for object_property_set_uint() argument reordering]
7
Fix this by deleting the unnecessary call.
8
9
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
11
Message-id: 1527750994-14360-1-git-send-email-zhaoshenglong@huawei.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
8
---
14
hw/intc/arm_gic_kvm.c | 1 -
9
include/hw/arm/fsl-imx7.h | 1 +
15
hw/intc/arm_gicv3_kvm.c | 1 -
10
hw/arm/fsl-imx7.c | 9 +++++++++
16
2 files changed, 2 deletions(-)
11
2 files changed, 10 insertions(+)
17
12
18
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
13
diff --git a/include/hw/arm/fsl-imx7.h b/include/hw/arm/fsl-imx7.h
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/intc/arm_gic_kvm.c
15
--- a/include/hw/arm/fsl-imx7.h
21
+++ b/hw/intc/arm_gic_kvm.c
16
+++ b/include/hw/arm/fsl-imx7.h
22
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
17
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX7State {
23
18
IMX7GPRState gpr;
24
if (kvm_has_gsi_routing()) {
19
ChipideaState usb[FSL_IMX7_NUM_USBS];
25
/* set up irq routing */
20
DesignwarePCIEHost pcie;
26
- kvm_init_irq_routing(kvm_state);
21
+ uint32_t phy_num[FSL_IMX7_NUM_ETHS];
27
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
22
} FslIMX7State;
28
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
23
29
}
24
enum FslIMX7MemoryMap {
30
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
25
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
31
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/intc/arm_gicv3_kvm.c
27
--- a/hw/arm/fsl-imx7.c
33
+++ b/hw/intc/arm_gicv3_kvm.c
28
+++ b/hw/arm/fsl-imx7.c
34
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
29
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
35
30
FSL_IMX7_ENET2_ADDR,
36
if (kvm_has_gsi_routing()) {
31
};
37
/* set up irq routing */
32
38
- kvm_init_irq_routing(kvm_state);
33
+ object_property_set_uint(OBJECT(&s->eth[i]), "phy-num",
39
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
34
+ s->phy_num[i], &error_abort);
40
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
35
object_property_set_uint(OBJECT(&s->eth[i]), "tx-ring-num",
41
}
36
FSL_IMX7_ETH_NUM_TX_RINGS, &error_abort);
37
qdev_set_nic_properties(DEVICE(&s->eth[i]), &nd_table[i]);
38
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
39
FSL_IMX7_PCIE_PHY_SIZE);
40
}
41
42
+static Property fsl_imx7_properties[] = {
43
+ DEFINE_PROP_UINT32("fec1-phy-num", FslIMX7State, phy_num[0], 0),
44
+ DEFINE_PROP_UINT32("fec2-phy-num", FslIMX7State, phy_num[1], 1),
45
+ DEFINE_PROP_END_OF_LIST(),
46
+};
47
+
48
static void fsl_imx7_class_init(ObjectClass *oc, void *data)
49
{
50
DeviceClass *dc = DEVICE_CLASS(oc);
51
52
+ device_class_set_props(dc, fsl_imx7_properties);
53
dc->realize = fsl_imx7_realize;
54
55
/* Reason: Uses serial_hds and nd_table in realize() directly */
42
--
56
--
43
2.17.1
57
2.20.1
44
58
45
59
diff view generated by jsdifflib
1
In commit f0aff255700 we made cpacr_write() enforce that some CPACR
1
From: Aaron Lindsay <aaron@os.amperecomputing.com>
2
bits are RAZ/WI and some are RAO/WI for ARMv7 cores. Unfortunately
3
we forgot to also update the register's reset value. The effect
4
was that (a) a guest that read CPACR on reset would not see ones in
5
the RAO bits, and (b) if you did a migration before the guest did
6
a write to the CPACR then the migration would fail because the
7
destination would enforce the RAO bits and then complain that they
8
didn't match the zero value from the source.
9
2
10
Implement reset for the CPACR using a custom reset function
3
Raw writes to this register when in KVM mode can cause interrupts to be
11
that just calls cpacr_write(), to avoid having to duplicate
4
raised (even when the PMU is disabled). Because the underlying state is
12
the logic for which bits are RAO.
5
already aliased to PMINTENSET (which already provides raw write
6
functions), we can safely disable raw accesses to PMINTENCLR entirely.
13
7
14
This bug would affect migration for TCG CPUs which are ARMv7
8
Signed-off-by: Aaron Lindsay <aaron@os.amperecomputing.com>
15
with VFP but without one of Neon or VFPv3.
9
Message-id: 20200707152616.1917154-1-aaron@os.amperecomputing.com
16
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Reported-by: Cédric Le Goater <clg@kaod.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Tested-by: Cédric Le Goater <clg@kaod.org>
20
Message-id: 20180522173713.26282-1-peter.maydell@linaro.org
21
---
12
---
22
target/arm/helper.c | 10 +++++++++-
13
target/arm/helper.c | 4 ++--
23
1 file changed, 9 insertions(+), 1 deletion(-)
14
1 file changed, 2 insertions(+), 2 deletions(-)
24
15
25
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/helper.c
18
--- a/target/arm/helper.c
28
+++ b/target/arm/helper.c
19
+++ b/target/arm/helper.c
29
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
20
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
30
env->cp15.cpacr_el1 = value;
21
.resetvalue = 0x0 },
31
}
22
{ .name = "PMINTENCLR", .cp = 15, .crn = 9, .crm = 14, .opc1 = 0, .opc2 = 2,
32
23
.access = PL1_RW, .accessfn = access_tpm,
33
+static void cpacr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
24
- .type = ARM_CP_ALIAS | ARM_CP_IO,
34
+{
25
+ .type = ARM_CP_ALIAS | ARM_CP_IO | ARM_CP_NO_RAW,
35
+ /* Call cpacr_write() so that we reset with the correct RAO bits set
26
.fieldoffset = offsetof(CPUARMState, cp15.c9_pminten),
36
+ * for our CPU features.
27
.writefn = pmintenclr_write, },
37
+ */
28
{ .name = "PMINTENCLR_EL1", .state = ARM_CP_STATE_AA64,
38
+ cpacr_write(env, ri, 0);
29
.opc0 = 3, .opc1 = 0, .crn = 9, .crm = 14, .opc2 = 2,
39
+}
30
.access = PL1_RW, .accessfn = access_tpm,
40
+
31
- .type = ARM_CP_ALIAS | ARM_CP_IO,
41
static CPAccessResult cpacr_access(CPUARMState *env, const ARMCPRegInfo *ri,
32
+ .type = ARM_CP_ALIAS | ARM_CP_IO | ARM_CP_NO_RAW,
42
bool isread)
33
.fieldoffset = offsetof(CPUARMState, cp15.c9_pminten),
43
{
34
.writefn = pmintenclr_write },
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
35
{ .name = "CCSIDR", .state = ARM_CP_STATE_BOTH,
45
{ .name = "CPACR", .state = ARM_CP_STATE_BOTH, .opc0 = 3,
46
.crn = 1, .crm = 0, .opc1 = 0, .opc2 = 2, .accessfn = cpacr_access,
47
.access = PL1_RW, .fieldoffset = offsetof(CPUARMState, cp15.cpacr_el1),
48
- .resetvalue = 0, .writefn = cpacr_write },
49
+ .resetfn = cpacr_reset, .writefn = cpacr_write },
50
REGINFO_SENTINEL
51
};
52
53
--
36
--
54
2.17.1
37
2.20.1
55
38
56
39
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
It forgot to increase clroffset during the loop. So it only clear the
3
Coverity points out (CID 1430180) that the new case is missing
4
first 4 bytes.
4
break or a /* fallthrough */ comment. Break is the right thing to
5
do as in that case, tail is not used.
5
6
6
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
7
Fixes 1733eebb9e ("virtio-iommu: Implement RESV_MEM probe request")
7
Cc: qemu-stable@nongnu.org
8
Signed-off-by: Eric Auger <eric.auger@redhat.com>
8
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
9
Reported-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 20200708160147.18426-1-eric.auger@redhat.com
10
Message-id: 1527047633-12368-1-git-send-email-zhaoshenglong@huawei.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
13
---
14
hw/intc/arm_gicv3_kvm.c | 1 +
14
hw/virtio/virtio-iommu.c | 1 +
15
1 file changed, 1 insertion(+)
15
1 file changed, 1 insertion(+)
16
16
17
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
17
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
18
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/arm_gicv3_kvm.c
19
--- a/hw/virtio/virtio-iommu.c
20
+++ b/hw/intc/arm_gicv3_kvm.c
20
+++ b/hw/virtio/virtio-iommu.c
21
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
21
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
22
if (clroffset != 0) {
22
ptail = (struct virtio_iommu_req_tail *)
23
reg = 0;
23
(buf + s->config.probe_size);
24
kvm_gicd_access(s, clroffset, &reg, true);
24
ptail->status = virtio_iommu_handle_probe(s, iov, iov_cnt, buf);
25
+ clroffset += 4;
25
+ break;
26
}
26
}
27
reg = *gic_bmp_ptr32(bmp, irq);
27
default:
28
kvm_gicd_access(s, offset, &reg, true);
28
tail.status = VIRTIO_IOMMU_S_UNSUPP;
29
--
29
--
30
2.17.1
30
2.20.1
31
31
32
32
diff view generated by jsdifflib
1
Provide a VMSTATE_BOOL_SUB_ARRAY to go with VMSTATE_UINT8_SUB_ARRAY
1
From: David CARLIER <devnexen@gmail.com>
2
and friends.
3
2
3
Tell Haiku to provide various BSD functions by setting BSD_SOURCE
4
and linking libbsd.
5
6
Signed-off-by: David Carlier <devnexen@gmail.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20200703145614.16684-2-peter.maydell@linaro.org
6
Message-id: 20180521140402.23318-23-peter.maydell@linaro.org
10
[PMM: expanded commit message]
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
13
---
8
include/migration/vmstate.h | 3 +++
14
configure | 4 ++--
9
1 file changed, 3 insertions(+)
15
1 file changed, 2 insertions(+), 2 deletions(-)
10
16
11
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
17
diff --git a/configure b/configure
12
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100755
13
--- a/include/migration/vmstate.h
19
--- a/configure
14
+++ b/include/migration/vmstate.h
20
+++ b/configure
15
@@ -XXX,XX +XXX,XX @@ extern const VMStateInfo vmstate_info_qtailq;
21
@@ -XXX,XX +XXX,XX @@ SunOS)
16
#define VMSTATE_BOOL_ARRAY(_f, _s, _n) \
22
;;
17
VMSTATE_BOOL_ARRAY_V(_f, _s, _n, 0)
23
Haiku)
18
24
haiku="yes"
19
+#define VMSTATE_BOOL_SUB_ARRAY(_f, _s, _start, _num) \
25
- QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS"
20
+ VMSTATE_SUB_ARRAY(_f, _s, _start, _num, 0, vmstate_info_bool, bool)
26
- LIBS="-lposix_error_mapper -lnetwork $LIBS"
21
+
27
+ QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -DBSD_SOURCE $QEMU_CFLAGS"
22
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v) \
28
+ LIBS="-lposix_error_mapper -lnetwork -lbsd $LIBS"
23
VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
29
;;
24
30
Linux)
31
audio_drv_list="try-pa oss"
25
--
32
--
26
2.17.1
33
2.20.1
27
34
28
35
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: David CARLIER <devnexen@gmail.com>
2
add MemTxAttrs as an argument to address_space_translate_iommu().
3
2
3
Instead of using an OS-specific ifdef test to select the "openpty()
4
is in pty.h" codepath, make configure check for the existence of
5
the header and use the new CONFIG_PTY instead.
6
7
This is necessary to build on Haiku, which also provides openpty()
8
via pty.h.
9
10
Signed-off-by: David Carlier <devnexen@gmail.com>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
13
Message-id: 20200703145614.16684-3-peter.maydell@linaro.org
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
[PMM: Expanded commit message; rename to HAVE_PTY_H]
7
Message-id: 20180521140402.23318-14-peter.maydell@linaro.org
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
17
---
9
exec.c | 8 +++++---
18
configure | 9 +++++++++
10
1 file changed, 5 insertions(+), 3 deletions(-)
19
util/qemu-openpty.c | 2 +-
20
2 files changed, 10 insertions(+), 1 deletion(-)
11
21
12
diff --git a/exec.c b/exec.c
22
diff --git a/configure b/configure
23
index XXXXXXX..XXXXXXX 100755
24
--- a/configure
25
+++ b/configure
26
@@ -XXX,XX +XXX,XX @@ else
27
l2tpv3=no
28
fi
29
30
+if check_include "pty.h" ; then
31
+ pty_h=yes
32
+else
33
+ pty_h=no
34
+fi
35
+
36
#########################################
37
# vhost interdependencies and host support
38
39
@@ -XXX,XX +XXX,XX @@ fi
40
if test "$sheepdog" = "yes" ; then
41
echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
42
fi
43
+if test "$pty_h" = "yes" ; then
44
+ echo "HAVE_PTY_H=y" >> $config_host_mak
45
+fi
46
if test "$fuzzing" = "yes" ; then
47
if test "$have_fuzzer" = "yes"; then
48
FUZZ_LDFLAGS=" -fsanitize=address,fuzzer"
49
diff --git a/util/qemu-openpty.c b/util/qemu-openpty.c
13
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
51
--- a/util/qemu-openpty.c
15
+++ b/exec.c
52
+++ b/util/qemu-openpty.c
16
@@ -XXX,XX +XXX,XX @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
53
@@ -XXX,XX +XXX,XX @@
17
* @is_write: whether the translation operation is for write
54
#include "qemu/osdep.h"
18
* @is_mmio: whether this can be MMIO, set true if it can
55
#include "qemu-common.h"
19
* @target_as: the address space targeted by the IOMMU
56
20
+ * @attrs: transaction attributes
57
-#if defined(__GLIBC__)
21
*
58
+#if defined HAVE_PTY_H
22
* This function is called from RCU critical section. It is the common
59
# include <pty.h>
23
* part of flatview_do_translate and address_space_translate_cached.
60
#elif defined CONFIG_BSD
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection address_space_translate_iommu(IOMMUMemoryRegion *iomm
61
# include <termios.h>
25
hwaddr *page_mask_out,
26
bool is_write,
27
bool is_mmio,
28
- AddressSpace **target_as)
29
+ AddressSpace **target_as,
30
+ MemTxAttrs attrs)
31
{
32
MemoryRegionSection *section;
33
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
52
--
62
--
53
2.17.1
63
2.20.1
54
64
55
65
diff view generated by jsdifflib
1
From: Igor Mammedov <imammedo@redhat.com>
1
From: David CARLIER <devnexen@gmail.com>
2
2
3
When QEMU is started with following CLI
3
Instead of assuming that all POSIX platforms provide mlockall(),
4
-machine virt,gic-version=3,accel=kvm -cpu host -bios AAVMF_CODE.fd
4
test for it in configure. If the host doesn't provide this platform
5
it crashes with abort at
5
then os_mlock() will fail -ENOSYS, as it does already on Windows.
6
accel/kvm/kvm-all.c:2164:
7
KVM_SET_DEVICE_ATTR failed: Group 6 attr 0x000000000000c665: Invalid argument
8
6
9
Which is caused by implicit dependency of kvm_arm_gicv3_reset() on
7
This is necessary for Haiku, which does not have mlockall().
10
arm_gicv3_icc_reset() where the later is called by CPU reset
11
reset callback.
12
8
13
However commit:
9
Signed-off-by: David Carlier <devnexen@gmail.com>
14
3b77f6c arm/boot: split load_dtb() from arm_load_kernel()
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
broke CPU reset callback registration in case
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
12
Message-id: 20200703145614.16684-4-peter.maydell@linaro.org
17
arm_load_kernel()
13
[PMM: Expanded commit message; rename to HAVE_MLOCKALL]
18
...
19
if (!info->kernel_filename || info->firmware_loaded)
20
21
branch is taken, i.e. it's sufficient to provide a firmware
22
or do not provide kernel on CLI to skip cpu reset callback
23
registration, where before offending commit the callback
24
has been registered unconditionally.
25
26
Fix it by registering the callback right at the beginning of
27
arm_load_kernel() unconditionally instead of doing it at the end.
28
29
NOTE:
30
we probably should eliminate that dependency anyways as well as
31
separate arch CPU reset parts from arm_load_kernel() into CPU
32
itself, but that refactoring that I probably would have to do
33
anyways later for CPU hotplug to work.
34
35
Reported-by: Auger Eric <eric.auger@redhat.com>
36
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
37
Reviewed-by: Eric Auger <eric.auger@redhat.com>
38
Tested-by: Eric Auger <eric.auger@redhat.com>
39
Message-id: 1527070950-208350-1-git-send-email-imammedo@redhat.com
40
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
42
---
16
---
43
hw/arm/boot.c | 18 +++++++++---------
17
configure | 15 +++++++++++++++
44
1 file changed, 9 insertions(+), 9 deletions(-)
18
os-posix.c | 4 ++++
19
2 files changed, 19 insertions(+)
45
20
46
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
21
diff --git a/configure b/configure
22
index XXXXXXX..XXXXXXX 100755
23
--- a/configure
24
+++ b/configure
25
@@ -XXX,XX +XXX,XX @@ else
26
pty_h=no
27
fi
28
29
+cat > $TMPC <<EOF
30
+#include <sys/mman.h>
31
+int main(int argc, char *argv[]) {
32
+ return mlockall(MCL_FUTURE);
33
+}
34
+EOF
35
+if compile_prog "" "" ; then
36
+ have_mlockall=yes
37
+else
38
+ have_mlockall=no
39
+fi
40
+
41
#########################################
42
# vhost interdependencies and host support
43
44
@@ -XXX,XX +XXX,XX @@ fi
45
if test "$pty_h" = "yes" ; then
46
echo "HAVE_PTY_H=y" >> $config_host_mak
47
fi
48
+if test "$have_mlockall" = "yes" ; then
49
+ echo "HAVE_MLOCKALL=y" >> $config_host_mak
50
+fi
51
if test "$fuzzing" = "yes" ; then
52
if test "$have_fuzzer" = "yes"; then
53
FUZZ_LDFLAGS=" -fsanitize=address,fuzzer"
54
diff --git a/os-posix.c b/os-posix.c
47
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/boot.c
56
--- a/os-posix.c
49
+++ b/hw/arm/boot.c
57
+++ b/os-posix.c
50
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
58
@@ -XXX,XX +XXX,XX @@ bool is_daemonized(void)
51
static const ARMInsnFixup *primary_loader;
59
52
AddressSpace *as = arm_boot_address_space(cpu, info);
60
int os_mlock(void)
53
61
{
54
+ /* CPU objects (unlike devices) are not automatically reset on system
62
+#ifdef HAVE_MLOCKALL
55
+ * reset, so we must always register a handler to do so. If we're
63
int ret = 0;
56
+ * actually loading a kernel, the handler is also responsible for
64
57
+ * arranging that we start it correctly.
65
ret = mlockall(MCL_CURRENT | MCL_FUTURE);
58
+ */
66
@@ -XXX,XX +XXX,XX @@ int os_mlock(void)
59
+ for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
60
+ qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
61
+ }
62
+
63
/* The board code is not supposed to set secure_board_setup unless
64
* running its code in secure mode is actually possible, and KVM
65
* doesn't support secure.
66
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
67
ARM_CPU(cs)->env.boot_info = info;
68
}
67
}
69
68
70
- /* CPU objects (unlike devices) are not automatically reset on system
69
return ret;
71
- * reset, so we must always register a handler to do so. If we're
70
+#else
72
- * actually loading a kernel, the handler is also responsible for
71
+ return -ENOSYS;
73
- * arranging that we start it correctly.
72
+#endif
74
- */
73
}
75
- for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
76
- qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
77
- }
78
-
79
if (!info->skip_dtb_autoload && have_dtb(info)) {
80
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
81
exit(1);
82
--
74
--
83
2.17.1
75
2.20.1
84
76
85
77
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: David CARLIER <devnexen@gmail.com>
2
add MemTxAttrs as an argument to flatview_do_translate().
3
2
3
Regularize our handling of <sys/signal.h>: currently we include it in
4
osdep.h, but only for OpenBSD, and we include it without an ifdef
5
guard in a couple of C files. This causes problems for Haiku, which
6
doesn't have that header.
7
8
Instead, check in configure whether sys/signal.h exists, and if it
9
does then always include it from osdep.h.
10
11
Signed-off-by: David Carlier <devnexen@gmail.com>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Thomas Huth <thuth@redhat.com>
14
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
16
Message-id: 20200703145614.16684-5-peter.maydell@linaro.org
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
[PMM: Expanded commit message; rename to HAVE_SYS_SIGNAL_H]
7
Message-id: 20180521140402.23318-13-peter.maydell@linaro.org
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
20
---
9
exec.c | 9 ++++++---
21
configure | 10 ++++++++++
10
1 file changed, 6 insertions(+), 3 deletions(-)
22
include/qemu/osdep.h | 2 +-
23
hw/xen/xen-legacy-backend.c | 1 -
24
util/oslib-posix.c | 1 -
25
4 files changed, 11 insertions(+), 3 deletions(-)
11
26
12
diff --git a/exec.c b/exec.c
27
diff --git a/configure b/configure
28
index XXXXXXX..XXXXXXX 100755
29
--- a/configure
30
+++ b/configure
31
@@ -XXX,XX +XXX,XX @@ if check_include "libdrm/drm.h" ; then
32
have_drm_h=yes
33
fi
34
35
+#########################################
36
+# sys/signal.h check
37
+have_sys_signal_h=no
38
+if check_include "sys/signal.h" ; then
39
+ have_sys_signal_h=yes
40
+fi
41
+
42
##########################################
43
# VTE probe
44
45
@@ -XXX,XX +XXX,XX @@ fi
46
if test "$have_openpty" = "yes" ; then
47
echo "HAVE_OPENPTY=y" >> $config_host_mak
48
fi
49
+if test "$have_sys_signal_h" = "yes" ; then
50
+ echo "HAVE_SYS_SIGNAL_H=y" >> $config_host_mak
51
+fi
52
53
# Work around a system header bug with some kernel/XFS header
54
# versions where they both try to define 'struct fsxattr':
55
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
13
index XXXXXXX..XXXXXXX 100644
56
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
57
--- a/include/qemu/osdep.h
15
+++ b/exec.c
58
+++ b/include/qemu/osdep.h
16
@@ -XXX,XX +XXX,XX @@ unassigned:
59
@@ -XXX,XX +XXX,XX @@ extern int daemon(int, int);
17
* @is_write: whether the translation operation is for write
60
#include <setjmp.h>
18
* @is_mmio: whether this can be MMIO, set true if it can
61
#include <signal.h>
19
* @target_as: the address space targeted by the IOMMU
62
20
+ * @attrs: memory transaction attributes
63
-#ifdef __OpenBSD__
21
*
64
+#ifdef HAVE_SYS_SIGNAL_H
22
* This function is called from RCU critical section
65
#include <sys/signal.h>
66
#endif
67
68
diff --git a/hw/xen/xen-legacy-backend.c b/hw/xen/xen-legacy-backend.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/hw/xen/xen-legacy-backend.c
71
+++ b/hw/xen/xen-legacy-backend.c
72
@@ -XXX,XX +XXX,XX @@
23
*/
73
*/
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
74
25
hwaddr *page_mask_out,
75
#include "qemu/osdep.h"
26
bool is_write,
76
-#include <sys/signal.h>
27
bool is_mmio,
77
28
- AddressSpace **target_as)
78
#include "hw/sysbus.h"
29
+ AddressSpace **target_as,
79
#include "hw/boards.h"
30
+ MemTxAttrs attrs)
80
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
31
{
81
index XXXXXXX..XXXXXXX 100644
32
MemoryRegionSection *section;
82
--- a/util/oslib-posix.c
33
IOMMUMemoryRegion *iommu_mr;
83
+++ b/util/oslib-posix.c
34
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
84
@@ -XXX,XX +XXX,XX @@
35
* but page mask.
85
#include "qemu/sockets.h"
36
*/
86
#include "qemu/thread.h"
37
section = flatview_do_translate(address_space_to_flatview(as), addr, &xlat,
87
#include <libgen.h>
38
- NULL, &page_mask, is_write, false, &as);
88
-#include <sys/signal.h>
39
+ NULL, &page_mask, is_write, false, &as,
89
#include "qemu/cutils.h"
40
+ attrs);
90
41
91
#ifdef CONFIG_LINUX
42
/* Illegal translation */
43
if (section.mr == &io_mem_unassigned) {
44
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
45
46
/* This can be MMIO, so setup MMIO bit. */
47
section = flatview_do_translate(fv, addr, xlat, plen, NULL,
48
- is_write, true, &as);
49
+ is_write, true, &as, attrs);
50
mr = section.mr;
51
52
if (xen_enabled() && memory_access_is_direct(mr, is_write)) {
53
--
92
--
54
2.17.1
93
2.20.1
55
94
56
95
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: David CARLIER <devnexen@gmail.com>
2
add MemTxAttrs as an argument to address_space_get_iotlb_entry().
3
2
3
Haiku doesn't provide SIGIO; fix this up in osdep.h by defining it as
4
equal to SIGPOLL.
5
6
Signed-off-by: David Carlier <devnexen@gmail.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Thomas Huth <thuth@redhat.com>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Message-id: 20200703145614.16684-6-peter.maydell@linaro.org
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
[PMM: Expanded commit message]
7
Message-id: 20180521140402.23318-12-peter.maydell@linaro.org
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
14
---
9
include/exec/memory.h | 2 +-
15
include/qemu/osdep.h | 4 ++++
10
exec.c | 2 +-
16
1 file changed, 4 insertions(+)
11
hw/virtio/vhost.c | 3 ++-
12
3 files changed, 4 insertions(+), 3 deletions(-)
13
17
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
18
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
15
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
20
--- a/include/qemu/osdep.h
17
+++ b/include/exec/memory.h
21
+++ b/include/qemu/osdep.h
18
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache);
22
@@ -XXX,XX +XXX,XX @@ void qemu_anon_ram_free(void *ptr, size_t size);
19
* entry. Should be called from an RCU critical section.
23
#define HAVE_CHARDEV_PARPORT 1
20
*/
24
#endif
21
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
25
22
- bool is_write);
26
+#if defined(__HAIKU__)
23
+ bool is_write, MemTxAttrs attrs);
27
+#define SIGIO SIGPOLL
24
28
+#endif
25
/* address_space_translate: translate an address range into an address space
29
+
26
* into a MemoryRegion and an address range into that section. Should be
30
#if defined(CONFIG_LINUX)
27
diff --git a/exec.c b/exec.c
31
#ifndef BUS_MCEERR_AR
28
index XXXXXXX..XXXXXXX 100644
32
#define BUS_MCEERR_AR 4
29
--- a/exec.c
30
+++ b/exec.c
31
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
32
33
/* Called from RCU critical section */
34
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
35
- bool is_write)
36
+ bool is_write, MemTxAttrs attrs)
37
{
38
MemoryRegionSection section;
39
hwaddr xlat, page_mask;
40
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/virtio/vhost.c
43
+++ b/hw/virtio/vhost.c
44
@@ -XXX,XX +XXX,XX @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
45
trace_vhost_iotlb_miss(dev, 1);
46
47
iotlb = address_space_get_iotlb_entry(dev->vdev->dma_as,
48
- iova, write);
49
+ iova, write,
50
+ MEMTXATTRS_UNSPECIFIED);
51
if (iotlb.target_as != NULL) {
52
ret = vhost_memory_region_lookup(dev, iotlb.translated_addr,
53
&uaddr, &len);
54
--
33
--
55
2.17.1
34
2.20.1
56
35
57
36
diff view generated by jsdifflib
1
From: Jan Kiszka <jan.kiszka@siemens.com>
1
From: David CARLIER <devnexen@gmail.com>
2
2
3
There was a nasty flip in identifying which register group an access is
3
Haiku puts the bswap* functions in <endian.h>; pull in that
4
targeting. The issue caused spuriously raised priorities of the guest
4
include file on that platform.
5
when handing CPUs over in the Jailhouse hypervisor.
6
5
7
Cc: qemu-stable@nongnu.org
6
Signed-off-by: David Carlier <devnexen@gmail.com>
8
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 28b927d3-da58-bce4-cc13-bfec7f9b1cb9@siemens.com
8
Reviewed-by: Thomas Huth <thuth@redhat.com>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20200703145614.16684-7-peter.maydell@linaro.org
12
[PMM: Expanded commit message]
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
15
---
13
hw/intc/arm_gicv3_cpuif.c | 12 ++++++------
16
include/qemu/bswap.h | 2 ++
14
1 file changed, 6 insertions(+), 6 deletions(-)
17
1 file changed, 2 insertions(+)
15
18
16
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
19
diff --git a/include/qemu/bswap.h b/include/qemu/bswap.h
17
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/arm_gicv3_cpuif.c
21
--- a/include/qemu/bswap.h
19
+++ b/hw/intc/arm_gicv3_cpuif.c
22
+++ b/include/qemu/bswap.h
20
@@ -XXX,XX +XXX,XX @@ static uint64_t icv_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
23
@@ -XXX,XX +XXX,XX @@
21
{
24
# include <machine/bswap.h>
22
GICv3CPUState *cs = icc_cs_from_env(env);
25
#elif defined(__FreeBSD__)
23
int regno = ri->opc2 & 3;
26
# include <sys/endian.h>
24
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
27
+#elif defined(__HAIKU__)
25
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
28
+# include <endian.h>
26
uint64_t value = cs->ich_apr[grp][regno];
29
#elif defined(CONFIG_BYTESWAP_H)
27
30
# include <byteswap.h>
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
31
74
--
32
--
75
2.17.1
33
2.20.1
76
34
77
35
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: David CARLIER <devnexen@gmail.com>
2
add MemTxAttrs as an argument to flatview_translate(); all its
3
callers now have attrs available.
4
2
3
util/compatfd.c includes <sys/syscall.h> so that the CONFIG_SIGNALFD
4
code can use SYS_signalfd. Guard the #include with CONFIG_SIGNALFD
5
to avoid portability issues on hosts like Haiku which do not
6
provide that header file.
7
8
Signed-off-by: David Carlier <devnexen@gmail.com>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Thomas Huth <thuth@redhat.com>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Message-id: 20200703145614.16684-8-peter.maydell@linaro.org
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
[PMM: Expanded commit message]
8
Message-id: 20180521140402.23318-11-peter.maydell@linaro.org
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
16
---
10
include/exec/memory.h | 7 ++++---
17
util/compatfd.c | 2 ++
11
exec.c | 17 +++++++++--------
18
1 file changed, 2 insertions(+)
12
2 files changed, 13 insertions(+), 11 deletions(-)
13
19
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
20
diff --git a/util/compatfd.c b/util/compatfd.c
15
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
22
--- a/util/compatfd.c
17
+++ b/include/exec/memory.h
23
+++ b/util/compatfd.c
18
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
24
@@ -XXX,XX +XXX,XX @@
19
*/
25
#include "qemu/osdep.h"
20
MemoryRegion *flatview_translate(FlatView *fv,
26
#include "qemu/thread.h"
21
hwaddr addr, hwaddr *xlat,
27
22
- hwaddr *len, bool is_write);
28
+#if defined(CONFIG_SIGNALFD)
23
+ hwaddr *len, bool is_write,
29
#include <sys/syscall.h>
24
+ MemTxAttrs attrs);
30
+#endif
25
31
26
static inline MemoryRegion *address_space_translate(AddressSpace *as,
32
struct sigfd_compat_info
27
hwaddr addr, hwaddr *xlat,
28
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
29
MemTxAttrs attrs)
30
{
33
{
31
return flatview_translate(address_space_to_flatview(as),
32
- addr, xlat, len, is_write);
33
+ addr, xlat, len, is_write, attrs);
34
}
35
36
/* address_space_access_valid: check for validity of accessing an address
37
@@ -XXX,XX +XXX,XX @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
38
rcu_read_lock();
39
fv = address_space_to_flatview(as);
40
l = len;
41
- mr = flatview_translate(fv, addr, &addr1, &l, false);
42
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
43
if (len == l && memory_access_is_direct(mr, false)) {
44
ptr = qemu_map_ram_ptr(mr->ram_block, addr1);
45
memcpy(buf, ptr, len);
46
diff --git a/exec.c b/exec.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/exec.c
49
+++ b/exec.c
50
@@ -XXX,XX +XXX,XX @@ iotlb_fail:
51
52
/* Called from RCU critical section */
53
MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
54
- hwaddr *plen, bool is_write)
55
+ hwaddr *plen, bool is_write,
56
+ MemTxAttrs attrs)
57
{
58
MemoryRegion *mr;
59
MemoryRegionSection section;
60
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
61
}
62
63
l = len;
64
- mr = flatview_translate(fv, addr, &addr1, &l, true);
65
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
66
}
67
68
return result;
69
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
70
MemTxResult result = MEMTX_OK;
71
72
l = len;
73
- mr = flatview_translate(fv, addr, &addr1, &l, true);
74
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
75
result = flatview_write_continue(fv, addr, attrs, buf, len,
76
addr1, l, mr);
77
78
@@ -XXX,XX +XXX,XX @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
79
}
80
81
l = len;
82
- mr = flatview_translate(fv, addr, &addr1, &l, false);
83
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
84
}
85
86
return result;
87
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
88
MemoryRegion *mr;
89
90
l = len;
91
- mr = flatview_translate(fv, addr, &addr1, &l, false);
92
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
93
return flatview_read_continue(fv, addr, attrs, buf, len,
94
addr1, l, mr);
95
}
96
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
97
98
while (len > 0) {
99
l = len;
100
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
101
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
102
if (!memory_access_is_direct(mr, is_write)) {
103
l = memory_access_size(mr, l, addr);
104
if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
105
@@ -XXX,XX +XXX,XX @@ flatview_extend_translation(FlatView *fv, hwaddr addr,
106
107
len = target_len;
108
this_mr = flatview_translate(fv, addr, &xlat,
109
- &len, is_write);
110
+ &len, is_write, attrs);
111
if (this_mr != mr || xlat != base + done) {
112
return done;
113
}
114
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
115
l = len;
116
rcu_read_lock();
117
fv = address_space_to_flatview(as);
118
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
119
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
120
121
if (!memory_access_is_direct(mr, is_write)) {
122
if (atomic_xchg(&bounce.in_use, true)) {
123
--
34
--
124
2.17.1
35
2.20.1
125
36
126
37
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: David CARLIER <devnexen@gmail.com>
2
add MemTxAttrs as an argument to flatview_access_valid().
3
Its callers now all have an attrs value to hand, so we can
4
correct our earlier temporary use of MEMTXATTRS_UNSPECIFIED.
5
2
3
The qemu_init_exec_dir() function is inherently non-portable;
4
provide an implementation for Haiku hosts.
5
6
Signed-off-by: David Carlier <devnexen@gmail.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20200703145614.16684-9-peter.maydell@linaro.org
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
[PMM: Expanded commit message]
9
Message-id: 20180521140402.23318-10-peter.maydell@linaro.org
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
13
---
11
exec.c | 12 +++++-------
14
util/oslib-posix.c | 19 +++++++++++++++++++
12
1 file changed, 5 insertions(+), 7 deletions(-)
15
1 file changed, 19 insertions(+)
13
16
14
diff --git a/exec.c b/exec.c
17
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
19
--- a/util/oslib-posix.c
17
+++ b/exec.c
20
+++ b/util/oslib-posix.c
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
21
@@ -XXX,XX +XXX,XX @@
19
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
22
#include <mach-o/dyld.h>
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
23
#endif
29
24
30
return flatview_access_valid(subpage->fv, addr + subpage->base,
25
+#ifdef __HAIKU__
31
- len, is_write);
26
+#include <kernel/image.h>
32
+ len, is_write, attrs);
27
+#endif
33
}
28
+
34
29
#include "qemu/mmap-alloc.h"
35
static const MemoryRegionOps subpage_ops = {
30
36
@@ -XXX,XX +XXX,XX @@ static void cpu_notify_map_clients(void)
31
#ifdef CONFIG_DEBUG_STACK_USAGE
37
}
32
@@ -XXX,XX +XXX,XX @@ void qemu_init_exec_dir(const char *argv0)
38
39
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
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
}
33
}
55
}
34
}
56
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
35
}
57
36
+#elif defined(__HAIKU__)
58
rcu_read_lock();
37
+ {
59
fv = address_space_to_flatview(as);
38
+ image_info ii;
60
- result = flatview_access_valid(fv, addr, len, is_write);
39
+ int32_t c = 0;
61
+ result = flatview_access_valid(fv, addr, len, is_write, attrs);
40
+
62
rcu_read_unlock();
41
+ *buf = '\0';
63
return result;
42
+ while (get_next_image_info(0, &c, &ii) == B_OK) {
64
}
43
+ if (ii.type == B_APP_IMAGE) {
44
+ strncpy(buf, ii.name, sizeof(buf));
45
+ buf[sizeof(buf) - 1] = 0;
46
+ p = buf;
47
+ break;
48
+ }
49
+ }
50
+ }
51
#endif
52
/* If we don't have any way of figuring out the actual executable
53
location then try argv[0]. */
65
--
54
--
66
2.17.1
55
2.20.1
67
56
68
57
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Gerd Hoffmann <kraxel@redhat.com>
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
2
3
Given this isn't perforance critical at all lets avoid the non-portable
4
d_type and use fstat instead to check whenever the file is a chardev.
5
6
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
7
Reported-by: David Carlier <devnexen@gmail.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
11
Message-id: 20200703145614.16684-10-peter.maydell@linaro.org
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20200701180302.14821-1-kraxel@redhat.com
9
Message-id: 20180521140402.23318-7-peter.maydell@linaro.org
13
[PMM: fixed comment style; tweaked subject line]
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
16
---
11
exec.c | 15 ++++++++++-----
17
util/drm.c | 19 ++++++++++++++-----
12
1 file changed, 10 insertions(+), 5 deletions(-)
18
1 file changed, 14 insertions(+), 5 deletions(-)
13
19
14
diff --git a/exec.c b/exec.c
20
diff --git a/util/drm.c b/util/drm.c
15
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
22
--- a/util/drm.c
17
+++ b/exec.c
23
+++ b/util/drm.c
18
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
24
@@ -XXX,XX +XXX,XX @@ int qemu_drm_rendernode_open(const char *rendernode)
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
{
25
{
29
hwaddr done = 0;
26
DIR *dir;
30
hwaddr xlat;
27
struct dirent *e;
31
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
28
- int r, fd;
32
29
+ struct stat st;
33
memory_region_ref(mr);
30
+ int r, fd, ret;
34
*plen = flatview_extend_translation(fv, addr, len, mr, xlat,
31
char *p;
35
- l, is_write);
32
36
+ l, is_write, attrs);
33
if (rendernode) {
37
ptr = qemu_ram_ptr_length(mr->ram_block, xlat, plen, true);
34
@@ -XXX,XX +XXX,XX @@ int qemu_drm_rendernode_open(const char *rendernode)
38
rcu_read_unlock();
35
39
36
fd = -1;
40
@@ -XXX,XX +XXX,XX @@ int64_t address_space_cache_init(MemoryRegionCache *cache,
37
while ((e = readdir(dir))) {
41
mr = cache->mrs.mr;
38
- if (e->d_type != DT_CHR) {
42
memory_region_ref(mr);
39
- continue;
43
if (memory_access_is_direct(mr, is_write)) {
40
- }
44
+ /* We don't care about the memory attributes here as we're only
41
-
45
+ * doing this if we found actual RAM, which behaves the same
42
if (strncmp(e->d_name, "renderD", 7)) {
46
+ * regardless of attributes; so UNSPECIFIED is fine.
43
continue;
44
}
45
@@ -XXX,XX +XXX,XX @@ int qemu_drm_rendernode_open(const char *rendernode)
46
g_free(p);
47
continue;
48
}
49
+
50
+ /*
51
+ * prefer fstat() over checking e->d_type == DT_CHR for
52
+ * portability reasons
47
+ */
53
+ */
48
l = flatview_extend_translation(cache->fv, addr, len, mr,
54
+ ret = fstat(r, &st);
49
- cache->xlat, l, is_write);
55
+ if (ret < 0 || (st.st_mode & S_IFMT) != S_IFCHR) {
50
+ cache->xlat, l, is_write,
56
+ close(r);
51
+ MEMTXATTRS_UNSPECIFIED);
57
+ g_free(p);
52
cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true);
58
+ continue;
53
} else {
59
+ }
54
cache->ptr = NULL;
60
+
61
fd = r;
62
g_free(p);
63
break;
55
--
64
--
56
2.17.1
65
2.20.1
57
66
58
67
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Wentong Wu <wentong.wu@intel.com>
2
add MemTxAttrs as an argument to address_space_access_valid().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Add DISAS_NORETURN case for nothing more to generate because at runtime
4
execution will never return from some helper call. And at the same time
5
replace DISAS_UPDATE in t_gen_helper_raise_exception and gen_exception
6
with the newly added DISAS_NORETURN.
7
8
Signed-off-by: Wentong Wu <wentong.wu@intel.com>
9
Message-id: 20200710233433.19729-1-wentong.wu@intel.com
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
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
---
12
---
11
include/exec/memory.h | 4 +++-
13
target/nios2/translate.c | 5 +++--
12
include/sysemu/dma.h | 3 ++-
14
1 file changed, 3 insertions(+), 2 deletions(-)
13
exec.c | 3 ++-
14
target/s390x/diag.c | 6 ++++--
15
target/s390x/excp_helper.c | 3 ++-
16
target/s390x/mmu_helper.c | 3 ++-
17
target/s390x/sigp.c | 3 ++-
18
7 files changed, 17 insertions(+), 8 deletions(-)
19
15
20
diff --git a/include/exec/memory.h b/include/exec/memory.h
16
diff --git a/target/nios2/translate.c b/target/nios2/translate.c
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/include/exec/memory.h
18
--- a/target/nios2/translate.c
23
+++ b/include/exec/memory.h
19
+++ b/target/nios2/translate.c
24
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
20
@@ -XXX,XX +XXX,XX @@ static void t_gen_helper_raise_exception(DisasContext *dc,
25
* @addr: address within that address space
21
tcg_gen_movi_tl(dc->cpu_R[R_PC], dc->pc);
26
* @len: length of the area to be checked
22
gen_helper_raise_exception(dc->cpu_env, tmp);
27
* @is_write: indicates the transfer direction
23
tcg_temp_free_i32(tmp);
28
+ * @attrs: memory attributes
24
- dc->is_jmp = DISAS_UPDATE;
29
*/
25
+ dc->is_jmp = DISAS_NORETURN;
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
}
26
}
48
27
49
static inline int dma_memory_rw_relaxed(AddressSpace *as, dma_addr_t addr,
28
static bool use_goto_tb(DisasContext *dc, uint32_t dest)
50
diff --git a/exec.c b/exec.c
29
@@ -XXX,XX +XXX,XX @@ static void gen_exception(DisasContext *dc, uint32_t excp)
51
index XXXXXXX..XXXXXXX 100644
30
tcg_gen_movi_tl(cpu_R[R_PC], dc->pc);
52
--- a/exec.c
31
gen_helper_raise_exception(cpu_env, tmp);
53
+++ b/exec.c
32
tcg_temp_free_i32(tmp);
54
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
33
- dc->is_jmp = DISAS_UPDATE;
34
+ dc->is_jmp = DISAS_NORETURN;
55
}
35
}
56
36
57
bool address_space_access_valid(AddressSpace *as, hwaddr addr,
37
/* generate intermediate code for basic block 'tb'. */
58
- int len, bool is_write)
38
@@ -XXX,XX +XXX,XX @@ void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
59
+ int len, bool is_write,
39
tcg_gen_exit_tb(NULL, 0);
60
+ MemTxAttrs attrs)
40
break;
61
{
41
62
FlatView *fv;
42
+ case DISAS_NORETURN:
63
bool result;
43
case DISAS_TB_JUMP:
64
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
44
/* nothing more to generate */
65
index XXXXXXX..XXXXXXX 100644
45
break;
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
--
46
--
131
2.17.1
47
2.20.1
132
48
133
49
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Wentong Wu <wentong.wu@intel.com>
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
2
3
In line the semantics of DISAS_UPDATE on nios2 target with other targets
4
which is to explicitly write the PC back into the cpu state before doing
5
a tcg_gen_exit_tb().
6
7
Signed-off-by: Wentong Wu <wentong.wu@intel.com>
8
Message-id: 20200710233433.19729-2-wentong.wu@intel.com
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
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
---
11
include/exec/memory.h | 4 +++-
12
target/nios2/translate.c | 2 +-
12
accel/tcg/translate-all.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
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
14
19
diff --git a/include/exec/memory.h b/include/exec/memory.h
15
diff --git a/target/nios2/translate.c b/target/nios2/translate.c
20
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
21
--- a/include/exec/memory.h
17
--- a/target/nios2/translate.c
22
+++ b/include/exec/memory.h
18
+++ b/target/nios2/translate.c
23
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
19
@@ -XXX,XX +XXX,XX @@ void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
24
* #MemoryRegion.
20
/* Indicate where the next block should start */
25
* @len: pointer to length
21
switch (dc->is_jmp) {
26
* @is_write: indicates the transfer direction
22
case DISAS_NEXT:
27
+ * @attrs: memory attributes
23
+ case DISAS_UPDATE:
28
*/
24
/* Save the current PC back into the CPU register */
29
MemoryRegion *flatview_translate(FlatView *fv,
25
tcg_gen_movi_tl(cpu_R[R_PC], dc->pc);
30
hwaddr addr, hwaddr *xlat,
26
tcg_gen_exit_tb(NULL, 0);
31
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv,
27
@@ -XXX,XX +XXX,XX @@ void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
32
28
33
static inline MemoryRegion *address_space_translate(AddressSpace *as,
29
default:
34
hwaddr addr, hwaddr *xlat,
30
case DISAS_JUMP:
35
- hwaddr *len, bool is_write)
31
- case DISAS_UPDATE:
36
+ hwaddr *len, bool is_write,
32
/* The jump will already have updated the PC register */
37
+ MemTxAttrs attrs)
33
tcg_gen_exit_tb(NULL, 0);
38
{
34
break;
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
--
35
--
220
2.17.1
36
2.20.1
221
37
222
38
diff view generated by jsdifflib
1
From: Francisco Iglesias <frasse.iglesias@gmail.com>
1
From: Wentong Wu <wentong.wu@intel.com>
2
2
3
Coverity found that the string return by 'object_get_canonical_path' was not
3
wrctl instruction on nios2 target will cause checking cpu
4
being freed at two locations in the model (CID 1391294 and CID 1391293) and
4
interrupt but tcg_handle_interrupt() will call cpu_abort()
5
also that a memset was being called with a value greater than the max of a byte
5
if the CPU gets an interrupt while it's not in 'can do IO'
6
on the second argument (CID 1391286). This patch corrects this by adding the
6
state, so add gen_io_start around wrctl instruction. Also
7
freeing of the strings and also changing to memset to zero instead on
7
at the same time, end the onging TB with DISAS_UPDATE.
8
descriptor unaligned errors.
9
8
10
Signed-off-by: Francisco Iglesias <frasse.iglesias@gmail.com>
9
Signed-off-by: Wentong Wu <wentong.wu@intel.com>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
10
Message-id: 20200710233433.19729-3-wentong.wu@intel.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>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
13
---
17
hw/dma/xlnx-zdma.c | 10 +++++++---
14
target/nios2/translate.c | 5 +++++
18
1 file changed, 7 insertions(+), 3 deletions(-)
15
1 file changed, 5 insertions(+)
19
16
20
diff --git a/hw/dma/xlnx-zdma.c b/hw/dma/xlnx-zdma.c
17
diff --git a/target/nios2/translate.c b/target/nios2/translate.c
21
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/dma/xlnx-zdma.c
19
--- a/target/nios2/translate.c
23
+++ b/hw/dma/xlnx-zdma.c
20
+++ b/target/nios2/translate.c
24
@@ -XXX,XX +XXX,XX @@ static bool zdma_load_descriptor(XlnxZDMA *s, uint64_t addr, void *buf)
21
@@ -XXX,XX +XXX,XX @@
25
qemu_log_mask(LOG_GUEST_ERROR,
22
#include "exec/cpu_ldst.h"
26
"zdma: unaligned descriptor at %" PRIx64,
23
#include "exec/translator.h"
27
addr);
24
#include "qemu/qemu-print.h"
28
- memset(buf, 0xdeadbeef, sizeof(XlnxZDMADescr));
25
+#include "exec/gen-icount.h"
29
+ memset(buf, 0x0, sizeof(XlnxZDMADescr));
26
30
s->error = true;
27
/* is_jmp field values */
31
return false;
28
#define DISAS_JUMP DISAS_TARGET_0 /* only pc was modified dynamically */
29
@@ -XXX,XX +XXX,XX @@ static void wrctl(DisasContext *dc, uint32_t code, uint32_t flags)
30
/* If interrupts were enabled using WRCTL, trigger them. */
31
#if !defined(CONFIG_USER_ONLY)
32
if ((instr.imm5 + CR_BASE) == CR_STATUS) {
33
+ if (tb_cflags(dc->tb) & CF_USE_ICOUNT) {
34
+ gen_io_start();
35
+ }
36
gen_helper_check_interrupts(dc->cpu_env);
37
+ dc->is_jmp = DISAS_UPDATE;
32
}
38
}
33
@@ -XXX,XX +XXX,XX @@ static uint64_t zdma_read(void *opaque, hwaddr addr, unsigned size)
39
#endif
34
RegisterInfo *r = &s->regs_info[addr / 4];
40
}
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
--
41
--
60
2.17.1
42
2.20.1
61
43
62
44
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Wentong Wu <wentong.wu@intel.com>
2
add MemTxAttrs as an argument to address_space_map().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Only when guest code is unmasking interrupts, terminate the excution
4
of translated code and exit to the main CPU loop to handle previous
5
pended interrupts because of the interrupts mask by guest code.
6
7
Signed-off-by: Wentong Wu <wentong.wu@intel.com>
8
Message-id: 20200710233433.19729-4-wentong.wu@intel.com
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
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-5-peter.maydell@linaro.org
10
---
11
---
11
include/exec/memory.h | 3 ++-
12
hw/nios2/cpu_pic.c | 3 ++-
12
include/sysemu/dma.h | 3 ++-
13
1 file changed, 2 insertions(+), 1 deletion(-)
13
exec.c | 6 ++++--
14
target/ppc/mmu-hash64.c | 3 ++-
15
4 files changed, 10 insertions(+), 5 deletions(-)
16
14
17
diff --git a/include/exec/memory.h b/include/exec/memory.h
15
diff --git a/hw/nios2/cpu_pic.c b/hw/nios2/cpu_pic.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/memory.h
17
--- a/hw/nios2/cpu_pic.c
20
+++ b/include/exec/memory.h
18
+++ b/hw/nios2/cpu_pic.c
21
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_
19
@@ -XXX,XX +XXX,XX @@ static void nios2_pic_cpu_handler(void *opaque, int irq, int level)
22
* @addr: address within that address space
20
23
* @plen: pointer to length of buffer; updated on return
21
void nios2_check_interrupts(CPUNios2State *env)
24
* @is_write: indicates the transfer direction
25
+ * @attrs: memory attributes
26
*/
27
void *address_space_map(AddressSpace *as, hwaddr addr,
28
- hwaddr *plen, bool is_write);
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
{
22
{
59
hwaddr len = *plen;
23
- if (env->irq_pending) {
60
hwaddr l, xlat;
24
+ if (env->irq_pending &&
61
@@ -XXX,XX +XXX,XX @@ void *cpu_physical_memory_map(hwaddr addr,
25
+ (env->regs[CR_STATUS] & CR_STATUS_PIE)) {
62
hwaddr *plen,
26
env->irq_pending = 0;
63
int is_write)
27
cpu_interrupt(env_cpu(env), CPU_INTERRUPT_HARD);
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
}
78
79
- hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false);
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
}
28
}
85
--
29
--
86
2.17.1
30
2.20.1
87
31
88
32
diff view generated by jsdifflib
1
Add entries to MAINTAINERS to cover the newer MPS2 boards and
1
Remove the hardcoded tabs from hw/arm/tosa.c. There aren't
2
the new devices they use.
2
many, but since they're all in constant #defines they're not
3
going to go away with our usual "only when we touch a function"
4
policy on reformatting.
3
5
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180518153157.14899-1-peter.maydell@linaro.org
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20200628203748.14250-2-peter.maydell@linaro.org
6
---
9
---
7
MAINTAINERS | 9 +++++++--
10
hw/arm/tosa.c | 44 ++++++++++++++++++++++----------------------
8
1 file changed, 7 insertions(+), 2 deletions(-)
11
1 file changed, 22 insertions(+), 22 deletions(-)
9
12
10
diff --git a/MAINTAINERS b/MAINTAINERS
13
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
11
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
12
--- a/MAINTAINERS
15
--- a/hw/arm/tosa.c
13
+++ b/MAINTAINERS
16
+++ b/hw/arm/tosa.c
14
@@ -XXX,XX +XXX,XX @@ F: hw/timer/cmsdk-apb-timer.c
17
@@ -XXX,XX +XXX,XX @@
15
F: include/hw/timer/cmsdk-apb-timer.h
18
#include "hw/sysbus.h"
16
F: hw/char/cmsdk-apb-uart.c
19
#include "exec/address-spaces.h"
17
F: include/hw/char/cmsdk-apb-uart.h
20
18
+F: hw/misc/tz-ppc.c
21
-#define TOSA_RAM 0x04000000
19
+F: include/hw/misc/tz-ppc.h
22
-#define TOSA_ROM    0x00800000
20
23
+#define TOSA_RAM 0x04000000
21
ARM cores
24
+#define TOSA_ROM 0x00800000
22
M: Peter Maydell <peter.maydell@linaro.org>
25
23
@@ -XXX,XX +XXX,XX @@ M: Peter Maydell <peter.maydell@linaro.org>
26
-#define TOSA_GPIO_USB_IN        (5)
24
L: qemu-arm@nongnu.org
27
-#define TOSA_GPIO_nSD_DETECT    (9)
25
S: Maintained
28
-#define TOSA_GPIO_ON_RESET        (19)
26
F: hw/arm/mps2.c
29
-#define TOSA_GPIO_CF_IRQ        (21)    /* CF slot0 Ready */
27
-F: hw/misc/mps2-scc.c
30
-#define TOSA_GPIO_CF_CD            (13)
28
-F: include/hw/misc/mps2-scc.h
31
-#define TOSA_GPIO_TC6393XB_INT (15)
29
+F: hw/arm/mps2-tz.c
32
-#define TOSA_GPIO_JC_CF_IRQ        (36)    /* CF slot1 Ready */
30
+F: hw/misc/mps2-*.c
33
+#define TOSA_GPIO_USB_IN (5)
31
+F: include/hw/misc/mps2-*.h
34
+#define TOSA_GPIO_nSD_DETECT (9)
32
+F: hw/arm/iotkit.c
35
+#define TOSA_GPIO_ON_RESET (19)
33
+F: include/hw/arm/iotkit.h
36
+#define TOSA_GPIO_CF_IRQ (21) /* CF slot0 Ready */
34
37
+#define TOSA_GPIO_CF_CD (13)
35
Musicpal
38
+#define TOSA_GPIO_TC6393XB_INT (15)
36
M: Jan Kiszka <jan.kiszka@web.de>
39
+#define TOSA_GPIO_JC_CF_IRQ (36) /* CF slot1 Ready */
40
41
-#define TOSA_SCOOP_GPIO_BASE    1
42
-#define TOSA_GPIO_IR_POWERDWN    (TOSA_SCOOP_GPIO_BASE + 2)
43
-#define TOSA_GPIO_SD_WP            (TOSA_SCOOP_GPIO_BASE + 3)
44
-#define TOSA_GPIO_PWR_ON        (TOSA_SCOOP_GPIO_BASE + 4)
45
+#define TOSA_SCOOP_GPIO_BASE 1
46
+#define TOSA_GPIO_IR_POWERDWN (TOSA_SCOOP_GPIO_BASE + 2)
47
+#define TOSA_GPIO_SD_WP (TOSA_SCOOP_GPIO_BASE + 3)
48
+#define TOSA_GPIO_PWR_ON (TOSA_SCOOP_GPIO_BASE + 4)
49
50
-#define TOSA_SCOOP_JC_GPIO_BASE        1
51
-#define TOSA_GPIO_BT_LED        (TOSA_SCOOP_JC_GPIO_BASE + 0)
52
-#define TOSA_GPIO_NOTE_LED        (TOSA_SCOOP_JC_GPIO_BASE + 1)
53
-#define TOSA_GPIO_CHRG_ERR_LED        (TOSA_SCOOP_JC_GPIO_BASE + 2)
54
-#define TOSA_GPIO_TC6393XB_L3V_ON    (TOSA_SCOOP_JC_GPIO_BASE + 5)
55
-#define TOSA_GPIO_WLAN_LED        (TOSA_SCOOP_JC_GPIO_BASE + 7)
56
+#define TOSA_SCOOP_JC_GPIO_BASE 1
57
+#define TOSA_GPIO_BT_LED (TOSA_SCOOP_JC_GPIO_BASE + 0)
58
+#define TOSA_GPIO_NOTE_LED (TOSA_SCOOP_JC_GPIO_BASE + 1)
59
+#define TOSA_GPIO_CHRG_ERR_LED (TOSA_SCOOP_JC_GPIO_BASE + 2)
60
+#define TOSA_GPIO_TC6393XB_L3V_ON (TOSA_SCOOP_JC_GPIO_BASE + 5)
61
+#define TOSA_GPIO_WLAN_LED (TOSA_SCOOP_JC_GPIO_BASE + 7)
62
63
-#define    DAC_BASE    0x4e
64
-#define DAC_CH1        0
65
-#define DAC_CH2        1
66
+#define DAC_BASE 0x4e
67
+#define DAC_CH1 0
68
+#define DAC_CH2 1
69
70
static void tosa_microdrive_attach(PXA2xxState *cpu)
71
{
37
--
72
--
38
2.17.1
73
2.20.1
39
74
40
75
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Currently we have a free-floating set of IRQs and a function
2
add MemTxAttrs as an argument to the MemoryRegion valid.accepts
2
tosa_out_switch() which handle the GPIO lines on the tosa board which
3
callback. We'll need this for subpage_accepts().
3
connect to LEDs, and another free-floating IRQ and tosa_reset()
4
function to handle the GPIO line that resets the system. Encapsulate
5
this behaviour in a simple QOM device.
4
6
5
We could take the approach we used with the read and write
7
This commit fixes Coverity issue CID 1421929 (which pointed out that
6
callbacks and add new a new _with_attrs version, but since there
8
the 'outsignals' in tosa_gpio_setup() were leaked), because it
7
are so few implementations of the accepts hook we just change
9
removes the use of the qemu_allocate_irqs() API from this code
8
them all.
10
entirely.
9
11
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20200628203748.14250-3-peter.maydell@linaro.org
13
Message-id: 20180521140402.23318-9-peter.maydell@linaro.org
14
---
15
---
15
include/exec/memory.h | 3 ++-
16
hw/arm/tosa.c | 88 +++++++++++++++++++++++++++++++++++++--------------
16
exec.c | 9 ++++++---
17
1 file changed, 64 insertions(+), 24 deletions(-)
17
hw/hppa/dino.c | 3 ++-
18
hw/nvram/fw_cfg.c | 12 ++++++++----
19
hw/scsi/esp.c | 3 ++-
20
hw/xen/xen_pt_msi.c | 3 ++-
21
memory.c | 5 +++--
22
7 files changed, 25 insertions(+), 13 deletions(-)
23
18
24
diff --git a/include/exec/memory.h b/include/exec/memory.h
19
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
25
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory.h
21
--- a/hw/arm/tosa.c
27
+++ b/include/exec/memory.h
22
+++ b/hw/arm/tosa.c
28
@@ -XXX,XX +XXX,XX @@ struct MemoryRegionOps {
23
@@ -XXX,XX +XXX,XX @@ static void tosa_microdrive_attach(PXA2xxState *cpu)
29
* as a machine check exception).
24
pxa2xx_pcmcia_attach(cpu->pcmcia[0], md);
30
*/
31
bool (*accepts)(void *opaque, hwaddr addr,
32
- unsigned size, bool is_write);
33
+ unsigned size, bool is_write,
34
+ MemTxAttrs attrs);
35
} valid;
36
/* Internal implementation constraints: */
37
struct {
38
diff --git a/exec.c b/exec.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/exec.c
41
+++ b/exec.c
42
@@ -XXX,XX +XXX,XX @@ static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
43
}
25
}
44
26
45
static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
27
-static void tosa_out_switch(void *opaque, int line, int level)
46
- unsigned size, bool is_write)
28
+/*
47
+ unsigned size, bool is_write,
29
+ * Encapsulation of some GPIO line behaviour for the Tosa board
48
+ MemTxAttrs attrs)
30
+ *
31
+ * QEMU interface:
32
+ * + named GPIO inputs "leds[0..3]": assert to light LEDs
33
+ * + named GPIO input "reset": when asserted, resets the system
34
+ */
35
+
36
+#define TYPE_TOSA_MISC_GPIO "tosa-misc-gpio"
37
+#define TOSA_MISC_GPIO(obj) \
38
+ OBJECT_CHECK(TosaMiscGPIOState, (obj), TYPE_TOSA_MISC_GPIO)
39
+
40
+typedef struct TosaMiscGPIOState {
41
+ SysBusDevice parent_obj;
42
+} TosaMiscGPIOState;
43
+
44
+static void tosa_gpio_leds(void *opaque, int line, int level)
49
{
45
{
50
return is_write;
46
switch (line) {
47
- case 0:
48
- fprintf(stderr, "blue LED %s.\n", level ? "on" : "off");
49
- break;
50
- case 1:
51
- fprintf(stderr, "green LED %s.\n", level ? "on" : "off");
52
- break;
53
- case 2:
54
- fprintf(stderr, "amber LED %s.\n", level ? "on" : "off");
55
- break;
56
- case 3:
57
- fprintf(stderr, "wlan LED %s.\n", level ? "on" : "off");
58
- break;
59
- default:
60
- fprintf(stderr, "Uhandled out event: %d = %d\n", line, level);
61
- break;
62
+ case 0:
63
+ fprintf(stderr, "blue LED %s.\n", level ? "on" : "off");
64
+ break;
65
+ case 1:
66
+ fprintf(stderr, "green LED %s.\n", level ? "on" : "off");
67
+ break;
68
+ case 2:
69
+ fprintf(stderr, "amber LED %s.\n", level ? "on" : "off");
70
+ break;
71
+ case 3:
72
+ fprintf(stderr, "wlan LED %s.\n", level ? "on" : "off");
73
+ break;
74
+ default:
75
+ g_assert_not_reached();
76
}
51
}
77
}
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult subpage_write(void *opaque, hwaddr addr,
78
79
@@ -XXX,XX +XXX,XX @@ static void tosa_reset(void *opaque, int line, int level)
80
}
53
}
81
}
54
82
55
static bool subpage_accepts(void *opaque, hwaddr addr,
83
+static void tosa_misc_gpio_init(Object *obj)
56
- unsigned len, bool is_write)
84
+{
57
+ unsigned len, bool is_write,
85
+ DeviceState *dev = DEVICE(obj);
58
+ MemTxAttrs attrs)
86
+
87
+ qdev_init_gpio_in_named(dev, tosa_gpio_leds, "leds", 4);
88
+ qdev_init_gpio_in_named(dev, tosa_reset, "reset", 1);
89
+}
90
+
91
static void tosa_gpio_setup(PXA2xxState *cpu,
92
DeviceState *scp0,
93
DeviceState *scp1,
94
TC6393xbState *tmio)
59
{
95
{
60
subpage_t *subpage = opaque;
96
- qemu_irq *outsignals = qemu_allocate_irqs(tosa_out_switch, cpu, 4);
61
#if defined(DEBUG_SUBPAGE)
97
- qemu_irq reset;
62
@@ -XXX,XX +XXX,XX @@ static void readonly_mem_write(void *opaque, hwaddr addr,
98
+ DeviceState *misc_gpio;
99
+
100
+ misc_gpio = sysbus_create_simple(TYPE_TOSA_MISC_GPIO, -1, NULL);
101
102
/* MMC/SD host */
103
pxa2xx_mmci_handlers(cpu->mmc,
104
@@ -XXX,XX +XXX,XX @@ static void tosa_gpio_setup(PXA2xxState *cpu,
105
qemu_irq_invert(qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_nSD_DETECT)));
106
107
/* Handle reset */
108
- reset = qemu_allocate_irq(tosa_reset, cpu, 0);
109
- qdev_connect_gpio_out(cpu->gpio, TOSA_GPIO_ON_RESET, reset);
110
+ qdev_connect_gpio_out(cpu->gpio, TOSA_GPIO_ON_RESET,
111
+ qdev_get_gpio_in_named(misc_gpio, "reset", 0));
112
113
/* PCMCIA signals: card's IRQ and Card-Detect */
114
pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[0],
115
@@ -XXX,XX +XXX,XX @@ static void tosa_gpio_setup(PXA2xxState *cpu,
116
qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_JC_CF_IRQ),
117
NULL);
118
119
- qdev_connect_gpio_out(scp1, TOSA_GPIO_BT_LED, outsignals[0]);
120
- qdev_connect_gpio_out(scp1, TOSA_GPIO_NOTE_LED, outsignals[1]);
121
- qdev_connect_gpio_out(scp1, TOSA_GPIO_CHRG_ERR_LED, outsignals[2]);
122
- qdev_connect_gpio_out(scp1, TOSA_GPIO_WLAN_LED, outsignals[3]);
123
+ qdev_connect_gpio_out(scp1, TOSA_GPIO_BT_LED,
124
+ qdev_get_gpio_in_named(misc_gpio, "leds", 0));
125
+ qdev_connect_gpio_out(scp1, TOSA_GPIO_NOTE_LED,
126
+ qdev_get_gpio_in_named(misc_gpio, "leds", 1));
127
+ qdev_connect_gpio_out(scp1, TOSA_GPIO_CHRG_ERR_LED,
128
+ qdev_get_gpio_in_named(misc_gpio, "leds", 2));
129
+ qdev_connect_gpio_out(scp1, TOSA_GPIO_WLAN_LED,
130
+ qdev_get_gpio_in_named(misc_gpio, "leds", 3));
131
132
qdev_connect_gpio_out(scp1, TOSA_GPIO_TC6393XB_L3V_ON, tc6393xb_l3v_get(tmio));
133
134
@@ -XXX,XX +XXX,XX @@ static const TypeInfo tosa_ssp_info = {
135
.class_init = tosa_ssp_class_init,
136
};
137
138
+static const TypeInfo tosa_misc_gpio_info = {
139
+ .name = "tosa-misc-gpio",
140
+ .parent = TYPE_SYS_BUS_DEVICE,
141
+ .instance_size = sizeof(TosaMiscGPIOState),
142
+ .instance_init = tosa_misc_gpio_init,
143
+ /*
144
+ * No class init required: device has no internal state so does not
145
+ * need to set up reset or vmstate, and has no realize method.
146
+ */
147
+};
148
+
149
static void tosa_register_types(void)
150
{
151
type_register_static(&tosa_dac_info);
152
type_register_static(&tosa_ssp_info);
153
+ type_register_static(&tosa_misc_gpio_info);
63
}
154
}
64
155
65
static bool readonly_mem_accepts(void *opaque, hwaddr addr,
156
type_init(tosa_register_types)
66
- unsigned size, bool is_write)
67
+ unsigned size, bool is_write,
68
+ MemTxAttrs attrs)
69
{
70
return is_write;
71
}
72
diff --git a/hw/hppa/dino.c b/hw/hppa/dino.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/hppa/dino.c
75
+++ b/hw/hppa/dino.c
76
@@ -XXX,XX +XXX,XX @@ static void gsc_to_pci_forwarding(DinoState *s)
77
}
78
79
static bool dino_chip_mem_valid(void *opaque, hwaddr addr,
80
- unsigned size, bool is_write)
81
+ unsigned size, bool is_write,
82
+ MemTxAttrs attrs)
83
{
84
switch (addr) {
85
case DINO_IAR0:
86
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/nvram/fw_cfg.c
89
+++ b/hw/nvram/fw_cfg.c
90
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_dma_mem_write(void *opaque, hwaddr addr,
91
}
92
93
static bool fw_cfg_dma_mem_valid(void *opaque, hwaddr addr,
94
- unsigned size, bool is_write)
95
+ unsigned size, bool is_write,
96
+ MemTxAttrs attrs)
97
{
98
return !is_write || ((size == 4 && (addr == 0 || addr == 4)) ||
99
(size == 8 && addr == 0));
100
}
101
102
static bool fw_cfg_data_mem_valid(void *opaque, hwaddr addr,
103
- unsigned size, bool is_write)
104
+ unsigned size, bool is_write,
105
+ MemTxAttrs attrs)
106
{
107
return addr == 0;
108
}
109
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_ctl_mem_write(void *opaque, hwaddr addr,
110
}
111
112
static bool fw_cfg_ctl_mem_valid(void *opaque, hwaddr addr,
113
- unsigned size, bool is_write)
114
+ unsigned size, bool is_write,
115
+ MemTxAttrs attrs)
116
{
117
return is_write && size == 2;
118
}
119
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_comb_write(void *opaque, hwaddr addr,
120
}
121
122
static bool fw_cfg_comb_valid(void *opaque, hwaddr addr,
123
- unsigned size, bool is_write)
124
+ unsigned size, bool is_write,
125
+ MemTxAttrs attrs)
126
{
127
return (size == 1) || (is_write && size == 2);
128
}
129
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
130
index XXXXXXX..XXXXXXX 100644
131
--- a/hw/scsi/esp.c
132
+++ b/hw/scsi/esp.c
133
@@ -XXX,XX +XXX,XX @@ void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val)
134
}
135
136
static bool esp_mem_accepts(void *opaque, hwaddr addr,
137
- unsigned size, bool is_write)
138
+ unsigned size, bool is_write,
139
+ MemTxAttrs attrs)
140
{
141
return (size == 1) || (is_write && size == 4);
142
}
143
diff --git a/hw/xen/xen_pt_msi.c b/hw/xen/xen_pt_msi.c
144
index XXXXXXX..XXXXXXX 100644
145
--- a/hw/xen/xen_pt_msi.c
146
+++ b/hw/xen/xen_pt_msi.c
147
@@ -XXX,XX +XXX,XX @@ static uint64_t pci_msix_read(void *opaque, hwaddr addr,
148
}
149
150
static bool pci_msix_accepts(void *opaque, hwaddr addr,
151
- unsigned size, bool is_write)
152
+ unsigned size, bool is_write,
153
+ MemTxAttrs attrs)
154
{
155
return !(addr & (size - 1));
156
}
157
diff --git a/memory.c b/memory.c
158
index XXXXXXX..XXXXXXX 100644
159
--- a/memory.c
160
+++ b/memory.c
161
@@ -XXX,XX +XXX,XX @@ static void unassigned_mem_write(void *opaque, hwaddr addr,
162
}
163
164
static bool unassigned_mem_accepts(void *opaque, hwaddr addr,
165
- unsigned size, bool is_write)
166
+ unsigned size, bool is_write,
167
+ MemTxAttrs attrs)
168
{
169
return false;
170
}
171
@@ -XXX,XX +XXX,XX @@ bool memory_region_access_valid(MemoryRegion *mr,
172
access_size = MAX(MIN(size, access_size_max), access_size_min);
173
for (i = 0; i < size; i += access_size) {
174
if (!mr->ops->valid.accepts(mr->opaque, addr + i, access_size,
175
- is_write)) {
176
+ is_write, attrs)) {
177
return false;
178
}
179
}
180
--
157
--
181
2.17.1
158
2.20.1
182
159
183
160
diff view generated by jsdifflib
1
Add more detail to the documentation for memory_region_init_iommu()
1
Remove hard-tabs from palm.c.
2
and other IOMMU-related functions and data structures.
3
2
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Li Qiang <liq3ea@gmail.com>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
6
Message-id: 20200628214230.2592-2-peter.maydell@linaro.org
8
Message-id: 20180521140402.23318-2-peter.maydell@linaro.org
9
---
7
---
10
include/exec/memory.h | 105 ++++++++++++++++++++++++++++++++++++++----
8
hw/arm/palm.c | 64 +++++++++++++++++++++++++--------------------------
11
1 file changed, 95 insertions(+), 10 deletions(-)
9
1 file changed, 32 insertions(+), 32 deletions(-)
12
10
13
diff --git a/include/exec/memory.h b/include/exec/memory.h
11
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/include/exec/memory.h
13
--- a/hw/arm/palm.c
16
+++ b/include/exec/memory.h
14
+++ b/hw/arm/palm.c
17
@@ -XXX,XX +XXX,XX @@ enum IOMMUMemoryRegionAttr {
15
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps static_ops = {
18
IOMMU_ATTR_SPAPR_TCE_FD
16
/* Palm Tunsgten|E support */
17
18
/* Shared GPIOs */
19
-#define PALMTE_USBDETECT_GPIO    0
20
-#define PALMTE_USB_OR_DC_GPIO    1
21
-#define PALMTE_TSC_GPIO        4
22
-#define PALMTE_PINTDAV_GPIO    6
23
-#define PALMTE_MMC_WP_GPIO    8
24
-#define PALMTE_MMC_POWER_GPIO    9
25
-#define PALMTE_HDQ_GPIO        11
26
-#define PALMTE_HEADPHONES_GPIO    14
27
-#define PALMTE_SPEAKER_GPIO    15
28
+#define PALMTE_USBDETECT_GPIO 0
29
+#define PALMTE_USB_OR_DC_GPIO 1
30
+#define PALMTE_TSC_GPIO 4
31
+#define PALMTE_PINTDAV_GPIO 6
32
+#define PALMTE_MMC_WP_GPIO 8
33
+#define PALMTE_MMC_POWER_GPIO 9
34
+#define PALMTE_HDQ_GPIO 11
35
+#define PALMTE_HEADPHONES_GPIO 14
36
+#define PALMTE_SPEAKER_GPIO 15
37
/* MPU private GPIOs */
38
-#define PALMTE_DC_GPIO        2
39
-#define PALMTE_MMC_SWITCH_GPIO    4
40
-#define PALMTE_MMC1_GPIO    6
41
-#define PALMTE_MMC2_GPIO    7
42
-#define PALMTE_MMC3_GPIO    11
43
+#define PALMTE_DC_GPIO 2
44
+#define PALMTE_MMC_SWITCH_GPIO 4
45
+#define PALMTE_MMC1_GPIO 6
46
+#define PALMTE_MMC2_GPIO 7
47
+#define PALMTE_MMC3_GPIO 11
48
49
static MouseTransformInfo palmte_pointercal = {
50
.x = 320,
51
@@ -XXX,XX +XXX,XX @@ static struct {
52
int column;
53
} palmte_keymap[0x80] = {
54
[0 ... 0x7f] = { -1, -1 },
55
- [0x3b] = { 0, 0 },    /* F1    -> Calendar */
56
- [0x3c] = { 1, 0 },    /* F2    -> Contacts */
57
- [0x3d] = { 2, 0 },    /* F3    -> Tasks List */
58
- [0x3e] = { 3, 0 },    /* F4    -> Note Pad */
59
- [0x01] = { 4, 0 },    /* Esc    -> Power */
60
- [0x4b] = { 0, 1 },    /*      Left */
61
- [0x50] = { 1, 1 },    /*      Down */
62
- [0x48] = { 2, 1 },    /*     Up */
63
- [0x4d] = { 3, 1 },    /*     Right */
64
- [0x4c] = { 4, 1 },    /*      Centre */
65
- [0x39] = { 4, 1 },    /* Spc    -> Centre */
66
+ [0x3b] = { 0, 0 }, /* F1 -> Calendar */
67
+ [0x3c] = { 1, 0 }, /* F2 -> Contacts */
68
+ [0x3d] = { 2, 0 }, /* F3 -> Tasks List */
69
+ [0x3e] = { 3, 0 }, /* F4 -> Note Pad */
70
+ [0x01] = { 4, 0 }, /* Esc -> Power */
71
+ [0x4b] = { 0, 1 }, /* Left */
72
+ [0x50] = { 1, 1 }, /* Down */
73
+ [0x48] = { 2, 1 }, /* Up */
74
+ [0x4d] = { 3, 1 }, /* Right */
75
+ [0x4c] = { 4, 1 }, /* Centre */
76
+ [0x39] = { 4, 1 }, /* Spc -> Centre */
19
};
77
};
20
78
21
+/**
79
static void palmte_button_event(void *opaque, int keycode)
22
+ * IOMMUMemoryRegionClass:
80
@@ -XXX,XX +XXX,XX @@ static void palmte_gpio_setup(struct omap_mpu_state_s *cpu)
23
+ *
81
[PALMTE_MMC_SWITCH_GPIO]));
24
+ * All IOMMU implementations need to subclass TYPE_IOMMU_MEMORY_REGION
82
25
+ * and provide an implementation of at least the @translate method here
83
misc_gpio = qemu_allocate_irqs(palmte_onoff_gpios, cpu, 7);
26
+ * to handle requests to the memory region. Other methods are optional.
84
- qdev_connect_gpio_out(cpu->gpio, PALMTE_MMC_POWER_GPIO,    misc_gpio[0]);
27
+ *
85
- qdev_connect_gpio_out(cpu->gpio, PALMTE_SPEAKER_GPIO,    misc_gpio[1]);
28
+ * The IOMMU implementation must use the IOMMU notifier infrastructure
86
- qdev_connect_gpio_out(cpu->gpio, 11,            misc_gpio[2]);
29
+ * to report whenever mappings are changed, by calling
87
- qdev_connect_gpio_out(cpu->gpio, 12,            misc_gpio[3]);
30
+ * memory_region_notify_iommu() (or, if necessary, by calling
88
- qdev_connect_gpio_out(cpu->gpio, 13,            misc_gpio[4]);
31
+ * memory_region_notify_one() for each registered notifier).
89
- omap_mpuio_out_set(cpu->mpuio, 1,                misc_gpio[5]);
32
+ */
90
- omap_mpuio_out_set(cpu->mpuio, 3,                misc_gpio[6]);
33
typedef struct IOMMUMemoryRegionClass {
91
+ qdev_connect_gpio_out(cpu->gpio, PALMTE_MMC_POWER_GPIO, misc_gpio[0]);
34
/* private */
92
+ qdev_connect_gpio_out(cpu->gpio, PALMTE_SPEAKER_GPIO, misc_gpio[1]);
35
struct DeviceClass parent_class;
93
+ qdev_connect_gpio_out(cpu->gpio, 11, misc_gpio[2]);
36
94
+ qdev_connect_gpio_out(cpu->gpio, 12, misc_gpio[3]);
37
/*
95
+ qdev_connect_gpio_out(cpu->gpio, 13, misc_gpio[4]);
38
- * Return a TLB entry that contains a given address. Flag should
96
+ omap_mpuio_out_set(cpu->mpuio, 1, misc_gpio[5]);
39
- * be the access permission of this translation operation. We can
97
+ omap_mpuio_out_set(cpu->mpuio, 3, misc_gpio[6]);
40
- * set flag to IOMMU_NONE to mean that we don't need any
98
41
- * read/write permission checks, like, when for region replay.
99
/* Reset some inputs to initial state. */
42
+ * Return a TLB entry that contains a given address.
100
qemu_irq_lower(qdev_get_gpio_in(cpu->gpio, PALMTE_USBDETECT_GPIO));
43
+ *
44
+ * The IOMMUAccessFlags indicated via @flag are optional and may
45
+ * be specified as IOMMU_NONE to indicate that the caller needs
46
+ * the full translation information for both reads and writes. If
47
+ * the access flags are specified then the IOMMU implementation
48
+ * may use this as an optimization, to stop doing a page table
49
+ * walk as soon as it knows that the requested permissions are not
50
+ * allowed. If IOMMU_NONE is passed then the IOMMU must do the
51
+ * full page table walk and report the permissions in the returned
52
+ * IOMMUTLBEntry. (Note that this implies that an IOMMU may not
53
+ * return different mappings for reads and writes.)
54
+ *
55
+ * The returned information remains valid while the caller is
56
+ * holding the big QEMU lock or is inside an RCU critical section;
57
+ * if the caller wishes to cache the mapping beyond that it must
58
+ * register an IOMMU notifier so it can invalidate its cached
59
+ * information when the IOMMU mapping changes.
60
+ *
61
+ * @iommu: the IOMMUMemoryRegion
62
+ * @hwaddr: address to be translated within the memory region
63
+ * @flag: requested access permissions
64
*/
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
--
101
--
172
2.17.1
102
2.20.1
173
103
174
104
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Replace the free-floating set of IRQs and palmte_onoff_gpios()
2
add MemTxAttrs as an argument to tb_invalidate_phys_addr().
2
function with a simple QOM device that encapsulates this
3
Its callers either have an attrs value to hand, or don't care
3
behaviour.
4
and can use MEMTXATTRS_UNSPECIFIED.
4
5
This fixes Coverity issue CID 1421944, which points out that
6
the memory returned by qemu_allocate_irqs() is leaked.
5
7
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Li Qiang <liq3ea@gmail.com>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180521140402.23318-3-peter.maydell@linaro.org
11
Message-id: 20200628214230.2592-3-peter.maydell@linaro.org
10
---
12
---
11
include/exec/exec-all.h | 5 +++--
13
hw/arm/palm.c | 61 +++++++++++++++++++++++++++++++++++++++++++--------
12
accel/tcg/translate-all.c | 2 +-
14
1 file changed, 52 insertions(+), 9 deletions(-)
13
exec.c | 2 +-
14
target/xtensa/op_helper.c | 3 ++-
15
4 files changed, 7 insertions(+), 5 deletions(-)
16
15
17
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
16
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
18
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/exec-all.h
18
--- a/hw/arm/palm.c
20
+++ b/include/exec/exec-all.h
19
+++ b/hw/arm/palm.c
21
@@ -XXX,XX +XXX,XX @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
20
@@ -XXX,XX +XXX,XX @@ static void palmte_button_event(void *opaque, int keycode)
22
void tlb_set_page(CPUState *cpu, target_ulong vaddr,
21
!(keycode & 0x80));
23
hwaddr paddr, int prot,
22
}
24
int mmu_idx, target_ulong size);
23
25
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
24
+/*
26
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs);
25
+ * Encapsulation of some GPIO line behaviour for the Palm board
27
void probe_write(CPUArchState *env, target_ulong addr, int size, int mmu_idx,
26
+ *
28
uintptr_t retaddr);
27
+ * QEMU interface:
29
#else
28
+ * + unnamed GPIO inputs 0..6: for the various miscellaneous input lines
30
@@ -XXX,XX +XXX,XX @@ static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
29
+ */
31
uint16_t idxmap)
30
+
31
+#define TYPE_PALM_MISC_GPIO "palm-misc-gpio"
32
+#define PALM_MISC_GPIO(obj) \
33
+ OBJECT_CHECK(PalmMiscGPIOState, (obj), TYPE_PALM_MISC_GPIO)
34
+
35
+typedef struct PalmMiscGPIOState {
36
+ SysBusDevice parent_obj;
37
+} PalmMiscGPIOState;
38
+
39
static void palmte_onoff_gpios(void *opaque, int line, int level)
32
{
40
{
33
}
41
switch (line) {
34
-static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
42
@@ -XXX,XX +XXX,XX @@ static void palmte_onoff_gpios(void *opaque, int line, int level)
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
}
43
}
64
}
44
}
65
#endif
45
66
diff --git a/target/xtensa/op_helper.c b/target/xtensa/op_helper.c
46
+static void palm_misc_gpio_init(Object *obj)
67
index XXXXXXX..XXXXXXX 100644
47
+{
68
--- a/target/xtensa/op_helper.c
48
+ DeviceState *dev = DEVICE(obj);
69
+++ b/target/xtensa/op_helper.c
49
+
70
@@ -XXX,XX +XXX,XX @@ static void tb_invalidate_virtual_addr(CPUXtensaState *env, uint32_t vaddr)
50
+ qdev_init_gpio_in(dev, palmte_onoff_gpios, 7);
71
int ret = xtensa_get_physical_addr(env, false, vaddr, 2, 0,
51
+}
72
&paddr, &page_size, &access);
52
+
73
if (ret == 0) {
53
+static const TypeInfo palm_misc_gpio_info = {
74
- tb_invalidate_phys_addr(&address_space_memory, paddr);
54
+ .name = TYPE_PALM_MISC_GPIO,
75
+ tb_invalidate_phys_addr(&address_space_memory, paddr,
55
+ .parent = TYPE_SYS_BUS_DEVICE,
76
+ MEMTXATTRS_UNSPECIFIED);
56
+ .instance_size = sizeof(PalmMiscGPIOState),
77
}
57
+ .instance_init = palm_misc_gpio_init,
58
+ /*
59
+ * No class init required: device has no internal state so does not
60
+ * need to set up reset or vmstate, and has no realize method.
61
+ */
62
+};
63
+
64
static void palmte_gpio_setup(struct omap_mpu_state_s *cpu)
65
{
66
- qemu_irq *misc_gpio;
67
+ DeviceState *misc_gpio;
68
+
69
+ misc_gpio = sysbus_create_simple(TYPE_PALM_MISC_GPIO, -1, NULL);
70
71
omap_mmc_handlers(cpu->mmc,
72
qdev_get_gpio_in(cpu->gpio, PALMTE_MMC_WP_GPIO),
73
qemu_irq_invert(omap_mpuio_in_get(cpu->mpuio)
74
[PALMTE_MMC_SWITCH_GPIO]));
75
76
- misc_gpio = qemu_allocate_irqs(palmte_onoff_gpios, cpu, 7);
77
- qdev_connect_gpio_out(cpu->gpio, PALMTE_MMC_POWER_GPIO, misc_gpio[0]);
78
- qdev_connect_gpio_out(cpu->gpio, PALMTE_SPEAKER_GPIO, misc_gpio[1]);
79
- qdev_connect_gpio_out(cpu->gpio, 11, misc_gpio[2]);
80
- qdev_connect_gpio_out(cpu->gpio, 12, misc_gpio[3]);
81
- qdev_connect_gpio_out(cpu->gpio, 13, misc_gpio[4]);
82
- omap_mpuio_out_set(cpu->mpuio, 1, misc_gpio[5]);
83
- omap_mpuio_out_set(cpu->mpuio, 3, misc_gpio[6]);
84
+ qdev_connect_gpio_out(cpu->gpio, PALMTE_MMC_POWER_GPIO,
85
+ qdev_get_gpio_in(misc_gpio, 0));
86
+ qdev_connect_gpio_out(cpu->gpio, PALMTE_SPEAKER_GPIO,
87
+ qdev_get_gpio_in(misc_gpio, 1));
88
+ qdev_connect_gpio_out(cpu->gpio, 11, qdev_get_gpio_in(misc_gpio, 2));
89
+ qdev_connect_gpio_out(cpu->gpio, 12, qdev_get_gpio_in(misc_gpio, 3));
90
+ qdev_connect_gpio_out(cpu->gpio, 13, qdev_get_gpio_in(misc_gpio, 4));
91
+ omap_mpuio_out_set(cpu->mpuio, 1, qdev_get_gpio_in(misc_gpio, 5));
92
+ omap_mpuio_out_set(cpu->mpuio, 3, qdev_get_gpio_in(misc_gpio, 6));
93
94
/* Reset some inputs to initial state. */
95
qemu_irq_lower(qdev_get_gpio_in(cpu->gpio, PALMTE_USBDETECT_GPIO));
96
@@ -XXX,XX +XXX,XX @@ static void palmte_machine_init(MachineClass *mc)
78
}
97
}
79
98
99
DEFINE_MACHINE("cheetah", palmte_machine_init)
100
+
101
+static void palm_register_types(void)
102
+{
103
+ type_register_static(&palm_misc_gpio_info);
104
+}
105
+
106
+type_init(palm_register_types)
80
--
107
--
81
2.17.1
108
2.20.1
82
109
83
110
diff view generated by jsdifflib
1
From: Paolo Bonzini <pbonzini@redhat.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
cpregs_keys is an uint32_t* so the allocation should use uint32_t.
3
Since added in commit 2bea128c3d, each SDHCI is wired with a SD
4
g_new is even better because it is type-safe.
4
card, using empty card when no block drive provided. This is not
5
the desired behavior. The SDHCI exposes a SD bus to plug cards
6
on, if no card available, it is fine to have an unplugged bus.
5
7
6
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
8
Avoid creating unnecessary SD card device when no block drive
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
provided.
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
11
Fixes: 2bea128c3d ("hw/sd/aspeed_sdhci: New device")
12
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20200705173402.15620-1-f4bug@amsat.org
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
16
---
11
target/arm/gdbstub.c | 3 +--
17
hw/arm/aspeed.c | 9 +++++----
12
1 file changed, 1 insertion(+), 2 deletions(-)
18
1 file changed, 5 insertions(+), 4 deletions(-)
13
19
14
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
20
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
15
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/gdbstub.c
22
--- a/hw/arm/aspeed.c
17
+++ b/target/arm/gdbstub.c
23
+++ b/hw/arm/aspeed.c
18
@@ -XXX,XX +XXX,XX @@ int arm_gen_dynamic_xml(CPUState *cs)
24
@@ -XXX,XX +XXX,XX @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
19
RegisterSysregXmlParam param = {cs, s};
25
{
20
26
DeviceState *card;
21
cpu->dyn_xml.num_cpregs = 0;
27
22
- cpu->dyn_xml.cpregs_keys = g_malloc(sizeof(uint32_t *) *
28
- card = qdev_new(TYPE_SD_CARD);
23
- g_hash_table_size(cpu->cp_regs));
29
- if (dinfo) {
24
+ cpu->dyn_xml.cpregs_keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
30
- qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
25
g_string_printf(s, "<?xml version=\"1.0\"?>");
31
- &error_fatal);
26
g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
32
+ if (!dinfo) {
27
g_string_append_printf(s, "<feature name=\"org.qemu.gdb.arm.sys.regs\">");
33
+ return;
34
}
35
+ card = qdev_new(TYPE_SD_CARD);
36
+ qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
37
+ &error_fatal);
38
qdev_realize_and_unref(card,
39
qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
40
&error_fatal);
28
--
41
--
29
2.17.1
42
2.20.1
30
43
31
44
diff view generated by jsdifflib