1
target-arm queue. This has the "plumb txattrs through various
1
The big thing in here is RTH's caching-of-tb-flags patchset
2
bits of exec.c" patches, and a collection of bug fixes from
2
which should improve TCG performance.
3
various people.
4
3
5
thanks
4
thanks
6
-- PMM
5
-- PMM
7
6
7
The following changes since commit 2152e740a8938b3bad73bfe1a01f8b94dab02d41:
8
8
9
9
Merge remote-tracking branch 'remotes/vivier2/tags/trivial-branch-pull-request' into staging (2019-10-22 12:03:03 +0100)
10
The following changes since commit a3ac12fba028df90f7b3dbec924995c126c41022:
11
12
Merge remote-tracking branch 'remotes/ehabkost/tags/numa-next-pull-request' into staging (2018-05-31 11:12:36 +0100)
13
10
14
are available in the Git repository at:
11
are available in the Git repository at:
15
12
16
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180531
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20191022
17
14
18
for you to fetch changes up to 49d1dca0520ea71bc21867fab6647f474fcf857b:
15
for you to fetch changes up to 833043a060f7d0e95ded88e61e992466305c0345:
19
16
20
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice (2018-05-31 14:52:53 +0100)
17
hw/arm/digic4: Inline digic4_board_setup_ram() function (2019-10-22 14:21:57 +0100)
21
18
22
----------------------------------------------------------------
19
----------------------------------------------------------------
23
target-arm queue:
20
target-arm queue:
24
* target/arm: Honour FPCR.FZ in FRECPX
21
* Fix sign-extension for SMLAL* instructions
25
* MAINTAINERS: Add entries for newer MPS2 boards and devices
22
* aspeed: Add an AST2600 eval board
26
* hw/intc/arm_gicv3: Fix APxR<n> register dispatching
23
* Various ptimer device conversions to new transaction API
27
* arm_gicv3_kvm: fix bug in writing zero bits back to the in-kernel
24
* Cache TB flags to avoid expensively recomputing them every time
28
GIC state
25
* Add a dummy Samsung SDHCI controller model to exynos4 boards
29
* tcg: Fix helper function vs host abi for float16
26
* Minor refactorings of RAM creation for some arm boards
30
* arm: fix qemu crash on startup with -bios option
31
* arm: fix malloc type mismatch
32
* xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
33
* Correct CPACR reset value for v7 cores
34
* memory.h: Improve IOMMU related documentation
35
* exec: Plumb transaction attributes through various functions in
36
preparation for allowing IOMMUs to see them
37
* vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
38
* ARM: ACPI: Fix use-after-free due to memory realloc
39
* KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
40
27
41
----------------------------------------------------------------
28
----------------------------------------------------------------
42
Francisco Iglesias (1):
29
Cédric Le Goater (1):
43
xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
30
aspeed: Add an AST2600 eval board
44
31
45
Igor Mammedov (1):
32
Guenter Roeck (1):
46
arm: fix qemu crash on startup with -bios option
33
hw/timer/exynos4210_mct: Initialize ptimer before starting it
47
34
48
Jan Kiszka (1):
35
Peter Maydell (7):
49
hw/intc/arm_gicv3: Fix APxR<n> register dispatching
36
hw/timer/arm_mptimer.c: Undo accidental rename of arm_mptimer_init()
37
hw/timer/puv3_ost.c: Switch to transaction-based ptimer API
38
hw/timer/sh_timer: Switch to transaction-based ptimer API
39
hw/timer/lm32_timer: Switch to transaction-based ptimer API
40
hw/timer/altera_timer.c: Switch to transaction-based ptimer API
41
hw/watchdog/etraxfs_timer.c: Switch to transaction-based ptimer API
42
hw/m68k/mcf5208.c: Switch to transaction-based ptimer API
50
43
51
Paolo Bonzini (1):
44
Philippe Mathieu-Daudé (9):
52
arm: fix malloc type mismatch
45
hw/sd/sdhci: Add a comment to distinct the i.MX eSDHC functions
46
hw/sd/sdhci: Add dummy Samsung SDHCI controller
47
hw/arm/exynos4210: Use the Samsung s3c SDHCI controller
48
hw/arm/xilinx_zynq: Use the IEC binary prefix definitions
49
hw/arm/mps2: Use the IEC binary prefix definitions
50
hw/arm/collie: Create the RAM in the board
51
hw/arm/omap2: Create the RAM in the board
52
hw/arm/omap1: Create the RAM in the board
53
hw/arm/digic4: Inline digic4_board_setup_ram() function
53
54
54
Peter Maydell (17):
55
Richard Henderson (23):
55
target/arm: Honour FPCR.FZ in FRECPX
56
target/arm: Fix sign-extension for SMLAL*
56
MAINTAINERS: Add entries for newer MPS2 boards and devices
57
target/arm: Split out rebuild_hflags_common
57
Correct CPACR reset value for v7 cores
58
target/arm: Split out rebuild_hflags_a64
58
memory.h: Improve IOMMU related documentation
59
target/arm: Split out rebuild_hflags_common_32
59
Make tb_invalidate_phys_addr() take a MemTxAttrs argument
60
target/arm: Split arm_cpu_data_is_big_endian
60
Make address_space_translate{, _cached}() take a MemTxAttrs argument
61
target/arm: Split out rebuild_hflags_m32
61
Make address_space_map() take a MemTxAttrs argument
62
target/arm: Reduce tests vs M-profile in cpu_get_tb_cpu_state
62
Make address_space_access_valid() take a MemTxAttrs argument
63
target/arm: Split out rebuild_hflags_a32
63
Make flatview_extend_translation() take a MemTxAttrs argument
64
target/arm: Split out rebuild_hflags_aprofile
64
Make memory_region_access_valid() take a MemTxAttrs argument
65
target/arm: Hoist XSCALE_CPAR, VECLEN, VECSTRIDE in cpu_get_tb_cpu_state
65
Make MemoryRegion valid.accepts callback take a MemTxAttrs argument
66
target/arm: Simplify set of PSTATE_SS in cpu_get_tb_cpu_state
66
Make flatview_access_valid() take a MemTxAttrs argument
67
target/arm: Hoist computation of TBFLAG_A32.VFPEN
67
Make flatview_translate() take a MemTxAttrs argument
68
target/arm: Add arm_rebuild_hflags
68
Make address_space_get_iotlb_entry() take a MemTxAttrs argument
69
target/arm: Split out arm_mmu_idx_el
69
Make flatview_do_translate() take a MemTxAttrs argument
70
target/arm: Hoist store to cs_base in cpu_get_tb_cpu_state
70
Make address_space_translate_iommu take a MemTxAttrs argument
71
target/arm: Add HELPER(rebuild_hflags_{a32, a64, m32})
71
vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
72
target/arm: Rebuild hflags at EL changes
73
target/arm: Rebuild hflags at MSR writes
74
target/arm: Rebuild hflags at CPSR writes
75
target/arm: Rebuild hflags at Xscale SCTLR writes
76
target/arm: Rebuild hflags for M-profile
77
target/arm: Rebuild hflags for M-profile NVIC
78
target/arm: Rely on hflags correct in cpu_get_tb_cpu_state
72
79
73
Richard Henderson (1):
80
hw/arm/strongarm.h | 4 +-
74
tcg: Fix helper function vs host abi for float16
81
include/hw/arm/aspeed.h | 1 +
82
include/hw/arm/omap.h | 10 +-
83
include/hw/sd/sdhci.h | 2 +
84
target/arm/cpu.h | 84 ++++++----
85
target/arm/helper.h | 4 +
86
target/arm/internals.h | 9 ++
87
hw/arm/aspeed.c | 23 +++
88
hw/arm/collie.c | 8 +-
89
hw/arm/digic_boards.c | 9 +-
90
hw/arm/exynos4210.c | 2 +-
91
hw/arm/mps2-tz.c | 3 +-
92
hw/arm/mps2.c | 3 +-
93
hw/arm/nseries.c | 10 +-
94
hw/arm/omap1.c | 12 +-
95
hw/arm/omap2.c | 13 +-
96
hw/arm/omap_sx1.c | 8 +-
97
hw/arm/palm.c | 8 +-
98
hw/arm/strongarm.c | 7 +-
99
hw/arm/xilinx_zynq.c | 3 +-
100
hw/intc/armv7m_nvic.c | 22 +--
101
hw/m68k/mcf5208.c | 9 +-
102
hw/sd/sdhci.c | 68 +++++++-
103
hw/timer/altera_timer.c | 13 +-
104
hw/timer/arm_mptimer.c | 4 +-
105
hw/timer/etraxfs_timer.c | 23 +--
106
hw/timer/exynos4210_mct.c | 2 +-
107
hw/timer/lm32_timer.c | 13 +-
108
hw/timer/puv3_ost.c | 9 +-
109
hw/timer/sh_timer.c | 13 +-
110
linux-user/syscall.c | 1 +
111
target/arm/cpu.c | 1 +
112
target/arm/helper-a64.c | 3 +
113
target/arm/helper.c | 393 +++++++++++++++++++++++++++++----------------
114
target/arm/m_helper.c | 6 +
115
target/arm/machine.c | 1 +
116
target/arm/op_helper.c | 4 +
117
target/arm/translate-a64.c | 13 +-
118
target/arm/translate.c | 37 ++++-
119
39 files changed, 588 insertions(+), 270 deletions(-)
75
120
76
Shannon Zhao (3):
77
arm_gicv3_kvm: increase clroffset accordingly
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
81
include/exec/exec-all.h | 5 +-
82
include/exec/helper-head.h | 2 +-
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
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
The 32-bit product should be sign-extended, not zero-extended.
4
5
Fixes: ea96b374641b
6
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Message-id: 20190912183058.17947-1-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/translate.c | 4 +++-
14
1 file changed, 3 insertions(+), 1 deletion(-)
15
16
diff --git a/target/arm/translate.c b/target/arm/translate.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate.c
19
+++ b/target/arm/translate.c
20
@@ -XXX,XX +XXX,XX @@ static bool op_smlaxxx(DisasContext *s, arg_rrrr *a,
21
case 2:
22
tl = load_reg(s, a->ra);
23
th = load_reg(s, a->rd);
24
- t1 = tcg_const_i32(0);
25
+ /* Sign-extend the 32-bit product to 64 bits. */
26
+ t1 = tcg_temp_new_i32();
27
+ tcg_gen_sari_i32(t1, t0, 31);
28
tcg_gen_add2_i32(tl, th, tl, th, t0, t1);
29
tcg_temp_free_i32(t0);
30
tcg_temp_free_i32(t1);
31
--
32
2.20.1
33
34
diff view generated by jsdifflib
New patch
1
From: Cédric Le Goater <clg@kaod.org>
1
2
3
Define the board with 1 GiB of RAM but some boards can have up to 2
4
GiB.
5
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Joel Stanley <joel@jms.id.au>
8
Message-id: 20191016090745.15334-1-clg@kaod.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/arm/aspeed.h | 1 +
12
hw/arm/aspeed.c | 23 +++++++++++++++++++++++
13
2 files changed, 24 insertions(+)
14
15
diff --git a/include/hw/arm/aspeed.h b/include/hw/arm/aspeed.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/aspeed.h
18
+++ b/include/hw/arm/aspeed.h
19
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedBoardConfig {
20
const char *desc;
21
const char *soc_name;
22
uint32_t hw_strap1;
23
+ uint32_t hw_strap2;
24
const char *fmc_model;
25
const char *spi_model;
26
uint32_t num_cs;
27
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/aspeed.c
30
+++ b/hw/arm/aspeed.c
31
@@ -XXX,XX +XXX,XX @@ struct AspeedBoardState {
32
/* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
33
#define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
34
35
+/* AST2600 evb hardware value */
36
+#define AST2600_EVB_HW_STRAP1 0x000000C0
37
+#define AST2600_EVB_HW_STRAP2 0x00000003
38
+
39
/*
40
* The max ram region is for firmwares that scan the address space
41
* with load/store to guess how much RAM the SoC has.
42
@@ -XXX,XX +XXX,XX @@ static void aspeed_board_init(MachineState *machine,
43
&error_abort);
44
object_property_set_int(OBJECT(&bmc->soc), cfg->hw_strap1, "hw-strap1",
45
&error_abort);
46
+ object_property_set_int(OBJECT(&bmc->soc), cfg->hw_strap2, "hw-strap2",
47
+ &error_abort);
48
object_property_set_int(OBJECT(&bmc->soc), cfg->num_cs, "num-cs",
49
&error_abort);
50
object_property_set_int(OBJECT(&bmc->soc), machine->smp.cpus, "num-cpus",
51
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
52
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
53
}
54
55
+static void ast2600_evb_i2c_init(AspeedBoardState *bmc)
56
+{
57
+ /* Start with some devices on our I2C busses */
58
+ ast2500_evb_i2c_init(bmc);
59
+}
60
+
61
static void romulus_bmc_i2c_init(AspeedBoardState *bmc)
62
{
63
AspeedSoCState *soc = &bmc->soc;
64
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
65
.num_cs = 2,
66
.i2c_init = witherspoon_bmc_i2c_init,
67
.ram = 512 * MiB,
68
+ }, {
69
+ .name = MACHINE_TYPE_NAME("ast2600-evb"),
70
+ .desc = "Aspeed AST2600 EVB (Cortex A7)",
71
+ .soc_name = "ast2600-a0",
72
+ .hw_strap1 = AST2600_EVB_HW_STRAP1,
73
+ .hw_strap2 = AST2600_EVB_HW_STRAP2,
74
+ .fmc_model = "w25q512jv",
75
+ .spi_model = "mx66u51235f",
76
+ .num_cs = 1,
77
+ .i2c_init = ast2600_evb_i2c_init,
78
+ .ram = 1 * GiB,
79
},
80
};
81
82
--
83
2.20.1
84
85
diff view generated by jsdifflib
New patch
1
From: Guenter Roeck <linux@roeck-us.net>
1
2
3
When booting a recent Linux kernel, the qemu message "Timer with delta
4
zero, disabling" is seen, apparently because a ptimer is started before
5
being initialized. Fix the problem by initializing the offending ptimer
6
before starting it.
7
8
The bug is effectively harmless in the old QEMUBH setup
9
because the sequence of events is:
10
* the delta zero means the timer expires immediately
11
* ptimer_reload() arranges for exynos4210_gfrc_event() to be called
12
* ptimer_reload() notices the zero delta and disables the timer
13
* later, the QEMUBH runs, and exynos4210_gfrc_event() correctly
14
configures the timer and restarts it
15
16
In the new transaction based API the bug is still harmless,
17
but differences of when the callback function runs mean the
18
message is not printed any more:
19
* ptimer_run() does nothing as it's inside a transaction block
20
* ptimer_transaction_commit() sees it has work to do and
21
calls ptimer_reload()
22
* the zero delta means the timer expires immediately
23
* ptimer_reload() calls exynos4210_gfrc_event() directly
24
* exynos4210_gfrc_event() configures the timer
25
* the delta is no longer zero so ptimer_reload() doesn't complain
26
(the zero-delta test is after the trigger-callback in
27
the ptimer_reload() function)
28
29
Regardless, the behaviour here was not intentional, and we should
30
just program the ptimer correctly to start with.
31
32
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
33
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
34
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
35
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
36
Message-id: 20191018143149.9216-1-peter.maydell@linaro.org
37
[PMM: Expansion/clarification of the commit message:
38
the message is about a zero delta, not a zero period;
39
added detail to the commit message of the analysis of what
40
is happening and why the kernel boots even with the message;
41
added note that the message goes away with the new ptimer API]
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
44
hw/timer/exynos4210_mct.c | 2 +-
45
1 file changed, 1 insertion(+), 1 deletion(-)
46
47
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/timer/exynos4210_mct.c
50
+++ b/hw/timer/exynos4210_mct.c
51
@@ -XXX,XX +XXX,XX @@ static void exynos4210_mct_write(void *opaque, hwaddr offset,
52
/* Start FRC if transition from disabled to enabled */
53
if ((value & G_TCON_TIMER_ENABLE) > (old_val &
54
G_TCON_TIMER_ENABLE)) {
55
- exynos4210_gfrc_start(&s->g_timer);
56
+ exynos4210_gfrc_restart(s);
57
}
58
if ((value & G_TCON_TIMER_ENABLE) < (old_val &
59
G_TCON_TIMER_ENABLE)) {
60
--
61
2.20.1
62
63
diff view generated by jsdifflib
1
Add more detail to the documentation for memory_region_init_iommu()
1
In commit b01422622b we did an automated rename of the ptimer_init()
2
and other IOMMU-related functions and data structures.
2
function to ptimer_init_with_bh(). Unfortunately this caught the
3
unrelated arm_mptimer_init() function. Undo that accidental
4
renaming.
3
5
6
Fixes: b01422622b7c7293196fdaf1dbb4f495af44ecf9
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 20191017133331.5901-1-peter.maydell@linaro.org
8
Message-id: 20180521140402.23318-2-peter.maydell@linaro.org
9
---
11
---
10
include/exec/memory.h | 105 ++++++++++++++++++++++++++++++++++++++----
12
hw/timer/arm_mptimer.c | 4 ++--
11
1 file changed, 95 insertions(+), 10 deletions(-)
13
1 file changed, 2 insertions(+), 2 deletions(-)
12
14
13
diff --git a/include/exec/memory.h b/include/exec/memory.h
15
diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/include/exec/memory.h
17
--- a/hw/timer/arm_mptimer.c
16
+++ b/include/exec/memory.h
18
+++ b/hw/timer/arm_mptimer.c
17
@@ -XXX,XX +XXX,XX @@ enum IOMMUMemoryRegionAttr {
19
@@ -XXX,XX +XXX,XX @@ static void arm_mptimer_reset(DeviceState *dev)
18
IOMMU_ATTR_SPAPR_TCE_FD
20
}
21
}
22
23
-static void arm_mptimer_init_with_bh(Object *obj)
24
+static void arm_mptimer_init(Object *obj)
25
{
26
ARMMPTimerState *s = ARM_MPTIMER(obj);
27
28
@@ -XXX,XX +XXX,XX @@ static const TypeInfo arm_mptimer_info = {
29
.name = TYPE_ARM_MPTIMER,
30
.parent = TYPE_SYS_BUS_DEVICE,
31
.instance_size = sizeof(ARMMPTimerState),
32
- .instance_init = arm_mptimer_init_with_bh,
33
+ .instance_init = arm_mptimer_init,
34
.class_init = arm_mptimer_class_init,
19
};
35
};
20
36
21
+/**
22
+ * IOMMUMemoryRegionClass:
23
+ *
24
+ * All IOMMU implementations need to subclass TYPE_IOMMU_MEMORY_REGION
25
+ * and provide an implementation of at least the @translate method here
26
+ * to handle requests to the memory region. Other methods are optional.
27
+ *
28
+ * The IOMMU implementation must use the IOMMU notifier infrastructure
29
+ * to report whenever mappings are changed, by calling
30
+ * memory_region_notify_iommu() (or, if necessary, by calling
31
+ * memory_region_notify_one() for each registered notifier).
32
+ */
33
typedef struct IOMMUMemoryRegionClass {
34
/* private */
35
struct DeviceClass parent_class;
36
37
/*
38
- * Return a TLB entry that contains a given address. Flag should
39
- * be the access permission of this translation operation. We can
40
- * set flag to IOMMU_NONE to mean that we don't need any
41
- * read/write permission checks, like, when for region replay.
42
+ * Return a TLB entry that contains a given address.
43
+ *
44
+ * The IOMMUAccessFlags indicated via @flag are optional and may
45
+ * be specified as IOMMU_NONE to indicate that the caller needs
46
+ * the full translation information for both reads and writes. If
47
+ * the access flags are specified then the IOMMU implementation
48
+ * may use this as an optimization, to stop doing a page table
49
+ * walk as soon as it knows that the requested permissions are not
50
+ * allowed. If IOMMU_NONE is passed then the IOMMU must do the
51
+ * full page table walk and report the permissions in the returned
52
+ * IOMMUTLBEntry. (Note that this implies that an IOMMU may not
53
+ * return different mappings for reads and writes.)
54
+ *
55
+ * The returned information remains valid while the caller is
56
+ * holding the big QEMU lock or is inside an RCU critical section;
57
+ * if the caller wishes to cache the mapping beyond that it must
58
+ * register an IOMMU notifier so it can invalidate its cached
59
+ * information when the IOMMU mapping changes.
60
+ *
61
+ * @iommu: the IOMMUMemoryRegion
62
+ * @hwaddr: address to be translated within the memory region
63
+ * @flag: requested access permissions
64
*/
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
--
37
--
172
2.17.1
38
2.20.1
173
39
174
40
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Switch the puv3_ost code away from bottom-half based ptimers to the
2
add MemTxAttrs as an argument to address_space_get_iotlb_entry().
2
new transaction-based ptimer API. This just requires adding
3
begin/commit calls around the various places that modify the ptimer
4
state, and using the new ptimer_init() function to create the timer.
3
5
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-12-peter.maydell@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-2-peter.maydell@linaro.org
8
---
10
---
9
include/exec/memory.h | 2 +-
11
hw/timer/puv3_ost.c | 9 +++++----
10
exec.c | 2 +-
12
1 file changed, 5 insertions(+), 4 deletions(-)
11
hw/virtio/vhost.c | 3 ++-
12
3 files changed, 4 insertions(+), 3 deletions(-)
13
13
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/hw/timer/puv3_ost.c b/hw/timer/puv3_ost.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
16
--- a/hw/timer/puv3_ost.c
17
+++ b/include/exec/memory.h
17
+++ b/hw/timer/puv3_ost.c
18
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache);
18
@@ -XXX,XX +XXX,XX @@
19
* entry. Should be called from an RCU critical section.
19
#include "hw/sysbus.h"
20
*/
20
#include "hw/irq.h"
21
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
21
#include "hw/ptimer.h"
22
- bool is_write);
22
-#include "qemu/main-loop.h"
23
+ bool is_write, MemTxAttrs attrs);
23
#include "qemu/module.h"
24
24
25
/* address_space_translate: translate an address range into an address space
25
#undef DEBUG_PUV3
26
* into a MemoryRegion and an address range into that section. Should be
26
@@ -XXX,XX +XXX,XX @@ typedef struct PUV3OSTState {
27
diff --git a/exec.c b/exec.c
27
SysBusDevice parent_obj;
28
index XXXXXXX..XXXXXXX 100644
28
29
--- a/exec.c
29
MemoryRegion iomem;
30
+++ b/exec.c
30
- QEMUBH *bh;
31
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
31
qemu_irq irq;
32
32
ptimer_state *ptimer;
33
/* Called from RCU critical section */
33
34
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
34
@@ -XXX,XX +XXX,XX @@ static void puv3_ost_write(void *opaque, hwaddr offset,
35
- bool is_write)
35
DPRINTF("offset 0x%x, value 0x%x\n", offset, value);
36
+ bool is_write, MemTxAttrs attrs)
36
switch (offset) {
37
{
37
case 0x00: /* Match Register 0 */
38
MemoryRegionSection section;
38
+ ptimer_transaction_begin(s->ptimer);
39
hwaddr xlat, page_mask;
39
s->reg_OSMR0 = value;
40
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
40
if (s->reg_OSMR0 > s->reg_OSCR) {
41
index XXXXXXX..XXXXXXX 100644
41
ptimer_set_count(s->ptimer, s->reg_OSMR0 - s->reg_OSCR);
42
--- a/hw/virtio/vhost.c
42
@@ -XXX,XX +XXX,XX @@ static void puv3_ost_write(void *opaque, hwaddr offset,
43
+++ b/hw/virtio/vhost.c
43
(0xffffffff - s->reg_OSCR));
44
@@ -XXX,XX +XXX,XX @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
44
}
45
trace_vhost_iotlb_miss(dev, 1);
45
ptimer_run(s->ptimer, 2);
46
46
+ ptimer_transaction_commit(s->ptimer);
47
iotlb = address_space_get_iotlb_entry(dev->vdev->dma_as,
47
break;
48
- iova, write);
48
case 0x14: /* Status Register */
49
+ iova, write,
49
assert(value == 0);
50
+ MEMTXATTRS_UNSPECIFIED);
50
@@ -XXX,XX +XXX,XX @@ static void puv3_ost_realize(DeviceState *dev, Error **errp)
51
if (iotlb.target_as != NULL) {
51
52
ret = vhost_memory_region_lookup(dev, iotlb.translated_addr,
52
sysbus_init_irq(sbd, &s->irq);
53
&uaddr, &len);
53
54
- s->bh = qemu_bh_new(puv3_ost_tick, s);
55
- s->ptimer = ptimer_init_with_bh(s->bh, PTIMER_POLICY_DEFAULT);
56
+ s->ptimer = ptimer_init(puv3_ost_tick, s, PTIMER_POLICY_DEFAULT);
57
+ ptimer_transaction_begin(s->ptimer);
58
ptimer_set_freq(s->ptimer, 50 * 1000 * 1000);
59
+ ptimer_transaction_commit(s->ptimer);
60
61
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_ost_ops, s, "puv3_ost",
62
PUV3_REGS_OFFSET);
54
--
63
--
55
2.17.1
64
2.20.1
56
65
57
66
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Switch the sh_timer code away from bottom-half based ptimers to the
2
add MemTxAttrs as an argument to address_space_translate()
2
new transaction-based ptimer API. This just requires adding
3
and address_space_translate_cached(). Callers either have an
3
begin/commit calls around the various places that modify the ptimer
4
attrs value to hand, or don't care and can use MEMTXATTRS_UNSPECIFIED.
4
state, and using the new ptimer_init() function to create the timer.
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-4-peter.maydell@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-3-peter.maydell@linaro.org
10
---
10
---
11
include/exec/memory.h | 4 +++-
11
hw/timer/sh_timer.c | 13 +++++++++----
12
accel/tcg/translate-all.c | 2 +-
12
1 file changed, 9 insertions(+), 4 deletions(-)
13
exec.c | 14 +++++++++-----
14
hw/vfio/common.c | 3 ++-
15
memory_ldst.inc.c | 18 +++++++++---------
16
target/riscv/helper.c | 2 +-
17
6 files changed, 25 insertions(+), 18 deletions(-)
18
13
19
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/hw/timer/sh_timer.c b/hw/timer/sh_timer.c
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/include/exec/memory.h
16
--- a/hw/timer/sh_timer.c
22
+++ b/include/exec/memory.h
17
+++ b/hw/timer/sh_timer.c
23
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
18
@@ -XXX,XX +XXX,XX @@
24
* #MemoryRegion.
19
#include "hw/irq.h"
25
* @len: pointer to length
20
#include "hw/sh4/sh.h"
26
* @is_write: indicates the transfer direction
21
#include "qemu/timer.h"
27
+ * @attrs: memory attributes
22
-#include "qemu/main-loop.h"
28
*/
23
#include "hw/ptimer.h"
29
MemoryRegion *flatview_translate(FlatView *fv,
24
30
hwaddr addr, hwaddr *xlat,
25
//#define DEBUG_TIMER
31
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv,
26
@@ -XXX,XX +XXX,XX @@ static void sh_timer_write(void *opaque, hwaddr offset,
32
27
switch (offset >> 2) {
33
static inline MemoryRegion *address_space_translate(AddressSpace *as,
28
case OFFSET_TCOR:
34
hwaddr addr, hwaddr *xlat,
29
s->tcor = value;
35
- hwaddr *len, bool is_write)
30
+ ptimer_transaction_begin(s->timer);
36
+ hwaddr *len, bool is_write,
31
ptimer_set_limit(s->timer, s->tcor, 0);
37
+ MemTxAttrs attrs)
32
+ ptimer_transaction_commit(s->timer);
33
break;
34
case OFFSET_TCNT:
35
s->tcnt = value;
36
+ ptimer_transaction_begin(s->timer);
37
ptimer_set_count(s->timer, s->tcnt);
38
+ ptimer_transaction_commit(s->timer);
39
break;
40
case OFFSET_TCR:
41
+ ptimer_transaction_begin(s->timer);
42
if (s->enabled) {
43
/* Pause the timer if it is running. This may cause some
44
inaccuracy dure to rounding, but avoids a whole lot of other
45
@@ -XXX,XX +XXX,XX @@ static void sh_timer_write(void *opaque, hwaddr offset,
46
/* Restart the timer if still enabled. */
47
ptimer_run(s->timer, 0);
48
}
49
+ ptimer_transaction_commit(s->timer);
50
break;
51
case OFFSET_TCPR:
52
if (s->feat & TIMER_FEAT_CAPT) {
53
@@ -XXX,XX +XXX,XX @@ static void sh_timer_start_stop(void *opaque, int enable)
54
printf("sh_timer_start_stop %d (%d)\n", enable, s->enabled);
55
#endif
56
57
+ ptimer_transaction_begin(s->timer);
58
if (s->enabled && !enable) {
59
ptimer_stop(s->timer);
60
}
61
if (!s->enabled && enable) {
62
ptimer_run(s->timer, 0);
63
}
64
+ ptimer_transaction_commit(s->timer);
65
s->enabled = !!enable;
66
67
#ifdef DEBUG_TIMER
68
@@ -XXX,XX +XXX,XX @@ static void sh_timer_tick(void *opaque)
69
static void *sh_timer_init(uint32_t freq, int feat, qemu_irq irq)
38
{
70
{
39
return flatview_translate(address_space_to_flatview(as),
71
sh_timer_state *s;
40
addr, xlat, len, is_write);
72
- QEMUBH *bh;
41
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
73
42
index XXXXXXX..XXXXXXX 100644
74
s = (sh_timer_state *)g_malloc0(sizeof(sh_timer_state));
43
--- a/accel/tcg/translate-all.c
75
s->freq = freq;
44
+++ b/accel/tcg/translate-all.c
76
@@ -XXX,XX +XXX,XX @@ static void *sh_timer_init(uint32_t freq, int feat, qemu_irq irq)
45
@@ -XXX,XX +XXX,XX @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
77
s->enabled = 0;
46
hwaddr l = 1;
78
s->irq = irq;
47
79
48
rcu_read_lock();
80
- bh = qemu_bh_new(sh_timer_tick, s);
49
- mr = address_space_translate(as, addr, &addr, &l, false);
81
- s->timer = ptimer_init_with_bh(bh, PTIMER_POLICY_DEFAULT);
50
+ mr = address_space_translate(as, addr, &addr, &l, false, attrs);
82
+ s->timer = ptimer_init(sh_timer_tick, s, PTIMER_POLICY_DEFAULT);
51
if (!(memory_region_is_ram(mr)
83
52
|| memory_region_is_romd(mr))) {
84
sh_timer_write(s, OFFSET_TCOR >> 2, s->tcor);
53
rcu_read_unlock();
85
sh_timer_write(s, OFFSET_TCNT >> 2, s->tcnt);
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
--
86
--
220
2.17.1
87
2.20.1
221
88
222
89
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Switch the lm32_timer code away from bottom-half based ptimers to the
2
add MemTxAttrs as an argument to address_space_map().
2
new transaction-based ptimer API. This just requires adding
3
Its callers either have an attrs value to hand, or don't care
3
begin/commit calls around the various places that modify the ptimer
4
and can use MEMTXATTRS_UNSPECIFIED.
4
state, and using the new ptimer_init() function to create the ytimer.
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-5-peter.maydell@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-4-peter.maydell@linaro.org
10
---
10
---
11
include/exec/memory.h | 3 ++-
11
hw/timer/lm32_timer.c | 13 +++++++++----
12
include/sysemu/dma.h | 3 ++-
12
1 file changed, 9 insertions(+), 4 deletions(-)
13
exec.c | 6 ++++--
14
target/ppc/mmu-hash64.c | 3 ++-
15
4 files changed, 10 insertions(+), 5 deletions(-)
16
13
17
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/hw/timer/lm32_timer.c b/hw/timer/lm32_timer.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/memory.h
16
--- a/hw/timer/lm32_timer.c
20
+++ b/include/exec/memory.h
17
+++ b/hw/timer/lm32_timer.c
21
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_
18
@@ -XXX,XX +XXX,XX @@
22
* @addr: address within that address space
19
#include "hw/ptimer.h"
23
* @plen: pointer to length of buffer; updated on return
20
#include "hw/qdev-properties.h"
24
* @is_write: indicates the transfer direction
21
#include "qemu/error-report.h"
25
+ * @attrs: memory attributes
22
-#include "qemu/main-loop.h"
26
*/
23
#include "qemu/module.h"
27
void *address_space_map(AddressSpace *as, hwaddr addr,
24
28
- hwaddr *plen, bool is_write);
25
#define DEFAULT_FREQUENCY (50*1000000)
29
+ hwaddr *plen, bool is_write, MemTxAttrs attrs);
26
@@ -XXX,XX +XXX,XX @@ struct LM32TimerState {
30
27
31
/* address_space_unmap: Unmaps a memory region previously mapped by address_space_map()
28
MemoryRegion iomem;
32
*
29
33
diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
30
- QEMUBH *bh;
34
index XXXXXXX..XXXXXXX 100644
31
ptimer_state *ptimer;
35
--- a/include/sysemu/dma.h
32
36
+++ b/include/sysemu/dma.h
33
qemu_irq irq;
37
@@ -XXX,XX +XXX,XX @@ static inline void *dma_memory_map(AddressSpace *as,
34
@@ -XXX,XX +XXX,XX @@ static void timer_write(void *opaque, hwaddr addr,
38
hwaddr xlen = *len;
35
s->regs[R_SR] &= ~SR_TO;
39
void *p;
36
break;
40
37
case R_CR:
41
- p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE);
38
+ ptimer_transaction_begin(s->ptimer);
42
+ p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE,
39
s->regs[R_CR] = value;
43
+ MEMTXATTRS_UNSPECIFIED);
40
if (s->regs[R_CR] & CR_START) {
44
*len = xlen;
41
ptimer_run(s->ptimer, 1);
45
return p;
42
@@ -XXX,XX +XXX,XX @@ static void timer_write(void *opaque, hwaddr addr,
43
if (s->regs[R_CR] & CR_STOP) {
44
ptimer_stop(s->ptimer);
45
}
46
+ ptimer_transaction_commit(s->ptimer);
47
break;
48
case R_PERIOD:
49
s->regs[R_PERIOD] = value;
50
+ ptimer_transaction_begin(s->ptimer);
51
ptimer_set_count(s->ptimer, value);
52
+ ptimer_transaction_commit(s->ptimer);
53
break;
54
case R_SNAPSHOT:
55
error_report("lm32_timer: write access to read only register 0x"
56
@@ -XXX,XX +XXX,XX @@ static void timer_reset(DeviceState *d)
57
for (i = 0; i < R_MAX; i++) {
58
s->regs[i] = 0;
59
}
60
+ ptimer_transaction_begin(s->ptimer);
61
ptimer_stop(s->ptimer);
62
+ ptimer_transaction_commit(s->ptimer);
46
}
63
}
47
diff --git a/exec.c b/exec.c
64
48
index XXXXXXX..XXXXXXX 100644
65
static void lm32_timer_init(Object *obj)
49
--- a/exec.c
66
@@ -XXX,XX +XXX,XX @@ static void lm32_timer_realize(DeviceState *dev, Error **errp)
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
{
67
{
59
hwaddr len = *plen;
68
LM32TimerState *s = LM32_TIMER(dev);
60
hwaddr l, xlat;
69
61
@@ -XXX,XX +XXX,XX @@ void *cpu_physical_memory_map(hwaddr addr,
70
- s->bh = qemu_bh_new(timer_hit, s);
62
hwaddr *plen,
71
- s->ptimer = ptimer_init_with_bh(s->bh, PTIMER_POLICY_DEFAULT);
63
int is_write)
72
+ s->ptimer = ptimer_init(timer_hit, s, PTIMER_POLICY_DEFAULT);
64
{
73
65
- return address_space_map(&address_space_memory, addr, plen, is_write);
74
+ ptimer_transaction_begin(s->ptimer);
66
+ return address_space_map(&address_space_memory, addr, plen, is_write,
75
ptimer_set_freq(s->ptimer, s->freq_hz);
67
+ MEMTXATTRS_UNSPECIFIED);
76
+ ptimer_transaction_commit(s->ptimer);
68
}
77
}
69
78
70
void cpu_physical_memory_unmap(void *buffer, hwaddr len,
79
static const VMStateDescription vmstate_lm32_timer = {
71
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/ppc/mmu-hash64.c
74
+++ b/target/ppc/mmu-hash64.c
75
@@ -XXX,XX +XXX,XX @@ const ppc_hash_pte64_t *ppc_hash64_map_hptes(PowerPCCPU *cpu,
76
return NULL;
77
}
78
79
- hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false);
80
+ hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false,
81
+ MEMTXATTRS_UNSPECIFIED);
82
if (plen < (n * HASH_PTE_SIZE_64)) {
83
hw_error("%s: Unable to map all requested HPTEs\n", __func__);
84
}
85
--
80
--
86
2.17.1
81
2.20.1
87
82
88
83
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Switch the altera_timer code away from bottom-half based ptimers to
2
add MemTxAttrs as an argument to address_space_translate_iommu().
2
the new transaction-based ptimer API. This just requires adding
3
begin/commit calls around the various places that modify the ptimer
4
state, and using the new ptimer_init() function to create the timer.
3
5
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-14-peter.maydell@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-6-peter.maydell@linaro.org
8
---
10
---
9
exec.c | 8 +++++---
11
hw/timer/altera_timer.c | 13 +++++++++----
10
1 file changed, 5 insertions(+), 3 deletions(-)
12
1 file changed, 9 insertions(+), 4 deletions(-)
11
13
12
diff --git a/exec.c b/exec.c
14
diff --git a/hw/timer/altera_timer.c b/hw/timer/altera_timer.c
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
16
--- a/hw/timer/altera_timer.c
15
+++ b/exec.c
17
+++ b/hw/timer/altera_timer.c
16
@@ -XXX,XX +XXX,XX @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
18
@@ -XXX,XX +XXX,XX @@
17
* @is_write: whether the translation operation is for write
19
*/
18
* @is_mmio: whether this can be MMIO, set true if it can
20
19
* @target_as: the address space targeted by the IOMMU
21
#include "qemu/osdep.h"
20
+ * @attrs: transaction attributes
22
-#include "qemu/main-loop.h"
21
*
23
#include "qemu/module.h"
22
* This function is called from RCU critical section. It is the common
24
#include "qapi/error.h"
23
* part of flatview_do_translate and address_space_translate_cached.
25
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection address_space_translate_iommu(IOMMUMemoryRegion *iomm
26
@@ -XXX,XX +XXX,XX @@ typedef struct AlteraTimer {
25
hwaddr *page_mask_out,
27
MemoryRegion mmio;
26
bool is_write,
28
qemu_irq irq;
27
bool is_mmio,
29
uint32_t freq_hz;
28
- AddressSpace **target_as)
30
- QEMUBH *bh;
29
+ AddressSpace **target_as,
31
ptimer_state *ptimer;
30
+ MemTxAttrs attrs)
32
uint32_t regs[R_MAX];
33
} AlteraTimer;
34
@@ -XXX,XX +XXX,XX @@ static void timer_write(void *opaque, hwaddr addr,
35
break;
36
37
case R_CONTROL:
38
+ ptimer_transaction_begin(t->ptimer);
39
t->regs[R_CONTROL] = value & (CONTROL_ITO | CONTROL_CONT);
40
if ((value & CONTROL_START) &&
41
!(t->regs[R_STATUS] & STATUS_RUN)) {
42
@@ -XXX,XX +XXX,XX @@ static void timer_write(void *opaque, hwaddr addr,
43
ptimer_stop(t->ptimer);
44
t->regs[R_STATUS] &= ~STATUS_RUN;
45
}
46
+ ptimer_transaction_commit(t->ptimer);
47
break;
48
49
case R_PERIODL:
50
case R_PERIODH:
51
+ ptimer_transaction_begin(t->ptimer);
52
t->regs[addr] = value & 0xFFFF;
53
if (t->regs[R_STATUS] & STATUS_RUN) {
54
ptimer_stop(t->ptimer);
55
@@ -XXX,XX +XXX,XX @@ static void timer_write(void *opaque, hwaddr addr,
56
}
57
tvalue = (t->regs[R_PERIODH] << 16) | t->regs[R_PERIODL];
58
ptimer_set_limit(t->ptimer, tvalue + 1, 1);
59
+ ptimer_transaction_commit(t->ptimer);
60
break;
61
62
case R_SNAPL:
63
@@ -XXX,XX +XXX,XX @@ static void altera_timer_realize(DeviceState *dev, Error **errp)
64
return;
65
}
66
67
- t->bh = qemu_bh_new(timer_hit, t);
68
- t->ptimer = ptimer_init_with_bh(t->bh, PTIMER_POLICY_DEFAULT);
69
+ t->ptimer = ptimer_init(timer_hit, t, PTIMER_POLICY_DEFAULT);
70
+ ptimer_transaction_begin(t->ptimer);
71
ptimer_set_freq(t->ptimer, t->freq_hz);
72
+ ptimer_transaction_commit(t->ptimer);
73
74
memory_region_init_io(&t->mmio, OBJECT(t), &timer_ops, t,
75
TYPE_ALTERA_TIMER, R_MAX * sizeof(uint32_t));
76
@@ -XXX,XX +XXX,XX @@ static void altera_timer_reset(DeviceState *dev)
31
{
77
{
32
MemoryRegionSection *section;
78
AlteraTimer *t = ALTERA_TIMER(dev);
33
hwaddr page_mask = (hwaddr)-1;
79
34
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
80
+ ptimer_transaction_begin(t->ptimer);
35
return address_space_translate_iommu(iommu_mr, xlat,
81
ptimer_stop(t->ptimer);
36
plen_out, page_mask_out,
82
ptimer_set_limit(t->ptimer, 0xffffffff, 1);
37
is_write, is_mmio,
83
+ ptimer_transaction_commit(t->ptimer);
38
- target_as);
84
memset(t->regs, 0, sizeof(t->regs));
39
+ target_as, attrs);
40
}
41
if (page_mask_out) {
42
/* Not behind an IOMMU, use default page size. */
43
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate_cached(
44
45
section = address_space_translate_iommu(iommu_mr, xlat, plen,
46
NULL, is_write, true,
47
- &target_as);
48
+ &target_as, attrs);
49
return section.mr;
50
}
85
}
51
86
52
--
87
--
53
2.17.1
88
2.20.1
54
89
55
90
diff view generated by jsdifflib
1
The FRECPX instructions should (like most other floating point operations)
1
Switch the etraxfs_timer code away from bottom-half based ptimers to
2
honour the FPCR.FZ bit which specifies whether input denormals should
2
the new transaction-based ptimer API. This just requires adding
3
be flushed to zero (or FZ16 for the half-precision version).
3
begin/commit calls around the various places that modify the ptimer
4
We forgot to implement this, which doesn't affect the results (since
4
state, and using the new ptimer_init() function to create the timer.
5
the calculation doesn't actually care about the mantissa bits) but did
6
mean we were failing to set the FPSR.IDC bit.
7
5
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180521172712.19930-1-peter.maydell@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-7-peter.maydell@linaro.org
11
---
10
---
12
target/arm/helper-a64.c | 6 ++++++
11
hw/timer/etraxfs_timer.c | 23 +++++++++++++----------
13
1 file changed, 6 insertions(+)
12
1 file changed, 13 insertions(+), 10 deletions(-)
14
13
15
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
14
diff --git a/hw/timer/etraxfs_timer.c b/hw/timer/etraxfs_timer.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.c
16
--- a/hw/timer/etraxfs_timer.c
18
+++ b/target/arm/helper-a64.c
17
+++ b/hw/timer/etraxfs_timer.c
19
@@ -XXX,XX +XXX,XX @@ float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
18
@@ -XXX,XX +XXX,XX @@
20
return nan;
19
#include "hw/sysbus.h"
20
#include "sysemu/reset.h"
21
#include "sysemu/runstate.h"
22
-#include "qemu/main-loop.h"
23
#include "qemu/module.h"
24
#include "qemu/timer.h"
25
#include "hw/irq.h"
26
@@ -XXX,XX +XXX,XX @@ typedef struct ETRAXTimerState {
27
qemu_irq irq;
28
qemu_irq nmi;
29
30
- QEMUBH *bh_t0;
31
- QEMUBH *bh_t1;
32
- QEMUBH *bh_wd;
33
ptimer_state *ptimer_t0;
34
ptimer_state *ptimer_t1;
35
ptimer_state *ptimer_wd;
36
@@ -XXX,XX +XXX,XX @@ static void update_ctrl(ETRAXTimerState *t, int tnum)
21
}
37
}
22
38
23
+ a = float16_squash_input_denormal(a, fpst);
39
D(printf ("freq_hz=%d div=%d\n", freq_hz, div));
24
+
40
+ ptimer_transaction_begin(timer);
25
val16 = float16_val(a);
41
ptimer_set_freq(timer, freq_hz);
26
sbit = 0x8000 & val16;
42
ptimer_set_limit(timer, div, 0);
27
exp = extract32(val16, 10, 5);
43
28
@@ -XXX,XX +XXX,XX @@ float32 HELPER(frecpx_f32)(float32 a, void *fpstp)
44
@@ -XXX,XX +XXX,XX @@ static void update_ctrl(ETRAXTimerState *t, int tnum)
29
return nan;
45
abort();
46
break;
30
}
47
}
31
48
+ ptimer_transaction_commit(timer);
32
+ a = float32_squash_input_denormal(a, fpst);
49
}
33
+
50
34
val32 = float32_val(a);
51
static void timer_update_irq(ETRAXTimerState *t)
35
sbit = 0x80000000ULL & val32;
52
@@ -XXX,XX +XXX,XX @@ static inline void timer_watchdog_update(ETRAXTimerState *t, uint32_t value)
36
exp = extract32(val32, 23, 8);
53
37
@@ -XXX,XX +XXX,XX @@ float64 HELPER(frecpx_f64)(float64 a, void *fpstp)
54
t->wd_hits = 0;
38
return nan;
55
39
}
56
+ ptimer_transaction_begin(t->ptimer_wd);
40
57
ptimer_set_freq(t->ptimer_wd, 760);
41
+ a = float64_squash_input_denormal(a, fpst);
58
if (wd_cnt == 0)
42
+
59
wd_cnt = 256;
43
val64 = float64_val(a);
60
@@ -XXX,XX +XXX,XX @@ static inline void timer_watchdog_update(ETRAXTimerState *t, uint32_t value)
44
sbit = 0x8000000000000000ULL & val64;
61
ptimer_stop(t->ptimer_wd);
45
exp = extract64(float64_val(a), 52, 11);
62
63
t->rw_wd_ctrl = value;
64
+ ptimer_transaction_commit(t->ptimer_wd);
65
}
66
67
static void
68
@@ -XXX,XX +XXX,XX @@ static void etraxfs_timer_reset(void *opaque)
69
{
70
ETRAXTimerState *t = opaque;
71
72
+ ptimer_transaction_begin(t->ptimer_t0);
73
ptimer_stop(t->ptimer_t0);
74
+ ptimer_transaction_commit(t->ptimer_t0);
75
+ ptimer_transaction_begin(t->ptimer_t1);
76
ptimer_stop(t->ptimer_t1);
77
+ ptimer_transaction_commit(t->ptimer_t1);
78
+ ptimer_transaction_begin(t->ptimer_wd);
79
ptimer_stop(t->ptimer_wd);
80
+ ptimer_transaction_commit(t->ptimer_wd);
81
t->rw_wd_ctrl = 0;
82
t->r_intr = 0;
83
t->rw_intr_mask = 0;
84
@@ -XXX,XX +XXX,XX @@ static void etraxfs_timer_realize(DeviceState *dev, Error **errp)
85
ETRAXTimerState *t = ETRAX_TIMER(dev);
86
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
87
88
- t->bh_t0 = qemu_bh_new(timer0_hit, t);
89
- t->bh_t1 = qemu_bh_new(timer1_hit, t);
90
- t->bh_wd = qemu_bh_new(watchdog_hit, t);
91
- t->ptimer_t0 = ptimer_init_with_bh(t->bh_t0, PTIMER_POLICY_DEFAULT);
92
- t->ptimer_t1 = ptimer_init_with_bh(t->bh_t1, PTIMER_POLICY_DEFAULT);
93
- t->ptimer_wd = ptimer_init_with_bh(t->bh_wd, PTIMER_POLICY_DEFAULT);
94
+ t->ptimer_t0 = ptimer_init(timer0_hit, t, PTIMER_POLICY_DEFAULT);
95
+ t->ptimer_t1 = ptimer_init(timer1_hit, t, PTIMER_POLICY_DEFAULT);
96
+ t->ptimer_wd = ptimer_init(watchdog_hit, t, PTIMER_POLICY_DEFAULT);
97
98
sysbus_init_irq(sbd, &t->irq);
99
sysbus_init_irq(sbd, &t->nmi);
46
--
100
--
47
2.17.1
101
2.20.1
48
102
49
103
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
Switch the mcf5208 code away from bottom-half based ptimers to
2
add MemTxAttrs as an argument to flatview_extend_translation().
2
the new transaction-based ptimer API. This just requires adding
3
Its callers either have an attrs value to hand, or don't care
3
begin/commit calls around the various places that modify the ptimer
4
and can use MEMTXATTRS_UNSPECIFIED.
4
state, and using the new ptimer_init() function to create the timer.
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: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Tested-by: Thomas Huth <huth@tuxfamily.org>
10
Message-id: 20191017132905.5604-9-peter.maydell@linaro.org
10
---
11
---
11
exec.c | 15 ++++++++++-----
12
hw/m68k/mcf5208.c | 9 +++++----
12
1 file changed, 10 insertions(+), 5 deletions(-)
13
1 file changed, 5 insertions(+), 4 deletions(-)
13
14
14
diff --git a/exec.c b/exec.c
15
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
17
--- a/hw/m68k/mcf5208.c
17
+++ b/exec.c
18
+++ b/hw/m68k/mcf5208.c
18
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
19
@@ -XXX,XX +XXX,XX @@
19
20
#include "qemu/osdep.h"
20
static hwaddr
21
#include "qemu/units.h"
21
flatview_extend_translation(FlatView *fv, hwaddr addr,
22
#include "qemu/error-report.h"
22
- hwaddr target_len,
23
-#include "qemu/main-loop.h"
23
- MemoryRegion *mr, hwaddr base, hwaddr len,
24
#include "qapi/error.h"
24
- bool is_write)
25
#include "qemu-common.h"
25
+ hwaddr target_len,
26
#include "cpu.h"
26
+ MemoryRegion *mr, hwaddr base, hwaddr len,
27
@@ -XXX,XX +XXX,XX @@ static void m5208_timer_write(void *opaque, hwaddr offset,
27
+ bool is_write, MemTxAttrs attrs)
28
return;
29
}
30
31
+ ptimer_transaction_begin(s->timer);
32
if (s->pcsr & PCSR_EN)
33
ptimer_stop(s->timer);
34
35
@@ -XXX,XX +XXX,XX @@ static void m5208_timer_write(void *opaque, hwaddr offset,
36
37
if (s->pcsr & PCSR_EN)
38
ptimer_run(s->timer, 0);
39
+ ptimer_transaction_commit(s->timer);
40
break;
41
case 2:
42
+ ptimer_transaction_begin(s->timer);
43
s->pmr = value;
44
s->pcsr &= ~PCSR_PIF;
45
if ((s->pcsr & PCSR_RLD) == 0) {
46
@@ -XXX,XX +XXX,XX @@ static void m5208_timer_write(void *opaque, hwaddr offset,
47
} else {
48
ptimer_set_limit(s->timer, value, s->pcsr & PCSR_OVW);
49
}
50
+ ptimer_transaction_commit(s->timer);
51
break;
52
case 4:
53
break;
54
@@ -XXX,XX +XXX,XX @@ static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic)
28
{
55
{
29
hwaddr done = 0;
56
MemoryRegion *iomem = g_new(MemoryRegion, 1);
30
hwaddr xlat;
57
m5208_timer_state *s;
31
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
58
- QEMUBH *bh;
32
59
int i;
33
memory_region_ref(mr);
60
34
*plen = flatview_extend_translation(fv, addr, len, mr, xlat,
61
/* SDRAMC. */
35
- l, is_write);
62
@@ -XXX,XX +XXX,XX @@ static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic)
36
+ l, is_write, attrs);
63
/* Timers. */
37
ptr = qemu_ram_ptr_length(mr->ram_block, xlat, plen, true);
64
for (i = 0; i < 2; i++) {
38
rcu_read_unlock();
65
s = g_new0(m5208_timer_state, 1);
39
66
- bh = qemu_bh_new(m5208_timer_trigger, s);
40
@@ -XXX,XX +XXX,XX @@ int64_t address_space_cache_init(MemoryRegionCache *cache,
67
- s->timer = ptimer_init_with_bh(bh, PTIMER_POLICY_DEFAULT);
41
mr = cache->mrs.mr;
68
+ s->timer = ptimer_init(m5208_timer_trigger, s, PTIMER_POLICY_DEFAULT);
42
memory_region_ref(mr);
69
memory_region_init_io(&s->iomem, NULL, &m5208_timer_ops, s,
43
if (memory_access_is_direct(mr, is_write)) {
70
"m5208-timer", 0x00004000);
44
+ /* We don't care about the memory attributes here as we're only
71
memory_region_add_subregion(address_space, 0xfc080000 + 0x4000 * i,
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
--
72
--
56
2.17.1
73
2.20.1
57
74
58
75
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Create a function to compute the values of the TBFLAG_ANY bits
4
that will be cached. For now, the env->hflags variable is not
5
used, and the results are fed back to cpu_get_tb_cpu_state.
6
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20191018174431.1784-2-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 29 ++++++++++++++++++-----------
13
target/arm/helper.c | 26 +++++++++++++++++++-------
14
2 files changed, 37 insertions(+), 18 deletions(-)
15
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
19
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
21
uint32_t pstate;
22
uint32_t aarch64; /* 1 if CPU is in aarch64 state; inverse of PSTATE.nRW */
23
24
+ /* Cached TBFLAGS state. See below for which bits are included. */
25
+ uint32_t hflags;
26
+
27
/* Frequently accessed CPSR bits are stored separately for efficiency.
28
This contains all the other bits. Use cpsr_{read,write} to access
29
the whole CPSR. */
30
@@ -XXX,XX +XXX,XX @@ typedef ARMCPU ArchCPU;
31
32
#include "exec/cpu-all.h"
33
34
-/* Bit usage in the TB flags field: bit 31 indicates whether we are
35
+/*
36
+ * Bit usage in the TB flags field: bit 31 indicates whether we are
37
* in 32 or 64 bit mode. The meaning of the other bits depends on that.
38
* We put flags which are shared between 32 and 64 bit mode at the top
39
* of the word, and flags which apply to only one mode at the bottom.
40
+ *
41
+ * Unless otherwise noted, these bits are cached in env->hflags.
42
*/
43
FIELD(TBFLAG_ANY, AARCH64_STATE, 31, 1)
44
FIELD(TBFLAG_ANY, MMUIDX, 28, 3)
45
FIELD(TBFLAG_ANY, SS_ACTIVE, 27, 1)
46
-FIELD(TBFLAG_ANY, PSTATE_SS, 26, 1)
47
+FIELD(TBFLAG_ANY, PSTATE_SS, 26, 1) /* Not cached. */
48
/* Target EL if we take a floating-point-disabled exception */
49
FIELD(TBFLAG_ANY, FPEXC_EL, 24, 2)
50
FIELD(TBFLAG_ANY, BE_DATA, 23, 1)
51
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_ANY, BE_DATA, 23, 1)
52
FIELD(TBFLAG_ANY, DEBUG_TARGET_EL, 21, 2)
53
54
/* Bit usage when in AArch32 state: */
55
-FIELD(TBFLAG_A32, THUMB, 0, 1)
56
-FIELD(TBFLAG_A32, VECLEN, 1, 3)
57
-FIELD(TBFLAG_A32, VECSTRIDE, 4, 2)
58
+FIELD(TBFLAG_A32, THUMB, 0, 1) /* Not cached. */
59
+FIELD(TBFLAG_A32, VECLEN, 1, 3) /* Not cached. */
60
+FIELD(TBFLAG_A32, VECSTRIDE, 4, 2) /* Not cached. */
61
/*
62
* We store the bottom two bits of the CPAR as TB flags and handle
63
* checks on the other bits at runtime. This shares the same bits as
64
* VECSTRIDE, which is OK as no XScale CPU has VFP.
65
+ * Not cached, because VECLEN+VECSTRIDE are not cached.
66
*/
67
FIELD(TBFLAG_A32, XSCALE_CPAR, 4, 2)
68
/*
69
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_A32, XSCALE_CPAR, 4, 2)
70
* the same thing as the current security state of the processor!
71
*/
72
FIELD(TBFLAG_A32, NS, 6, 1)
73
-FIELD(TBFLAG_A32, VFPEN, 7, 1)
74
-FIELD(TBFLAG_A32, CONDEXEC, 8, 8)
75
+FIELD(TBFLAG_A32, VFPEN, 7, 1) /* Not cached. */
76
+FIELD(TBFLAG_A32, CONDEXEC, 8, 8) /* Not cached. */
77
FIELD(TBFLAG_A32, SCTLR_B, 16, 1)
78
/* For M profile only, set if FPCCR.LSPACT is set */
79
-FIELD(TBFLAG_A32, LSPACT, 18, 1)
80
+FIELD(TBFLAG_A32, LSPACT, 18, 1) /* Not cached. */
81
/* For M profile only, set if we must create a new FP context */
82
-FIELD(TBFLAG_A32, NEW_FP_CTXT_NEEDED, 19, 1)
83
+FIELD(TBFLAG_A32, NEW_FP_CTXT_NEEDED, 19, 1) /* Not cached. */
84
/* For M profile only, set if FPCCR.S does not match current security state */
85
-FIELD(TBFLAG_A32, FPCCR_S_WRONG, 20, 1)
86
+FIELD(TBFLAG_A32, FPCCR_S_WRONG, 20, 1) /* Not cached. */
87
/* For M profile only, Handler (ie not Thread) mode */
88
FIELD(TBFLAG_A32, HANDLER, 21, 1)
89
/* For M profile only, whether we should generate stack-limit checks */
90
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_A64, SVEEXC_EL, 2, 2)
91
FIELD(TBFLAG_A64, ZCR_LEN, 4, 4)
92
FIELD(TBFLAG_A64, PAUTH_ACTIVE, 8, 1)
93
FIELD(TBFLAG_A64, BT, 9, 1)
94
-FIELD(TBFLAG_A64, BTYPE, 10, 2)
95
+FIELD(TBFLAG_A64, BTYPE, 10, 2) /* Not cached. */
96
FIELD(TBFLAG_A64, TBID, 12, 2)
97
98
static inline bool bswap_code(bool sctlr_b)
99
diff --git a/target/arm/helper.c b/target/arm/helper.c
100
index XXXXXXX..XXXXXXX 100644
101
--- a/target/arm/helper.c
102
+++ b/target/arm/helper.c
103
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_stage1_mmu_idx(CPUARMState *env)
104
}
105
#endif
106
107
+static uint32_t rebuild_hflags_common(CPUARMState *env, int fp_el,
108
+ ARMMMUIdx mmu_idx, uint32_t flags)
109
+{
110
+ flags = FIELD_DP32(flags, TBFLAG_ANY, FPEXC_EL, fp_el);
111
+ flags = FIELD_DP32(flags, TBFLAG_ANY, MMUIDX,
112
+ arm_to_core_mmu_idx(mmu_idx));
113
+
114
+ if (arm_cpu_data_is_big_endian(env)) {
115
+ flags = FIELD_DP32(flags, TBFLAG_ANY, BE_DATA, 1);
116
+ }
117
+ if (arm_singlestep_active(env)) {
118
+ flags = FIELD_DP32(flags, TBFLAG_ANY, SS_ACTIVE, 1);
119
+ }
120
+ return flags;
121
+}
122
+
123
void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
124
target_ulong *cs_base, uint32_t *pflags)
125
{
126
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
127
}
128
}
129
130
- flags = FIELD_DP32(flags, TBFLAG_ANY, MMUIDX, arm_to_core_mmu_idx(mmu_idx));
131
+ flags = rebuild_hflags_common(env, fp_el, mmu_idx, flags);
132
133
/* The SS_ACTIVE and PSTATE_SS bits correspond to the state machine
134
* states defined in the ARM ARM for software singlestep:
135
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
136
* 0 x Inactive (the TB flag for SS is always 0)
137
* 1 0 Active-pending
138
* 1 1 Active-not-pending
139
+ * SS_ACTIVE is set in hflags; PSTATE_SS is computed every TB.
140
*/
141
- if (arm_singlestep_active(env)) {
142
- flags = FIELD_DP32(flags, TBFLAG_ANY, SS_ACTIVE, 1);
143
+ if (FIELD_EX32(flags, TBFLAG_ANY, SS_ACTIVE)) {
144
if (is_a64(env)) {
145
if (env->pstate & PSTATE_SS) {
146
flags = FIELD_DP32(flags, TBFLAG_ANY, PSTATE_SS, 1);
147
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
148
}
149
}
150
}
151
- if (arm_cpu_data_is_big_endian(env)) {
152
- flags = FIELD_DP32(flags, TBFLAG_ANY, BE_DATA, 1);
153
- }
154
- flags = FIELD_DP32(flags, TBFLAG_ANY, FPEXC_EL, fp_el);
155
156
if (arm_v7m_is_handler_mode(env)) {
157
flags = FIELD_DP32(flags, TBFLAG_A32, HANDLER, 1);
158
--
159
2.20.1
160
161
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Create a function to compute the values of the TBFLAG_A64 bits
4
that will be cached. For now, the env->hflags variable is not
5
used, and the results are fed back to cpu_get_tb_cpu_state.
6
7
Note that not all BTI related flags are cached, so we have to
8
test the BTI feature twice -- once for those bits moved out to
9
rebuild_hflags_a64 and once for those bits that remain in
10
cpu_get_tb_cpu_state.
11
12
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20191018174431.1784-3-richard.henderson@linaro.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
target/arm/helper.c | 131 +++++++++++++++++++++++---------------------
18
1 file changed, 69 insertions(+), 62 deletions(-)
19
20
diff --git a/target/arm/helper.c b/target/arm/helper.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/helper.c
23
+++ b/target/arm/helper.c
24
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_common(CPUARMState *env, int fp_el,
25
return flags;
26
}
27
28
+static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
29
+ ARMMMUIdx mmu_idx)
30
+{
31
+ ARMMMUIdx stage1 = stage_1_mmu_idx(mmu_idx);
32
+ ARMVAParameters p0 = aa64_va_parameters_both(env, 0, stage1);
33
+ uint32_t flags = 0;
34
+ uint64_t sctlr;
35
+ int tbii, tbid;
36
+
37
+ flags = FIELD_DP32(flags, TBFLAG_ANY, AARCH64_STATE, 1);
38
+
39
+ /* FIXME: ARMv8.1-VHE S2 translation regime. */
40
+ if (regime_el(env, stage1) < 2) {
41
+ ARMVAParameters p1 = aa64_va_parameters_both(env, -1, stage1);
42
+ tbid = (p1.tbi << 1) | p0.tbi;
43
+ tbii = tbid & ~((p1.tbid << 1) | p0.tbid);
44
+ } else {
45
+ tbid = p0.tbi;
46
+ tbii = tbid & !p0.tbid;
47
+ }
48
+
49
+ flags = FIELD_DP32(flags, TBFLAG_A64, TBII, tbii);
50
+ flags = FIELD_DP32(flags, TBFLAG_A64, TBID, tbid);
51
+
52
+ if (cpu_isar_feature(aa64_sve, env_archcpu(env))) {
53
+ int sve_el = sve_exception_el(env, el);
54
+ uint32_t zcr_len;
55
+
56
+ /*
57
+ * If SVE is disabled, but FP is enabled,
58
+ * then the effective len is 0.
59
+ */
60
+ if (sve_el != 0 && fp_el == 0) {
61
+ zcr_len = 0;
62
+ } else {
63
+ zcr_len = sve_zcr_len_for_el(env, el);
64
+ }
65
+ flags = FIELD_DP32(flags, TBFLAG_A64, SVEEXC_EL, sve_el);
66
+ flags = FIELD_DP32(flags, TBFLAG_A64, ZCR_LEN, zcr_len);
67
+ }
68
+
69
+ sctlr = arm_sctlr(env, el);
70
+
71
+ if (cpu_isar_feature(aa64_pauth, env_archcpu(env))) {
72
+ /*
73
+ * In order to save space in flags, we record only whether
74
+ * pauth is "inactive", meaning all insns are implemented as
75
+ * a nop, or "active" when some action must be performed.
76
+ * The decision of which action to take is left to a helper.
77
+ */
78
+ if (sctlr & (SCTLR_EnIA | SCTLR_EnIB | SCTLR_EnDA | SCTLR_EnDB)) {
79
+ flags = FIELD_DP32(flags, TBFLAG_A64, PAUTH_ACTIVE, 1);
80
+ }
81
+ }
82
+
83
+ if (cpu_isar_feature(aa64_bti, env_archcpu(env))) {
84
+ /* Note that SCTLR_EL[23].BT == SCTLR_BT1. */
85
+ if (sctlr & (el == 0 ? SCTLR_BT0 : SCTLR_BT1)) {
86
+ flags = FIELD_DP32(flags, TBFLAG_A64, BT, 1);
87
+ }
88
+ }
89
+
90
+ return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
91
+}
92
+
93
void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
94
target_ulong *cs_base, uint32_t *pflags)
95
{
96
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
97
uint32_t flags = 0;
98
99
if (is_a64(env)) {
100
- ARMCPU *cpu = env_archcpu(env);
101
- uint64_t sctlr;
102
-
103
*pc = env->pc;
104
- flags = FIELD_DP32(flags, TBFLAG_ANY, AARCH64_STATE, 1);
105
-
106
- /* Get control bits for tagged addresses. */
107
- {
108
- ARMMMUIdx stage1 = stage_1_mmu_idx(mmu_idx);
109
- ARMVAParameters p0 = aa64_va_parameters_both(env, 0, stage1);
110
- int tbii, tbid;
111
-
112
- /* FIXME: ARMv8.1-VHE S2 translation regime. */
113
- if (regime_el(env, stage1) < 2) {
114
- ARMVAParameters p1 = aa64_va_parameters_both(env, -1, stage1);
115
- tbid = (p1.tbi << 1) | p0.tbi;
116
- tbii = tbid & ~((p1.tbid << 1) | p0.tbid);
117
- } else {
118
- tbid = p0.tbi;
119
- tbii = tbid & !p0.tbid;
120
- }
121
-
122
- flags = FIELD_DP32(flags, TBFLAG_A64, TBII, tbii);
123
- flags = FIELD_DP32(flags, TBFLAG_A64, TBID, tbid);
124
- }
125
-
126
- if (cpu_isar_feature(aa64_sve, cpu)) {
127
- int sve_el = sve_exception_el(env, current_el);
128
- uint32_t zcr_len;
129
-
130
- /* If SVE is disabled, but FP is enabled,
131
- * then the effective len is 0.
132
- */
133
- if (sve_el != 0 && fp_el == 0) {
134
- zcr_len = 0;
135
- } else {
136
- zcr_len = sve_zcr_len_for_el(env, current_el);
137
- }
138
- flags = FIELD_DP32(flags, TBFLAG_A64, SVEEXC_EL, sve_el);
139
- flags = FIELD_DP32(flags, TBFLAG_A64, ZCR_LEN, zcr_len);
140
- }
141
-
142
- sctlr = arm_sctlr(env, current_el);
143
-
144
- if (cpu_isar_feature(aa64_pauth, cpu)) {
145
- /*
146
- * In order to save space in flags, we record only whether
147
- * pauth is "inactive", meaning all insns are implemented as
148
- * a nop, or "active" when some action must be performed.
149
- * The decision of which action to take is left to a helper.
150
- */
151
- if (sctlr & (SCTLR_EnIA | SCTLR_EnIB | SCTLR_EnDA | SCTLR_EnDB)) {
152
- flags = FIELD_DP32(flags, TBFLAG_A64, PAUTH_ACTIVE, 1);
153
- }
154
- }
155
-
156
- if (cpu_isar_feature(aa64_bti, cpu)) {
157
- /* Note that SCTLR_EL[23].BT == SCTLR_BT1. */
158
- if (sctlr & (current_el == 0 ? SCTLR_BT0 : SCTLR_BT1)) {
159
- flags = FIELD_DP32(flags, TBFLAG_A64, BT, 1);
160
- }
161
+ flags = rebuild_hflags_a64(env, current_el, fp_el, mmu_idx);
162
+ if (cpu_isar_feature(aa64_bti, env_archcpu(env))) {
163
flags = FIELD_DP32(flags, TBFLAG_A64, BTYPE, env->btype);
164
}
165
} else {
166
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
167
flags = FIELD_DP32(flags, TBFLAG_A32,
168
XSCALE_CPAR, env->cp15.c15_cpar);
169
}
170
- }
171
172
- flags = rebuild_hflags_common(env, fp_el, mmu_idx, flags);
173
+ flags = rebuild_hflags_common(env, fp_el, mmu_idx, flags);
174
+ }
175
176
/* The SS_ACTIVE and PSTATE_SS bits correspond to the state machine
177
* states defined in the ARM ARM for software singlestep:
178
--
179
2.20.1
180
181
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Create a function to compute the values of the TBFLAG_A32 bits
4
that will be cached, and are used by all profiles.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20191018174431.1784-4-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.c | 16 +++++++++++-----
12
1 file changed, 11 insertions(+), 5 deletions(-)
13
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_common(CPUARMState *env, int fp_el,
19
return flags;
20
}
21
22
+static uint32_t rebuild_hflags_common_32(CPUARMState *env, int fp_el,
23
+ ARMMMUIdx mmu_idx, uint32_t flags)
24
+{
25
+ flags = FIELD_DP32(flags, TBFLAG_A32, SCTLR_B, arm_sctlr_b(env));
26
+ flags = FIELD_DP32(flags, TBFLAG_A32, NS, !access_secure_reg(env));
27
+
28
+ return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
29
+}
30
+
31
static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
32
ARMMMUIdx mmu_idx)
33
{
34
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
35
ARMMMUIdx mmu_idx = arm_mmu_idx(env);
36
int current_el = arm_current_el(env);
37
int fp_el = fp_exception_el(env, current_el);
38
- uint32_t flags = 0;
39
+ uint32_t flags;
40
41
if (is_a64(env)) {
42
*pc = env->pc;
43
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
44
}
45
} else {
46
*pc = env->regs[15];
47
+ flags = rebuild_hflags_common_32(env, fp_el, mmu_idx, 0);
48
flags = FIELD_DP32(flags, TBFLAG_A32, THUMB, env->thumb);
49
flags = FIELD_DP32(flags, TBFLAG_A32, VECLEN, env->vfp.vec_len);
50
flags = FIELD_DP32(flags, TBFLAG_A32, VECSTRIDE, env->vfp.vec_stride);
51
flags = FIELD_DP32(flags, TBFLAG_A32, CONDEXEC, env->condexec_bits);
52
- flags = FIELD_DP32(flags, TBFLAG_A32, SCTLR_B, arm_sctlr_b(env));
53
- flags = FIELD_DP32(flags, TBFLAG_A32, NS, !access_secure_reg(env));
54
if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)
55
|| arm_el_is_aa64(env, 1) || arm_feature(env, ARM_FEATURE_M)) {
56
flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
57
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
58
flags = FIELD_DP32(flags, TBFLAG_A32,
59
XSCALE_CPAR, env->cp15.c15_cpar);
60
}
61
-
62
- flags = rebuild_hflags_common(env, fp_el, mmu_idx, flags);
63
}
64
65
/* The SS_ACTIVE and PSTATE_SS bits correspond to the state machine
66
--
67
2.20.1
68
69
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to tb_invalidate_phys_addr().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Set TBFLAG_ANY.BE_DATA in rebuild_hflags_common_32 and
4
rebuild_hflags_a64 instead of rebuild_hflags_common, where we do
5
not need to re-test is_a64() nor re-compute the various inputs.
6
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20191018174431.1784-5-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20180521140402.23318-3-peter.maydell@linaro.org
10
---
11
---
11
include/exec/exec-all.h | 5 +++--
12
target/arm/cpu.h | 49 +++++++++++++++++++++++++++------------------
12
accel/tcg/translate-all.c | 2 +-
13
target/arm/helper.c | 16 +++++++++++----
13
exec.c | 2 +-
14
2 files changed, 42 insertions(+), 23 deletions(-)
14
target/xtensa/op_helper.c | 3 ++-
15
4 files changed, 7 insertions(+), 5 deletions(-)
16
15
17
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/exec-all.h
18
--- a/target/arm/cpu.h
20
+++ b/include/exec/exec-all.h
19
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
20
@@ -XXX,XX +XXX,XX @@ static inline uint64_t arm_sctlr(CPUARMState *env, int el)
22
void tlb_set_page(CPUState *cpu, target_ulong vaddr,
23
hwaddr paddr, int prot,
24
int mmu_idx, target_ulong size);
25
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
26
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs);
27
void probe_write(CPUArchState *env, target_ulong addr, int size, int mmu_idx,
28
uintptr_t retaddr);
29
#else
30
@@ -XXX,XX +XXX,XX @@ static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
31
uint16_t idxmap)
32
{
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
}
21
}
64
}
22
}
65
#endif
23
66
diff --git a/target/xtensa/op_helper.c b/target/xtensa/op_helper.c
24
+static inline bool arm_cpu_data_is_big_endian_a32(CPUARMState *env,
67
index XXXXXXX..XXXXXXX 100644
25
+ bool sctlr_b)
68
--- a/target/xtensa/op_helper.c
26
+{
69
+++ b/target/xtensa/op_helper.c
27
+#ifdef CONFIG_USER_ONLY
70
@@ -XXX,XX +XXX,XX @@ static void tb_invalidate_virtual_addr(CPUXtensaState *env, uint32_t vaddr)
28
+ /*
71
int ret = xtensa_get_physical_addr(env, false, vaddr, 2, 0,
29
+ * In system mode, BE32 is modelled in line with the
72
&paddr, &page_size, &access);
30
+ * architecture (as word-invariant big-endianness), where loads
73
if (ret == 0) {
31
+ * and stores are done little endian but from addresses which
74
- tb_invalidate_phys_addr(&address_space_memory, paddr);
32
+ * are adjusted by XORing with the appropriate constant. So the
75
+ tb_invalidate_phys_addr(&address_space_memory, paddr,
33
+ * endianness to use for the raw data access is not affected by
76
+ MEMTXATTRS_UNSPECIFIED);
34
+ * SCTLR.B.
35
+ * In user mode, however, we model BE32 as byte-invariant
36
+ * big-endianness (because user-only code cannot tell the
37
+ * difference), and so we need to use a data access endianness
38
+ * that depends on SCTLR.B.
39
+ */
40
+ if (sctlr_b) {
41
+ return true;
42
+ }
43
+#endif
44
+ /* In 32bit endianness is determined by looking at CPSR's E bit */
45
+ return env->uncached_cpsr & CPSR_E;
46
+}
47
+
48
+static inline bool arm_cpu_data_is_big_endian_a64(int el, uint64_t sctlr)
49
+{
50
+ return sctlr & (el ? SCTLR_EE : SCTLR_E0E);
51
+}
52
53
/* Return true if the processor is in big-endian mode. */
54
static inline bool arm_cpu_data_is_big_endian(CPUARMState *env)
55
{
56
- /* In 32bit endianness is determined by looking at CPSR's E bit */
57
if (!is_a64(env)) {
58
- return
59
-#ifdef CONFIG_USER_ONLY
60
- /* In system mode, BE32 is modelled in line with the
61
- * architecture (as word-invariant big-endianness), where loads
62
- * and stores are done little endian but from addresses which
63
- * are adjusted by XORing with the appropriate constant. So the
64
- * endianness to use for the raw data access is not affected by
65
- * SCTLR.B.
66
- * In user mode, however, we model BE32 as byte-invariant
67
- * big-endianness (because user-only code cannot tell the
68
- * difference), and so we need to use a data access endianness
69
- * that depends on SCTLR.B.
70
- */
71
- arm_sctlr_b(env) ||
72
-#endif
73
- ((env->uncached_cpsr & CPSR_E) ? 1 : 0);
74
+ return arm_cpu_data_is_big_endian_a32(env, arm_sctlr_b(env));
75
} else {
76
int cur_el = arm_current_el(env);
77
uint64_t sctlr = arm_sctlr(env, cur_el);
78
-
79
- return (sctlr & (cur_el ? SCTLR_EE : SCTLR_E0E)) != 0;
80
+ return arm_cpu_data_is_big_endian_a64(cur_el, sctlr);
77
}
81
}
78
}
82
}
79
83
84
diff --git a/target/arm/helper.c b/target/arm/helper.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/target/arm/helper.c
87
+++ b/target/arm/helper.c
88
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_common(CPUARMState *env, int fp_el,
89
flags = FIELD_DP32(flags, TBFLAG_ANY, MMUIDX,
90
arm_to_core_mmu_idx(mmu_idx));
91
92
- if (arm_cpu_data_is_big_endian(env)) {
93
- flags = FIELD_DP32(flags, TBFLAG_ANY, BE_DATA, 1);
94
- }
95
if (arm_singlestep_active(env)) {
96
flags = FIELD_DP32(flags, TBFLAG_ANY, SS_ACTIVE, 1);
97
}
98
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_common(CPUARMState *env, int fp_el,
99
static uint32_t rebuild_hflags_common_32(CPUARMState *env, int fp_el,
100
ARMMMUIdx mmu_idx, uint32_t flags)
101
{
102
- flags = FIELD_DP32(flags, TBFLAG_A32, SCTLR_B, arm_sctlr_b(env));
103
+ bool sctlr_b = arm_sctlr_b(env);
104
+
105
+ if (sctlr_b) {
106
+ flags = FIELD_DP32(flags, TBFLAG_A32, SCTLR_B, 1);
107
+ }
108
+ if (arm_cpu_data_is_big_endian_a32(env, sctlr_b)) {
109
+ flags = FIELD_DP32(flags, TBFLAG_ANY, BE_DATA, 1);
110
+ }
111
flags = FIELD_DP32(flags, TBFLAG_A32, NS, !access_secure_reg(env));
112
113
return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
114
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
115
116
sctlr = arm_sctlr(env, el);
117
118
+ if (arm_cpu_data_is_big_endian_a64(el, sctlr)) {
119
+ flags = FIELD_DP32(flags, TBFLAG_ANY, BE_DATA, 1);
120
+ }
121
+
122
if (cpu_isar_feature(aa64_pauth, env_archcpu(env))) {
123
/*
124
* In order to save space in flags, we record only whether
80
--
125
--
81
2.17.1
126
2.20.1
82
127
83
128
diff view generated by jsdifflib
1
From: Igor Mammedov <imammedo@redhat.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
When QEMU is started with following CLI
3
Create a function to compute the values of the TBFLAG_A32 bits
4
-machine virt,gic-version=3,accel=kvm -cpu host -bios AAVMF_CODE.fd
4
that will be cached, and are used by M-profile.
5
it crashes with abort at
6
accel/kvm/kvm-all.c:2164:
7
KVM_SET_DEVICE_ATTR failed: Group 6 attr 0x000000000000c665: Invalid argument
8
5
9
Which is caused by implicit dependency of kvm_arm_gicv3_reset() on
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
arm_gicv3_icc_reset() where the later is called by CPU reset
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
reset callback.
8
Message-id: 20191018174431.1784-6-richard.henderson@linaro.org
12
13
However commit:
14
3b77f6c arm/boot: split load_dtb() from arm_load_kernel()
15
broke CPU reset callback registration in case
16
17
arm_load_kernel()
18
...
19
if (!info->kernel_filename || info->firmware_loaded)
20
21
branch is taken, i.e. it's sufficient to provide a firmware
22
or do not provide kernel on CLI to skip cpu reset callback
23
registration, where before offending commit the callback
24
has been registered unconditionally.
25
26
Fix it by registering the callback right at the beginning of
27
arm_load_kernel() unconditionally instead of doing it at the end.
28
29
NOTE:
30
we probably should eliminate that dependency anyways as well as
31
separate arch CPU reset parts from arm_load_kernel() into CPU
32
itself, but that refactoring that I probably would have to do
33
anyways later for CPU hotplug to work.
34
35
Reported-by: Auger Eric <eric.auger@redhat.com>
36
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
37
Reviewed-by: Eric Auger <eric.auger@redhat.com>
38
Tested-by: Eric Auger <eric.auger@redhat.com>
39
Message-id: 1527070950-208350-1-git-send-email-imammedo@redhat.com
40
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
42
---
10
---
43
hw/arm/boot.c | 18 +++++++++---------
11
target/arm/helper.c | 45 ++++++++++++++++++++++++++++++---------------
44
1 file changed, 9 insertions(+), 9 deletions(-)
12
1 file changed, 30 insertions(+), 15 deletions(-)
45
13
46
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
47
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/boot.c
16
--- a/target/arm/helper.c
49
+++ b/hw/arm/boot.c
17
+++ b/target/arm/helper.c
50
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
18
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_common_32(CPUARMState *env, int fp_el,
51
static const ARMInsnFixup *primary_loader;
19
return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
52
AddressSpace *as = arm_boot_address_space(cpu, info);
20
}
53
21
54
+ /* CPU objects (unlike devices) are not automatically reset on system
22
+static uint32_t rebuild_hflags_m32(CPUARMState *env, int fp_el,
55
+ * reset, so we must always register a handler to do so. If we're
23
+ ARMMMUIdx mmu_idx)
56
+ * actually loading a kernel, the handler is also responsible for
24
+{
57
+ * arranging that we start it correctly.
25
+ uint32_t flags = 0;
58
+ */
26
+
59
+ for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
27
+ if (arm_v7m_is_handler_mode(env)) {
60
+ qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
28
+ flags = FIELD_DP32(flags, TBFLAG_A32, HANDLER, 1);
61
+ }
29
+ }
62
+
30
+
63
/* The board code is not supposed to set secure_board_setup unless
31
+ /*
64
* running its code in secure mode is actually possible, and KVM
32
+ * v8M always applies stack limit checks unless CCR.STKOFHFNMIGN
65
* doesn't support secure.
33
+ * is suppressing them because the requested execution priority
66
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
34
+ * is less than 0.
67
ARM_CPU(cs)->env.boot_info = info;
35
+ */
36
+ if (arm_feature(env, ARM_FEATURE_V8) &&
37
+ !((mmu_idx & ARM_MMU_IDX_M_NEGPRI) &&
38
+ (env->v7m.ccr[env->v7m.secure] & R_V7M_CCR_STKOFHFNMIGN_MASK))) {
39
+ flags = FIELD_DP32(flags, TBFLAG_A32, STACKCHECK, 1);
40
+ }
41
+
42
+ return rebuild_hflags_common_32(env, fp_el, mmu_idx, flags);
43
+}
44
+
45
static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
46
ARMMMUIdx mmu_idx)
47
{
48
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
49
}
50
} else {
51
*pc = env->regs[15];
52
- flags = rebuild_hflags_common_32(env, fp_el, mmu_idx, 0);
53
+
54
+ if (arm_feature(env, ARM_FEATURE_M)) {
55
+ flags = rebuild_hflags_m32(env, fp_el, mmu_idx);
56
+ } else {
57
+ flags = rebuild_hflags_common_32(env, fp_el, mmu_idx, 0);
58
+ }
59
+
60
flags = FIELD_DP32(flags, TBFLAG_A32, THUMB, env->thumb);
61
flags = FIELD_DP32(flags, TBFLAG_A32, VECLEN, env->vfp.vec_len);
62
flags = FIELD_DP32(flags, TBFLAG_A32, VECSTRIDE, env->vfp.vec_stride);
63
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
64
}
68
}
65
}
69
66
70
- /* CPU objects (unlike devices) are not automatically reset on system
67
- if (arm_v7m_is_handler_mode(env)) {
71
- * reset, so we must always register a handler to do so. If we're
68
- flags = FIELD_DP32(flags, TBFLAG_A32, HANDLER, 1);
72
- * actually loading a kernel, the handler is also responsible for
73
- * arranging that we start it correctly.
74
- */
75
- for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
76
- qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
77
- }
69
- }
78
-
70
-
79
if (!info->skip_dtb_autoload && have_dtb(info)) {
71
- /* v8M always applies stack limit checks unless CCR.STKOFHFNMIGN is
80
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
72
- * suppressing them because the requested execution priority is less than 0.
81
exit(1);
73
- */
74
- if (arm_feature(env, ARM_FEATURE_V8) &&
75
- arm_feature(env, ARM_FEATURE_M) &&
76
- !((mmu_idx & ARM_MMU_IDX_M_NEGPRI) &&
77
- (env->v7m.ccr[env->v7m.secure] & R_V7M_CCR_STKOFHFNMIGN_MASK))) {
78
- flags = FIELD_DP32(flags, TBFLAG_A32, STACKCHECK, 1);
79
- }
80
-
81
if (arm_feature(env, ARM_FEATURE_M_SECURITY) &&
82
FIELD_EX32(env->v7m.fpccr[M_REG_S], V7M_FPCCR, S) != env->v7m.secure) {
83
flags = FIELD_DP32(flags, TBFLAG_A32, FPCCR_S_WRONG, 1);
82
--
84
--
83
2.17.1
85
2.20.1
84
86
85
87
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Hoist the computation of some TBFLAG_A32 bits that only apply to
4
M-profile under a single test for ARM_FEATURE_M.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20191018174431.1784-7-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.c | 49 +++++++++++++++++++++------------------------
12
1 file changed, 23 insertions(+), 26 deletions(-)
13
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
19
20
if (arm_feature(env, ARM_FEATURE_M)) {
21
flags = rebuild_hflags_m32(env, fp_el, mmu_idx);
22
+
23
+ if (arm_feature(env, ARM_FEATURE_M_SECURITY) &&
24
+ FIELD_EX32(env->v7m.fpccr[M_REG_S], V7M_FPCCR, S)
25
+ != env->v7m.secure) {
26
+ flags = FIELD_DP32(flags, TBFLAG_A32, FPCCR_S_WRONG, 1);
27
+ }
28
+
29
+ if ((env->v7m.fpccr[env->v7m.secure] & R_V7M_FPCCR_ASPEN_MASK) &&
30
+ (!(env->v7m.control[M_REG_S] & R_V7M_CONTROL_FPCA_MASK) ||
31
+ (env->v7m.secure &&
32
+ !(env->v7m.control[M_REG_S] & R_V7M_CONTROL_SFPA_MASK)))) {
33
+ /*
34
+ * ASPEN is set, but FPCA/SFPA indicate that there is no
35
+ * active FP context; we must create a new FP context before
36
+ * executing any FP insn.
37
+ */
38
+ flags = FIELD_DP32(flags, TBFLAG_A32, NEW_FP_CTXT_NEEDED, 1);
39
+ }
40
+
41
+ bool is_secure = env->v7m.fpccr[M_REG_S] & R_V7M_FPCCR_S_MASK;
42
+ if (env->v7m.fpccr[is_secure] & R_V7M_FPCCR_LSPACT_MASK) {
43
+ flags = FIELD_DP32(flags, TBFLAG_A32, LSPACT, 1);
44
+ }
45
} else {
46
flags = rebuild_hflags_common_32(env, fp_el, mmu_idx, 0);
47
}
48
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
49
}
50
}
51
52
- if (arm_feature(env, ARM_FEATURE_M_SECURITY) &&
53
- FIELD_EX32(env->v7m.fpccr[M_REG_S], V7M_FPCCR, S) != env->v7m.secure) {
54
- flags = FIELD_DP32(flags, TBFLAG_A32, FPCCR_S_WRONG, 1);
55
- }
56
-
57
- if (arm_feature(env, ARM_FEATURE_M) &&
58
- (env->v7m.fpccr[env->v7m.secure] & R_V7M_FPCCR_ASPEN_MASK) &&
59
- (!(env->v7m.control[M_REG_S] & R_V7M_CONTROL_FPCA_MASK) ||
60
- (env->v7m.secure &&
61
- !(env->v7m.control[M_REG_S] & R_V7M_CONTROL_SFPA_MASK)))) {
62
- /*
63
- * ASPEN is set, but FPCA/SFPA indicate that there is no active
64
- * FP context; we must create a new FP context before executing
65
- * any FP insn.
66
- */
67
- flags = FIELD_DP32(flags, TBFLAG_A32, NEW_FP_CTXT_NEEDED, 1);
68
- }
69
-
70
- if (arm_feature(env, ARM_FEATURE_M)) {
71
- bool is_secure = env->v7m.fpccr[M_REG_S] & R_V7M_FPCCR_S_MASK;
72
-
73
- if (env->v7m.fpccr[is_secure] & R_V7M_FPCCR_LSPACT_MASK) {
74
- flags = FIELD_DP32(flags, TBFLAG_A32, LSPACT, 1);
75
- }
76
- }
77
-
78
if (!arm_feature(env, ARM_FEATURE_M)) {
79
int target_el = arm_debug_target_el(env);
80
81
--
82
2.20.1
83
84
diff view generated by jsdifflib
1
In commit f0aff255700 we made cpacr_write() enforce that some CPACR
1
From: Richard Henderson <richard.henderson@linaro.org>
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
Currently a trivial wrapper for rebuild_hflags_common_32.
11
that just calls cpacr_write(), to avoid having to duplicate
12
the logic for which bits are RAO.
13
4
14
This bug would affect migration for TCG CPUs which are ARMv7
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
with VFP but without one of Neon or VFPv3.
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
16
7
Message-id: 20191018174431.1784-8-richard.henderson@linaro.org
17
Reported-by: Cédric Le Goater <clg@kaod.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
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
---
9
---
22
target/arm/helper.c | 10 +++++++++-
10
target/arm/helper.c | 8 +++++++-
23
1 file changed, 9 insertions(+), 1 deletion(-)
11
1 file changed, 7 insertions(+), 1 deletion(-)
24
12
25
diff --git a/target/arm/helper.c b/target/arm/helper.c
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/helper.c
15
--- a/target/arm/helper.c
28
+++ b/target/arm/helper.c
16
+++ b/target/arm/helper.c
29
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
17
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_m32(CPUARMState *env, int fp_el,
30
env->cp15.cpacr_el1 = value;
18
return rebuild_hflags_common_32(env, fp_el, mmu_idx, flags);
31
}
19
}
32
20
33
+static void cpacr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
21
+static uint32_t rebuild_hflags_a32(CPUARMState *env, int fp_el,
22
+ ARMMMUIdx mmu_idx)
34
+{
23
+{
35
+ /* Call cpacr_write() so that we reset with the correct RAO bits set
24
+ return rebuild_hflags_common_32(env, fp_el, mmu_idx, 0);
36
+ * for our CPU features.
37
+ */
38
+ cpacr_write(env, ri, 0);
39
+}
25
+}
40
+
26
+
41
static CPAccessResult cpacr_access(CPUARMState *env, const ARMCPRegInfo *ri,
27
static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
42
bool isread)
28
ARMMMUIdx mmu_idx)
43
{
29
{
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
30
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
45
{ .name = "CPACR", .state = ARM_CP_STATE_BOTH, .opc0 = 3,
31
flags = FIELD_DP32(flags, TBFLAG_A32, LSPACT, 1);
46
.crn = 1, .crm = 0, .opc1 = 0, .opc2 = 2, .accessfn = cpacr_access,
32
}
47
.access = PL1_RW, .fieldoffset = offsetof(CPUARMState, cp15.cpacr_el1),
33
} else {
48
- .resetvalue = 0, .writefn = cpacr_write },
34
- flags = rebuild_hflags_common_32(env, fp_el, mmu_idx, 0);
49
+ .resetfn = cpacr_reset, .writefn = cpacr_write },
35
+ flags = rebuild_hflags_a32(env, fp_el, mmu_idx);
50
REGINFO_SENTINEL
36
}
51
};
37
52
38
flags = FIELD_DP32(flags, TBFLAG_A32, THUMB, env->thumb);
53
--
39
--
54
2.17.1
40
2.20.1
55
41
56
42
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to the MemoryRegion valid.accepts
3
callback. We'll need this for subpage_accepts().
4
2
5
We could take the approach we used with the read and write
3
Create a function to compute the values of the TBFLAG_ANY bits
6
callbacks and add new a new _with_attrs version, but since there
4
that will be cached, and are used by A-profile.
7
are so few implementations of the accepts hook we just change
8
them all.
9
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20191018174431.1784-9-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20180521140402.23318-9-peter.maydell@linaro.org
14
---
10
---
15
include/exec/memory.h | 3 ++-
11
target/arm/helper.c | 20 ++++++++++++--------
16
exec.c | 9 ++++++---
12
1 file changed, 12 insertions(+), 8 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
13
24
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
25
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory.h
16
--- a/target/arm/helper.c
27
+++ b/include/exec/memory.h
17
+++ b/target/arm/helper.c
28
@@ -XXX,XX +XXX,XX @@ struct MemoryRegionOps {
18
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_m32(CPUARMState *env, int fp_el,
29
* as a machine check exception).
19
return rebuild_hflags_common_32(env, fp_el, mmu_idx, flags);
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
}
20
}
44
21
45
static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
22
+static uint32_t rebuild_hflags_aprofile(CPUARMState *env)
46
- unsigned size, bool is_write)
23
+{
47
+ unsigned size, bool is_write,
24
+ int flags = 0;
48
+ MemTxAttrs attrs)
25
+
26
+ flags = FIELD_DP32(flags, TBFLAG_ANY, DEBUG_TARGET_EL,
27
+ arm_debug_target_el(env));
28
+ return flags;
29
+}
30
+
31
static uint32_t rebuild_hflags_a32(CPUARMState *env, int fp_el,
32
ARMMMUIdx mmu_idx)
49
{
33
{
50
return is_write;
34
- return rebuild_hflags_common_32(env, fp_el, mmu_idx, 0);
35
+ uint32_t flags = rebuild_hflags_aprofile(env);
36
+ return rebuild_hflags_common_32(env, fp_el, mmu_idx, flags);
51
}
37
}
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult subpage_write(void *opaque, hwaddr addr,
38
53
}
39
static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
54
40
ARMMMUIdx mmu_idx)
55
static bool subpage_accepts(void *opaque, hwaddr addr,
56
- unsigned len, bool is_write)
57
+ unsigned len, bool is_write,
58
+ MemTxAttrs attrs)
59
{
41
{
60
subpage_t *subpage = opaque;
42
+ uint32_t flags = rebuild_hflags_aprofile(env);
61
#if defined(DEBUG_SUBPAGE)
43
ARMMMUIdx stage1 = stage_1_mmu_idx(mmu_idx);
62
@@ -XXX,XX +XXX,XX @@ static void readonly_mem_write(void *opaque, hwaddr addr,
44
ARMVAParameters p0 = aa64_va_parameters_both(env, 0, stage1);
63
}
45
- uint32_t flags = 0;
64
46
uint64_t sctlr;
65
static bool readonly_mem_accepts(void *opaque, hwaddr addr,
47
int tbii, tbid;
66
- unsigned size, bool is_write)
48
67
+ unsigned size, bool is_write,
49
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
68
+ MemTxAttrs attrs)
69
{
70
return is_write;
71
}
72
diff --git a/hw/hppa/dino.c b/hw/hppa/dino.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/hppa/dino.c
75
+++ b/hw/hppa/dino.c
76
@@ -XXX,XX +XXX,XX @@ static void gsc_to_pci_forwarding(DinoState *s)
77
}
78
79
static bool dino_chip_mem_valid(void *opaque, hwaddr addr,
80
- unsigned size, bool is_write)
81
+ unsigned size, bool is_write,
82
+ MemTxAttrs attrs)
83
{
84
switch (addr) {
85
case DINO_IAR0:
86
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/nvram/fw_cfg.c
89
+++ b/hw/nvram/fw_cfg.c
90
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_dma_mem_write(void *opaque, hwaddr addr,
91
}
92
93
static bool fw_cfg_dma_mem_valid(void *opaque, hwaddr addr,
94
- unsigned size, bool is_write)
95
+ unsigned size, bool is_write,
96
+ MemTxAttrs attrs)
97
{
98
return !is_write || ((size == 4 && (addr == 0 || addr == 4)) ||
99
(size == 8 && addr == 0));
100
}
101
102
static bool fw_cfg_data_mem_valid(void *opaque, hwaddr addr,
103
- unsigned size, bool is_write)
104
+ unsigned size, bool is_write,
105
+ MemTxAttrs attrs)
106
{
107
return addr == 0;
108
}
109
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_ctl_mem_write(void *opaque, hwaddr addr,
110
}
111
112
static bool fw_cfg_ctl_mem_valid(void *opaque, hwaddr addr,
113
- unsigned size, bool is_write)
114
+ unsigned size, bool is_write,
115
+ MemTxAttrs attrs)
116
{
117
return is_write && size == 2;
118
}
119
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_comb_write(void *opaque, hwaddr addr,
120
}
121
122
static bool fw_cfg_comb_valid(void *opaque, hwaddr addr,
123
- unsigned size, bool is_write)
124
+ unsigned size, bool is_write,
125
+ MemTxAttrs attrs)
126
{
127
return (size == 1) || (is_write && size == 2);
128
}
129
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
130
index XXXXXXX..XXXXXXX 100644
131
--- a/hw/scsi/esp.c
132
+++ b/hw/scsi/esp.c
133
@@ -XXX,XX +XXX,XX @@ void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val)
134
}
135
136
static bool esp_mem_accepts(void *opaque, hwaddr addr,
137
- unsigned size, bool is_write)
138
+ unsigned size, bool is_write,
139
+ MemTxAttrs attrs)
140
{
141
return (size == 1) || (is_write && size == 4);
142
}
143
diff --git a/hw/xen/xen_pt_msi.c b/hw/xen/xen_pt_msi.c
144
index XXXXXXX..XXXXXXX 100644
145
--- a/hw/xen/xen_pt_msi.c
146
+++ b/hw/xen/xen_pt_msi.c
147
@@ -XXX,XX +XXX,XX @@ static uint64_t pci_msix_read(void *opaque, hwaddr addr,
148
}
149
150
static bool pci_msix_accepts(void *opaque, hwaddr addr,
151
- unsigned size, bool is_write)
152
+ unsigned size, bool is_write,
153
+ MemTxAttrs attrs)
154
{
155
return !(addr & (size - 1));
156
}
157
diff --git a/memory.c b/memory.c
158
index XXXXXXX..XXXXXXX 100644
159
--- a/memory.c
160
+++ b/memory.c
161
@@ -XXX,XX +XXX,XX @@ static void unassigned_mem_write(void *opaque, hwaddr addr,
162
}
163
164
static bool unassigned_mem_accepts(void *opaque, hwaddr addr,
165
- unsigned size, bool is_write)
166
+ unsigned size, bool is_write,
167
+ MemTxAttrs attrs)
168
{
169
return false;
170
}
171
@@ -XXX,XX +XXX,XX @@ bool memory_region_access_valid(MemoryRegion *mr,
172
access_size = MAX(MIN(size, access_size_max), access_size_min);
173
for (i = 0; i < size; i += access_size) {
174
if (!mr->ops->valid.accepts(mr->opaque, addr + i, access_size,
175
- is_write)) {
176
+ is_write, attrs)) {
177
return false;
178
}
50
}
179
}
51
}
52
53
- if (!arm_feature(env, ARM_FEATURE_M)) {
54
- int target_el = arm_debug_target_el(env);
55
-
56
- flags = FIELD_DP32(flags, TBFLAG_ANY, DEBUG_TARGET_EL, target_el);
57
- }
58
-
59
*pflags = flags;
60
*cs_base = 0;
61
}
180
--
62
--
181
2.17.1
63
2.20.1
182
64
183
65
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
We do not need to compute any of these values for M-profile.
4
Further, XSCALE_CPAR overlaps VECSTRIDE so obviously the two
5
sets must be mutually exclusive.
6
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20191018174431.1784-10-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/helper.c | 21 ++++++++++++++-------
13
1 file changed, 14 insertions(+), 7 deletions(-)
14
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
18
+++ b/target/arm/helper.c
19
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
20
}
21
} else {
22
flags = rebuild_hflags_a32(env, fp_el, mmu_idx);
23
+
24
+ /*
25
+ * Note that XSCALE_CPAR shares bits with VECSTRIDE.
26
+ * Note that VECLEN+VECSTRIDE are RES0 for M-profile.
27
+ */
28
+ if (arm_feature(env, ARM_FEATURE_XSCALE)) {
29
+ flags = FIELD_DP32(flags, TBFLAG_A32,
30
+ XSCALE_CPAR, env->cp15.c15_cpar);
31
+ } else {
32
+ flags = FIELD_DP32(flags, TBFLAG_A32, VECLEN,
33
+ env->vfp.vec_len);
34
+ flags = FIELD_DP32(flags, TBFLAG_A32, VECSTRIDE,
35
+ env->vfp.vec_stride);
36
+ }
37
}
38
39
flags = FIELD_DP32(flags, TBFLAG_A32, THUMB, env->thumb);
40
- flags = FIELD_DP32(flags, TBFLAG_A32, VECLEN, env->vfp.vec_len);
41
- flags = FIELD_DP32(flags, TBFLAG_A32, VECSTRIDE, env->vfp.vec_stride);
42
flags = FIELD_DP32(flags, TBFLAG_A32, CONDEXEC, env->condexec_bits);
43
if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)
44
|| arm_el_is_aa64(env, 1) || arm_feature(env, ARM_FEATURE_M)) {
45
flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
46
}
47
- /* Note that XSCALE_CPAR shares bits with VECSTRIDE */
48
- if (arm_feature(env, ARM_FEATURE_XSCALE)) {
49
- flags = FIELD_DP32(flags, TBFLAG_A32,
50
- XSCALE_CPAR, env->cp15.c15_cpar);
51
- }
52
}
53
54
/* The SS_ACTIVE and PSTATE_SS bits correspond to the state machine
55
--
56
2.20.1
57
58
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Hoist the variable load for PSTATE into the existing test vs is_a64.
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20191018174431.1784-11-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/helper.c | 20 ++++++++------------
11
1 file changed, 8 insertions(+), 12 deletions(-)
12
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
16
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
18
ARMMMUIdx mmu_idx = arm_mmu_idx(env);
19
int current_el = arm_current_el(env);
20
int fp_el = fp_exception_el(env, current_el);
21
- uint32_t flags;
22
+ uint32_t flags, pstate_for_ss;
23
24
if (is_a64(env)) {
25
*pc = env->pc;
26
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
27
if (cpu_isar_feature(aa64_bti, env_archcpu(env))) {
28
flags = FIELD_DP32(flags, TBFLAG_A64, BTYPE, env->btype);
29
}
30
+ pstate_for_ss = env->pstate;
31
} else {
32
*pc = env->regs[15];
33
34
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
35
|| arm_el_is_aa64(env, 1) || arm_feature(env, ARM_FEATURE_M)) {
36
flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
37
}
38
+ pstate_for_ss = env->uncached_cpsr;
39
}
40
41
- /* The SS_ACTIVE and PSTATE_SS bits correspond to the state machine
42
+ /*
43
+ * The SS_ACTIVE and PSTATE_SS bits correspond to the state machine
44
* states defined in the ARM ARM for software singlestep:
45
* SS_ACTIVE PSTATE.SS State
46
* 0 x Inactive (the TB flag for SS is always 0)
47
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
48
* 1 1 Active-not-pending
49
* SS_ACTIVE is set in hflags; PSTATE_SS is computed every TB.
50
*/
51
- if (FIELD_EX32(flags, TBFLAG_ANY, SS_ACTIVE)) {
52
- if (is_a64(env)) {
53
- if (env->pstate & PSTATE_SS) {
54
- flags = FIELD_DP32(flags, TBFLAG_ANY, PSTATE_SS, 1);
55
- }
56
- } else {
57
- if (env->uncached_cpsr & PSTATE_SS) {
58
- flags = FIELD_DP32(flags, TBFLAG_ANY, PSTATE_SS, 1);
59
- }
60
- }
61
+ if (FIELD_EX32(flags, TBFLAG_ANY, SS_ACTIVE) &&
62
+ (pstate_for_ss & PSTATE_SS)) {
63
+ flags = FIELD_DP32(flags, TBFLAG_ANY, PSTATE_SS, 1);
64
}
65
66
*pflags = flags;
67
--
68
2.20.1
69
70
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to flatview_translate(); all its
3
callers now have attrs available.
4
2
3
There are 3 conditions that each enable this flag. M-profile always
4
enables; A-profile with EL1 as AA64 always enables. Both of these
5
conditions can easily be cached. The final condition relies on the
6
FPEXC register which we are not prepared to cache.
7
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20191018174431.1784-12-richard.henderson@linaro.org
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
target/arm/cpu.h | 2 +-
11
exec.c | 17 +++++++++--------
14
target/arm/helper.c | 14 ++++++++++----
12
2 files changed, 13 insertions(+), 11 deletions(-)
15
2 files changed, 11 insertions(+), 5 deletions(-)
13
16
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
19
--- a/target/arm/cpu.h
17
+++ b/include/exec/memory.h
20
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
21
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_A32, XSCALE_CPAR, 4, 2)
22
* the same thing as the current security state of the processor!
19
*/
23
*/
20
MemoryRegion *flatview_translate(FlatView *fv,
24
FIELD(TBFLAG_A32, NS, 6, 1)
21
hwaddr addr, hwaddr *xlat,
25
-FIELD(TBFLAG_A32, VFPEN, 7, 1) /* Not cached. */
22
- hwaddr *len, bool is_write);
26
+FIELD(TBFLAG_A32, VFPEN, 7, 1) /* Partially cached, minus FPEXC. */
23
+ hwaddr *len, bool is_write,
27
FIELD(TBFLAG_A32, CONDEXEC, 8, 8) /* Not cached. */
24
+ MemTxAttrs attrs);
28
FIELD(TBFLAG_A32, SCTLR_B, 16, 1)
25
29
/* For M profile only, set if FPCCR.LSPACT is set */
26
static inline MemoryRegion *address_space_translate(AddressSpace *as,
30
diff --git a/target/arm/helper.c b/target/arm/helper.c
27
hwaddr addr, hwaddr *xlat,
31
index XXXXXXX..XXXXXXX 100644
28
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
32
--- a/target/arm/helper.c
29
MemTxAttrs attrs)
33
+++ b/target/arm/helper.c
34
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_m32(CPUARMState *env, int fp_el,
30
{
35
{
31
return flatview_translate(address_space_to_flatview(as),
36
uint32_t flags = 0;
32
- addr, xlat, len, is_write);
37
33
+ addr, xlat, len, is_write, attrs);
38
+ /* v8M always enables the fpu. */
39
+ flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
40
+
41
if (arm_v7m_is_handler_mode(env)) {
42
flags = FIELD_DP32(flags, TBFLAG_A32, HANDLER, 1);
43
}
44
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a32(CPUARMState *env, int fp_el,
45
ARMMMUIdx mmu_idx)
46
{
47
uint32_t flags = rebuild_hflags_aprofile(env);
48
+
49
+ if (arm_el_is_aa64(env, 1)) {
50
+ flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
51
+ }
52
return rebuild_hflags_common_32(env, fp_el, mmu_idx, flags);
34
}
53
}
35
54
36
/* address_space_access_valid: check for validity of accessing an address
55
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
37
@@ -XXX,XX +XXX,XX @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
56
flags = FIELD_DP32(flags, TBFLAG_A32, VECSTRIDE,
38
rcu_read_lock();
57
env->vfp.vec_stride);
39
fv = address_space_to_flatview(as);
58
}
40
l = len;
59
+ if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)) {
41
- mr = flatview_translate(fv, addr, &addr1, &l, false);
60
+ flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
42
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
61
+ }
43
if (len == l && memory_access_is_direct(mr, false)) {
44
ptr = qemu_map_ram_ptr(mr->ram_block, addr1);
45
memcpy(buf, ptr, len);
46
diff --git a/exec.c b/exec.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/exec.c
49
+++ b/exec.c
50
@@ -XXX,XX +XXX,XX @@ iotlb_fail:
51
52
/* Called from RCU critical section */
53
MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
54
- hwaddr *plen, bool is_write)
55
+ hwaddr *plen, bool is_write,
56
+ MemTxAttrs attrs)
57
{
58
MemoryRegion *mr;
59
MemoryRegionSection section;
60
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
61
}
62
}
62
63
63
l = len;
64
flags = FIELD_DP32(flags, TBFLAG_A32, THUMB, env->thumb);
64
- mr = flatview_translate(fv, addr, &addr1, &l, true);
65
flags = FIELD_DP32(flags, TBFLAG_A32, CONDEXEC, env->condexec_bits);
65
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
66
- if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)
67
- || arm_el_is_aa64(env, 1) || arm_feature(env, ARM_FEATURE_M)) {
68
- flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
69
- }
70
pstate_for_ss = env->uncached_cpsr;
66
}
71
}
67
72
68
return result;
69
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
70
MemTxResult result = MEMTX_OK;
71
72
l = len;
73
- mr = flatview_translate(fv, addr, &addr1, &l, true);
74
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
75
result = flatview_write_continue(fv, addr, attrs, buf, len,
76
addr1, l, mr);
77
78
@@ -XXX,XX +XXX,XX @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
79
}
80
81
l = len;
82
- mr = flatview_translate(fv, addr, &addr1, &l, false);
83
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
84
}
85
86
return result;
87
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
88
MemoryRegion *mr;
89
90
l = len;
91
- mr = flatview_translate(fv, addr, &addr1, &l, false);
92
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
93
return flatview_read_continue(fv, addr, attrs, buf, len,
94
addr1, l, mr);
95
}
96
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
97
98
while (len > 0) {
99
l = len;
100
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
101
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
102
if (!memory_access_is_direct(mr, is_write)) {
103
l = memory_access_size(mr, l, addr);
104
if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
105
@@ -XXX,XX +XXX,XX @@ flatview_extend_translation(FlatView *fv, hwaddr addr,
106
107
len = target_len;
108
this_mr = flatview_translate(fv, addr, &xlat,
109
- &len, is_write);
110
+ &len, is_write, attrs);
111
if (this_mr != mr || xlat != base + done) {
112
return done;
113
}
114
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
115
l = len;
116
rcu_read_lock();
117
fv = address_space_to_flatview(as);
118
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
119
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
120
121
if (!memory_access_is_direct(mr, is_write)) {
122
if (atomic_xchg(&bounce.in_use, true)) {
123
--
73
--
124
2.17.1
74
2.20.1
125
75
126
76
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
This function assumes nothing about the current state of the cpu,
4
and writes the computed value to env->hflags.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20191018174431.1784-13-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/cpu.h | 6 ++++++
12
target/arm/helper.c | 30 ++++++++++++++++++++++--------
13
2 files changed, 28 insertions(+), 8 deletions(-)
14
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/cpu.h
18
+++ b/target/arm/cpu.h
19
@@ -XXX,XX +XXX,XX @@ void arm_register_pre_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
20
void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook, void
21
*opaque);
22
23
+/**
24
+ * arm_rebuild_hflags:
25
+ * Rebuild the cached TBFLAGS for arbitrary changed processor state.
26
+ */
27
+void arm_rebuild_hflags(CPUARMState *env);
28
+
29
/**
30
* aa32_vfp_dreg:
31
* Return a pointer to the Dn register within env in 32-bit mode.
32
diff --git a/target/arm/helper.c b/target/arm/helper.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/helper.c
35
+++ b/target/arm/helper.c
36
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
37
return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
38
}
39
40
+static uint32_t rebuild_hflags_internal(CPUARMState *env)
41
+{
42
+ int el = arm_current_el(env);
43
+ int fp_el = fp_exception_el(env, el);
44
+ ARMMMUIdx mmu_idx = arm_mmu_idx(env);
45
+
46
+ if (is_a64(env)) {
47
+ return rebuild_hflags_a64(env, el, fp_el, mmu_idx);
48
+ } else if (arm_feature(env, ARM_FEATURE_M)) {
49
+ return rebuild_hflags_m32(env, fp_el, mmu_idx);
50
+ } else {
51
+ return rebuild_hflags_a32(env, fp_el, mmu_idx);
52
+ }
53
+}
54
+
55
+void arm_rebuild_hflags(CPUARMState *env)
56
+{
57
+ env->hflags = rebuild_hflags_internal(env);
58
+}
59
+
60
void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
61
target_ulong *cs_base, uint32_t *pflags)
62
{
63
- ARMMMUIdx mmu_idx = arm_mmu_idx(env);
64
- int current_el = arm_current_el(env);
65
- int fp_el = fp_exception_el(env, current_el);
66
uint32_t flags, pstate_for_ss;
67
68
+ flags = rebuild_hflags_internal(env);
69
+
70
if (is_a64(env)) {
71
*pc = env->pc;
72
- flags = rebuild_hflags_a64(env, current_el, fp_el, mmu_idx);
73
if (cpu_isar_feature(aa64_bti, env_archcpu(env))) {
74
flags = FIELD_DP32(flags, TBFLAG_A64, BTYPE, env->btype);
75
}
76
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
77
*pc = env->regs[15];
78
79
if (arm_feature(env, ARM_FEATURE_M)) {
80
- flags = rebuild_hflags_m32(env, fp_el, mmu_idx);
81
-
82
if (arm_feature(env, ARM_FEATURE_M_SECURITY) &&
83
FIELD_EX32(env->v7m.fpccr[M_REG_S], V7M_FPCCR, S)
84
!= env->v7m.secure) {
85
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
86
flags = FIELD_DP32(flags, TBFLAG_A32, LSPACT, 1);
87
}
88
} else {
89
- flags = rebuild_hflags_a32(env, fp_el, mmu_idx);
90
-
91
/*
92
* Note that XSCALE_CPAR shares bits with VECSTRIDE.
93
* Note that VECLEN+VECSTRIDE are RES0 for M-profile.
94
--
95
2.20.1
96
97
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Avoid calling arm_current_el() twice.
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20191018174431.1784-14-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/internals.h | 9 +++++++++
12
target/arm/helper.c | 12 +++++++-----
13
2 files changed, 16 insertions(+), 5 deletions(-)
14
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/internals.h
18
+++ b/target/arm/internals.h
19
@@ -XXX,XX +XXX,XX @@ void arm_cpu_update_virq(ARMCPU *cpu);
20
*/
21
void arm_cpu_update_vfiq(ARMCPU *cpu);
22
23
+/**
24
+ * arm_mmu_idx_el:
25
+ * @env: The cpu environment
26
+ * @el: The EL to use.
27
+ *
28
+ * Return the full ARMMMUIdx for the translation regime for EL.
29
+ */
30
+ARMMMUIdx arm_mmu_idx_el(CPUARMState *env, int el);
31
+
32
/**
33
* arm_mmu_idx:
34
* @env: The cpu environment
35
diff --git a/target/arm/helper.c b/target/arm/helper.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/helper.c
38
+++ b/target/arm/helper.c
39
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
40
}
41
#endif
42
43
-ARMMMUIdx arm_mmu_idx(CPUARMState *env)
44
+ARMMMUIdx arm_mmu_idx_el(CPUARMState *env, int el)
45
{
46
- int el;
47
-
48
if (arm_feature(env, ARM_FEATURE_M)) {
49
return arm_v7m_mmu_idx_for_secstate(env, env->v7m.secure);
50
}
51
52
- el = arm_current_el(env);
53
if (el < 2 && arm_is_secure_below_el3(env)) {
54
return ARMMMUIdx_S1SE0 + el;
55
} else {
56
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_mmu_idx(CPUARMState *env)
57
}
58
}
59
60
+ARMMMUIdx arm_mmu_idx(CPUARMState *env)
61
+{
62
+ return arm_mmu_idx_el(env, arm_current_el(env));
63
+}
64
+
65
int cpu_mmu_index(CPUARMState *env, bool ifetch)
66
{
67
return arm_to_core_mmu_idx(arm_mmu_idx(env));
68
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_internal(CPUARMState *env)
69
{
70
int el = arm_current_el(env);
71
int fp_el = fp_exception_el(env, el);
72
- ARMMMUIdx mmu_idx = arm_mmu_idx(env);
73
+ ARMMMUIdx mmu_idx = arm_mmu_idx_el(env, el);
74
75
if (is_a64(env)) {
76
return rebuild_hflags_a64(env, el, fp_el, mmu_idx);
77
--
78
2.20.1
79
80
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
By performing this store early, we avoid having to save and restore
4
the register holding the address around any function calls.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20191018174431.1784-15-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
19
{
20
uint32_t flags, pstate_for_ss;
21
22
+ *cs_base = 0;
23
flags = rebuild_hflags_internal(env);
24
25
if (is_a64(env)) {
26
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
27
}
28
29
*pflags = flags;
30
- *cs_base = 0;
31
}
32
33
#ifdef TARGET_AARCH64
34
--
35
2.20.1
36
37
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
This functions are given the mode and el state of the cpu
4
and writes the computed value to env->hflags.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20191018174431.1784-16-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.h | 4 ++++
12
target/arm/helper.c | 24 ++++++++++++++++++++++++
13
2 files changed, 28 insertions(+)
14
15
diff --git a/target/arm/helper.h b/target/arm/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.h
18
+++ b/target/arm/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(msr_banked, void, env, i32, i32, i32)
20
DEF_HELPER_2(get_user_reg, i32, env, i32)
21
DEF_HELPER_3(set_user_reg, void, env, i32, i32)
22
23
+DEF_HELPER_FLAGS_2(rebuild_hflags_m32, TCG_CALL_NO_RWG, void, env, int)
24
+DEF_HELPER_FLAGS_2(rebuild_hflags_a32, TCG_CALL_NO_RWG, void, env, int)
25
+DEF_HELPER_FLAGS_2(rebuild_hflags_a64, TCG_CALL_NO_RWG, void, env, int)
26
+
27
DEF_HELPER_1(vfp_get_fpscr, i32, env)
28
DEF_HELPER_2(vfp_set_fpscr, void, env, i32)
29
30
diff --git a/target/arm/helper.c b/target/arm/helper.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/helper.c
33
+++ b/target/arm/helper.c
34
@@ -XXX,XX +XXX,XX @@ void arm_rebuild_hflags(CPUARMState *env)
35
env->hflags = rebuild_hflags_internal(env);
36
}
37
38
+void HELPER(rebuild_hflags_m32)(CPUARMState *env, int el)
39
+{
40
+ int fp_el = fp_exception_el(env, el);
41
+ ARMMMUIdx mmu_idx = arm_mmu_idx_el(env, el);
42
+
43
+ env->hflags = rebuild_hflags_m32(env, fp_el, mmu_idx);
44
+}
45
+
46
+void HELPER(rebuild_hflags_a32)(CPUARMState *env, int el)
47
+{
48
+ int fp_el = fp_exception_el(env, el);
49
+ ARMMMUIdx mmu_idx = arm_mmu_idx_el(env, el);
50
+
51
+ env->hflags = rebuild_hflags_a32(env, fp_el, mmu_idx);
52
+}
53
+
54
+void HELPER(rebuild_hflags_a64)(CPUARMState *env, int el)
55
+{
56
+ int fp_el = fp_exception_el(env, el);
57
+ ARMMMUIdx mmu_idx = arm_mmu_idx_el(env, el);
58
+
59
+ env->hflags = rebuild_hflags_a64(env, el, fp_el, mmu_idx);
60
+}
61
+
62
void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
63
target_ulong *cs_base, uint32_t *pflags)
64
{
65
--
66
2.20.1
67
68
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Depending on the host abi, float16, aka uint16_t, values are
3
Begin setting, but not relying upon, env->hflags.
4
passed and returned either zero-extended in the host register
5
or with garbage at the top of the host register.
6
4
7
The tcg code generator has so far been assuming garbage, as that
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
matches the x86 abi, but this is incorrect for other host abis.
9
Further, target/arm has so far been assuming zero-extended results,
10
so that it may store the 16-bit value into a 32-bit slot with the
11
high 16-bits already clear.
12
13
Rectify both problems by mapping "f16" in the helper definition
14
to uint32_t instead of (a typedef for) uint16_t. This forces
15
the host compiler to assume garbage in the upper 16 bits on input
16
and to zero-extend the result on output.
17
18
Cc: qemu-stable@nongnu.org
19
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20191018174431.1784-17-richard.henderson@linaro.org
21
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
22
Message-id: 20180522175629.24932-1-richard.henderson@linaro.org
23
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
9
---
26
include/exec/helper-head.h | 2 +-
10
linux-user/syscall.c | 1 +
27
target/arm/helper-a64.c | 35 +++++++++--------
11
target/arm/cpu.c | 1 +
28
target/arm/helper.c | 80 +++++++++++++++++++-------------------
12
target/arm/helper-a64.c | 3 +++
29
3 files changed, 59 insertions(+), 58 deletions(-)
13
target/arm/helper.c | 2 ++
14
target/arm/machine.c | 1 +
15
target/arm/op_helper.c | 1 +
16
6 files changed, 9 insertions(+)
30
17
31
diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h
18
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
32
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
33
--- a/include/exec/helper-head.h
20
--- a/linux-user/syscall.c
34
+++ b/include/exec/helper-head.h
21
+++ b/linux-user/syscall.c
35
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
36
#define dh_ctype_int int
23
aarch64_sve_narrow_vq(env, vq);
37
#define dh_ctype_i64 uint64_t
24
}
38
#define dh_ctype_s64 int64_t
25
env->vfp.zcr_el[1] = vq - 1;
39
-#define dh_ctype_f16 float16
26
+ arm_rebuild_hflags(env);
40
+#define dh_ctype_f16 uint32_t
27
ret = vq * 16;
41
#define dh_ctype_f32 float32
28
}
42
#define dh_ctype_f64 float64
29
return ret;
43
#define dh_ctype_ptr void *
30
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/cpu.c
33
+++ b/target/arm/cpu.c
34
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
35
36
hw_breakpoint_update_all(cpu);
37
hw_watchpoint_update_all(cpu);
38
+ arm_rebuild_hflags(env);
39
}
40
41
bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
44
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
42
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
45
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/helper-a64.c
44
--- a/target/arm/helper-a64.c
47
+++ b/target/arm/helper-a64.c
45
+++ b/target/arm/helper-a64.c
48
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
46
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
49
return flags;
47
} else {
50
}
48
env->regs[15] = new_pc & ~0x3;
51
49
}
52
-uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
50
+ helper_rebuild_hflags_a32(env, new_el);
53
+uint64_t HELPER(vfp_cmph_a64)(uint32_t x, uint32_t y, void *fp_status)
51
qemu_log_mask(CPU_LOG_INT, "Exception return from AArch64 EL%d to "
54
{
52
"AArch32 EL%d PC 0x%" PRIx32 "\n",
55
return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
53
cur_el, new_el, env->regs[15]);
56
}
54
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
57
55
}
58
-uint64_t HELPER(vfp_cmpeh_a64)(float16 x, float16 y, void *fp_status)
56
aarch64_restore_sp(env, new_el);
59
+uint64_t HELPER(vfp_cmpeh_a64)(uint32_t x, uint32_t y, void *fp_status)
57
env->pc = new_pc;
60
{
58
+ helper_rebuild_hflags_a64(env, new_el);
61
return float_rel_to_flags(float16_compare(x, y, fp_status));
59
qemu_log_mask(CPU_LOG_INT, "Exception return from AArch64 EL%d to "
62
}
60
"AArch64 EL%d PC 0x%" PRIx64 "\n",
63
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, void *fpstp)
61
cur_el, new_el, env->pc);
64
#define float64_three make_float64(0x4008000000000000ULL)
62
}
65
#define float64_one_point_five make_float64(0x3FF8000000000000ULL)
63
+
66
64
/*
67
-float16 HELPER(recpsf_f16)(float16 a, float16 b, void *fpstp)
65
* Note that cur_el can never be 0. If new_el is 0, then
68
+uint32_t HELPER(recpsf_f16)(uint32_t a, uint32_t b, void *fpstp)
66
* el0_a64 is return_to_aa64, else el0_a64 is ignored.
69
{
70
float_status *fpst = fpstp;
71
72
@@ -XXX,XX +XXX,XX @@ float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp)
73
return float64_muladd(a, b, float64_two, 0, fpst);
74
}
75
76
-float16 HELPER(rsqrtsf_f16)(float16 a, float16 b, void *fpstp)
77
+uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, void *fpstp)
78
{
79
float_status *fpst = fpstp;
80
81
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_addlp_u16)(uint64_t a)
82
}
83
84
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
85
-float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
86
+uint32_t HELPER(frecpx_f16)(uint32_t a, void *fpstp)
87
{
88
float_status *fpst = fpstp;
89
uint16_t val16, sbit;
90
@@ -XXX,XX +XXX,XX @@ void HELPER(casp_be_parallel)(CPUARMState *env, uint32_t rs, uint64_t addr,
91
#define ADVSIMD_HELPER(name, suffix) HELPER(glue(glue(advsimd_, name), suffix))
92
93
#define ADVSIMD_HALFOP(name) \
94
-float16 ADVSIMD_HELPER(name, h)(float16 a, float16 b, void *fpstp) \
95
+uint32_t ADVSIMD_HELPER(name, h)(uint32_t a, uint32_t b, void *fpstp) \
96
{ \
97
float_status *fpst = fpstp; \
98
return float16_ ## name(a, b, fpst); \
99
@@ -XXX,XX +XXX,XX @@ ADVSIMD_HALFOP(mulx)
100
ADVSIMD_TWOHALFOP(mulx)
101
102
/* fused multiply-accumulate */
103
-float16 HELPER(advsimd_muladdh)(float16 a, float16 b, float16 c, void *fpstp)
104
+uint32_t HELPER(advsimd_muladdh)(uint32_t a, uint32_t b, uint32_t c,
105
+ void *fpstp)
106
{
107
float_status *fpst = fpstp;
108
return float16_muladd(a, b, c, 0, fpst);
109
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_muladd2h)(uint32_t two_a, uint32_t two_b,
110
111
#define ADVSIMD_CMPRES(test) (test) ? 0xffff : 0
112
113
-uint32_t HELPER(advsimd_ceq_f16)(float16 a, float16 b, void *fpstp)
114
+uint32_t HELPER(advsimd_ceq_f16)(uint32_t a, uint32_t b, void *fpstp)
115
{
116
float_status *fpst = fpstp;
117
int compare = float16_compare_quiet(a, b, fpst);
118
return ADVSIMD_CMPRES(compare == float_relation_equal);
119
}
120
121
-uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
122
+uint32_t HELPER(advsimd_cge_f16)(uint32_t a, uint32_t b, void *fpstp)
123
{
124
float_status *fpst = fpstp;
125
int compare = float16_compare(a, b, fpst);
126
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
127
compare == float_relation_equal);
128
}
129
130
-uint32_t HELPER(advsimd_cgt_f16)(float16 a, float16 b, void *fpstp)
131
+uint32_t HELPER(advsimd_cgt_f16)(uint32_t a, uint32_t b, void *fpstp)
132
{
133
float_status *fpst = fpstp;
134
int compare = float16_compare(a, b, fpst);
135
return ADVSIMD_CMPRES(compare == float_relation_greater);
136
}
137
138
-uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
139
+uint32_t HELPER(advsimd_acge_f16)(uint32_t a, uint32_t b, void *fpstp)
140
{
141
float_status *fpst = fpstp;
142
float16 f0 = float16_abs(a);
143
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
144
compare == float_relation_equal);
145
}
146
147
-uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
148
+uint32_t HELPER(advsimd_acgt_f16)(uint32_t a, uint32_t b, void *fpstp)
149
{
150
float_status *fpst = fpstp;
151
float16 f0 = float16_abs(a);
152
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
153
}
154
155
/* round to integral */
156
-float16 HELPER(advsimd_rinth_exact)(float16 x, void *fp_status)
157
+uint32_t HELPER(advsimd_rinth_exact)(uint32_t x, void *fp_status)
158
{
159
return float16_round_to_int(x, fp_status);
160
}
161
162
-float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
163
+uint32_t HELPER(advsimd_rinth)(uint32_t x, void *fp_status)
164
{
165
int old_flags = get_float_exception_flags(fp_status), new_flags;
166
float16 ret;
167
@@ -XXX,XX +XXX,XX @@ float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
168
* setting the mode appropriately before calling the helper.
169
*/
170
171
-uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
172
+uint32_t HELPER(advsimd_f16tosinth)(uint32_t a, void *fpstp)
173
{
174
float_status *fpst = fpstp;
175
176
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
177
return float16_to_int16(a, fpst);
178
}
179
180
-uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
181
+uint32_t HELPER(advsimd_f16touinth)(uint32_t a, void *fpstp)
182
{
183
float_status *fpst = fpstp;
184
185
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
186
* Square Root and Reciprocal square root
187
*/
188
189
-float16 HELPER(sqrt_f16)(float16 a, void *fpstp)
190
+uint32_t HELPER(sqrt_f16)(uint32_t a, void *fpstp)
191
{
192
float_status *s = fpstp;
193
194
diff --git a/target/arm/helper.c b/target/arm/helper.c
67
diff --git a/target/arm/helper.c b/target/arm/helper.c
195
index XXXXXXX..XXXXXXX 100644
68
index XXXXXXX..XXXXXXX 100644
196
--- a/target/arm/helper.c
69
--- a/target/arm/helper.c
197
+++ b/target/arm/helper.c
70
+++ b/target/arm/helper.c
198
@@ -XXX,XX +XXX,XX @@ DO_VFP_cmp(d, float64)
71
@@ -XXX,XX +XXX,XX @@ static void take_aarch32_exception(CPUARMState *env, int new_mode,
199
72
env->regs[14] = env->regs[15] + offset;
200
/* Integer to float and float to integer conversions */
73
}
201
74
env->regs[15] = newpc;
202
-#define CONV_ITOF(name, fsz, sign) \
75
+ arm_rebuild_hflags(env);
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
}
76
}
213
77
214
-#define CONV_FTOI(name, fsz, sign, round) \
78
static void arm_cpu_do_interrupt_aarch32_hyp(CPUState *cs)
215
-uint32_t HELPER(name)(float##fsz x, void *fpstp) \
79
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
216
-{ \
80
pstate_write(env, PSTATE_DAIF | new_mode);
217
- float_status *fpst = fpstp; \
81
env->aarch64 = 1;
218
- if (float##fsz##_is_any_nan(x)) { \
82
aarch64_restore_sp(env, new_el);
219
- float_raise(float_flag_invalid, fpst); \
83
+ helper_rebuild_hflags_a64(env, new_el);
220
- return 0; \
84
221
- } \
85
env->pc = addr;
222
- return float##fsz##_to_##sign##int32##round(x, fpst); \
86
223
+#define CONV_FTOI(name, ftype, fsz, sign, round) \
87
diff --git a/target/arm/machine.c b/target/arm/machine.c
224
+uint32_t HELPER(name)(ftype x, void *fpstp) \
88
index XXXXXXX..XXXXXXX 100644
225
+{ \
89
--- a/target/arm/machine.c
226
+ float_status *fpst = fpstp; \
90
+++ b/target/arm/machine.c
227
+ if (float##fsz##_is_any_nan(x)) { \
91
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
228
+ float_raise(float_flag_invalid, fpst); \
92
if (!kvm_enabled()) {
229
+ return 0; \
93
pmu_op_finish(&cpu->env);
230
+ } \
94
}
231
+ return float##fsz##_to_##sign##int32##round(x, fpst); \
95
+ arm_rebuild_hflags(&cpu->env);
96
97
return 0;
232
}
98
}
233
99
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
234
-#define FLOAT_CONVS(name, p, fsz, sign) \
100
index XXXXXXX..XXXXXXX 100644
235
-CONV_ITOF(vfp_##name##to##p, fsz, sign) \
101
--- a/target/arm/op_helper.c
236
-CONV_FTOI(vfp_to##name##p, fsz, sign, ) \
102
+++ b/target/arm/op_helper.c
237
-CONV_FTOI(vfp_to##name##z##p, fsz, sign, _round_to_zero)
103
@@ -XXX,XX +XXX,XX @@ void HELPER(cpsr_write_eret)(CPUARMState *env, uint32_t val)
238
+#define FLOAT_CONVS(name, p, ftype, fsz, sign) \
104
* state. Do the masking now.
239
+ CONV_ITOF(vfp_##name##to##p, ftype, fsz, sign) \
105
*/
240
+ CONV_FTOI(vfp_to##name##p, ftype, fsz, sign, ) \
106
env->regs[15] &= (env->thumb ? ~1 : ~3);
241
+ CONV_FTOI(vfp_to##name##z##p, ftype, fsz, sign, _round_to_zero)
107
+ arm_rebuild_hflags(env);
242
108
243
-FLOAT_CONVS(si, h, 16, )
109
qemu_mutex_lock_iothread();
244
-FLOAT_CONVS(si, s, 32, )
110
arm_call_el_change_hook(env_archcpu(env));
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
--
111
--
379
2.17.1
112
2.20.1
380
113
381
114
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to memory_region_access_valid().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
6
The callsite in flatview_access_valid() is part of a recursive
3
Continue setting, but not relying upon, env->hflags.
7
loop flatview_access_valid() -> memory_region_access_valid() ->
8
subpage_accepts() -> flatview_access_valid(); we make it pass
9
MEMTXATTRS_UNSPECIFIED for now, until the next several commits
10
have plumbed an attrs parameter through the rest of the loop
11
and we can add an attrs parameter to flatview_access_valid().
12
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20191018174431.1784-18-richard.henderson@linaro.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Message-id: 20180521140402.23318-8-peter.maydell@linaro.org
17
---
9
---
18
include/exec/memory-internal.h | 3 ++-
10
target/arm/translate-a64.c | 13 +++++++++++--
19
exec.c | 4 +++-
11
target/arm/translate.c | 28 +++++++++++++++++++++++-----
20
hw/s390x/s390-pci-inst.c | 3 ++-
12
2 files changed, 34 insertions(+), 7 deletions(-)
21
memory.c | 7 ++++---
22
4 files changed, 11 insertions(+), 6 deletions(-)
23
13
24
diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
25
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory-internal.h
16
--- a/target/arm/translate-a64.c
27
+++ b/include/exec/memory-internal.h
17
+++ b/target/arm/translate-a64.c
28
@@ -XXX,XX +XXX,XX @@ void flatview_unref(FlatView *view);
18
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
29
extern const MemoryRegionOps unassigned_mem_ops;
19
if ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) && (ri->type & ARM_CP_IO)) {
30
20
/* I/O operations must end the TB here (whether read or write) */
31
bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,
21
s->base.is_jmp = DISAS_UPDATE;
32
- unsigned size, bool is_write);
22
- } else if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
33
+ unsigned size, bool is_write,
23
- /* We default to ending the TB on a coprocessor register write,
34
+ MemTxAttrs attrs);
24
+ }
35
25
+ if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
36
void flatview_add_to_dispatch(FlatView *fv, MemoryRegionSection *section);
26
+ /*
37
AddressSpaceDispatch *address_space_dispatch_new(FlatView *fv);
27
+ * A write to any coprocessor regiser that ends a TB
38
diff --git a/exec.c b/exec.c
28
+ * must rebuild the hflags for the next TB.
29
+ */
30
+ TCGv_i32 tcg_el = tcg_const_i32(s->current_el);
31
+ gen_helper_rebuild_hflags_a64(cpu_env, tcg_el);
32
+ tcg_temp_free_i32(tcg_el);
33
+ /*
34
+ * We default to ending the TB on a coprocessor register write,
35
* but allow this to be suppressed by the register definition
36
* (usually only necessary to work around guest bugs).
37
*/
38
diff --git a/target/arm/translate.c b/target/arm/translate.c
39
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
40
--- a/exec.c
40
--- a/target/arm/translate.c
41
+++ b/exec.c
41
+++ b/target/arm/translate.c
42
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
42
@@ -XXX,XX +XXX,XX @@ static int disas_coproc_insn(DisasContext *s, uint32_t insn)
43
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
43
ri = get_arm_cp_reginfo(s->cp_regs,
44
if (!memory_access_is_direct(mr, is_write)) {
44
ENCODE_CP_REG(cpnum, is64, s->ns, crn, crm, opc1, opc2));
45
l = memory_access_size(mr, l, addr);
45
if (ri) {
46
- if (!memory_region_access_valid(mr, xlat, l, is_write)) {
46
+ bool need_exit_tb;
47
+ /* When our callers all have attrs we'll pass them through here */
47
+
48
+ if (!memory_region_access_valid(mr, xlat, l, is_write,
48
/* Check access permissions */
49
+ MEMTXATTRS_UNSPECIFIED)) {
49
if (!cp_access_ok(s->current_el, ri, isread)) {
50
return false;
50
return 1;
51
@@ -XXX,XX +XXX,XX @@ static int disas_coproc_insn(DisasContext *s, uint32_t insn)
51
}
52
}
52
}
53
}
53
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
54
54
index XXXXXXX..XXXXXXX 100644
55
- if ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) && (ri->type & ARM_CP_IO)) {
55
--- a/hw/s390x/s390-pci-inst.c
56
- /* I/O operations must end the TB here (whether read or write) */
56
+++ b/hw/s390x/s390-pci-inst.c
57
- gen_lookup_tb(s);
57
@@ -XXX,XX +XXX,XX @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr,
58
- } else if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
58
mr = s390_get_subregion(mr, offset, len);
59
- /* We default to ending the TB on a coprocessor register write,
59
offset -= mr->addr;
60
+ /* I/O operations must end the TB here (whether read or write) */
60
61
+ need_exit_tb = ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) &&
61
- if (!memory_region_access_valid(mr, offset, len, true)) {
62
+ (ri->type & ARM_CP_IO));
62
+ if (!memory_region_access_valid(mr, offset, len, true,
63
+
63
+ MEMTXATTRS_UNSPECIFIED)) {
64
+ if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
64
s390_program_interrupt(env, PGM_OPERAND, 6, ra);
65
+ /*
65
return 0;
66
+ * A write to any coprocessor regiser that ends a TB
66
}
67
+ * must rebuild the hflags for the next TB.
67
diff --git a/memory.c b/memory.c
68
+ */
68
index XXXXXXX..XXXXXXX 100644
69
+ TCGv_i32 tcg_el = tcg_const_i32(s->current_el);
69
--- a/memory.c
70
+ if (arm_dc_feature(s, ARM_FEATURE_M)) {
70
+++ b/memory.c
71
+ gen_helper_rebuild_hflags_m32(cpu_env, tcg_el);
71
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps ram_device_mem_ops = {
72
+ } else {
72
bool memory_region_access_valid(MemoryRegion *mr,
73
+ gen_helper_rebuild_hflags_a32(cpu_env, tcg_el);
73
hwaddr addr,
74
+ }
74
unsigned size,
75
+ tcg_temp_free_i32(tcg_el);
75
- bool is_write)
76
+ /*
76
+ bool is_write,
77
+ * We default to ending the TB on a coprocessor register write,
77
+ MemTxAttrs attrs)
78
* but allow this to be suppressed by the register definition
78
{
79
* (usually only necessary to work around guest bugs).
79
int access_size_min, access_size_max;
80
*/
80
int access_size, i;
81
+ need_exit_tb = true;
81
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_read(MemoryRegion *mr,
82
+ }
82
{
83
+ if (need_exit_tb) {
83
MemTxResult r;
84
gen_lookup_tb(s);
84
85
}
85
- if (!memory_region_access_valid(mr, addr, size, false)) {
86
86
+ if (!memory_region_access_valid(mr, addr, size, false, attrs)) {
87
*pval = unassigned_mem_read(mr, addr, size);
88
return MEMTX_DECODE_ERROR;
89
}
90
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_write(MemoryRegion *mr,
91
unsigned size,
92
MemTxAttrs attrs)
93
{
94
- if (!memory_region_access_valid(mr, addr, size, true)) {
95
+ if (!memory_region_access_valid(mr, addr, size, true, attrs)) {
96
unassigned_mem_write(mr, addr, data, size);
97
return MEMTX_DECODE_ERROR;
98
}
99
--
87
--
100
2.17.1
88
2.20.1
101
89
102
90
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to address_space_access_valid().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Continue setting, but not relying upon, env->hflags.
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20191018174431.1784-19-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-6-peter.maydell@linaro.org
10
---
9
---
11
include/exec/memory.h | 4 +++-
10
target/arm/op_helper.c | 3 +++
12
include/sysemu/dma.h | 3 ++-
11
1 file changed, 3 insertions(+)
13
exec.c | 3 ++-
14
target/s390x/diag.c | 6 ++++--
15
target/s390x/excp_helper.c | 3 ++-
16
target/s390x/mmu_helper.c | 3 ++-
17
target/s390x/sigp.c | 3 ++-
18
7 files changed, 17 insertions(+), 8 deletions(-)
19
12
20
diff --git a/include/exec/memory.h b/include/exec/memory.h
13
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
21
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
22
--- a/include/exec/memory.h
15
--- a/target/arm/op_helper.c
23
+++ b/include/exec/memory.h
16
+++ b/target/arm/op_helper.c
24
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
17
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(usat16)(CPUARMState *env, uint32_t x, uint32_t shift)
25
* @addr: address within that address space
18
void HELPER(setend)(CPUARMState *env)
26
* @len: length of the area to be checked
27
* @is_write: indicates the transfer direction
28
+ * @attrs: memory attributes
29
*/
30
-bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write);
31
+bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len,
32
+ bool is_write, MemTxAttrs attrs);
33
34
/* address_space_map: map a physical memory region into a host virtual address
35
*
36
diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
37
index XXXXXXX..XXXXXXX 100644
38
--- a/include/sysemu/dma.h
39
+++ b/include/sysemu/dma.h
40
@@ -XXX,XX +XXX,XX @@ static inline bool dma_memory_valid(AddressSpace *as,
41
DMADirection dir)
42
{
19
{
43
return address_space_access_valid(as, addr, len,
20
env->uncached_cpsr ^= CPSR_E;
44
- dir == DMA_DIRECTION_FROM_DEVICE);
21
+ arm_rebuild_hflags(env);
45
+ dir == DMA_DIRECTION_FROM_DEVICE,
46
+ MEMTXATTRS_UNSPECIFIED);
47
}
22
}
48
23
49
static inline int dma_memory_rw_relaxed(AddressSpace *as, dma_addr_t addr,
24
/* Function checks whether WFx (WFI/WFE) instructions are set up to be trapped.
50
diff --git a/exec.c b/exec.c
25
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(cpsr_read)(CPUARMState *env)
51
index XXXXXXX..XXXXXXX 100644
26
void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask)
52
--- a/exec.c
27
{
53
+++ b/exec.c
28
cpsr_write(env, val, mask, CPSRWriteByInstr);
54
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
29
+ /* TODO: Not all cpsr bits are relevant to hflags. */
30
+ arm_rebuild_hflags(env);
55
}
31
}
56
32
57
bool address_space_access_valid(AddressSpace *as, hwaddr addr,
33
/* Write the CPSR for a 32-bit exception return */
58
- int len, bool is_write)
59
+ int len, bool is_write,
60
+ MemTxAttrs attrs)
61
{
62
FlatView *fv;
63
bool result;
64
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/s390x/diag.c
67
+++ b/target/s390x/diag.c
68
@@ -XXX,XX +XXX,XX @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
69
return;
70
}
71
if (!address_space_access_valid(&address_space_memory, addr,
72
- sizeof(IplParameterBlock), false)) {
73
+ sizeof(IplParameterBlock), false,
74
+ MEMTXATTRS_UNSPECIFIED)) {
75
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
76
return;
77
}
78
@@ -XXX,XX +XXX,XX @@ out:
79
return;
80
}
81
if (!address_space_access_valid(&address_space_memory, addr,
82
- sizeof(IplParameterBlock), true)) {
83
+ sizeof(IplParameterBlock), true,
84
+ MEMTXATTRS_UNSPECIFIED)) {
85
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
86
return;
87
}
88
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
89
index XXXXXXX..XXXXXXX 100644
90
--- a/target/s390x/excp_helper.c
91
+++ b/target/s390x/excp_helper.c
92
@@ -XXX,XX +XXX,XX @@ int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr orig_vaddr, int size,
93
94
/* check out of RAM access */
95
if (!address_space_access_valid(&address_space_memory, raddr,
96
- TARGET_PAGE_SIZE, rw)) {
97
+ TARGET_PAGE_SIZE, rw,
98
+ MEMTXATTRS_UNSPECIFIED)) {
99
DPRINTF("%s: raddr %" PRIx64 " > ram_size %" PRIx64 "\n", __func__,
100
(uint64_t)raddr, (uint64_t)ram_size);
101
trigger_pgm_exception(env, PGM_ADDRESSING, ILEN_AUTO);
102
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
103
index XXXXXXX..XXXXXXX 100644
104
--- a/target/s390x/mmu_helper.c
105
+++ b/target/s390x/mmu_helper.c
106
@@ -XXX,XX +XXX,XX @@ static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages,
107
return ret;
108
}
109
if (!address_space_access_valid(&address_space_memory, pages[i],
110
- TARGET_PAGE_SIZE, is_write)) {
111
+ TARGET_PAGE_SIZE, is_write,
112
+ MEMTXATTRS_UNSPECIFIED)) {
113
trigger_access_exception(env, PGM_ADDRESSING, ILEN_AUTO, 0);
114
return -EFAULT;
115
}
116
diff --git a/target/s390x/sigp.c b/target/s390x/sigp.c
117
index XXXXXXX..XXXXXXX 100644
118
--- a/target/s390x/sigp.c
119
+++ b/target/s390x/sigp.c
120
@@ -XXX,XX +XXX,XX @@ static void sigp_set_prefix(CPUState *cs, run_on_cpu_data arg)
121
cpu_synchronize_state(cs);
122
123
if (!address_space_access_valid(&address_space_memory, addr,
124
- sizeof(struct LowCore), false)) {
125
+ sizeof(struct LowCore), false,
126
+ MEMTXATTRS_UNSPECIFIED)) {
127
set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER);
128
return;
129
}
130
--
34
--
131
2.17.1
35
2.20.1
132
36
133
37
diff view generated by jsdifflib
1
From: Francisco Iglesias <frasse.iglesias@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Coverity found that the string return by 'object_get_canonical_path' was not
3
Continue setting, but not relying upon, env->hflags.
4
being freed at two locations in the model (CID 1391294 and CID 1391293) and
5
also that a memset was being called with a value greater than the max of a byte
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
4
10
Signed-off-by: Francisco Iglesias <frasse.iglesias@gmail.com>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Message-id: 20191018174431.1784-20-richard.henderson@linaro.org
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>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
9
---
17
hw/dma/xlnx-zdma.c | 10 +++++++---
10
target/arm/helper.c | 10 ++++++++++
18
1 file changed, 7 insertions(+), 3 deletions(-)
11
1 file changed, 10 insertions(+)
19
12
20
diff --git a/hw/dma/xlnx-zdma.c b/hw/dma/xlnx-zdma.c
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
21
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/dma/xlnx-zdma.c
15
--- a/target/arm/helper.c
23
+++ b/hw/dma/xlnx-zdma.c
16
+++ b/target/arm/helper.c
24
@@ -XXX,XX +XXX,XX @@ static bool zdma_load_descriptor(XlnxZDMA *s, uint64_t addr, void *buf)
17
@@ -XXX,XX +XXX,XX @@ static void sctlr_write(CPUARMState *env, const ARMCPRegInfo *ri,
25
qemu_log_mask(LOG_GUEST_ERROR,
18
/* ??? Lots of these bits are not implemented. */
26
"zdma: unaligned descriptor at %" PRIx64,
19
/* This may enable/disable the MMU, so do a TLB flush. */
27
addr);
20
tlb_flush(CPU(cpu));
28
- memset(buf, 0xdeadbeef, sizeof(XlnxZDMADescr));
21
+
29
+ memset(buf, 0x0, sizeof(XlnxZDMADescr));
22
+ if (ri->type & ARM_CP_SUPPRESS_TB_END) {
30
s->error = true;
23
+ /*
31
return false;
24
+ * Normally we would always end the TB on an SCTLR write; see the
32
}
25
+ * comment in ARMCPRegInfo sctlr initialization below for why Xscale
33
@@ -XXX,XX +XXX,XX @@ static uint64_t zdma_read(void *opaque, hwaddr addr, unsigned size)
26
+ * is special. Setting ARM_CP_SUPPRESS_TB_END also stops the rebuild
34
RegisterInfo *r = &s->regs_info[addr / 4];
27
+ * of hflags from the translator, so do it here.
35
28
+ */
36
if (!r->data) {
29
+ arm_rebuild_hflags(env);
37
+ gchar *path = object_get_canonical_path(OBJECT(s));
30
+ }
38
qemu_log("%s: Decode error: read from %" HWADDR_PRIx "\n",
31
}
39
- object_get_canonical_path(OBJECT(s)),
32
40
+ path,
33
static CPAccessResult fpexc32_access(CPUARMState *env, const ARMCPRegInfo *ri,
41
addr);
42
+ g_free(path);
43
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
44
zdma_ch_imr_update_irq(s);
45
return 0;
46
@@ -XXX,XX +XXX,XX @@ static void zdma_write(void *opaque, hwaddr addr, uint64_t value,
47
RegisterInfo *r = &s->regs_info[addr / 4];
48
49
if (!r->data) {
50
+ gchar *path = object_get_canonical_path(OBJECT(s));
51
qemu_log("%s: Decode error: write to %" HWADDR_PRIx "=%" PRIx64 "\n",
52
- object_get_canonical_path(OBJECT(s)),
53
+ path,
54
addr, value);
55
+ g_free(path);
56
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
57
zdma_ch_imr_update_irq(s);
58
return;
59
--
34
--
60
2.17.1
35
2.20.1
61
36
62
37
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to flatview_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
Continue setting, but not relying upon, env->hflags.
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20191018174431.1784-21-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
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
target/arm/m_helper.c | 6 ++++++
12
1 file changed, 5 insertions(+), 7 deletions(-)
11
target/arm/translate.c | 5 ++++-
12
2 files changed, 10 insertions(+), 1 deletion(-)
13
13
14
diff --git a/exec.c b/exec.c
14
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
16
--- a/target/arm/m_helper.c
17
+++ b/exec.c
17
+++ b/target/arm/m_helper.c
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
18
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_bxns)(CPUARMState *env, uint32_t dest)
19
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
19
switch_v7m_security_state(env, dest & 1);
20
const uint8_t *buf, int len);
20
env->thumb = 1;
21
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
21
env->regs[15] = dest & ~1;
22
- bool is_write);
22
+ arm_rebuild_hflags(env);
23
+ bool is_write, MemTxAttrs attrs);
24
25
static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,
26
unsigned len, MemTxAttrs attrs)
27
@@ -XXX,XX +XXX,XX @@ static bool subpage_accepts(void *opaque, hwaddr addr,
28
#endif
29
30
return flatview_access_valid(subpage->fv, addr + subpage->base,
31
- len, is_write);
32
+ len, is_write, attrs);
33
}
23
}
34
24
35
static const MemoryRegionOps subpage_ops = {
25
void HELPER(v7m_blxns)(CPUARMState *env, uint32_t dest)
36
@@ -XXX,XX +XXX,XX @@ static void cpu_notify_map_clients(void)
26
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_blxns)(CPUARMState *env, uint32_t dest)
27
switch_v7m_security_state(env, 0);
28
env->thumb = 1;
29
env->regs[15] = dest;
30
+ arm_rebuild_hflags(env);
37
}
31
}
38
32
39
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
33
static uint32_t *get_v7m_sp_ptr(CPUARMState *env, bool secure, bool threadmode,
40
- bool is_write)
34
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
41
+ bool is_write, MemTxAttrs attrs)
35
env->regs[14] = lr;
36
env->regs[15] = addr & 0xfffffffe;
37
env->thumb = addr & 1;
38
+ arm_rebuild_hflags(env);
39
}
40
41
static void v7m_update_fpccr(CPUARMState *env, uint32_t frameptr,
42
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
43
44
/* Otherwise, we have a successful exception exit. */
45
arm_clear_exclusive(env);
46
+ arm_rebuild_hflags(env);
47
qemu_log_mask(CPU_LOG_INT, "...successful exception return\n");
48
}
49
50
@@ -XXX,XX +XXX,XX @@ static bool do_v7m_function_return(ARMCPU *cpu)
51
xpsr_write(env, 0, XPSR_IT);
52
env->thumb = newpc & 1;
53
env->regs[15] = newpc & ~1;
54
+ arm_rebuild_hflags(env);
55
56
qemu_log_mask(CPU_LOG_INT, "...function return successful\n");
57
return true;
58
@@ -XXX,XX +XXX,XX @@ static bool v7m_handle_execute_nsc(ARMCPU *cpu)
59
switch_v7m_security_state(env, true);
60
xpsr_write(env, 0, XPSR_IT);
61
env->regs[15] += 4;
62
+ arm_rebuild_hflags(env);
63
return true;
64
65
gen_invep:
66
diff --git a/target/arm/translate.c b/target/arm/translate.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/arm/translate.c
69
+++ b/target/arm/translate.c
70
@@ -XXX,XX +XXX,XX @@ static bool trans_MRS_v7m(DisasContext *s, arg_MRS_v7m *a)
71
72
static bool trans_MSR_v7m(DisasContext *s, arg_MSR_v7m *a)
42
{
73
{
43
MemoryRegion *mr;
74
- TCGv_i32 addr, reg;
44
hwaddr l, xlat;
75
+ TCGv_i32 addr, reg, el;
45
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
76
46
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
77
if (!arm_dc_feature(s, ARM_FEATURE_M)) {
47
if (!memory_access_is_direct(mr, is_write)) {
78
return false;
48
l = memory_access_size(mr, l, addr);
79
@@ -XXX,XX +XXX,XX @@ static bool trans_MSR_v7m(DisasContext *s, arg_MSR_v7m *a)
49
- /* When our callers all have attrs we'll pass them through here */
80
gen_helper_v7m_msr(cpu_env, addr, reg);
50
- if (!memory_region_access_valid(mr, xlat, l, is_write,
81
tcg_temp_free_i32(addr);
51
- MEMTXATTRS_UNSPECIFIED)) {
82
tcg_temp_free_i32(reg);
52
+ if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
83
+ el = tcg_const_i32(s->current_el);
53
return false;
84
+ gen_helper_rebuild_hflags_m32(cpu_env, el);
54
}
85
+ tcg_temp_free_i32(el);
55
}
86
gen_lookup_tb(s);
56
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
87
return true;
57
58
rcu_read_lock();
59
fv = address_space_to_flatview(as);
60
- result = flatview_access_valid(fv, addr, len, is_write);
61
+ result = flatview_access_valid(fv, addr, len, is_write, attrs);
62
rcu_read_unlock();
63
return result;
64
}
88
}
65
--
89
--
66
2.17.1
90
2.20.1
67
91
68
92
diff view generated by jsdifflib
1
From: Jan Kiszka <jan.kiszka@siemens.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
There was a nasty flip in identifying which register group an access is
3
Continue setting, but not relying upon, env->hflags.
4
targeting. The issue caused spuriously raised priorities of the guest
5
when handing CPUs over in the Jailhouse hypervisor.
6
4
7
Cc: qemu-stable@nongnu.org
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 28b927d3-da58-bce4-cc13-bfec7f9b1cb9@siemens.com
7
Message-id: 20191018174431.1784-22-richard.henderson@linaro.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
10
---
13
hw/intc/arm_gicv3_cpuif.c | 12 ++++++------
11
hw/intc/armv7m_nvic.c | 22 +++++++++++++---------
14
1 file changed, 6 insertions(+), 6 deletions(-)
12
1 file changed, 13 insertions(+), 9 deletions(-)
15
13
16
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
14
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/arm_gicv3_cpuif.c
16
--- a/hw/intc/armv7m_nvic.c
19
+++ b/hw/intc/arm_gicv3_cpuif.c
17
+++ b/hw/intc/armv7m_nvic.c
20
@@ -XXX,XX +XXX,XX @@ static uint64_t icv_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
21
{
19
}
22
GICv3CPUState *cs = icc_cs_from_env(env);
20
}
23
int regno = ri->opc2 & 3;
21
nvic_irq_update(s);
24
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
22
- return MEMTX_OK;
25
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
23
+ goto exit_ok;
26
uint64_t value = cs->ich_apr[grp][regno];
24
case 0x200 ... 0x23f: /* NVIC Set pend */
27
25
/* the special logic in armv7m_nvic_set_pending()
28
trace_gicv3_icv_ap_read(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
26
* is not needed since IRQs are never escalated
29
@@ -XXX,XX +XXX,XX @@ static void icv_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
27
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
30
{
28
}
31
GICv3CPUState *cs = icc_cs_from_env(env);
29
}
32
int regno = ri->opc2 & 3;
30
nvic_irq_update(s);
33
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
31
- return MEMTX_OK;
34
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
32
+ goto exit_ok;
35
33
case 0x300 ... 0x33f: /* NVIC Active */
36
trace_gicv3_icv_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
34
- return MEMTX_OK; /* R/O */
37
35
+ goto exit_ok; /* R/O */
38
@@ -XXX,XX +XXX,XX @@ static uint64_t icc_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
36
case 0x400 ... 0x5ef: /* NVIC Priority */
39
uint64_t value;
37
startvec = (offset - 0x400) + NVIC_FIRST_IRQ; /* vector # */
40
38
41
int regno = ri->opc2 & 3;
39
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
42
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
40
}
43
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
41
}
44
42
nvic_irq_update(s);
45
if (icv_access(env, grp == GICV3_G0 ? HCR_FMO : HCR_IMO)) {
43
- return MEMTX_OK;
46
return icv_ap_read(env, ri);
44
+ goto exit_ok;
47
@@ -XXX,XX +XXX,XX @@ static void icc_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
45
case 0xd18 ... 0xd1b: /* System Handler Priority (SHPR1) */
48
GICv3CPUState *cs = icc_cs_from_env(env);
46
if (!arm_feature(&s->cpu->env, ARM_FEATURE_M_MAIN)) {
49
47
- return MEMTX_OK;
50
int regno = ri->opc2 & 3;
48
+ goto exit_ok;
51
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
49
}
52
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
50
/* fall through */
53
51
case 0xd1c ... 0xd23: /* System Handler Priority (SHPR2, SHPR3) */
54
if (icv_access(env, grp == GICV3_G0 ? HCR_FMO : HCR_IMO)) {
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
55
icv_ap_write(env, ri, value);
53
set_prio(s, hdlidx, sbank, newprio);
56
@@ -XXX,XX +XXX,XX @@ static uint64_t ich_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
54
}
57
{
55
nvic_irq_update(s);
58
GICv3CPUState *cs = icc_cs_from_env(env);
56
- return MEMTX_OK;
59
int regno = ri->opc2 & 3;
57
+ goto exit_ok;
60
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
58
case 0xd28 ... 0xd2b: /* Configurable Fault Status (CFSR) */
61
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
59
if (!arm_feature(&s->cpu->env, ARM_FEATURE_M_MAIN)) {
62
uint64_t value;
60
- return MEMTX_OK;
63
61
+ goto exit_ok;
64
value = cs->ich_apr[grp][regno];
62
}
65
@@ -XXX,XX +XXX,XX @@ static void ich_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
63
/* All bits are W1C, so construct 32 bit value with 0s in
66
{
64
* the parts not written by the access size
67
GICv3CPUState *cs = icc_cs_from_env(env);
65
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
68
int regno = ri->opc2 & 3;
66
*/
69
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
67
s->cpu->env.v7m.cfsr[M_REG_NS] &= ~(value & R_V7M_CFSR_BFSR_MASK);
70
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
68
}
71
69
- return MEMTX_OK;
72
trace_gicv3_ich_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
70
+ goto exit_ok;
71
}
72
if (size == 4) {
73
nvic_writel(s, offset, value, attrs);
74
- return MEMTX_OK;
75
+ goto exit_ok;
76
}
77
qemu_log_mask(LOG_GUEST_ERROR,
78
"NVIC: Bad write of size %d at offset 0x%x\n", size, offset);
79
/* This is UNPREDICTABLE; treat as RAZ/WI */
80
+
81
+ exit_ok:
82
+ /* Ensure any changes made are reflected in the cached hflags. */
83
+ arm_rebuild_hflags(&s->cpu->env);
84
return MEMTX_OK;
85
}
73
86
74
--
87
--
75
2.17.1
88
2.20.1
76
89
77
90
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to flatview_do_translate().
3
2
3
This is the payoff.
4
5
From perf record -g data of ubuntu 18 boot and shutdown:
6
7
BEFORE:
8
9
- 23.02% 2.82% qemu-system-aar [.] helper_lookup_tb_ptr
10
- 20.22% helper_lookup_tb_ptr
11
+ 10.05% tb_htable_lookup
12
- 9.13% cpu_get_tb_cpu_state
13
3.20% aa64_va_parameters_both
14
0.55% fp_exception_el
15
16
- 11.66% 4.74% qemu-system-aar [.] cpu_get_tb_cpu_state
17
- 6.96% cpu_get_tb_cpu_state
18
3.63% aa64_va_parameters_both
19
0.60% fp_exception_el
20
0.53% sve_exception_el
21
22
AFTER:
23
24
- 16.40% 3.40% qemu-system-aar [.] helper_lookup_tb_ptr
25
- 13.03% helper_lookup_tb_ptr
26
+ 11.19% tb_htable_lookup
27
0.55% cpu_get_tb_cpu_state
28
29
0.98% 0.71% qemu-system-aar [.] cpu_get_tb_cpu_state
30
31
0.87% 0.24% qemu-system-aar [.] rebuild_hflags_a64
32
33
Before, helper_lookup_tb_ptr is the second hottest function in the
34
application, consuming almost a quarter of the runtime. Within the
35
entire execution, cpu_get_tb_cpu_state consumes about 12%.
36
37
After, helper_lookup_tb_ptr has dropped to the fourth hottest function,
38
with consumption dropping to a sixth of the runtime. Within the
39
entire execution, cpu_get_tb_cpu_state has dropped below 1%, and the
40
supporting function to rebuild hflags also consumes about 1%.
41
42
Assertions are retained for --enable-debug-tcg.
43
44
Tested-by: Alex Bennée <alex.bennee@linaro.org>
45
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
46
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
47
Message-id: 20191018174431.1784-23-richard.henderson@linaro.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
48
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
---
49
---
9
exec.c | 9 ++++++---
50
target/arm/helper.c | 9 ++++++---
10
1 file changed, 6 insertions(+), 3 deletions(-)
51
1 file changed, 6 insertions(+), 3 deletions(-)
11
52
12
diff --git a/exec.c b/exec.c
53
diff --git a/target/arm/helper.c b/target/arm/helper.c
13
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
55
--- a/target/arm/helper.c
15
+++ b/exec.c
56
+++ b/target/arm/helper.c
16
@@ -XXX,XX +XXX,XX @@ unassigned:
57
@@ -XXX,XX +XXX,XX @@ void HELPER(rebuild_hflags_a64)(CPUARMState *env, int el)
17
* @is_write: whether the translation operation is for write
58
void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
18
* @is_mmio: whether this can be MMIO, set true if it can
59
target_ulong *cs_base, uint32_t *pflags)
19
* @target_as: the address space targeted by the IOMMU
20
+ * @attrs: memory transaction attributes
21
*
22
* This function is called from RCU critical section
23
*/
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
25
hwaddr *page_mask_out,
26
bool is_write,
27
bool is_mmio,
28
- AddressSpace **target_as)
29
+ AddressSpace **target_as,
30
+ MemTxAttrs attrs)
31
{
60
{
32
MemoryRegionSection *section;
61
- uint32_t flags, pstate_for_ss;
33
IOMMUMemoryRegion *iommu_mr;
62
+ uint32_t flags = env->hflags;
34
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
63
+ uint32_t pstate_for_ss;
35
* but page mask.
64
36
*/
65
*cs_base = 0;
37
section = flatview_do_translate(address_space_to_flatview(as), addr, &xlat,
66
- flags = rebuild_hflags_internal(env);
38
- NULL, &page_mask, is_write, false, &as);
67
+#ifdef CONFIG_DEBUG_TCG
39
+ NULL, &page_mask, is_write, false, &as,
68
+ assert(flags == rebuild_hflags_internal(env));
40
+ attrs);
69
+#endif
41
70
42
/* Illegal translation */
71
- if (is_a64(env)) {
43
if (section.mr == &io_mem_unassigned) {
72
+ if (FIELD_EX32(flags, TBFLAG_ANY, AARCH64_STATE)) {
44
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
73
*pc = env->pc;
45
74
if (cpu_isar_feature(aa64_bti, env_archcpu(env))) {
46
/* This can be MMIO, so setup MMIO bit. */
75
flags = FIELD_DP32(flags, TBFLAG_A64, BTYPE, env->btype);
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
--
76
--
54
2.17.1
77
2.20.1
55
78
56
79
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
This file keeps the various QDev blocks separated by comments.
4
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Cleber Rosa <crosa@redhat.com>
7
Message-id: 20191005154748.21718-3-f4bug@amsat.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
hw/sd/sdhci.c | 3 ++-
11
1 file changed, 2 insertions(+), 1 deletion(-)
12
13
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/sdhci.c
16
+++ b/hw/sd/sdhci.c
17
@@ -XXX,XX +XXX,XX @@ static const TypeInfo sdhci_bus_info = {
18
.class_init = sdhci_bus_class_init,
19
};
20
21
+/* --- qdev i.MX eSDHC --- */
22
+
23
static uint64_t usdhc_read(void *opaque, hwaddr offset, unsigned size)
24
{
25
SDHCIState *s = SYSBUS_SDHCI(opaque);
26
@@ -XXX,XX +XXX,XX @@ usdhc_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
27
}
28
}
29
30
-
31
static const MemoryRegionOps usdhc_mmio_ops = {
32
.read = usdhc_read,
33
.write = usdhc_write,
34
--
35
2.20.1
36
37
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
The Linux kernel access few S3C-specific registers [1] to set some
4
clock. We don't care about this part for device emulation [2]. Add
5
a dummy device to properly ignore these accesses, so we can focus
6
on the important registers missing.
7
8
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/mmc/host/sdhci-s3c-regs.h?h=cc014f3
9
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/mmc/host/sdhci-s3c.c?h=v5.3#n263
10
11
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
13
Message-id: 20191005154748.21718-4-f4bug@amsat.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
include/hw/sd/sdhci.h | 2 ++
17
hw/sd/sdhci.c | 65 +++++++++++++++++++++++++++++++++++++++++++
18
2 files changed, 67 insertions(+)
19
20
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/sd/sdhci.h
23
+++ b/include/hw/sd/sdhci.h
24
@@ -XXX,XX +XXX,XX @@ typedef struct SDHCIState {
25
26
#define TYPE_IMX_USDHC "imx-usdhc"
27
28
+#define TYPE_S3C_SDHCI "s3c-sdhci"
29
+
30
#endif /* SDHCI_H */
31
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/sd/sdhci.c
34
+++ b/hw/sd/sdhci.c
35
@@ -XXX,XX +XXX,XX @@ static const TypeInfo imx_usdhc_info = {
36
.instance_init = imx_usdhc_init,
37
};
38
39
+/* --- qdev Samsung s3c --- */
40
+
41
+#define S3C_SDHCI_CONTROL2 0x80
42
+#define S3C_SDHCI_CONTROL3 0x84
43
+#define S3C_SDHCI_CONTROL4 0x8c
44
+
45
+static uint64_t sdhci_s3c_read(void *opaque, hwaddr offset, unsigned size)
46
+{
47
+ uint64_t ret;
48
+
49
+ switch (offset) {
50
+ case S3C_SDHCI_CONTROL2:
51
+ case S3C_SDHCI_CONTROL3:
52
+ case S3C_SDHCI_CONTROL4:
53
+ /* ignore */
54
+ ret = 0;
55
+ break;
56
+ default:
57
+ ret = sdhci_read(opaque, offset, size);
58
+ break;
59
+ }
60
+
61
+ return ret;
62
+}
63
+
64
+static void sdhci_s3c_write(void *opaque, hwaddr offset, uint64_t val,
65
+ unsigned size)
66
+{
67
+ switch (offset) {
68
+ case S3C_SDHCI_CONTROL2:
69
+ case S3C_SDHCI_CONTROL3:
70
+ case S3C_SDHCI_CONTROL4:
71
+ /* ignore */
72
+ break;
73
+ default:
74
+ sdhci_write(opaque, offset, val, size);
75
+ break;
76
+ }
77
+}
78
+
79
+static const MemoryRegionOps sdhci_s3c_mmio_ops = {
80
+ .read = sdhci_s3c_read,
81
+ .write = sdhci_s3c_write,
82
+ .valid = {
83
+ .min_access_size = 1,
84
+ .max_access_size = 4,
85
+ .unaligned = false
86
+ },
87
+ .endianness = DEVICE_LITTLE_ENDIAN,
88
+};
89
+
90
+static void sdhci_s3c_init(Object *obj)
91
+{
92
+ SDHCIState *s = SYSBUS_SDHCI(obj);
93
+
94
+ s->io_ops = &sdhci_s3c_mmio_ops;
95
+}
96
+
97
+static const TypeInfo sdhci_s3c_info = {
98
+ .name = TYPE_S3C_SDHCI ,
99
+ .parent = TYPE_SYSBUS_SDHCI,
100
+ .instance_init = sdhci_s3c_init,
101
+};
102
+
103
static void sdhci_register_types(void)
104
{
105
type_register_static(&sdhci_sysbus_info);
106
type_register_static(&sdhci_bus_info);
107
type_register_static(&imx_usdhc_info);
108
+ type_register_static(&sdhci_s3c_info);
109
}
110
111
type_init(sdhci_register_types)
112
--
113
2.20.1
114
115
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
The Exynos SoC has specific SDHCI registers. Use the s3c SDHCI
4
model which handle these specific registers.
5
6
This silents the following "SDHC ... not implemented" warnings so
7
we can focus on the important registers missing:
8
9
$ qemu-system-arm ... -d unimp \
10
-append "... root=/dev/mmcblk0 rootfstype=ext4 rw rootwait" \
11
-drive file=linux-build-test/rootfs/arm/rootfs-armv5.ext2,if=sd,format=raw
12
[...]
13
[ 25.744858] sdhci: Secure Digital Host Controller Interface driver
14
[ 25.745862] sdhci: Copyright(c) Pierre Ossman
15
[ 25.783188] s3c-sdhci 12530000.sdhci: clock source 2: mmc_busclk.2 (12000000 Hz)
16
SDHC rd_4b @0x80 not implemented
17
SDHC wr_4b @0x80 <- 0x00000020 not implemented
18
SDHC wr_4b @0x8c <- 0x00030000 not implemented
19
SDHC rd_4b @0x80 not implemented
20
SDHC wr_4b @0x80 <- 0xc0004100 not implemented
21
SDHC wr_4b @0x84 <- 0x80808080 not implemented
22
[ 26.013318] mmc0: SDHCI controller on samsung-hsmmc [12530000.sdhci] using ADMA
23
[ 26.032318] Synopsys Designware Multimedia Card Interface Driver
24
[ 42.024885] Waiting for root device /dev/mmcblk0...
25
26
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
27
Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
28
Message-id: 20191005154748.21718-5-f4bug@amsat.org
29
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
30
---
31
hw/arm/exynos4210.c | 2 +-
32
1 file changed, 1 insertion(+), 1 deletion(-)
33
34
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/arm/exynos4210.c
37
+++ b/hw/arm/exynos4210.c
38
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
39
* public datasheet which is very similar (implementing
40
* MMC Specification Version 4.0 being the only difference noted)
41
*/
42
- dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
43
+ dev = qdev_create(NULL, TYPE_S3C_SDHCI);
44
qdev_prop_set_uint64(dev, "capareg", EXYNOS4210_SDHCI_CAPABILITIES);
45
qdev_init_nofail(dev);
46
47
--
48
2.20.1
49
50
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
kvm_irqchip_create called by kvm_init will call kvm_init_irq_routing to
3
IEC binary prefixes ease code review: the unit is explicit.
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
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 20191021190653.9511-2-philmd@redhat.com
11
Message-id: 1527750994-14360-1-git-send-email-zhaoshenglong@huawei.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
10
---
14
hw/intc/arm_gic_kvm.c | 1 -
11
hw/arm/xilinx_zynq.c | 3 ++-
15
hw/intc/arm_gicv3_kvm.c | 1 -
12
1 file changed, 2 insertions(+), 1 deletion(-)
16
2 files changed, 2 deletions(-)
17
13
18
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
14
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/intc/arm_gic_kvm.c
16
--- a/hw/arm/xilinx_zynq.c
21
+++ b/hw/intc/arm_gic_kvm.c
17
+++ b/hw/arm/xilinx_zynq.c
22
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
18
@@ -XXX,XX +XXX,XX @@
23
19
*/
24
if (kvm_has_gsi_routing()) {
20
25
/* set up irq routing */
21
#include "qemu/osdep.h"
26
- kvm_init_irq_routing(kvm_state);
22
+#include "qemu/units.h"
27
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
23
#include "qapi/error.h"
28
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
24
#include "cpu.h"
29
}
25
#include "hw/sysbus.h"
30
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
26
@@ -XXX,XX +XXX,XX @@ static void zynq_init(MachineState *machine)
31
index XXXXXXX..XXXXXXX 100644
27
memory_region_add_subregion(address_space_mem, 0, ext_ram);
32
--- a/hw/intc/arm_gicv3_kvm.c
28
33
+++ b/hw/intc/arm_gicv3_kvm.c
29
/* 256K of on-chip memory */
34
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
30
- memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 << 10,
35
31
+ memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB,
36
if (kvm_has_gsi_routing()) {
32
&error_fatal);
37
/* set up irq routing */
33
memory_region_add_subregion(address_space_mem, 0xFFFC0000, ocm_ram);
38
- kvm_init_irq_routing(kvm_state);
34
39
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
40
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
41
}
42
--
35
--
43
2.17.1
36
2.20.1
44
37
45
38
diff view generated by jsdifflib
1
From: Paolo Bonzini <pbonzini@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
cpregs_keys is an uint32_t* so the allocation should use uint32_t.
3
IEC binary prefixes ease code review: the unit is explicit.
4
g_new is even better because it is type-safe.
5
4
6
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20191021190653.9511-3-philmd@redhat.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
hw/arm/mps2-tz.c | 3 ++-
12
1 file changed, 1 insertion(+), 2 deletions(-)
12
hw/arm/mps2.c | 3 ++-
13
2 files changed, 4 insertions(+), 2 deletions(-)
13
14
14
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
15
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/gdbstub.c
17
--- a/hw/arm/mps2-tz.c
17
+++ b/target/arm/gdbstub.c
18
+++ b/hw/arm/mps2-tz.c
18
@@ -XXX,XX +XXX,XX @@ int arm_gen_dynamic_xml(CPUState *cs)
19
@@ -XXX,XX +XXX,XX @@
19
RegisterSysregXmlParam param = {cs, s};
20
*/
20
21
21
cpu->dyn_xml.num_cpregs = 0;
22
#include "qemu/osdep.h"
22
- cpu->dyn_xml.cpregs_keys = g_malloc(sizeof(uint32_t *) *
23
+#include "qemu/units.h"
23
- g_hash_table_size(cpu->cp_regs));
24
#include "qapi/error.h"
24
+ cpu->dyn_xml.cpregs_keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
25
#include "qemu/error-report.h"
25
g_string_printf(s, "<?xml version=\"1.0\"?>");
26
#include "hw/arm/boot.h"
26
g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
27
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
27
g_string_append_printf(s, "<feature name=\"org.qemu.gdb.arm.sys.regs\">");
28
* call the 16MB our "system memory", as it's the largest lump.
29
*/
30
memory_region_allocate_system_memory(&mms->psram,
31
- NULL, "mps.ram", 0x01000000);
32
+ NULL, "mps.ram", 16 * MiB);
33
memory_region_add_subregion(system_memory, 0x80000000, &mms->psram);
34
35
/* The overflow IRQs for all UARTs are ORed together.
36
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/arm/mps2.c
39
+++ b/hw/arm/mps2.c
40
@@ -XXX,XX +XXX,XX @@
41
*/
42
43
#include "qemu/osdep.h"
44
+#include "qemu/units.h"
45
#include "qapi/error.h"
46
#include "qemu/error-report.h"
47
#include "hw/arm/boot.h"
48
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
49
* zbt_boot_ctrl is always zero).
50
*/
51
memory_region_allocate_system_memory(&mms->psram,
52
- NULL, "mps.ram", 0x1000000);
53
+ NULL, "mps.ram", 16 * MiB);
54
memory_region_add_subregion(system_memory, 0x21000000, &mms->psram);
55
56
switch (mmc->fpga_type) {
28
--
57
--
29
2.17.1
58
2.20.1
30
59
31
60
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
It forgot to increase clroffset during the loop. So it only clear the
3
The SDRAM is incorrectly created in the SA1110 SoC.
4
first 4 bytes.
4
Move its creation in the board code, this will later allow the
5
board to have the QOM ownership of the RAM.
5
6
6
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Cc: qemu-stable@nongnu.org
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 20191021190653.9511-4-philmd@redhat.com
10
Message-id: 1527047633-12368-1-git-send-email-zhaoshenglong@huawei.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
12
---
14
hw/intc/arm_gicv3_kvm.c | 1 +
13
hw/arm/strongarm.h | 4 +---
15
1 file changed, 1 insertion(+)
14
hw/arm/collie.c | 8 ++++++--
15
hw/arm/strongarm.c | 7 +------
16
3 files changed, 8 insertions(+), 11 deletions(-)
16
17
17
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
18
diff --git a/hw/arm/strongarm.h b/hw/arm/strongarm.h
18
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/arm_gicv3_kvm.c
20
--- a/hw/arm/strongarm.h
20
+++ b/hw/intc/arm_gicv3_kvm.c
21
+++ b/hw/arm/strongarm.h
21
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
22
@@ -XXX,XX +XXX,XX @@ enum {
22
if (clroffset != 0) {
23
23
reg = 0;
24
typedef struct {
24
kvm_gicd_access(s, clroffset, &reg, true);
25
ARMCPU *cpu;
25
+ clroffset += 4;
26
- MemoryRegion sdram;
26
}
27
DeviceState *pic;
27
reg = *gic_bmp_ptr32(bmp, irq);
28
DeviceState *gpio;
28
kvm_gicd_access(s, offset, &reg, true);
29
DeviceState *ppc;
30
@@ -XXX,XX +XXX,XX @@ typedef struct {
31
SSIBus *ssp_bus;
32
} StrongARMState;
33
34
-StrongARMState *sa1110_init(MemoryRegion *sysmem,
35
- unsigned int sdram_size, const char *rev);
36
+StrongARMState *sa1110_init(const char *cpu_type);
37
38
#endif
39
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/hw/arm/collie.c
42
+++ b/hw/arm/collie.c
43
@@ -XXX,XX +XXX,XX @@ static void collie_init(MachineState *machine)
44
{
45
StrongARMState *s;
46
DriveInfo *dinfo;
47
- MemoryRegion *sysmem = get_system_memory();
48
+ MemoryRegion *sdram = g_new(MemoryRegion, 1);
49
50
- s = sa1110_init(sysmem, collie_binfo.ram_size, machine->cpu_type);
51
+ s = sa1110_init(machine->cpu_type);
52
+
53
+ memory_region_allocate_system_memory(sdram, NULL, "strongarm.sdram",
54
+ collie_binfo.ram_size);
55
+ memory_region_add_subregion(get_system_memory(), SA_SDCS0, sdram);
56
57
dinfo = drive_get(IF_PFLASH, 0, 0);
58
pflash_cfi01_register(SA_CS0, "collie.fl1", 0x02000000,
59
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/arm/strongarm.c
62
+++ b/hw/arm/strongarm.c
63
@@ -XXX,XX +XXX,XX @@ static const TypeInfo strongarm_ssp_info = {
64
};
65
66
/* Main CPU functions */
67
-StrongARMState *sa1110_init(MemoryRegion *sysmem,
68
- unsigned int sdram_size, const char *cpu_type)
69
+StrongARMState *sa1110_init(const char *cpu_type)
70
{
71
StrongARMState *s;
72
int i;
73
@@ -XXX,XX +XXX,XX @@ StrongARMState *sa1110_init(MemoryRegion *sysmem,
74
75
s->cpu = ARM_CPU(cpu_create(cpu_type));
76
77
- memory_region_allocate_system_memory(&s->sdram, NULL, "strongarm.sdram",
78
- sdram_size);
79
- memory_region_add_subregion(sysmem, SA_SDCS0, &s->sdram);
80
-
81
s->pic = sysbus_create_varargs("strongarm_pic", 0x90050000,
82
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_IRQ),
83
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_FIQ),
29
--
84
--
30
2.17.1
85
2.20.1
31
86
32
87
diff view generated by jsdifflib
1
Provide a VMSTATE_BOOL_SUB_ARRAY to go with VMSTATE_UINT8_SUB_ARRAY
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
and friends.
3
2
3
The SDRAM is incorrectly created in the OMAP2420 SoC.
4
Move its creation in the board code, this will later allow the
5
board to have the QOM ownership of the RAM.
6
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20191021190653.9511-5-philmd@redhat.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Message-id: 20180521140402.23318-23-peter.maydell@linaro.org
7
---
12
---
8
include/migration/vmstate.h | 3 +++
13
include/hw/arm/omap.h | 4 +---
9
1 file changed, 3 insertions(+)
14
hw/arm/nseries.c | 10 +++++++---
15
hw/arm/omap2.c | 13 +++++--------
16
3 files changed, 13 insertions(+), 14 deletions(-)
10
17
11
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
18
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
12
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
13
--- a/include/migration/vmstate.h
20
--- a/include/hw/arm/omap.h
14
+++ b/include/migration/vmstate.h
21
+++ b/include/hw/arm/omap.h
15
@@ -XXX,XX +XXX,XX @@ extern const VMStateInfo vmstate_info_qtailq;
22
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s {
16
#define VMSTATE_BOOL_ARRAY(_f, _s, _n) \
23
MemoryRegion tap_iomem;
17
VMSTATE_BOOL_ARRAY_V(_f, _s, _n, 0)
24
MemoryRegion imif_ram;
18
25
MemoryRegion emiff_ram;
19
+#define VMSTATE_BOOL_SUB_ARRAY(_f, _s, _start, _num) \
26
- MemoryRegion sdram;
20
+ VMSTATE_SUB_ARRAY(_f, _s, _start, _num, 0, vmstate_info_bool, bool)
27
MemoryRegion sram;
28
29
struct omap_dma_port_if_s {
30
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
31
const char *core);
32
33
/* omap2.c */
34
-struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
35
- unsigned long sdram_size,
36
+struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
37
const char *core);
38
39
uint32_t omap_badwidth_read8(void *opaque, hwaddr addr);
40
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/arm/nseries.c
43
+++ b/hw/arm/nseries.c
44
@@ -XXX,XX +XXX,XX @@
45
46
/* Nokia N8x0 support */
47
struct n800_s {
48
+ MemoryRegion sdram;
49
struct omap_mpu_state_s *mpu;
50
51
struct rfbi_chip_s blizzard;
52
@@ -XXX,XX +XXX,XX @@ static int n810_atag_setup(const struct arm_boot_info *info, void *p)
53
static void n8x0_init(MachineState *machine,
54
struct arm_boot_info *binfo, int model)
55
{
56
- MemoryRegion *sysmem = get_system_memory();
57
struct n800_s *s = (struct n800_s *) g_malloc0(sizeof(*s));
58
- int sdram_size = binfo->ram_size;
59
+ uint64_t sdram_size = binfo->ram_size;
60
61
- s->mpu = omap2420_mpu_init(sysmem, sdram_size, machine->cpu_type);
62
+ memory_region_allocate_system_memory(&s->sdram, NULL, "omap2.dram",
63
+ sdram_size);
64
+ memory_region_add_subregion(get_system_memory(), OMAP2_Q2_BASE, &s->sdram);
21
+
65
+
22
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v) \
66
+ s->mpu = omap2420_mpu_init(&s->sdram, machine->cpu_type);
23
VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
67
68
/* Setup peripherals
69
*
70
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
71
index XXXXXXX..XXXXXXX 100644
72
--- a/hw/arm/omap2.c
73
+++ b/hw/arm/omap2.c
74
@@ -XXX,XX +XXX,XX @@
75
#include "qemu/error-report.h"
76
#include "qapi/error.h"
77
#include "cpu.h"
78
+#include "exec/address-spaces.h"
79
#include "sysemu/blockdev.h"
80
#include "sysemu/qtest.h"
81
#include "sysemu/reset.h"
82
@@ -XXX,XX +XXX,XX @@ static const struct dma_irq_map omap2_dma_irq_map[] = {
83
{ 0, OMAP_INT_24XX_SDMA_IRQ3 },
84
};
85
86
-struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
87
- unsigned long sdram_size,
88
+struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
89
const char *cpu_type)
90
{
91
struct omap_mpu_state_s *s = g_new0(struct omap_mpu_state_s, 1);
92
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
93
int i;
94
SysBusDevice *busdev;
95
struct omap_target_agent_s *ta;
96
+ MemoryRegion *sysmem = get_system_memory();
97
98
/* Core */
99
s->mpu_model = omap2420;
100
s->cpu = ARM_CPU(cpu_create(cpu_type));
101
- s->sdram_size = sdram_size;
102
s->sram_size = OMAP242X_SRAM_SIZE;
103
104
s->wakeup = qemu_allocate_irq(omap_mpu_wakeup, s, 0);
105
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
106
omap_clk_init(s);
107
108
/* Memory-mapped stuff */
109
- memory_region_allocate_system_memory(&s->sdram, NULL, "omap2.dram",
110
- s->sdram_size);
111
- memory_region_add_subregion(sysmem, OMAP2_Q2_BASE, &s->sdram);
112
memory_region_init_ram(&s->sram, NULL, "omap2.sram", s->sram_size,
113
&error_fatal);
114
memory_region_add_subregion(sysmem, OMAP2_SRAM_BASE, &s->sram);
115
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
116
s->port->addr_valid = omap2_validate_addr;
117
118
/* Register SDRAM and SRAM ports for fast DMA transfers. */
119
- soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(&s->sdram),
120
- OMAP2_Q2_BASE, s->sdram_size);
121
+ soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(sdram),
122
+ OMAP2_Q2_BASE, memory_region_size(sdram));
123
soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(&s->sram),
124
OMAP2_SRAM_BASE, s->sram_size);
24
125
25
--
126
--
26
2.17.1
127
2.20.1
27
128
28
129
diff view generated by jsdifflib
1
Add entries to MAINTAINERS to cover the newer MPS2 boards and
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
the new devices they use.
3
2
3
The SDRAM is incorrectly created in the OMAP310 SoC.
4
Move its creation in the board code, this will later allow the
5
board to have the QOM ownership of the RAM.
6
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20191021190653.9511-6-philmd@redhat.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180518153157.14899-1-peter.maydell@linaro.org
6
---
12
---
7
MAINTAINERS | 9 +++++++--
13
include/hw/arm/omap.h | 6 ++----
8
1 file changed, 7 insertions(+), 2 deletions(-)
14
hw/arm/omap1.c | 12 +++++-------
15
hw/arm/omap_sx1.c | 8 ++++++--
16
hw/arm/palm.c | 8 ++++++--
17
4 files changed, 19 insertions(+), 15 deletions(-)
9
18
10
diff --git a/MAINTAINERS b/MAINTAINERS
19
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
11
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
12
--- a/MAINTAINERS
21
--- a/include/hw/arm/omap.h
13
+++ b/MAINTAINERS
22
+++ b/include/hw/arm/omap.h
14
@@ -XXX,XX +XXX,XX @@ F: hw/timer/cmsdk-apb-timer.c
23
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s {
15
F: include/hw/timer/cmsdk-apb-timer.h
24
MemoryRegion mpui_io_iomem;
16
F: hw/char/cmsdk-apb-uart.c
25
MemoryRegion tap_iomem;
17
F: include/hw/char/cmsdk-apb-uart.h
26
MemoryRegion imif_ram;
18
+F: hw/misc/tz-ppc.c
27
- MemoryRegion emiff_ram;
19
+F: include/hw/misc/tz-ppc.h
28
MemoryRegion sram;
20
29
21
ARM cores
30
struct omap_dma_port_if_s {
22
M: Peter Maydell <peter.maydell@linaro.org>
31
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s {
23
@@ -XXX,XX +XXX,XX @@ M: Peter Maydell <peter.maydell@linaro.org>
32
hwaddr addr);
24
L: qemu-arm@nongnu.org
33
} port[__omap_dma_port_last];
25
S: Maintained
34
26
F: hw/arm/mps2.c
35
- unsigned long sdram_size;
27
-F: hw/misc/mps2-scc.c
36
+ uint64_t sdram_size;
28
-F: include/hw/misc/mps2-scc.h
37
unsigned long sram_size;
29
+F: hw/arm/mps2-tz.c
38
30
+F: hw/misc/mps2-*.c
39
/* MPUI-TIPB peripherals */
31
+F: include/hw/misc/mps2-*.h
40
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s {
32
+F: hw/arm/iotkit.c
41
};
33
+F: include/hw/arm/iotkit.h
42
34
43
/* omap1.c */
35
Musicpal
44
-struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
36
M: Jan Kiszka <jan.kiszka@web.de>
45
- unsigned long sdram_size,
46
+struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *sdram,
47
const char *core);
48
49
/* omap2.c */
50
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/omap1.c
53
+++ b/hw/arm/omap1.c
54
@@ -XXX,XX +XXX,XX @@
55
#include "qapi/error.h"
56
#include "qemu-common.h"
57
#include "cpu.h"
58
+#include "exec/address-spaces.h"
59
#include "hw/boards.h"
60
#include "hw/hw.h"
61
#include "hw/irq.h"
62
@@ -XXX,XX +XXX,XX @@ static int omap_validate_tipb_mpui_addr(struct omap_mpu_state_s *s,
63
return range_covers_byte(0xe1010000, 0xe1020004 - 0xe1010000, addr);
64
}
65
66
-struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
67
- unsigned long sdram_size,
68
+struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
69
const char *cpu_type)
70
{
71
int i;
72
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
73
qemu_irq dma_irqs[6];
74
DriveInfo *dinfo;
75
SysBusDevice *busdev;
76
+ MemoryRegion *system_memory = get_system_memory();
77
78
/* Core */
79
s->mpu_model = omap310;
80
s->cpu = ARM_CPU(cpu_create(cpu_type));
81
- s->sdram_size = sdram_size;
82
+ s->sdram_size = memory_region_size(dram);
83
s->sram_size = OMAP15XX_SRAM_SIZE;
84
85
s->wakeup = qemu_allocate_irq(omap_mpu_wakeup, s, 0);
86
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
87
omap_clk_init(s);
88
89
/* Memory-mapped stuff */
90
- memory_region_allocate_system_memory(&s->emiff_ram, NULL, "omap1.dram",
91
- s->sdram_size);
92
- memory_region_add_subregion(system_memory, OMAP_EMIFF_BASE, &s->emiff_ram);
93
memory_region_init_ram(&s->imif_ram, NULL, "omap1.sram", s->sram_size,
94
&error_fatal);
95
memory_region_add_subregion(system_memory, OMAP_IMIF_BASE, &s->imif_ram);
96
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
97
s->port[tipb_mpui].addr_valid = omap_validate_tipb_mpui_addr;
98
99
/* Register SDRAM and SRAM DMA ports for fast transfers. */
100
- soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(&s->emiff_ram),
101
+ soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(dram),
102
OMAP_EMIFF_BASE, s->sdram_size);
103
soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(&s->imif_ram),
104
OMAP_IMIF_BASE, s->sram_size);
105
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
106
index XXXXXXX..XXXXXXX 100644
107
--- a/hw/arm/omap_sx1.c
108
+++ b/hw/arm/omap_sx1.c
109
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
110
{
111
struct omap_mpu_state_s *mpu;
112
MemoryRegion *address_space = get_system_memory();
113
+ MemoryRegion *dram = g_new(MemoryRegion, 1);
114
MemoryRegion *flash = g_new(MemoryRegion, 1);
115
MemoryRegion *cs = g_new(MemoryRegion, 4);
116
static uint32_t cs0val = 0x00213090;
117
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
118
flash_size = flash2_size;
119
}
120
121
- mpu = omap310_mpu_init(address_space, sx1_binfo.ram_size,
122
- machine->cpu_type);
123
+ memory_region_allocate_system_memory(dram, NULL, "omap1.dram",
124
+ sx1_binfo.ram_size);
125
+ memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, dram);
126
+
127
+ mpu = omap310_mpu_init(dram, machine->cpu_type);
128
129
/* External Flash (EMIFS) */
130
memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size,
131
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
132
index XXXXXXX..XXXXXXX 100644
133
--- a/hw/arm/palm.c
134
+++ b/hw/arm/palm.c
135
@@ -XXX,XX +XXX,XX @@ static void palmte_init(MachineState *machine)
136
MemoryRegion *address_space_mem = get_system_memory();
137
struct omap_mpu_state_s *mpu;
138
int flash_size = 0x00800000;
139
- int sdram_size = palmte_binfo.ram_size;
140
static uint32_t cs0val = 0xffffffff;
141
static uint32_t cs1val = 0x0000e1a0;
142
static uint32_t cs2val = 0x0000e1a0;
143
static uint32_t cs3val = 0xe1a0e1a0;
144
int rom_size, rom_loaded = 0;
145
+ MemoryRegion *dram = g_new(MemoryRegion, 1);
146
MemoryRegion *flash = g_new(MemoryRegion, 1);
147
MemoryRegion *cs = g_new(MemoryRegion, 4);
148
149
- mpu = omap310_mpu_init(address_space_mem, sdram_size, machine->cpu_type);
150
+ memory_region_allocate_system_memory(dram, NULL, "omap1.dram",
151
+ palmte_binfo.ram_size);
152
+ memory_region_add_subregion(address_space_mem, OMAP_EMIFF_BASE, dram);
153
+
154
+ mpu = omap310_mpu_init(dram, machine->cpu_type);
155
156
/* External Flash (EMIFS) */
157
memory_region_init_ram(flash, NULL, "palmte.flash", flash_size,
37
--
158
--
38
2.17.1
159
2.20.1
39
160
40
161
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
acpi_data_push uses g_array_set_size to resize the memory size. If there
3
Having the RAM creation code in a separate function is not
4
is no enough contiguous memory, the address will be changed. So previous
4
very helpful. Move this code directly inside the board_init()
5
pointer could not be used any more. It must update the pointer and use
5
function, this will later allow the board to have the QOM
6
the new one.
6
ownership of the RAM.
7
7
8
Also, previous codes wrongly use le32 conversion of iort->node_offset
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
for subsequent computations that will result incorrect value if host is
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
not litlle endian. So use the non-converted one instead.
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
11
Message-id: 20191021190653.9511-7-philmd@redhat.com
12
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
13
Reviewed-by: Eric Auger <eric.auger@redhat.com>
14
Message-id: 1527663951-14552-1-git-send-email-zhaoshenglong@huawei.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
13
---
17
hw/arm/virt-acpi-build.c | 20 +++++++++++++++-----
14
hw/arm/digic_boards.c | 9 ++-------
18
1 file changed, 15 insertions(+), 5 deletions(-)
15
1 file changed, 2 insertions(+), 7 deletions(-)
19
16
20
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
17
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
21
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/virt-acpi-build.c
19
--- a/hw/arm/digic_boards.c
23
+++ b/hw/arm/virt-acpi-build.c
20
+++ b/hw/arm/digic_boards.c
24
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
21
@@ -XXX,XX +XXX,XX @@ typedef struct DigicBoard {
25
AcpiIortItsGroup *its;
22
const char *rom1_def_filename;
26
AcpiIortTable *iort;
23
} DigicBoard;
27
AcpiIortSmmu3 *smmu;
24
28
- size_t node_size, iort_length, smmu_offset = 0;
25
-static void digic4_board_setup_ram(DigicBoardState *s, hwaddr ram_size)
29
+ size_t node_size, iort_node_offset, iort_length, smmu_offset = 0;
26
-{
30
AcpiIortRC *rc;
27
- memory_region_allocate_system_memory(&s->ram, NULL, "ram", ram_size);
31
28
- memory_region_add_subregion(get_system_memory(), 0, &s->ram);
32
iort = acpi_data_push(table_data, sizeof(*iort));
29
-}
33
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
30
-
34
31
static void digic4_board_init(DigicBoard *board)
35
iort_length = sizeof(*iort);
32
{
36
iort->node_count = cpu_to_le32(nb_nodes);
33
Error *err = NULL;
37
- iort->node_offset = cpu_to_le32(sizeof(*iort));
34
@@ -XXX,XX +XXX,XX @@ static void digic4_board_init(DigicBoard *board)
38
+ /*
35
exit(1);
39
+ * Use a copy in case table_data->data moves during acpi_data_push
40
+ * operations.
41
+ */
42
+ iort_node_offset = sizeof(*iort);
43
+ iort->node_offset = cpu_to_le32(iort_node_offset);
44
45
/* ITS group node */
46
node_size = sizeof(*its) + sizeof(uint32_t);
47
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
48
int irq = vms->irqmap[VIRT_SMMU];
49
50
/* SMMUv3 node */
51
- smmu_offset = iort->node_offset + node_size;
52
+ smmu_offset = iort_node_offset + node_size;
53
node_size = sizeof(*smmu) + sizeof(*idmap);
54
iort_length += node_size;
55
smmu = acpi_data_push(table_data, node_size);
56
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
57
idmap->id_count = cpu_to_le32(0xFFFF);
58
idmap->output_base = 0;
59
/* output IORT node is the ITS group node (the first node) */
60
- idmap->output_reference = cpu_to_le32(iort->node_offset);
61
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
62
}
36
}
63
37
64
/* Root Complex Node */
38
- digic4_board_setup_ram(s, board->ram_size);
65
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
39
+ memory_region_allocate_system_memory(&s->ram, NULL, "ram", board->ram_size);
66
idmap->output_reference = cpu_to_le32(smmu_offset);
40
+ memory_region_add_subregion(get_system_memory(), 0, &s->ram);
67
} else {
41
68
/* output IORT node is the ITS group node (the first node) */
42
if (board->add_rom0) {
69
- idmap->output_reference = cpu_to_le32(iort->node_offset);
43
board->add_rom0(s, DIGIC4_ROM0_BASE, board->rom0_def_filename);
70
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
71
}
72
73
+ /*
74
+ * Update the pointer address in case table_data->data moves during above
75
+ * acpi_data_push operations.
76
+ */
77
+ iort = (AcpiIortTable *)(table_data->data + iort_start);
78
iort->length = cpu_to_le32(iort_length);
79
80
build_header(linker, table_data, (void *)(table_data->data + iort_start),
81
--
44
--
82
2.17.1
45
2.20.1
83
46
84
47
diff view generated by jsdifflib