1
Nothing very exciting this time around...
1
Patches for rc1: nothing major, just some minor bugfixes and
2
code cleanups.
2
3
3
-- PMM
4
-- PMM
4
5
5
The following changes since commit 37a712a0f969ca2df7f01182409a6c4825cebfb5:
6
The following changes since commit f7e1914adad8885a5d4c70239ab90d901ed97e9f:
6
7
7
Merge remote-tracking branch 'remotes/bonzini-gitlab/tags/for-upstream' into staging (2020-10-01 12:23:19 +0100)
8
Merge remote-tracking branch 'remotes/alistair/tags/pull-riscv-to-apply-20201109' into staging (2020-11-10 09:24:56 +0000)
8
9
9
are available in the Git repository at:
10
are available in the Git repository at:
10
11
11
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201001
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201110
12
13
13
for you to fetch changes up to cdfaa57dcb53ba012439765a1462247dfda8595d:
14
for you to fetch changes up to b6c56c8a9a4064ea783f352f43c5df6231a110fa:
14
15
15
hw/arm/raspi: Remove use of the 'version' value in the board code (2020-10-01 15:31:01 +0100)
16
target/arm/translate-neon.c: Handle VTBL UNDEF case before VFP access check (2020-11-10 11:03:48 +0000)
16
17
17
----------------------------------------------------------------
18
----------------------------------------------------------------
18
target-arm queue:
19
target-arm queue:
19
* Make isar_feature_aa32_fp16_arith() handle M-profile
20
* hw/arm/Kconfig: ARM_V7M depends on PTIMER
20
* Fix SVE splice
21
* Minor coding style fixes
21
* Fix SVE LDR/STR
22
* docs: add some notes on the sbsa-ref machine
22
* Remove ignore_memory_transaction_failures on the raspi2
23
* hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals
23
* raspi: Various cleanup/refactoring
24
* target/arm: Fix neon VTBL/VTBX for len > 1
25
* hw/arm/armsse: Correct expansion MPC interrupt lines
26
* hw/misc/stm32f2xx_syscfg: Remove extraneous IRQ
27
* hw/arm/nseries: Remove invalid/unnecessary n8x0_uart_setup()
28
* hw/arm/musicpal: Don't connect two qemu_irqs directly to the same input
29
* hw/arm/musicpal: Only use qdev_get_gpio_in() when necessary
30
* hw/arm/nseries: Check return value from load_image_targphys()
31
* tests/qtest/npcm7xx_rng-test: count runs properly
32
* target/arm/translate-neon.c: Handle VTBL UNDEF case before VFP access check
24
33
25
----------------------------------------------------------------
34
----------------------------------------------------------------
26
Peter Maydell (5):
35
Alex Bennée (1):
27
target/arm: Replace ARM_FEATURE_PXN with ID_MMFR0.VMSA check
36
docs: add some notes on the sbsa-ref machine
28
target/arm: Move id_pfr0, id_pfr1 into ARMISARegisters
29
hw/intc/armv7m_nvic: Only show ID register values for Main Extension CPUs
30
target/arm: Add ID register values for Cortex-M0
31
target/arm: Make isar_feature_aa32_fp16_arith() handle M-profile
32
37
33
Philippe Mathieu-Daudé (11):
38
AlexChen (1):
34
hw/arm/raspi: Define various blocks base addresses
39
ssi: Fix bad printf format specifiers
35
hw/arm/bcm2835: Add more unimplemented peripherals
36
hw/arm/raspi: Remove ignore_memory_transaction_failures on the raspi2
37
hw/arm/raspi: Display the board revision in the machine description
38
hw/arm/raspi: Load the firmware on the first core
39
hw/arm/raspi: Move arm_boot_info structure to RaspiMachineState
40
hw/arm/raspi: Avoid using TypeInfo::class_data pointer
41
hw/arm/raspi: Use more specific machine names
42
hw/arm/raspi: Introduce RaspiProcessorId enum
43
hw/arm/raspi: Use RaspiProcessorId to set the firmware load address
44
hw/arm/raspi: Remove use of the 'version' value in the board code
45
40
46
Richard Henderson (2):
41
Andrew Jones (1):
47
target/arm: Fix sve ldr/str
42
hw/arm/Kconfig: ARM_V7M depends on PTIMER
48
target/arm: Fix SVE splice
49
43
50
include/hw/arm/bcm2835_peripherals.h | 2 +
44
Havard Skinnemoen (1):
51
include/hw/arm/raspi_platform.h | 51 ++++++++++--
45
tests/qtest/npcm7xx_rng-test: count runs properly
52
target/arm/cpu.h | 50 +++++++++--
53
hw/arm/bcm2835_peripherals.c | 2 +
54
hw/arm/raspi.c | 155 +++++++++++++++++++----------------
55
hw/intc/armv7m_nvic.c | 46 ++++++++++-
56
target/arm/cpu.c | 21 +++--
57
target/arm/cpu64.c | 12 +--
58
target/arm/cpu_tcg.c | 60 ++++++++++----
59
target/arm/helper.c | 9 +-
60
target/arm/kvm64.c | 4 +
61
target/arm/translate-sve.c | 6 +-
62
12 files changed, 286 insertions(+), 132 deletions(-)
63
46
47
Peter Maydell (2):
48
hw/arm/nseries: Check return value from load_image_targphys()
49
target/arm/translate-neon.c: Handle VTBL UNDEF case before VFP access check
50
51
Philippe Mathieu-Daudé (6):
52
hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals
53
hw/arm/armsse: Correct expansion MPC interrupt lines
54
hw/misc/stm32f2xx_syscfg: Remove extraneous IRQ
55
hw/arm/nseries: Remove invalid/unnecessary n8x0_uart_setup()
56
hw/arm/musicpal: Don't connect two qemu_irqs directly to the same input
57
hw/arm/musicpal: Only use qdev_get_gpio_in() when necessary
58
59
Richard Henderson (1):
60
target/arm: Fix neon VTBL/VTBX for len > 1
61
62
Xinhao Zhang (3):
63
target/arm: add spaces around operator
64
target/arm: Don't use '#' flag of printf format
65
target/arm: add space before the open parenthesis '('
66
67
docs/system/arm/sbsa.rst | 32 ++++++++++++++++++++++
68
docs/system/target-arm.rst | 1 +
69
include/hw/misc/stm32f2xx_syscfg.h | 2 --
70
target/arm/helper.h | 2 +-
71
hw/arm/armsse.c | 3 +-
72
hw/arm/musicpal.c | 40 +++++++++++++++++----------
73
hw/arm/nseries.c | 26 ++++++++----------
74
hw/arm/stm32f205_soc.c | 1 -
75
hw/misc/stm32f2xx_syscfg.c | 2 --
76
hw/ssi/imx_spi.c | 2 +-
77
hw/ssi/xilinx_spi.c | 2 +-
78
target/arm/arch_dump.c | 8 +++---
79
target/arm/arm-semi.c | 8 +++---
80
target/arm/helper.c | 2 +-
81
target/arm/op_helper.c | 23 +++++++++-------
82
target/arm/translate-a64.c | 4 +--
83
target/arm/translate.c | 2 +-
84
tests/qtest/npcm7xx_rng-test.c | 2 +-
85
hw/arm/Kconfig | 3 +-
86
target/arm/translate-neon.c.inc | 56 ++++++++++++++------------------------
87
20 files changed, 123 insertions(+), 98 deletions(-)
88
create mode 100644 docs/system/arm/sbsa.rst
89
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
The firmware load address depends on the SoC ("processor id") used,
3
commit 32bd322a0134 ("hw/timer/armv7m_systick: Rewrite to use ptimers")
4
not on the version of the board.
4
changed armv7m_systick to build on ptimers. Make sure we have ptimers
5
in the build when building armv7m_systick.
5
6
6
Suggested-by: Luc Michel <luc.michel@greensocs.com>
7
Signed-off-by: Andrew Jones <drjones@redhat.com>
7
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20201104103343.30392-1-drjones@redhat.com
9
Message-id: 20200924111808.77168-8-f4bug@amsat.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
11
---
12
hw/arm/raspi.c | 3 ++-
12
hw/arm/Kconfig | 1 +
13
1 file changed, 2 insertions(+), 1 deletion(-)
13
1 file changed, 1 insertion(+)
14
14
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/raspi.c
17
--- a/hw/arm/Kconfig
18
+++ b/hw/arm/raspi.c
18
+++ b/hw/arm/Kconfig
19
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
19
@@ -XXX,XX +XXX,XX @@ config ZYNQ
20
* the normal Linux boot process
20
21
*/
21
config ARM_V7M
22
if (machine->firmware) {
22
bool
23
- hwaddr firmware_addr = version == 3 ? FIRMWARE_ADDR_3 : FIRMWARE_ADDR_2;
23
+ select PTIMER
24
+ hwaddr firmware_addr = processor_id <= PROCESSOR_ID_BCM2836
24
25
+ ? FIRMWARE_ADDR_2 : FIRMWARE_ADDR_3;
25
config ALLWINNER_A10
26
/* load the firmware image (typically kernel.img) */
26
bool
27
r = load_image_targphys(machine->firmware, firmware_addr,
28
ram_size - firmware_addr);
29
--
27
--
30
2.20.1
28
2.20.1
31
29
32
30
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: AlexChen <alex.chen@huawei.com>
2
2
3
As we only support a reduced set of the REV_CODE_PROCESSOR id
3
We should use printf format specifier "%u" instead of "%d" for
4
encoded in the board revision, define the PROCESSOR_ID values
4
argument of type "unsigned int".
5
as an enum. We can simplify the board_soc_type and cores_count
6
methods.
7
5
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
6
Reported-by: Euler Robot <euler.robot@huawei.com>
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Alex Chen <alex.chen@huawei.com>
10
Message-id: 20200924111808.77168-7-f4bug@amsat.org
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 5FA280F5.8060902@huawei.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
11
---
13
hw/arm/raspi.c | 45 +++++++++++++++++++++------------------------
12
hw/ssi/imx_spi.c | 2 +-
14
1 file changed, 21 insertions(+), 24 deletions(-)
13
hw/ssi/xilinx_spi.c | 2 +-
14
2 files changed, 2 insertions(+), 2 deletions(-)
15
15
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
16
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
18
--- a/hw/ssi/imx_spi.c
19
+++ b/hw/arm/raspi.c
19
+++ b/hw/ssi/imx_spi.c
20
@@ -XXX,XX +XXX,XX @@ FIELD(REV_CODE, MANUFACTURER, 16, 4);
20
@@ -XXX,XX +XXX,XX @@ static const char *imx_spi_reg_name(uint32_t reg)
21
FIELD(REV_CODE, MEMORY_SIZE, 20, 3);
21
case ECSPI_MSGDATA:
22
FIELD(REV_CODE, STYLE, 23, 1);
22
return "ECSPI_MSGDATA";
23
23
default:
24
+typedef enum RaspiProcessorId {
24
- sprintf(unknown, "%d ?", reg);
25
+ PROCESSOR_ID_BCM2836 = 1,
25
+ sprintf(unknown, "%u ?", reg);
26
+ PROCESSOR_ID_BCM2837 = 2,
26
return unknown;
27
+} RaspiProcessorId;
27
}
28
+
29
+static const struct {
30
+ const char *type;
31
+ int cores_count;
32
+} soc_property[] = {
33
+ [PROCESSOR_ID_BCM2836] = {TYPE_BCM2836, BCM283X_NCPUS},
34
+ [PROCESSOR_ID_BCM2837] = {TYPE_BCM2837, BCM283X_NCPUS},
35
+};
36
+
37
static uint64_t board_ram_size(uint32_t board_rev)
38
{
39
assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
40
return 256 * MiB << FIELD_EX32(board_rev, REV_CODE, MEMORY_SIZE);
41
}
28
}
42
29
diff --git a/hw/ssi/xilinx_spi.c b/hw/ssi/xilinx_spi.c
43
-static int board_processor_id(uint32_t board_rev)
30
index XXXXXXX..XXXXXXX 100644
44
+static RaspiProcessorId board_processor_id(uint32_t board_rev)
31
--- a/hw/ssi/xilinx_spi.c
45
{
32
+++ b/hw/ssi/xilinx_spi.c
46
+ int proc_id = FIELD_EX32(board_rev, REV_CODE, PROCESSOR);
33
@@ -XXX,XX +XXX,XX @@ static void xlx_spi_update_irq(XilinxSPI *s)
47
+
34
irq chain unless things really changed. */
48
assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
35
if (pending != s->irqline) {
49
- return FIELD_EX32(board_rev, REV_CODE, PROCESSOR);
36
s->irqline = pending;
50
+ assert(proc_id < ARRAY_SIZE(soc_property) && soc_property[proc_id].type);
37
- DB_PRINT("irq_change of state %d ISR:%x IER:%X\n",
51
+
38
+ DB_PRINT("irq_change of state %u ISR:%x IER:%X\n",
52
+ return proc_id;
39
pending, s->regs[R_IPISR], s->regs[R_IPIER]);
53
}
40
qemu_set_irq(s->irq, pending);
54
41
}
55
static int board_version(uint32_t board_rev)
56
@@ -XXX,XX +XXX,XX @@ static int board_version(uint32_t board_rev)
57
58
static const char *board_soc_type(uint32_t board_rev)
59
{
60
- static const char *soc_types[] = {
61
- NULL, TYPE_BCM2836, TYPE_BCM2837,
62
- };
63
- int proc_id = board_processor_id(board_rev);
64
-
65
- if (proc_id >= ARRAY_SIZE(soc_types) || !soc_types[proc_id]) {
66
- error_report("Unsupported processor id '%d' (board revision: 0x%x)",
67
- proc_id, board_rev);
68
- exit(1);
69
- }
70
- return soc_types[proc_id];
71
+ return soc_property[board_processor_id(board_rev)].type;
72
}
73
74
static int cores_count(uint32_t board_rev)
75
{
76
- static const int soc_cores_count[] = {
77
- 0, BCM283X_NCPUS, BCM283X_NCPUS,
78
- };
79
- int proc_id = board_processor_id(board_rev);
80
-
81
- if (proc_id >= ARRAY_SIZE(soc_cores_count) || !soc_cores_count[proc_id]) {
82
- error_report("Unsupported processor id '%d' (board revision: 0x%x)",
83
- proc_id, board_rev);
84
- exit(1);
85
- }
86
- return soc_cores_count[proc_id];
87
+ return soc_property[board_processor_id(board_rev)].cores_count;
88
}
89
90
static const char *board_type(uint32_t board_rev)
91
--
42
--
92
2.20.1
43
2.20.1
93
44
94
45
diff view generated by jsdifflib
1
The ARM_FEATURE_PXN bit indicates whether the CPU supports the PXN
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
2
bit in short-descriptor translation table format descriptors. This
3
is indicated by ID_MMFR0.VMSA being at least 0b0100. Replace the
4
feature bit with an ID register check, in line with our preference
5
for ID register checks over feature bits.
6
2
3
Fix code style. Operator needs spaces both sides.
4
5
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
6
Signed-off-by: Kai Deng <dengkai1@huawei.com>
7
Message-id: 20201103114529.638233-1-zhangxinhao1@huawei.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200910173855.4068-2-peter.maydell@linaro.org
10
---
10
---
11
target/arm/cpu.h | 15 ++++++++++++++-
11
target/arm/arch_dump.c | 8 ++++----
12
target/arm/cpu.c | 1 -
12
target/arm/arm-semi.c | 8 ++++----
13
target/arm/helper.c | 5 +++--
13
target/arm/helper.c | 2 +-
14
3 files changed, 17 insertions(+), 4 deletions(-)
14
3 files changed, 9 insertions(+), 9 deletions(-)
15
15
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
diff --git a/target/arm/arch_dump.c b/target/arm/arch_dump.c
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
18
--- a/target/arm/arch_dump.c
19
+++ b/target/arm/cpu.h
19
+++ b/target/arm/arch_dump.c
20
@@ -XXX,XX +XXX,XX @@ FIELD(ID_ISAR6, FHM, 8, 4)
20
@@ -XXX,XX +XXX,XX @@ static int aarch64_write_elf64_prfpreg(WriteCoreDumpFunction f,
21
FIELD(ID_ISAR6, SB, 12, 4)
21
22
FIELD(ID_ISAR6, SPECRES, 16, 4)
22
for (i = 0; i < 32; ++i) {
23
23
uint64_t *q = aa64_vfp_qreg(env, i);
24
+FIELD(ID_MMFR0, VMSA, 0, 4)
24
- note.vfp.vregs[2*i + 0] = cpu_to_dump64(s, q[0]);
25
+FIELD(ID_MMFR0, PMSA, 4, 4)
25
- note.vfp.vregs[2*i + 1] = cpu_to_dump64(s, q[1]);
26
+FIELD(ID_MMFR0, OUTERSHR, 8, 4)
26
+ note.vfp.vregs[2 * i + 0] = cpu_to_dump64(s, q[0]);
27
+FIELD(ID_MMFR0, SHARELVL, 12, 4)
27
+ note.vfp.vregs[2 * i + 1] = cpu_to_dump64(s, q[1]);
28
+FIELD(ID_MMFR0, TCM, 16, 4)
28
}
29
+FIELD(ID_MMFR0, AUXREG, 20, 4)
29
30
+FIELD(ID_MMFR0, FCSE, 24, 4)
30
if (s->dump_info.d_endian == ELFDATA2MSB) {
31
+FIELD(ID_MMFR0, INNERSHR, 28, 4)
31
@@ -XXX,XX +XXX,XX @@ static int aarch64_write_elf64_prfpreg(WriteCoreDumpFunction f,
32
+
32
*/
33
FIELD(ID_MMFR3, CMAINTVA, 0, 4)
33
for (i = 0; i < 32; ++i) {
34
FIELD(ID_MMFR3, CMAINTSW, 4, 4)
34
uint64_t tmp = note.vfp.vregs[2*i];
35
FIELD(ID_MMFR3, BPMAINT, 8, 4)
35
- note.vfp.vregs[2*i] = note.vfp.vregs[2*i+1];
36
@@ -XXX,XX +XXX,XX @@ enum arm_features {
36
- note.vfp.vregs[2*i+1] = tmp;
37
ARM_FEATURE_CACHE_DIRTY_REG, /* 1136/1176 cache dirty status register */
37
+ note.vfp.vregs[2 * i] = note.vfp.vregs[2 * i + 1];
38
ARM_FEATURE_CACHE_BLOCK_OPS, /* v6 optional cache block operations */
38
+ note.vfp.vregs[2 * i + 1] = tmp;
39
ARM_FEATURE_MPIDR, /* has cp15 MPIDR */
39
}
40
- ARM_FEATURE_PXN, /* has Privileged Execute Never bit */
40
}
41
ARM_FEATURE_LPAE, /* has Large Physical Address Extension */
41
42
ARM_FEATURE_V8,
42
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
43
ARM_FEATURE_AARCH64, /* supports 64 bit mode */
44
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_vminmaxnm(const ARMISARegisters *id)
45
return FIELD_EX32(id->mvfr2, MVFR2, FPMISC) >= 4;
46
}
47
48
+static inline bool isar_feature_aa32_pxn(const ARMISARegisters *id)
49
+{
50
+ return FIELD_EX32(id->id_mmfr0, ID_MMFR0, VMSA) >= 4;
51
+}
52
+
53
static inline bool isar_feature_aa32_pan(const ARMISARegisters *id)
54
{
55
return FIELD_EX32(id->id_mmfr3, ID_MMFR3, PAN) != 0;
56
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
57
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
58
--- a/target/arm/cpu.c
44
--- a/target/arm/arm-semi.c
59
+++ b/target/arm/cpu.c
45
+++ b/target/arm/arm-semi.c
60
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
46
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
61
}
47
if (use_gdb_syscalls()) {
62
if (arm_feature(env, ARM_FEATURE_LPAE)) {
48
arm_semi_open_guestfd = guestfd;
63
set_feature(env, ARM_FEATURE_V7MP);
49
ret = arm_gdb_syscall(cpu, arm_semi_open_cb, "open,%s,%x,1a4", arg0,
64
- set_feature(env, ARM_FEATURE_PXN);
50
- (int)arg2+1, gdb_open_modeflags[arg1]);
65
}
51
+ (int)arg2 + 1, gdb_open_modeflags[arg1]);
66
if (arm_feature(env, ARM_FEATURE_CBAR_RO)) {
52
} else {
67
set_feature(env, ARM_FEATURE_CBAR);
53
ret = set_swi_errno(env, open(s, open_modeflags[arg1], 0644));
54
if (ret == (uint32_t)-1) {
55
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
56
GET_ARG(1);
57
if (use_gdb_syscalls()) {
58
ret = arm_gdb_syscall(cpu, arm_semi_cb, "unlink,%s",
59
- arg0, (int)arg1+1);
60
+ arg0, (int)arg1 + 1);
61
} else {
62
s = lock_user_string(arg0);
63
if (!s) {
64
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
65
GET_ARG(3);
66
if (use_gdb_syscalls()) {
67
return arm_gdb_syscall(cpu, arm_semi_cb, "rename,%s,%s",
68
- arg0, (int)arg1+1, arg2, (int)arg3+1);
69
+ arg0, (int)arg1 + 1, arg2, (int)arg3 + 1);
70
} else {
71
char *s2;
72
s = lock_user_string(arg0);
73
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
74
GET_ARG(1);
75
if (use_gdb_syscalls()) {
76
return arm_gdb_syscall(cpu, arm_semi_cb, "system,%s",
77
- arg0, (int)arg1+1);
78
+ arg0, (int)arg1 + 1);
79
} else {
80
s = lock_user_string(arg0);
81
if (!s) {
68
diff --git a/target/arm/helper.c b/target/arm/helper.c
82
diff --git a/target/arm/helper.c b/target/arm/helper.c
69
index XXXXXXX..XXXXXXX 100644
83
index XXXXXXX..XXXXXXX 100644
70
--- a/target/arm/helper.c
84
--- a/target/arm/helper.c
71
+++ b/target/arm/helper.c
85
+++ b/target/arm/helper.c
72
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
86
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(usad8)(uint32_t a, uint32_t b)
73
target_ulong *page_size, ARMMMUFaultInfo *fi)
87
uint32_t sum;
74
{
88
sum = do_usad(a, b);
75
CPUState *cs = env_cpu(env);
89
sum += do_usad(a >> 8, b >> 8);
76
+ ARMCPU *cpu = env_archcpu(env);
90
- sum += do_usad(a >> 16, b >>16);
77
int level = 1;
91
+ sum += do_usad(a >> 16, b >> 16);
78
uint32_t table;
92
sum += do_usad(a >> 24, b >> 24);
79
uint32_t desc;
93
return sum;
80
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
94
}
81
goto do_fault;
82
}
83
type = (desc & 3);
84
- if (type == 0 || (type == 3 && !arm_feature(env, ARM_FEATURE_PXN))) {
85
+ if (type == 0 || (type == 3 && !cpu_isar_feature(aa32_pxn, cpu))) {
86
/* Section translation fault, or attempt to use the encoding
87
* which is Reserved on implementations without PXN.
88
*/
89
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
90
pxn = desc & 1;
91
ns = extract32(desc, 19, 1);
92
} else {
93
- if (arm_feature(env, ARM_FEATURE_PXN)) {
94
+ if (cpu_isar_feature(aa32_pxn, cpu)) {
95
pxn = (desc >> 2) & 1;
96
}
97
ns = extract32(desc, 3, 1);
98
--
95
--
99
2.20.1
96
2.20.1
100
97
101
98
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
2
2
3
The arm_boot_info structure belong to the machine,
3
Fix code style. Don't use '#' flag of printf format ('%#') in
4
move it to RaspiMachineState.
4
format strings, use '0x' prefix instead
5
5
6
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
6
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Kai Deng <dengkai1@huawei.com>
8
Message-id: 20200924111808.77168-4-f4bug@amsat.org
8
Message-id: 20201103114529.638233-2-zhangxinhao1@huawei.com
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
hw/arm/raspi.c | 30 +++++++++++++++---------------
12
target/arm/translate-a64.c | 4 ++--
12
1 file changed, 15 insertions(+), 15 deletions(-)
13
1 file changed, 2 insertions(+), 2 deletions(-)
13
14
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
17
--- a/target/arm/translate-a64.c
17
+++ b/hw/arm/raspi.c
18
+++ b/target/arm/translate-a64.c
18
@@ -XXX,XX +XXX,XX @@ struct RaspiMachineState {
19
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_fp16(DisasContext *s, uint32_t insn)
19
MachineState parent_obj;
20
gen_helper_advsimd_acgt_f16(tcg_res, tcg_op1, tcg_op2, fpst);
20
/*< public >*/
21
break;
21
BCM283XState soc;
22
default:
22
+ struct arm_boot_info binfo;
23
- fprintf(stderr, "%s: insn %#04x, fpop %#2x @ %#" PRIx64 "\n",
23
};
24
+ fprintf(stderr, "%s: insn 0x%04x, fpop 0x%2x @ 0x%" PRIx64 "\n",
24
typedef struct RaspiMachineState RaspiMachineState;
25
__func__, insn, fpopcode, s->pc_curr);
25
26
g_assert_not_reached();
26
@@ -XXX,XX +XXX,XX @@ static void reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
27
}
27
static void setup_boot(MachineState *machine, int version, size_t ram_size)
28
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
28
{
29
case 0x7f: /* FSQRT (vector) */
29
RaspiMachineState *s = RASPI_MACHINE(machine);
30
break;
30
- static struct arm_boot_info binfo;
31
default:
31
int r;
32
- fprintf(stderr, "%s: insn %#04x fpop %#2x\n", __func__, insn, fpop);
32
33
+ fprintf(stderr, "%s: insn 0x%04x fpop 0x%2x\n", __func__, insn, fpop);
33
- binfo.board_id = MACH_TYPE_BCM2708;
34
g_assert_not_reached();
34
- binfo.ram_size = ram_size;
35
- binfo.nb_cpus = machine->smp.cpus;
36
+ s->binfo.board_id = MACH_TYPE_BCM2708;
37
+ s->binfo.ram_size = ram_size;
38
+ s->binfo.nb_cpus = machine->smp.cpus;
39
40
if (version <= 2) {
41
/* The rpi1 and 2 require some custom setup code to run in Secure
42
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
43
* firmware for some cache maintenance operations.
44
* The rpi3 doesn't need this.
45
*/
46
- binfo.board_setup_addr = BOARDSETUP_ADDR;
47
- binfo.write_board_setup = write_board_setup;
48
- binfo.secure_board_setup = true;
49
- binfo.secure_boot = true;
50
+ s->binfo.board_setup_addr = BOARDSETUP_ADDR;
51
+ s->binfo.write_board_setup = write_board_setup;
52
+ s->binfo.secure_board_setup = true;
53
+ s->binfo.secure_boot = true;
54
}
35
}
55
36
56
/* Pi2 and Pi3 requires SMP setup */
57
if (version >= 2) {
58
- binfo.smp_loader_start = SMPBOOT_ADDR;
59
+ s->binfo.smp_loader_start = SMPBOOT_ADDR;
60
if (version == 2) {
61
- binfo.write_secondary_boot = write_smpboot;
62
+ s->binfo.write_secondary_boot = write_smpboot;
63
} else {
64
- binfo.write_secondary_boot = write_smpboot64;
65
+ s->binfo.write_secondary_boot = write_smpboot64;
66
}
67
- binfo.secondary_cpu_reset_hook = reset_secondary;
68
+ s->binfo.secondary_cpu_reset_hook = reset_secondary;
69
}
70
71
/* If the user specified a "firmware" image (e.g. UEFI), we bypass
72
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
73
exit(1);
74
}
75
76
- binfo.entry = firmware_addr;
77
- binfo.firmware_loaded = true;
78
+ s->binfo.entry = firmware_addr;
79
+ s->binfo.firmware_loaded = true;
80
}
81
82
- arm_load_kernel(&s->soc.cpu[0].core, machine, &binfo);
83
+ arm_load_kernel(&s->soc.cpu[0].core, machine, &s->binfo);
84
}
85
86
static void raspi_machine_init(MachineState *machine)
87
--
37
--
88
2.20.1
38
2.20.1
89
39
90
40
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
2
2
3
Now that we can instantiate different machines based on their
3
Fix code style. Space required before the open parenthesis '('.
4
board_rev register value, we can have various raspi2 and raspi3.
5
4
6
In commit fc78a990ec103 we corrected the machine description.
5
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
7
Correct the machine names too. For backward compatibility, add
6
Signed-off-by: Kai Deng <dengkai1@huawei.com>
8
an alias to the previous generic name.
7
Message-id: 20201103114529.638233-3-zhangxinhao1@huawei.com
9
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
11
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20200924111808.77168-6-f4bug@amsat.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
10
---
15
hw/arm/raspi.c | 6 ++++--
11
target/arm/translate.c | 2 +-
16
1 file changed, 4 insertions(+), 2 deletions(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
17
13
18
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/raspi.c
16
--- a/target/arm/translate.c
21
+++ b/hw/arm/raspi.c
17
+++ b/target/arm/translate.c
22
@@ -XXX,XX +XXX,XX @@ static void raspi2b_machine_class_init(ObjectClass *oc, void *data)
18
@@ -XXX,XX +XXX,XX @@ static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
23
MachineClass *mc = MACHINE_CLASS(oc);
19
- Hardware watchpoints.
24
RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
20
Hardware breakpoints have already been handled and skip this code.
25
21
*/
26
+ mc->alias = "raspi2";
22
- switch(dc->base.is_jmp) {
27
rmc->board_rev = 0xa21041;
23
+ switch (dc->base.is_jmp) {
28
raspi_machine_class_common_init(mc, rmc->board_rev);
24
case DISAS_NEXT:
29
};
25
case DISAS_TOO_MANY:
30
@@ -XXX,XX +XXX,XX @@ static void raspi3b_machine_class_init(ObjectClass *oc, void *data)
26
gen_goto_tb(dc, 1, dc->base.pc_next);
31
MachineClass *mc = MACHINE_CLASS(oc);
32
RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
33
34
+ mc->alias = "raspi3";
35
rmc->board_rev = 0xa02082;
36
raspi_machine_class_common_init(mc, rmc->board_rev);
37
};
38
@@ -XXX,XX +XXX,XX @@ static void raspi3b_machine_class_init(ObjectClass *oc, void *data)
39
40
static const TypeInfo raspi_machine_types[] = {
41
{
42
- .name = MACHINE_TYPE_NAME("raspi2"),
43
+ .name = MACHINE_TYPE_NAME("raspi2b"),
44
.parent = TYPE_RASPI_MACHINE,
45
.class_init = raspi2b_machine_class_init,
46
#ifdef TARGET_AARCH64
47
}, {
48
- .name = MACHINE_TYPE_NAME("raspi3"),
49
+ .name = MACHINE_TYPE_NAME("raspi3b"),
50
.parent = TYPE_RASPI_MACHINE,
51
.class_init = raspi3b_machine_class_init,
52
#endif
53
--
27
--
54
2.20.1
28
2.20.1
55
29
56
30
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
Using class_data pointer to create a MachineClass is not
3
We should at least document what this machine is about.
4
the recommended way anymore. The correct way is to open-code
5
the MachineClass::fields in the class_init() method.
6
4
7
We can not use TYPE_RASPI_MACHINE::class_base_init() because
5
Reviewed-by: Graeme Gregory <graeme@nuviainc.com>
8
it is called *before* each machine class_init(), therefore the
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
board_rev field is not populated. We have to manually call
7
Message-id: 20201104165254.24822-1-alex.bennee@linaro.org
10
raspi_machine_class_common_init() for each machine.
8
Cc: Leif Lindholm <leif@nuviainc.com>
11
9
Cc: Shashi Mallela <shashi.mallela@linaro.org>
12
This partly reverts commit a03bde3674e.
10
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
13
11
[PMM: fixed filename mismatch]
14
Suggested-by: Igor Mammedov <imammedo@redhat.com>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
17
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20200924111808.77168-5-f4bug@amsat.org
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
13
---
21
hw/arm/raspi.c | 34 ++++++++++++++++++++++++----------
14
docs/system/arm/sbsa.rst | 32 ++++++++++++++++++++++++++++++++
22
1 file changed, 24 insertions(+), 10 deletions(-)
15
docs/system/target-arm.rst | 1 +
16
2 files changed, 33 insertions(+)
17
create mode 100644 docs/system/arm/sbsa.rst
23
18
24
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
19
diff --git a/docs/system/arm/sbsa.rst b/docs/system/arm/sbsa.rst
20
new file mode 100644
21
index XXXXXXX..XXXXXXX
22
--- /dev/null
23
+++ b/docs/system/arm/sbsa.rst
24
@@ -XXX,XX +XXX,XX @@
25
+Arm Server Base System Architecture Reference board (``sbsa-ref``)
26
+==================================================================
27
+
28
+While the `virt` board is a generic board platform that doesn't match
29
+any real hardware the `sbsa-ref` board intends to look like real
30
+hardware. The `Server Base System Architecture
31
+<https://developer.arm.com/documentation/den0029/latest>` defines a
32
+minimum base line of hardware support and importantly how the firmware
33
+reports that to any operating system. It is a static system that
34
+reports a very minimal DT to the firmware for non-discoverable
35
+information about components affected by the qemu command line (i.e.
36
+cpus and memory). As a result it must have a firmware specifically
37
+built to expect a certain hardware layout (as you would in a real
38
+machine).
39
+
40
+It is intended to be a machine for developing firmware and testing
41
+standards compliance with operating systems.
42
+
43
+Supported devices
44
+"""""""""""""""""
45
+
46
+The sbsa-ref board supports:
47
+
48
+ - A configurable number of AArch64 CPUs
49
+ - GIC version 3
50
+ - System bus AHCI controller
51
+ - System bus EHCI controller
52
+ - CDROM and hard disc on AHCI bus
53
+ - E1000E ethernet card on PCIe bus
54
+ - VGA display adaptor on PCIe bus
55
+ - A generic SBSA watchdog device
56
+
57
diff --git a/docs/system/target-arm.rst b/docs/system/target-arm.rst
25
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/raspi.c
59
--- a/docs/system/target-arm.rst
27
+++ b/hw/arm/raspi.c
60
+++ b/docs/system/target-arm.rst
28
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_init(MachineState *machine)
61
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
29
setup_boot(machine, version, machine->ram_size - vcram_size);
62
arm/mps2
30
}
63
arm/musca
31
64
arm/realview
32
-static void raspi_machine_class_init(ObjectClass *oc, void *data)
65
+ arm/sbsa
33
+static void raspi_machine_class_common_init(MachineClass *mc,
66
arm/versatile
34
+ uint32_t board_rev)
67
arm/vexpress
35
{
68
arm/aspeed
36
- MachineClass *mc = MACHINE_CLASS(oc);
37
- RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
38
- uint32_t board_rev = (uint32_t)(uintptr_t)data;
39
-
40
- rmc->board_rev = board_rev;
41
mc->desc = g_strdup_printf("Raspberry Pi %s (revision 1.%u)",
42
board_type(board_rev),
43
FIELD_EX32(board_rev, REV_CODE, REVISION));
44
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_class_init(ObjectClass *oc, void *data)
45
mc->default_ram_id = "ram";
46
};
47
48
+static void raspi2b_machine_class_init(ObjectClass *oc, void *data)
49
+{
50
+ MachineClass *mc = MACHINE_CLASS(oc);
51
+ RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
52
+
53
+ rmc->board_rev = 0xa21041;
54
+ raspi_machine_class_common_init(mc, rmc->board_rev);
55
+};
56
+
57
+#ifdef TARGET_AARCH64
58
+static void raspi3b_machine_class_init(ObjectClass *oc, void *data)
59
+{
60
+ MachineClass *mc = MACHINE_CLASS(oc);
61
+ RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
62
+
63
+ rmc->board_rev = 0xa02082;
64
+ raspi_machine_class_common_init(mc, rmc->board_rev);
65
+};
66
+#endif /* TARGET_AARCH64 */
67
+
68
static const TypeInfo raspi_machine_types[] = {
69
{
70
.name = MACHINE_TYPE_NAME("raspi2"),
71
.parent = TYPE_RASPI_MACHINE,
72
- .class_init = raspi_machine_class_init,
73
- .class_data = (void *)0xa21041,
74
+ .class_init = raspi2b_machine_class_init,
75
#ifdef TARGET_AARCH64
76
}, {
77
.name = MACHINE_TYPE_NAME("raspi3"),
78
.parent = TYPE_RASPI_MACHINE,
79
- .class_init = raspi_machine_class_init,
80
- .class_data = (void *)0xa02082,
81
+ .class_init = raspi3b_machine_class_init,
82
#endif
83
}, {
84
.name = TYPE_RASPI_MACHINE,
85
--
69
--
86
2.20.1
70
2.20.1
87
71
88
72
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
Display the board revision in the machine description.
3
When using a Cortex-A15, the Virt machine does not use any
4
MPCore peripherals. Remove the dependency.
4
5
5
Before:
6
Fixes: 7951c7b7c05 ("hw/arm: Express dependencies of the virt machine with Kconfig")
6
7
Reported-by: Miroslav Rezanina <mrezanin@redhat.com>
7
$ qemu-system-aarch64 -M help | fgrep raspi
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
raspi2 Raspberry Pi 2B
9
Message-id: 20201107114852.271922-1-philmd@redhat.com
9
raspi3 Raspberry Pi 3B
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
11
After:
12
13
raspi2 Raspberry Pi 2B (revision 1.1)
14
raspi3 Raspberry Pi 3B (revision 1.2)
15
16
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
17
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20200924111808.77168-2-f4bug@amsat.org
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
12
---
21
hw/arm/raspi.c | 4 +++-
13
hw/arm/Kconfig | 1 -
22
1 file changed, 3 insertions(+), 1 deletion(-)
14
1 file changed, 1 deletion(-)
23
15
24
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
16
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/raspi.c
18
--- a/hw/arm/Kconfig
27
+++ b/hw/arm/raspi.c
19
+++ b/hw/arm/Kconfig
28
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_class_init(ObjectClass *oc, void *data)
20
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
29
uint32_t board_rev = (uint32_t)(uintptr_t)data;
21
imply VFIO_PLATFORM
30
22
imply VFIO_XGMAC
31
rmc->board_rev = board_rev;
23
imply TPM_TIS_SYSBUS
32
- mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev));
24
- select A15MPCORE
33
+ mc->desc = g_strdup_printf("Raspberry Pi %s (revision 1.%u)",
25
select ACPI
34
+ board_type(board_rev),
26
select ARM_SMMUV3
35
+ FIELD_EX32(board_rev, REV_CODE, REVISION));
27
select GPIO_KEY
36
mc->init = raspi_machine_init;
37
mc->block_default_type = IF_SD;
38
mc->no_parallel = 1;
39
--
28
--
40
2.20.1
29
2.20.1
41
30
42
31
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The mte update missed a bit when producing clean addresses.
3
The helper function did not get updated when we reorganized
4
the vector register file for SVE. Since then, the neon dregs
5
are non-sequential and cannot be simply indexed.
4
6
5
Fixes: b2aa8879b88
7
At the same time, make the helper function operate on 64-bit
8
quantities so that we do not have to call it twice.
9
10
Fixes: c39c2b9043e
11
Reported-by: Ard Biesheuvel <ardb@kernel.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20200916014102.2446323-1-richard.henderson@linaro.org
13
[PMM: use aa32_vfp_dreg() rather than opencoding]
14
Message-id: 20201105171126.88014-1-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
17
---
11
target/arm/translate-sve.c | 4 ++--
18
target/arm/helper.h | 2 +-
12
1 file changed, 2 insertions(+), 2 deletions(-)
19
target/arm/op_helper.c | 23 +++++++++--------
20
target/arm/translate-neon.c.inc | 44 +++++++++++----------------------
21
3 files changed, 29 insertions(+), 40 deletions(-)
13
22
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
23
diff --git a/target/arm/helper.h b/target/arm/helper.h
15
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
25
--- a/target/arm/helper.h
17
+++ b/target/arm/translate-sve.c
26
+++ b/target/arm/helper.h
18
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
27
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(rsqrte_f32, TCG_CALL_NO_RWG, f32, f32, ptr)
19
for (i = 0; i < len_align; i += 8) {
28
DEF_HELPER_FLAGS_2(rsqrte_f64, TCG_CALL_NO_RWG, f64, f64, ptr)
20
tcg_gen_qemu_ld_i64(t0, clean_addr, midx, MO_LEQ);
29
DEF_HELPER_FLAGS_1(recpe_u32, TCG_CALL_NO_RWG, i32, i32)
21
tcg_gen_st_i64(t0, cpu_env, vofs + i);
30
DEF_HELPER_FLAGS_1(rsqrte_u32, TCG_CALL_NO_RWG, i32, i32)
22
- tcg_gen_addi_i64(clean_addr, cpu_reg_sp(s, rn), 8);
31
-DEF_HELPER_FLAGS_4(neon_tbl, TCG_CALL_NO_RWG, i32, i32, i32, ptr, i32)
23
+ tcg_gen_addi_i64(clean_addr, clean_addr, 8);
32
+DEF_HELPER_FLAGS_4(neon_tbl, TCG_CALL_NO_RWG, i64, env, i32, i64, i64)
33
34
DEF_HELPER_3(shl_cc, i32, env, i32, i32)
35
DEF_HELPER_3(shr_cc, i32, env, i32, i32)
36
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/op_helper.c
39
+++ b/target/arm/op_helper.c
40
@@ -XXX,XX +XXX,XX @@ void raise_exception_ra(CPUARMState *env, uint32_t excp, uint32_t syndrome,
41
cpu_loop_exit_restore(cs, ra);
42
}
43
44
-uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def, void *vn,
45
- uint32_t maxindex)
46
+uint64_t HELPER(neon_tbl)(CPUARMState *env, uint32_t desc,
47
+ uint64_t ireg, uint64_t def)
48
{
49
- uint32_t val, shift;
50
- uint64_t *table = vn;
51
+ uint64_t tmp, val = 0;
52
+ uint32_t maxindex = ((desc & 3) + 1) * 8;
53
+ uint32_t base_reg = desc >> 2;
54
+ uint32_t shift, index, reg;
55
56
- val = 0;
57
- for (shift = 0; shift < 32; shift += 8) {
58
- uint32_t index = (ireg >> shift) & 0xff;
59
+ for (shift = 0; shift < 64; shift += 8) {
60
+ index = (ireg >> shift) & 0xff;
61
if (index < maxindex) {
62
- uint32_t tmp = (table[index >> 3] >> ((index & 7) << 3)) & 0xff;
63
- val |= tmp << shift;
64
+ reg = base_reg + (index >> 3);
65
+ tmp = *aa32_vfp_dreg(env, reg);
66
+ tmp = ((tmp >> ((index & 7) << 3)) & 0xff) << shift;
67
} else {
68
- val |= def & (0xff << shift);
69
+ tmp = def & (0xffull << shift);
24
}
70
}
25
tcg_temp_free_i64(t0);
71
+ val |= tmp;
72
}
73
return val;
74
}
75
diff --git a/target/arm/translate-neon.c.inc b/target/arm/translate-neon.c.inc
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/translate-neon.c.inc
78
+++ b/target/arm/translate-neon.c.inc
79
@@ -XXX,XX +XXX,XX @@ static bool trans_VEXT(DisasContext *s, arg_VEXT *a)
80
81
static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
82
{
83
- int n;
84
- TCGv_i32 tmp, tmp2, tmp3, tmp4;
85
- TCGv_ptr ptr1;
86
+ TCGv_i64 val, def;
87
+ TCGv_i32 desc;
88
89
if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
90
return false;
91
@@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
92
return true;
93
}
94
95
- n = a->len + 1;
96
- if ((a->vn + n) > 32) {
97
+ if ((a->vn + a->len + 1) > 32) {
98
/*
99
* This is UNPREDICTABLE; we choose to UNDEF to avoid the
100
* helper function running off the end of the register file.
101
*/
102
return false;
103
}
104
- n <<= 3;
105
- tmp = tcg_temp_new_i32();
106
- if (a->op) {
107
- read_neon_element32(tmp, a->vd, 0, MO_32);
108
- } else {
109
- tcg_gen_movi_i32(tmp, 0);
110
- }
111
- tmp2 = tcg_temp_new_i32();
112
- read_neon_element32(tmp2, a->vm, 0, MO_32);
113
- ptr1 = vfp_reg_ptr(true, a->vn);
114
- tmp4 = tcg_const_i32(n);
115
- gen_helper_neon_tbl(tmp2, tmp2, tmp, ptr1, tmp4);
116
117
+ desc = tcg_const_i32((a->vn << 2) | a->len);
118
+ def = tcg_temp_new_i64();
119
if (a->op) {
120
- read_neon_element32(tmp, a->vd, 1, MO_32);
121
+ read_neon_element64(def, a->vd, 0, MO_64);
26
} else {
122
} else {
27
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
123
- tcg_gen_movi_i32(tmp, 0);
28
for (i = 0; i < len_align; i += 8) {
124
+ tcg_gen_movi_i64(def, 0);
29
tcg_gen_ld_i64(t0, cpu_env, vofs + i);
125
}
30
tcg_gen_qemu_st_i64(t0, clean_addr, midx, MO_LEQ);
126
- tmp3 = tcg_temp_new_i32();
31
- tcg_gen_addi_i64(clean_addr, cpu_reg_sp(s, rn), 8);
127
- read_neon_element32(tmp3, a->vm, 1, MO_32);
32
+ tcg_gen_addi_i64(clean_addr, clean_addr, 8);
128
- gen_helper_neon_tbl(tmp3, tmp3, tmp, ptr1, tmp4);
33
}
129
- tcg_temp_free_i32(tmp);
34
tcg_temp_free_i64(t0);
130
- tcg_temp_free_i32(tmp4);
35
} else {
131
- tcg_temp_free_ptr(ptr1);
132
+ val = tcg_temp_new_i64();
133
+ read_neon_element64(val, a->vm, 0, MO_64);
134
135
- write_neon_element32(tmp2, a->vd, 0, MO_32);
136
- write_neon_element32(tmp3, a->vd, 1, MO_32);
137
- tcg_temp_free_i32(tmp2);
138
- tcg_temp_free_i32(tmp3);
139
+ gen_helper_neon_tbl(val, cpu_env, desc, val, def);
140
+ write_neon_element64(val, a->vd, 0, MO_64);
141
+
142
+ tcg_temp_free_i64(def);
143
+ tcg_temp_free_i64(val);
144
+ tcg_temp_free_i32(desc);
145
return true;
146
}
147
36
--
148
--
37
2.20.1
149
2.20.1
38
150
39
151
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
The 'first_cpu' is more a QEMU accelerator-related concept
3
We can use one MPC per SRAM bank, but we currently only wire the
4
than a variable the machine requires to use.
4
IRQ from the first expansion MPC to the IRQ splitter. Fix that.
5
Since the machine is aware of its CPUs, directly use the
6
first one to load the firmware.
7
5
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
6
Fixes: bb75e16d5e6 ("hw/arm/iotkit: Wire up MPC interrupt lines")
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20200924111808.77168-3-f4bug@amsat.org
8
Message-id: 20201107193403.436146-2-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
11
---
13
hw/arm/raspi.c | 3 ++-
12
hw/arm/armsse.c | 3 ++-
14
1 file changed, 2 insertions(+), 1 deletion(-)
13
1 file changed, 2 insertions(+), 1 deletion(-)
15
14
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
17
--- a/hw/arm/armsse.c
19
+++ b/hw/arm/raspi.c
18
+++ b/hw/arm/armsse.c
20
@@ -XXX,XX +XXX,XX @@ static void reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
19
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
21
20
qdev_get_gpio_in(dev_splitter, 0));
22
static void setup_boot(MachineState *machine, int version, size_t ram_size)
21
qdev_connect_gpio_out(dev_splitter, 0,
23
{
22
qdev_get_gpio_in_named(dev_secctl,
24
+ RaspiMachineState *s = RASPI_MACHINE(machine);
23
- "mpc_status", 0));
25
static struct arm_boot_info binfo;
24
+ "mpc_status",
26
int r;
25
+ i - IOTS_NUM_EXP_MPC));
27
26
}
28
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
27
29
binfo.firmware_loaded = true;
28
qdev_connect_gpio_out(dev_splitter, 1,
30
}
31
32
- arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
33
+ arm_load_kernel(&s->soc.cpu[0].core, machine, &binfo);
34
}
35
36
static void raspi_machine_init(MachineState *machine)
37
--
29
--
38
2.20.1
30
2.20.1
39
31
40
32
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Commit 1c3db49d39 added the raspi3, which uses the same peripherals
3
The system configuration controller (SYSCFG) doesn't have
4
than the raspi2 (but with different ARM cores). The raspi3 was
4
any output IRQ (and the INTC input #71 belongs to the UART6).
5
introduced without the ignore_memory_transaction_failures flag.
5
Remove the invalid code.
6
Almost 2 years later, the machine is usable running U-Boot and
7
Linux.
8
In commit 00cbd5bd74 we mapped a lot of unimplemented devices,
9
commit d442d95f added thermal block and commit 0e5bbd7406 the
10
system timer.
11
As we are happy with the raspi3, let's remove this flag on the
12
raspi2.
13
6
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Fixes: db635521a02 ("stm32f205: Add the stm32f205 SoC")
15
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
16
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20200921034729.432931-4-f4bug@amsat.org
9
Message-id: 20201107193403.436146-3-f4bug@amsat.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
12
---
20
hw/arm/raspi.c | 3 ---
13
include/hw/misc/stm32f2xx_syscfg.h | 2 --
21
1 file changed, 3 deletions(-)
14
hw/arm/stm32f205_soc.c | 1 -
15
hw/misc/stm32f2xx_syscfg.c | 2 --
16
3 files changed, 5 deletions(-)
22
17
23
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
18
diff --git a/include/hw/misc/stm32f2xx_syscfg.h b/include/hw/misc/stm32f2xx_syscfg.h
24
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/arm/raspi.c
20
--- a/include/hw/misc/stm32f2xx_syscfg.h
26
+++ b/hw/arm/raspi.c
21
+++ b/include/hw/misc/stm32f2xx_syscfg.h
27
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_class_init(ObjectClass *oc, void *data)
22
@@ -XXX,XX +XXX,XX @@ struct STM32F2XXSyscfgState {
28
mc->default_cpus = mc->min_cpus = mc->max_cpus = cores_count(board_rev);
23
uint32_t syscfg_exticr3;
29
mc->default_ram_size = board_ram_size(board_rev);
24
uint32_t syscfg_exticr4;
30
mc->default_ram_id = "ram";
25
uint32_t syscfg_cmpcr;
31
- if (board_version(board_rev) == 2) {
26
-
32
- mc->ignore_memory_transaction_failures = true;
27
- qemu_irq irq;
33
- }
34
};
28
};
35
29
36
static const TypeInfo raspi_machine_types[] = {
30
#endif /* HW_STM32F2XX_SYSCFG_H */
31
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/arm/stm32f205_soc.c
34
+++ b/hw/arm/stm32f205_soc.c
35
@@ -XXX,XX +XXX,XX @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
36
}
37
busdev = SYS_BUS_DEVICE(dev);
38
sysbus_mmio_map(busdev, 0, 0x40013800);
39
- sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, 71));
40
41
/* Attach UART (uses USART registers) and USART controllers */
42
for (i = 0; i < STM_NUM_USARTS; i++) {
43
diff --git a/hw/misc/stm32f2xx_syscfg.c b/hw/misc/stm32f2xx_syscfg.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/misc/stm32f2xx_syscfg.c
46
+++ b/hw/misc/stm32f2xx_syscfg.c
47
@@ -XXX,XX +XXX,XX @@ static void stm32f2xx_syscfg_init(Object *obj)
48
{
49
STM32F2XXSyscfgState *s = STM32F2XX_SYSCFG(obj);
50
51
- sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
52
-
53
memory_region_init_io(&s->mmio, obj, &stm32f2xx_syscfg_ops, s,
54
TYPE_STM32F2XX_SYSCFG, 0x400);
55
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
37
--
56
--
38
2.20.1
57
2.20.1
39
58
40
59
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
We expected the 'version' ID to match the board processor ID,
3
omap2420_mpu_init() introduced in commit 827df9f3c5f ("Add basic
4
but this is not always true (for example boards with revision
4
OMAP2 chip support") takes care of creating the 3 UARTs.
5
id 0xa02042/0xa22042 are Raspberry Pi 2 with a BCM2837 SoC).
6
This was not important because we were not modelling them, but
7
since the recent refactor now allow to model these boards, it
8
is safer to check the processor id directly. Remove the version
9
check.
10
5
11
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
6
Then commit 58a26b477e9 ("Emulate a serial bluetooth HCI with H4+
12
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
7
extensions and attach to n8x0's UART") added n8x0_uart_setup()
8
which create the UART and connects it to an IRQ output,
9
overwritting the existing peripheral and its IRQ connection.
10
This is incorrect.
11
12
Fortunately we don't need to fix this, because commit 6da68df7f9b
13
("hw/arm/nseries: Replace the bluetooth chardev with a "null"
14
chardev") removed the use of this peripheral. We can simply
15
remove the code.
16
13
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20200924111808.77168-9-f4bug@amsat.org
18
Message-id: 20201107193403.436146-4-f4bug@amsat.org
19
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
21
---
17
hw/arm/raspi.c | 29 +++++++++++++----------------
22
hw/arm/nseries.c | 11 -----------
18
1 file changed, 13 insertions(+), 16 deletions(-)
23
1 file changed, 11 deletions(-)
19
24
20
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
25
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
21
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/raspi.c
27
--- a/hw/arm/nseries.c
23
+++ b/hw/arm/raspi.c
28
+++ b/hw/arm/nseries.c
24
@@ -XXX,XX +XXX,XX @@ static RaspiProcessorId board_processor_id(uint32_t board_rev)
29
@@ -XXX,XX +XXX,XX @@ static void n8x0_cbus_setup(struct n800_s *s)
25
return proc_id;
30
cbus_attach(cbus, s->tahvo = tahvo_init(tahvo_irq, 1));
26
}
31
}
27
32
28
-static int board_version(uint32_t board_rev)
33
-static void n8x0_uart_setup(struct n800_s *s)
29
-{
34
-{
30
- return board_processor_id(board_rev) + 1;
35
- Chardev *radio = qemu_chr_new("bt-dummy-uart", "null", NULL);
36
- /*
37
- * Note: We used to connect N8X0_BT_RESET_GPIO and N8X0_BT_WKUP_GPIO
38
- * here, but this code has been removed with the bluetooth backend.
39
- */
40
- omap_uart_attach(s->mpu->uart[BT_UART], radio);
31
-}
41
-}
32
-
42
-
33
static const char *board_soc_type(uint32_t board_rev)
43
static void n8x0_usb_setup(struct n800_s *s)
34
{
44
{
35
return soc_property[board_processor_id(board_rev)].type;
45
SysBusDevice *dev;
36
@@ -XXX,XX +XXX,XX @@ static void reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
46
@@ -XXX,XX +XXX,XX @@ static void n8x0_init(MachineState *machine,
37
cpu_set_pc(cs, info->smp_loader_start);
47
n8x0_spi_setup(s);
38
}
48
n8x0_dss_setup(s);
39
49
n8x0_cbus_setup(s);
40
-static void setup_boot(MachineState *machine, int version, size_t ram_size)
50
- n8x0_uart_setup(s);
41
+static void setup_boot(MachineState *machine, RaspiProcessorId processor_id,
51
if (machine_usb(machine)) {
42
+ size_t ram_size)
52
n8x0_usb_setup(s);
43
{
44
RaspiMachineState *s = RASPI_MACHINE(machine);
45
int r;
46
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
47
s->binfo.ram_size = ram_size;
48
s->binfo.nb_cpus = machine->smp.cpus;
49
50
- if (version <= 2) {
51
- /* The rpi1 and 2 require some custom setup code to run in Secure
52
- * mode before booting a kernel (to set up the SMC vectors so
53
- * that we get a no-op SMC; this is used by Linux to call the
54
+ if (processor_id <= PROCESSOR_ID_BCM2836) {
55
+ /*
56
+ * The BCM2835 and BCM2836 require some custom setup code to run
57
+ * in Secure mode before booting a kernel (to set up the SMC vectors
58
+ * so that we get a no-op SMC; this is used by Linux to call the
59
* firmware for some cache maintenance operations.
60
- * The rpi3 doesn't need this.
61
+ * The BCM2837 doesn't need this.
62
*/
63
s->binfo.board_setup_addr = BOARDSETUP_ADDR;
64
s->binfo.write_board_setup = write_board_setup;
65
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
66
s->binfo.secure_boot = true;
67
}
53
}
68
69
- /* Pi2 and Pi3 requires SMP setup */
70
- if (version >= 2) {
71
+ /* BCM2836 and BCM2837 requires SMP setup */
72
+ if (processor_id >= PROCESSOR_ID_BCM2836) {
73
s->binfo.smp_loader_start = SMPBOOT_ADDR;
74
- if (version == 2) {
75
+ if (processor_id == PROCESSOR_ID_BCM2836) {
76
s->binfo.write_secondary_boot = write_smpboot;
77
} else {
78
s->binfo.write_secondary_boot = write_smpboot64;
79
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_init(MachineState *machine)
80
RaspiMachineClass *mc = RASPI_MACHINE_GET_CLASS(machine);
81
RaspiMachineState *s = RASPI_MACHINE(machine);
82
uint32_t board_rev = mc->board_rev;
83
- int version = board_version(board_rev);
84
uint64_t ram_size = board_ram_size(board_rev);
85
uint32_t vcram_size;
86
DriveInfo *di;
87
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_init(MachineState *machine)
88
89
vcram_size = object_property_get_uint(OBJECT(&s->soc), "vcram-size",
90
&error_abort);
91
- setup_boot(machine, version, machine->ram_size - vcram_size);
92
+ setup_boot(machine, board_processor_id(mc->board_rev),
93
+ machine->ram_size - vcram_size);
94
}
95
96
static void raspi_machine_class_common_init(MachineClass *mc,
97
--
54
--
98
2.20.1
55
2.20.1
99
56
100
57
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
The Raspberry firmware is closed-source. While running it, it
3
The MusicPal board code connects both of the IRQ outputs of the UART
4
accesses various I/O registers. Logging these accesses as UNIMP
4
to the same INTC qemu_irq. Connecting two qemu_irqs outputs directly
5
(unimplemented) help to understand what the firmware is doing
5
to the same input is not valid as it produces subtly wrong behaviour
6
(ideally we want it able to boot a Linux kernel).
6
(for instance if both the IRQ lines are high, and then one goes
7
low, the INTC input will see this as a high-to-low transition
8
even though the second IRQ line should still be holding it high).
7
9
8
Document various blocks we might use later.
10
This kind of wiring needs an explicitly created OR gate; add one.
9
11
10
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Inspired-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
14
Message-id: 20201107193403.436146-5-f4bug@amsat.org
13
Message-id: 20200921034729.432931-2-f4bug@amsat.org
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
17
---
16
include/hw/arm/raspi_platform.h | 51 +++++++++++++++++++++++++++------
18
hw/arm/musicpal.c | 17 +++++++++++++----
17
1 file changed, 43 insertions(+), 8 deletions(-)
19
hw/arm/Kconfig | 1 +
20
2 files changed, 14 insertions(+), 4 deletions(-)
18
21
19
diff --git a/include/hw/arm/raspi_platform.h b/include/hw/arm/raspi_platform.h
22
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
20
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/arm/raspi_platform.h
24
--- a/hw/arm/musicpal.c
22
+++ b/include/hw/arm/raspi_platform.h
25
+++ b/hw/arm/musicpal.c
23
@@ -XXX,XX +XXX,XX @@
26
@@ -XXX,XX +XXX,XX @@
24
* You should have received a copy of the GNU General Public License
27
#include "ui/console.h"
25
* along with this program; if not, write to the Free Software
28
#include "hw/i2c/i2c.h"
26
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29
#include "hw/irq.h"
27
+ *
30
+#include "hw/or-irq.h"
28
+ * Various undocumented addresses and names come from Herman Hermitage's VC4
31
#include "hw/audio/wm8750.h"
29
+ * documentation:
32
#include "sysemu/block-backend.h"
30
+ * https://github.com/hermanhermitage/videocoreiv/wiki/MMIO-Register-map
33
#include "sysemu/runstate.h"
31
*/
32
33
#ifndef HW_ARM_RASPI_PLATFORM_H
34
#define HW_ARM_RASPI_PLATFORM_H
35
36
#define MSYNC_OFFSET 0x0000 /* Multicore Sync Block */
37
-#define IC0_OFFSET 0x2000
38
+#define CCPT_OFFSET 0x1000 /* Compact Camera Port 2 TX */
39
+#define INTE_OFFSET 0x2000 /* VC Interrupt controller */
40
#define ST_OFFSET 0x3000 /* System Timer */
41
+#define TXP_OFFSET 0x4000 /* Transposer */
42
+#define JPEG_OFFSET 0x5000
43
#define MPHI_OFFSET 0x6000 /* Message-based Parallel Host Intf. */
44
#define DMA_OFFSET 0x7000 /* DMA controller, channels 0-14 */
45
-#define ARM_OFFSET 0xB000 /* BCM2708 ARM control block */
46
+#define ARBA_OFFSET 0x9000
47
+#define BRDG_OFFSET 0xa000
48
+#define ARM_OFFSET 0xB000 /* ARM control block */
49
#define ARMCTRL_OFFSET (ARM_OFFSET + 0x000)
50
#define ARMCTRL_IC_OFFSET (ARM_OFFSET + 0x200) /* Interrupt controller */
51
-#define ARMCTRL_TIMER0_1_OFFSET (ARM_OFFSET + 0x400) /* Timer 0 and 1 */
52
+#define ARMCTRL_TIMER0_1_OFFSET (ARM_OFFSET + 0x400) /* Timer 0 and 1 (SP804) */
53
#define ARMCTRL_0_SBM_OFFSET (ARM_OFFSET + 0x800) /* User 0 (ARM) Semaphores
54
* Doorbells & Mailboxes */
55
#define CPRMAN_OFFSET 0x100000 /* Power Management, Watchdog */
56
@@ -XXX,XX +XXX,XX @@
34
@@ -XXX,XX +XXX,XX @@
57
#define AVS_OFFSET 0x103000 /* Audio Video Standard */
35
#define MP_TIMER4_IRQ 7
58
#define RNG_OFFSET 0x104000
36
#define MP_EHCI_IRQ 8
59
#define GPIO_OFFSET 0x200000
37
#define MP_ETH_IRQ 9
60
-#define UART0_OFFSET 0x201000
38
-#define MP_UART1_IRQ 11
61
-#define MMCI0_OFFSET 0x202000
39
-#define MP_UART2_IRQ 11
62
-#define I2S_OFFSET 0x203000
40
+#define MP_UART_SHARED_IRQ 11
63
-#define SPI0_OFFSET 0x204000
41
#define MP_GPIO_IRQ 12
64
+#define UART0_OFFSET 0x201000 /* PL011 */
42
#define MP_RTC_IRQ 28
65
+#define MMCI0_OFFSET 0x202000 /* Legacy MMC */
43
#define MP_AUDIO_IRQ 30
66
+#define I2S_OFFSET 0x203000 /* PCM */
44
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
67
+#define SPI0_OFFSET 0x204000 /* SPI master */
45
ARMCPU *cpu;
68
#define BSC0_OFFSET 0x205000 /* BSC0 I2C/TWI */
46
qemu_irq pic[32];
69
+#define PIXV0_OFFSET 0x206000
47
DeviceState *dev;
70
+#define PIXV1_OFFSET 0x207000
48
+ DeviceState *uart_orgate;
71
+#define DPI_OFFSET 0x208000
49
DeviceState *i2c_dev;
72
+#define DSI0_OFFSET 0x209000 /* Display Serial Interface */
50
DeviceState *lcd_dev;
73
+#define PWM_OFFSET 0x20c000
51
DeviceState *key_dev;
74
+#define PERM_OFFSET 0x20d000
52
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
75
+#define TEC_OFFSET 0x20e000
53
pic[MP_TIMER2_IRQ], pic[MP_TIMER3_IRQ],
76
#define OTP_OFFSET 0x20f000
54
pic[MP_TIMER4_IRQ], NULL);
77
+#define SLIM_OFFSET 0x210000 /* SLIMbus */
55
78
+#define CPG_OFFSET 0x211000
56
- serial_mm_init(address_space_mem, MP_UART1_BASE, 2, pic[MP_UART1_IRQ],
79
#define THERMAL_OFFSET 0x212000
57
+ /* Logically OR both UART IRQs together */
80
-#define BSC_SL_OFFSET 0x214000 /* SPI slave */
58
+ uart_orgate = DEVICE(object_new(TYPE_OR_IRQ));
81
+#define AVSP_OFFSET 0x213000
59
+ object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fatal);
82
+#define BSC_SL_OFFSET 0x214000 /* SPI slave (bootrom) */
60
+ qdev_realize_and_unref(uart_orgate, NULL, &error_fatal);
83
#define AUX_OFFSET 0x215000 /* AUX: UART1/SPI1/SPI2 */
61
+ qdev_connect_gpio_out(DEVICE(uart_orgate), 0, pic[MP_UART_SHARED_IRQ]);
84
#define EMMC1_OFFSET 0x300000
62
+
85
+#define EMMC2_OFFSET 0x340000
63
+ serial_mm_init(address_space_mem, MP_UART1_BASE, 2,
86
+#define HVS_OFFSET 0x400000
64
+ qdev_get_gpio_in(uart_orgate, 0),
87
#define SMI_OFFSET 0x600000
65
1825000, serial_hd(0), DEVICE_NATIVE_ENDIAN);
88
+#define DSI1_OFFSET 0x700000
66
- serial_mm_init(address_space_mem, MP_UART2_BASE, 2, pic[MP_UART2_IRQ],
89
+#define UCAM_OFFSET 0x800000
67
+ serial_mm_init(address_space_mem, MP_UART2_BASE, 2,
90
+#define CMI_OFFSET 0x802000
68
+ qdev_get_gpio_in(uart_orgate, 1),
91
#define BSC1_OFFSET 0x804000 /* BSC1 I2C/TWI */
69
1825000, serial_hd(1), DEVICE_NATIVE_ENDIAN);
92
#define BSC2_OFFSET 0x805000 /* BSC2 I2C/TWI */
70
93
+#define VECA_OFFSET 0x806000
71
/* Register flash */
94
+#define PIXV2_OFFSET 0x807000
72
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
95
+#define HDMI_OFFSET 0x808000
73
index XXXXXXX..XXXXXXX 100644
96
+#define HDCP_OFFSET 0x809000
74
--- a/hw/arm/Kconfig
97
+#define ARBR0_OFFSET 0x80a000
75
+++ b/hw/arm/Kconfig
98
#define DBUS_OFFSET 0x900000
76
@@ -XXX,XX +XXX,XX @@ config MUSCA
99
#define AVE0_OFFSET 0x910000
77
100
#define USB_OTG_OFFSET 0x980000 /* DTC_OTG USB controller */
78
config MUSICPAL
101
+#define V3D_OFFSET 0xc00000
79
bool
102
#define SDRAMC_OFFSET 0xe00000
80
+ select OR_IRQ
103
+#define L2CC_OFFSET 0xe01000 /* Level 2 Cache controller */
81
select BITBANG_I2C
104
+#define L1CC_OFFSET 0xe02000 /* Level 1 Cache controller */
82
select MARVELL_88W8618
105
+#define ARBR1_OFFSET 0xe04000
83
select PTIMER
106
#define DMA15_OFFSET 0xE05000 /* DMA controller, channel 15 */
107
+#define DCRC_OFFSET 0xe07000
108
+#define AXIP_OFFSET 0xe08000
109
110
/* GPU interrupts */
111
#define INTERRUPT_TIMER0 0
112
--
84
--
113
2.20.1
85
2.20.1
114
86
115
87
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
The bcm2835-v3d is used since Linux 4.7, see commit
3
We don't need to fill the full pic[] array if we only use
4
49ac67e0c39c ("ARM: bcm2835: Add VC4 to the device tree"),
4
few of the interrupt lines. Directly call qdev_get_gpio_in()
5
and the bcm2835-txp since Linux 4.19, see commit
5
when necessary.
6
b7dd29b401f5 ("ARM: dts: bcm283x: Add Transposer block").
7
6
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
Message-id: 20201107193403.436146-6-f4bug@amsat.org
10
Message-id: 20200921034729.432931-3-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
11
---
13
include/hw/arm/bcm2835_peripherals.h | 2 ++
12
hw/arm/musicpal.c | 25 +++++++++++++------------
14
hw/arm/bcm2835_peripherals.c | 2 ++
13
1 file changed, 13 insertions(+), 12 deletions(-)
15
2 files changed, 4 insertions(+)
16
14
17
diff --git a/include/hw/arm/bcm2835_peripherals.h b/include/hw/arm/bcm2835_peripherals.h
15
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/bcm2835_peripherals.h
17
--- a/hw/arm/musicpal.c
20
+++ b/include/hw/arm/bcm2835_peripherals.h
18
+++ b/hw/arm/musicpal.c
21
@@ -XXX,XX +XXX,XX @@ struct BCM2835PeripheralState {
19
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info musicpal_binfo = {
22
20
static void musicpal_init(MachineState *machine)
23
BCM2835SystemTimerState systmr;
21
{
24
BCM2835MphiState mphi;
22
ARMCPU *cpu;
25
+ UnimplementedDeviceState txp;
23
- qemu_irq pic[32];
26
UnimplementedDeviceState armtmr;
24
DeviceState *dev;
27
UnimplementedDeviceState cprman;
25
+ DeviceState *pic;
28
UnimplementedDeviceState a2w;
26
DeviceState *uart_orgate;
29
@@ -XXX,XX +XXX,XX @@ struct BCM2835PeripheralState {
27
DeviceState *i2c_dev;
30
UnimplementedDeviceState otp;
28
DeviceState *lcd_dev;
31
UnimplementedDeviceState dbus;
29
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
32
UnimplementedDeviceState ave0;
30
&error_fatal);
33
+ UnimplementedDeviceState v3d;
31
memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram);
34
UnimplementedDeviceState bscsl;
32
35
UnimplementedDeviceState smi;
33
- dev = sysbus_create_simple(TYPE_MV88W8618_PIC, MP_PIC_BASE,
36
DWC2State dwc2;
34
+ pic = sysbus_create_simple(TYPE_MV88W8618_PIC, MP_PIC_BASE,
37
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
35
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ));
38
index XXXXXXX..XXXXXXX 100644
36
- for (i = 0; i < 32; i++) {
39
--- a/hw/arm/bcm2835_peripherals.c
37
- pic[i] = qdev_get_gpio_in(dev, i);
40
+++ b/hw/arm/bcm2835_peripherals.c
38
- }
41
@@ -XXX,XX +XXX,XX @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
39
- sysbus_create_varargs(TYPE_MV88W8618_PIT, MP_PIT_BASE, pic[MP_TIMER1_IRQ],
42
qdev_get_gpio_in_named(DEVICE(&s->ic), BCM2835_IC_GPU_IRQ,
40
- pic[MP_TIMER2_IRQ], pic[MP_TIMER3_IRQ],
43
INTERRUPT_USB));
41
- pic[MP_TIMER4_IRQ], NULL);
44
42
+ sysbus_create_varargs(TYPE_MV88W8618_PIT, MP_PIT_BASE,
45
+ create_unimp(s, &s->txp, "bcm2835-txp", TXP_OFFSET, 0x1000);
43
+ qdev_get_gpio_in(pic, MP_TIMER1_IRQ),
46
create_unimp(s, &s->armtmr, "bcm2835-sp804", ARMCTRL_TIMER0_1_OFFSET, 0x40);
44
+ qdev_get_gpio_in(pic, MP_TIMER2_IRQ),
47
create_unimp(s, &s->cprman, "bcm2835-cprman", CPRMAN_OFFSET, 0x1000);
45
+ qdev_get_gpio_in(pic, MP_TIMER3_IRQ),
48
create_unimp(s, &s->a2w, "bcm2835-a2w", A2W_OFFSET, 0x1000);
46
+ qdev_get_gpio_in(pic, MP_TIMER4_IRQ), NULL);
49
@@ -XXX,XX +XXX,XX @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
47
50
create_unimp(s, &s->otp, "bcm2835-otp", OTP_OFFSET, 0x80);
48
/* Logically OR both UART IRQs together */
51
create_unimp(s, &s->dbus, "bcm2835-dbus", DBUS_OFFSET, 0x8000);
49
uart_orgate = DEVICE(object_new(TYPE_OR_IRQ));
52
create_unimp(s, &s->ave0, "bcm2835-ave0", AVE0_OFFSET, 0x8000);
50
object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fatal);
53
+ create_unimp(s, &s->v3d, "bcm2835-v3d", V3D_OFFSET, 0x1000);
51
qdev_realize_and_unref(uart_orgate, NULL, &error_fatal);
54
create_unimp(s, &s->sdramc, "bcm2835-sdramc", SDRAMC_OFFSET, 0x100);
52
- qdev_connect_gpio_out(DEVICE(uart_orgate), 0, pic[MP_UART_SHARED_IRQ]);
55
}
53
+ qdev_connect_gpio_out(DEVICE(uart_orgate), 0,
56
54
+ qdev_get_gpio_in(pic, MP_UART_SHARED_IRQ));
55
56
serial_mm_init(address_space_mem, MP_UART1_BASE, 2,
57
qdev_get_gpio_in(uart_orgate, 0),
58
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
59
OBJECT(get_system_memory()), &error_fatal);
60
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
61
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, MP_ETH_BASE);
62
- sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[MP_ETH_IRQ]);
63
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
64
+ qdev_get_gpio_in(pic, MP_ETH_IRQ));
65
66
sysbus_create_simple("mv88w8618_wlan", MP_WLAN_BASE, NULL);
67
68
sysbus_create_simple(TYPE_MUSICPAL_MISC, MP_MISC_BASE, NULL);
69
70
dev = sysbus_create_simple(TYPE_MUSICPAL_GPIO, MP_GPIO_BASE,
71
- pic[MP_GPIO_IRQ]);
72
+ qdev_get_gpio_in(pic, MP_GPIO_IRQ));
73
i2c_dev = sysbus_create_simple("gpio_i2c", -1, NULL);
74
i2c = (I2CBus *)qdev_get_child_bus(i2c_dev, "i2c");
75
76
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
77
NULL);
78
sysbus_realize_and_unref(s, &error_fatal);
79
sysbus_mmio_map(s, 0, MP_AUDIO_BASE);
80
- sysbus_connect_irq(s, 0, pic[MP_AUDIO_IRQ]);
81
+ sysbus_connect_irq(s, 0, qdev_get_gpio_in(pic, MP_AUDIO_IRQ));
82
83
musicpal_binfo.ram_size = MP_RAM_DEFAULT_SIZE;
84
arm_load_kernel(cpu, machine, &musicpal_binfo);
57
--
85
--
58
2.20.1
86
2.20.1
59
87
60
88
diff view generated by jsdifflib
1
The M-profile definition of the MVFR1 ID register differs slightly
1
The nseries machines have a codepath that allows them to load a
2
from the A-profile one, and in particular the check for "does the CPU
2
secondary bootloader. This code wasn't checking that the
3
support fp16 arithmetic" is not the same.
3
load_image_targphys() succeeded. Check the return value and report
4
the error to the user.
4
5
5
We don't currently implement any M-profile CPUs with fp16 arithmetic,
6
While we're in the vicinity, fix the comment style of the
6
so this is not yet a visible bug, but correcting the logic now
7
comment documenting what this image load is doing.
7
disarms this beartrap for when we eventually do.
8
8
9
Fixes: Coverity CID 1192904
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200910173855.4068-6-peter.maydell@linaro.org
12
Message-id: 20201103114918.11807-1-peter.maydell@linaro.org
12
---
13
---
13
target/arm/cpu.h | 31 ++++++++++++++++++++++++++-----
14
hw/arm/nseries.c | 15 +++++++++++----
14
1 file changed, 26 insertions(+), 5 deletions(-)
15
1 file changed, 11 insertions(+), 4 deletions(-)
15
16
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
17
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
19
--- a/hw/arm/nseries.c
19
+++ b/target/arm/cpu.h
20
+++ b/hw/arm/nseries.c
20
@@ -XXX,XX +XXX,XX @@ FIELD(ID_MMFR4, LSM, 20, 4)
21
@@ -XXX,XX +XXX,XX @@ static void n8x0_init(MachineState *machine,
21
FIELD(ID_MMFR4, CCIDX, 24, 4)
22
/* No, wait, better start at the ROM. */
22
FIELD(ID_MMFR4, EVT, 28, 4)
23
s->mpu->cpu->env.regs[15] = OMAP2_Q2_BASE + 0x400000;
23
24
24
+FIELD(ID_PFR1, PROGMOD, 0, 4)
25
- /* This is intended for loading the `secondary.bin' program from
25
+FIELD(ID_PFR1, SECURITY, 4, 4)
26
+ /*
26
+FIELD(ID_PFR1, MPROGMOD, 8, 4)
27
+ * This is intended for loading the `secondary.bin' program from
27
+FIELD(ID_PFR1, VIRTUALIZATION, 12, 4)
28
* Nokia images (the NOLO bootloader). The entry point seems
28
+FIELD(ID_PFR1, GENTIMER, 16, 4)
29
* to be at OMAP2_Q2_BASE + 0x400000.
29
+FIELD(ID_PFR1, SEC_FRAC, 20, 4)
30
*
30
+FIELD(ID_PFR1, VIRT_FRAC, 24, 4)
31
@@ -XXX,XX +XXX,XX @@ static void n8x0_init(MachineState *machine,
31
+FIELD(ID_PFR1, GIC, 28, 4)
32
* for them the entry point needs to be set to OMAP2_SRAM_BASE.
32
+
33
*
33
FIELD(ID_AA64ISAR0, AES, 4, 4)
34
* The code above is for loading the `zImage' file from Nokia
34
FIELD(ID_AA64ISAR0, SHA1, 8, 4)
35
- * images. */
35
FIELD(ID_AA64ISAR0, SHA2, 12, 4)
36
- load_image_targphys(option_rom[0].name, OMAP2_Q2_BASE + 0x400000,
36
@@ -XXX,XX +XXX,XX @@ FIELD(MVFR0, FPROUND, 28, 4)
37
- machine->ram_size - 0x400000);
37
38
+ * images.
38
FIELD(MVFR1, FPFTZ, 0, 4)
39
+ */
39
FIELD(MVFR1, FPDNAN, 4, 4)
40
+ if (load_image_targphys(option_rom[0].name,
40
-FIELD(MVFR1, SIMDLS, 8, 4)
41
+ OMAP2_Q2_BASE + 0x400000,
41
-FIELD(MVFR1, SIMDINT, 12, 4)
42
+ machine->ram_size - 0x400000) < 0) {
42
-FIELD(MVFR1, SIMDSP, 16, 4)
43
+ error_report("Failed to load secondary bootloader %s",
43
-FIELD(MVFR1, SIMDHP, 20, 4)
44
+ option_rom[0].name);
44
+FIELD(MVFR1, SIMDLS, 8, 4) /* A-profile only */
45
+ exit(EXIT_FAILURE);
45
+FIELD(MVFR1, SIMDINT, 12, 4) /* A-profile only */
46
+ }
46
+FIELD(MVFR1, SIMDSP, 16, 4) /* A-profile only */
47
47
+FIELD(MVFR1, SIMDHP, 20, 4) /* A-profile only */
48
n800_setup_nolo_tags(nolo_tags);
48
+FIELD(MVFR1, MVE, 8, 4) /* M-profile only */
49
cpu_physical_memory_write(OMAP2_SRAM_BASE, nolo_tags, 0x10000);
49
+FIELD(MVFR1, FP16, 20, 4) /* M-profile only */
50
FIELD(MVFR1, FPHP, 24, 4)
51
FIELD(MVFR1, SIMDFMAC, 28, 4)
52
53
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_predinv(const ARMISARegisters *id)
54
return FIELD_EX32(id->id_isar6, ID_ISAR6, SPECRES) != 0;
55
}
56
57
+static inline bool isar_feature_aa32_mprofile(const ARMISARegisters *id)
58
+{
59
+ return FIELD_EX32(id->id_pfr1, ID_PFR1, MPROGMOD) != 0;
60
+}
61
+
62
static inline bool isar_feature_aa32_fp16_arith(const ARMISARegisters *id)
63
{
64
- return FIELD_EX32(id->mvfr1, MVFR1, FPHP) >= 3;
65
+ /* Sadly this is encoded differently for A-profile and M-profile */
66
+ if (isar_feature_aa32_mprofile(id)) {
67
+ return FIELD_EX32(id->mvfr1, MVFR1, FP16) > 0;
68
+ } else {
69
+ return FIELD_EX32(id->mvfr1, MVFR1, FPHP) >= 3;
70
+ }
71
}
72
73
static inline bool isar_feature_aa32_vfp_simd(const ARMISARegisters *id)
74
--
50
--
75
2.20.1
51
2.20.1
76
52
77
53
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Havard Skinnemoen <hskinnemoen@google.com>
2
2
3
While converting to gen_gvec_ool_zzzp, we lost passing
3
The number of runs is equal to the number of 0-1 and 1-0 transitions,
4
a->esz as the data argument to the function.
4
plus one. Currently, it's counting the number of times these transitions
5
do _not_ happen, plus one.
5
6
6
Fixes: 36cbb7a8e71
7
Source:
7
Cc: qemu-stable@nongnu.org
8
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-22r1a.pdf
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
section 2.3.4 point (3).
9
Message-id: 20200918000500.2690937-1-richard.henderson@linaro.org
10
11
Signed-off-by: Havard Skinnemoen <hskinnemoen@google.com>
12
Message-id: 20201103011457.2959989-2-hskinnemoen@google.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
15
---
13
target/arm/translate-sve.c | 2 +-
16
tests/qtest/npcm7xx_rng-test.c | 2 +-
14
1 file changed, 1 insertion(+), 1 deletion(-)
17
1 file changed, 1 insertion(+), 1 deletion(-)
15
18
16
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
19
diff --git a/tests/qtest/npcm7xx_rng-test.c b/tests/qtest/npcm7xx_rng-test.c
17
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-sve.c
21
--- a/tests/qtest/npcm7xx_rng-test.c
19
+++ b/target/arm/translate-sve.c
22
+++ b/tests/qtest/npcm7xx_rng-test.c
20
@@ -XXX,XX +XXX,XX @@ static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
23
@@ -XXX,XX +XXX,XX @@ static double calc_runs_p(const unsigned long *buf, unsigned int nr_bits)
21
{
24
pi = (double)nr_ones / nr_bits;
22
if (sve_access_check(s)) {
25
23
gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
26
for (k = 0; k < nr_bits - 1; k++) {
24
- a->rd, a->rn, a->rm, a->pg, 0);
27
- vn_obs += !(test_bit(k, buf) ^ test_bit(k + 1, buf));
25
+ a->rd, a->rn, a->rm, a->pg, a->esz);
28
+ vn_obs += (test_bit(k, buf) ^ test_bit(k + 1, buf));
26
}
29
}
27
return true;
30
vn_obs += 1;
28
}
31
29
--
32
--
30
2.20.1
33
2.20.1
31
34
32
35
diff view generated by jsdifflib
1
Move the id_pfr0 and id_pfr1 fields into the ARMISARegisters
1
Checks for UNDEF cases should go before the "is VFP enabled?" access
2
sub-struct. We're going to want id_pfr1 for an isar_features
2
check, except in special cases. Move a stray UNDEF check in the VTBL
3
check, and moving both at the same time avoids an odd
3
trans function up above the access check.
4
inconsistency.
5
6
Changes other than the ones to cpu.h and kvm64.c made
7
automatically with:
8
perl -p -i -e 's/cpu->id_pfr/cpu->isar.id_pfr/' target/arm/*.c hw/intc/armv7m_nvic.c
9
4
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20200910173855.4068-3-peter.maydell@linaro.org
7
Message-id: 20201109145324.2859-1-peter.maydell@linaro.org
13
---
8
---
14
target/arm/cpu.h | 4 ++--
9
target/arm/translate-neon.c.inc | 8 ++++----
15
hw/intc/armv7m_nvic.c | 4 ++--
10
1 file changed, 4 insertions(+), 4 deletions(-)
16
target/arm/cpu.c | 20 ++++++++++----------
17
target/arm/cpu64.c | 12 ++++++------
18
target/arm/cpu_tcg.c | 36 ++++++++++++++++++------------------
19
target/arm/helper.c | 4 ++--
20
target/arm/kvm64.c | 4 ++++
21
7 files changed, 44 insertions(+), 40 deletions(-)
22
11
23
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
12
diff --git a/target/arm/translate-neon.c.inc b/target/arm/translate-neon.c.inc
24
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/cpu.h
14
--- a/target/arm/translate-neon.c.inc
26
+++ b/target/arm/cpu.h
15
+++ b/target/arm/translate-neon.c.inc
27
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
16
@@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
28
uint32_t id_mmfr2;
17
return false;
29
uint32_t id_mmfr3;
30
uint32_t id_mmfr4;
31
+ uint32_t id_pfr0;
32
+ uint32_t id_pfr1;
33
uint32_t mvfr0;
34
uint32_t mvfr1;
35
uint32_t mvfr2;
36
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
37
uint32_t reset_fpsid;
38
uint32_t ctr;
39
uint32_t reset_sctlr;
40
- uint32_t id_pfr0;
41
- uint32_t id_pfr1;
42
uint64_t pmceid0;
43
uint64_t pmceid1;
44
uint32_t id_afr0;
45
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/hw/intc/armv7m_nvic.c
48
+++ b/hw/intc/armv7m_nvic.c
49
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
50
"Aux Fault status registers unimplemented\n");
51
return 0;
52
case 0xd40: /* PFR0. */
53
- return cpu->id_pfr0;
54
+ return cpu->isar.id_pfr0;
55
case 0xd44: /* PFR1. */
56
- return cpu->id_pfr1;
57
+ return cpu->isar.id_pfr1;
58
case 0xd48: /* DFR0. */
59
return cpu->isar.id_dfr0;
60
case 0xd4c: /* AFR0. */
61
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/target/arm/cpu.c
64
+++ b/target/arm/cpu.c
65
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
66
/* Disable the security extension feature bits in the processor feature
67
* registers as well. These are id_pfr1[7:4] and id_aa64pfr0[15:12].
68
*/
69
- cpu->id_pfr1 &= ~0xf0;
70
+ cpu->isar.id_pfr1 &= ~0xf0;
71
cpu->isar.id_aa64pfr0 &= ~0xf000;
72
}
18
}
73
19
74
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
20
- if (!vfp_access_check(s)) {
75
* id_aa64pfr0_el1[11:8].
21
- return true;
76
*/
22
- }
77
cpu->isar.id_aa64pfr0 &= ~0xf00;
23
-
78
- cpu->id_pfr1 &= ~0xf000;
24
if ((a->vn + a->len + 1) > 32) {
79
+ cpu->isar.id_pfr1 &= ~0xf000;
25
/*
26
* This is UNPREDICTABLE; we choose to UNDEF to avoid the
27
@@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
28
return false;
80
}
29
}
81
30
82
#ifndef CONFIG_USER_ONLY
31
+ if (!vfp_access_check(s)) {
83
@@ -XXX,XX +XXX,XX @@ static void cortex_a8_initfn(Object *obj)
32
+ return true;
84
cpu->isar.mvfr1 = 0x00011111;
33
+ }
85
cpu->ctr = 0x82048004;
34
+
86
cpu->reset_sctlr = 0x00c50078;
35
desc = tcg_const_i32((a->vn << 2) | a->len);
87
- cpu->id_pfr0 = 0x1031;
36
def = tcg_temp_new_i64();
88
- cpu->id_pfr1 = 0x11;
37
if (a->op) {
89
+ cpu->isar.id_pfr0 = 0x1031;
90
+ cpu->isar.id_pfr1 = 0x11;
91
cpu->isar.id_dfr0 = 0x400;
92
cpu->id_afr0 = 0;
93
cpu->isar.id_mmfr0 = 0x31100003;
94
@@ -XXX,XX +XXX,XX @@ static void cortex_a9_initfn(Object *obj)
95
cpu->isar.mvfr1 = 0x01111111;
96
cpu->ctr = 0x80038003;
97
cpu->reset_sctlr = 0x00c50078;
98
- cpu->id_pfr0 = 0x1031;
99
- cpu->id_pfr1 = 0x11;
100
+ cpu->isar.id_pfr0 = 0x1031;
101
+ cpu->isar.id_pfr1 = 0x11;
102
cpu->isar.id_dfr0 = 0x000;
103
cpu->id_afr0 = 0;
104
cpu->isar.id_mmfr0 = 0x00100103;
105
@@ -XXX,XX +XXX,XX @@ static void cortex_a7_initfn(Object *obj)
106
cpu->isar.mvfr1 = 0x11111111;
107
cpu->ctr = 0x84448003;
108
cpu->reset_sctlr = 0x00c50078;
109
- cpu->id_pfr0 = 0x00001131;
110
- cpu->id_pfr1 = 0x00011011;
111
+ cpu->isar.id_pfr0 = 0x00001131;
112
+ cpu->isar.id_pfr1 = 0x00011011;
113
cpu->isar.id_dfr0 = 0x02010555;
114
cpu->id_afr0 = 0x00000000;
115
cpu->isar.id_mmfr0 = 0x10101105;
116
@@ -XXX,XX +XXX,XX @@ static void cortex_a15_initfn(Object *obj)
117
cpu->isar.mvfr1 = 0x11111111;
118
cpu->ctr = 0x8444c004;
119
cpu->reset_sctlr = 0x00c50078;
120
- cpu->id_pfr0 = 0x00001131;
121
- cpu->id_pfr1 = 0x00011011;
122
+ cpu->isar.id_pfr0 = 0x00001131;
123
+ cpu->isar.id_pfr1 = 0x00011011;
124
cpu->isar.id_dfr0 = 0x02010555;
125
cpu->id_afr0 = 0x00000000;
126
cpu->isar.id_mmfr0 = 0x10201105;
127
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
128
index XXXXXXX..XXXXXXX 100644
129
--- a/target/arm/cpu64.c
130
+++ b/target/arm/cpu64.c
131
@@ -XXX,XX +XXX,XX @@ static void aarch64_a57_initfn(Object *obj)
132
cpu->isar.mvfr2 = 0x00000043;
133
cpu->ctr = 0x8444c004;
134
cpu->reset_sctlr = 0x00c50838;
135
- cpu->id_pfr0 = 0x00000131;
136
- cpu->id_pfr1 = 0x00011011;
137
+ cpu->isar.id_pfr0 = 0x00000131;
138
+ cpu->isar.id_pfr1 = 0x00011011;
139
cpu->isar.id_dfr0 = 0x03010066;
140
cpu->id_afr0 = 0x00000000;
141
cpu->isar.id_mmfr0 = 0x10101105;
142
@@ -XXX,XX +XXX,XX @@ static void aarch64_a53_initfn(Object *obj)
143
cpu->isar.mvfr2 = 0x00000043;
144
cpu->ctr = 0x84448004; /* L1Ip = VIPT */
145
cpu->reset_sctlr = 0x00c50838;
146
- cpu->id_pfr0 = 0x00000131;
147
- cpu->id_pfr1 = 0x00011011;
148
+ cpu->isar.id_pfr0 = 0x00000131;
149
+ cpu->isar.id_pfr1 = 0x00011011;
150
cpu->isar.id_dfr0 = 0x03010066;
151
cpu->id_afr0 = 0x00000000;
152
cpu->isar.id_mmfr0 = 0x10101105;
153
@@ -XXX,XX +XXX,XX @@ static void aarch64_a72_initfn(Object *obj)
154
cpu->isar.mvfr2 = 0x00000043;
155
cpu->ctr = 0x8444c004;
156
cpu->reset_sctlr = 0x00c50838;
157
- cpu->id_pfr0 = 0x00000131;
158
- cpu->id_pfr1 = 0x00011011;
159
+ cpu->isar.id_pfr0 = 0x00000131;
160
+ cpu->isar.id_pfr1 = 0x00011011;
161
cpu->isar.id_dfr0 = 0x03010066;
162
cpu->id_afr0 = 0x00000000;
163
cpu->isar.id_mmfr0 = 0x10201105;
164
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
165
index XXXXXXX..XXXXXXX 100644
166
--- a/target/arm/cpu_tcg.c
167
+++ b/target/arm/cpu_tcg.c
168
@@ -XXX,XX +XXX,XX @@ static void arm1136_r2_initfn(Object *obj)
169
cpu->isar.mvfr1 = 0x00000000;
170
cpu->ctr = 0x1dd20d2;
171
cpu->reset_sctlr = 0x00050078;
172
- cpu->id_pfr0 = 0x111;
173
- cpu->id_pfr1 = 0x1;
174
+ cpu->isar.id_pfr0 = 0x111;
175
+ cpu->isar.id_pfr1 = 0x1;
176
cpu->isar.id_dfr0 = 0x2;
177
cpu->id_afr0 = 0x3;
178
cpu->isar.id_mmfr0 = 0x01130003;
179
@@ -XXX,XX +XXX,XX @@ static void arm1136_initfn(Object *obj)
180
cpu->isar.mvfr1 = 0x00000000;
181
cpu->ctr = 0x1dd20d2;
182
cpu->reset_sctlr = 0x00050078;
183
- cpu->id_pfr0 = 0x111;
184
- cpu->id_pfr1 = 0x1;
185
+ cpu->isar.id_pfr0 = 0x111;
186
+ cpu->isar.id_pfr1 = 0x1;
187
cpu->isar.id_dfr0 = 0x2;
188
cpu->id_afr0 = 0x3;
189
cpu->isar.id_mmfr0 = 0x01130003;
190
@@ -XXX,XX +XXX,XX @@ static void arm1176_initfn(Object *obj)
191
cpu->isar.mvfr1 = 0x00000000;
192
cpu->ctr = 0x1dd20d2;
193
cpu->reset_sctlr = 0x00050078;
194
- cpu->id_pfr0 = 0x111;
195
- cpu->id_pfr1 = 0x11;
196
+ cpu->isar.id_pfr0 = 0x111;
197
+ cpu->isar.id_pfr1 = 0x11;
198
cpu->isar.id_dfr0 = 0x33;
199
cpu->id_afr0 = 0;
200
cpu->isar.id_mmfr0 = 0x01130003;
201
@@ -XXX,XX +XXX,XX @@ static void arm11mpcore_initfn(Object *obj)
202
cpu->isar.mvfr0 = 0x11111111;
203
cpu->isar.mvfr1 = 0x00000000;
204
cpu->ctr = 0x1d192992; /* 32K icache 32K dcache */
205
- cpu->id_pfr0 = 0x111;
206
- cpu->id_pfr1 = 0x1;
207
+ cpu->isar.id_pfr0 = 0x111;
208
+ cpu->isar.id_pfr1 = 0x1;
209
cpu->isar.id_dfr0 = 0;
210
cpu->id_afr0 = 0x2;
211
cpu->isar.id_mmfr0 = 0x01100103;
212
@@ -XXX,XX +XXX,XX @@ static void cortex_m3_initfn(Object *obj)
213
set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
214
cpu->midr = 0x410fc231;
215
cpu->pmsav7_dregion = 8;
216
- cpu->id_pfr0 = 0x00000030;
217
- cpu->id_pfr1 = 0x00000200;
218
+ cpu->isar.id_pfr0 = 0x00000030;
219
+ cpu->isar.id_pfr1 = 0x00000200;
220
cpu->isar.id_dfr0 = 0x00100000;
221
cpu->id_afr0 = 0x00000000;
222
cpu->isar.id_mmfr0 = 0x00000030;
223
@@ -XXX,XX +XXX,XX @@ static void cortex_m4_initfn(Object *obj)
224
cpu->isar.mvfr0 = 0x10110021;
225
cpu->isar.mvfr1 = 0x11000011;
226
cpu->isar.mvfr2 = 0x00000000;
227
- cpu->id_pfr0 = 0x00000030;
228
- cpu->id_pfr1 = 0x00000200;
229
+ cpu->isar.id_pfr0 = 0x00000030;
230
+ cpu->isar.id_pfr1 = 0x00000200;
231
cpu->isar.id_dfr0 = 0x00100000;
232
cpu->id_afr0 = 0x00000000;
233
cpu->isar.id_mmfr0 = 0x00000030;
234
@@ -XXX,XX +XXX,XX @@ static void cortex_m7_initfn(Object *obj)
235
cpu->isar.mvfr0 = 0x10110221;
236
cpu->isar.mvfr1 = 0x12000011;
237
cpu->isar.mvfr2 = 0x00000040;
238
- cpu->id_pfr0 = 0x00000030;
239
- cpu->id_pfr1 = 0x00000200;
240
+ cpu->isar.id_pfr0 = 0x00000030;
241
+ cpu->isar.id_pfr1 = 0x00000200;
242
cpu->isar.id_dfr0 = 0x00100000;
243
cpu->id_afr0 = 0x00000000;
244
cpu->isar.id_mmfr0 = 0x00100030;
245
@@ -XXX,XX +XXX,XX @@ static void cortex_m33_initfn(Object *obj)
246
cpu->isar.mvfr0 = 0x10110021;
247
cpu->isar.mvfr1 = 0x11000011;
248
cpu->isar.mvfr2 = 0x00000040;
249
- cpu->id_pfr0 = 0x00000030;
250
- cpu->id_pfr1 = 0x00000210;
251
+ cpu->isar.id_pfr0 = 0x00000030;
252
+ cpu->isar.id_pfr1 = 0x00000210;
253
cpu->isar.id_dfr0 = 0x00200000;
254
cpu->id_afr0 = 0x00000000;
255
cpu->isar.id_mmfr0 = 0x00101F40;
256
@@ -XXX,XX +XXX,XX @@ static void cortex_r5_initfn(Object *obj)
257
set_feature(&cpu->env, ARM_FEATURE_PMSA);
258
set_feature(&cpu->env, ARM_FEATURE_PMU);
259
cpu->midr = 0x411fc153; /* r1p3 */
260
- cpu->id_pfr0 = 0x0131;
261
- cpu->id_pfr1 = 0x001;
262
+ cpu->isar.id_pfr0 = 0x0131;
263
+ cpu->isar.id_pfr1 = 0x001;
264
cpu->isar.id_dfr0 = 0x010400;
265
cpu->id_afr0 = 0x0;
266
cpu->isar.id_mmfr0 = 0x0210030;
267
diff --git a/target/arm/helper.c b/target/arm/helper.c
268
index XXXXXXX..XXXXXXX 100644
269
--- a/target/arm/helper.c
270
+++ b/target/arm/helper.c
271
@@ -XXX,XX +XXX,XX @@ static void define_pmu_regs(ARMCPU *cpu)
272
static uint64_t id_pfr1_read(CPUARMState *env, const ARMCPRegInfo *ri)
273
{
274
ARMCPU *cpu = env_archcpu(env);
275
- uint64_t pfr1 = cpu->id_pfr1;
276
+ uint64_t pfr1 = cpu->isar.id_pfr1;
277
278
if (env->gicv3state) {
279
pfr1 |= 1 << 28;
280
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
281
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 0,
282
.access = PL1_R, .type = ARM_CP_CONST,
283
.accessfn = access_aa32_tid3,
284
- .resetvalue = cpu->id_pfr0 },
285
+ .resetvalue = cpu->isar.id_pfr0 },
286
/* ID_PFR1 is not a plain ARM_CP_CONST because we don't know
287
* the value of the GIC field until after we define these regs.
288
*/
289
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
290
index XXXXXXX..XXXXXXX 100644
291
--- a/target/arm/kvm64.c
292
+++ b/target/arm/kvm64.c
293
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
294
* than skipping the reads and leaving 0, as we must avoid
295
* considering the values in every case.
296
*/
297
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_pfr0,
298
+ ARM64_SYS_REG(3, 0, 0, 1, 0));
299
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_pfr1,
300
+ ARM64_SYS_REG(3, 0, 0, 1, 1));
301
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_dfr0,
302
ARM64_SYS_REG(3, 0, 0, 1, 2));
303
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr0,
304
--
38
--
305
2.20.1
39
2.20.1
306
40
307
41
diff view generated by jsdifflib
Deleted patch
1
M-profile CPUs only implement the ID registers as guest-visible if
2
the CPU implements the Main Extension (all our current CPUs except
3
the Cortex-M0 do).
4
1
5
Currently we handle this by having the Cortex-M0 leave the ID
6
register values in the ARMCPU struct as zero, but this conflicts with
7
our design decision to make QEMU behaviour be keyed off ID register
8
fields wherever possible.
9
10
Explicitly code the ID registers in the NVIC to return 0 if the Main
11
Extension is not implemented, so we can make the M0 model set the
12
ARMCPU struct fields to obtain the correct behaviour without those
13
values becoming guest-visible.
14
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20200910173855.4068-4-peter.maydell@linaro.org
18
---
19
hw/intc/armv7m_nvic.c | 42 ++++++++++++++++++++++++++++++++++++++++++
20
1 file changed, 42 insertions(+)
21
22
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/intc/armv7m_nvic.c
25
+++ b/hw/intc/armv7m_nvic.c
26
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
27
"Aux Fault status registers unimplemented\n");
28
return 0;
29
case 0xd40: /* PFR0. */
30
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
31
+ goto bad_offset;
32
+ }
33
return cpu->isar.id_pfr0;
34
case 0xd44: /* PFR1. */
35
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
36
+ goto bad_offset;
37
+ }
38
return cpu->isar.id_pfr1;
39
case 0xd48: /* DFR0. */
40
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
41
+ goto bad_offset;
42
+ }
43
return cpu->isar.id_dfr0;
44
case 0xd4c: /* AFR0. */
45
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
46
+ goto bad_offset;
47
+ }
48
return cpu->id_afr0;
49
case 0xd50: /* MMFR0. */
50
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
51
+ goto bad_offset;
52
+ }
53
return cpu->isar.id_mmfr0;
54
case 0xd54: /* MMFR1. */
55
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
56
+ goto bad_offset;
57
+ }
58
return cpu->isar.id_mmfr1;
59
case 0xd58: /* MMFR2. */
60
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
61
+ goto bad_offset;
62
+ }
63
return cpu->isar.id_mmfr2;
64
case 0xd5c: /* MMFR3. */
65
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
66
+ goto bad_offset;
67
+ }
68
return cpu->isar.id_mmfr3;
69
case 0xd60: /* ISAR0. */
70
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
71
+ goto bad_offset;
72
+ }
73
return cpu->isar.id_isar0;
74
case 0xd64: /* ISAR1. */
75
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
76
+ goto bad_offset;
77
+ }
78
return cpu->isar.id_isar1;
79
case 0xd68: /* ISAR2. */
80
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
81
+ goto bad_offset;
82
+ }
83
return cpu->isar.id_isar2;
84
case 0xd6c: /* ISAR3. */
85
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
86
+ goto bad_offset;
87
+ }
88
return cpu->isar.id_isar3;
89
case 0xd70: /* ISAR4. */
90
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
91
+ goto bad_offset;
92
+ }
93
return cpu->isar.id_isar4;
94
case 0xd74: /* ISAR5. */
95
+ if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
96
+ goto bad_offset;
97
+ }
98
return cpu->isar.id_isar5;
99
case 0xd78: /* CLIDR */
100
return cpu->clidr;
101
--
102
2.20.1
103
104
diff view generated by jsdifflib
Deleted patch
1
Give the Cortex-M0 ID register values corresponding to its
2
implemented behaviour. These will not be guest-visible but will be
3
used to govern the behaviour of QEMU's emulation. We use the same
4
values that the Cortex-M3 does.
5
1
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200910173855.4068-5-peter.maydell@linaro.org
9
---
10
target/arm/cpu_tcg.c | 24 ++++++++++++++++++++++++
11
1 file changed, 24 insertions(+)
12
13
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu_tcg.c
16
+++ b/target/arm/cpu_tcg.c
17
@@ -XXX,XX +XXX,XX @@ static void cortex_m0_initfn(Object *obj)
18
set_feature(&cpu->env, ARM_FEATURE_M);
19
20
cpu->midr = 0x410cc200;
21
+
22
+ /*
23
+ * These ID register values are not guest visible, because
24
+ * we do not implement the Main Extension. They must be set
25
+ * to values corresponding to the Cortex-M0's implemented
26
+ * features, because QEMU generally controls its emulation
27
+ * by looking at ID register fields. We use the same values as
28
+ * for the M3.
29
+ */
30
+ cpu->isar.id_pfr0 = 0x00000030;
31
+ cpu->isar.id_pfr1 = 0x00000200;
32
+ cpu->isar.id_dfr0 = 0x00100000;
33
+ cpu->id_afr0 = 0x00000000;
34
+ cpu->isar.id_mmfr0 = 0x00000030;
35
+ cpu->isar.id_mmfr1 = 0x00000000;
36
+ cpu->isar.id_mmfr2 = 0x00000000;
37
+ cpu->isar.id_mmfr3 = 0x00000000;
38
+ cpu->isar.id_isar0 = 0x01141110;
39
+ cpu->isar.id_isar1 = 0x02111000;
40
+ cpu->isar.id_isar2 = 0x21112231;
41
+ cpu->isar.id_isar3 = 0x01111110;
42
+ cpu->isar.id_isar4 = 0x01310102;
43
+ cpu->isar.id_isar5 = 0x00000000;
44
+ cpu->isar.id_isar6 = 0x00000000;
45
}
46
47
static void cortex_m3_initfn(Object *obj)
48
--
49
2.20.1
50
51
diff view generated by jsdifflib