1
target-arm queue. This has the "plumb txattrs through various
1
Hi; here's a queue of arm patches (plus a few elf2dmp changes);
2
bits of exec.c" patches, and a collection of bug fixes from
2
mostly these are minor cleanups and bugfixes.
3
various people.
4
3
5
thanks
4
thanks
6
-- PMM
5
-- PMM
7
6
7
The following changes since commit deaca3fd30d3a8829160f8d3705d65ad83176800:
8
8
9
9
Merge tag 'pull-vfio-20231018' of https://github.com/legoater/qemu into staging (2023-10-18 06:21:15 -0400)
10
The following changes since commit a3ac12fba028df90f7b3dbec924995c126c41022:
11
12
Merge remote-tracking branch 'remotes/ehabkost/tags/numa-next-pull-request' into staging (2018-05-31 11:12:36 +0100)
13
10
14
are available in the Git repository at:
11
are available in the Git repository at:
15
12
16
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180531
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20231019
17
14
18
for you to fetch changes up to 49d1dca0520ea71bc21867fab6647f474fcf857b:
15
for you to fetch changes up to 2a052b4ee01b3c413cef2ef49cb780cde17d4ba1:
19
16
20
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice (2018-05-31 14:52:53 +0100)
17
contrib/elf2dmp: Use g_malloc(), g_new() and g_free() (2023-10-19 14:32:13 +0100)
21
18
22
----------------------------------------------------------------
19
----------------------------------------------------------------
23
target-arm queue:
20
target-arm queue:
24
* target/arm: Honour FPCR.FZ in FRECPX
21
* hw/arm: Move raspberrypi-fw-defs.h to the include/hw/arm/ folder
25
* MAINTAINERS: Add entries for newer MPS2 boards and devices
22
* hw/arm/exynos4210: Get arm_boot_info declaration from 'hw/arm/boot'
26
* hw/intc/arm_gicv3: Fix APxR<n> register dispatching
23
* xlnx devices: remove deprecated device reset
27
* arm_gicv3_kvm: fix bug in writing zero bits back to the in-kernel
24
* xlnx-bbram: hw/nvram: Use dot in device type name
28
GIC state
25
* elf2dmp: fix coverity issues
29
* tcg: Fix helper function vs host abi for float16
26
* elf2dmp: convert to g_malloc, g_new and g_free
30
* arm: fix qemu crash on startup with -bios option
27
* target/arm: Fix CNTPCT_EL0 trapping from EL0 when HCR_EL2.E2H is 0
31
* arm: fix malloc type mismatch
28
* hw/arm: refactor virt PPI logic
32
* xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
29
* arm/kvm: convert to kvm_set_one_reg, kvm_get_one_reg
33
* Correct CPACR reset value for v7 cores
30
* target/arm: Permit T32 LDM with single register
34
* memory.h: Improve IOMMU related documentation
31
* smmuv3: Advertise SMMUv3.1-XNX
35
* exec: Plumb transaction attributes through various functions in
32
* target/arm: Implement FEAT_HPMN0
36
preparation for allowing IOMMUs to see them
33
* Remove some unnecessary include lines
37
* vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
34
* target/arm/arm-powerctl: Correctly init CPUs when powered on to lower EL
38
* ARM: ACPI: Fix use-after-free due to memory realloc
35
* hw/timer/npcm7xx_timer: Prevent timer from counting down past zero
39
* KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
40
36
41
----------------------------------------------------------------
37
----------------------------------------------------------------
42
Francisco Iglesias (1):
38
Chris Rauer (1):
43
xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
39
hw/timer/npcm7xx_timer: Prevent timer from counting down past zero
44
40
45
Igor Mammedov (1):
41
Cornelia Huck (2):
46
arm: fix qemu crash on startup with -bios option
42
arm/kvm: convert to kvm_set_one_reg
43
arm/kvm: convert to kvm_get_one_reg
47
44
48
Jan Kiszka (1):
45
Leif Lindholm (3):
49
hw/intc/arm_gicv3: Fix APxR<n> register dispatching
46
{include/}hw/arm: refactor virt PPI logic
47
include/hw/arm: move BSA definitions to bsa.h
48
hw/arm/sbsa-ref: use bsa.h for PPI definitions
50
49
51
Paolo Bonzini (1):
50
Michal Orzel (1):
52
arm: fix malloc type mismatch
51
target/arm: Fix CNTPCT_EL0 trapping from EL0 when HCR_EL2.E2H is 0
53
52
54
Peter Maydell (17):
53
Peter Maydell (8):
55
target/arm: Honour FPCR.FZ in FRECPX
54
target/arm: Permit T32 LDM with single register
56
MAINTAINERS: Add entries for newer MPS2 boards and devices
55
hw/arm/smmuv3: Update ID register bit field definitions
57
Correct CPACR reset value for v7 cores
56
hw/arm/smmuv3: Sort ID register setting into field order
58
memory.h: Improve IOMMU related documentation
57
hw/arm/smmuv3: Advertise SMMUv3.1-XNX feature
59
Make tb_invalidate_phys_addr() take a MemTxAttrs argument
58
target/arm: Implement FEAT_HPMN0
60
Make address_space_translate{, _cached}() take a MemTxAttrs argument
59
target/arm/kvm64.c: Remove unused include
61
Make address_space_map() take a MemTxAttrs argument
60
target/arm/common-semi-target.h: Remove unnecessary boot.h include
62
Make address_space_access_valid() take a MemTxAttrs argument
61
target/arm/arm-powerctl: Correctly init CPUs when powered on to lower EL
63
Make flatview_extend_translation() take a MemTxAttrs argument
64
Make memory_region_access_valid() take a MemTxAttrs argument
65
Make MemoryRegion valid.accepts callback take a MemTxAttrs argument
66
Make flatview_access_valid() take a MemTxAttrs argument
67
Make flatview_translate() take a MemTxAttrs argument
68
Make address_space_get_iotlb_entry() take a MemTxAttrs argument
69
Make flatview_do_translate() take a MemTxAttrs argument
70
Make address_space_translate_iommu take a MemTxAttrs argument
71
vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
72
62
73
Richard Henderson (1):
63
Philippe Mathieu-Daudé (1):
74
tcg: Fix helper function vs host abi for float16
64
hw/arm/exynos4210: Get arm_boot_info declaration from 'hw/arm/boot.h'
75
65
76
Shannon Zhao (3):
66
Suraj Shirvankar (1):
77
arm_gicv3_kvm: increase clroffset accordingly
67
contrib/elf2dmp: Use g_malloc(), g_new() and g_free()
78
ARM: ACPI: Fix use-after-free due to memory realloc
79
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
80
68
81
include/exec/exec-all.h | 5 +-
69
Thomas Huth (1):
82
include/exec/helper-head.h | 2 +-
70
hw/arm: Move raspberrypi-fw-defs.h to the include/hw/arm/ folder
83
include/exec/memory-internal.h | 3 +-
84
include/exec/memory.h | 128 +++++++++++++++++++++++++++++++++++------
85
include/migration/vmstate.h | 3 +
86
include/sysemu/dma.h | 6 +-
87
accel/tcg/translate-all.c | 4 +-
88
exec.c | 95 ++++++++++++++++++------------
89
hw/arm/boot.c | 18 +++---
90
hw/arm/virt-acpi-build.c | 20 +++++--
91
hw/dma/xlnx-zdma.c | 10 +++-
92
hw/hppa/dino.c | 3 +-
93
hw/intc/arm_gic_kvm.c | 1 -
94
hw/intc/arm_gicv3_cpuif.c | 12 ++--
95
hw/intc/arm_gicv3_kvm.c | 2 +-
96
hw/nvram/fw_cfg.c | 12 ++--
97
hw/s390x/s390-pci-inst.c | 3 +-
98
hw/scsi/esp.c | 3 +-
99
hw/vfio/common.c | 3 +-
100
hw/virtio/vhost.c | 3 +-
101
hw/xen/xen_pt_msi.c | 3 +-
102
memory.c | 12 ++--
103
memory_ldst.inc.c | 18 +++---
104
target/arm/gdbstub.c | 3 +-
105
target/arm/helper-a64.c | 41 +++++++------
106
target/arm/helper.c | 90 ++++++++++++++++-------------
107
target/ppc/mmu-hash64.c | 3 +-
108
target/riscv/helper.c | 2 +-
109
target/s390x/diag.c | 6 +-
110
target/s390x/excp_helper.c | 3 +-
111
target/s390x/mmu_helper.c | 3 +-
112
target/s390x/sigp.c | 3 +-
113
target/xtensa/op_helper.c | 3 +-
114
MAINTAINERS | 9 ++-
115
34 files changed, 353 insertions(+), 182 deletions(-)
116
71
72
Tong Ho (4):
73
xlnx-bbram: hw/nvram: Remove deprecated device reset
74
xlnx-zynqmp-efuse: hw/nvram: Remove deprecated device reset
75
xlnx-versal-efuse: hw/nvram: Remove deprecated device reset
76
xlnx-bbram: hw/nvram: Use dot in device type name
77
78
Viktor Prutyanov (2):
79
elf2dmp: limit print length for sign_rsds
80
elf2dmp: check array bounds in pdb_get_file_size
81
82
MAINTAINERS | 2 +-
83
docs/system/arm/emulation.rst | 1 +
84
hw/arm/smmuv3-internal.h | 38 ++++++++
85
include/hw/arm/bsa.h | 35 +++++++
86
include/hw/arm/exynos4210.h | 2 +-
87
include/hw/{misc => arm}/raspberrypi-fw-defs.h | 0
88
include/hw/arm/virt.h | 12 +--
89
include/hw/nvram/xlnx-bbram.h | 2 +-
90
target/arm/common-semi-target.h | 4 +-
91
target/arm/cpu-qom.h | 2 -
92
target/arm/cpu.h | 22 +++++
93
contrib/elf2dmp/addrspace.c | 7 +-
94
contrib/elf2dmp/main.c | 11 +--
95
contrib/elf2dmp/pdb.c | 32 ++++---
96
contrib/elf2dmp/qemu_elf.c | 7 +-
97
hw/arm/boot.c | 95 +++++--------------
98
hw/arm/sbsa-ref.c | 21 ++---
99
hw/arm/smmuv3.c | 8 +-
100
hw/arm/virt-acpi-build.c | 12 +--
101
hw/arm/virt.c | 24 +++--
102
hw/misc/bcm2835_property.c | 2 +-
103
hw/nvram/xlnx-bbram.c | 8 +-
104
hw/nvram/xlnx-versal-efuse-ctrl.c | 8 +-
105
hw/nvram/xlnx-zynqmp-efuse.c | 8 +-
106
hw/timer/npcm7xx_timer.c | 3 +
107
target/arm/arm-powerctl.c | 53 +----------
108
target/arm/cpu.c | 95 +++++++++++++++++++
109
target/arm/helper.c | 19 +---
110
target/arm/kvm.c | 28 ++----
111
target/arm/kvm64.c | 124 +++++++------------------
112
target/arm/tcg/cpu32.c | 4 +
113
target/arm/tcg/cpu64.c | 1 +
114
target/arm/tcg/translate.c | 37 +++++---
115
33 files changed, 368 insertions(+), 359 deletions(-)
116
create mode 100644 include/hw/arm/bsa.h
117
rename include/hw/{misc => arm}/raspberrypi-fw-defs.h (100%)
118
diff view generated by jsdifflib
1
Add entries to MAINTAINERS to cover the newer MPS2 boards and
1
From: Thomas Huth <thuth@redhat.com>
2
the new devices they use.
3
2
3
The file is obviously related to the raspberrypi machine, so
4
it should reside in hw/arm/ instead of hw/misc/. And while we're
5
at it, also adjust the wildcard in MAINTAINERS so that it covers
6
this file, too.
7
8
Signed-off-by: Thomas Huth <thuth@redhat.com>
9
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Acked-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Message-id: 20231012073458.860187-1-thuth@redhat.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180518153157.14899-1-peter.maydell@linaro.org
6
---
13
---
7
MAINTAINERS | 9 +++++++--
14
MAINTAINERS | 2 +-
8
1 file changed, 7 insertions(+), 2 deletions(-)
15
include/hw/{misc => arm}/raspberrypi-fw-defs.h | 0
16
hw/misc/bcm2835_property.c | 2 +-
17
3 files changed, 2 insertions(+), 2 deletions(-)
18
rename include/hw/{misc => arm}/raspberrypi-fw-defs.h (100%)
9
19
10
diff --git a/MAINTAINERS b/MAINTAINERS
20
diff --git a/MAINTAINERS b/MAINTAINERS
11
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
12
--- a/MAINTAINERS
22
--- a/MAINTAINERS
13
+++ b/MAINTAINERS
23
+++ b/MAINTAINERS
14
@@ -XXX,XX +XXX,XX @@ F: hw/timer/cmsdk-apb-timer.c
24
@@ -XXX,XX +XXX,XX @@ S: Odd Fixes
15
F: include/hw/timer/cmsdk-apb-timer.h
25
F: hw/arm/raspi.c
16
F: hw/char/cmsdk-apb-uart.c
26
F: hw/arm/raspi_platform.h
17
F: include/hw/char/cmsdk-apb-uart.h
27
F: hw/*/bcm283*
18
+F: hw/misc/tz-ppc.c
28
-F: include/hw/arm/raspi*
19
+F: include/hw/misc/tz-ppc.h
29
+F: include/hw/arm/rasp*
20
30
F: include/hw/*/bcm283*
21
ARM cores
31
F: docs/system/arm/raspi.rst
22
M: Peter Maydell <peter.maydell@linaro.org>
32
23
@@ -XXX,XX +XXX,XX @@ M: Peter Maydell <peter.maydell@linaro.org>
33
diff --git a/include/hw/misc/raspberrypi-fw-defs.h b/include/hw/arm/raspberrypi-fw-defs.h
24
L: qemu-arm@nongnu.org
34
similarity index 100%
25
S: Maintained
35
rename from include/hw/misc/raspberrypi-fw-defs.h
26
F: hw/arm/mps2.c
36
rename to include/hw/arm/raspberrypi-fw-defs.h
27
-F: hw/misc/mps2-scc.c
37
diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c
28
-F: include/hw/misc/mps2-scc.h
38
index XXXXXXX..XXXXXXX 100644
29
+F: hw/arm/mps2-tz.c
39
--- a/hw/misc/bcm2835_property.c
30
+F: hw/misc/mps2-*.c
40
+++ b/hw/misc/bcm2835_property.c
31
+F: include/hw/misc/mps2-*.h
41
@@ -XXX,XX +XXX,XX @@
32
+F: hw/arm/iotkit.c
42
#include "migration/vmstate.h"
33
+F: include/hw/arm/iotkit.h
43
#include "hw/irq.h"
34
44
#include "hw/misc/bcm2835_mbox_defs.h"
35
Musicpal
45
-#include "hw/misc/raspberrypi-fw-defs.h"
36
M: Jan Kiszka <jan.kiszka@web.de>
46
+#include "hw/arm/raspberrypi-fw-defs.h"
47
#include "sysemu/dma.h"
48
#include "qemu/log.h"
49
#include "qemu/module.h"
37
--
50
--
38
2.17.1
51
2.34.1
39
52
40
53
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
add MemTxAttrs as an argument to flatview_do_translate().
3
2
3
struct arm_boot_info is declared in "hw/arm/boot.h".
4
By including the correct header we don't need to declare
5
it again in "target/arm/cpu-qom.h".
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20231013130214.95742-1-philmd@linaro.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-13-peter.maydell@linaro.org
8
---
11
---
9
exec.c | 9 ++++++---
12
include/hw/arm/exynos4210.h | 2 +-
10
1 file changed, 6 insertions(+), 3 deletions(-)
13
target/arm/cpu-qom.h | 2 --
14
2 files changed, 1 insertion(+), 3 deletions(-)
11
15
12
diff --git a/exec.c b/exec.c
16
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
13
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
18
--- a/include/hw/arm/exynos4210.h
15
+++ b/exec.c
19
+++ b/include/hw/arm/exynos4210.h
16
@@ -XXX,XX +XXX,XX @@ unassigned:
20
@@ -XXX,XX +XXX,XX @@
17
* @is_write: whether the translation operation is for write
21
#include "hw/intc/exynos4210_gic.h"
18
* @is_mmio: whether this can be MMIO, set true if it can
22
#include "hw/intc/exynos4210_combiner.h"
19
* @target_as: the address space targeted by the IOMMU
23
#include "hw/core/split-irq.h"
20
+ * @attrs: memory transaction attributes
24
-#include "target/arm/cpu-qom.h"
21
*
25
+#include "hw/arm/boot.h"
22
* This function is called from RCU critical section
26
#include "qom/object.h"
23
*/
27
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
28
#define EXYNOS4210_NCPUS 2
25
hwaddr *page_mask_out,
29
diff --git a/target/arm/cpu-qom.h b/target/arm/cpu-qom.h
26
bool is_write,
30
index XXXXXXX..XXXXXXX 100644
27
bool is_mmio,
31
--- a/target/arm/cpu-qom.h
28
- AddressSpace **target_as)
32
+++ b/target/arm/cpu-qom.h
29
+ AddressSpace **target_as,
33
@@ -XXX,XX +XXX,XX @@
30
+ MemTxAttrs attrs)
34
#include "hw/core/cpu.h"
31
{
35
#include "qom/object.h"
32
MemoryRegionSection *section;
36
33
IOMMUMemoryRegion *iommu_mr;
37
-struct arm_boot_info;
34
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
38
-
35
* but page mask.
39
#define TYPE_ARM_CPU "arm-cpu"
36
*/
40
37
section = flatview_do_translate(address_space_to_flatview(as), addr, &xlat,
41
OBJECT_DECLARE_CPU_TYPE(ARMCPU, ARMCPUClass, ARM_CPU)
38
- NULL, &page_mask, is_write, false, &as);
39
+ NULL, &page_mask, is_write, false, &as,
40
+ attrs);
41
42
/* Illegal translation */
43
if (section.mr == &io_mem_unassigned) {
44
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
45
46
/* This can be MMIO, so setup MMIO bit. */
47
section = flatview_do_translate(fv, addr, xlat, plen, NULL,
48
- is_write, true, &as);
49
+ is_write, true, &as, attrs);
50
mr = section.mr;
51
52
if (xen_enabled() && memory_access_is_direct(mr, is_write)) {
53
--
42
--
54
2.17.1
43
2.34.1
55
44
56
45
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Tong Ho <tong.ho@amd.com>
2
2
3
kvm_irqchip_create called by kvm_init will call kvm_init_irq_routing to
3
This change implements the ResettableClass interface for the device.
4
initialize global capability variables. If we call kvm_init_irq_routing in
5
GIC realize function, previous allocated memory will leak.
6
4
7
Fix this by deleting the unnecessary call.
5
Signed-off-by: Tong Ho <tong.ho@amd.com>
8
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
7
Message-id: 20231003052345.199725-1-tong.ho@amd.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>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
9
---
14
hw/intc/arm_gic_kvm.c | 1 -
10
hw/nvram/xlnx-bbram.c | 8 +++++---
15
hw/intc/arm_gicv3_kvm.c | 1 -
11
1 file changed, 5 insertions(+), 3 deletions(-)
16
2 files changed, 2 deletions(-)
17
12
18
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
13
diff --git a/hw/nvram/xlnx-bbram.c b/hw/nvram/xlnx-bbram.c
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/intc/arm_gic_kvm.c
15
--- a/hw/nvram/xlnx-bbram.c
21
+++ b/hw/intc/arm_gic_kvm.c
16
+++ b/hw/nvram/xlnx-bbram.c
22
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
17
@@ -XXX,XX +XXX,XX @@
23
18
* QEMU model of the Xilinx BBRAM Battery Backed RAM
24
if (kvm_has_gsi_routing()) {
19
*
25
/* set up irq routing */
20
* Copyright (c) 2014-2021 Xilinx Inc.
26
- kvm_init_irq_routing(kvm_state);
21
+ * Copyright (c) 2023 Advanced Micro Devices, Inc.
27
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
22
*
28
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
23
* Permission is hereby granted, free of charge, to any person obtaining a copy
29
}
24
* of this software and associated documentation files (the "Software"), to deal
30
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
25
@@ -XXX,XX +XXX,XX @@ static RegisterAccessInfo bbram_ctrl_regs_info[] = {
31
index XXXXXXX..XXXXXXX 100644
26
}
32
--- a/hw/intc/arm_gicv3_kvm.c
27
};
33
+++ b/hw/intc/arm_gicv3_kvm.c
28
34
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
29
-static void bbram_ctrl_reset(DeviceState *dev)
35
30
+static void bbram_ctrl_reset_hold(Object *obj)
36
if (kvm_has_gsi_routing()) {
31
{
37
/* set up irq routing */
32
- XlnxBBRam *s = XLNX_BBRAM(dev);
38
- kvm_init_irq_routing(kvm_state);
33
+ XlnxBBRam *s = XLNX_BBRAM(obj);
39
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
34
unsigned int i;
40
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
35
41
}
36
for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
37
@@ -XXX,XX +XXX,XX @@ static Property bbram_ctrl_props[] = {
38
static void bbram_ctrl_class_init(ObjectClass *klass, void *data)
39
{
40
DeviceClass *dc = DEVICE_CLASS(klass);
41
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
42
43
- dc->reset = bbram_ctrl_reset;
44
+ rc->phases.hold = bbram_ctrl_reset_hold;
45
dc->realize = bbram_ctrl_realize;
46
dc->vmsd = &vmstate_bbram_ctrl;
47
device_class_set_props(dc, bbram_ctrl_props);
42
--
48
--
43
2.17.1
49
2.34.1
44
50
45
51
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Tong Ho <tong.ho@amd.com>
2
add MemTxAttrs as an argument to address_space_get_iotlb_entry().
3
2
3
This change implements the ResettableClass interface for the device.
4
5
Signed-off-by: Tong Ho <tong.ho@amd.com>
6
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
7
Message-id: 20231004055713.324009-1-tong.ho@amd.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-12-peter.maydell@linaro.org
8
---
9
---
9
include/exec/memory.h | 2 +-
10
hw/nvram/xlnx-zynqmp-efuse.c | 8 +++++---
10
exec.c | 2 +-
11
1 file changed, 5 insertions(+), 3 deletions(-)
11
hw/virtio/vhost.c | 3 ++-
12
3 files changed, 4 insertions(+), 3 deletions(-)
13
12
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
13
diff --git a/hw/nvram/xlnx-zynqmp-efuse.c b/hw/nvram/xlnx-zynqmp-efuse.c
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
15
--- a/hw/nvram/xlnx-zynqmp-efuse.c
17
+++ b/include/exec/memory.h
16
+++ b/hw/nvram/xlnx-zynqmp-efuse.c
18
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache);
17
@@ -XXX,XX +XXX,XX @@
19
* entry. Should be called from an RCU critical section.
18
* QEMU model of the ZynqMP eFuse
20
*/
19
*
21
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
20
* Copyright (c) 2015 Xilinx Inc.
22
- bool is_write);
21
+ * Copyright (c) 2023 Advanced Micro Devices, Inc.
23
+ bool is_write, MemTxAttrs attrs);
22
*
24
23
* Written by Edgar E. Iglesias <edgari@xilinx.com>
25
/* address_space_translate: translate an address range into an address space
24
*
26
* into a MemoryRegion and an address range into that section. Should be
25
@@ -XXX,XX +XXX,XX @@ static void zynqmp_efuse_register_reset(RegisterInfo *reg)
27
diff --git a/exec.c b/exec.c
26
register_reset(reg);
28
index XXXXXXX..XXXXXXX 100644
27
}
29
--- a/exec.c
28
30
+++ b/exec.c
29
-static void zynqmp_efuse_reset(DeviceState *dev)
31
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
30
+static void zynqmp_efuse_reset_hold(Object *obj)
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
{
31
{
38
MemoryRegionSection section;
32
- XlnxZynqMPEFuse *s = XLNX_ZYNQMP_EFUSE(dev);
39
hwaddr xlat, page_mask;
33
+ XlnxZynqMPEFuse *s = XLNX_ZYNQMP_EFUSE(obj);
40
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
34
unsigned int i;
41
index XXXXXXX..XXXXXXX 100644
35
42
--- a/hw/virtio/vhost.c
36
for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
43
+++ b/hw/virtio/vhost.c
37
@@ -XXX,XX +XXX,XX @@ static Property zynqmp_efuse_props[] = {
44
@@ -XXX,XX +XXX,XX @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
38
static void zynqmp_efuse_class_init(ObjectClass *klass, void *data)
45
trace_vhost_iotlb_miss(dev, 1);
39
{
46
40
DeviceClass *dc = DEVICE_CLASS(klass);
47
iotlb = address_space_get_iotlb_entry(dev->vdev->dma_as,
41
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
48
- iova, write);
42
49
+ iova, write,
43
- dc->reset = zynqmp_efuse_reset;
50
+ MEMTXATTRS_UNSPECIFIED);
44
+ rc->phases.hold = zynqmp_efuse_reset_hold;
51
if (iotlb.target_as != NULL) {
45
dc->realize = zynqmp_efuse_realize;
52
ret = vhost_memory_region_lookup(dev, iotlb.translated_addr,
46
dc->vmsd = &vmstate_efuse;
53
&uaddr, &len);
47
device_class_set_props(dc, zynqmp_efuse_props);
54
--
48
--
55
2.17.1
49
2.34.1
56
57
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Tong Ho <tong.ho@amd.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
This change implements the ResettableClass interface for the device.
4
5
Signed-off-by: Tong Ho <tong.ho@amd.com>
6
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
7
Message-id: 20231004055339.323833-1-tong.ho@amd.com
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>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-10-peter.maydell@linaro.org
10
---
9
---
11
exec.c | 12 +++++-------
10
hw/nvram/xlnx-versal-efuse-ctrl.c | 8 +++++---
12
1 file changed, 5 insertions(+), 7 deletions(-)
11
1 file changed, 5 insertions(+), 3 deletions(-)
13
12
14
diff --git a/exec.c b/exec.c
13
diff --git a/hw/nvram/xlnx-versal-efuse-ctrl.c b/hw/nvram/xlnx-versal-efuse-ctrl.c
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
15
--- a/hw/nvram/xlnx-versal-efuse-ctrl.c
17
+++ b/exec.c
16
+++ b/hw/nvram/xlnx-versal-efuse-ctrl.c
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
17
@@ -XXX,XX +XXX,XX @@
19
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
18
* QEMU model of the Versal eFuse controller
20
const uint8_t *buf, int len);
19
*
21
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
20
* Copyright (c) 2020 Xilinx Inc.
22
- bool is_write);
21
+ * Copyright (c) 2023 Advanced Micro Devices, Inc.
23
+ bool is_write, MemTxAttrs attrs);
22
*
24
23
* Permission is hereby granted, free of charge, to any person obtaining a copy
25
static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,
24
* of this software and associated documentation files (the "Software"), to deal
26
unsigned len, MemTxAttrs attrs)
25
@@ -XXX,XX +XXX,XX @@ static void efuse_ctrl_register_reset(RegisterInfo *reg)
27
@@ -XXX,XX +XXX,XX @@ static bool subpage_accepts(void *opaque, hwaddr addr,
26
register_reset(reg);
28
#endif
29
30
return flatview_access_valid(subpage->fv, addr + subpage->base,
31
- len, is_write);
32
+ len, is_write, attrs);
33
}
27
}
34
28
35
static const MemoryRegionOps subpage_ops = {
29
-static void efuse_ctrl_reset(DeviceState *dev)
36
@@ -XXX,XX +XXX,XX @@ static void cpu_notify_map_clients(void)
30
+static void efuse_ctrl_reset_hold(Object *obj)
37
}
38
39
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
40
- bool is_write)
41
+ bool is_write, MemTxAttrs attrs)
42
{
31
{
43
MemoryRegion *mr;
32
- XlnxVersalEFuseCtrl *s = XLNX_VERSAL_EFUSE_CTRL(dev);
44
hwaddr l, xlat;
33
+ XlnxVersalEFuseCtrl *s = XLNX_VERSAL_EFUSE_CTRL(obj);
45
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
34
unsigned int i;
46
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
35
47
if (!memory_access_is_direct(mr, is_write)) {
36
for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
48
l = memory_access_size(mr, l, addr);
37
@@ -XXX,XX +XXX,XX @@ static Property efuse_ctrl_props[] = {
49
- /* When our callers all have attrs we'll pass them through here */
38
static void efuse_ctrl_class_init(ObjectClass *klass, void *data)
50
- if (!memory_region_access_valid(mr, xlat, l, is_write,
39
{
51
- MEMTXATTRS_UNSPECIFIED)) {
40
DeviceClass *dc = DEVICE_CLASS(klass);
52
+ if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
41
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
53
return false;
42
54
}
43
- dc->reset = efuse_ctrl_reset;
55
}
44
+ rc->phases.hold = efuse_ctrl_reset_hold;
56
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
45
dc->realize = efuse_ctrl_realize;
57
46
dc->vmsd = &vmstate_efuse_ctrl;
58
rcu_read_lock();
47
device_class_set_props(dc, efuse_ctrl_props);
59
fv = address_space_to_flatview(as);
60
- result = flatview_access_valid(fv, addr, len, is_write);
61
+ result = flatview_access_valid(fv, addr, len, is_write, attrs);
62
rcu_read_unlock();
63
return result;
64
}
65
--
48
--
66
2.17.1
49
2.34.1
67
68
diff view generated by jsdifflib
1
From: Paolo Bonzini <pbonzini@redhat.com>
1
From: Tong Ho <tong.ho@amd.com>
2
2
3
cpregs_keys is an uint32_t* so the allocation should use uint32_t.
3
This replaces the comma (,) to dot (.) in the device type name
4
g_new is even better because it is type-safe.
4
so the name can be used with the 'driver=' command line option.
5
5
6
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
6
Signed-off-by: Tong Ho <tong.ho@amd.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20231003052139.199665-1-tong.ho@amd.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/gdbstub.c | 3 +--
11
include/hw/nvram/xlnx-bbram.h | 2 +-
12
1 file changed, 1 insertion(+), 2 deletions(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
13
14
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
14
diff --git a/include/hw/nvram/xlnx-bbram.h b/include/hw/nvram/xlnx-bbram.h
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/gdbstub.c
16
--- a/include/hw/nvram/xlnx-bbram.h
17
+++ b/target/arm/gdbstub.c
17
+++ b/include/hw/nvram/xlnx-bbram.h
18
@@ -XXX,XX +XXX,XX @@ int arm_gen_dynamic_xml(CPUState *cs)
18
@@ -XXX,XX +XXX,XX @@
19
RegisterSysregXmlParam param = {cs, s};
19
20
20
#define RMAX_XLNX_BBRAM ((0x4c / 4) + 1)
21
cpu->dyn_xml.num_cpregs = 0;
21
22
- cpu->dyn_xml.cpregs_keys = g_malloc(sizeof(uint32_t *) *
22
-#define TYPE_XLNX_BBRAM "xlnx,bbram-ctrl"
23
- g_hash_table_size(cpu->cp_regs));
23
+#define TYPE_XLNX_BBRAM "xlnx.bbram-ctrl"
24
+ cpu->dyn_xml.cpregs_keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
24
OBJECT_DECLARE_SIMPLE_TYPE(XlnxBBRam, XLNX_BBRAM);
25
g_string_printf(s, "<?xml version=\"1.0\"?>");
25
26
g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
26
struct XlnxBBRam {
27
g_string_append_printf(s, "<feature name=\"org.qemu.gdb.arm.sys.regs\">");
28
--
27
--
29
2.17.1
28
2.34.1
30
31
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Viktor Prutyanov <viktor@daynix.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
String sign_rsds isn't terminated, so the print length must be limited.
4
5
Fixes: Coverity CID 1521598
6
Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
7
Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>
8
Message-id: 20230930235317.11469-2-viktor@daynix.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
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
---
10
---
11
include/exec/memory.h | 3 ++-
11
contrib/elf2dmp/main.c | 2 +-
12
include/sysemu/dma.h | 3 ++-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
exec.c | 6 ++++--
14
target/ppc/mmu-hash64.c | 3 ++-
15
4 files changed, 10 insertions(+), 5 deletions(-)
16
13
17
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/memory.h
16
--- a/contrib/elf2dmp/main.c
20
+++ b/include/exec/memory.h
17
+++ b/contrib/elf2dmp/main.c
21
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_
18
@@ -XXX,XX +XXX,XX @@ static bool pe_check_pdb_name(uint64_t base, void *start_addr,
22
* @addr: address within that address space
23
* @plen: pointer to length of buffer; updated on return
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
{
59
hwaddr len = *plen;
60
hwaddr l, xlat;
61
@@ -XXX,XX +XXX,XX @@ void *cpu_physical_memory_map(hwaddr addr,
62
hwaddr *plen,
63
int is_write)
64
{
65
- return address_space_map(&address_space_memory, addr, plen, is_write);
66
+ return address_space_map(&address_space_memory, addr, plen, is_write,
67
+ MEMTXATTRS_UNSPECIFIED);
68
}
69
70
void cpu_physical_memory_unmap(void *buffer, hwaddr len,
71
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/ppc/mmu-hash64.c
74
+++ b/target/ppc/mmu-hash64.c
75
@@ -XXX,XX +XXX,XX @@ const ppc_hash_pte64_t *ppc_hash64_map_hptes(PowerPCCPU *cpu,
76
return NULL;
77
}
19
}
78
20
79
- hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false);
21
if (memcmp(&rsds->Signature, sign_rsds, sizeof(sign_rsds))) {
80
+ hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false,
22
- eprintf("CodeView signature is \'%.4s\', \'%s\' expected\n",
81
+ MEMTXATTRS_UNSPECIFIED);
23
+ eprintf("CodeView signature is \'%.4s\', \'%.4s\' expected\n",
82
if (plen < (n * HASH_PTE_SIZE_64)) {
24
rsds->Signature, sign_rsds);
83
hw_error("%s: Unable to map all requested HPTEs\n", __func__);
25
return false;
84
}
26
}
85
--
27
--
86
2.17.1
28
2.34.1
87
88
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Viktor Prutyanov <viktor@daynix.com>
2
add MemTxAttrs as an argument to flatview_translate(); all its
3
callers now have attrs available.
4
2
3
Index in file_size array must be checked against num_files, because the
4
entries we are looking for may be absent in the PDB.
5
6
Fixes: Coverity CID 1521597
7
Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
8
Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Message-id: 20230930235317.11469-3-viktor@daynix.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>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20180521140402.23318-11-peter.maydell@linaro.org
9
---
12
---
10
include/exec/memory.h | 7 ++++---
13
contrib/elf2dmp/pdb.c | 13 +++++++++----
11
exec.c | 17 +++++++++--------
14
1 file changed, 9 insertions(+), 4 deletions(-)
12
2 files changed, 13 insertions(+), 11 deletions(-)
13
15
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
16
diff --git a/contrib/elf2dmp/pdb.c b/contrib/elf2dmp/pdb.c
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
18
--- a/contrib/elf2dmp/pdb.c
17
+++ b/include/exec/memory.h
19
+++ b/contrib/elf2dmp/pdb.c
18
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
20
@@ -XXX,XX +XXX,XX @@
19
*/
21
20
MemoryRegion *flatview_translate(FlatView *fv,
22
static uint32_t pdb_get_file_size(const struct pdb_reader *r, unsigned idx)
21
hwaddr addr, hwaddr *xlat,
22
- hwaddr *len, bool is_write);
23
+ hwaddr *len, bool is_write,
24
+ MemTxAttrs attrs);
25
26
static inline MemoryRegion *address_space_translate(AddressSpace *as,
27
hwaddr addr, hwaddr *xlat,
28
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
29
MemTxAttrs attrs)
30
{
23
{
31
return flatview_translate(address_space_to_flatview(as),
24
+ if (idx >= r->ds.toc->num_files) {
32
- addr, xlat, len, is_write);
25
+ return 0;
33
+ addr, xlat, len, is_write, attrs);
26
+ }
27
+
28
return r->ds.toc->file_size[idx];
34
}
29
}
35
30
36
/* address_space_access_valid: check for validity of accessing an address
31
@@ -XXX,XX +XXX,XX @@ static void *pdb_ds_read_file(struct pdb_reader* r, uint32_t file_number)
37
@@ -XXX,XX +XXX,XX @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
32
38
rcu_read_lock();
33
static int pdb_init_segments(struct pdb_reader *r)
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
{
34
{
58
MemoryRegion *mr;
35
- char *segs;
59
MemoryRegionSection section;
36
unsigned stream_idx = r->segments;
60
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
37
61
}
38
- segs = pdb_ds_read_file(r, stream_idx);
62
39
- if (!segs) {
63
l = len;
40
+ r->segs = pdb_ds_read_file(r, stream_idx);
64
- mr = flatview_translate(fv, addr, &addr1, &l, true);
41
+ if (!r->segs) {
65
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
42
return 1;
66
}
43
}
67
44
68
return result;
45
- r->segs = segs;
69
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
46
r->segs_size = pdb_get_file_size(r, stream_idx);
70
MemTxResult result = MEMTX_OK;
47
+ if (!r->segs_size) {
71
48
+ return 1;
72
l = len;
49
+ }
73
- mr = flatview_translate(fv, addr, &addr1, &l, true);
50
74
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
51
return 0;
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
}
52
}
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
--
53
--
124
2.17.1
54
2.34.1
125
55
126
56
diff view generated by jsdifflib
1
In commit f0aff255700 we made cpacr_write() enforce that some CPACR
1
From: Michal Orzel <michal.orzel@amd.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
On an attempt to access CNTPCT_EL0 from EL0 using a guest running on top
11
that just calls cpacr_write(), to avoid having to duplicate
4
of Xen, a trap from EL2 was observed which is something not reproducible
12
the logic for which bits are RAO.
5
on HW (also, Xen does not trap accesses to physical counter).
13
6
14
This bug would affect migration for TCG CPUs which are ARMv7
7
This is because gt_counter_access() checks for an incorrect bit (1
15
with VFP but without one of Neon or VFPv3.
8
instead of 0) of CNTHCTL_EL2 if HCR_EL2.E2H is 0 and access is made to
9
physical counter. Refer ARM ARM DDI 0487J.a, D19.12.2:
10
When HCR_EL2.E2H is 0:
11
- EL1PCTEN, bit [0]: refers to physical counter
12
- EL1PCEN, bit [1]: refers to physical timer registers
16
13
17
Reported-by: Cédric Le Goater <clg@kaod.org>
14
Drop entire block "if (hcr & HCR_E2H) {...} else {...}" from EL0 case
15
and fall through to EL1 case, given that after fixing checking for the
16
correct bit, the handling is the same.
17
18
Fixes: 5bc8437136fb ("target/arm: Update timer access for VHE")
19
Signed-off-by: Michal Orzel <michal.orzel@amd.com>
20
Tested-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
21
Message-id: 20230928094404.20802-1-michal.orzel@amd.com
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
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
---
24
---
22
target/arm/helper.c | 10 +++++++++-
25
target/arm/helper.c | 17 +----------------
23
1 file changed, 9 insertions(+), 1 deletion(-)
26
1 file changed, 1 insertion(+), 16 deletions(-)
24
27
25
diff --git a/target/arm/helper.c b/target/arm/helper.c
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/helper.c
30
--- a/target/arm/helper.c
28
+++ b/target/arm/helper.c
31
+++ b/target/arm/helper.c
29
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
32
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gt_counter_access(CPUARMState *env, int timeridx,
30
env->cp15.cpacr_el1 = value;
33
if (!extract32(env->cp15.c14_cntkctl, timeridx, 1)) {
31
}
34
return CP_ACCESS_TRAP;
32
35
}
33
+static void cpacr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
36
-
34
+{
37
- /* If HCR_EL2.<E2H,TGE> == '10': check CNTHCTL_EL2.EL1PCTEN. */
35
+ /* Call cpacr_write() so that we reset with the correct RAO bits set
38
- if (hcr & HCR_E2H) {
36
+ * for our CPU features.
39
- if (timeridx == GTIMER_PHYS &&
37
+ */
40
- !extract32(env->cp15.cnthctl_el2, 10, 1)) {
38
+ cpacr_write(env, ri, 0);
41
- return CP_ACCESS_TRAP_EL2;
39
+}
42
- }
40
+
43
- } else {
41
static CPAccessResult cpacr_access(CPUARMState *env, const ARMCPRegInfo *ri,
44
- /* If HCR_EL2.<E2H> == 0: check CNTHCTL_EL2.EL1PCEN. */
42
bool isread)
45
- if (has_el2 && timeridx == GTIMER_PHYS &&
43
{
46
- !extract32(env->cp15.cnthctl_el2, 1, 1)) {
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
47
- return CP_ACCESS_TRAP_EL2;
45
{ .name = "CPACR", .state = ARM_CP_STATE_BOTH, .opc0 = 3,
48
- }
46
.crn = 1, .crm = 0, .opc1 = 0, .opc2 = 2, .accessfn = cpacr_access,
49
- }
47
.access = PL1_RW, .fieldoffset = offsetof(CPUARMState, cp15.cpacr_el1),
50
- break;
48
- .resetvalue = 0, .writefn = cpacr_write },
51
-
49
+ .resetfn = cpacr_reset, .writefn = cpacr_write },
52
+ /* fall through */
50
REGINFO_SENTINEL
53
case 1:
51
};
54
/* Check CNTHCTL_EL2.EL1PCTEN, which changes location based on E2H. */
52
55
if (has_el2 && timeridx == GTIMER_PHYS &&
53
--
56
--
54
2.17.1
57
2.34.1
55
56
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Leif Lindholm <quic_llindhol@quicinc.com>
2
2
3
acpi_data_push uses g_array_set_size to resize the memory size. If there
3
GIC Private Peripheral Interrupts (PPI) are defined as GIC INTID 16-31.
4
is no enough contiguous memory, the address will be changed. So previous
4
As in, PPI0 is INTID16 .. PPI15 is INTID31.
5
pointer could not be used any more. It must update the pointer and use
5
Arm's Base System Architecture specification (BSA) lists the mandated and
6
the new one.
6
recommended private interrupt IDs by INTID, not by PPI index. But current
7
definitions in virt define them by PPI index, complicating cross
8
referencing.
7
9
8
Also, previous codes wrongly use le32 conversion of iort->node_offset
10
Meanwhile, the PPI(x) macro counterintuitively adds 16 to the input value,
9
for subsequent computations that will result incorrect value if host is
11
converting a PPI index to an INTID.
10
not litlle endian. So use the non-converted one instead.
11
12
12
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
13
Resolve this by redefining the BSA-allocated PPIs by their INTIDs,
13
Reviewed-by: Eric Auger <eric.auger@redhat.com>
14
and replacing the PPI(x) macro with an INTID_TO_PPI(x) one where required.
14
Message-id: 1527663951-14552-1-git-send-email-zhaoshenglong@huawei.com
15
16
Signed-off-by: Leif Lindholm <quic_llindhol@quicinc.com>
17
Message-id: 20230919090229.188092-2-quic_llindhol@quicinc.com
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
20
---
17
hw/arm/virt-acpi-build.c | 20 +++++++++++++++-----
21
include/hw/arm/virt.h | 14 +++++++-------
18
1 file changed, 15 insertions(+), 5 deletions(-)
22
hw/arm/virt-acpi-build.c | 12 ++++++------
23
hw/arm/virt.c | 24 ++++++++++++++----------
24
3 files changed, 27 insertions(+), 23 deletions(-)
19
25
26
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
27
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/virt.h
29
+++ b/include/hw/arm/virt.h
30
@@ -XXX,XX +XXX,XX @@
31
#define NUM_VIRTIO_TRANSPORTS 32
32
#define NUM_SMMU_IRQS 4
33
34
-#define ARCH_GIC_MAINT_IRQ 9
35
+#define ARCH_GIC_MAINT_IRQ 25
36
37
-#define ARCH_TIMER_VIRT_IRQ 11
38
-#define ARCH_TIMER_S_EL1_IRQ 13
39
-#define ARCH_TIMER_NS_EL1_IRQ 14
40
-#define ARCH_TIMER_NS_EL2_IRQ 10
41
+#define ARCH_TIMER_VIRT_IRQ 27
42
+#define ARCH_TIMER_S_EL1_IRQ 29
43
+#define ARCH_TIMER_NS_EL1_IRQ 30
44
+#define ARCH_TIMER_NS_EL2_IRQ 26
45
46
-#define VIRTUAL_PMU_IRQ 7
47
+#define VIRTUAL_PMU_IRQ 23
48
49
-#define PPI(irq) ((irq) + 16)
50
+#define INTID_TO_PPI(irq) ((irq) - 16)
51
52
/* See Linux kernel arch/arm64/include/asm/pvclock-abi.h */
53
#define PVTIME_SIZE_PER_CPU 64
20
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
54
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
21
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/virt-acpi-build.c
56
--- a/hw/arm/virt-acpi-build.c
23
+++ b/hw/arm/virt-acpi-build.c
57
+++ b/hw/arm/virt-acpi-build.c
24
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
58
@@ -XXX,XX +XXX,XX @@ build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
25
AcpiIortItsGroup *its;
59
* The interrupt values are the same with the device tree when adding 16
26
AcpiIortTable *iort;
60
*/
27
AcpiIortSmmu3 *smmu;
61
/* Secure EL1 timer GSIV */
28
- size_t node_size, iort_length, smmu_offset = 0;
62
- build_append_int_noprefix(table_data, ARCH_TIMER_S_EL1_IRQ + 16, 4);
29
+ size_t node_size, iort_node_offset, iort_length, smmu_offset = 0;
63
+ build_append_int_noprefix(table_data, ARCH_TIMER_S_EL1_IRQ, 4);
30
AcpiIortRC *rc;
64
/* Secure EL1 timer Flags */
31
65
build_append_int_noprefix(table_data, irqflags, 4);
32
iort = acpi_data_push(table_data, sizeof(*iort));
66
/* Non-Secure EL1 timer GSIV */
33
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
67
- build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL1_IRQ + 16, 4);
34
68
+ build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL1_IRQ, 4);
35
iort_length = sizeof(*iort);
69
/* Non-Secure EL1 timer Flags */
36
iort->node_count = cpu_to_le32(nb_nodes);
70
build_append_int_noprefix(table_data, irqflags |
37
- iort->node_offset = cpu_to_le32(sizeof(*iort));
71
1UL << 2, /* Always-on Capability */
38
+ /*
72
4);
39
+ * Use a copy in case table_data->data moves during acpi_data_push
73
/* Virtual timer GSIV */
40
+ * operations.
74
- build_append_int_noprefix(table_data, ARCH_TIMER_VIRT_IRQ + 16, 4);
41
+ */
75
+ build_append_int_noprefix(table_data, ARCH_TIMER_VIRT_IRQ, 4);
42
+ iort_node_offset = sizeof(*iort);
76
/* Virtual Timer Flags */
43
+ iort->node_offset = cpu_to_le32(iort_node_offset);
77
build_append_int_noprefix(table_data, irqflags, 4);
44
78
/* Non-Secure EL2 timer GSIV */
45
/* ITS group node */
79
- build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL2_IRQ + 16, 4);
46
node_size = sizeof(*its) + sizeof(uint32_t);
80
+ build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL2_IRQ, 4);
47
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
81
/* Non-Secure EL2 timer Flags */
48
int irq = vms->irqmap[VIRT_SMMU];
82
build_append_int_noprefix(table_data, irqflags, 4);
49
83
/* CntReadBase Physical address */
50
/* SMMUv3 node */
84
@@ -XXX,XX +XXX,XX @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
51
- smmu_offset = iort->node_offset + node_size;
85
for (i = 0; i < MACHINE(vms)->smp.cpus; i++) {
52
+ smmu_offset = iort_node_offset + node_size;
86
ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(i));
53
node_size = sizeof(*smmu) + sizeof(*idmap);
87
uint64_t physical_base_address = 0, gich = 0, gicv = 0;
54
iort_length += node_size;
88
- uint32_t vgic_interrupt = vms->virt ? PPI(ARCH_GIC_MAINT_IRQ) : 0;
55
smmu = acpi_data_push(table_data, node_size);
89
+ uint32_t vgic_interrupt = vms->virt ? ARCH_GIC_MAINT_IRQ : 0;
56
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
90
uint32_t pmu_interrupt = arm_feature(&armcpu->env, ARM_FEATURE_PMU) ?
57
idmap->id_count = cpu_to_le32(0xFFFF);
91
- PPI(VIRTUAL_PMU_IRQ) : 0;
58
idmap->output_base = 0;
92
+ VIRTUAL_PMU_IRQ : 0;
59
/* output IORT node is the ITS group node (the first node) */
93
60
- idmap->output_reference = cpu_to_le32(iort->node_offset);
94
if (vms->gic_version == VIRT_GIC_VERSION_2) {
61
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
95
physical_base_address = memmap[VIRT_GIC_CPU].base;
96
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
97
index XXXXXXX..XXXXXXX 100644
98
--- a/hw/arm/virt.c
99
+++ b/hw/arm/virt.c
100
@@ -XXX,XX +XXX,XX @@ static void fdt_add_timer_nodes(const VirtMachineState *vms)
62
}
101
}
63
102
qemu_fdt_setprop(ms->fdt, "/timer", "always-on", NULL, 0);
64
/* Root Complex Node */
103
qemu_fdt_setprop_cells(ms->fdt, "/timer", "interrupts",
65
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
104
- GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_S_EL1_IRQ, irqflags,
66
idmap->output_reference = cpu_to_le32(smmu_offset);
105
- GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL1_IRQ, irqflags,
67
} else {
106
- GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_VIRT_IRQ, irqflags,
68
/* output IORT node is the ITS group node (the first node) */
107
- GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL2_IRQ, irqflags);
69
- idmap->output_reference = cpu_to_le32(iort->node_offset);
108
+ GIC_FDT_IRQ_TYPE_PPI,
70
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
109
+ INTID_TO_PPI(ARCH_TIMER_S_EL1_IRQ), irqflags,
71
}
110
+ GIC_FDT_IRQ_TYPE_PPI,
72
111
+ INTID_TO_PPI(ARCH_TIMER_NS_EL1_IRQ), irqflags,
73
+ /*
112
+ GIC_FDT_IRQ_TYPE_PPI,
74
+ * Update the pointer address in case table_data->data moves during above
113
+ INTID_TO_PPI(ARCH_TIMER_VIRT_IRQ), irqflags,
75
+ * acpi_data_push operations.
114
+ GIC_FDT_IRQ_TYPE_PPI,
76
+ */
115
+ INTID_TO_PPI(ARCH_TIMER_NS_EL2_IRQ), irqflags);
77
+ iort = (AcpiIortTable *)(table_data->data + iort_start);
116
}
78
iort->length = cpu_to_le32(iort_length);
117
79
118
static void fdt_add_cpu_nodes(const VirtMachineState *vms)
80
build_header(linker, table_data, (void *)(table_data->data + iort_start),
119
@@ -XXX,XX +XXX,XX @@ static void create_gic(VirtMachineState *vms, MemoryRegion *mem)
120
*/
121
for (i = 0; i < smp_cpus; i++) {
122
DeviceState *cpudev = DEVICE(qemu_get_cpu(i));
123
- int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
124
+ int intidbase = NUM_IRQS + i * GIC_INTERNAL;
125
/* Mapping from the output timer irq lines from the CPU to the
126
* GIC PPI inputs we use for the virt board.
127
*/
128
@@ -XXX,XX +XXX,XX @@ static void create_gic(VirtMachineState *vms, MemoryRegion *mem)
129
for (unsigned irq = 0; irq < ARRAY_SIZE(timer_irq); irq++) {
130
qdev_connect_gpio_out(cpudev, irq,
131
qdev_get_gpio_in(vms->gic,
132
- ppibase + timer_irq[irq]));
133
+ intidbase + timer_irq[irq]));
134
}
135
136
if (vms->gic_version != VIRT_GIC_VERSION_2) {
137
qemu_irq irq = qdev_get_gpio_in(vms->gic,
138
- ppibase + ARCH_GIC_MAINT_IRQ);
139
+ intidbase + ARCH_GIC_MAINT_IRQ);
140
qdev_connect_gpio_out_named(cpudev, "gicv3-maintenance-interrupt",
141
0, irq);
142
} else if (vms->virt) {
143
qemu_irq irq = qdev_get_gpio_in(vms->gic,
144
- ppibase + ARCH_GIC_MAINT_IRQ);
145
+ intidbase + ARCH_GIC_MAINT_IRQ);
146
sysbus_connect_irq(gicbusdev, i + 4 * smp_cpus, irq);
147
}
148
149
qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0,
150
- qdev_get_gpio_in(vms->gic, ppibase
151
+ qdev_get_gpio_in(vms->gic, intidbase
152
+ VIRTUAL_PMU_IRQ));
153
154
sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
155
@@ -XXX,XX +XXX,XX @@ static void virt_cpu_post_init(VirtMachineState *vms, MemoryRegion *sysmem)
156
if (pmu) {
157
assert(arm_feature(&ARM_CPU(cpu)->env, ARM_FEATURE_PMU));
158
if (kvm_irqchip_in_kernel()) {
159
- kvm_arm_pmu_set_irq(cpu, PPI(VIRTUAL_PMU_IRQ));
160
+ kvm_arm_pmu_set_irq(cpu, VIRTUAL_PMU_IRQ);
161
}
162
kvm_arm_pmu_init(cpu);
163
}
81
--
164
--
82
2.17.1
165
2.34.1
83
84
diff view generated by jsdifflib
1
From: Jan Kiszka <jan.kiszka@siemens.com>
1
From: Leif Lindholm <quic_llindhol@quicinc.com>
2
2
3
There was a nasty flip in identifying which register group an access is
3
virt.h defines a number of IRQs that are ultimately described by Arm's
4
targeting. The issue caused spuriously raised priorities of the guest
4
Base System Architecture specification. Move these to a dedicated header
5
when handing CPUs over in the Jailhouse hypervisor.
5
so that they can be reused by other platforms that do the same.
6
Include that header from virt.h to minimise churn.
6
7
7
Cc: qemu-stable@nongnu.org
8
While we're moving the definitions, sort them into numerical order,
8
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
9
and add the ARCH_TIMER_NS_EL2_VIRT_IRQ definition used by sbsa-ref
9
Message-id: 28b927d3-da58-bce4-cc13-bfec7f9b1cb9@siemens.com
10
and which will eventually be needed by virt also.
11
12
Signed-off-by: Leif Lindholm <quic_llindhol@quicinc.com>
13
Message-id: 20230919090229.188092-3-quic_llindhol@quicinc.com
14
[PMM: Remove unused PPI_TO_INTID macro; sort numerically;
15
add ARCH_TIMER_NS_EL2_VIRT_IRQ]
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
18
---
13
hw/intc/arm_gicv3_cpuif.c | 12 ++++++------
19
include/hw/arm/bsa.h | 35 +++++++++++++++++++++++++++++++++++
14
1 file changed, 6 insertions(+), 6 deletions(-)
20
include/hw/arm/virt.h | 12 +-----------
21
2 files changed, 36 insertions(+), 11 deletions(-)
22
create mode 100644 include/hw/arm/bsa.h
15
23
16
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
24
diff --git a/include/hw/arm/bsa.h b/include/hw/arm/bsa.h
25
new file mode 100644
26
index XXXXXXX..XXXXXXX
27
--- /dev/null
28
+++ b/include/hw/arm/bsa.h
29
@@ -XXX,XX +XXX,XX @@
30
+/*
31
+ * Common definitions for Arm Base System Architecture (BSA) platforms.
32
+ *
33
+ * Copyright (c) 2015 Linaro Limited
34
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
35
+ *
36
+ * This program is free software; you can redistribute it and/or modify it
37
+ * under the terms and conditions of the GNU General Public License,
38
+ * version 2 or later, as published by the Free Software Foundation.
39
+ *
40
+ * This program is distributed in the hope it will be useful, but WITHOUT
41
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
42
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
43
+ * more details.
44
+ *
45
+ * You should have received a copy of the GNU General Public License along with
46
+ * this program. If not, see <http://www.gnu.org/licenses/>.
47
+ *
48
+ */
49
+
50
+#ifndef QEMU_ARM_BSA_H
51
+#define QEMU_ARM_BSA_H
52
+
53
+/* These are architectural INTID values */
54
+#define VIRTUAL_PMU_IRQ 23
55
+#define ARCH_GIC_MAINT_IRQ 25
56
+#define ARCH_TIMER_NS_EL2_IRQ 26
57
+#define ARCH_TIMER_VIRT_IRQ 27
58
+#define ARCH_TIMER_NS_EL2_VIRT_IRQ 28
59
+#define ARCH_TIMER_S_EL1_IRQ 29
60
+#define ARCH_TIMER_NS_EL1_IRQ 30
61
+
62
+#define INTID_TO_PPI(irq) ((irq) - 16)
63
+
64
+#endif /* QEMU_ARM_BSA_H */
65
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
17
index XXXXXXX..XXXXXXX 100644
66
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/arm_gicv3_cpuif.c
67
--- a/include/hw/arm/virt.h
19
+++ b/hw/intc/arm_gicv3_cpuif.c
68
+++ b/include/hw/arm/virt.h
20
@@ -XXX,XX +XXX,XX @@ static uint64_t icv_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
69
@@ -XXX,XX +XXX,XX @@
21
{
70
#include "qemu/notify.h"
22
GICv3CPUState *cs = icc_cs_from_env(env);
71
#include "hw/boards.h"
23
int regno = ri->opc2 & 3;
72
#include "hw/arm/boot.h"
24
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
73
+#include "hw/arm/bsa.h"
25
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
74
#include "hw/block/flash.h"
26
uint64_t value = cs->ich_apr[grp][regno];
75
#include "sysemu/kvm.h"
27
76
#include "hw/intc/arm_gicv3_common.h"
28
trace_gicv3_icv_ap_read(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
77
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@ static void icv_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
78
#define NUM_VIRTIO_TRANSPORTS 32
30
{
79
#define NUM_SMMU_IRQS 4
31
GICv3CPUState *cs = icc_cs_from_env(env);
80
32
int regno = ri->opc2 & 3;
81
-#define ARCH_GIC_MAINT_IRQ 25
33
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
82
-
34
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
83
-#define ARCH_TIMER_VIRT_IRQ 27
35
84
-#define ARCH_TIMER_S_EL1_IRQ 29
36
trace_gicv3_icv_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
85
-#define ARCH_TIMER_NS_EL1_IRQ 30
37
86
-#define ARCH_TIMER_NS_EL2_IRQ 26
38
@@ -XXX,XX +XXX,XX @@ static uint64_t icc_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
87
-
39
uint64_t value;
88
-#define VIRTUAL_PMU_IRQ 23
40
89
-
41
int regno = ri->opc2 & 3;
90
-#define INTID_TO_PPI(irq) ((irq) - 16)
42
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
91
-
43
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
92
/* See Linux kernel arch/arm64/include/asm/pvclock-abi.h */
44
93
#define PVTIME_SIZE_PER_CPU 64
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
94
74
--
95
--
75
2.17.1
96
2.34.1
76
77
diff view generated by jsdifflib
1
From: Francisco Iglesias <frasse.iglesias@gmail.com>
1
From: Leif Lindholm <quic_llindhol@quicinc.com>
2
2
3
Coverity found that the string return by 'object_get_canonical_path' was not
3
Use the private peripheral interrupt definitions from bsa.h instead of
4
being freed at two locations in the model (CID 1391294 and CID 1391293) and
4
defining them locally. Refactor to use the INTIDs defined there instead
5
also that a memset was being called with a value greater than the max of a byte
5
of the PPI# used previously.
6
on the second argument (CID 1391286). This patch corrects this by adding the
7
freeing of the strings and also changing to memset to zero instead on
8
descriptor unaligned errors.
9
6
10
Signed-off-by: Francisco Iglesias <frasse.iglesias@gmail.com>
7
Signed-off-by: Leif Lindholm <quic_llindhol@quicinc.com>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Message-id: 20230919090229.188092-4-quic_llindhol@quicinc.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>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
11
---
17
hw/dma/xlnx-zdma.c | 10 +++++++---
12
hw/arm/sbsa-ref.c | 21 +++++++++------------
18
1 file changed, 7 insertions(+), 3 deletions(-)
13
1 file changed, 9 insertions(+), 12 deletions(-)
19
14
20
diff --git a/hw/dma/xlnx-zdma.c b/hw/dma/xlnx-zdma.c
15
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/dma/xlnx-zdma.c
17
--- a/hw/arm/sbsa-ref.c
23
+++ b/hw/dma/xlnx-zdma.c
18
+++ b/hw/arm/sbsa-ref.c
24
@@ -XXX,XX +XXX,XX @@ static bool zdma_load_descriptor(XlnxZDMA *s, uint64_t addr, void *buf)
19
@@ -XXX,XX +XXX,XX @@
25
qemu_log_mask(LOG_GUEST_ERROR,
20
* ARM SBSA Reference Platform emulation
26
"zdma: unaligned descriptor at %" PRIx64,
21
*
27
addr);
22
* Copyright (c) 2018 Linaro Limited
28
- memset(buf, 0xdeadbeef, sizeof(XlnxZDMADescr));
23
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
29
+ memset(buf, 0x0, sizeof(XlnxZDMADescr));
24
* Written by Hongbo Zhang <hongbo.zhang@linaro.org>
30
s->error = true;
25
*
31
return false;
26
* This program is free software; you can redistribute it and/or modify it
32
}
27
@@ -XXX,XX +XXX,XX @@
33
@@ -XXX,XX +XXX,XX @@ static uint64_t zdma_read(void *opaque, hwaddr addr, unsigned size)
28
#include "exec/hwaddr.h"
34
RegisterInfo *r = &s->regs_info[addr / 4];
29
#include "kvm_arm.h"
35
30
#include "hw/arm/boot.h"
36
if (!r->data) {
31
+#include "hw/arm/bsa.h"
37
+ gchar *path = object_get_canonical_path(OBJECT(s));
32
#include "hw/arm/fdt.h"
38
qemu_log("%s: Decode error: read from %" HWADDR_PRIx "\n",
33
#include "hw/arm/smmuv3.h"
39
- object_get_canonical_path(OBJECT(s)),
34
#include "hw/block/flash.h"
40
+ path,
35
@@ -XXX,XX +XXX,XX @@
41
addr);
36
#define NUM_SMMU_IRQS 4
42
+ g_free(path);
37
#define NUM_SATA_PORTS 6
43
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
38
44
zdma_ch_imr_update_irq(s);
39
-#define VIRTUAL_PMU_IRQ 7
45
return 0;
40
-#define ARCH_GIC_MAINT_IRQ 9
46
@@ -XXX,XX +XXX,XX @@ static void zdma_write(void *opaque, hwaddr addr, uint64_t value,
41
-#define ARCH_TIMER_VIRT_IRQ 11
47
RegisterInfo *r = &s->regs_info[addr / 4];
42
-#define ARCH_TIMER_S_EL1_IRQ 13
48
43
-#define ARCH_TIMER_NS_EL1_IRQ 14
49
if (!r->data) {
44
-#define ARCH_TIMER_NS_EL2_IRQ 10
50
+ gchar *path = object_get_canonical_path(OBJECT(s));
45
-#define ARCH_TIMER_NS_EL2_VIRT_IRQ 12
51
qemu_log("%s: Decode error: write to %" HWADDR_PRIx "=%" PRIx64 "\n",
46
-
52
- object_get_canonical_path(OBJECT(s)),
47
enum {
53
+ path,
48
SBSA_FLASH,
54
addr, value);
49
SBSA_MEM,
55
+ g_free(path);
50
@@ -XXX,XX +XXX,XX @@ static void create_gic(SBSAMachineState *sms, MemoryRegion *mem)
56
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
51
*/
57
zdma_ch_imr_update_irq(s);
52
for (i = 0; i < smp_cpus; i++) {
58
return;
53
DeviceState *cpudev = DEVICE(qemu_get_cpu(i));
54
- int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
55
+ int intidbase = NUM_IRQS + i * GIC_INTERNAL;
56
int irq;
57
/*
58
* Mapping from the output timer irq lines from the CPU to the
59
@@ -XXX,XX +XXX,XX @@ static void create_gic(SBSAMachineState *sms, MemoryRegion *mem)
60
for (irq = 0; irq < ARRAY_SIZE(timer_irq); irq++) {
61
qdev_connect_gpio_out(cpudev, irq,
62
qdev_get_gpio_in(sms->gic,
63
- ppibase + timer_irq[irq]));
64
+ intidbase + timer_irq[irq]));
65
}
66
67
qdev_connect_gpio_out_named(cpudev, "gicv3-maintenance-interrupt", 0,
68
- qdev_get_gpio_in(sms->gic, ppibase
69
+ qdev_get_gpio_in(sms->gic,
70
+ intidbase
71
+ ARCH_GIC_MAINT_IRQ));
72
+
73
qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0,
74
- qdev_get_gpio_in(sms->gic, ppibase
75
+ qdev_get_gpio_in(sms->gic,
76
+ intidbase
77
+ VIRTUAL_PMU_IRQ));
78
79
sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
59
--
80
--
60
2.17.1
81
2.34.1
61
62
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Cornelia Huck <cohuck@redhat.com>
2
add MemTxAttrs as an argument to address_space_access_valid().
2
3
Its callers either have an attrs value to hand, or don't care
3
We can neaten the code by switching to the kvm_set_one_reg function.
4
and can use MEMTXATTRS_UNSPECIFIED.
4
5
5
Reviewed-by: Gavin Shan <gshan@redhat.com>
6
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Message-id: 20231010142453.224369-2-cohuck@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>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-6-peter.maydell@linaro.org
10
---
11
---
11
include/exec/memory.h | 4 +++-
12
target/arm/kvm.c | 13 +++------
12
include/sysemu/dma.h | 3 ++-
13
target/arm/kvm64.c | 66 +++++++++++++---------------------------------
13
exec.c | 3 ++-
14
2 files changed, 21 insertions(+), 58 deletions(-)
14
target/s390x/diag.c | 6 ++++--
15
15
target/s390x/excp_helper.c | 3 ++-
16
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
16
target/s390x/mmu_helper.c | 3 ++-
17
target/s390x/sigp.c | 3 ++-
18
7 files changed, 17 insertions(+), 8 deletions(-)
19
20
diff --git a/include/exec/memory.h b/include/exec/memory.h
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/include/exec/memory.h
18
--- a/target/arm/kvm.c
23
+++ b/include/exec/memory.h
19
+++ b/target/arm/kvm.c
24
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
20
@@ -XXX,XX +XXX,XX @@ bool write_list_to_kvmstate(ARMCPU *cpu, int level)
25
* @addr: address within that address space
21
bool ok = true;
26
* @len: length of the area to be checked
22
27
* @is_write: indicates the transfer direction
23
for (i = 0; i < cpu->cpreg_array_len; i++) {
28
+ * @attrs: memory attributes
24
- struct kvm_one_reg r;
29
*/
25
uint64_t regidx = cpu->cpreg_indexes[i];
30
-bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write);
26
uint32_t v32;
31
+bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len,
27
int ret;
32
+ bool is_write, MemTxAttrs attrs);
28
@@ -XXX,XX +XXX,XX @@ bool write_list_to_kvmstate(ARMCPU *cpu, int level)
33
29
continue;
34
/* address_space_map: map a physical memory region into a host virtual address
30
}
35
*
31
36
diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
32
- r.id = regidx;
33
switch (regidx & KVM_REG_SIZE_MASK) {
34
case KVM_REG_SIZE_U32:
35
v32 = cpu->cpreg_values[i];
36
- r.addr = (uintptr_t)&v32;
37
+ ret = kvm_set_one_reg(cs, regidx, &v32);
38
break;
39
case KVM_REG_SIZE_U64:
40
- r.addr = (uintptr_t)(cpu->cpreg_values + i);
41
+ ret = kvm_set_one_reg(cs, regidx, cpu->cpreg_values + i);
42
break;
43
default:
44
g_assert_not_reached();
45
}
46
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &r);
47
if (ret) {
48
/* We might fail for "unknown register" and also for
49
* "you tried to set a register which is constant with
50
@@ -XXX,XX +XXX,XX @@ void kvm_arm_get_virtual_time(CPUState *cs)
51
void kvm_arm_put_virtual_time(CPUState *cs)
52
{
53
ARMCPU *cpu = ARM_CPU(cs);
54
- struct kvm_one_reg reg = {
55
- .id = KVM_REG_ARM_TIMER_CNT,
56
- .addr = (uintptr_t)&cpu->kvm_vtime,
57
- };
58
int ret;
59
60
if (!cpu->kvm_vtime_dirty) {
61
return;
62
}
63
64
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
65
+ ret = kvm_set_one_reg(cs, KVM_REG_ARM_TIMER_CNT, &cpu->kvm_vtime);
66
if (ret) {
67
error_report("Failed to set KVM_REG_ARM_TIMER_CNT");
68
abort();
69
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
37
index XXXXXXX..XXXXXXX 100644
70
index XXXXXXX..XXXXXXX 100644
38
--- a/include/sysemu/dma.h
71
--- a/target/arm/kvm64.c
39
+++ b/include/sysemu/dma.h
72
+++ b/target/arm/kvm64.c
40
@@ -XXX,XX +XXX,XX @@ static inline bool dma_memory_valid(AddressSpace *as,
73
@@ -XXX,XX +XXX,XX @@ static int kvm_arm_sve_set_vls(CPUState *cs)
41
DMADirection dir)
74
{
42
{
75
ARMCPU *cpu = ARM_CPU(cs);
43
return address_space_access_valid(as, addr, len,
76
uint64_t vls[KVM_ARM64_SVE_VLS_WORDS] = { cpu->sve_vq.map };
44
- dir == DMA_DIRECTION_FROM_DEVICE);
77
- struct kvm_one_reg reg = {
45
+ dir == DMA_DIRECTION_FROM_DEVICE,
78
- .id = KVM_REG_ARM64_SVE_VLS,
46
+ MEMTXATTRS_UNSPECIFIED);
79
- .addr = (uint64_t)&vls[0],
80
- };
81
82
assert(cpu->sve_max_vq <= KVM_ARM64_SVE_VQ_MAX);
83
84
- return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
85
+ return kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_VLS, &vls[0]);
47
}
86
}
48
87
49
static inline int dma_memory_rw_relaxed(AddressSpace *as, dma_addr_t addr,
88
#define ARM_CPU_ID_MPIDR 3, 0, 0, 0, 5
50
diff --git a/exec.c b/exec.c
89
@@ -XXX,XX +XXX,XX @@ static void kvm_inject_arm_sea(CPUState *c)
51
index XXXXXXX..XXXXXXX 100644
90
static int kvm_arch_put_fpsimd(CPUState *cs)
52
--- a/exec.c
91
{
53
+++ b/exec.c
92
CPUARMState *env = &ARM_CPU(cs)->env;
54
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
93
- struct kvm_one_reg reg;
55
}
94
int i, ret;
56
95
57
bool address_space_access_valid(AddressSpace *as, hwaddr addr,
96
for (i = 0; i < 32; i++) {
58
- int len, bool is_write)
97
uint64_t *q = aa64_vfp_qreg(env, i);
59
+ int len, bool is_write,
98
#if HOST_BIG_ENDIAN
60
+ MemTxAttrs attrs)
99
uint64_t fp_val[2] = { q[1], q[0] };
61
{
100
- reg.addr = (uintptr_t)fp_val;
62
FlatView *fv;
101
+ ret = kvm_set_one_reg(cs, AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]),
63
bool result;
102
+ fp_val);
64
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
103
#else
65
index XXXXXXX..XXXXXXX 100644
104
- reg.addr = (uintptr_t)q;
66
--- a/target/s390x/diag.c
105
+ ret = kvm_set_one_reg(cs, AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]), q);
67
+++ b/target/s390x/diag.c
106
#endif
68
@@ -XXX,XX +XXX,XX @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
107
- reg.id = AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]);
69
return;
108
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
70
}
109
if (ret) {
71
if (!address_space_access_valid(&address_space_memory, addr,
110
return ret;
72
- sizeof(IplParameterBlock), false)) {
111
}
73
+ sizeof(IplParameterBlock), false,
112
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_put_sve(CPUState *cs)
74
+ MEMTXATTRS_UNSPECIFIED)) {
113
CPUARMState *env = &cpu->env;
75
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
114
uint64_t tmp[ARM_MAX_VQ * 2];
76
return;
115
uint64_t *r;
77
}
116
- struct kvm_one_reg reg;
78
@@ -XXX,XX +XXX,XX @@ out:
117
int n, ret;
79
return;
118
80
}
119
for (n = 0; n < KVM_ARM64_SVE_NUM_ZREGS; ++n) {
81
if (!address_space_access_valid(&address_space_memory, addr,
120
r = sve_bswap64(tmp, &env->vfp.zregs[n].d[0], cpu->sve_max_vq * 2);
82
- sizeof(IplParameterBlock), true)) {
121
- reg.addr = (uintptr_t)r;
83
+ sizeof(IplParameterBlock), true,
122
- reg.id = KVM_REG_ARM64_SVE_ZREG(n, 0);
84
+ MEMTXATTRS_UNSPECIFIED)) {
123
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
85
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
124
+ ret = kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_ZREG(n, 0), r);
86
return;
125
if (ret) {
87
}
126
return ret;
88
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
127
}
89
index XXXXXXX..XXXXXXX 100644
128
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_put_sve(CPUState *cs)
90
--- a/target/s390x/excp_helper.c
129
for (n = 0; n < KVM_ARM64_SVE_NUM_PREGS; ++n) {
91
+++ b/target/s390x/excp_helper.c
130
r = sve_bswap64(tmp, r = &env->vfp.pregs[n].p[0],
92
@@ -XXX,XX +XXX,XX @@ int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr orig_vaddr, int size,
131
DIV_ROUND_UP(cpu->sve_max_vq * 2, 8));
93
132
- reg.addr = (uintptr_t)r;
94
/* check out of RAM access */
133
- reg.id = KVM_REG_ARM64_SVE_PREG(n, 0);
95
if (!address_space_access_valid(&address_space_memory, raddr,
134
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
96
- TARGET_PAGE_SIZE, rw)) {
135
+ ret = kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_PREG(n, 0), r);
97
+ TARGET_PAGE_SIZE, rw,
136
if (ret) {
98
+ MEMTXATTRS_UNSPECIFIED)) {
137
return ret;
99
DPRINTF("%s: raddr %" PRIx64 " > ram_size %" PRIx64 "\n", __func__,
138
}
100
(uint64_t)raddr, (uint64_t)ram_size);
139
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_put_sve(CPUState *cs)
101
trigger_pgm_exception(env, PGM_ADDRESSING, ILEN_AUTO);
140
102
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
141
r = sve_bswap64(tmp, &env->vfp.pregs[FFR_PRED_NUM].p[0],
103
index XXXXXXX..XXXXXXX 100644
142
DIV_ROUND_UP(cpu->sve_max_vq * 2, 8));
104
--- a/target/s390x/mmu_helper.c
143
- reg.addr = (uintptr_t)r;
105
+++ b/target/s390x/mmu_helper.c
144
- reg.id = KVM_REG_ARM64_SVE_FFR(0);
106
@@ -XXX,XX +XXX,XX @@ static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages,
145
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
107
return ret;
146
+ ret = kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r);
108
}
147
if (ret) {
109
if (!address_space_access_valid(&address_space_memory, pages[i],
148
return ret;
110
- TARGET_PAGE_SIZE, is_write)) {
149
}
111
+ TARGET_PAGE_SIZE, is_write,
150
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_put_sve(CPUState *cs)
112
+ MEMTXATTRS_UNSPECIFIED)) {
151
113
trigger_access_exception(env, PGM_ADDRESSING, ILEN_AUTO, 0);
152
int kvm_arch_put_registers(CPUState *cs, int level)
114
return -EFAULT;
153
{
115
}
154
- struct kvm_one_reg reg;
116
diff --git a/target/s390x/sigp.c b/target/s390x/sigp.c
155
uint64_t val;
117
index XXXXXXX..XXXXXXX 100644
156
uint32_t fpr;
118
--- a/target/s390x/sigp.c
157
int i, ret;
119
+++ b/target/s390x/sigp.c
158
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
120
@@ -XXX,XX +XXX,XX @@ static void sigp_set_prefix(CPUState *cs, run_on_cpu_data arg)
159
}
121
cpu_synchronize_state(cs);
160
122
161
for (i = 0; i < 31; i++) {
123
if (!address_space_access_valid(&address_space_memory, addr,
162
- reg.id = AARCH64_CORE_REG(regs.regs[i]);
124
- sizeof(struct LowCore), false)) {
163
- reg.addr = (uintptr_t) &env->xregs[i];
125
+ sizeof(struct LowCore), false,
164
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
126
+ MEMTXATTRS_UNSPECIFIED)) {
165
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.regs[i]),
127
set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER);
166
+ &env->xregs[i]);
128
return;
167
if (ret) {
168
return ret;
169
}
170
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
171
*/
172
aarch64_save_sp(env, 1);
173
174
- reg.id = AARCH64_CORE_REG(regs.sp);
175
- reg.addr = (uintptr_t) &env->sp_el[0];
176
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
177
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.sp), &env->sp_el[0]);
178
if (ret) {
179
return ret;
180
}
181
182
- reg.id = AARCH64_CORE_REG(sp_el1);
183
- reg.addr = (uintptr_t) &env->sp_el[1];
184
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
185
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(sp_el1), &env->sp_el[1]);
186
if (ret) {
187
return ret;
188
}
189
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
190
} else {
191
val = cpsr_read(env);
192
}
193
- reg.id = AARCH64_CORE_REG(regs.pstate);
194
- reg.addr = (uintptr_t) &val;
195
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
196
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.pstate), &val);
197
if (ret) {
198
return ret;
199
}
200
201
- reg.id = AARCH64_CORE_REG(regs.pc);
202
- reg.addr = (uintptr_t) &env->pc;
203
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
204
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.pc), &env->pc);
205
if (ret) {
206
return ret;
207
}
208
209
- reg.id = AARCH64_CORE_REG(elr_el1);
210
- reg.addr = (uintptr_t) &env->elr_el[1];
211
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
212
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(elr_el1), &env->elr_el[1]);
213
if (ret) {
214
return ret;
215
}
216
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
217
218
/* KVM 0-4 map to QEMU banks 1-5 */
219
for (i = 0; i < KVM_NR_SPSR; i++) {
220
- reg.id = AARCH64_CORE_REG(spsr[i]);
221
- reg.addr = (uintptr_t) &env->banked_spsr[i + 1];
222
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
223
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(spsr[i]),
224
+ &env->banked_spsr[i + 1]);
225
if (ret) {
226
return ret;
227
}
228
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
229
return ret;
230
}
231
232
- reg.addr = (uintptr_t)(&fpr);
233
fpr = vfp_get_fpsr(env);
234
- reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr);
235
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
236
+ ret = kvm_set_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpsr), &fpr);
237
if (ret) {
238
return ret;
239
}
240
241
- reg.addr = (uintptr_t)(&fpr);
242
fpr = vfp_get_fpcr(env);
243
- reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr);
244
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
245
+ ret = kvm_set_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpcr), &fpr);
246
if (ret) {
247
return ret;
129
}
248
}
130
--
249
--
131
2.17.1
250
2.34.1
132
251
133
252
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Cornelia Huck <cohuck@redhat.com>
2
add MemTxAttrs as an argument to memory_region_access_valid().
2
3
Its callers either have an attrs value to hand, or don't care
3
We can neaten the code by switching the callers that work on a
4
and can use MEMTXATTRS_UNSPECIFIED.
4
CPUstate to the kvm_get_one_reg function.
5
5
6
The callsite in flatview_access_valid() is part of a recursive
6
Reviewed-by: Gavin Shan <gshan@redhat.com>
7
loop flatview_access_valid() -> memory_region_access_valid() ->
7
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
8
subpage_accepts() -> flatview_access_valid(); we make it pass
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
MEMTXATTRS_UNSPECIFIED for now, until the next several commits
9
Message-id: 20231010142453.224369-3-cohuck@redhat.com
10
have plumbed an attrs parameter through the rest of the loop
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
and we can add an attrs parameter to flatview_access_valid().
12
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
target/arm/kvm.c | 15 +++---------
19
exec.c | 4 +++-
14
target/arm/kvm64.c | 57 ++++++++++++----------------------------------
20
hw/s390x/s390-pci-inst.c | 3 ++-
15
2 files changed, 18 insertions(+), 54 deletions(-)
21
memory.c | 7 ++++---
16
22
4 files changed, 11 insertions(+), 6 deletions(-)
17
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
23
24
diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h
25
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory-internal.h
19
--- a/target/arm/kvm.c
27
+++ b/include/exec/memory-internal.h
20
+++ b/target/arm/kvm.c
28
@@ -XXX,XX +XXX,XX @@ void flatview_unref(FlatView *view);
21
@@ -XXX,XX +XXX,XX @@ bool write_kvmstate_to_list(ARMCPU *cpu)
29
extern const MemoryRegionOps unassigned_mem_ops;
22
bool ok = true;
30
23
31
bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,
24
for (i = 0; i < cpu->cpreg_array_len; i++) {
32
- unsigned size, bool is_write);
25
- struct kvm_one_reg r;
33
+ unsigned size, bool is_write,
26
uint64_t regidx = cpu->cpreg_indexes[i];
34
+ MemTxAttrs attrs);
27
uint32_t v32;
35
28
int ret;
36
void flatview_add_to_dispatch(FlatView *fv, MemoryRegionSection *section);
29
37
AddressSpaceDispatch *address_space_dispatch_new(FlatView *fv);
30
- r.id = regidx;
38
diff --git a/exec.c b/exec.c
31
-
32
switch (regidx & KVM_REG_SIZE_MASK) {
33
case KVM_REG_SIZE_U32:
34
- r.addr = (uintptr_t)&v32;
35
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &r);
36
+ ret = kvm_get_one_reg(cs, regidx, &v32);
37
if (!ret) {
38
cpu->cpreg_values[i] = v32;
39
}
40
break;
41
case KVM_REG_SIZE_U64:
42
- r.addr = (uintptr_t)(cpu->cpreg_values + i);
43
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &r);
44
+ ret = kvm_get_one_reg(cs, regidx, cpu->cpreg_values + i);
45
break;
46
default:
47
g_assert_not_reached();
48
@@ -XXX,XX +XXX,XX @@ int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu)
49
void kvm_arm_get_virtual_time(CPUState *cs)
50
{
51
ARMCPU *cpu = ARM_CPU(cs);
52
- struct kvm_one_reg reg = {
53
- .id = KVM_REG_ARM_TIMER_CNT,
54
- .addr = (uintptr_t)&cpu->kvm_vtime,
55
- };
56
int ret;
57
58
if (cpu->kvm_vtime_dirty) {
59
return;
60
}
61
62
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
63
+ ret = kvm_get_one_reg(cs, KVM_REG_ARM_TIMER_CNT, &cpu->kvm_vtime);
64
if (ret) {
65
error_report("Failed to get KVM_REG_ARM_TIMER_CNT");
66
abort();
67
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
39
index XXXXXXX..XXXXXXX 100644
68
index XXXXXXX..XXXXXXX 100644
40
--- a/exec.c
69
--- a/target/arm/kvm64.c
41
+++ b/exec.c
70
+++ b/target/arm/kvm64.c
42
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
71
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
43
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
72
static int kvm_arch_get_fpsimd(CPUState *cs)
44
if (!memory_access_is_direct(mr, is_write)) {
73
{
45
l = memory_access_size(mr, l, addr);
74
CPUARMState *env = &ARM_CPU(cs)->env;
46
- if (!memory_region_access_valid(mr, xlat, l, is_write)) {
75
- struct kvm_one_reg reg;
47
+ /* When our callers all have attrs we'll pass them through here */
76
int i, ret;
48
+ if (!memory_region_access_valid(mr, xlat, l, is_write,
77
49
+ MEMTXATTRS_UNSPECIFIED)) {
78
for (i = 0; i < 32; i++) {
50
return false;
79
uint64_t *q = aa64_vfp_qreg(env, i);
51
}
80
- reg.id = AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]);
52
}
81
- reg.addr = (uintptr_t)q;
53
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
82
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
54
index XXXXXXX..XXXXXXX 100644
83
+ ret = kvm_get_one_reg(cs, AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]), q);
55
--- a/hw/s390x/s390-pci-inst.c
84
if (ret) {
56
+++ b/hw/s390x/s390-pci-inst.c
85
return ret;
57
@@ -XXX,XX +XXX,XX @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr,
86
} else {
58
mr = s390_get_subregion(mr, offset, len);
87
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_get_sve(CPUState *cs)
59
offset -= mr->addr;
88
{
60
89
ARMCPU *cpu = ARM_CPU(cs);
61
- if (!memory_region_access_valid(mr, offset, len, true)) {
90
CPUARMState *env = &cpu->env;
62
+ if (!memory_region_access_valid(mr, offset, len, true,
91
- struct kvm_one_reg reg;
63
+ MEMTXATTRS_UNSPECIFIED)) {
92
uint64_t *r;
64
s390_program_interrupt(env, PGM_OPERAND, 6, ra);
93
int n, ret;
65
return 0;
94
66
}
95
for (n = 0; n < KVM_ARM64_SVE_NUM_ZREGS; ++n) {
67
diff --git a/memory.c b/memory.c
96
r = &env->vfp.zregs[n].d[0];
68
index XXXXXXX..XXXXXXX 100644
97
- reg.addr = (uintptr_t)r;
69
--- a/memory.c
98
- reg.id = KVM_REG_ARM64_SVE_ZREG(n, 0);
70
+++ b/memory.c
99
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
71
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps ram_device_mem_ops = {
100
+ ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_ZREG(n, 0), r);
72
bool memory_region_access_valid(MemoryRegion *mr,
101
if (ret) {
73
hwaddr addr,
102
return ret;
74
unsigned size,
103
}
75
- bool is_write)
104
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_get_sve(CPUState *cs)
76
+ bool is_write,
105
77
+ MemTxAttrs attrs)
106
for (n = 0; n < KVM_ARM64_SVE_NUM_PREGS; ++n) {
78
{
107
r = &env->vfp.pregs[n].p[0];
79
int access_size_min, access_size_max;
108
- reg.addr = (uintptr_t)r;
80
int access_size, i;
109
- reg.id = KVM_REG_ARM64_SVE_PREG(n, 0);
81
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_read(MemoryRegion *mr,
110
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
82
{
111
+ ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_PREG(n, 0), r);
83
MemTxResult r;
112
if (ret) {
84
113
return ret;
85
- if (!memory_region_access_valid(mr, addr, size, false)) {
114
}
86
+ if (!memory_region_access_valid(mr, addr, size, false, attrs)) {
115
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_get_sve(CPUState *cs)
87
*pval = unassigned_mem_read(mr, addr, size);
116
}
88
return MEMTX_DECODE_ERROR;
117
89
}
118
r = &env->vfp.pregs[FFR_PRED_NUM].p[0];
90
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_write(MemoryRegion *mr,
119
- reg.addr = (uintptr_t)r;
91
unsigned size,
120
- reg.id = KVM_REG_ARM64_SVE_FFR(0);
92
MemTxAttrs attrs)
121
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
93
{
122
+ ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r);
94
- if (!memory_region_access_valid(mr, addr, size, true)) {
123
if (ret) {
95
+ if (!memory_region_access_valid(mr, addr, size, true, attrs)) {
124
return ret;
96
unassigned_mem_write(mr, addr, data, size);
125
}
97
return MEMTX_DECODE_ERROR;
126
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_get_sve(CPUState *cs)
127
128
int kvm_arch_get_registers(CPUState *cs)
129
{
130
- struct kvm_one_reg reg;
131
uint64_t val;
132
unsigned int el;
133
uint32_t fpr;
134
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
135
CPUARMState *env = &cpu->env;
136
137
for (i = 0; i < 31; i++) {
138
- reg.id = AARCH64_CORE_REG(regs.regs[i]);
139
- reg.addr = (uintptr_t) &env->xregs[i];
140
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
141
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.regs[i]),
142
+ &env->xregs[i]);
143
if (ret) {
144
return ret;
145
}
146
}
147
148
- reg.id = AARCH64_CORE_REG(regs.sp);
149
- reg.addr = (uintptr_t) &env->sp_el[0];
150
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
151
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.sp), &env->sp_el[0]);
152
if (ret) {
153
return ret;
154
}
155
156
- reg.id = AARCH64_CORE_REG(sp_el1);
157
- reg.addr = (uintptr_t) &env->sp_el[1];
158
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
159
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(sp_el1), &env->sp_el[1]);
160
if (ret) {
161
return ret;
162
}
163
164
- reg.id = AARCH64_CORE_REG(regs.pstate);
165
- reg.addr = (uintptr_t) &val;
166
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
167
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.pstate), &val);
168
if (ret) {
169
return ret;
170
}
171
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
172
*/
173
aarch64_restore_sp(env, 1);
174
175
- reg.id = AARCH64_CORE_REG(regs.pc);
176
- reg.addr = (uintptr_t) &env->pc;
177
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
178
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.pc), &env->pc);
179
if (ret) {
180
return ret;
181
}
182
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
183
aarch64_sync_64_to_32(env);
184
}
185
186
- reg.id = AARCH64_CORE_REG(elr_el1);
187
- reg.addr = (uintptr_t) &env->elr_el[1];
188
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
189
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(elr_el1), &env->elr_el[1]);
190
if (ret) {
191
return ret;
192
}
193
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
194
* KVM SPSRs 0-4 map to QEMU banks 1-5
195
*/
196
for (i = 0; i < KVM_NR_SPSR; i++) {
197
- reg.id = AARCH64_CORE_REG(spsr[i]);
198
- reg.addr = (uintptr_t) &env->banked_spsr[i + 1];
199
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
200
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(spsr[i]),
201
+ &env->banked_spsr[i + 1]);
202
if (ret) {
203
return ret;
204
}
205
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
206
return ret;
207
}
208
209
- reg.addr = (uintptr_t)(&fpr);
210
- reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr);
211
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
212
+ ret = kvm_get_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpsr), &fpr);
213
if (ret) {
214
return ret;
215
}
216
vfp_set_fpsr(env, fpr);
217
218
- reg.addr = (uintptr_t)(&fpr);
219
- reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr);
220
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
221
+ ret = kvm_get_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpcr), &fpr);
222
if (ret) {
223
return ret;
98
}
224
}
99
--
225
--
100
2.17.1
226
2.34.1
101
227
102
228
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
For the Thumb T32 encoding of LDM, if only a single register is
2
add MemTxAttrs as an argument to the MemoryRegion valid.accepts
2
specified in the register list this instruction is UNPREDICTABLE,
3
callback. We'll need this for subpage_accepts().
3
with the following choices:
4
* instruction UNDEFs
5
* instruction is a NOP
6
* instruction loads a single register
7
* instruction loads an unspecified set of registers
4
8
5
We could take the approach we used with the read and write
9
Currently we choose to UNDEF (a behaviour chosen in commit
6
callbacks and add new a new _with_attrs version, but since there
10
4b222545dbf30 in 2019; previously we treated it as "load the
7
are so few implementations of the accepts hook we just change
11
specified single register").
8
them all.
9
12
13
Unfortunately there is real world code out there (which shipped in at
14
least Android 11, 12 and 13) which incorrectly uses this
15
UNPREDICTABLE insn on the assumption that it does a single register
16
load, which is (presumably) what it happens to do on real hardware,
17
and is also what it does on the equivalent A32 encoding.
18
19
Revert to the pre-4b222545dbf30 behaviour of not UNDEFing
20
for this T32 encoding.
21
22
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1799
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
24
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
25
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20180521140402.23318-9-peter.maydell@linaro.org
26
Message-id: 20230927101853.39288-1-peter.maydell@linaro.org
14
---
27
---
15
include/exec/memory.h | 3 ++-
28
target/arm/tcg/translate.c | 37 +++++++++++++++++++++++--------------
16
exec.c | 9 ++++++---
29
1 file changed, 23 insertions(+), 14 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
30
24
diff --git a/include/exec/memory.h b/include/exec/memory.h
31
diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
25
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory.h
33
--- a/target/arm/tcg/translate.c
27
+++ b/include/exec/memory.h
34
+++ b/target/arm/tcg/translate.c
28
@@ -XXX,XX +XXX,XX @@ struct MemoryRegionOps {
35
@@ -XXX,XX +XXX,XX @@ static void op_addr_block_post(DisasContext *s, arg_ldst_block *a,
29
* as a machine check exception).
36
}
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
}
37
}
44
38
45
static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
39
-static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
46
- unsigned size, bool is_write)
40
+static bool op_stm(DisasContext *s, arg_ldst_block *a)
47
+ unsigned size, bool is_write,
48
+ MemTxAttrs attrs)
49
{
41
{
50
return is_write;
42
int i, j, n, list, mem_idx;
43
bool user = a->u;
44
@@ -XXX,XX +XXX,XX @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
45
46
list = a->list;
47
n = ctpop16(list);
48
- if (n < min_n || a->rn == 15) {
49
+ /*
50
+ * This is UNPREDICTABLE for n < 1 in all encodings, and we choose
51
+ * to UNDEF. In the T32 STM encoding n == 1 is also UNPREDICTABLE,
52
+ * but hardware treats it like the A32 version and implements the
53
+ * single-register-store, and some in-the-wild (buggy) software
54
+ * assumes that, so we don't UNDEF on that case.
55
+ */
56
+ if (n < 1 || a->rn == 15) {
57
unallocated_encoding(s);
58
return true;
59
}
60
@@ -XXX,XX +XXX,XX @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
61
62
static bool trans_STM(DisasContext *s, arg_ldst_block *a)
63
{
64
- /* BitCount(list) < 1 is UNPREDICTABLE */
65
- return op_stm(s, a, 1);
66
+ return op_stm(s, a);
51
}
67
}
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult subpage_write(void *opaque, hwaddr addr,
68
69
static bool trans_STM_t32(DisasContext *s, arg_ldst_block *a)
70
@@ -XXX,XX +XXX,XX @@ static bool trans_STM_t32(DisasContext *s, arg_ldst_block *a)
71
unallocated_encoding(s);
72
return true;
73
}
74
- /* BitCount(list) < 2 is UNPREDICTABLE */
75
- return op_stm(s, a, 2);
76
+ return op_stm(s, a);
53
}
77
}
54
78
55
static bool subpage_accepts(void *opaque, hwaddr addr,
79
-static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
56
- unsigned len, bool is_write)
80
+static bool do_ldm(DisasContext *s, arg_ldst_block *a)
57
+ unsigned len, bool is_write,
58
+ MemTxAttrs attrs)
59
{
81
{
60
subpage_t *subpage = opaque;
82
int i, j, n, list, mem_idx;
61
#if defined(DEBUG_SUBPAGE)
83
bool loaded_base;
62
@@ -XXX,XX +XXX,XX @@ static void readonly_mem_write(void *opaque, hwaddr addr,
84
@@ -XXX,XX +XXX,XX @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
85
86
list = a->list;
87
n = ctpop16(list);
88
- if (n < min_n || a->rn == 15) {
89
+ /*
90
+ * This is UNPREDICTABLE for n < 1 in all encodings, and we choose
91
+ * to UNDEF. In the T32 LDM encoding n == 1 is also UNPREDICTABLE,
92
+ * but hardware treats it like the A32 version and implements the
93
+ * single-register-load, and some in-the-wild (buggy) software
94
+ * assumes that, so we don't UNDEF on that case.
95
+ */
96
+ if (n < 1 || a->rn == 15) {
97
unallocated_encoding(s);
98
return true;
99
}
100
@@ -XXX,XX +XXX,XX @@ static bool trans_LDM_a32(DisasContext *s, arg_ldst_block *a)
101
unallocated_encoding(s);
102
return true;
103
}
104
- /* BitCount(list) < 1 is UNPREDICTABLE */
105
- return do_ldm(s, a, 1);
106
+ return do_ldm(s, a);
63
}
107
}
64
108
65
static bool readonly_mem_accepts(void *opaque, hwaddr addr,
109
static bool trans_LDM_t32(DisasContext *s, arg_ldst_block *a)
66
- unsigned size, bool is_write)
110
@@ -XXX,XX +XXX,XX @@ static bool trans_LDM_t32(DisasContext *s, arg_ldst_block *a)
67
+ unsigned size, bool is_write,
111
unallocated_encoding(s);
68
+ MemTxAttrs attrs)
112
return true;
113
}
114
- /* BitCount(list) < 2 is UNPREDICTABLE */
115
- return do_ldm(s, a, 2);
116
+ return do_ldm(s, a);
117
}
118
119
static bool trans_LDM_t16(DisasContext *s, arg_ldst_block *a)
69
{
120
{
70
return is_write;
121
/* Writeback is conditional on the base register not being loaded. */
122
a->w = !(a->list & (1 << a->rn));
123
- /* BitCount(list) < 1 is UNPREDICTABLE */
124
- return do_ldm(s, a, 1);
125
+ return do_ldm(s, a);
71
}
126
}
72
diff --git a/hw/hppa/dino.c b/hw/hppa/dino.c
127
73
index XXXXXXX..XXXXXXX 100644
128
static bool trans_CLRM(DisasContext *s, arg_CLRM *a)
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
--
129
--
181
2.17.1
130
2.34.1
182
131
183
132
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Update the SMMUv3 ID register bit field definitions to the
2
add MemTxAttrs as an argument to address_space_translate_iommu().
2
set in the most recent specification (IHI0700 F.a).
3
3
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-14-peter.maydell@linaro.org
6
Reviewed-by: Mostafa Saleh <smostafa@google.com>
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 20230914145705.1648377-2-peter.maydell@linaro.org
8
---
9
---
9
exec.c | 8 +++++---
10
hw/arm/smmuv3-internal.h | 38 ++++++++++++++++++++++++++++++++++++++
10
1 file changed, 5 insertions(+), 3 deletions(-)
11
1 file changed, 38 insertions(+)
11
12
12
diff --git a/exec.c b/exec.c
13
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
15
--- a/hw/arm/smmuv3-internal.h
15
+++ b/exec.c
16
+++ b/hw/arm/smmuv3-internal.h
16
@@ -XXX,XX +XXX,XX @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
17
@@ -XXX,XX +XXX,XX @@ REG32(IDR0, 0x0)
17
* @is_write: whether the translation operation is for write
18
FIELD(IDR0, S1P, 1 , 1)
18
* @is_mmio: whether this can be MMIO, set true if it can
19
FIELD(IDR0, TTF, 2 , 2)
19
* @target_as: the address space targeted by the IOMMU
20
FIELD(IDR0, COHACC, 4 , 1)
20
+ * @attrs: transaction attributes
21
+ FIELD(IDR0, BTM, 5 , 1)
21
*
22
+ FIELD(IDR0, HTTU, 6 , 2)
22
* This function is called from RCU critical section. It is the common
23
+ FIELD(IDR0, DORMHINT, 8 , 1)
23
* part of flatview_do_translate and address_space_translate_cached.
24
+ FIELD(IDR0, HYP, 9 , 1)
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection address_space_translate_iommu(IOMMUMemoryRegion *iomm
25
+ FIELD(IDR0, ATS, 10, 1)
25
hwaddr *page_mask_out,
26
+ FIELD(IDR0, NS1ATS, 11, 1)
26
bool is_write,
27
FIELD(IDR0, ASID16, 12, 1)
27
bool is_mmio,
28
+ FIELD(IDR0, MSI, 13, 1)
28
- AddressSpace **target_as)
29
+ FIELD(IDR0, SEV, 14, 1)
29
+ AddressSpace **target_as,
30
+ FIELD(IDR0, ATOS, 15, 1)
30
+ MemTxAttrs attrs)
31
+ FIELD(IDR0, PRI, 16, 1)
31
{
32
+ FIELD(IDR0, VMW, 17, 1)
32
MemoryRegionSection *section;
33
FIELD(IDR0, VMID16, 18, 1)
33
hwaddr page_mask = (hwaddr)-1;
34
+ FIELD(IDR0, CD2L, 19, 1)
34
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
35
+ FIELD(IDR0, VATOS, 20, 1)
35
return address_space_translate_iommu(iommu_mr, xlat,
36
FIELD(IDR0, TTENDIAN, 21, 2)
36
plen_out, page_mask_out,
37
+ FIELD(IDR0, ATSRECERR, 23, 1)
37
is_write, is_mmio,
38
FIELD(IDR0, STALL_MODEL, 24, 2)
38
- target_as);
39
FIELD(IDR0, TERM_MODEL, 26, 1)
39
+ target_as, attrs);
40
FIELD(IDR0, STLEVEL, 27, 2)
40
}
41
+ FIELD(IDR0, RME_IMPL, 30, 1)
41
if (page_mask_out) {
42
42
/* Not behind an IOMMU, use default page size. */
43
REG32(IDR1, 0x4)
43
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate_cached(
44
FIELD(IDR1, SIDSIZE, 0 , 6)
44
45
+ FIELD(IDR1, SSIDSIZE, 6 , 5)
45
section = address_space_translate_iommu(iommu_mr, xlat, plen,
46
+ FIELD(IDR1, PRIQS, 11, 5)
46
NULL, is_write, true,
47
FIELD(IDR1, EVENTQS, 16, 5)
47
- &target_as);
48
FIELD(IDR1, CMDQS, 21, 5)
48
+ &target_as, attrs);
49
+ FIELD(IDR1, ATTR_PERMS_OVR, 26, 1)
49
return section.mr;
50
+ FIELD(IDR1, ATTR_TYPES_OVR, 27, 1)
50
}
51
+ FIELD(IDR1, REL, 28, 1)
52
+ FIELD(IDR1, QUEUES_PRESET, 29, 1)
53
+ FIELD(IDR1, TABLES_PRESET, 30, 1)
54
+ FIELD(IDR1, ECMDQ, 31, 1)
55
56
#define SMMU_IDR1_SIDSIZE 16
57
#define SMMU_CMDQS 19
58
#define SMMU_EVENTQS 19
59
60
REG32(IDR2, 0x8)
61
+ FIELD(IDR2, BA_VATOS, 0, 10)
62
+
63
REG32(IDR3, 0xc)
64
FIELD(IDR3, HAD, 2, 1);
65
+ FIELD(IDR3, PBHA, 3, 1);
66
+ FIELD(IDR3, XNX, 4, 1);
67
+ FIELD(IDR3, PPS, 5, 1);
68
+ FIELD(IDR3, MPAM, 7, 1);
69
+ FIELD(IDR3, FWB, 8, 1);
70
+ FIELD(IDR3, STT, 9, 1);
71
FIELD(IDR3, RIL, 10, 1);
72
FIELD(IDR3, BBML, 11, 2);
73
+ FIELD(IDR3, E0PD, 13, 1);
74
+ FIELD(IDR3, PTWNNC, 14, 1);
75
+ FIELD(IDR3, DPT, 15, 1);
76
+
77
REG32(IDR4, 0x10)
78
+
79
REG32(IDR5, 0x14)
80
FIELD(IDR5, OAS, 0, 3);
81
FIELD(IDR5, GRAN4K, 4, 1);
82
FIELD(IDR5, GRAN16K, 5, 1);
83
FIELD(IDR5, GRAN64K, 6, 1);
84
+ FIELD(IDR5, VAX, 10, 2);
85
+ FIELD(IDR5, STALL_MAX, 16, 16);
86
87
#define SMMU_IDR5_OAS 4
51
88
52
--
89
--
53
2.17.1
90
2.34.1
54
55
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
In smmuv3_init_regs() when we set the various bits in the ID
2
add MemTxAttrs as an argument to flatview_extend_translation().
2
registers, we do this almost in order of the fields in the
3
Its callers either have an attrs value to hand, or don't care
3
registers, but not quite. Move the initialization of
4
and can use MEMTXATTRS_UNSPECIFIED.
4
SMMU_IDR3.RIL and SMMU_IDR5.OAS into their correct places.
5
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-7-peter.maydell@linaro.org
8
Reviewed-by: Mostafa Saleh <smostafa@google.com>
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 20230914145705.1648377-3-peter.maydell@linaro.org
10
---
11
---
11
exec.c | 15 ++++++++++-----
12
hw/arm/smmuv3.c | 4 ++--
12
1 file changed, 10 insertions(+), 5 deletions(-)
13
1 file changed, 2 insertions(+), 2 deletions(-)
13
14
14
diff --git a/exec.c b/exec.c
15
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
17
--- a/hw/arm/smmuv3.c
17
+++ b/exec.c
18
+++ b/hw/arm/smmuv3.c
18
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
19
@@ -XXX,XX +XXX,XX @@ static void smmuv3_init_regs(SMMUv3State *s)
19
20
s->idr[1] = FIELD_DP32(s->idr[1], IDR1, EVENTQS, SMMU_EVENTQS);
20
static hwaddr
21
s->idr[1] = FIELD_DP32(s->idr[1], IDR1, CMDQS, SMMU_CMDQS);
21
flatview_extend_translation(FlatView *fv, hwaddr addr,
22
22
- hwaddr target_len,
23
- s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
23
- MemoryRegion *mr, hwaddr base, hwaddr len,
24
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, HAD, 1);
24
- bool is_write)
25
+ s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
25
+ hwaddr target_len,
26
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, BBML, 2);
26
+ MemoryRegion *mr, hwaddr base, hwaddr len,
27
27
+ bool is_write, MemTxAttrs attrs)
28
+ s->idr[5] = FIELD_DP32(s->idr[5], IDR5, OAS, SMMU_IDR5_OAS); /* 44 bits */
28
{
29
/* 4K, 16K and 64K granule support */
29
hwaddr done = 0;
30
s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN4K, 1);
30
hwaddr xlat;
31
s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN16K, 1);
31
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
32
s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN64K, 1);
32
33
- s->idr[5] = FIELD_DP32(s->idr[5], IDR5, OAS, SMMU_IDR5_OAS); /* 44 bits */
33
memory_region_ref(mr);
34
34
*plen = flatview_extend_translation(fv, addr, len, mr, xlat,
35
s->cmdq.base = deposit64(s->cmdq.base, 0, 5, SMMU_CMDQS);
35
- l, is_write);
36
s->cmdq.prod = 0;
36
+ l, is_write, attrs);
37
ptr = qemu_ram_ptr_length(mr->ram_block, xlat, plen, true);
38
rcu_read_unlock();
39
40
@@ -XXX,XX +XXX,XX @@ int64_t address_space_cache_init(MemoryRegionCache *cache,
41
mr = cache->mrs.mr;
42
memory_region_ref(mr);
43
if (memory_access_is_direct(mr, is_write)) {
44
+ /* We don't care about the memory attributes here as we're only
45
+ * doing this if we found actual RAM, which behaves the same
46
+ * regardless of attributes; so UNSPECIFIED is fine.
47
+ */
48
l = flatview_extend_translation(cache->fv, addr, len, mr,
49
- cache->xlat, l, is_write);
50
+ cache->xlat, l, is_write,
51
+ MEMTXATTRS_UNSPECIFIED);
52
cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true);
53
} else {
54
cache->ptr = NULL;
55
--
37
--
56
2.17.1
38
2.34.1
57
58
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
The SMMUv3.1-XNX feature is mandatory for an SMMUv3.1 if S2P is
2
add MemTxAttrs as an argument to tb_invalidate_phys_addr().
2
supported, so we should theoretically have implemented it as part of
3
Its callers either have an attrs value to hand, or don't care
3
the recent S2P work. Fortunately, for us the implementation is a
4
and can use MEMTXATTRS_UNSPECIFIED.
4
no-op.
5
6
This feature is about interpretation of the stage 2 page table
7
descriptor XN bits, which control execute permissions.
8
9
For QEMU, the permission bits passed to an IOMMU (via MemTxAttrs and
10
IOMMUAccessFlags) only indicate read and write; we do not distinguish
11
data reads from instruction reads outside the CPU proper. In the
12
SMMU architecture's terms, our interconnect between the client device
13
and the SMMU doesn't have the ability to convey the INST attribute,
14
and we therefore use the default value of "data" for this attribute.
15
16
We also do not support the bits in the Stream Table Entry that can
17
override the on-the-bus transaction attribute permissions (we do not
18
set SMMU_IDR1.ATTR_PERMS_OVR=1).
19
20
These two things together mean that for our implementation, it never
21
has to deal with transactions with the INST attribute, and so it can
22
correctly ignore the XN bits entirely. So we already implement
23
FEAT_XNX's "XN field is now 2 bits, not 1" behaviour to the extent
24
that we need to.
25
26
Advertise the presence of the feature in SMMU_IDR3.XNX.
5
27
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
30
Reviewed-by: Mostafa Saleh <smostafa@google.com>
9
Message-id: 20180521140402.23318-3-peter.maydell@linaro.org
31
Reviewed-by: Eric Auger <eric.auger@redhat.com>
32
Message-id: 20230914145705.1648377-4-peter.maydell@linaro.org
10
---
33
---
11
include/exec/exec-all.h | 5 +++--
34
hw/arm/smmuv3.c | 4 ++++
12
accel/tcg/translate-all.c | 2 +-
35
1 file changed, 4 insertions(+)
13
exec.c | 2 +-
14
target/xtensa/op_helper.c | 3 ++-
15
4 files changed, 7 insertions(+), 5 deletions(-)
16
36
17
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
37
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
18
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/exec-all.h
39
--- a/hw/arm/smmuv3.c
20
+++ b/include/exec/exec-all.h
40
+++ b/hw/arm/smmuv3.c
21
@@ -XXX,XX +XXX,XX @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
41
@@ -XXX,XX +XXX,XX @@ static void smmuv3_init_regs(SMMUv3State *s)
22
void tlb_set_page(CPUState *cpu, target_ulong vaddr,
42
s->idr[1] = FIELD_DP32(s->idr[1], IDR1, CMDQS, SMMU_CMDQS);
23
hwaddr paddr, int prot,
43
24
int mmu_idx, target_ulong size);
44
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, HAD, 1);
25
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
45
+ if (FIELD_EX32(s->idr[0], IDR0, S2P)) {
26
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs);
46
+ /* XNX is a stage-2-specific feature */
27
void probe_write(CPUArchState *env, target_ulong addr, int size, int mmu_idx,
47
+ s->idr[3] = FIELD_DP32(s->idr[3], IDR3, XNX, 1);
28
uintptr_t retaddr);
48
+ }
29
#else
49
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
30
@@ -XXX,XX +XXX,XX @@ static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
50
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, BBML, 2);
31
uint16_t idxmap)
32
{
33
}
34
-static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
35
+static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr,
36
+ MemTxAttrs attrs)
37
{
38
}
39
#endif
40
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/accel/tcg/translate-all.c
43
+++ b/accel/tcg/translate-all.c
44
@@ -XXX,XX +XXX,XX @@ static TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
45
}
46
47
#if !defined(CONFIG_USER_ONLY)
48
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
49
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
50
{
51
ram_addr_t ram_addr;
52
MemoryRegion *mr;
53
diff --git a/exec.c b/exec.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/exec.c
56
+++ b/exec.c
57
@@ -XXX,XX +XXX,XX @@ static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
58
if (phys != -1) {
59
/* Locks grabbed by tb_invalidate_phys_addr */
60
tb_invalidate_phys_addr(cpu->cpu_ases[asidx].as,
61
- phys | (pc & ~TARGET_PAGE_MASK));
62
+ phys | (pc & ~TARGET_PAGE_MASK), attrs);
63
}
64
}
65
#endif
66
diff --git a/target/xtensa/op_helper.c b/target/xtensa/op_helper.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/xtensa/op_helper.c
69
+++ b/target/xtensa/op_helper.c
70
@@ -XXX,XX +XXX,XX @@ static void tb_invalidate_virtual_addr(CPUXtensaState *env, uint32_t vaddr)
71
int ret = xtensa_get_physical_addr(env, false, vaddr, 2, 0,
72
&paddr, &page_size, &access);
73
if (ret == 0) {
74
- tb_invalidate_phys_addr(&address_space_memory, paddr);
75
+ tb_invalidate_phys_addr(&address_space_memory, paddr,
76
+ MEMTXATTRS_UNSPECIFIED);
77
}
78
}
79
51
80
--
52
--
81
2.17.1
53
2.34.1
82
83
diff view generated by jsdifflib
1
Add more detail to the documentation for memory_region_init_iommu()
1
FEAT_HPMN0 is a small feature which defines that it is valid for
2
and other IOMMU-related functions and data structures.
2
MDCR_EL2.HPMN to be set to 0, meaning "no PMU event counters provided
3
to an EL1 guest" (previously this setting was reserved). QEMU's
4
implementation almost gets HPMN == 0 right, but we need to fix
5
one check in pmevcntr_is_64_bit(). That is enough for us to
6
advertise the feature in the 'max' CPU.
7
8
(We don't need to make the behaviour conditional on feature
9
presence, because the FEAT_HPMN0 behaviour is within the range
10
of permitted UNPREDICTABLE behaviour for a non-FEAT_HPMN0
11
implementation.)
3
12
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Message-id: 20230921185445.3339214-1-peter.maydell@linaro.org
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 20180521140402.23318-2-peter.maydell@linaro.org
9
---
16
---
10
include/exec/memory.h | 105 ++++++++++++++++++++++++++++++++++++++----
17
docs/system/arm/emulation.rst | 1 +
11
1 file changed, 95 insertions(+), 10 deletions(-)
18
target/arm/helper.c | 2 +-
19
target/arm/tcg/cpu32.c | 4 ++++
20
target/arm/tcg/cpu64.c | 1 +
21
4 files changed, 7 insertions(+), 1 deletion(-)
12
22
13
diff --git a/include/exec/memory.h b/include/exec/memory.h
23
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
14
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
15
--- a/include/exec/memory.h
25
--- a/docs/system/arm/emulation.rst
16
+++ b/include/exec/memory.h
26
+++ b/docs/system/arm/emulation.rst
17
@@ -XXX,XX +XXX,XX @@ enum IOMMUMemoryRegionAttr {
27
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
18
IOMMU_ATTR_SPAPR_TCE_FD
28
- FEAT_HCX (Support for the HCRX_EL2 register)
19
};
29
- FEAT_HPDS (Hierarchical permission disables)
20
30
- FEAT_HPDS2 (Translation table page-based hardware attributes)
21
+/**
31
+- FEAT_HPMN0 (Setting of MDCR_EL2.HPMN to zero)
22
+ * IOMMUMemoryRegionClass:
32
- FEAT_I8MM (AArch64 Int8 matrix multiplication instructions)
23
+ *
33
- FEAT_IDST (ID space trap handling)
24
+ * All IOMMU implementations need to subclass TYPE_IOMMU_MEMORY_REGION
34
- FEAT_IESB (Implicit error synchronization event)
25
+ * and provide an implementation of at least the @translate method here
35
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
+ * to handle requests to the memory region. Other methods are optional.
36
index XXXXXXX..XXXXXXX 100644
27
+ *
37
--- a/target/arm/helper.c
28
+ * The IOMMU implementation must use the IOMMU notifier infrastructure
38
+++ b/target/arm/helper.c
29
+ * to report whenever mappings are changed, by calling
39
@@ -XXX,XX +XXX,XX @@ static bool pmevcntr_is_64_bit(CPUARMState *env, int counter)
30
+ * memory_region_notify_iommu() (or, if necessary, by calling
40
bool hlp = env->cp15.mdcr_el2 & MDCR_HLP;
31
+ * memory_region_notify_one() for each registered notifier).
41
int hpmn = env->cp15.mdcr_el2 & MDCR_HPMN;
32
+ */
42
33
typedef struct IOMMUMemoryRegionClass {
43
- if (hpmn != 0 && counter >= hpmn) {
34
/* private */
44
+ if (counter >= hpmn) {
35
struct DeviceClass parent_class;
45
return hlp;
36
46
}
37
/*
47
}
38
- * Return a TLB entry that contains a given address. Flag should
48
diff --git a/target/arm/tcg/cpu32.c b/target/arm/tcg/cpu32.c
39
- * be the access permission of this translation operation. We can
49
index XXXXXXX..XXXXXXX 100644
40
- * set flag to IOMMU_NONE to mean that we don't need any
50
--- a/target/arm/tcg/cpu32.c
41
- * read/write permission checks, like, when for region replay.
51
+++ b/target/arm/tcg/cpu32.c
42
+ * Return a TLB entry that contains a given address.
52
@@ -XXX,XX +XXX,XX @@ void aa32_max_features(ARMCPU *cpu)
43
+ *
53
t = FIELD_DP32(t, ID_DFR0, COPSDBG, 9); /* FEAT_Debugv8p4 */
44
+ * The IOMMUAccessFlags indicated via @flag are optional and may
54
t = FIELD_DP32(t, ID_DFR0, PERFMON, 6); /* FEAT_PMUv3p5 */
45
+ * be specified as IOMMU_NONE to indicate that the caller needs
55
cpu->isar.id_dfr0 = t;
46
+ * the full translation information for both reads and writes. If
56
+
47
+ * the access flags are specified then the IOMMU implementation
57
+ t = cpu->isar.id_dfr1;
48
+ * may use this as an optimization, to stop doing a page table
58
+ t = FIELD_DP32(t, ID_DFR1, HPMN0, 1); /* FEAT_HPMN0 */
49
+ * walk as soon as it knows that the requested permissions are not
59
+ cpu->isar.id_dfr1 = t;
50
+ * allowed. If IOMMU_NONE is passed then the IOMMU must do the
60
}
51
+ * full page table walk and report the permissions in the returned
61
52
+ * IOMMUTLBEntry. (Note that this implies that an IOMMU may not
62
/* CPU models. These are not needed for the AArch64 linux-user build. */
53
+ * return different mappings for reads and writes.)
63
diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
54
+ *
64
index XXXXXXX..XXXXXXX 100644
55
+ * The returned information remains valid while the caller is
65
--- a/target/arm/tcg/cpu64.c
56
+ * holding the big QEMU lock or is inside an RCU critical section;
66
+++ b/target/arm/tcg/cpu64.c
57
+ * if the caller wishes to cache the mapping beyond that it must
67
@@ -XXX,XX +XXX,XX @@ void aarch64_max_tcg_initfn(Object *obj)
58
+ * register an IOMMU notifier so it can invalidate its cached
68
t = cpu->isar.id_aa64dfr0;
59
+ * information when the IOMMU mapping changes.
69
t = FIELD_DP64(t, ID_AA64DFR0, DEBUGVER, 9); /* FEAT_Debugv8p4 */
60
+ *
70
t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 6); /* FEAT_PMUv3p5 */
61
+ * @iommu: the IOMMUMemoryRegion
71
+ t = FIELD_DP64(t, ID_AA64DFR0, HPMN0, 1); /* FEAT_HPMN0 */
62
+ * @hwaddr: address to be translated within the memory region
72
cpu->isar.id_aa64dfr0 = t;
63
+ * @flag: requested access permissions
73
64
*/
74
t = cpu->isar.id_aa64smfr0;
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
--
75
--
172
2.17.1
76
2.34.1
173
174
diff view generated by jsdifflib
1
Provide a VMSTATE_BOOL_SUB_ARRAY to go with VMSTATE_UINT8_SUB_ARRAY
1
The include of hw/arm/virt.h in kvm64.c is unnecessary and also a
2
and friends.
2
layering violation since the generic KVM code shouldn't need to know
3
anything about board-specifics. The include line is an accidental
4
leftover from commit 15613357ba53a4763, where we cleaned up the code
5
to not depend on virt board internals but forgot to also remove the
6
now-redundant include line.
3
7
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Reviewed-by: Gavin Shan <gshan@redhat.com>
6
Message-id: 20180521140402.23318-23-peter.maydell@linaro.org
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Message-id: 20230925110429.3917202-1-peter.maydell@linaro.org
7
---
12
---
8
include/migration/vmstate.h | 3 +++
13
target/arm/kvm64.c | 1 -
9
1 file changed, 3 insertions(+)
14
1 file changed, 1 deletion(-)
10
15
11
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
16
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/include/migration/vmstate.h
18
--- a/target/arm/kvm64.c
14
+++ b/include/migration/vmstate.h
19
+++ b/target/arm/kvm64.c
15
@@ -XXX,XX +XXX,XX @@ extern const VMStateInfo vmstate_info_qtailq;
20
@@ -XXX,XX +XXX,XX @@
16
#define VMSTATE_BOOL_ARRAY(_f, _s, _n) \
21
#include "internals.h"
17
VMSTATE_BOOL_ARRAY_V(_f, _s, _n, 0)
22
#include "hw/acpi/acpi.h"
18
23
#include "hw/acpi/ghes.h"
19
+#define VMSTATE_BOOL_SUB_ARRAY(_f, _s, _start, _num) \
24
-#include "hw/arm/virt.h"
20
+ VMSTATE_SUB_ARRAY(_f, _s, _start, _num, 0, vmstate_info_bool, bool)
25
21
+
26
static bool have_guest_debug;
22
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v) \
23
VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
24
27
25
--
28
--
26
2.17.1
29
2.34.1
27
30
28
31
diff view generated by jsdifflib
1
The FRECPX instructions should (like most other floating point operations)
1
The hw/arm/boot.h include in common-semi-target.h is not actually
2
honour the FPCR.FZ bit which specifies whether input denormals should
2
needed, and it's a bit odd because it pulls a hw/arm header into a
3
be flushed to zero (or FZ16 for the half-precision version).
3
target/arm file.
4
We forgot to implement this, which doesn't affect the results (since
4
5
the calculation doesn't actually care about the mantissa bits) but did
5
This include was originally needed because the semihosting code used
6
mean we were failing to set the FPSR.IDC bit.
6
the arm_boot_info struct to get the base address of the RAM in system
7
emulation, to use in a (bad) heuristic for the return values for the
8
SYS_HEAPINFO semihosting call. We've since overhauled how we
9
calculate the HEAPINFO values in system emulation, and the code no
10
longer uses the arm_boot_info struct.
11
12
Remove the now-redundant include line, and instead directly include
13
the cpu-qom.h header that we were previously getting via boot.h.
7
14
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180521172712.19930-1-peter.maydell@linaro.org
17
Message-id: 20230925112219.3919261-1-peter.maydell@linaro.org
11
---
18
---
12
target/arm/helper-a64.c | 6 ++++++
19
target/arm/common-semi-target.h | 4 +---
13
1 file changed, 6 insertions(+)
20
1 file changed, 1 insertion(+), 3 deletions(-)
14
21
15
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
22
diff --git a/target/arm/common-semi-target.h b/target/arm/common-semi-target.h
16
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.c
24
--- a/target/arm/common-semi-target.h
18
+++ b/target/arm/helper-a64.c
25
+++ b/target/arm/common-semi-target.h
19
@@ -XXX,XX +XXX,XX @@ float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
26
@@ -XXX,XX +XXX,XX @@
20
return nan;
27
#ifndef TARGET_ARM_COMMON_SEMI_TARGET_H
21
}
28
#define TARGET_ARM_COMMON_SEMI_TARGET_H
22
29
23
+ a = float16_squash_input_denormal(a, fpst);
30
-#ifndef CONFIG_USER_ONLY
24
+
31
-#include "hw/arm/boot.h"
25
val16 = float16_val(a);
32
-#endif
26
sbit = 0x8000 & val16;
33
+#include "target/arm/cpu-qom.h"
27
exp = extract32(val16, 10, 5);
34
28
@@ -XXX,XX +XXX,XX @@ float32 HELPER(frecpx_f32)(float32 a, void *fpstp)
35
static inline target_ulong common_semi_arg(CPUState *cs, int argno)
29
return nan;
36
{
30
}
31
32
+ a = float32_squash_input_denormal(a, fpst);
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
--
37
--
47
2.17.1
38
2.34.1
48
49
diff view generated by jsdifflib
1
From: Igor Mammedov <imammedo@redhat.com>
1
The code for powering on a CPU in arm-powerctl.c has two separate
2
2
use cases:
3
When QEMU is started with following CLI
3
* emulation of a real hardware power controller
4
-machine virt,gic-version=3,accel=kvm -cpu host -bios AAVMF_CODE.fd
4
* emulation of firmware interfaces (primarily PSCI) with
5
it crashes with abort at
5
CPU on/off APIs
6
accel/kvm/kvm-all.c:2164:
6
7
KVM_SET_DEVICE_ATTR failed: Group 6 attr 0x000000000000c665: Invalid argument
7
For the first case, we only need to reset the CPU and set its
8
8
starting PC and X0. For the second case, because we're emulating the
9
Which is caused by implicit dependency of kvm_arm_gicv3_reset() on
9
firmware we need to ensure that it's in the state that the firmware
10
arm_gicv3_icc_reset() where the later is called by CPU reset
10
provides. In particular, when we reset to a lower EL than the
11
reset callback.
11
highest one we are emulating, we need to put the CPU into a state
12
12
that permits correct running at that lower EL. We already do a
13
However commit:
13
little of this in arm-powerctl.c (for instance we set SCR_HCE to
14
3b77f6c arm/boot: split load_dtb() from arm_load_kernel()
14
enable the HVC insn) but we don't do enough of it. This means that
15
broke CPU reset callback registration in case
15
in the case where we are emulating EL3 but also providing emulated
16
16
PSCI the guest will crash when a secondary core tries to use a
17
arm_load_kernel()
17
feature that needs an SCR_EL3 bit to be set, such as MTE or PAuth.
18
...
18
19
if (!info->kernel_filename || info->firmware_loaded)
19
The hw/arm/boot.c code also has to support this "start guest code in
20
20
an EL that's lower than the highest emulated EL" case in order to do
21
branch is taken, i.e. it's sufficient to provide a firmware
21
direct guest kernel booting; it has all the necessary initialization
22
or do not provide kernel on CLI to skip cpu reset callback
22
code to set the SCR_EL3 bits. Pull the relevant boot.c code out into
23
registration, where before offending commit the callback
23
a separate function so we can share it between there and
24
has been registered unconditionally.
24
arm-powerctl.c.
25
25
26
Fix it by registering the callback right at the beginning of
26
This refactoring has a few code changes that look like they
27
arm_load_kernel() unconditionally instead of doing it at the end.
27
might be behaviour changes but aren't:
28
28
* if info->secure_boot is false and info->secure_board_setup is
29
NOTE:
29
true, then the old code would start the first CPU in Hyp
30
we probably should eliminate that dependency anyways as well as
30
mode but without changing SCR.NS and NSACR.{CP11,CP10}.
31
separate arch CPU reset parts from arm_load_kernel() into CPU
31
This was wrong behaviour because there's no such thing
32
itself, but that refactoring that I probably would have to do
32
as Secure Hyp mode. The new code will leave the CPU in SVC.
33
anyways later for CPU hotplug to work.
33
(There is no board which sets secure_boot to false and
34
34
secure_board_setup to true, so this isn't a behaviour
35
Reported-by: Auger Eric <eric.auger@redhat.com>
35
change for any of our boards.)
36
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
36
* we don't explicitly clear SCR.NS when arm-powerctl.c
37
Reviewed-by: Eric Auger <eric.auger@redhat.com>
37
does a CPU-on to EL3. This was a no-op because CPU reset
38
Tested-by: Eric Auger <eric.auger@redhat.com>
38
will reset to NS == 0.
39
Message-id: 1527070950-208350-1-git-send-email-imammedo@redhat.com
39
40
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
40
And some real behaviour changes:
41
* we no longer set HCR_EL2.RW when booting into EL2: the guest
42
can and should do that themselves before dropping into their
43
EL1 code. (arm-powerctl and boot did this differently; I
44
opted to use the logic from arm-powerctl, which only sets
45
HCR_EL2.RW when it's directly starting the guest in EL1,
46
because it's more correct, and I don't expect guests to be
47
accidentally depending on our having set the RW bit for them.)
48
* if we are booting a CPU into AArch32 Secure SVC then we won't
49
set SCR.HCE any more. This affects only the vexpress-a15 and
50
raspi2b machine types. Guests booting in this case will either:
51
- be able to set SCR.HCE themselves as part of moving from
52
Secure SVC into NS Hyp mode
53
- will move from Secure SVC to NS SVC, and won't care about
54
behaviour of the HVC insn
55
- will stay in Secure SVC, and won't care about HVC
56
* on an arm-powerctl CPU-on we will now set the SCR bits for
57
pauth/mte/sve/sme/hcx/fgt features
58
59
The first two of these are very minor and I don't expect guest
60
code to trip over them, so I didn't judge it worth convoluting
61
the code in an attempt to keep exactly the same boot.c behaviour.
62
The third change fixes issue 1899.
63
64
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1899
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
65
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
66
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
67
Message-id: 20230926155619.4028618-1-peter.maydell@linaro.org
42
---
68
---
43
hw/arm/boot.c | 18 +++++++++---------
69
target/arm/cpu.h | 22 +++++++++
44
1 file changed, 9 insertions(+), 9 deletions(-)
70
hw/arm/boot.c | 95 ++++++++++-----------------------------
45
71
target/arm/arm-powerctl.c | 53 +---------------------
72
target/arm/cpu.c | 95 +++++++++++++++++++++++++++++++++++++++
73
4 files changed, 141 insertions(+), 124 deletions(-)
74
75
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/cpu.h
78
+++ b/target/arm/cpu.h
79
@@ -XXX,XX +XXX,XX @@ int arm_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
80
int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
81
int cpuid, DumpState *s);
82
83
+/**
84
+ * arm_emulate_firmware_reset: Emulate firmware CPU reset handling
85
+ * @cpu: CPU (which must have been freshly reset)
86
+ * @target_el: exception level to put the CPU into
87
+ * @secure: whether to put the CPU in secure state
88
+ *
89
+ * When QEMU is directly running a guest kernel at a lower level than
90
+ * EL3 it implicitly emulates some aspects of the guest firmware.
91
+ * This includes that on reset we need to configure the parts of the
92
+ * CPU corresponding to EL3 so that the real guest code can run at its
93
+ * lower exception level. This function does that post-reset CPU setup,
94
+ * for when we do direct boot of a guest kernel, and for when we
95
+ * emulate PSCI and similar firmware interfaces starting a CPU at a
96
+ * lower exception level.
97
+ *
98
+ * @target_el must be an EL implemented by the CPU between 1 and 3.
99
+ * We do not support dropping into a Secure EL other than 3.
100
+ *
101
+ * It is the responsibility of the caller to call arm_rebuild_hflags().
102
+ */
103
+void arm_emulate_firmware_reset(CPUState *cpustate, int target_el);
104
+
105
#ifdef TARGET_AARCH64
106
int aarch64_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
107
int aarch64_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
46
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
108
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
47
index XXXXXXX..XXXXXXX 100644
109
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/boot.c
110
--- a/hw/arm/boot.c
49
+++ b/hw/arm/boot.c
111
+++ b/hw/arm/boot.c
50
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
112
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
51
static const ARMInsnFixup *primary_loader;
113
52
AddressSpace *as = arm_boot_address_space(cpu, info);
114
cpu_set_pc(cs, entry);
53
115
} else {
54
+ /* CPU objects (unlike devices) are not automatically reset on system
116
- /* If we are booting Linux then we need to check whether we are
55
+ * reset, so we must always register a handler to do so. If we're
117
- * booting into secure or non-secure state and adjust the state
56
+ * actually loading a kernel, the handler is also responsible for
118
- * accordingly. Out of reset, ARM is defined to be in secure state
57
+ * arranging that we start it correctly.
119
- * (SCR.NS = 0), we change that here if non-secure boot has been
120
- * requested.
121
+ /*
122
+ * If we are booting Linux then we might need to do so at:
123
+ * - AArch64 NS EL2 or NS EL1
124
+ * - AArch32 Secure SVC (EL3)
125
+ * - AArch32 NS Hyp (EL2)
126
+ * - AArch32 NS SVC (EL1)
127
+ * Configure the CPU in the way boot firmware would do to
128
+ * drop us down to the appropriate level.
129
*/
130
- if (arm_feature(env, ARM_FEATURE_EL3)) {
131
- /* AArch64 is defined to come out of reset into EL3 if enabled.
132
- * If we are booting Linux then we need to adjust our EL as
133
- * Linux expects us to be in EL2 or EL1. AArch32 resets into
134
- * SVC, which Linux expects, so no privilege/exception level to
135
- * adjust.
136
- */
137
- if (env->aarch64) {
138
- env->cp15.scr_el3 |= SCR_RW;
139
- if (arm_feature(env, ARM_FEATURE_EL2)) {
140
- env->cp15.hcr_el2 |= HCR_RW;
141
- env->pstate = PSTATE_MODE_EL2h;
142
- } else {
143
- env->pstate = PSTATE_MODE_EL1h;
144
- }
145
- if (cpu_isar_feature(aa64_pauth, cpu)) {
146
- env->cp15.scr_el3 |= SCR_API | SCR_APK;
147
- }
148
- if (cpu_isar_feature(aa64_mte, cpu)) {
149
- env->cp15.scr_el3 |= SCR_ATA;
150
- }
151
- if (cpu_isar_feature(aa64_sve, cpu)) {
152
- env->cp15.cptr_el[3] |= R_CPTR_EL3_EZ_MASK;
153
- env->vfp.zcr_el[3] = 0xf;
154
- }
155
- if (cpu_isar_feature(aa64_sme, cpu)) {
156
- env->cp15.cptr_el[3] |= R_CPTR_EL3_ESM_MASK;
157
- env->cp15.scr_el3 |= SCR_ENTP2;
158
- env->vfp.smcr_el[3] = 0xf;
159
- }
160
- if (cpu_isar_feature(aa64_hcx, cpu)) {
161
- env->cp15.scr_el3 |= SCR_HXEN;
162
- }
163
- if (cpu_isar_feature(aa64_fgt, cpu)) {
164
- env->cp15.scr_el3 |= SCR_FGTEN;
165
- }
166
+ int target_el = arm_feature(env, ARM_FEATURE_EL2) ? 2 : 1;
167
168
- /* AArch64 kernels never boot in secure mode */
169
- assert(!info->secure_boot);
170
- /* This hook is only supported for AArch32 currently:
171
- * bootloader_aarch64[] will not call the hook, and
172
- * the code above has already dropped us into EL2 or EL1.
173
- */
174
- assert(!info->secure_board_setup);
175
- }
176
-
177
- if (arm_feature(env, ARM_FEATURE_EL2)) {
178
- /* If we have EL2 then Linux expects the HVC insn to work */
179
- env->cp15.scr_el3 |= SCR_HCE;
180
- }
181
-
182
- /* Set to non-secure if not a secure boot */
183
- if (!info->secure_boot &&
184
- (cs != first_cpu || !info->secure_board_setup)) {
185
- /* Linux expects non-secure state */
186
- env->cp15.scr_el3 |= SCR_NS;
187
- /* Set NSACR.{CP11,CP10} so NS can access the FPU */
188
- env->cp15.nsacr |= 3 << 10;
189
- }
190
- }
191
-
192
- if (!env->aarch64 && !info->secure_boot &&
193
- arm_feature(env, ARM_FEATURE_EL2)) {
194
+ if (env->aarch64) {
195
/*
196
- * This is an AArch32 boot not to Secure state, and
197
- * we have Hyp mode available, so boot the kernel into
198
- * Hyp mode. This is not how the CPU comes out of reset,
199
- * so we need to manually put it there.
200
+ * AArch64 kernels never boot in secure mode, and we don't
201
+ * support the secure_board_setup hook for AArch64.
202
*/
203
- cpsr_write(env, ARM_CPU_MODE_HYP, CPSR_M, CPSRWriteRaw);
204
+ assert(!info->secure_boot);
205
+ assert(!info->secure_board_setup);
206
+ } else {
207
+ if (arm_feature(env, ARM_FEATURE_EL3) &&
208
+ (info->secure_boot ||
209
+ (info->secure_board_setup && cs == first_cpu))) {
210
+ /* Start this CPU in Secure SVC */
211
+ target_el = 3;
212
+ }
213
}
214
215
+ arm_emulate_firmware_reset(cs, target_el);
216
+
217
if (cs == first_cpu) {
218
AddressSpace *as = arm_boot_address_space(cpu, info);
219
220
diff --git a/target/arm/arm-powerctl.c b/target/arm/arm-powerctl.c
221
index XXXXXXX..XXXXXXX 100644
222
--- a/target/arm/arm-powerctl.c
223
+++ b/target/arm/arm-powerctl.c
224
@@ -XXX,XX +XXX,XX @@ static void arm_set_cpu_on_async_work(CPUState *target_cpu_state,
225
226
/* Initialize the cpu we are turning on */
227
cpu_reset(target_cpu_state);
228
+ arm_emulate_firmware_reset(target_cpu_state, info->target_el);
229
target_cpu_state->halted = 0;
230
231
- if (info->target_aa64) {
232
- if ((info->target_el < 3) && arm_feature(&target_cpu->env,
233
- ARM_FEATURE_EL3)) {
234
- /*
235
- * As target mode is AArch64, we need to set lower
236
- * exception level (the requested level 2) to AArch64
237
- */
238
- target_cpu->env.cp15.scr_el3 |= SCR_RW;
239
- }
240
-
241
- if ((info->target_el < 2) && arm_feature(&target_cpu->env,
242
- ARM_FEATURE_EL2)) {
243
- /*
244
- * As target mode is AArch64, we need to set lower
245
- * exception level (the requested level 1) to AArch64
246
- */
247
- target_cpu->env.cp15.hcr_el2 |= HCR_RW;
248
- }
249
-
250
- target_cpu->env.pstate = aarch64_pstate_mode(info->target_el, true);
251
- } else {
252
- /* We are requested to boot in AArch32 mode */
253
- static const uint32_t mode_for_el[] = { 0,
254
- ARM_CPU_MODE_SVC,
255
- ARM_CPU_MODE_HYP,
256
- ARM_CPU_MODE_SVC };
257
-
258
- cpsr_write(&target_cpu->env, mode_for_el[info->target_el], CPSR_M,
259
- CPSRWriteRaw);
260
- }
261
-
262
- if (info->target_el == 3) {
263
- /* Processor is in secure mode */
264
- target_cpu->env.cp15.scr_el3 &= ~SCR_NS;
265
- } else {
266
- /* Processor is not in secure mode */
267
- target_cpu->env.cp15.scr_el3 |= SCR_NS;
268
-
269
- /* Set NSACR.{CP11,CP10} so NS can access the FPU */
270
- target_cpu->env.cp15.nsacr |= 3 << 10;
271
-
272
- /*
273
- * If QEMU is providing the equivalent of EL3 firmware, then we need
274
- * to make sure a CPU targeting EL2 comes out of reset with a
275
- * functional HVC insn.
276
- */
277
- if (arm_feature(&target_cpu->env, ARM_FEATURE_EL3)
278
- && info->target_el == 2) {
279
- target_cpu->env.cp15.scr_el3 |= SCR_HCE;
280
- }
281
- }
282
-
283
/* We check if the started CPU is now at the correct level */
284
assert(info->target_el == arm_current_el(&target_cpu->env));
285
286
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
287
index XXXXXXX..XXXXXXX 100644
288
--- a/target/arm/cpu.c
289
+++ b/target/arm/cpu.c
290
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset_hold(Object *obj)
291
}
292
}
293
294
+void arm_emulate_firmware_reset(CPUState *cpustate, int target_el)
295
+{
296
+ ARMCPU *cpu = ARM_CPU(cpustate);
297
+ CPUARMState *env = &cpu->env;
298
+ bool have_el3 = arm_feature(env, ARM_FEATURE_EL3);
299
+ bool have_el2 = arm_feature(env, ARM_FEATURE_EL2);
300
+
301
+ /*
302
+ * Check we have the EL we're aiming for. If that is the
303
+ * highest implemented EL, then cpu_reset has already done
304
+ * all the work.
58
+ */
305
+ */
59
+ for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
306
+ switch (target_el) {
60
+ qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
307
+ case 3:
308
+ assert(have_el3);
309
+ return;
310
+ case 2:
311
+ assert(have_el2);
312
+ if (!have_el3) {
313
+ return;
314
+ }
315
+ break;
316
+ case 1:
317
+ if (!have_el3 && !have_el2) {
318
+ return;
319
+ }
320
+ break;
321
+ default:
322
+ g_assert_not_reached();
61
+ }
323
+ }
62
+
324
+
63
/* The board code is not supposed to set secure_board_setup unless
325
+ if (have_el3) {
64
* running its code in secure mode is actually possible, and KVM
326
+ /*
65
* doesn't support secure.
327
+ * Set the EL3 state so code can run at EL2. This should match
66
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
328
+ * the requirements set by Linux in its booting spec.
67
ARM_CPU(cs)->env.boot_info = info;
329
+ */
68
}
330
+ if (env->aarch64) {
69
331
+ env->cp15.scr_el3 |= SCR_RW;
70
- /* CPU objects (unlike devices) are not automatically reset on system
332
+ if (cpu_isar_feature(aa64_pauth, cpu)) {
71
- * reset, so we must always register a handler to do so. If we're
333
+ env->cp15.scr_el3 |= SCR_API | SCR_APK;
72
- * actually loading a kernel, the handler is also responsible for
334
+ }
73
- * arranging that we start it correctly.
335
+ if (cpu_isar_feature(aa64_mte, cpu)) {
74
- */
336
+ env->cp15.scr_el3 |= SCR_ATA;
75
- for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
337
+ }
76
- qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
338
+ if (cpu_isar_feature(aa64_sve, cpu)) {
77
- }
339
+ env->cp15.cptr_el[3] |= R_CPTR_EL3_EZ_MASK;
78
-
340
+ env->vfp.zcr_el[3] = 0xf;
79
if (!info->skip_dtb_autoload && have_dtb(info)) {
341
+ }
80
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
342
+ if (cpu_isar_feature(aa64_sme, cpu)) {
81
exit(1);
343
+ env->cp15.cptr_el[3] |= R_CPTR_EL3_ESM_MASK;
344
+ env->cp15.scr_el3 |= SCR_ENTP2;
345
+ env->vfp.smcr_el[3] = 0xf;
346
+ }
347
+ if (cpu_isar_feature(aa64_hcx, cpu)) {
348
+ env->cp15.scr_el3 |= SCR_HXEN;
349
+ }
350
+ if (cpu_isar_feature(aa64_fgt, cpu)) {
351
+ env->cp15.scr_el3 |= SCR_FGTEN;
352
+ }
353
+ }
354
+
355
+ if (target_el == 2) {
356
+ /* If the guest is at EL2 then Linux expects the HVC insn to work */
357
+ env->cp15.scr_el3 |= SCR_HCE;
358
+ }
359
+
360
+ /* Put CPU into non-secure state */
361
+ env->cp15.scr_el3 |= SCR_NS;
362
+ /* Set NSACR.{CP11,CP10} so NS can access the FPU */
363
+ env->cp15.nsacr |= 3 << 10;
364
+ }
365
+
366
+ if (have_el2 && target_el < 2) {
367
+ /* Set EL2 state so code can run at EL1. */
368
+ if (env->aarch64) {
369
+ env->cp15.hcr_el2 |= HCR_RW;
370
+ }
371
+ }
372
+
373
+ /* Set the CPU to the desired state */
374
+ if (env->aarch64) {
375
+ env->pstate = aarch64_pstate_mode(target_el, true);
376
+ } else {
377
+ static const uint32_t mode_for_el[] = {
378
+ 0,
379
+ ARM_CPU_MODE_SVC,
380
+ ARM_CPU_MODE_HYP,
381
+ ARM_CPU_MODE_SVC,
382
+ };
383
+
384
+ cpsr_write(env, mode_for_el[target_el], CPSR_M, CPSRWriteRaw);
385
+ }
386
+}
387
+
388
+
389
#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
390
391
static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
82
--
392
--
83
2.17.1
393
2.34.1
84
85
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Chris Rauer <crauer@google.com>
2
2
3
It forgot to increase clroffset during the loop. So it only clear the
3
The counter register is only 24-bits and counts down. If the timer is
4
first 4 bytes.
4
running but the qtimer to reset it hasn't fired off yet, there is a chance
5
the regster read can return an invalid result.
5
6
6
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
7
Signed-off-by: Chris Rauer <crauer@google.com>
7
Cc: qemu-stable@nongnu.org
8
Message-id: 20230922181411.2697135-1-crauer@google.com
8
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 1527047633-12368-1-git-send-email-zhaoshenglong@huawei.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
11
---
14
hw/intc/arm_gicv3_kvm.c | 1 +
12
hw/timer/npcm7xx_timer.c | 3 +++
15
1 file changed, 1 insertion(+)
13
1 file changed, 3 insertions(+)
16
14
17
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
15
diff --git a/hw/timer/npcm7xx_timer.c b/hw/timer/npcm7xx_timer.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/arm_gicv3_kvm.c
17
--- a/hw/timer/npcm7xx_timer.c
20
+++ b/hw/intc/arm_gicv3_kvm.c
18
+++ b/hw/timer/npcm7xx_timer.c
21
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
19
@@ -XXX,XX +XXX,XX @@ static int64_t npcm7xx_timer_count_to_ns(NPCM7xxTimer *t, uint32_t count)
22
if (clroffset != 0) {
20
/* Convert a time interval in nanoseconds to a timer cycle count. */
23
reg = 0;
21
static uint32_t npcm7xx_timer_ns_to_count(NPCM7xxTimer *t, int64_t ns)
24
kvm_gicd_access(s, clroffset, &reg, true);
22
{
25
+ clroffset += 4;
23
+ if (ns < 0) {
26
}
24
+ return 0;
27
reg = *gic_bmp_ptr32(bmp, irq);
25
+ }
28
kvm_gicd_access(s, offset, &reg, true);
26
return clock_ns_to_ticks(t->ctrl->clock, ns) /
27
npcm7xx_tcsr_prescaler(t->tcsr);
28
}
29
--
29
--
30
2.17.1
30
2.34.1
31
32
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Suraj Shirvankar <surajshirvankar@gmail.com>
2
2
3
Depending on the host abi, float16, aka uint16_t, values are
3
QEMU coding style uses the glib memory allocation APIs, not
4
passed and returned either zero-extended in the host register
4
the raw libc malloc/free. Switch the allocation and free
5
or with garbage at the top of the host register.
5
calls in elf2dmp to use these functions (dropping the now-unneeded
6
checks for failure).
6
7
7
The tcg code generator has so far been assuming garbage, as that
8
Signed-off-by: Suraj Shirvankar <surajshirvankar@gmail.com>
8
matches the x86 abi, but this is incorrect for other host abis.
9
Message-id: 169753938460.23804.11418813007617535750-1@git.sr.ht
9
Further, target/arm has so far been assuming zero-extended results,
10
[PMM: also remove NULL checks from g_malloc() calls;
10
so that it may store the 16-bit value into a 32-bit slot with the
11
beef up commit message]
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>
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
22
Message-id: 20180522175629.24932-1-richard.henderson@linaro.org
23
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
14
---
26
include/exec/helper-head.h | 2 +-
15
contrib/elf2dmp/addrspace.c | 7 ++-----
27
target/arm/helper-a64.c | 35 +++++++++--------
16
contrib/elf2dmp/main.c | 9 +++------
28
target/arm/helper.c | 80 +++++++++++++++++++-------------------
17
contrib/elf2dmp/pdb.c | 19 ++++++++-----------
29
3 files changed, 59 insertions(+), 58 deletions(-)
18
contrib/elf2dmp/qemu_elf.c | 7 ++-----
19
4 files changed, 15 insertions(+), 27 deletions(-)
30
20
31
diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h
21
diff --git a/contrib/elf2dmp/addrspace.c b/contrib/elf2dmp/addrspace.c
32
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
33
--- a/include/exec/helper-head.h
23
--- a/contrib/elf2dmp/addrspace.c
34
+++ b/include/exec/helper-head.h
24
+++ b/contrib/elf2dmp/addrspace.c
35
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@ int pa_space_create(struct pa_space *ps, QEMU_Elf *qemu_elf)
36
#define dh_ctype_int int
26
}
37
#define dh_ctype_i64 uint64_t
27
}
38
#define dh_ctype_s64 int64_t
28
39
-#define dh_ctype_f16 float16
29
- ps->block = malloc(sizeof(*ps->block) * ps->block_nr);
40
+#define dh_ctype_f16 uint32_t
30
- if (!ps->block) {
41
#define dh_ctype_f32 float32
31
- return 1;
42
#define dh_ctype_f64 float64
32
- }
43
#define dh_ctype_ptr void *
33
+ ps->block = g_new(struct pa_block, ps->block_nr);
44
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
34
35
for (i = 0; i < phdr_nr; i++) {
36
if (phdr[i].p_type == PT_LOAD) {
37
@@ -XXX,XX +XXX,XX @@ int pa_space_create(struct pa_space *ps, QEMU_Elf *qemu_elf)
38
void pa_space_destroy(struct pa_space *ps)
39
{
40
ps->block_nr = 0;
41
- free(ps->block);
42
+ g_free(ps->block);
43
}
44
45
void va_space_set_dtb(struct va_space *vs, uint64_t dtb)
46
diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c
45
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/helper-a64.c
48
--- a/contrib/elf2dmp/main.c
47
+++ b/target/arm/helper-a64.c
49
+++ b/contrib/elf2dmp/main.c
48
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
50
@@ -XXX,XX +XXX,XX @@ static KDDEBUGGER_DATA64 *get_kdbg(uint64_t KernBase, struct pdb_reader *pdb,
49
return flags;
51
}
52
}
53
54
- kdbg = malloc(kdbg_hdr.Size);
55
- if (!kdbg) {
56
- return NULL;
57
- }
58
+ kdbg = g_malloc(kdbg_hdr.Size);
59
60
if (va_space_rw(vs, KdDebuggerDataBlock, kdbg, kdbg_hdr.Size, 0)) {
61
eprintf("Failed to extract entire KDBG\n");
62
- free(kdbg);
63
+ g_free(kdbg);
64
return NULL;
65
}
66
67
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
68
}
69
70
out_kdbg:
71
- free(kdbg);
72
+ g_free(kdbg);
73
out_pdb:
74
pdb_exit(&pdb);
75
out_pdb_file:
76
diff --git a/contrib/elf2dmp/pdb.c b/contrib/elf2dmp/pdb.c
77
index XXXXXXX..XXXXXXX 100644
78
--- a/contrib/elf2dmp/pdb.c
79
+++ b/contrib/elf2dmp/pdb.c
80
@@ -XXX,XX +XXX,XX @@ uint64_t pdb_resolve(uint64_t img_base, struct pdb_reader *r, const char *name)
81
82
static void pdb_reader_ds_exit(struct pdb_reader *r)
83
{
84
- free(r->ds.toc);
85
+ g_free(r->ds.toc);
50
}
86
}
51
87
52
-uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
88
static void pdb_exit_symbols(struct pdb_reader *r)
53
+uint64_t HELPER(vfp_cmph_a64)(uint32_t x, uint32_t y, void *fp_status)
54
{
89
{
55
return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
90
- free(r->modimage);
91
- free(r->symbols);
92
+ g_free(r->modimage);
93
+ g_free(r->symbols);
56
}
94
}
57
95
58
-uint64_t HELPER(vfp_cmpeh_a64)(float16 x, float16 y, void *fp_status)
96
static void pdb_exit_segments(struct pdb_reader *r)
59
+uint64_t HELPER(vfp_cmpeh_a64)(uint32_t x, uint32_t y, void *fp_status)
60
{
97
{
61
return float_rel_to_flags(float16_compare(x, y, fp_status));
98
- free(r->segs);
99
+ g_free(r->segs);
62
}
100
}
63
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, void *fpstp)
101
64
#define float64_three make_float64(0x4008000000000000ULL)
102
static void *pdb_ds_read(const PDB_DS_HEADER *header,
65
#define float64_one_point_five make_float64(0x3FF8000000000000ULL)
103
@@ -XXX,XX +XXX,XX @@ static void *pdb_ds_read(const PDB_DS_HEADER *header,
66
104
67
-float16 HELPER(recpsf_f16)(float16 a, float16 b, void *fpstp)
105
nBlocks = (size + header->block_size - 1) / header->block_size;
68
+uint32_t HELPER(recpsf_f16)(uint32_t a, uint32_t b, void *fpstp)
106
107
- buffer = malloc(nBlocks * header->block_size);
108
- if (!buffer) {
109
- return NULL;
110
- }
111
+ buffer = g_malloc(nBlocks * header->block_size);
112
113
for (i = 0; i < nBlocks; i++) {
114
memcpy(buffer + i * header->block_size, (const char *)header +
115
@@ -XXX,XX +XXX,XX @@ static int pdb_init_symbols(struct pdb_reader *r)
116
return 0;
117
118
out_symbols:
119
- free(symbols);
120
+ g_free(symbols);
121
122
return err;
123
}
124
@@ -XXX,XX +XXX,XX @@ static int pdb_reader_init(struct pdb_reader *r, void *data)
125
out_sym:
126
pdb_exit_symbols(r);
127
out_root:
128
- free(r->ds.root);
129
+ g_free(r->ds.root);
130
out_ds:
131
pdb_reader_ds_exit(r);
132
133
@@ -XXX,XX +XXX,XX @@ static void pdb_reader_exit(struct pdb_reader *r)
69
{
134
{
70
float_status *fpst = fpstp;
135
pdb_exit_segments(r);
71
136
pdb_exit_symbols(r);
72
@@ -XXX,XX +XXX,XX @@ float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp)
137
- free(r->ds.root);
73
return float64_muladd(a, b, float64_two, 0, fpst);
138
+ g_free(r->ds.root);
139
pdb_reader_ds_exit(r);
74
}
140
}
75
141
76
-float16 HELPER(rsqrtsf_f16)(float16 a, float16 b, void *fpstp)
142
diff --git a/contrib/elf2dmp/qemu_elf.c b/contrib/elf2dmp/qemu_elf.c
77
+uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, void *fpstp)
143
index XXXXXXX..XXXXXXX 100644
144
--- a/contrib/elf2dmp/qemu_elf.c
145
+++ b/contrib/elf2dmp/qemu_elf.c
146
@@ -XXX,XX +XXX,XX @@ static int init_states(QEMU_Elf *qe)
147
148
printf("%zu CPU states has been found\n", cpu_nr);
149
150
- qe->state = malloc(sizeof(*qe->state) * cpu_nr);
151
- if (!qe->state) {
152
- return 1;
153
- }
154
+ qe->state = g_new(QEMUCPUState*, cpu_nr);
155
156
cpu_nr = 0;
157
158
@@ -XXX,XX +XXX,XX @@ static int init_states(QEMU_Elf *qe)
159
160
static void exit_states(QEMU_Elf *qe)
78
{
161
{
79
float_status *fpst = fpstp;
162
- free(qe->state);
80
163
+ g_free(qe->state);
81
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_addlp_u16)(uint64_t a)
82
}
164
}
83
165
84
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
166
static bool check_ehdr(QEMU_Elf *qe)
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
}
287
}
288
289
-uint32_t HELPER(vfp_toshh)(float16 x, uint32_t shift, void *fpst)
290
+uint32_t HELPER(vfp_toshh)(uint32_t x, uint32_t shift, void *fpst)
291
{
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
--
167
--
379
2.17.1
168
2.34.1
380
381
diff view generated by jsdifflib
Deleted patch
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
2
add MemTxAttrs as an argument to address_space_translate()
3
and address_space_translate_cached(). Callers either have an
4
attrs value to hand, or don't care and can use MEMTXATTRS_UNSPECIFIED.
5
1
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-4-peter.maydell@linaro.org
10
---
11
include/exec/memory.h | 4 +++-
12
accel/tcg/translate-all.c | 2 +-
13
exec.c | 14 +++++++++-----
14
hw/vfio/common.c | 3 ++-
15
memory_ldst.inc.c | 18 +++++++++---------
16
target/riscv/helper.c | 2 +-
17
6 files changed, 25 insertions(+), 18 deletions(-)
18
19
diff --git a/include/exec/memory.h b/include/exec/memory.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/exec/memory.h
22
+++ b/include/exec/memory.h
23
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
24
* #MemoryRegion.
25
* @len: pointer to length
26
* @is_write: indicates the transfer direction
27
+ * @attrs: memory attributes
28
*/
29
MemoryRegion *flatview_translate(FlatView *fv,
30
hwaddr addr, hwaddr *xlat,
31
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv,
32
33
static inline MemoryRegion *address_space_translate(AddressSpace *as,
34
hwaddr addr, hwaddr *xlat,
35
- hwaddr *len, bool is_write)
36
+ hwaddr *len, bool is_write,
37
+ MemTxAttrs attrs)
38
{
39
return flatview_translate(address_space_to_flatview(as),
40
addr, xlat, len, is_write);
41
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/accel/tcg/translate-all.c
44
+++ b/accel/tcg/translate-all.c
45
@@ -XXX,XX +XXX,XX @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
46
hwaddr l = 1;
47
48
rcu_read_lock();
49
- mr = address_space_translate(as, addr, &addr, &l, false);
50
+ mr = address_space_translate(as, addr, &addr, &l, false, attrs);
51
if (!(memory_region_is_ram(mr)
52
|| memory_region_is_romd(mr))) {
53
rcu_read_unlock();
54
diff --git a/exec.c b/exec.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/exec.c
57
+++ b/exec.c
58
@@ -XXX,XX +XXX,XX @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
59
rcu_read_lock();
60
while (len > 0) {
61
l = len;
62
- mr = address_space_translate(as, addr, &addr1, &l, true);
63
+ mr = address_space_translate(as, addr, &addr1, &l, true,
64
+ MEMTXATTRS_UNSPECIFIED);
65
66
if (!(memory_region_is_ram(mr) ||
67
memory_region_is_romd(mr))) {
68
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache)
69
*/
70
static inline MemoryRegion *address_space_translate_cached(
71
MemoryRegionCache *cache, hwaddr addr, hwaddr *xlat,
72
- hwaddr *plen, bool is_write)
73
+ hwaddr *plen, bool is_write, MemTxAttrs attrs)
74
{
75
MemoryRegionSection section;
76
MemoryRegion *mr;
77
@@ -XXX,XX +XXX,XX @@ address_space_read_cached_slow(MemoryRegionCache *cache, hwaddr addr,
78
MemoryRegion *mr;
79
80
l = len;
81
- mr = address_space_translate_cached(cache, addr, &addr1, &l, false);
82
+ mr = address_space_translate_cached(cache, addr, &addr1, &l, false,
83
+ MEMTXATTRS_UNSPECIFIED);
84
flatview_read_continue(cache->fv,
85
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
86
addr1, l, mr);
87
@@ -XXX,XX +XXX,XX @@ address_space_write_cached_slow(MemoryRegionCache *cache, hwaddr addr,
88
MemoryRegion *mr;
89
90
l = len;
91
- mr = address_space_translate_cached(cache, addr, &addr1, &l, true);
92
+ mr = address_space_translate_cached(cache, addr, &addr1, &l, true,
93
+ MEMTXATTRS_UNSPECIFIED);
94
flatview_write_continue(cache->fv,
95
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
96
addr1, l, mr);
97
@@ -XXX,XX +XXX,XX @@ bool cpu_physical_memory_is_io(hwaddr phys_addr)
98
99
rcu_read_lock();
100
mr = address_space_translate(&address_space_memory,
101
- phys_addr, &phys_addr, &l, false);
102
+ phys_addr, &phys_addr, &l, false,
103
+ MEMTXATTRS_UNSPECIFIED);
104
105
res = !(memory_region_is_ram(mr) || memory_region_is_romd(mr));
106
rcu_read_unlock();
107
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
108
index XXXXXXX..XXXXXXX 100644
109
--- a/hw/vfio/common.c
110
+++ b/hw/vfio/common.c
111
@@ -XXX,XX +XXX,XX @@ static bool vfio_get_vaddr(IOMMUTLBEntry *iotlb, void **vaddr,
112
*/
113
mr = address_space_translate(&address_space_memory,
114
iotlb->translated_addr,
115
- &xlat, &len, writable);
116
+ &xlat, &len, writable,
117
+ MEMTXATTRS_UNSPECIFIED);
118
if (!memory_region_is_ram(mr)) {
119
error_report("iommu map to non memory area %"HWADDR_PRIx"",
120
xlat);
121
diff --git a/memory_ldst.inc.c b/memory_ldst.inc.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/memory_ldst.inc.c
124
+++ b/memory_ldst.inc.c
125
@@ -XXX,XX +XXX,XX @@ static inline uint32_t glue(address_space_ldl_internal, SUFFIX)(ARG1_DECL,
126
bool release_lock = false;
127
128
RCU_READ_LOCK();
129
- mr = TRANSLATE(addr, &addr1, &l, false);
130
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
131
if (l < 4 || !IS_DIRECT(mr, false)) {
132
release_lock |= prepare_mmio_access(mr);
133
134
@@ -XXX,XX +XXX,XX @@ static inline uint64_t glue(address_space_ldq_internal, SUFFIX)(ARG1_DECL,
135
bool release_lock = false;
136
137
RCU_READ_LOCK();
138
- mr = TRANSLATE(addr, &addr1, &l, false);
139
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
140
if (l < 8 || !IS_DIRECT(mr, false)) {
141
release_lock |= prepare_mmio_access(mr);
142
143
@@ -XXX,XX +XXX,XX @@ uint32_t glue(address_space_ldub, SUFFIX)(ARG1_DECL,
144
bool release_lock = false;
145
146
RCU_READ_LOCK();
147
- mr = TRANSLATE(addr, &addr1, &l, false);
148
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
149
if (!IS_DIRECT(mr, false)) {
150
release_lock |= prepare_mmio_access(mr);
151
152
@@ -XXX,XX +XXX,XX @@ static inline uint32_t glue(address_space_lduw_internal, SUFFIX)(ARG1_DECL,
153
bool release_lock = false;
154
155
RCU_READ_LOCK();
156
- mr = TRANSLATE(addr, &addr1, &l, false);
157
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
158
if (l < 2 || !IS_DIRECT(mr, false)) {
159
release_lock |= prepare_mmio_access(mr);
160
161
@@ -XXX,XX +XXX,XX @@ void glue(address_space_stl_notdirty, SUFFIX)(ARG1_DECL,
162
bool release_lock = false;
163
164
RCU_READ_LOCK();
165
- mr = TRANSLATE(addr, &addr1, &l, true);
166
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
167
if (l < 4 || !IS_DIRECT(mr, true)) {
168
release_lock |= prepare_mmio_access(mr);
169
170
@@ -XXX,XX +XXX,XX @@ static inline void glue(address_space_stl_internal, SUFFIX)(ARG1_DECL,
171
bool release_lock = false;
172
173
RCU_READ_LOCK();
174
- mr = TRANSLATE(addr, &addr1, &l, true);
175
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
176
if (l < 4 || !IS_DIRECT(mr, true)) {
177
release_lock |= prepare_mmio_access(mr);
178
179
@@ -XXX,XX +XXX,XX @@ void glue(address_space_stb, SUFFIX)(ARG1_DECL,
180
bool release_lock = false;
181
182
RCU_READ_LOCK();
183
- mr = TRANSLATE(addr, &addr1, &l, true);
184
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
185
if (!IS_DIRECT(mr, true)) {
186
release_lock |= prepare_mmio_access(mr);
187
r = memory_region_dispatch_write(mr, addr1, val, 1, attrs);
188
@@ -XXX,XX +XXX,XX @@ static inline void glue(address_space_stw_internal, SUFFIX)(ARG1_DECL,
189
bool release_lock = false;
190
191
RCU_READ_LOCK();
192
- mr = TRANSLATE(addr, &addr1, &l, true);
193
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
194
if (l < 2 || !IS_DIRECT(mr, true)) {
195
release_lock |= prepare_mmio_access(mr);
196
197
@@ -XXX,XX +XXX,XX @@ static void glue(address_space_stq_internal, SUFFIX)(ARG1_DECL,
198
bool release_lock = false;
199
200
RCU_READ_LOCK();
201
- mr = TRANSLATE(addr, &addr1, &l, true);
202
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
203
if (l < 8 || !IS_DIRECT(mr, true)) {
204
release_lock |= prepare_mmio_access(mr);
205
206
diff --git a/target/riscv/helper.c b/target/riscv/helper.c
207
index XXXXXXX..XXXXXXX 100644
208
--- a/target/riscv/helper.c
209
+++ b/target/riscv/helper.c
210
@@ -XXX,XX +XXX,XX @@ restart:
211
MemoryRegion *mr;
212
hwaddr l = sizeof(target_ulong), addr1;
213
mr = address_space_translate(cs->as, pte_addr,
214
- &addr1, &l, false);
215
+ &addr1, &l, false, MEMTXATTRS_UNSPECIFIED);
216
if (memory_access_is_direct(mr, true)) {
217
target_ulong *pte_pa =
218
qemu_map_ram_ptr(mr->ram_block, addr1);
219
--
220
2.17.1
221
222
diff view generated by jsdifflib