1
Latest set of arm patches. I may end up doing another pullreq at the
1
The big thing in here is RTH's caching-of-tb-flags patchset
2
end of the week, but this is big enough to send out, plus it has
2
which should improve TCG performance.
3
several instances of "let me take the first N patches in your series"
4
in it, so getting those into master makes patch respins for those
5
submitters easier.
6
3
7
thanks
4
thanks
8
-- PMM
5
-- PMM
9
6
10
The following changes since commit dddb37495b844270088e68e3bf30b764d48d863f:
7
The following changes since commit 2152e740a8938b3bad73bfe1a01f8b94dab02d41:
11
8
12
Merge remote-tracking branch 'remotes/awilliam/tags/vfio-updates-20181015.0' into staging (2018-10-15 18:44:04 +0100)
9
Merge remote-tracking branch 'remotes/vivier2/tags/trivial-branch-pull-request' into staging (2019-10-22 12:03:03 +0100)
13
10
14
are available in the Git repository at:
11
are available in the Git repository at:
15
12
16
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20181016
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 bdaffef4bb0729a74c7a325dba5c61d8cd8f464f:
15
for you to fetch changes up to 833043a060f7d0e95ded88e61e992466305c0345:
19
16
20
coccinelle: new inplace-byteswaps.cocci to remove inplace-byteswapping calls (2018-10-16 16:16:42 +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
* hw/arm/virt: add DT property /secure-chosen/stdout-path indicating secure UART
21
* Fix sign-extension for SMLAL* instructions
25
* target/arm: Fix aarch64_sve_change_el wrt EL0
22
* aspeed: Add an AST2600 eval board
26
* target/arm: Define fields of ISAR registers
23
* Various ptimer device conversions to new transaction API
27
* target/arm: Align cortex-r5 id_isar0
24
* Cache TB flags to avoid expensively recomputing them every time
28
* target/arm: Fix cortex-a7 id_isar0
25
* Add a dummy Samsung SDHCI controller model to exynos4 boards
29
* net/cadence_gem: Fix various bugs, add support for new
26
* Minor refactorings of RAM creation for some arm boards
30
features that will be used by the Xilinx Versal board
31
* target-arm: powerctl: Enable HVC when starting CPUs to EL2
32
* target/arm: Add the Cortex-A72
33
* target/arm: Mark PMINTENCLR and PMINTENCLR_EL1 accesses as possibly doing IO
34
* target/arm: Mask PMOVSR writes based on supported counters
35
* target/arm: Initialize ARMMMUFaultInfo in v7m_stack_read/write
36
* coccinelle: new inplace-byteswaps.cocci to remove inplace-byteswapping calls
37
27
38
----------------------------------------------------------------
28
----------------------------------------------------------------
39
Aaron Lindsay (2):
29
Cédric Le Goater (1):
40
target/arm: Mark PMINTENCLR and PMINTENCLR_EL1 accesses as possibly doing IO
30
aspeed: Add an AST2600 eval board
41
target/arm: Mask PMOVSR writes based on supported counters
42
31
43
Edgar E. Iglesias (10):
32
Guenter Roeck (1):
44
net: cadence_gem: Disable TSU feature bit
33
hw/timer/exynos4210_mct: Initialize ptimer before starting it
45
net: cadence_gem: Announce availability of priority queues
46
net: cadence_gem: Use uint32_t for 32bit descriptor words
47
net: cadence_gem: Add macro with max number of descriptor words
48
net: cadence_gem: Add support for extended descriptors
49
net: cadence_gem: Add support for selecting the DMA MemoryRegion
50
net: cadence_gem: Implement support for 64bit descriptor addresses
51
net: cadence_gem: Announce 64bit addressing support
52
target-arm: powerctl: Enable HVC when starting CPUs to EL2
53
target/arm: Add the Cortex-A72
54
34
55
Jerome Forissier (1):
35
Peter Maydell (7):
56
hw/arm/virt: add DT property /secure-chosen/stdout-path indicating secure UART
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
57
43
58
Peter Maydell (2):
44
Philippe Mathieu-Daudé (9):
59
target/arm: Initialize ARMMMUFaultInfo in v7m_stack_read/write
45
hw/sd/sdhci: Add a comment to distinct the i.MX eSDHC functions
60
coccinelle: new inplace-byteswaps.cocci to remove inplace-byteswapping calls
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
61
54
62
Richard Henderson (4):
55
Richard Henderson (23):
63
target/arm: Fix aarch64_sve_change_el wrt EL0
56
target/arm: Fix sign-extension for SMLAL*
64
target/arm: Define fields of ISAR registers
57
target/arm: Split out rebuild_hflags_common
65
target/arm: Align cortex-r5 id_isar0
58
target/arm: Split out rebuild_hflags_a64
66
target/arm: Fix cortex-a7 id_isar0
59
target/arm: Split out rebuild_hflags_common_32
60
target/arm: Split arm_cpu_data_is_big_endian
61
target/arm: Split out rebuild_hflags_m32
62
target/arm: Reduce tests vs M-profile in cpu_get_tb_cpu_state
63
target/arm: Split out rebuild_hflags_a32
64
target/arm: Split out rebuild_hflags_aprofile
65
target/arm: Hoist XSCALE_CPAR, VECLEN, VECSTRIDE in cpu_get_tb_cpu_state
66
target/arm: Simplify set of PSTATE_SS in cpu_get_tb_cpu_state
67
target/arm: Hoist computation of TBFLAG_A32.VFPEN
68
target/arm: Add arm_rebuild_hflags
69
target/arm: Split out arm_mmu_idx_el
70
target/arm: Hoist store to cs_base in cpu_get_tb_cpu_state
71
target/arm: Add HELPER(rebuild_hflags_{a32, a64, m32})
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
67
79
68
include/hw/net/cadence_gem.h | 7 +-
80
hw/arm/strongarm.h | 4 +-
69
target/arm/cpu.h | 95 +++++++++++++-
81
include/hw/arm/aspeed.h | 1 +
70
hw/arm/virt.c | 4 +
82
include/hw/arm/omap.h | 10 +-
71
hw/net/cadence_gem.c | 192 +++++++++++++++++++++--------
83
include/hw/sd/sdhci.h | 2 +
72
target/arm/arm-powerctl.c | 10 ++
84
target/arm/cpu.h | 84 ++++++----
73
target/arm/cpu.c | 7 +-
85
target/arm/helper.h | 4 +
74
target/arm/cpu64.c | 66 +++++++++-
86
target/arm/internals.h | 9 ++
75
target/arm/helper.c | 27 ++--
87
hw/arm/aspeed.c | 23 +++
76
target/arm/op_helper.c | 6 +-
88
hw/arm/collie.c | 8 +-
77
scripts/coccinelle/inplace-byteswaps.cocci | 65 ++++++++++
89
hw/arm/digic_boards.c | 9 +-
78
10 files changed, 408 insertions(+), 71 deletions(-)
90
hw/arm/exynos4210.c | 2 +-
79
create mode 100644 scripts/coccinelle/inplace-byteswaps.cocci
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(-)
80
120
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
New patch
1
In commit b01422622b we did an automated rename of the ptimer_init()
2
function to ptimer_init_with_bh(). Unfortunately this caught the
3
unrelated arm_mptimer_init() function. Undo that accidental
4
renaming.
1
5
6
Fixes: b01422622b7c7293196fdaf1dbb4f495af44ecf9
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Message-id: 20191017133331.5901-1-peter.maydell@linaro.org
11
---
12
hw/timer/arm_mptimer.c | 4 ++--
13
1 file changed, 2 insertions(+), 2 deletions(-)
14
15
diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/timer/arm_mptimer.c
18
+++ b/hw/timer/arm_mptimer.c
19
@@ -XXX,XX +XXX,XX @@ static void arm_mptimer_reset(DeviceState *dev)
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,
35
};
36
37
--
38
2.20.1
39
40
diff view generated by jsdifflib
New patch
1
Switch the puv3_ost code away from bottom-half based ptimers to the
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.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-2-peter.maydell@linaro.org
10
---
11
hw/timer/puv3_ost.c | 9 +++++----
12
1 file changed, 5 insertions(+), 4 deletions(-)
13
14
diff --git a/hw/timer/puv3_ost.c b/hw/timer/puv3_ost.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/timer/puv3_ost.c
17
+++ b/hw/timer/puv3_ost.c
18
@@ -XXX,XX +XXX,XX @@
19
#include "hw/sysbus.h"
20
#include "hw/irq.h"
21
#include "hw/ptimer.h"
22
-#include "qemu/main-loop.h"
23
#include "qemu/module.h"
24
25
#undef DEBUG_PUV3
26
@@ -XXX,XX +XXX,XX @@ typedef struct PUV3OSTState {
27
SysBusDevice parent_obj;
28
29
MemoryRegion iomem;
30
- QEMUBH *bh;
31
qemu_irq irq;
32
ptimer_state *ptimer;
33
34
@@ -XXX,XX +XXX,XX @@ static void puv3_ost_write(void *opaque, hwaddr offset,
35
DPRINTF("offset 0x%x, value 0x%x\n", offset, value);
36
switch (offset) {
37
case 0x00: /* Match Register 0 */
38
+ ptimer_transaction_begin(s->ptimer);
39
s->reg_OSMR0 = value;
40
if (s->reg_OSMR0 > s->reg_OSCR) {
41
ptimer_set_count(s->ptimer, s->reg_OSMR0 - s->reg_OSCR);
42
@@ -XXX,XX +XXX,XX @@ static void puv3_ost_write(void *opaque, hwaddr offset,
43
(0xffffffff - s->reg_OSCR));
44
}
45
ptimer_run(s->ptimer, 2);
46
+ ptimer_transaction_commit(s->ptimer);
47
break;
48
case 0x14: /* Status Register */
49
assert(value == 0);
50
@@ -XXX,XX +XXX,XX @@ static void puv3_ost_realize(DeviceState *dev, Error **errp)
51
52
sysbus_init_irq(sbd, &s->irq);
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);
63
--
64
2.20.1
65
66
diff view generated by jsdifflib
New patch
1
Switch the sh_timer code away from bottom-half based ptimers to the
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.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-3-peter.maydell@linaro.org
10
---
11
hw/timer/sh_timer.c | 13 +++++++++----
12
1 file changed, 9 insertions(+), 4 deletions(-)
13
14
diff --git a/hw/timer/sh_timer.c b/hw/timer/sh_timer.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/timer/sh_timer.c
17
+++ b/hw/timer/sh_timer.c
18
@@ -XXX,XX +XXX,XX @@
19
#include "hw/irq.h"
20
#include "hw/sh4/sh.h"
21
#include "qemu/timer.h"
22
-#include "qemu/main-loop.h"
23
#include "hw/ptimer.h"
24
25
//#define DEBUG_TIMER
26
@@ -XXX,XX +XXX,XX @@ static void sh_timer_write(void *opaque, hwaddr offset,
27
switch (offset >> 2) {
28
case OFFSET_TCOR:
29
s->tcor = value;
30
+ ptimer_transaction_begin(s->timer);
31
ptimer_set_limit(s->timer, s->tcor, 0);
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)
70
{
71
sh_timer_state *s;
72
- QEMUBH *bh;
73
74
s = (sh_timer_state *)g_malloc0(sizeof(sh_timer_state));
75
s->freq = freq;
76
@@ -XXX,XX +XXX,XX @@ static void *sh_timer_init(uint32_t freq, int feat, qemu_irq irq)
77
s->enabled = 0;
78
s->irq = irq;
79
80
- bh = qemu_bh_new(sh_timer_tick, s);
81
- s->timer = ptimer_init_with_bh(bh, PTIMER_POLICY_DEFAULT);
82
+ s->timer = ptimer_init(sh_timer_tick, s, PTIMER_POLICY_DEFAULT);
83
84
sh_timer_write(s, OFFSET_TCOR >> 2, s->tcor);
85
sh_timer_write(s, OFFSET_TCNT >> 2, s->tcnt);
86
--
87
2.20.1
88
89
diff view generated by jsdifflib
New patch
1
Switch the lm32_timer code away from bottom-half based ptimers to the
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 ytimer.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-4-peter.maydell@linaro.org
10
---
11
hw/timer/lm32_timer.c | 13 +++++++++----
12
1 file changed, 9 insertions(+), 4 deletions(-)
13
14
diff --git a/hw/timer/lm32_timer.c b/hw/timer/lm32_timer.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/timer/lm32_timer.c
17
+++ b/hw/timer/lm32_timer.c
18
@@ -XXX,XX +XXX,XX @@
19
#include "hw/ptimer.h"
20
#include "hw/qdev-properties.h"
21
#include "qemu/error-report.h"
22
-#include "qemu/main-loop.h"
23
#include "qemu/module.h"
24
25
#define DEFAULT_FREQUENCY (50*1000000)
26
@@ -XXX,XX +XXX,XX @@ struct LM32TimerState {
27
28
MemoryRegion iomem;
29
30
- QEMUBH *bh;
31
ptimer_state *ptimer;
32
33
qemu_irq irq;
34
@@ -XXX,XX +XXX,XX @@ static void timer_write(void *opaque, hwaddr addr,
35
s->regs[R_SR] &= ~SR_TO;
36
break;
37
case R_CR:
38
+ ptimer_transaction_begin(s->ptimer);
39
s->regs[R_CR] = value;
40
if (s->regs[R_CR] & CR_START) {
41
ptimer_run(s->ptimer, 1);
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);
63
}
64
65
static void lm32_timer_init(Object *obj)
66
@@ -XXX,XX +XXX,XX @@ static void lm32_timer_realize(DeviceState *dev, Error **errp)
67
{
68
LM32TimerState *s = LM32_TIMER(dev);
69
70
- s->bh = qemu_bh_new(timer_hit, s);
71
- s->ptimer = ptimer_init_with_bh(s->bh, PTIMER_POLICY_DEFAULT);
72
+ s->ptimer = ptimer_init(timer_hit, s, PTIMER_POLICY_DEFAULT);
73
74
+ ptimer_transaction_begin(s->ptimer);
75
ptimer_set_freq(s->ptimer, s->freq_hz);
76
+ ptimer_transaction_commit(s->ptimer);
77
}
78
79
static const VMStateDescription vmstate_lm32_timer = {
80
--
81
2.20.1
82
83
diff view generated by jsdifflib
New patch
1
Switch the altera_timer code away from bottom-half based ptimers to
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.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-6-peter.maydell@linaro.org
10
---
11
hw/timer/altera_timer.c | 13 +++++++++----
12
1 file changed, 9 insertions(+), 4 deletions(-)
13
14
diff --git a/hw/timer/altera_timer.c b/hw/timer/altera_timer.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/timer/altera_timer.c
17
+++ b/hw/timer/altera_timer.c
18
@@ -XXX,XX +XXX,XX @@
19
*/
20
21
#include "qemu/osdep.h"
22
-#include "qemu/main-loop.h"
23
#include "qemu/module.h"
24
#include "qapi/error.h"
25
26
@@ -XXX,XX +XXX,XX @@ typedef struct AlteraTimer {
27
MemoryRegion mmio;
28
qemu_irq irq;
29
uint32_t freq_hz;
30
- QEMUBH *bh;
31
ptimer_state *ptimer;
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)
77
{
78
AlteraTimer *t = ALTERA_TIMER(dev);
79
80
+ ptimer_transaction_begin(t->ptimer);
81
ptimer_stop(t->ptimer);
82
ptimer_set_limit(t->ptimer, 0xffffffff, 1);
83
+ ptimer_transaction_commit(t->ptimer);
84
memset(t->regs, 0, sizeof(t->regs));
85
}
86
87
--
88
2.20.1
89
90
diff view generated by jsdifflib
New patch
1
Switch the etraxfs_timer code away from bottom-half based ptimers to
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.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20191017132905.5604-7-peter.maydell@linaro.org
10
---
11
hw/timer/etraxfs_timer.c | 23 +++++++++++++----------
12
1 file changed, 13 insertions(+), 10 deletions(-)
13
14
diff --git a/hw/timer/etraxfs_timer.c b/hw/timer/etraxfs_timer.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/timer/etraxfs_timer.c
17
+++ b/hw/timer/etraxfs_timer.c
18
@@ -XXX,XX +XXX,XX @@
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)
37
}
38
39
D(printf ("freq_hz=%d div=%d\n", freq_hz, div));
40
+ ptimer_transaction_begin(timer);
41
ptimer_set_freq(timer, freq_hz);
42
ptimer_set_limit(timer, div, 0);
43
44
@@ -XXX,XX +XXX,XX @@ static void update_ctrl(ETRAXTimerState *t, int tnum)
45
abort();
46
break;
47
}
48
+ ptimer_transaction_commit(timer);
49
}
50
51
static void timer_update_irq(ETRAXTimerState *t)
52
@@ -XXX,XX +XXX,XX @@ static inline void timer_watchdog_update(ETRAXTimerState *t, uint32_t value)
53
54
t->wd_hits = 0;
55
56
+ ptimer_transaction_begin(t->ptimer_wd);
57
ptimer_set_freq(t->ptimer_wd, 760);
58
if (wd_cnt == 0)
59
wd_cnt = 256;
60
@@ -XXX,XX +XXX,XX @@ static inline void timer_watchdog_update(ETRAXTimerState *t, uint32_t value)
61
ptimer_stop(t->ptimer_wd);
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);
100
--
101
2.20.1
102
103
diff view generated by jsdifflib
1
Add a new Coccinelle script which replaces uses of the inplace
1
Switch the mcf5208 code away from bottom-half based ptimers to
2
byteswapping functions *_to_cpus() and cpu_to_*s() with their
2
the new transaction-based ptimer API. This just requires adding
3
not-in-place equivalents. This is useful for where the swapping
3
begin/commit calls around the various places that modify the ptimer
4
is done on members of a packed struct -- taking the address
4
state, and using the new ptimer_init() function to create the timer.
5
of the member to pass it to an inplace function is undefined
6
behaviour in C.
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: Eric Blake <eblake@redhat.com>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20181009181612.10633-1-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
12
---
11
---
13
scripts/coccinelle/inplace-byteswaps.cocci | 65 ++++++++++++++++++++++
12
hw/m68k/mcf5208.c | 9 +++++----
14
1 file changed, 65 insertions(+)
13
1 file changed, 5 insertions(+), 4 deletions(-)
15
create mode 100644 scripts/coccinelle/inplace-byteswaps.cocci
16
14
17
diff --git a/scripts/coccinelle/inplace-byteswaps.cocci b/scripts/coccinelle/inplace-byteswaps.cocci
15
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
18
new file mode 100644
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX
17
--- a/hw/m68k/mcf5208.c
20
--- /dev/null
18
+++ b/hw/m68k/mcf5208.c
21
+++ b/scripts/coccinelle/inplace-byteswaps.cocci
22
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
23
+// Replace uses of in-place byteswapping functions with calls to the
20
#include "qemu/osdep.h"
24
+// equivalent not-in-place functions. This is necessary to avoid
21
#include "qemu/units.h"
25
+// undefined behaviour if the expression being swapped is a field in a
22
#include "qemu/error-report.h"
26
+// packed struct.
23
-#include "qemu/main-loop.h"
27
+
24
#include "qapi/error.h"
28
+@@
25
#include "qemu-common.h"
29
+expression E;
26
#include "cpu.h"
30
+@@
27
@@ -XXX,XX +XXX,XX @@ static void m5208_timer_write(void *opaque, hwaddr offset,
31
+-be16_to_cpus(&E);
28
return;
32
++E = be16_to_cpu(E);
29
}
33
+@@
30
34
+expression E;
31
+ ptimer_transaction_begin(s->timer);
35
+@@
32
if (s->pcsr & PCSR_EN)
36
+-be32_to_cpus(&E);
33
ptimer_stop(s->timer);
37
++E = be32_to_cpu(E);
34
38
+@@
35
@@ -XXX,XX +XXX,XX @@ static void m5208_timer_write(void *opaque, hwaddr offset,
39
+expression E;
36
40
+@@
37
if (s->pcsr & PCSR_EN)
41
+-be64_to_cpus(&E);
38
ptimer_run(s->timer, 0);
42
++E = be64_to_cpu(E);
39
+ ptimer_transaction_commit(s->timer);
43
+@@
40
break;
44
+expression E;
41
case 2:
45
+@@
42
+ ptimer_transaction_begin(s->timer);
46
+-cpu_to_be16s(&E);
43
s->pmr = value;
47
++E = cpu_to_be16(E);
44
s->pcsr &= ~PCSR_PIF;
48
+@@
45
if ((s->pcsr & PCSR_RLD) == 0) {
49
+expression E;
46
@@ -XXX,XX +XXX,XX @@ static void m5208_timer_write(void *opaque, hwaddr offset,
50
+@@
47
} else {
51
+-cpu_to_be32s(&E);
48
ptimer_set_limit(s->timer, value, s->pcsr & PCSR_OVW);
52
++E = cpu_to_be32(E);
49
}
53
+@@
50
+ ptimer_transaction_commit(s->timer);
54
+expression E;
51
break;
55
+@@
52
case 4:
56
+-cpu_to_be64s(&E);
53
break;
57
++E = cpu_to_be64(E);
54
@@ -XXX,XX +XXX,XX @@ static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic)
58
+@@
55
{
59
+expression E;
56
MemoryRegion *iomem = g_new(MemoryRegion, 1);
60
+@@
57
m5208_timer_state *s;
61
+-le16_to_cpus(&E);
58
- QEMUBH *bh;
62
++E = le16_to_cpu(E);
59
int i;
63
+@@
60
64
+expression E;
61
/* SDRAMC. */
65
+@@
62
@@ -XXX,XX +XXX,XX @@ static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic)
66
+-le32_to_cpus(&E);
63
/* Timers. */
67
++E = le32_to_cpu(E);
64
for (i = 0; i < 2; i++) {
68
+@@
65
s = g_new0(m5208_timer_state, 1);
69
+expression E;
66
- bh = qemu_bh_new(m5208_timer_trigger, s);
70
+@@
67
- s->timer = ptimer_init_with_bh(bh, PTIMER_POLICY_DEFAULT);
71
+-le64_to_cpus(&E);
68
+ s->timer = ptimer_init(m5208_timer_trigger, s, PTIMER_POLICY_DEFAULT);
72
++E = le64_to_cpu(E);
69
memory_region_init_io(&s->iomem, NULL, &m5208_timer_ops, s,
73
+@@
70
"m5208-timer", 0x00004000);
74
+expression E;
71
memory_region_add_subregion(address_space, 0xfc080000 + 0x4000 * i,
75
+@@
76
+-cpu_to_le16s(&E);
77
++E = cpu_to_le16(E);
78
+@@
79
+expression E;
80
+@@
81
+-cpu_to_le32s(&E);
82
++E = cpu_to_le32(E);
83
+@@
84
+expression E;
85
+@@
86
+-cpu_to_le64s(&E);
87
++E = cpu_to_le64(E);
88
--
72
--
89
2.19.0
73
2.20.1
90
74
91
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
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
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
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 49 +++++++++++++++++++++++++++------------------
13
target/arm/helper.c | 16 +++++++++++----
14
2 files changed, 42 insertions(+), 23 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 @@ static inline uint64_t arm_sctlr(CPUARMState *env, int el)
21
}
22
}
23
24
+static inline bool arm_cpu_data_is_big_endian_a32(CPUARMState *env,
25
+ bool sctlr_b)
26
+{
27
+#ifdef CONFIG_USER_ONLY
28
+ /*
29
+ * In system mode, BE32 is modelled in line with the
30
+ * architecture (as word-invariant big-endianness), where loads
31
+ * and stores are done little endian but from addresses which
32
+ * are adjusted by XORing with the appropriate constant. So the
33
+ * endianness to use for the raw data access is not affected by
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);
81
}
82
}
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
125
--
126
2.20.1
127
128
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 M-profile.
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-6-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.c | 45 ++++++++++++++++++++++++++++++---------------
12
1 file changed, 30 insertions(+), 15 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_32(CPUARMState *env, int fp_el,
19
return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
20
}
21
22
+static uint32_t rebuild_hflags_m32(CPUARMState *env, int fp_el,
23
+ ARMMMUIdx mmu_idx)
24
+{
25
+ uint32_t flags = 0;
26
+
27
+ if (arm_v7m_is_handler_mode(env)) {
28
+ flags = FIELD_DP32(flags, TBFLAG_A32, HANDLER, 1);
29
+ }
30
+
31
+ /*
32
+ * v8M always applies stack limit checks unless CCR.STKOFHFNMIGN
33
+ * is suppressing them because the requested execution priority
34
+ * is less than 0.
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
}
65
}
66
67
- if (arm_v7m_is_handler_mode(env)) {
68
- flags = FIELD_DP32(flags, TBFLAG_A32, HANDLER, 1);
69
- }
70
-
71
- /* v8M always applies stack limit checks unless CCR.STKOFHFNMIGN is
72
- * suppressing them because the requested execution priority is less than 0.
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);
84
--
85
2.20.1
86
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
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Currently a trivial wrapper for rebuild_hflags_common_32.
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-8-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/helper.c | 8 +++++++-
11
1 file changed, 7 insertions(+), 1 deletion(-)
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 @@ static uint32_t rebuild_hflags_m32(CPUARMState *env, int fp_el,
18
return rebuild_hflags_common_32(env, fp_el, mmu_idx, flags);
19
}
20
21
+static uint32_t rebuild_hflags_a32(CPUARMState *env, int fp_el,
22
+ ARMMMUIdx mmu_idx)
23
+{
24
+ return rebuild_hflags_common_32(env, fp_el, mmu_idx, 0);
25
+}
26
+
27
static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
28
ARMMMUIdx mmu_idx)
29
{
30
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
31
flags = FIELD_DP32(flags, TBFLAG_A32, LSPACT, 1);
32
}
33
} else {
34
- flags = rebuild_hflags_common_32(env, fp_el, mmu_idx, 0);
35
+ flags = rebuild_hflags_a32(env, fp_el, mmu_idx);
36
}
37
38
flags = FIELD_DP32(flags, TBFLAG_A32, THUMB, env->thumb);
39
--
40
2.20.1
41
42
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, and are used by A-profile.
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
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.c | 20 ++++++++++++--------
12
1 file changed, 12 insertions(+), 8 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_m32(CPUARMState *env, int fp_el,
19
return rebuild_hflags_common_32(env, fp_el, mmu_idx, flags);
20
}
21
22
+static uint32_t rebuild_hflags_aprofile(CPUARMState *env)
23
+{
24
+ int flags = 0;
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)
33
{
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);
37
}
38
39
static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
40
ARMMMUIdx mmu_idx)
41
{
42
+ uint32_t flags = rebuild_hflags_aprofile(env);
43
ARMMMUIdx stage1 = stage_1_mmu_idx(mmu_idx);
44
ARMVAParameters p0 = aa64_va_parameters_both(env, 0, stage1);
45
- uint32_t flags = 0;
46
uint64_t sctlr;
47
int tbii, tbid;
48
49
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
50
}
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
}
62
--
63
2.20.1
64
65
diff view generated by jsdifflib
1
The get_phys_addr() functions take a pointer to an ARMMMUFaultInfo
1
From: Richard Henderson <richard.henderson@linaro.org>
2
struct, which they fill in only if a fault occurs. This means that
3
the caller must always zero-initialize the struct before passing
4
it in. We forgot to do this in v7m_stack_read() and v7m_stack_write().
5
Correct the error.
6
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
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20181011172057.9466-1-peter.maydell@linaro.org
10
---
11
---
11
target/arm/helper.c | 4 ++--
12
target/arm/helper.c | 21 ++++++++++++++-------
12
1 file changed, 2 insertions(+), 2 deletions(-)
13
1 file changed, 14 insertions(+), 7 deletions(-)
13
14
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
17
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
18
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ static bool v7m_stack_write(ARMCPU *cpu, uint32_t addr, uint32_t value,
19
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
19
target_ulong page_size;
20
}
20
hwaddr physaddr;
21
} else {
21
int prot;
22
flags = rebuild_hflags_a32(env, fp_el, mmu_idx);
22
- ARMMMUFaultInfo fi;
23
+
23
+ ARMMMUFaultInfo fi = {};
24
+ /*
24
bool secure = mmu_idx & ARM_MMU_IDX_M_S;
25
+ * Note that XSCALE_CPAR shares bits with VECSTRIDE.
25
int exc;
26
+ * Note that VECLEN+VECSTRIDE are RES0 for M-profile.
26
bool exc_secure;
27
+ */
27
@@ -XXX,XX +XXX,XX @@ static bool v7m_stack_read(ARMCPU *cpu, uint32_t *dest, uint32_t addr,
28
+ if (arm_feature(env, ARM_FEATURE_XSCALE)) {
28
target_ulong page_size;
29
+ flags = FIELD_DP32(flags, TBFLAG_A32,
29
hwaddr physaddr;
30
+ XSCALE_CPAR, env->cp15.c15_cpar);
30
int prot;
31
+ } else {
31
- ARMMMUFaultInfo fi;
32
+ flags = FIELD_DP32(flags, TBFLAG_A32, VECLEN,
32
+ ARMMMUFaultInfo fi = {};
33
+ env->vfp.vec_len);
33
bool secure = mmu_idx & ARM_MMU_IDX_M_S;
34
+ flags = FIELD_DP32(flags, TBFLAG_A32, VECSTRIDE,
34
int exc;
35
+ env->vfp.vec_stride);
35
bool exc_secure;
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
36
--
55
--
37
2.19.0
56
2.20.1
38
57
39
58
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
When QEMU provides the equivalent of the EL3 firmware, we
3
Hoist the variable load for PSTATE into the existing test vs is_a64.
4
need to enable HVCs in scr_el3 when turning on CPUs that
5
target EL2.
6
4
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20181011021931.4249-10-edgar.iglesias@gmail.com
7
Message-id: 20191018174431.1784-11-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
9
---
12
target/arm/arm-powerctl.c | 10 ++++++++++
10
target/arm/helper.c | 20 ++++++++------------
13
1 file changed, 10 insertions(+)
11
1 file changed, 8 insertions(+), 12 deletions(-)
14
12
15
diff --git a/target/arm/arm-powerctl.c b/target/arm/arm-powerctl.c
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/arm-powerctl.c
15
--- a/target/arm/helper.c
18
+++ b/target/arm/arm-powerctl.c
16
+++ b/target/arm/helper.c
19
@@ -XXX,XX +XXX,XX @@ static void arm_set_cpu_on_async_work(CPUState *target_cpu_state,
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;
20
} else {
31
} else {
21
/* Processor is not in secure mode */
32
*pc = env->regs[15];
22
target_cpu->env.cp15.scr_el3 |= SCR_NS;
33
23
+
34
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
24
+ /*
35
|| arm_el_is_aa64(env, 1) || arm_feature(env, ARM_FEATURE_M)) {
25
+ * If QEMU is providing the equivalent of EL3 firmware, then we need
36
flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
26
+ * to make sure a CPU targeting EL2 comes out of reset with a
37
}
27
+ * functional HVC insn.
38
+ pstate_for_ss = env->uncached_cpsr;
28
+ */
29
+ if (arm_feature(&target_cpu->env, ARM_FEATURE_EL3)
30
+ && info->target_el == 2) {
31
+ target_cpu->env.cp15.scr_el3 |= SCR_HCE;
32
+ }
33
}
39
}
34
40
35
/* We check if the started CPU is now at the correct level */
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;
36
--
67
--
37
2.19.0
68
2.20.1
38
69
39
70
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
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>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20181008212205.17752-3-richard.henderson@linaro.org
10
Message-id: 20191018174431.1784-12-richard.henderson@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
12
---
9
target/arm/cpu.h | 88 ++++++++++++++++++++++++++++++++++++++++++++++++
13
target/arm/cpu.h | 2 +-
10
1 file changed, 88 insertions(+)
14
target/arm/helper.c | 14 ++++++++++----
15
2 files changed, 11 insertions(+), 5 deletions(-)
11
16
12
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
13
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/cpu.h
19
--- a/target/arm/cpu.h
15
+++ b/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
16
@@ -XXX,XX +XXX,XX @@ FIELD(V7M_CSSELR, LEVEL, 1, 3)
21
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_A32, XSCALE_CPAR, 4, 2)
22
* the same thing as the current security state of the processor!
17
*/
23
*/
18
FIELD(V7M_CSSELR, INDEX, 0, 4)
24
FIELD(TBFLAG_A32, NS, 6, 1)
19
25
-FIELD(TBFLAG_A32, VFPEN, 7, 1) /* Not cached. */
20
+/*
26
+FIELD(TBFLAG_A32, VFPEN, 7, 1) /* Partially cached, minus FPEXC. */
21
+ * System register ID fields.
27
FIELD(TBFLAG_A32, CONDEXEC, 8, 8) /* Not cached. */
22
+ */
28
FIELD(TBFLAG_A32, SCTLR_B, 16, 1)
23
+FIELD(ID_ISAR0, SWAP, 0, 4)
29
/* For M profile only, set if FPCCR.LSPACT is set */
24
+FIELD(ID_ISAR0, BITCOUNT, 4, 4)
30
diff --git a/target/arm/helper.c b/target/arm/helper.c
25
+FIELD(ID_ISAR0, BITFIELD, 8, 4)
31
index XXXXXXX..XXXXXXX 100644
26
+FIELD(ID_ISAR0, CMPBRANCH, 12, 4)
32
--- a/target/arm/helper.c
27
+FIELD(ID_ISAR0, COPROC, 16, 4)
33
+++ b/target/arm/helper.c
28
+FIELD(ID_ISAR0, DEBUG, 20, 4)
34
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_m32(CPUARMState *env, int fp_el,
29
+FIELD(ID_ISAR0, DIVIDE, 24, 4)
35
{
36
uint32_t flags = 0;
37
38
+ /* v8M always enables the fpu. */
39
+ flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
30
+
40
+
31
+FIELD(ID_ISAR1, ENDIAN, 0, 4)
41
if (arm_v7m_is_handler_mode(env)) {
32
+FIELD(ID_ISAR1, EXCEPT, 4, 4)
42
flags = FIELD_DP32(flags, TBFLAG_A32, HANDLER, 1);
33
+FIELD(ID_ISAR1, EXCEPT_AR, 8, 4)
43
}
34
+FIELD(ID_ISAR1, EXTEND, 12, 4)
44
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a32(CPUARMState *env, int fp_el,
35
+FIELD(ID_ISAR1, IFTHEN, 16, 4)
45
ARMMMUIdx mmu_idx)
36
+FIELD(ID_ISAR1, IMMEDIATE, 20, 4)
46
{
37
+FIELD(ID_ISAR1, INTERWORK, 24, 4)
47
uint32_t flags = rebuild_hflags_aprofile(env);
38
+FIELD(ID_ISAR1, JAZELLE, 28, 4)
39
+
48
+
40
+FIELD(ID_ISAR2, LOADSTORE, 0, 4)
49
+ if (arm_el_is_aa64(env, 1)) {
41
+FIELD(ID_ISAR2, MEMHINT, 4, 4)
50
+ flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
42
+FIELD(ID_ISAR2, MULTIACCESSINT, 8, 4)
51
+ }
43
+FIELD(ID_ISAR2, MULT, 12, 4)
52
return rebuild_hflags_common_32(env, fp_el, mmu_idx, flags);
44
+FIELD(ID_ISAR2, MULTS, 16, 4)
53
}
45
+FIELD(ID_ISAR2, MULTU, 20, 4)
54
46
+FIELD(ID_ISAR2, PSR_AR, 24, 4)
55
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
47
+FIELD(ID_ISAR2, REVERSAL, 28, 4)
56
flags = FIELD_DP32(flags, TBFLAG_A32, VECSTRIDE,
48
+
57
env->vfp.vec_stride);
49
+FIELD(ID_ISAR3, SATURATE, 0, 4)
58
}
50
+FIELD(ID_ISAR3, SIMD, 4, 4)
59
+ if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)) {
51
+FIELD(ID_ISAR3, SVC, 8, 4)
60
+ flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
52
+FIELD(ID_ISAR3, SYNCHPRIM, 12, 4)
61
+ }
53
+FIELD(ID_ISAR3, TABBRANCH, 16, 4)
62
}
54
+FIELD(ID_ISAR3, T32COPY, 20, 4)
63
55
+FIELD(ID_ISAR3, TRUENOP, 24, 4)
64
flags = FIELD_DP32(flags, TBFLAG_A32, THUMB, env->thumb);
56
+FIELD(ID_ISAR3, T32EE, 28, 4)
65
flags = FIELD_DP32(flags, TBFLAG_A32, CONDEXEC, env->condexec_bits);
57
+
66
- if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)
58
+FIELD(ID_ISAR4, UNPRIV, 0, 4)
67
- || arm_el_is_aa64(env, 1) || arm_feature(env, ARM_FEATURE_M)) {
59
+FIELD(ID_ISAR4, WITHSHIFTS, 4, 4)
68
- flags = FIELD_DP32(flags, TBFLAG_A32, VFPEN, 1);
60
+FIELD(ID_ISAR4, WRITEBACK, 8, 4)
69
- }
61
+FIELD(ID_ISAR4, SMC, 12, 4)
70
pstate_for_ss = env->uncached_cpsr;
62
+FIELD(ID_ISAR4, BARRIER, 16, 4)
71
}
63
+FIELD(ID_ISAR4, SYNCHPRIM_FRAC, 20, 4)
72
64
+FIELD(ID_ISAR4, PSR_M, 24, 4)
65
+FIELD(ID_ISAR4, SWP_FRAC, 28, 4)
66
+
67
+FIELD(ID_ISAR5, SEVL, 0, 4)
68
+FIELD(ID_ISAR5, AES, 4, 4)
69
+FIELD(ID_ISAR5, SHA1, 8, 4)
70
+FIELD(ID_ISAR5, SHA2, 12, 4)
71
+FIELD(ID_ISAR5, CRC32, 16, 4)
72
+FIELD(ID_ISAR5, RDM, 24, 4)
73
+FIELD(ID_ISAR5, VCMA, 28, 4)
74
+
75
+FIELD(ID_ISAR6, JSCVT, 0, 4)
76
+FIELD(ID_ISAR6, DP, 4, 4)
77
+FIELD(ID_ISAR6, FHM, 8, 4)
78
+FIELD(ID_ISAR6, SB, 12, 4)
79
+FIELD(ID_ISAR6, SPECRES, 16, 4)
80
+
81
+FIELD(ID_AA64ISAR0, AES, 4, 4)
82
+FIELD(ID_AA64ISAR0, SHA1, 8, 4)
83
+FIELD(ID_AA64ISAR0, SHA2, 12, 4)
84
+FIELD(ID_AA64ISAR0, CRC32, 16, 4)
85
+FIELD(ID_AA64ISAR0, ATOMIC, 20, 4)
86
+FIELD(ID_AA64ISAR0, RDM, 28, 4)
87
+FIELD(ID_AA64ISAR0, SHA3, 32, 4)
88
+FIELD(ID_AA64ISAR0, SM3, 36, 4)
89
+FIELD(ID_AA64ISAR0, SM4, 40, 4)
90
+FIELD(ID_AA64ISAR0, DP, 44, 4)
91
+FIELD(ID_AA64ISAR0, FHM, 48, 4)
92
+FIELD(ID_AA64ISAR0, TS, 52, 4)
93
+FIELD(ID_AA64ISAR0, TLB, 56, 4)
94
+FIELD(ID_AA64ISAR0, RNDR, 60, 4)
95
+
96
+FIELD(ID_AA64ISAR1, DPB, 0, 4)
97
+FIELD(ID_AA64ISAR1, APA, 4, 4)
98
+FIELD(ID_AA64ISAR1, API, 8, 4)
99
+FIELD(ID_AA64ISAR1, JSCVT, 12, 4)
100
+FIELD(ID_AA64ISAR1, FCMA, 16, 4)
101
+FIELD(ID_AA64ISAR1, LRCPC, 20, 4)
102
+FIELD(ID_AA64ISAR1, GPA, 24, 4)
103
+FIELD(ID_AA64ISAR1, GPI, 28, 4)
104
+FIELD(ID_AA64ISAR1, FRINTTS, 32, 4)
105
+FIELD(ID_AA64ISAR1, SB, 36, 4)
106
+FIELD(ID_AA64ISAR1, SPECRES, 40, 4)
107
+
108
QEMU_BUILD_BUG_ON(ARRAY_SIZE(((ARMCPU *)0)->ccsidr) <= R_V7M_CSSELR_INDEX_MASK);
109
110
/* If adding a feature bit which corresponds to a Linux ELF
111
--
73
--
112
2.19.0
74
2.20.1
113
75
114
76
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
At present we assert:
3
This function assumes nothing about the current state of the cpu,
4
and writes the computed value to env->hflags.
4
5
5
arm_el_is_aa64: Assertion `el >= 1 && el <= 3' failed.
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
7
The comment in arm_el_is_aa64 explains why asking about EL0 without
8
extra information is impossible. Add an extra argument to provide
9
it from the surrounding context.
10
11
Fixes: 0ab5953b00b3
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20181008212205.17752-2-richard.henderson@linaro.org
8
Message-id: 20191018174431.1784-13-richard.henderson@linaro.org
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
10
---
17
target/arm/cpu.h | 7 +++++--
11
target/arm/cpu.h | 6 ++++++
18
target/arm/helper.c | 16 ++++++++++++----
12
target/arm/helper.c | 30 ++++++++++++++++++++++--------
19
target/arm/op_helper.c | 6 +++++-
13
2 files changed, 28 insertions(+), 8 deletions(-)
20
3 files changed, 22 insertions(+), 7 deletions(-)
21
14
22
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
23
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
24
--- a/target/arm/cpu.h
17
--- a/target/arm/cpu.h
25
+++ b/target/arm/cpu.h
18
+++ b/target/arm/cpu.h
26
@@ -XXX,XX +XXX,XX @@ int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
19
@@ -XXX,XX +XXX,XX @@ void arm_register_pre_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
27
int aarch64_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
20
void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook, void
28
int aarch64_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
21
*opaque);
29
void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq);
22
30
-void aarch64_sve_change_el(CPUARMState *env, int old_el, int new_el);
23
+/**
31
+void aarch64_sve_change_el(CPUARMState *env, int old_el,
24
+ * arm_rebuild_hflags:
32
+ int new_el, bool el0_a64);
25
+ * Rebuild the cached TBFLAGS for arbitrary changed processor state.
33
#else
26
+ */
34
static inline void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq) { }
27
+void arm_rebuild_hflags(CPUARMState *env);
35
-static inline void aarch64_sve_change_el(CPUARMState *env, int o, int n) { }
28
+
36
+static inline void aarch64_sve_change_el(CPUARMState *env, int o,
29
/**
37
+ int n, bool a)
30
* aa32_vfp_dreg:
38
+{ }
31
* Return a pointer to the Dn register within env in 32-bit mode.
39
#endif
40
41
target_ulong do_arm_semihosting(CPUARMState *env);
42
diff --git a/target/arm/helper.c b/target/arm/helper.c
32
diff --git a/target/arm/helper.c b/target/arm/helper.c
43
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/helper.c
34
--- a/target/arm/helper.c
45
+++ b/target/arm/helper.c
35
+++ b/target/arm/helper.c
46
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
36
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
47
unsigned int new_mode = aarch64_pstate_mode(new_el, true);
37
return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
48
unsigned int cur_el = arm_current_el(env);
38
}
49
39
50
- aarch64_sve_change_el(env, cur_el, new_el);
40
+static uint32_t rebuild_hflags_internal(CPUARMState *env)
51
+ /*
41
+{
52
+ * Note that new_el can never be 0. If cur_el is 0, then
42
+ int el = arm_current_el(env);
53
+ * el0_a64 is is_a64(), else el0_a64 is ignored.
43
+ int fp_el = fp_exception_el(env, el);
54
+ */
44
+ ARMMMUIdx mmu_idx = arm_mmu_idx(env);
55
+ aarch64_sve_change_el(env, cur_el, new_el, is_a64(env));
45
+
56
46
+ if (is_a64(env)) {
57
if (cur_el < new_el) {
47
+ return rebuild_hflags_a64(env, el, fp_el, mmu_idx);
58
/* Entry vector offset depends on whether the implemented EL
48
+ } else if (arm_feature(env, ARM_FEATURE_M)) {
59
@@ -XXX,XX +XXX,XX @@ void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq)
49
+ return rebuild_hflags_m32(env, fp_el, mmu_idx);
60
/*
50
+ } else {
61
* Notice a change in SVE vector size when changing EL.
51
+ return rebuild_hflags_a32(env, fp_el, mmu_idx);
62
*/
52
+ }
63
-void aarch64_sve_change_el(CPUARMState *env, int old_el, int new_el)
53
+}
64
+void aarch64_sve_change_el(CPUARMState *env, int old_el,
54
+
65
+ int new_el, bool el0_a64)
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)
66
{
62
{
67
int old_len, new_len;
63
- ARMMMUIdx mmu_idx = arm_mmu_idx(env);
68
+ bool old_a64, new_a64;
64
- int current_el = arm_current_el(env);
69
65
- int fp_el = fp_exception_el(env, current_el);
70
/* Nothing to do if no SVE. */
66
uint32_t flags, pstate_for_ss;
71
if (!arm_feature(env, ARM_FEATURE_SVE)) {
67
72
@@ -XXX,XX +XXX,XX @@ void aarch64_sve_change_el(CPUARMState *env, int old_el, int new_el)
68
+ flags = rebuild_hflags_internal(env);
73
* we already have the correct register contents when encountering the
69
+
74
* vq0->vq0 transition between EL0->EL1.
70
if (is_a64(env)) {
75
*/
71
*pc = env->pc;
76
- old_len = (arm_el_is_aa64(env, old_el) && !sve_exception_el(env, old_el)
72
- flags = rebuild_hflags_a64(env, current_el, fp_el, mmu_idx);
77
+ old_a64 = old_el ? arm_el_is_aa64(env, old_el) : el0_a64;
73
if (cpu_isar_feature(aa64_bti, env_archcpu(env))) {
78
+ old_len = (old_a64 && !sve_exception_el(env, old_el)
74
flags = FIELD_DP32(flags, TBFLAG_A64, BTYPE, env->btype);
79
? sve_zcr_len_for_el(env, old_el) : 0);
75
}
80
- new_len = (arm_el_is_aa64(env, new_el) && !sve_exception_el(env, new_el)
76
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
81
+ new_a64 = new_el ? arm_el_is_aa64(env, new_el) : el0_a64;
77
*pc = env->regs[15];
82
+ new_len = (new_a64 && !sve_exception_el(env, new_el)
78
83
? sve_zcr_len_for_el(env, new_el) : 0);
79
if (arm_feature(env, ARM_FEATURE_M)) {
84
80
- flags = rebuild_hflags_m32(env, fp_el, mmu_idx);
85
/* When changing vector length, clear inaccessible state. */
81
-
86
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
82
if (arm_feature(env, ARM_FEATURE_M_SECURITY) &&
87
index XXXXXXX..XXXXXXX 100644
83
FIELD_EX32(env->v7m.fpccr[M_REG_S], V7M_FPCCR, S)
88
--- a/target/arm/op_helper.c
84
!= env->v7m.secure) {
89
+++ b/target/arm/op_helper.c
85
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
90
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env)
86
flags = FIELD_DP32(flags, TBFLAG_A32, LSPACT, 1);
91
"AArch64 EL%d PC 0x%" PRIx64 "\n",
87
}
92
cur_el, new_el, env->pc);
88
} else {
93
}
89
- flags = rebuild_hflags_a32(env, fp_el, mmu_idx);
94
- aarch64_sve_change_el(env, cur_el, new_el);
90
-
95
+ /*
91
/*
96
+ * Note that cur_el can never be 0. If new_el is 0, then
92
* Note that XSCALE_CPAR shares bits with VECSTRIDE.
97
+ * el0_a64 is return_to_aa64, else el0_a64 is ignored.
93
* Note that VECLEN+VECSTRIDE are RES0 for M-profile.
98
+ */
99
+ aarch64_sve_change_el(env, cur_el, new_el, return_to_aa64);
100
101
qemu_mutex_lock_iothread();
102
arm_call_el_change_hook(arm_env_get_cpu(env));
103
--
94
--
104
2.19.0
95
2.20.1
105
96
106
97
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Add the ARM Cortex-A72.
3
Avoid calling arm_current_el() twice.
4
4
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Message-id: 20181011021931.4249-11-edgar.iglesias@gmail.com
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
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
10
---
9
target/arm/cpu64.c | 66 +++++++++++++++++++++++++++++++++++++++++++---
11
target/arm/internals.h | 9 +++++++++
10
1 file changed, 63 insertions(+), 3 deletions(-)
12
target/arm/helper.c | 12 +++++++-----
13
2 files changed, 16 insertions(+), 5 deletions(-)
11
14
12
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/cpu64.c
17
--- a/target/arm/internals.h
15
+++ b/target/arm/cpu64.c
18
+++ b/target/arm/internals.h
16
@@ -XXX,XX +XXX,XX @@ static uint64_t a57_a53_l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri)
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)
17
}
40
}
18
#endif
41
#endif
19
42
20
-static const ARMCPRegInfo cortex_a57_a53_cp_reginfo[] = {
43
-ARMMMUIdx arm_mmu_idx(CPUARMState *env)
21
+static const ARMCPRegInfo cortex_a72_a57_a53_cp_reginfo[] = {
44
+ARMMMUIdx arm_mmu_idx_el(CPUARMState *env, int el)
22
#ifndef CONFIG_USER_ONLY
45
{
23
{ .name = "L2CTLR_EL1", .state = ARM_CP_STATE_AA64,
46
- int el;
24
.opc0 = 3, .opc1 = 1, .crn = 11, .crm = 0, .opc2 = 2,
47
-
25
@@ -XXX,XX +XXX,XX @@ static void aarch64_a57_initfn(Object *obj)
48
if (arm_feature(env, ARM_FEATURE_M)) {
26
cpu->gic_num_lrs = 4;
49
return arm_v7m_mmu_idx_for_secstate(env, env->v7m.secure);
27
cpu->gic_vpribits = 5;
50
}
28
cpu->gic_vprebits = 5;
51
29
- define_arm_cp_regs(cpu, cortex_a57_a53_cp_reginfo);
52
- el = arm_current_el(env);
30
+ define_arm_cp_regs(cpu, cortex_a72_a57_a53_cp_reginfo);
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
}
31
}
58
}
32
59
33
static void aarch64_a53_initfn(Object *obj)
60
+ARMMMUIdx arm_mmu_idx(CPUARMState *env)
34
@@ -XXX,XX +XXX,XX @@ static void aarch64_a53_initfn(Object *obj)
61
+{
35
cpu->gic_num_lrs = 4;
62
+ return arm_mmu_idx_el(env, arm_current_el(env));
36
cpu->gic_vpribits = 5;
37
cpu->gic_vprebits = 5;
38
- define_arm_cp_regs(cpu, cortex_a57_a53_cp_reginfo);
39
+ define_arm_cp_regs(cpu, cortex_a72_a57_a53_cp_reginfo);
40
+}
63
+}
41
+
64
+
42
+static void aarch64_a72_initfn(Object *obj)
65
int cpu_mmu_index(CPUARMState *env, bool ifetch)
43
+{
66
{
44
+ ARMCPU *cpu = ARM_CPU(obj);
67
return arm_to_core_mmu_idx(arm_mmu_idx(env));
45
+
68
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_internal(CPUARMState *env)
46
+ cpu->dtb_compatible = "arm,cortex-a72";
69
{
47
+ set_feature(&cpu->env, ARM_FEATURE_V8);
70
int el = arm_current_el(env);
48
+ set_feature(&cpu->env, ARM_FEATURE_VFP4);
71
int fp_el = fp_exception_el(env, el);
49
+ set_feature(&cpu->env, ARM_FEATURE_NEON);
72
- ARMMMUIdx mmu_idx = arm_mmu_idx(env);
50
+ set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
73
+ ARMMMUIdx mmu_idx = arm_mmu_idx_el(env, el);
51
+ set_feature(&cpu->env, ARM_FEATURE_AARCH64);
74
52
+ set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
75
if (is_a64(env)) {
53
+ set_feature(&cpu->env, ARM_FEATURE_V8_AES);
76
return rebuild_hflags_a64(env, el, fp_el, mmu_idx);
54
+ set_feature(&cpu->env, ARM_FEATURE_V8_SHA1);
55
+ set_feature(&cpu->env, ARM_FEATURE_V8_SHA256);
56
+ set_feature(&cpu->env, ARM_FEATURE_V8_PMULL);
57
+ set_feature(&cpu->env, ARM_FEATURE_CRC);
58
+ set_feature(&cpu->env, ARM_FEATURE_EL2);
59
+ set_feature(&cpu->env, ARM_FEATURE_EL3);
60
+ set_feature(&cpu->env, ARM_FEATURE_PMU);
61
+ cpu->midr = 0x410fd083;
62
+ cpu->revidr = 0x00000000;
63
+ cpu->reset_fpsid = 0x41034080;
64
+ cpu->mvfr0 = 0x10110222;
65
+ cpu->mvfr1 = 0x12111111;
66
+ cpu->mvfr2 = 0x00000043;
67
+ cpu->ctr = 0x8444c004;
68
+ cpu->reset_sctlr = 0x00c50838;
69
+ cpu->id_pfr0 = 0x00000131;
70
+ cpu->id_pfr1 = 0x00011011;
71
+ cpu->id_dfr0 = 0x03010066;
72
+ cpu->id_afr0 = 0x00000000;
73
+ cpu->id_mmfr0 = 0x10201105;
74
+ cpu->id_mmfr1 = 0x40000000;
75
+ cpu->id_mmfr2 = 0x01260000;
76
+ cpu->id_mmfr3 = 0x02102211;
77
+ cpu->id_isar0 = 0x02101110;
78
+ cpu->id_isar1 = 0x13112111;
79
+ cpu->id_isar2 = 0x21232042;
80
+ cpu->id_isar3 = 0x01112131;
81
+ cpu->id_isar4 = 0x00011142;
82
+ cpu->id_isar5 = 0x00011121;
83
+ cpu->id_aa64pfr0 = 0x00002222;
84
+ cpu->id_aa64dfr0 = 0x10305106;
85
+ cpu->pmceid0 = 0x00000000;
86
+ cpu->pmceid1 = 0x00000000;
87
+ cpu->id_aa64isar0 = 0x00011120;
88
+ cpu->id_aa64mmfr0 = 0x00001124;
89
+ cpu->dbgdidr = 0x3516d000;
90
+ cpu->clidr = 0x0a200023;
91
+ cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
92
+ cpu->ccsidr[1] = 0x201fe012; /* 48KB L1 icache */
93
+ cpu->ccsidr[2] = 0x707fe07a; /* 1MB L2 cache */
94
+ cpu->dcz_blocksize = 4; /* 64 bytes */
95
+ cpu->gic_num_lrs = 4;
96
+ cpu->gic_vpribits = 5;
97
+ cpu->gic_vprebits = 5;
98
+ define_arm_cp_regs(cpu, cortex_a72_a57_a53_cp_reginfo);
99
}
100
101
static void cpu_max_get_sve_vq(Object *obj, Visitor *v, const char *name,
102
@@ -XXX,XX +XXX,XX @@ typedef struct ARMCPUInfo {
103
static const ARMCPUInfo aarch64_cpus[] = {
104
{ .name = "cortex-a57", .initfn = aarch64_a57_initfn },
105
{ .name = "cortex-a53", .initfn = aarch64_a53_initfn },
106
+ { .name = "cortex-a72", .initfn = aarch64_a72_initfn },
107
{ .name = "max", .initfn = aarch64_max_initfn },
108
{ .name = NULL }
109
};
110
--
77
--
111
2.19.0
78
2.20.1
112
79
113
80
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The missing nibble made it more difficult to read.
3
By performing this store early, we avoid having to save and restore
4
the register holding the address around any function calls.
4
5
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20181008212205.17752-5-richard.henderson@linaro.org
8
Message-id: 20191018174431.1784-15-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
target/arm/cpu.c | 2 +-
11
target/arm/helper.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
12
13
13
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu.c
16
--- a/target/arm/helper.c
16
+++ b/target/arm/cpu.c
17
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ static void cortex_r5_initfn(Object *obj)
18
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
18
cpu->id_mmfr1 = 0x00000000;
19
{
19
cpu->id_mmfr2 = 0x01200000;
20
uint32_t flags, pstate_for_ss;
20
cpu->id_mmfr3 = 0x0211;
21
21
- cpu->id_isar0 = 0x2101111;
22
+ *cs_base = 0;
22
+ cpu->id_isar0 = 0x02101111;
23
flags = rebuild_hflags_internal(env);
23
cpu->id_isar1 = 0x13112111;
24
24
cpu->id_isar2 = 0x21232141;
25
if (is_a64(env)) {
25
cpu->id_isar3 = 0x01112131;
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
26
--
34
--
27
2.19.0
35
2.20.1
28
36
29
37
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Implement support for 64bit descriptor addresses.
3
This functions are given the mode and el state of the cpu
4
and writes the computed value to env->hflags.
4
5
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20181011021931.4249-8-edgar.iglesias@gmail.com
8
Message-id: 20191018174431.1784-16-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
hw/net/cadence_gem.c | 47 ++++++++++++++++++++++++++++++++++++--------
11
target/arm/helper.h | 4 ++++
11
1 file changed, 39 insertions(+), 8 deletions(-)
12
target/arm/helper.c | 24 ++++++++++++++++++++++++
13
2 files changed, 28 insertions(+)
12
14
13
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
15
diff --git a/target/arm/helper.h b/target/arm/helper.h
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/net/cadence_gem.c
17
--- a/target/arm/helper.h
16
+++ b/hw/net/cadence_gem.c
18
+++ b/target/arm/helper.h
17
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(msr_banked, void, env, i32, i32, i32)
18
#define GEM_RECEIVE_Q1_PTR (0x00000480 / 4)
20
DEF_HELPER_2(get_user_reg, i32, env, i32)
19
#define GEM_RECEIVE_Q7_PTR (GEM_RECEIVE_Q1_PTR + 6)
21
DEF_HELPER_3(set_user_reg, void, env, i32, i32)
20
22
21
+#define GEM_TBQPH (0x000004C8 / 4)
23
+DEF_HELPER_FLAGS_2(rebuild_hflags_m32, TCG_CALL_NO_RWG, void, env, int)
22
+#define GEM_RBQPH (0x000004D4 / 4)
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)
23
+
26
+
24
#define GEM_INT_Q1_ENABLE (0x00000600 / 4)
27
DEF_HELPER_1(vfp_get_fpscr, i32, env)
25
#define GEM_INT_Q7_ENABLE (GEM_INT_Q1_ENABLE + 6)
28
DEF_HELPER_2(vfp_set_fpscr, void, env, i32)
26
29
27
@@ -XXX,XX +XXX,XX @@ static int get_queue_from_screen(CadenceGEMState *s, uint8_t *rxbuf_ptr,
30
diff --git a/target/arm/helper.c b/target/arm/helper.c
28
return 0;
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);
29
}
36
}
30
37
31
+static hwaddr gem_get_desc_addr(CadenceGEMState *s, bool tx, int q)
38
+void HELPER(rebuild_hflags_m32)(CPUARMState *env, int el)
32
+{
39
+{
33
+ hwaddr desc_addr = 0;
40
+ int fp_el = fp_exception_el(env, el);
41
+ ARMMMUIdx mmu_idx = arm_mmu_idx_el(env, el);
34
+
42
+
35
+ if (s->regs[GEM_DMACFG] & GEM_DMACFG_ADDR_64B) {
43
+ env->hflags = rebuild_hflags_m32(env, fp_el, mmu_idx);
36
+ desc_addr = s->regs[tx ? GEM_TBQPH : GEM_RBQPH];
37
+ }
38
+ desc_addr <<= 32;
39
+ desc_addr |= tx ? s->tx_desc_addr[q] : s->rx_desc_addr[q];
40
+ return desc_addr;
41
+}
44
+}
42
+
45
+
43
+static hwaddr gem_get_tx_desc_addr(CadenceGEMState *s, int q)
46
+void HELPER(rebuild_hflags_a32)(CPUARMState *env, int el)
44
+{
47
+{
45
+ return gem_get_desc_addr(s, true, q);
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);
46
+}
52
+}
47
+
53
+
48
+static hwaddr gem_get_rx_desc_addr(CadenceGEMState *s, int q)
54
+void HELPER(rebuild_hflags_a64)(CPUARMState *env, int el)
49
+{
55
+{
50
+ return gem_get_desc_addr(s, false, q);
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);
51
+}
60
+}
52
+
61
+
53
static void gem_get_rx_desc(CadenceGEMState *s, int q)
62
void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
63
target_ulong *cs_base, uint32_t *pflags)
54
{
64
{
55
- DB_PRINT("read descriptor 0x%x\n", (unsigned)s->rx_desc_addr[q]);
56
+ hwaddr desc_addr = gem_get_rx_desc_addr(s, q);
57
+
58
+ DB_PRINT("read descriptor 0x%" HWADDR_PRIx "\n", desc_addr);
59
+
60
/* read current descriptor */
61
- address_space_read(&s->dma_as, s->rx_desc_addr[q], MEMTXATTRS_UNSPECIFIED,
62
+ address_space_read(&s->dma_as, desc_addr, MEMTXATTRS_UNSPECIFIED,
63
(uint8_t *)s->rx_desc[q],
64
sizeof(uint32_t) * gem_get_desc_len(s, true));
65
66
/* Descriptor owned by software ? */
67
if (rx_desc_get_ownership(s->rx_desc[q]) == 1) {
68
- DB_PRINT("descriptor 0x%x owned by sw.\n",
69
- (unsigned)s->rx_desc_addr[q]);
70
+ DB_PRINT("descriptor 0x%" HWADDR_PRIx " owned by sw.\n", desc_addr);
71
s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_NOBUF;
72
s->regs[GEM_ISR] |= GEM_INT_RXUSED & ~(s->regs[GEM_IMR]);
73
/* Handle interrupt consequences */
74
@@ -XXX,XX +XXX,XX @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
75
q = get_queue_from_screen(s, rxbuf_ptr, rxbufsize);
76
77
while (bytes_to_copy) {
78
+ hwaddr desc_addr;
79
+
80
/* Do nothing if receive is not enabled. */
81
if (!gem_can_receive(nc)) {
82
assert(!first_desc);
83
@@ -XXX,XX +XXX,XX @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
84
}
85
86
/* Descriptor write-back. */
87
- address_space_write(&s->dma_as, s->rx_desc_addr[q],
88
+ desc_addr = gem_get_rx_desc_addr(s, q);
89
+ address_space_write(&s->dma_as, desc_addr,
90
MEMTXATTRS_UNSPECIFIED,
91
(uint8_t *)s->rx_desc[q],
92
sizeof(uint32_t) * gem_get_desc_len(s, true));
93
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
94
95
for (q = s->num_priority_queues - 1; q >= 0; q--) {
96
/* read current descriptor */
97
- packet_desc_addr = s->tx_desc_addr[q];
98
+ packet_desc_addr = gem_get_tx_desc_addr(s, q);
99
100
DB_PRINT("read descriptor 0x%" HWADDR_PRIx "\n", packet_desc_addr);
101
address_space_read(&s->dma_as, packet_desc_addr,
102
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
103
/* Last descriptor for this packet; hand the whole thing off */
104
if (tx_desc_get_last(desc)) {
105
uint32_t desc_first[DESC_MAX_NUM_WORDS];
106
+ hwaddr desc_addr = gem_get_tx_desc_addr(s, q);
107
108
/* Modify the 1st descriptor of this packet to be owned by
109
* the processor.
110
*/
111
- address_space_read(&s->dma_as, s->tx_desc_addr[q],
112
+ address_space_read(&s->dma_as, desc_addr,
113
MEMTXATTRS_UNSPECIFIED,
114
(uint8_t *)desc_first,
115
sizeof(desc_first));
116
tx_desc_set_used(desc_first);
117
- address_space_write(&s->dma_as, s->tx_desc_addr[q],
118
+ address_space_write(&s->dma_as, desc_addr,
119
MEMTXATTRS_UNSPECIFIED,
120
(uint8_t *)desc_first,
121
sizeof(desc_first));
122
--
65
--
123
2.19.0
66
2.20.1
124
67
125
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
The incorrect value advertised only thumb2 div without arm div.
3
Begin setting, but not relying upon, env->hflags.
4
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20181008212205.17752-6-richard.henderson@linaro.org
7
Message-id: 20191018174431.1784-17-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
9
---
10
target/arm/cpu.c | 5 ++++-
10
linux-user/syscall.c | 1 +
11
1 file changed, 4 insertions(+), 1 deletion(-)
11
target/arm/cpu.c | 1 +
12
target/arm/helper-a64.c | 3 +++
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(+)
12
17
18
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/linux-user/syscall.c
21
+++ b/linux-user/syscall.c
22
@@ -XXX,XX +XXX,XX @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
23
aarch64_sve_narrow_vq(env, vq);
24
}
25
env->vfp.zcr_el[1] = vq - 1;
26
+ arm_rebuild_hflags(env);
27
ret = vq * 16;
28
}
29
return ret;
13
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
30
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
14
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu.c
32
--- a/target/arm/cpu.c
16
+++ b/target/arm/cpu.c
33
+++ b/target/arm/cpu.c
17
@@ -XXX,XX +XXX,XX @@ static void cortex_a7_initfn(Object *obj)
34
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
18
cpu->id_mmfr1 = 0x40000000;
35
19
cpu->id_mmfr2 = 0x01240000;
36
hw_breakpoint_update_all(cpu);
20
cpu->id_mmfr3 = 0x02102211;
37
hw_watchpoint_update_all(cpu);
21
- cpu->id_isar0 = 0x01101110;
38
+ arm_rebuild_hflags(env);
22
+ /* a7_mpcore_r0p5_trm, page 4-4 gives 0x01101110; but
39
}
23
+ * table 4-41 gives 0x02101110, which includes the arm div insns.
40
24
+ */
41
bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
25
+ cpu->id_isar0 = 0x02101110;
42
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
26
cpu->id_isar1 = 0x13112111;
43
index XXXXXXX..XXXXXXX 100644
27
cpu->id_isar2 = 0x21232041;
44
--- a/target/arm/helper-a64.c
28
cpu->id_isar3 = 0x11112131;
45
+++ b/target/arm/helper-a64.c
46
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
47
} else {
48
env->regs[15] = new_pc & ~0x3;
49
}
50
+ helper_rebuild_hflags_a32(env, new_el);
51
qemu_log_mask(CPU_LOG_INT, "Exception return from AArch64 EL%d to "
52
"AArch32 EL%d PC 0x%" PRIx32 "\n",
53
cur_el, new_el, env->regs[15]);
54
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
55
}
56
aarch64_restore_sp(env, new_el);
57
env->pc = new_pc;
58
+ helper_rebuild_hflags_a64(env, new_el);
59
qemu_log_mask(CPU_LOG_INT, "Exception return from AArch64 EL%d to "
60
"AArch64 EL%d PC 0x%" PRIx64 "\n",
61
cur_el, new_el, env->pc);
62
}
63
+
64
/*
65
* Note that cur_el can never be 0. If new_el is 0, then
66
* el0_a64 is return_to_aa64, else el0_a64 is ignored.
67
diff --git a/target/arm/helper.c b/target/arm/helper.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/target/arm/helper.c
70
+++ b/target/arm/helper.c
71
@@ -XXX,XX +XXX,XX @@ static void take_aarch32_exception(CPUARMState *env, int new_mode,
72
env->regs[14] = env->regs[15] + offset;
73
}
74
env->regs[15] = newpc;
75
+ arm_rebuild_hflags(env);
76
}
77
78
static void arm_cpu_do_interrupt_aarch32_hyp(CPUState *cs)
79
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
80
pstate_write(env, PSTATE_DAIF | new_mode);
81
env->aarch64 = 1;
82
aarch64_restore_sp(env, new_el);
83
+ helper_rebuild_hflags_a64(env, new_el);
84
85
env->pc = addr;
86
87
diff --git a/target/arm/machine.c b/target/arm/machine.c
88
index XXXXXXX..XXXXXXX 100644
89
--- a/target/arm/machine.c
90
+++ b/target/arm/machine.c
91
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
92
if (!kvm_enabled()) {
93
pmu_op_finish(&cpu->env);
94
}
95
+ arm_rebuild_hflags(&cpu->env);
96
97
return 0;
98
}
99
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
100
index XXXXXXX..XXXXXXX 100644
101
--- a/target/arm/op_helper.c
102
+++ b/target/arm/op_helper.c
103
@@ -XXX,XX +XXX,XX @@ void HELPER(cpsr_write_eret)(CPUARMState *env, uint32_t val)
104
* state. Do the masking now.
105
*/
106
env->regs[15] &= (env->thumb ? ~1 : ~3);
107
+ arm_rebuild_hflags(env);
108
109
qemu_mutex_lock_iothread();
110
arm_call_el_change_hook(env_archcpu(env));
29
--
111
--
30
2.19.0
112
2.20.1
31
113
32
114
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Add support for selecting the Memory Region that the GEM
3
Continue setting, but not relying upon, env->hflags.
4
will do DMA to.
5
4
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20181011021931.4249-7-edgar.iglesias@gmail.com
7
Message-id: 20191018174431.1784-18-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
include/hw/net/cadence_gem.h | 2 ++
10
target/arm/translate-a64.c | 13 +++++++++++--
12
hw/net/cadence_gem.c | 59 ++++++++++++++++++++++--------------
11
target/arm/translate.c | 28 +++++++++++++++++++++++-----
13
2 files changed, 39 insertions(+), 22 deletions(-)
12
2 files changed, 34 insertions(+), 7 deletions(-)
14
13
15
diff --git a/include/hw/net/cadence_gem.h b/include/hw/net/cadence_gem.h
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/net/cadence_gem.h
16
--- a/target/arm/translate-a64.c
18
+++ b/include/hw/net/cadence_gem.h
17
+++ b/target/arm/translate-a64.c
19
@@ -XXX,XX +XXX,XX @@ typedef struct CadenceGEMState {
18
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
20
19
if ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) && (ri->type & ARM_CP_IO)) {
21
/*< public >*/
20
/* I/O operations must end the TB here (whether read or write) */
22
MemoryRegion iomem;
21
s->base.is_jmp = DISAS_UPDATE;
23
+ MemoryRegion *dma_mr;
22
- } else if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
24
+ AddressSpace dma_as;
23
- /* We default to ending the TB on a coprocessor register write,
25
NICState *nic;
24
+ }
26
NICConf conf;
25
+ if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
27
qemu_irq irq[MAX_PRIORITY_QUEUES];
26
+ /*
28
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
27
+ * A write to any coprocessor regiser that ends a TB
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
29
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/net/cadence_gem.c
40
--- a/target/arm/translate.c
31
+++ b/hw/net/cadence_gem.c
41
+++ b/target/arm/translate.c
32
@@ -XXX,XX +XXX,XX @@
42
@@ -XXX,XX +XXX,XX @@ static int disas_coproc_insn(DisasContext *s, uint32_t insn)
33
#include "hw/net/cadence_gem.h"
43
ri = get_arm_cp_reginfo(s->cp_regs,
34
#include "qapi/error.h"
44
ENCODE_CP_REG(cpnum, is64, s->ns, crn, crm, opc1, opc2));
35
#include "qemu/log.h"
45
if (ri) {
36
+#include "sysemu/dma.h"
46
+ bool need_exit_tb;
37
#include "net/checksum.h"
47
+
38
48
/* Check access permissions */
39
#ifdef CADENCE_GEM_ERR_DEBUG
49
if (!cp_access_ok(s->current_el, ri, isread)) {
40
@@ -XXX,XX +XXX,XX @@ static void gem_get_rx_desc(CadenceGEMState *s, int q)
50
return 1;
41
{
51
@@ -XXX,XX +XXX,XX @@ static int disas_coproc_insn(DisasContext *s, uint32_t insn)
42
DB_PRINT("read descriptor 0x%x\n", (unsigned)s->rx_desc_addr[q]);
52
}
43
/* read current descriptor */
44
- cpu_physical_memory_read(s->rx_desc_addr[q],
45
- (uint8_t *)s->rx_desc[q],
46
- sizeof(uint32_t) * gem_get_desc_len(s, true));
47
+ address_space_read(&s->dma_as, s->rx_desc_addr[q], MEMTXATTRS_UNSPECIFIED,
48
+ (uint8_t *)s->rx_desc[q],
49
+ sizeof(uint32_t) * gem_get_desc_len(s, true));
50
51
/* Descriptor owned by software ? */
52
if (rx_desc_get_ownership(s->rx_desc[q]) == 1) {
53
@@ -XXX,XX +XXX,XX @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
54
rx_desc_get_buffer(s->rx_desc[q]));
55
56
/* Copy packet data to emulated DMA buffer */
57
- cpu_physical_memory_write(rx_desc_get_buffer(s, s->rx_desc[q]) +
58
+ address_space_write(&s->dma_as, rx_desc_get_buffer(s, s->rx_desc[q]) +
59
rxbuf_offset,
60
- rxbuf_ptr,
61
- MIN(bytes_to_copy, rxbufsize));
62
+ MEMTXATTRS_UNSPECIFIED, rxbuf_ptr,
63
+ MIN(bytes_to_copy, rxbufsize));
64
rxbuf_ptr += MIN(bytes_to_copy, rxbufsize);
65
bytes_to_copy -= MIN(bytes_to_copy, rxbufsize);
66
67
@@ -XXX,XX +XXX,XX @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
68
}
53
}
69
54
70
/* Descriptor write-back. */
55
- if ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) && (ri->type & ARM_CP_IO)) {
71
- cpu_physical_memory_write(s->rx_desc_addr[q],
56
- /* I/O operations must end the TB here (whether read or write) */
72
- (uint8_t *)s->rx_desc[q],
57
- gen_lookup_tb(s);
73
- sizeof(uint32_t) * gem_get_desc_len(s, true));
58
- } else if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
74
+ address_space_write(&s->dma_as, s->rx_desc_addr[q],
59
- /* We default to ending the TB on a coprocessor register write,
75
+ MEMTXATTRS_UNSPECIFIED,
60
+ /* I/O operations must end the TB here (whether read or write) */
76
+ (uint8_t *)s->rx_desc[q],
61
+ need_exit_tb = ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) &&
77
+ sizeof(uint32_t) * gem_get_desc_len(s, true));
62
+ (ri->type & ARM_CP_IO));
78
63
+
79
/* Next descriptor */
64
+ if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
80
if (rx_desc_get_wrap(s->rx_desc[q])) {
65
+ /*
81
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
66
+ * A write to any coprocessor regiser that ends a TB
82
packet_desc_addr = s->tx_desc_addr[q];
67
+ * must rebuild the hflags for the next TB.
83
68
+ */
84
DB_PRINT("read descriptor 0x%" HWADDR_PRIx "\n", packet_desc_addr);
69
+ TCGv_i32 tcg_el = tcg_const_i32(s->current_el);
85
- cpu_physical_memory_read(packet_desc_addr,
70
+ if (arm_dc_feature(s, ARM_FEATURE_M)) {
86
- (uint8_t *)desc,
71
+ gen_helper_rebuild_hflags_m32(cpu_env, tcg_el);
87
- sizeof(uint32_t) * gem_get_desc_len(s, false));
72
+ } else {
88
+ address_space_read(&s->dma_as, packet_desc_addr,
73
+ gen_helper_rebuild_hflags_a32(cpu_env, tcg_el);
89
+ MEMTXATTRS_UNSPECIFIED, (uint8_t *)desc,
74
+ }
90
+ sizeof(uint32_t) * gem_get_desc_len(s, false));
75
+ tcg_temp_free_i32(tcg_el);
91
/* Handle all descriptors owned by hardware */
76
+ /*
92
while (tx_desc_get_used(desc) == 0) {
77
+ * We default to ending the TB on a coprocessor register write,
93
78
* but allow this to be suppressed by the register definition
94
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
79
* (usually only necessary to work around guest bugs).
95
/* Gather this fragment of the packet from "dma memory" to our
96
* contig buffer.
97
*/
80
*/
98
- cpu_physical_memory_read(tx_desc_get_buffer(s, desc), p,
81
+ need_exit_tb = true;
99
- tx_desc_get_length(desc));
82
+ }
100
+ address_space_read(&s->dma_as, tx_desc_get_buffer(s, desc),
83
+ if (need_exit_tb) {
101
+ MEMTXATTRS_UNSPECIFIED,
84
gen_lookup_tb(s);
102
+ p, tx_desc_get_length(desc));
103
p += tx_desc_get_length(desc);
104
total_bytes += tx_desc_get_length(desc);
105
106
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
107
/* Modify the 1st descriptor of this packet to be owned by
108
* the processor.
109
*/
110
- cpu_physical_memory_read(s->tx_desc_addr[q],
111
- (uint8_t *)desc_first,
112
- sizeof(desc_first));
113
+ address_space_read(&s->dma_as, s->tx_desc_addr[q],
114
+ MEMTXATTRS_UNSPECIFIED,
115
+ (uint8_t *)desc_first,
116
+ sizeof(desc_first));
117
tx_desc_set_used(desc_first);
118
- cpu_physical_memory_write(s->tx_desc_addr[q],
119
- (uint8_t *)desc_first,
120
- sizeof(desc_first));
121
+ address_space_write(&s->dma_as, s->tx_desc_addr[q],
122
+ MEMTXATTRS_UNSPECIFIED,
123
+ (uint8_t *)desc_first,
124
+ sizeof(desc_first));
125
/* Advance the hardware current descriptor past this packet */
126
if (tx_desc_get_wrap(desc)) {
127
s->tx_desc_addr[q] = s->regs[GEM_TXQBASE];
128
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
129
packet_desc_addr += 4 * gem_get_desc_len(s, false);
130
}
131
DB_PRINT("read descriptor 0x%" HWADDR_PRIx "\n", packet_desc_addr);
132
- cpu_physical_memory_read(packet_desc_addr, (uint8_t *)desc,
133
- sizeof(uint32_t) * gem_get_desc_len(s, false));
134
+ address_space_read(&s->dma_as, packet_desc_addr,
135
+ MEMTXATTRS_UNSPECIFIED, (uint8_t *)desc,
136
+ sizeof(uint32_t) * gem_get_desc_len(s, false));
137
}
85
}
138
86
139
if (tx_desc_get_used(desc)) {
140
@@ -XXX,XX +XXX,XX @@ static void gem_realize(DeviceState *dev, Error **errp)
141
CadenceGEMState *s = CADENCE_GEM(dev);
142
int i;
143
144
+ address_space_init(&s->dma_as,
145
+ s->dma_mr ? s->dma_mr : get_system_memory(), "dma");
146
+
147
if (s->num_priority_queues == 0 ||
148
s->num_priority_queues > MAX_PRIORITY_QUEUES) {
149
error_setg(errp, "Invalid num-priority-queues value: %" PRIx8,
150
@@ -XXX,XX +XXX,XX @@ static void gem_init(Object *obj)
151
"enet", sizeof(s->regs));
152
153
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
154
+
155
+ object_property_add_link(obj, "dma", TYPE_MEMORY_REGION,
156
+ (Object **)&s->dma_mr,
157
+ qdev_prop_allow_set_link_before_realize,
158
+ OBJ_PROP_LINK_STRONG,
159
+ &error_abort);
160
}
161
162
static const VMStateDescription vmstate_cadence_gem = {
163
--
87
--
164
2.19.0
88
2.20.1
165
89
166
90
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Use uint32_t instead of unsigned to describe 32bit descriptor words.
3
Continue setting, but not relying upon, env->hflags.
4
4
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Message-id: 20191018174431.1784-19-richard.henderson@linaro.org
8
Message-id: 20181011021931.4249-4-edgar.iglesias@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
include/hw/net/cadence_gem.h | 2 +-
10
target/arm/op_helper.c | 3 +++
12
hw/net/cadence_gem.c | 42 ++++++++++++++++++------------------
11
1 file changed, 3 insertions(+)
13
2 files changed, 22 insertions(+), 22 deletions(-)
14
12
15
diff --git a/include/hw/net/cadence_gem.h b/include/hw/net/cadence_gem.h
13
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/net/cadence_gem.h
15
--- a/target/arm/op_helper.c
18
+++ b/include/hw/net/cadence_gem.h
16
+++ b/target/arm/op_helper.c
19
@@ -XXX,XX +XXX,XX @@ typedef struct CadenceGEMState {
17
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(usat16)(CPUARMState *env, uint32_t x, uint32_t shift)
20
18
void HELPER(setend)(CPUARMState *env)
21
uint8_t can_rx_state; /* Debug only */
22
23
- unsigned rx_desc[MAX_PRIORITY_QUEUES][2];
24
+ uint32_t rx_desc[MAX_PRIORITY_QUEUES][2];
25
26
bool sar_active[4];
27
} CadenceGEMState;
28
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/net/cadence_gem.c
31
+++ b/hw/net/cadence_gem.c
32
@@ -XXX,XX +XXX,XX @@
33
34
#define GEM_MODID_VALUE 0x00020118
35
36
-static inline unsigned tx_desc_get_buffer(unsigned *desc)
37
+static inline unsigned tx_desc_get_buffer(uint32_t *desc)
38
{
19
{
39
return desc[0];
20
env->uncached_cpsr ^= CPSR_E;
21
+ arm_rebuild_hflags(env);
40
}
22
}
41
23
42
-static inline unsigned tx_desc_get_used(unsigned *desc)
24
/* Function checks whether WFx (WFI/WFE) instructions are set up to be trapped.
43
+static inline unsigned tx_desc_get_used(uint32_t *desc)
25
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(cpsr_read)(CPUARMState *env)
26
void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask)
44
{
27
{
45
return (desc[1] & DESC_1_USED) ? 1 : 0;
28
cpsr_write(env, val, mask, CPSRWriteByInstr);
29
+ /* TODO: Not all cpsr bits are relevant to hflags. */
30
+ arm_rebuild_hflags(env);
46
}
31
}
47
32
48
-static inline void tx_desc_set_used(unsigned *desc)
33
/* Write the CPSR for a 32-bit exception return */
49
+static inline void tx_desc_set_used(uint32_t *desc)
50
{
51
desc[1] |= DESC_1_USED;
52
}
53
54
-static inline unsigned tx_desc_get_wrap(unsigned *desc)
55
+static inline unsigned tx_desc_get_wrap(uint32_t *desc)
56
{
57
return (desc[1] & DESC_1_TX_WRAP) ? 1 : 0;
58
}
59
60
-static inline unsigned tx_desc_get_last(unsigned *desc)
61
+static inline unsigned tx_desc_get_last(uint32_t *desc)
62
{
63
return (desc[1] & DESC_1_TX_LAST) ? 1 : 0;
64
}
65
66
-static inline void tx_desc_set_last(unsigned *desc)
67
+static inline void tx_desc_set_last(uint32_t *desc)
68
{
69
desc[1] |= DESC_1_TX_LAST;
70
}
71
72
-static inline unsigned tx_desc_get_length(unsigned *desc)
73
+static inline unsigned tx_desc_get_length(uint32_t *desc)
74
{
75
return desc[1] & DESC_1_LENGTH;
76
}
77
78
-static inline void print_gem_tx_desc(unsigned *desc, uint8_t queue)
79
+static inline void print_gem_tx_desc(uint32_t *desc, uint8_t queue)
80
{
81
DB_PRINT("TXDESC (queue %" PRId8 "):\n", queue);
82
DB_PRINT("bufaddr: 0x%08x\n", *desc);
83
@@ -XXX,XX +XXX,XX @@ static inline void print_gem_tx_desc(unsigned *desc, uint8_t queue)
84
DB_PRINT("length: %d\n", tx_desc_get_length(desc));
85
}
86
87
-static inline unsigned rx_desc_get_buffer(unsigned *desc)
88
+static inline unsigned rx_desc_get_buffer(uint32_t *desc)
89
{
90
return desc[0] & ~0x3UL;
91
}
92
93
-static inline unsigned rx_desc_get_wrap(unsigned *desc)
94
+static inline unsigned rx_desc_get_wrap(uint32_t *desc)
95
{
96
return desc[0] & DESC_0_RX_WRAP ? 1 : 0;
97
}
98
99
-static inline unsigned rx_desc_get_ownership(unsigned *desc)
100
+static inline unsigned rx_desc_get_ownership(uint32_t *desc)
101
{
102
return desc[0] & DESC_0_RX_OWNERSHIP ? 1 : 0;
103
}
104
105
-static inline void rx_desc_set_ownership(unsigned *desc)
106
+static inline void rx_desc_set_ownership(uint32_t *desc)
107
{
108
desc[0] |= DESC_0_RX_OWNERSHIP;
109
}
110
111
-static inline void rx_desc_set_sof(unsigned *desc)
112
+static inline void rx_desc_set_sof(uint32_t *desc)
113
{
114
desc[1] |= DESC_1_RX_SOF;
115
}
116
117
-static inline void rx_desc_set_eof(unsigned *desc)
118
+static inline void rx_desc_set_eof(uint32_t *desc)
119
{
120
desc[1] |= DESC_1_RX_EOF;
121
}
122
123
-static inline void rx_desc_set_length(unsigned *desc, unsigned len)
124
+static inline void rx_desc_set_length(uint32_t *desc, unsigned len)
125
{
126
desc[1] &= ~DESC_1_LENGTH;
127
desc[1] |= len;
128
}
129
130
-static inline void rx_desc_set_broadcast(unsigned *desc)
131
+static inline void rx_desc_set_broadcast(uint32_t *desc)
132
{
133
desc[1] |= R_DESC_1_RX_BROADCAST;
134
}
135
136
-static inline void rx_desc_set_unicast_hash(unsigned *desc)
137
+static inline void rx_desc_set_unicast_hash(uint32_t *desc)
138
{
139
desc[1] |= R_DESC_1_RX_UNICAST_HASH;
140
}
141
142
-static inline void rx_desc_set_multicast_hash(unsigned *desc)
143
+static inline void rx_desc_set_multicast_hash(uint32_t *desc)
144
{
145
desc[1] |= R_DESC_1_RX_MULTICAST_HASH;
146
}
147
148
-static inline void rx_desc_set_sar(unsigned *desc, int sar_idx)
149
+static inline void rx_desc_set_sar(uint32_t *desc, int sar_idx)
150
{
151
desc[1] = deposit32(desc[1], R_DESC_1_RX_SAR_SHIFT, R_DESC_1_RX_SAR_LENGTH,
152
sar_idx);
153
@@ -XXX,XX +XXX,XX @@ static void gem_transmit_updatestats(CadenceGEMState *s, const uint8_t *packet,
154
*/
155
static void gem_transmit(CadenceGEMState *s)
156
{
157
- unsigned desc[2];
158
+ uint32_t desc[2];
159
hwaddr packet_desc_addr;
160
uint8_t tx_packet[2048];
161
uint8_t *p;
162
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
163
164
/* Last descriptor for this packet; hand the whole thing off */
165
if (tx_desc_get_last(desc)) {
166
- unsigned desc_first[2];
167
+ uint32_t desc_first[2];
168
169
/* Modify the 1st descriptor of this packet to be owned by
170
* the processor.
171
--
34
--
172
2.19.0
35
2.20.1
173
36
174
37
diff view generated by jsdifflib
1
From: Aaron Lindsay <aclindsa@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This is an amendment to my earlier patch:
3
Continue setting, but not relying upon, env->hflags.
4
commit 7ece99b17e832065236c07a158dfac62619ef99b
5
Author: Aaron Lindsay <alindsay@codeaurora.org>
6
Date: Thu Apr 26 11:04:39 2018 +0100
7
4
8
    target/arm: Mask PMU register writes based on PMCR_EL0.N
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
6
Message-id: 20191018174431.1784-20-richard.henderson@linaro.org
10
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20181010203735.27918-3-aclindsa@gmail.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
9
---
15
target/arm/helper.c | 1 +
10
target/arm/helper.c | 10 ++++++++++
16
1 file changed, 1 insertion(+)
11
1 file changed, 10 insertions(+)
17
12
18
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
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/helper.c
15
--- a/target/arm/helper.c
21
+++ b/target/arm/helper.c
16
+++ b/target/arm/helper.c
22
@@ -XXX,XX +XXX,XX @@ static void pmcntenclr_write(CPUARMState *env, const ARMCPRegInfo *ri,
17
@@ -XXX,XX +XXX,XX @@ static void sctlr_write(CPUARMState *env, const ARMCPRegInfo *ri,
23
static void pmovsr_write(CPUARMState *env, const ARMCPRegInfo *ri,
18
/* ??? Lots of these bits are not implemented. */
24
uint64_t value)
19
/* This may enable/disable the MMU, so do a TLB flush. */
25
{
20
tlb_flush(CPU(cpu));
26
+ value &= pmu_counter_mask(env);
21
+
27
env->cp15.c9_pmovsr &= ~value;
22
+ if (ri->type & ARM_CP_SUPPRESS_TB_END) {
23
+ /*
24
+ * Normally we would always end the TB on an SCTLR write; see the
25
+ * comment in ARMCPRegInfo sctlr initialization below for why Xscale
26
+ * is special. Setting ARM_CP_SUPPRESS_TB_END also stops the rebuild
27
+ * of hflags from the translator, so do it here.
28
+ */
29
+ arm_rebuild_hflags(env);
30
+ }
28
}
31
}
29
32
33
static CPAccessResult fpexc32_access(CPUARMState *env, const ARMCPRegInfo *ri,
30
--
34
--
31
2.19.0
35
2.20.1
32
36
33
37
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
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
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/m_helper.c | 6 ++++++
11
target/arm/translate.c | 5 ++++-
12
2 files changed, 10 insertions(+), 1 deletion(-)
13
14
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/m_helper.c
17
+++ b/target/arm/m_helper.c
18
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_bxns)(CPUARMState *env, uint32_t dest)
19
switch_v7m_security_state(env, dest & 1);
20
env->thumb = 1;
21
env->regs[15] = dest & ~1;
22
+ arm_rebuild_hflags(env);
23
}
24
25
void HELPER(v7m_blxns)(CPUARMState *env, uint32_t dest)
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);
31
}
32
33
static uint32_t *get_v7m_sp_ptr(CPUARMState *env, bool secure, bool threadmode,
34
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
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)
73
{
74
- TCGv_i32 addr, reg;
75
+ TCGv_i32 addr, reg, el;
76
77
if (!arm_dc_feature(s, ARM_FEATURE_M)) {
78
return false;
79
@@ -XXX,XX +XXX,XX @@ static bool trans_MSR_v7m(DisasContext *s, arg_MSR_v7m *a)
80
gen_helper_v7m_msr(cpu_env, addr, reg);
81
tcg_temp_free_i32(addr);
82
tcg_temp_free_i32(reg);
83
+ el = tcg_const_i32(s->current_el);
84
+ gen_helper_rebuild_hflags_m32(cpu_env, el);
85
+ tcg_temp_free_i32(el);
86
gen_lookup_tb(s);
87
return true;
88
}
89
--
90
2.20.1
91
92
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Continue setting, but not relying upon, env->hflags.
4
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20191018174431.1784-22-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/intc/armv7m_nvic.c | 22 +++++++++++++---------
12
1 file changed, 13 insertions(+), 9 deletions(-)
13
14
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/intc/armv7m_nvic.c
17
+++ b/hw/intc/armv7m_nvic.c
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
19
}
20
}
21
nvic_irq_update(s);
22
- return MEMTX_OK;
23
+ goto exit_ok;
24
case 0x200 ... 0x23f: /* NVIC Set pend */
25
/* the special logic in armv7m_nvic_set_pending()
26
* is not needed since IRQs are never escalated
27
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
28
}
29
}
30
nvic_irq_update(s);
31
- return MEMTX_OK;
32
+ goto exit_ok;
33
case 0x300 ... 0x33f: /* NVIC Active */
34
- return MEMTX_OK; /* R/O */
35
+ goto exit_ok; /* R/O */
36
case 0x400 ... 0x5ef: /* NVIC Priority */
37
startvec = (offset - 0x400) + NVIC_FIRST_IRQ; /* vector # */
38
39
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
40
}
41
}
42
nvic_irq_update(s);
43
- return MEMTX_OK;
44
+ goto exit_ok;
45
case 0xd18 ... 0xd1b: /* System Handler Priority (SHPR1) */
46
if (!arm_feature(&s->cpu->env, ARM_FEATURE_M_MAIN)) {
47
- return MEMTX_OK;
48
+ goto exit_ok;
49
}
50
/* fall through */
51
case 0xd1c ... 0xd23: /* System Handler Priority (SHPR2, SHPR3) */
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
53
set_prio(s, hdlidx, sbank, newprio);
54
}
55
nvic_irq_update(s);
56
- return MEMTX_OK;
57
+ goto exit_ok;
58
case 0xd28 ... 0xd2b: /* Configurable Fault Status (CFSR) */
59
if (!arm_feature(&s->cpu->env, ARM_FEATURE_M_MAIN)) {
60
- return MEMTX_OK;
61
+ goto exit_ok;
62
}
63
/* All bits are W1C, so construct 32 bit value with 0s in
64
* the parts not written by the access size
65
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
66
*/
67
s->cpu->env.v7m.cfsr[M_REG_NS] &= ~(value & R_V7M_CFSR_BFSR_MASK);
68
}
69
- return MEMTX_OK;
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
}
86
87
--
88
2.20.1
89
90
diff view generated by jsdifflib
1
From: Aaron Lindsay <aclindsa@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
I previously fixed this for PMINTENSET_EL1, but missed these.
3
This is the payoff.
4
4
5
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
5
From perf record -g data of ubuntu 18 boot and shutdown:
6
Signed-off-by: Aaron Lindsay <aclindsa@gmail.com>
6
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
BEFORE:
8
Message-id: 20181010203735.27918-2-aclindsa@gmail.com
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
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
48
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
49
---
11
target/arm/helper.c | 6 ++++--
50
target/arm/helper.c | 9 ++++++---
12
1 file changed, 4 insertions(+), 2 deletions(-)
51
1 file changed, 6 insertions(+), 3 deletions(-)
13
52
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
53
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
55
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
56
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
57
@@ -XXX,XX +XXX,XX @@ void HELPER(rebuild_hflags_a64)(CPUARMState *env, int el)
19
.writefn = pmintenset_write, .raw_writefn = raw_write,
58
void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
20
.resetvalue = 0x0 },
59
target_ulong *cs_base, uint32_t *pflags)
21
{ .name = "PMINTENCLR", .cp = 15, .crn = 9, .crm = 14, .opc1 = 0, .opc2 = 2,
60
{
22
- .access = PL1_RW, .accessfn = access_tpm, .type = ARM_CP_ALIAS,
61
- uint32_t flags, pstate_for_ss;
23
+ .access = PL1_RW, .accessfn = access_tpm,
62
+ uint32_t flags = env->hflags;
24
+ .type = ARM_CP_ALIAS | ARM_CP_IO,
63
+ uint32_t pstate_for_ss;
25
.fieldoffset = offsetof(CPUARMState, cp15.c9_pminten),
64
26
.writefn = pmintenclr_write, },
65
*cs_base = 0;
27
{ .name = "PMINTENCLR_EL1", .state = ARM_CP_STATE_AA64,
66
- flags = rebuild_hflags_internal(env);
28
.opc0 = 3, .opc1 = 0, .crn = 9, .crm = 14, .opc2 = 2,
67
+#ifdef CONFIG_DEBUG_TCG
29
- .access = PL1_RW, .accessfn = access_tpm, .type = ARM_CP_ALIAS,
68
+ assert(flags == rebuild_hflags_internal(env));
30
+ .access = PL1_RW, .accessfn = access_tpm,
69
+#endif
31
+ .type = ARM_CP_ALIAS | ARM_CP_IO,
70
32
.fieldoffset = offsetof(CPUARMState, cp15.c9_pminten),
71
- if (is_a64(env)) {
33
.writefn = pmintenclr_write },
72
+ if (FIELD_EX32(flags, TBFLAG_ANY, AARCH64_STATE)) {
34
{ .name = "CCSIDR", .state = ARM_CP_STATE_BOTH,
73
*pc = env->pc;
74
if (cpu_isar_feature(aa64_bti, env_archcpu(env))) {
75
flags = FIELD_DP32(flags, TBFLAG_A64, BTYPE, env->btype);
35
--
76
--
36
2.19.0
77
2.20.1
37
78
38
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
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Add support for extended descriptors with optional 64bit
3
The Linux kernel access few S3C-specific registers [1] to set some
4
addressing and timestamping. QEMU will not yet provide
4
clock. We don't care about this part for device emulation [2]. Add
5
timestamps (always leaving the valid timestamp bit as zero).
5
a dummy device to properly ignore these accesses, so we can focus
6
on the important registers missing.
6
7
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/mmc/host/sdhci-s3c-regs.h?h=cc014f3
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
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
9
Message-id: 20181011021931.4249-6-edgar.iglesias@gmail.com
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
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
15
---
12
include/hw/net/cadence_gem.h | 2 +-
16
include/hw/sd/sdhci.h | 2 ++
13
hw/net/cadence_gem.c | 69 ++++++++++++++++++++++++++----------
17
hw/sd/sdhci.c | 65 +++++++++++++++++++++++++++++++++++++++++++
14
2 files changed, 52 insertions(+), 19 deletions(-)
18
2 files changed, 67 insertions(+)
15
19
16
diff --git a/include/hw/net/cadence_gem.h b/include/hw/net/cadence_gem.h
20
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
17
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/net/cadence_gem.h
22
--- a/include/hw/sd/sdhci.h
19
+++ b/include/hw/net/cadence_gem.h
23
+++ b/include/hw/sd/sdhci.h
20
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ typedef struct SDHCIState {
21
#define CADENCE_GEM_MAXREG (0x00000800 / 4) /* Last valid GEM address */
25
22
26
#define TYPE_IMX_USDHC "imx-usdhc"
23
/* Max number of words in a DMA descriptor. */
27
24
-#define DESC_MAX_NUM_WORDS 2
28
+#define TYPE_S3C_SDHCI "s3c-sdhci"
25
+#define DESC_MAX_NUM_WORDS 6
29
+
26
30
#endif /* SDHCI_H */
27
#define MAX_PRIORITY_QUEUES 8
31
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
28
#define MAX_TYPE1_SCREENERS 16
29
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
30
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/net/cadence_gem.c
33
--- a/hw/sd/sdhci.c
32
+++ b/hw/net/cadence_gem.c
34
+++ b/hw/sd/sdhci.c
33
@@ -XXX,XX +XXX,XX @@
35
@@ -XXX,XX +XXX,XX @@ static const TypeInfo imx_usdhc_info = {
34
#define GEM_NWCFG_BCAST_REJ 0x00000020 /* Reject broadcast packets */
36
.instance_init = imx_usdhc_init,
35
#define GEM_NWCFG_PROMISC 0x00000010 /* Accept all packets */
37
};
36
38
37
+#define GEM_DMACFG_ADDR_64B (1U << 30)
39
+/* --- qdev Samsung s3c --- */
38
+#define GEM_DMACFG_TX_BD_EXT (1U << 29)
39
+#define GEM_DMACFG_RX_BD_EXT (1U << 28)
40
#define GEM_DMACFG_RBUFSZ_M 0x00FF0000 /* DMA RX Buffer Size mask */
41
#define GEM_DMACFG_RBUFSZ_S 16 /* DMA RX Buffer Size shift */
42
#define GEM_DMACFG_RBUFSZ_MUL 64 /* DMA RX Buffer Size multiplier */
43
@@ -XXX,XX +XXX,XX @@
44
45
#define GEM_MODID_VALUE 0x00020118
46
47
-static inline unsigned tx_desc_get_buffer(uint32_t *desc)
48
+static inline uint64_t tx_desc_get_buffer(CadenceGEMState *s, uint32_t *desc)
49
{
50
- return desc[0];
51
+ uint64_t ret = desc[0];
52
+
40
+
53
+ if (s->regs[GEM_DMACFG] & GEM_DMACFG_ADDR_64B) {
41
+#define S3C_SDHCI_CONTROL2 0x80
54
+ ret |= (uint64_t)desc[2] << 32;
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;
55
+ }
59
+ }
56
+ return ret;
57
}
58
59
static inline unsigned tx_desc_get_used(uint32_t *desc)
60
@@ -XXX,XX +XXX,XX @@ static inline void print_gem_tx_desc(uint32_t *desc, uint8_t queue)
61
DB_PRINT("length: %d\n", tx_desc_get_length(desc));
62
}
63
64
-static inline unsigned rx_desc_get_buffer(uint32_t *desc)
65
+static inline uint64_t rx_desc_get_buffer(CadenceGEMState *s, uint32_t *desc)
66
{
67
- return desc[0] & ~0x3UL;
68
+ uint64_t ret = desc[0] & ~0x3UL;
69
+
60
+
70
+ if (s->regs[GEM_DMACFG] & GEM_DMACFG_ADDR_64B) {
71
+ ret |= (uint64_t)desc[2] << 32;
72
+ }
73
+ return ret;
61
+ return ret;
74
+}
62
+}
75
+
63
+
76
+static inline int gem_get_desc_len(CadenceGEMState *s, bool rx_n_tx)
64
+static void sdhci_s3c_write(void *opaque, hwaddr offset, uint64_t val,
65
+ unsigned size)
77
+{
66
+{
78
+ int ret = 2;
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
+}
79
+
78
+
80
+ if (s->regs[GEM_DMACFG] & GEM_DMACFG_ADDR_64B) {
79
+static const MemoryRegionOps sdhci_s3c_mmio_ops = {
81
+ ret += 2;
80
+ .read = sdhci_s3c_read,
82
+ }
81
+ .write = sdhci_s3c_write,
83
+ if (s->regs[GEM_DMACFG] & (rx_n_tx ? GEM_DMACFG_RX_BD_EXT
82
+ .valid = {
84
+ : GEM_DMACFG_TX_BD_EXT)) {
83
+ .min_access_size = 1,
85
+ ret += 2;
84
+ .max_access_size = 4,
86
+ }
85
+ .unaligned = false
86
+ },
87
+ .endianness = DEVICE_LITTLE_ENDIAN,
88
+};
87
+
89
+
88
+ assert(ret <= DESC_MAX_NUM_WORDS);
90
+static void sdhci_s3c_init(Object *obj)
89
+ return ret;
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);
90
}
109
}
91
110
92
static inline unsigned rx_desc_get_wrap(uint32_t *desc)
111
type_init(sdhci_register_types)
93
@@ -XXX,XX +XXX,XX @@ static void gem_init_register_masks(CadenceGEMState *s)
94
memset(&s->regs_ro[0], 0, sizeof(s->regs_ro));
95
s->regs_ro[GEM_NWCTRL] = 0xFFF80000;
96
s->regs_ro[GEM_NWSTATUS] = 0xFFFFFFFF;
97
- s->regs_ro[GEM_DMACFG] = 0xFE00F000;
98
+ s->regs_ro[GEM_DMACFG] = 0x8E00F000;
99
s->regs_ro[GEM_TXSTATUS] = 0xFFFFFE08;
100
s->regs_ro[GEM_RXQBASE] = 0x00000003;
101
s->regs_ro[GEM_TXQBASE] = 0x00000003;
102
@@ -XXX,XX +XXX,XX @@ static void gem_get_rx_desc(CadenceGEMState *s, int q)
103
DB_PRINT("read descriptor 0x%x\n", (unsigned)s->rx_desc_addr[q]);
104
/* read current descriptor */
105
cpu_physical_memory_read(s->rx_desc_addr[q],
106
- (uint8_t *)s->rx_desc[q], sizeof(s->rx_desc[q]));
107
+ (uint8_t *)s->rx_desc[q],
108
+ sizeof(uint32_t) * gem_get_desc_len(s, true));
109
110
/* Descriptor owned by software ? */
111
if (rx_desc_get_ownership(s->rx_desc[q]) == 1) {
112
@@ -XXX,XX +XXX,XX @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
113
rx_desc_get_buffer(s->rx_desc[q]));
114
115
/* Copy packet data to emulated DMA buffer */
116
- cpu_physical_memory_write(rx_desc_get_buffer(s->rx_desc[q]) +
117
- rxbuf_offset,
118
- rxbuf_ptr, MIN(bytes_to_copy, rxbufsize));
119
+ cpu_physical_memory_write(rx_desc_get_buffer(s, s->rx_desc[q]) +
120
+ rxbuf_offset,
121
+ rxbuf_ptr,
122
+ MIN(bytes_to_copy, rxbufsize));
123
rxbuf_ptr += MIN(bytes_to_copy, rxbufsize);
124
bytes_to_copy -= MIN(bytes_to_copy, rxbufsize);
125
126
@@ -XXX,XX +XXX,XX @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
127
/* Descriptor write-back. */
128
cpu_physical_memory_write(s->rx_desc_addr[q],
129
(uint8_t *)s->rx_desc[q],
130
- sizeof(s->rx_desc[q]));
131
+ sizeof(uint32_t) * gem_get_desc_len(s, true));
132
133
/* Next descriptor */
134
if (rx_desc_get_wrap(s->rx_desc[q])) {
135
@@ -XXX,XX +XXX,XX @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
136
s->rx_desc_addr[q] = s->regs[GEM_RXQBASE];
137
} else {
138
DB_PRINT("incrementing RX descriptor list\n");
139
- s->rx_desc_addr[q] += 8;
140
+ s->rx_desc_addr[q] += 4 * gem_get_desc_len(s, true);
141
}
142
143
gem_get_rx_desc(s, q);
144
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
145
146
DB_PRINT("read descriptor 0x%" HWADDR_PRIx "\n", packet_desc_addr);
147
cpu_physical_memory_read(packet_desc_addr,
148
- (uint8_t *)desc, sizeof(desc));
149
+ (uint8_t *)desc,
150
+ sizeof(uint32_t) * gem_get_desc_len(s, false));
151
/* Handle all descriptors owned by hardware */
152
while (tx_desc_get_used(desc) == 0) {
153
154
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
155
/* The real hardware would eat this (and possibly crash).
156
* For QEMU let's lend a helping hand.
157
*/
158
- if ((tx_desc_get_buffer(desc) == 0) ||
159
+ if ((tx_desc_get_buffer(s, desc) == 0) ||
160
(tx_desc_get_length(desc) == 0)) {
161
DB_PRINT("Invalid TX descriptor @ 0x%x\n",
162
(unsigned)packet_desc_addr);
163
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
164
/* Gather this fragment of the packet from "dma memory" to our
165
* contig buffer.
166
*/
167
- cpu_physical_memory_read(tx_desc_get_buffer(desc), p,
168
+ cpu_physical_memory_read(tx_desc_get_buffer(s, desc), p,
169
tx_desc_get_length(desc));
170
p += tx_desc_get_length(desc);
171
total_bytes += tx_desc_get_length(desc);
172
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
173
if (tx_desc_get_wrap(desc)) {
174
s->tx_desc_addr[q] = s->regs[GEM_TXQBASE];
175
} else {
176
- s->tx_desc_addr[q] = packet_desc_addr + 8;
177
+ s->tx_desc_addr[q] = packet_desc_addr +
178
+ 4 * gem_get_desc_len(s, false);
179
}
180
DB_PRINT("TX descriptor next: 0x%08x\n", s->tx_desc_addr[q]);
181
182
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
183
tx_desc_set_last(desc);
184
packet_desc_addr = s->regs[GEM_TXQBASE];
185
} else {
186
- packet_desc_addr += 8;
187
+ packet_desc_addr += 4 * gem_get_desc_len(s, false);
188
}
189
DB_PRINT("read descriptor 0x%" HWADDR_PRIx "\n", packet_desc_addr);
190
- cpu_physical_memory_read(packet_desc_addr,
191
- (uint8_t *)desc, sizeof(desc));
192
+ cpu_physical_memory_read(packet_desc_addr, (uint8_t *)desc,
193
+ sizeof(uint32_t) * gem_get_desc_len(s, false));
194
}
195
196
if (tx_desc_get_used(desc)) {
197
--
112
--
198
2.19.0
113
2.20.1
199
114
200
115
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Disable the Timestamping Unit feature bit since QEMU does not
3
The Exynos SoC has specific SDHCI registers. Use the s3c SDHCI
4
yet support it. This allows guest SW to correctly probe for
4
model which handle these specific registers.
5
its existance.
6
5
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
This silents the following "SDHC ... not implemented" warnings so
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
we can focus on the important registers missing:
9
Message-id: 20181011021931.4249-2-edgar.iglesias@gmail.com
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
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
30
---
12
hw/net/cadence_gem.c | 2 +-
31
hw/arm/exynos4210.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
32
1 file changed, 1 insertion(+), 1 deletion(-)
14
33
15
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
34
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
16
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/net/cadence_gem.c
36
--- a/hw/arm/exynos4210.c
18
+++ b/hw/net/cadence_gem.c
37
+++ b/hw/arm/exynos4210.c
19
@@ -XXX,XX +XXX,XX @@ static void gem_reset(DeviceState *d)
38
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
20
s->regs[GEM_MODID] = s->revision;
39
* public datasheet which is very similar (implementing
21
s->regs[GEM_DESCONF] = 0x02500111;
40
* MMC Specification Version 4.0 being the only difference noted)
22
s->regs[GEM_DESCONF2] = 0x2ab13fff;
41
*/
23
- s->regs[GEM_DESCONF5] = 0x002f2145;
42
- dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
24
+ s->regs[GEM_DESCONF5] = 0x002f2045;
43
+ dev = qdev_create(NULL, TYPE_S3C_SDHCI);
25
s->regs[GEM_DESCONF6] = 0x00000200;
44
qdev_prop_set_uint64(dev, "capareg", EXYNOS4210_SDHCI_CAPABILITIES);
26
45
qdev_init_nofail(dev);
27
/* Set MAC address */
46
28
--
47
--
29
2.19.0
48
2.20.1
30
49
31
50
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
Announce 64bit addressing support.
3
IEC binary prefixes ease code review: the unit is explicit.
4
4
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Message-id: 20191021190653.9511-2-philmd@redhat.com
7
Message-id: 20181011021931.4249-9-edgar.iglesias@gmail.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
hw/net/cadence_gem.c | 3 ++-
11
hw/arm/xilinx_zynq.c | 3 ++-
11
1 file changed, 2 insertions(+), 1 deletion(-)
12
1 file changed, 2 insertions(+), 1 deletion(-)
12
13
13
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
14
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/net/cadence_gem.c
16
--- a/hw/arm/xilinx_zynq.c
16
+++ b/hw/net/cadence_gem.c
17
+++ b/hw/arm/xilinx_zynq.c
17
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
18
#define GEM_DESCONF4 (0x0000028C/4)
19
*/
19
#define GEM_DESCONF5 (0x00000290/4)
20
20
#define GEM_DESCONF6 (0x00000294/4)
21
#include "qemu/osdep.h"
21
+#define GEM_DESCONF6_64B_MASK (1U << 23)
22
+#include "qemu/units.h"
22
#define GEM_DESCONF7 (0x00000298/4)
23
#include "qapi/error.h"
23
24
#include "cpu.h"
24
#define GEM_INT_Q1_STATUS (0x00000400 / 4)
25
#include "hw/sysbus.h"
25
@@ -XXX,XX +XXX,XX @@ static void gem_reset(DeviceState *d)
26
@@ -XXX,XX +XXX,XX @@ static void zynq_init(MachineState *machine)
26
s->regs[GEM_DESCONF] = 0x02500111;
27
memory_region_add_subregion(address_space_mem, 0, ext_ram);
27
s->regs[GEM_DESCONF2] = 0x2ab13fff;
28
28
s->regs[GEM_DESCONF5] = 0x002f2045;
29
/* 256K of on-chip memory */
29
- s->regs[GEM_DESCONF6] = 0x0;
30
- memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 << 10,
30
+ s->regs[GEM_DESCONF6] = GEM_DESCONF6_64B_MASK;
31
+ memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB,
31
32
&error_fatal);
32
queues_mask = MAKE_64BIT_MASK(1, s->num_priority_queues - 1);
33
memory_region_add_subregion(address_space_mem, 0xFFFC0000, ocm_ram);
33
s->regs[GEM_DESCONF6] |= queues_mask;
34
34
--
35
--
35
2.19.0
36
2.20.1
36
37
37
38
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
IEC binary prefixes ease code review: the unit is explicit.
4
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
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>
10
---
11
hw/arm/mps2-tz.c | 3 ++-
12
hw/arm/mps2.c | 3 ++-
13
2 files changed, 4 insertions(+), 2 deletions(-)
14
15
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/mps2-tz.c
18
+++ b/hw/arm/mps2-tz.c
19
@@ -XXX,XX +XXX,XX @@
20
*/
21
22
#include "qemu/osdep.h"
23
+#include "qemu/units.h"
24
#include "qapi/error.h"
25
#include "qemu/error-report.h"
26
#include "hw/arm/boot.h"
27
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
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) {
57
--
58
2.20.1
59
60
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
The SDRAM is incorrectly created in the SA1110 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-4-philmd@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/arm/strongarm.h | 4 +---
14
hw/arm/collie.c | 8 ++++++--
15
hw/arm/strongarm.c | 7 +------
16
3 files changed, 8 insertions(+), 11 deletions(-)
17
18
diff --git a/hw/arm/strongarm.h b/hw/arm/strongarm.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/strongarm.h
21
+++ b/hw/arm/strongarm.h
22
@@ -XXX,XX +XXX,XX @@ enum {
23
24
typedef struct {
25
ARMCPU *cpu;
26
- MemoryRegion sdram;
27
DeviceState *pic;
28
DeviceState *gpio;
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),
84
--
85
2.20.1
86
87
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
Add macro with max number of DMA descriptor words.
3
The SDRAM is incorrectly created in the OMAP2420 SoC.
4
No functional change.
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
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Message-id: 20191021190653.9511-5-philmd@redhat.com
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Message-id: 20181011021931.4249-5-edgar.iglesias@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
---
12
include/hw/net/cadence_gem.h | 5 ++++-
13
include/hw/arm/omap.h | 4 +---
13
hw/net/cadence_gem.c | 4 ++--
14
hw/arm/nseries.c | 10 +++++++---
14
2 files changed, 6 insertions(+), 3 deletions(-)
15
hw/arm/omap2.c | 13 +++++--------
16
3 files changed, 13 insertions(+), 14 deletions(-)
15
17
16
diff --git a/include/hw/net/cadence_gem.h b/include/hw/net/cadence_gem.h
18
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
17
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/net/cadence_gem.h
20
--- a/include/hw/arm/omap.h
19
+++ b/include/hw/net/cadence_gem.h
21
+++ b/include/hw/arm/omap.h
22
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s {
23
MemoryRegion tap_iomem;
24
MemoryRegion imif_ram;
25
MemoryRegion emiff_ram;
26
- MemoryRegion sdram;
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
20
@@ -XXX,XX +XXX,XX @@
44
@@ -XXX,XX +XXX,XX @@
21
45
22
#define CADENCE_GEM_MAXREG (0x00000800 / 4) /* Last valid GEM address */
46
/* Nokia N8x0 support */
23
47
struct n800_s {
24
+/* Max number of words in a DMA descriptor. */
48
+ MemoryRegion sdram;
25
+#define DESC_MAX_NUM_WORDS 2
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);
26
+
65
+
27
#define MAX_PRIORITY_QUEUES 8
66
+ s->mpu = omap2420_mpu_init(&s->sdram, machine->cpu_type);
28
#define MAX_TYPE1_SCREENERS 16
67
29
#define MAX_TYPE2_SCREENERS 16
68
/* Setup peripherals
30
@@ -XXX,XX +XXX,XX @@ typedef struct CadenceGEMState {
69
*
31
70
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
32
uint8_t can_rx_state; /* Debug only */
33
34
- uint32_t rx_desc[MAX_PRIORITY_QUEUES][2];
35
+ uint32_t rx_desc[MAX_PRIORITY_QUEUES][DESC_MAX_NUM_WORDS];
36
37
bool sar_active[4];
38
} CadenceGEMState;
39
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
40
index XXXXXXX..XXXXXXX 100644
71
index XXXXXXX..XXXXXXX 100644
41
--- a/hw/net/cadence_gem.c
72
--- a/hw/arm/omap2.c
42
+++ b/hw/net/cadence_gem.c
73
+++ b/hw/arm/omap2.c
43
@@ -XXX,XX +XXX,XX @@ static void gem_transmit_updatestats(CadenceGEMState *s, const uint8_t *packet,
74
@@ -XXX,XX +XXX,XX @@
44
*/
75
#include "qemu/error-report.h"
45
static void gem_transmit(CadenceGEMState *s)
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)
46
{
90
{
47
- uint32_t desc[2];
91
struct omap_mpu_state_s *s = g_new0(struct omap_mpu_state_s, 1);
48
+ uint32_t desc[DESC_MAX_NUM_WORDS];
92
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
49
hwaddr packet_desc_addr;
93
int i;
50
uint8_t tx_packet[2048];
94
SysBusDevice *busdev;
51
uint8_t *p;
95
struct omap_target_agent_s *ta;
52
@@ -XXX,XX +XXX,XX @@ static void gem_transmit(CadenceGEMState *s)
96
+ MemoryRegion *sysmem = get_system_memory();
53
97
54
/* Last descriptor for this packet; hand the whole thing off */
98
/* Core */
55
if (tx_desc_get_last(desc)) {
99
s->mpu_model = omap2420;
56
- uint32_t desc_first[2];
100
s->cpu = ARM_CPU(cpu_create(cpu_type));
57
+ uint32_t desc_first[DESC_MAX_NUM_WORDS];
101
- s->sdram_size = sdram_size;
58
102
s->sram_size = OMAP242X_SRAM_SIZE;
59
/* Modify the 1st descriptor of this packet to be owned by
103
60
* the processor.
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);
125
61
--
126
--
62
2.19.0
127
2.20.1
63
128
64
129
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
Announce the availability of the various priority queues.
3
The SDRAM is incorrectly created in the OMAP310 SoC.
4
This fixes an issue where guest kernels would miss to
4
Move its creation in the board code, this will later allow the
5
configure secondary queues due to inproper feature bits.
5
board to have the QOM ownership of the RAM.
6
6
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
10
Message-id: 20191021190653.9511-6-philmd@redhat.com
9
Message-id: 20181011021931.4249-3-edgar.iglesias@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
---
12
hw/net/cadence_gem.c | 6 +++++-
13
include/hw/arm/omap.h | 6 ++----
13
1 file changed, 5 insertions(+), 1 deletion(-)
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(-)
14
18
15
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
19
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
16
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/net/cadence_gem.c
21
--- a/include/hw/arm/omap.h
18
+++ b/hw/net/cadence_gem.c
22
+++ b/include/hw/arm/omap.h
19
@@ -XXX,XX +XXX,XX @@ static void gem_reset(DeviceState *d)
23
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s {
24
MemoryRegion mpui_io_iomem;
25
MemoryRegion tap_iomem;
26
MemoryRegion imif_ram;
27
- MemoryRegion emiff_ram;
28
MemoryRegion sram;
29
30
struct omap_dma_port_if_s {
31
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s {
32
hwaddr addr);
33
} port[__omap_dma_port_last];
34
35
- unsigned long sdram_size;
36
+ uint64_t sdram_size;
37
unsigned long sram_size;
38
39
/* MPUI-TIPB peripherals */
40
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s {
41
};
42
43
/* omap1.c */
44
-struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
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
{
20
int i;
71
int i;
21
CadenceGEMState *s = CADENCE_GEM(d);
72
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
22
const uint8_t *a;
73
qemu_irq dma_irqs[6];
23
+ uint32_t queues_mask;
74
DriveInfo *dinfo;
24
75
SysBusDevice *busdev;
25
DB_PRINT("\n");
76
+ MemoryRegion *system_memory = get_system_memory();
26
77
27
@@ -XXX,XX +XXX,XX @@ static void gem_reset(DeviceState *d)
78
/* Core */
28
s->regs[GEM_DESCONF] = 0x02500111;
79
s->mpu_model = omap310;
29
s->regs[GEM_DESCONF2] = 0x2ab13fff;
80
s->cpu = ARM_CPU(cpu_create(cpu_type));
30
s->regs[GEM_DESCONF5] = 0x002f2045;
81
- s->sdram_size = sdram_size;
31
- s->regs[GEM_DESCONF6] = 0x00000200;
82
+ s->sdram_size = memory_region_size(dram);
32
+ s->regs[GEM_DESCONF6] = 0x0;
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);
33
+
126
+
34
+ queues_mask = MAKE_64BIT_MASK(1, s->num_priority_queues - 1);
127
+ mpu = omap310_mpu_init(dram, machine->cpu_type);
35
+ s->regs[GEM_DESCONF6] |= queues_mask;
128
36
129
/* External Flash (EMIFS) */
37
/* Set MAC address */
130
memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size,
38
a = &s->conf.macaddr.a[0];
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,
39
--
158
--
40
2.19.0
159
2.20.1
41
160
42
161
diff view generated by jsdifflib
1
From: Jerome Forissier <jerome.forissier@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
Bindings for /secure-chosen and /secure-chosen/stdout-path have been
3
Having the RAM creation code in a separate function is not
4
proposed 1.5 years ago [1] and implemented in OP-TEE at the same time [2].
4
very helpful. Move this code directly inside the board_init()
5
They've now been officially agreed on, so we can implement them
5
function, this will later allow the board to have the QOM
6
in QEMU.
6
ownership of the RAM.
7
7
8
This patch creates the property when the machine is secure.
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
[1] https://patchwork.kernel.org/patch/9602401/
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
[2] https://github.com/OP-TEE/optee_os/commit/4dc31c52544a
11
Message-id: 20191021190653.9511-7-philmd@redhat.com
12
13
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
14
Message-id: 20181005080729.6480-1-jerome.forissier@linaro.org
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
[PMM: commit message tweak]
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
13
---
19
hw/arm/virt.c | 4 ++++
14
hw/arm/digic_boards.c | 9 ++-------
20
1 file changed, 4 insertions(+)
15
1 file changed, 2 insertions(+), 7 deletions(-)
21
16
22
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
17
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
23
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/arm/virt.c
19
--- a/hw/arm/digic_boards.c
25
+++ b/hw/arm/virt.c
20
+++ b/hw/arm/digic_boards.c
26
@@ -XXX,XX +XXX,XX @@ static void create_uart(const VirtMachineState *vms, qemu_irq *pic, int uart,
21
@@ -XXX,XX +XXX,XX @@ typedef struct DigicBoard {
27
/* Mark as not usable by the normal world */
22
const char *rom1_def_filename;
28
qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled");
23
} DigicBoard;
29
qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay");
24
30
+
25
-static void digic4_board_setup_ram(DigicBoardState *s, hwaddr ram_size)
31
+ qemu_fdt_add_subnode(vms->fdt, "/secure-chosen");
26
-{
32
+ qemu_fdt_setprop_string(vms->fdt, "/secure-chosen", "stdout-path",
27
- memory_region_allocate_system_memory(&s->ram, NULL, "ram", ram_size);
33
+ nodename);
28
- memory_region_add_subregion(get_system_memory(), 0, &s->ram);
29
-}
30
-
31
static void digic4_board_init(DigicBoard *board)
32
{
33
Error *err = NULL;
34
@@ -XXX,XX +XXX,XX @@ static void digic4_board_init(DigicBoard *board)
35
exit(1);
34
}
36
}
35
37
36
g_free(nodename);
38
- digic4_board_setup_ram(s, board->ram_size);
39
+ memory_region_allocate_system_memory(&s->ram, NULL, "ram", board->ram_size);
40
+ memory_region_add_subregion(get_system_memory(), 0, &s->ram);
41
42
if (board->add_rom0) {
43
board->add_rom0(s, DIGIC4_ROM0_BASE, board->rom0_def_filename);
37
--
44
--
38
2.19.0
45
2.20.1
39
46
40
47
diff view generated by jsdifflib