1
Arm patch queue -- these are all bug fix patches but we might
1
arm pullreq for rc1. All minor bugfixes, except for the sve-default-vector-length
2
as well put them in to rc0...
2
patches, which are somewhere between a bugfix and a new feature.
3
3
4
thanks
4
thanks
5
-- PMM
5
-- PMM
6
6
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
7
The following changes since commit c08ccd1b53f488ac86c1f65cf7623dc91acc249a:
8
8
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
9
Merge remote-tracking branch 'remotes/rth-gitlab/tags/pull-tcg-20210726' into staging (2021-07-27 08:35:01 +0100)
10
10
11
are available in the Git repository at:
11
are available in the Git repository at:
12
12
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210727
14
14
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
15
for you to fetch changes up to e229a179a503f2aee43a76888cf12fbdfe8a3749:
16
16
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
17
hw: aspeed_gpio: Fix memory size (2021-07-27 11:00:00 +0100)
18
18
19
----------------------------------------------------------------
19
----------------------------------------------------------------
20
target-arm queue:
20
target-arm queue:
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
21
* hw/arm/smmuv3: Check 31st bit to see if CD is valid
22
* dump: Update correct kdump phys_base field for AArch64
22
* qemu-options.hx: Fix formatting of -machine memory-backend option
23
* char: i.MX: Add support for "TX complete" interrupt
23
* hw: aspeed_gpio: Fix memory size
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
24
* hw/arm/nseries: Display hexadecimal value with '0x' prefix
25
to boot a Debian Linux kernel on raspi3
25
* Add sve-default-vector-length cpu property
26
* docs: Update path that mentions deprecated.rst
27
* hw/intc/armv7m_nvic: for v8.1M VECTPENDING hides S exceptions from NS
28
* hw/intc/armv7m_nvic: Correct size of ICSR.VECTPENDING
29
* hw/intc/armv7m_nvic: ISCR.ISRPENDING is set for non-enabled pending interrupts
30
* target/arm: Report M-profile alignment faults correctly to the guest
31
* target/arm: Add missing 'return's after calling v7m_exception_taken()
32
* target/arm: Enforce that M-profile SP low 2 bits are always zero
26
33
27
----------------------------------------------------------------
34
----------------------------------------------------------------
28
Andrey Smirnov (2):
35
Joe Komlodi (1):
29
char: i.MX: Simplify imx_update()
36
hw/arm/smmuv3: Check 31st bit to see if CD is valid
30
char: i.MX: Add support for "TX complete" interrupt
31
37
32
Guenter Roeck (1):
38
Joel Stanley (1):
33
fsl-imx6: Swap Ethernet interrupt defines
39
hw: aspeed_gpio: Fix memory size
34
40
35
Peter Maydell (9):
41
Mao Zhongyi (1):
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
42
docs: Update path that mentions deprecated.rst
37
hw/arm/boot: assert that secure_boot and secure_board_setup are false for AArch64
38
hw/arm/boot: If booting a kernel in EL2, set SCR_EL3.HCE
39
hw/arm/bcm2386: Fix parent type of bcm2386
40
hw/arm/bcm2836: Rename bcm2836 type/struct to bcm283x
41
hw/arm/bcm2836: Create proper bcm2837 device
42
hw/arm/bcm2836: Use correct affinity values for BCM2837
43
hw/arm/bcm2836: Hardcode correct CPU type
44
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs
45
43
46
Wei Huang (1):
44
Peter Maydell (7):
47
dump: Update correct kdump phys_base field for AArch64
45
qemu-options.hx: Fix formatting of -machine memory-backend option
46
target/arm: Enforce that M-profile SP low 2 bits are always zero
47
target/arm: Add missing 'return's after calling v7m_exception_taken()
48
target/arm: Report M-profile alignment faults correctly to the guest
49
hw/intc/armv7m_nvic: ISCR.ISRPENDING is set for non-enabled pending interrupts
50
hw/intc/armv7m_nvic: Correct size of ICSR.VECTPENDING
51
hw/intc/armv7m_nvic: for v8.1M VECTPENDING hides S exceptions from NS
48
52
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
53
Philippe Mathieu-Daudé (1):
50
include/hw/arm/fsl-imx6.h | 4 +-
54
hw/arm/nseries: Display hexadecimal value with '0x' prefix
51
include/hw/char/imx_serial.h | 3 ++
52
dump.c | 14 +++++--
53
hw/arm/bcm2836.c | 87 +++++++++++++++++++++++++++++++-------------
54
hw/arm/boot.c | 12 ++++++
55
hw/arm/raspi.c | 77 +++++++++++++++++++++++++++++++--------
56
hw/char/imx_serial.c | 44 ++++++++++++++++------
57
hw/net/imx_fec.c | 28 +++++++++++++-
58
9 files changed, 237 insertions(+), 63 deletions(-)
59
55
56
Richard Henderson (3):
57
target/arm: Correctly bound length in sve_zcr_get_valid_len
58
target/arm: Export aarch64_sve_zcr_get_valid_len
59
target/arm: Add sve-default-vector-length cpu property
60
61
docs/system/arm/cpu-features.rst | 15 ++++++++++
62
configure | 2 +-
63
hw/arm/smmuv3-internal.h | 2 +-
64
target/arm/cpu.h | 5 ++++
65
target/arm/internals.h | 10 +++++++
66
hw/arm/nseries.c | 2 +-
67
hw/gpio/aspeed_gpio.c | 3 +-
68
hw/intc/armv7m_nvic.c | 40 +++++++++++++++++++--------
69
target/arm/cpu.c | 14 ++++++++--
70
target/arm/cpu64.c | 60 ++++++++++++++++++++++++++++++++++++++++
71
target/arm/gdbstub.c | 4 +++
72
target/arm/helper.c | 8 ++++--
73
target/arm/m_helper.c | 24 ++++++++++++----
74
target/arm/translate.c | 3 ++
75
target/i386/cpu.c | 2 +-
76
MAINTAINERS | 2 +-
77
qemu-options.hx | 30 +++++++++++---------
78
17 files changed, 183 insertions(+), 43 deletions(-)
79
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Joe Komlodi <joe.komlodi@xilinx.com>
2
2
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
3
The bit to see if a CD is valid is the last bit of the first word of the CD.
4
it is needed to support guests other than Linux.
5
4
6
Based on the patch by Bill Paul as found here:
5
Signed-off-by: Joe Komlodi <joe.komlodi@xilinx.com>
7
https://bugs.launchpad.net/qemu/+bug/1753314
6
Message-id: 1626728232-134665-2-git-send-email-joe.komlodi@xilinx.com
8
9
Cc: qemu-devel@nongnu.org
10
Cc: qemu-arm@nongnu.org
11
Cc: Bill Paul <wpaul@windriver.com>
12
Cc: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Bill Paul <wpaul@windriver.com>
14
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
15
Message-id: 20180315191141.6789-2-andrew.smirnov@gmail.com
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
9
---
19
include/hw/char/imx_serial.h | 3 +++
10
hw/arm/smmuv3-internal.h | 2 +-
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
11
1 file changed, 1 insertion(+), 1 deletion(-)
21
2 files changed, 20 insertions(+), 3 deletions(-)
22
12
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
13
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
24
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/char/imx_serial.h
15
--- a/hw/arm/smmuv3-internal.h
26
+++ b/include/hw/char/imx_serial.h
16
+++ b/hw/arm/smmuv3-internal.h
27
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static inline int pa_range(STE *ste)
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
18
29
#define UCR2_SRST (1<<0) /* Reset complete */
19
/* CD fields */
30
20
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
21
-#define CD_VALID(x) extract32((x)->word[0], 30, 1)
32
+
22
+#define CD_VALID(x) extract32((x)->word[0], 31, 1)
33
#define UTS1_TXEMPTY (1<<6)
23
#define CD_ASID(x) extract32((x)->word[1], 16, 16)
34
#define UTS1_RXEMPTY (1<<5)
24
#define CD_TTB(x, sel) \
35
#define UTS1_TXFULL (1<<4)
25
({ \
36
@@ -XXX,XX +XXX,XX @@ typedef struct IMXSerialState {
37
uint32_t ubmr;
38
uint32_t ubrc;
39
uint32_t ucr3;
40
+ uint32_t ucr4;
41
42
qemu_irq irq;
43
CharBackend chr;
44
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/char/imx_serial.c
47
+++ b/hw/char/imx_serial.c
48
@@ -XXX,XX +XXX,XX @@
49
50
static const VMStateDescription vmstate_imx_serial = {
51
.name = TYPE_IMX_SERIAL,
52
- .version_id = 1,
53
- .minimum_version_id = 1,
54
+ .version_id = 2,
55
+ .minimum_version_id = 2,
56
.fields = (VMStateField[]) {
57
VMSTATE_INT32(readbuff, IMXSerialState),
58
VMSTATE_UINT32(usr1, IMXSerialState),
59
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
60
VMSTATE_UINT32(ubmr, IMXSerialState),
61
VMSTATE_UINT32(ubrc, IMXSerialState),
62
VMSTATE_UINT32(ucr3, IMXSerialState),
63
+ VMSTATE_UINT32(ucr4, IMXSerialState),
64
VMSTATE_END_OF_LIST()
65
},
66
};
67
@@ -XXX,XX +XXX,XX @@ static void imx_update(IMXSerialState *s)
68
* unfortunately.
69
*/
70
mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
71
+ /*
72
+ * TCEN and TXDC are both bit 3
73
+ */
74
+ mask |= s->ucr4 & UCR4_TCEN;
75
+
76
usr2 = s->usr2 & mask;
77
78
qemu_set_irq(s->irq, usr1 || usr2);
79
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_serial_read(void *opaque, hwaddr offset,
80
return s->ucr3;
81
82
case 0x23: /* UCR4 */
83
+ return s->ucr4;
84
+
85
case 0x29: /* BRM Incremental */
86
return 0x0; /* TODO */
87
88
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
89
* qemu_chr_fe_write and background I/O callbacks */
90
qemu_chr_fe_write_all(&s->chr, &ch, 1);
91
s->usr1 &= ~USR1_TRDY;
92
+ s->usr2 &= ~USR2_TXDC;
93
imx_update(s);
94
s->usr1 |= USR1_TRDY;
95
+ s->usr2 |= USR2_TXDC;
96
imx_update(s);
97
}
98
break;
99
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
100
s->ucr3 = value & 0xffff;
101
break;
102
103
- case 0x2d: /* UTS1 */
104
case 0x23: /* UCR4 */
105
+ s->ucr4 = value & 0xffff;
106
+ imx_update(s);
107
+ break;
108
+
109
+ case 0x2d: /* UTS1 */
110
qemu_log_mask(LOG_UNIMP, "[%s]%s: Unimplemented reg 0x%"
111
HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
112
/* TODO */
113
--
26
--
114
2.16.2
27
2.20.1
115
28
116
29
diff view generated by jsdifflib
1
Now we have separate types for BCM2386 and BCM2387, we might as well
1
The documentation of the -machine memory-backend has some minor
2
just hard-code the CPU type they use rather than having it passed
2
formatting errors:
3
through as an object property. This then lets us put the initialization
3
* Misindentation of the initial line meant that the whole option
4
of the CPU object in init rather than realize.
4
section is incorrectly indented in the HTML output compared to
5
the other -machine options
6
* The examples weren't indented, which meant that they were formatted
7
as plain run-on text including outputting the "::" as text.
8
* The a) b) list has no rst-format markup so it is rendered as
9
a single run-on paragraph
5
10
6
Note that this change means that it's no longer possible on
11
Fix the formatting.
7
the command line to use -cpu to ask for a different kind of
8
CPU than the SoC supports. This was never a supported thing to
9
do anyway; we were just not sanity-checking the command line.
10
11
This does require us to only build the bcm2837 object on
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
13
due to the missing cortex-a53 device and "make check" will fail.
14
12
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
14
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20210719105257.3599-1-peter.maydell@linaro.org
18
Message-id: 20180313153458.26822-9-peter.maydell@linaro.org
19
---
16
---
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
17
qemu-options.hx | 30 +++++++++++++++++-------------
21
hw/arm/raspi.c | 2 --
18
1 file changed, 17 insertions(+), 13 deletions(-)
22
2 files changed, 15 insertions(+), 11 deletions(-)
23
19
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
20
diff --git a/qemu-options.hx b/qemu-options.hx
25
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/bcm2836.c
22
--- a/qemu-options.hx
27
+++ b/hw/arm/bcm2836.c
23
+++ b/qemu-options.hx
28
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ SRST
29
25
Enables or disables ACPI Heterogeneous Memory Attribute Table
30
struct BCM283XInfo {
26
(HMAT) support. The default is off.
31
const char *name;
27
32
+ const char *cpu_type;
28
- ``memory-backend='id'``
33
int clusterid;
29
+ ``memory-backend='id'``
34
};
30
An alternative to legacy ``-mem-path`` and ``mem-prealloc`` options.
35
31
Allows to use a memory backend as main RAM.
36
static const BCM283XInfo bcm283x_socs[] = {
32
37
{
33
For example:
38
.name = TYPE_BCM2836,
34
::
39
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a15"),
35
- -object memory-backend-file,id=pc.ram,size=512M,mem-path=/hugetlbfs,prealloc=on,share=on
40
.clusterid = 0xf,
36
- -machine memory-backend=pc.ram
41
},
37
- -m 512M
42
+#ifdef TARGET_AARCH64
43
{
44
.name = TYPE_BCM2837,
45
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a53"),
46
.clusterid = 0x0,
47
},
48
+#endif
49
};
50
51
static void bcm2836_init(Object *obj)
52
{
53
BCM283XState *s = BCM283X(obj);
54
+ BCM283XClass *bc = BCM283X_GET_CLASS(obj);
55
+ const BCM283XInfo *info = bc->info;
56
+ int n;
57
+
38
+
58
+ for (n = 0; n < BCM283X_NCPUS; n++) {
39
+ -object memory-backend-file,id=pc.ram,size=512M,mem-path=/hugetlbfs,prealloc=on,share=on
59
+ object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
40
+ -machine memory-backend=pc.ram
60
+ info->cpu_type);
41
+ -m 512M
61
+ object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
42
62
+ &error_abort);
43
Migration compatibility note:
63
+ }
44
- a) as backend id one shall use value of 'default-ram-id', advertised by
64
45
- machine type (available via ``query-machines`` QMP command), if migration
65
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
46
- to/from old QEMU (<5.0) is expected.
66
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
47
- b) for machine types 4.0 and older, user shall
67
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
48
- use ``x-use-canonical-path-for-ramblock-id=off`` backend option
68
49
- if migration to/from old QEMU (<5.0) is expected.
69
/* common peripherals from bcm2835 */
50
+
70
51
+ * as backend id one shall use value of 'default-ram-id', advertised by
71
- obj = OBJECT(dev);
52
+ machine type (available via ``query-machines`` QMP command), if migration
72
- for (n = 0; n < BCM283X_NCPUS; n++) {
53
+ to/from old QEMU (<5.0) is expected.
73
- object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
54
+ * for machine types 4.0 and older, user shall
74
- s->cpu_type);
55
+ use ``x-use-canonical-path-for-ramblock-id=off`` backend option
75
- object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
56
+ if migration to/from old QEMU (<5.0) is expected.
76
- &error_abort);
57
+
77
- }
58
For example:
78
-
59
::
79
obj = object_property_get_link(OBJECT(dev), "ram", &err);
60
- -object memory-backend-ram,id=pc.ram,size=512M,x-use-canonical-path-for-ramblock-id=off
80
if (obj == NULL) {
61
- -machine memory-backend=pc.ram
81
error_setg(errp, "%s: required ram link not found: %s",
62
- -m 512M
82
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
63
+
83
}
64
+ -object memory-backend-ram,id=pc.ram,size=512M,x-use-canonical-path-for-ramblock-id=off
84
65
+ -machine memory-backend=pc.ram
85
static Property bcm2836_props[] = {
66
+ -m 512M
86
- DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
67
ERST
87
DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
68
88
BCM283X_NCPUS),
69
HXCOMM Deprecated by -machine
89
DEFINE_PROP_END_OF_LIST()
90
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/hw/arm/raspi.c
93
+++ b/hw/arm/raspi.c
94
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
95
/* Setup the SOC */
96
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
97
&error_abort);
98
- object_property_set_str(OBJECT(&s->soc), machine->cpu_type, "cpu-type",
99
- &error_abort);
100
object_property_set_int(OBJECT(&s->soc), smp_cpus, "enabled-cpus",
101
&error_abort);
102
int board_rev = version == 3 ? 0xa02082 : 0xa21041;
103
--
70
--
104
2.16.2
71
2.20.1
105
72
106
73
diff view generated by jsdifflib
1
Add some assertions that if we're about to boot an AArch64 kernel,
1
For M-profile, unlike A-profile, the low 2 bits of SP are defined to be
2
the board code has not mistakenly set either secure_boot or
2
RES0H, which is to say that they must be hardwired to zero so that
3
secure_board_setup. It doesn't make sense to set secure_boot,
3
guest attempts to write non-zero values to them are ignored.
4
because all AArch64 kernels must be booted in non-secure mode.
5
4
6
It might in theory make sense to set secure_board_setup, but
5
Implement this behaviour by masking out the low bits:
7
we don't currently support that, because only the AArch32
6
* for writes to r13 by the gdbstub
8
bootloader[] code calls this hook; bootloader_aarch64[] does not.
7
* for writes to any of the various flavours of SP via MSR
9
Since we don't have a current need for this functionality, just
8
* for writes to r13 via store_reg() in generated code
10
assert that we don't try to use it. If it's needed we'll add
9
11
it later.
10
Note that all the direct uses of cpu_R[] in translate.c are in places
11
where the register is definitely not r13 (usually because that has
12
been checked for as an UNDEFINED or UNPREDICTABLE case and handled as
13
UNDEF).
14
15
All the other writes to regs[13] in C code are either:
16
* A-profile only code
17
* writes of values we can guarantee to be aligned, such as
18
- writes of previous-SP-value plus or minus a 4-aligned constant
19
- writes of the value in an SP limit register (which we already
20
enforce to be aligned)
12
21
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
23
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20180313153458.26822-3-peter.maydell@linaro.org
24
Message-id: 20210723162146.5167-2-peter.maydell@linaro.org
16
---
25
---
17
hw/arm/boot.c | 7 +++++++
26
target/arm/gdbstub.c | 4 ++++
18
1 file changed, 7 insertions(+)
27
target/arm/m_helper.c | 14 ++++++++------
28
target/arm/translate.c | 3 +++
29
3 files changed, 15 insertions(+), 6 deletions(-)
19
30
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
31
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
21
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
33
--- a/target/arm/gdbstub.c
23
+++ b/hw/arm/boot.c
34
+++ b/target/arm/gdbstub.c
24
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
35
@@ -XXX,XX +XXX,XX @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
25
} else {
36
26
env->pstate = PSTATE_MODE_EL1h;
37
if (n < 16) {
27
}
38
/* Core integer register. */
28
+ /* AArch64 kernels never boot in secure mode */
39
+ if (n == 13 && arm_feature(env, ARM_FEATURE_M)) {
29
+ assert(!info->secure_boot);
40
+ /* M profile SP low bits are always 0 */
30
+ /* This hook is only supported for AArch32 currently:
41
+ tmp &= ~3;
31
+ * bootloader_aarch64[] will not call the hook, and
42
+ }
32
+ * the code above has already dropped us into EL2 or EL1.
43
env->regs[n] = tmp;
33
+ */
44
return 4;
34
+ assert(!info->secure_board_setup);
45
}
35
}
46
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
36
47
index XXXXXXX..XXXXXXX 100644
37
/* Set to non-secure if not a secure boot */
48
--- a/target/arm/m_helper.c
49
+++ b/target/arm/m_helper.c
50
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
51
if (!env->v7m.secure) {
52
return;
53
}
54
- env->v7m.other_ss_msp = val;
55
+ env->v7m.other_ss_msp = val & ~3;
56
return;
57
case 0x89: /* PSP_NS */
58
if (!env->v7m.secure) {
59
return;
60
}
61
- env->v7m.other_ss_psp = val;
62
+ env->v7m.other_ss_psp = val & ~3;
63
return;
64
case 0x8a: /* MSPLIM_NS */
65
if (!env->v7m.secure) {
66
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
67
68
limit = is_psp ? env->v7m.psplim[false] : env->v7m.msplim[false];
69
70
+ val &= ~0x3;
71
+
72
if (val < limit) {
73
raise_exception_ra(env, EXCP_STKOF, 0, 1, GETPC());
74
}
75
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
76
break;
77
case 8: /* MSP */
78
if (v7m_using_psp(env)) {
79
- env->v7m.other_sp = val;
80
+ env->v7m.other_sp = val & ~3;
81
} else {
82
- env->regs[13] = val;
83
+ env->regs[13] = val & ~3;
84
}
85
break;
86
case 9: /* PSP */
87
if (v7m_using_psp(env)) {
88
- env->regs[13] = val;
89
+ env->regs[13] = val & ~3;
90
} else {
91
- env->v7m.other_sp = val;
92
+ env->v7m.other_sp = val & ~3;
93
}
94
break;
95
case 10: /* MSPLIM */
96
diff --git a/target/arm/translate.c b/target/arm/translate.c
97
index XXXXXXX..XXXXXXX 100644
98
--- a/target/arm/translate.c
99
+++ b/target/arm/translate.c
100
@@ -XXX,XX +XXX,XX @@ void store_reg(DisasContext *s, int reg, TCGv_i32 var)
101
*/
102
tcg_gen_andi_i32(var, var, s->thumb ? ~1 : ~3);
103
s->base.is_jmp = DISAS_JUMP;
104
+ } else if (reg == 13 && arm_dc_feature(s, ARM_FEATURE_M)) {
105
+ /* For M-profile SP bits [1:0] are always zero */
106
+ tcg_gen_andi_i32(var, var, ~3);
107
}
108
tcg_gen_mov_i32(cpu_R[reg], var);
109
tcg_temp_free_i32(var);
38
--
110
--
39
2.16.2
111
2.20.1
40
112
41
113
diff view generated by jsdifflib
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
1
In do_v7m_exception_exit(), we perform various checks as part of
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
2
performing the exception return. If one of these checks fails, the
3
is required for Linux to boot.
3
architecture requires that we take an appropriate exception on the
4
existing stackframe. We implement this by calling
5
v7m_exception_taken() to set up to take the new exception, and then
6
immediately returning from do_v7m_exception_exit() without proceeding
7
any further with the unstack-and-exception-return process.
8
9
In a couple of checks that are new in v8.1M, we forgot the "return"
10
statement, with the effect that if bad code in the guest tripped over
11
these checks we would set up to take a UsageFault exception but then
12
blunder on trying to also unstack and return from the original
13
exception, with the probable result that the guest would crash.
14
15
Add the missing return statements.
4
16
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Message-id: 20210723162146.5167-3-peter.maydell@linaro.org
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
9
---
20
---
10
hw/arm/bcm2836.c | 11 +++++++----
21
target/arm/m_helper.c | 2 ++
11
1 file changed, 7 insertions(+), 4 deletions(-)
22
1 file changed, 2 insertions(+)
12
23
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
24
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
14
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/bcm2836.c
26
--- a/target/arm/m_helper.c
16
+++ b/hw/arm/bcm2836.c
27
+++ b/target/arm/m_helper.c
17
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
18
29
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
19
struct BCM283XInfo {
30
"stackframe: NSACR prevents clearing FPU registers\n");
20
const char *name;
31
v7m_exception_taken(cpu, excret, true, false);
21
+ int clusterid;
32
+ return;
22
};
33
} else if (!cpacr_pass) {
23
34
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE,
24
static const BCM283XInfo bcm283x_socs[] = {
35
exc_secure);
25
{
36
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
26
.name = TYPE_BCM2836,
37
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
27
+ .clusterid = 0xf,
38
"stackframe: CPACR prevents clearing FPU registers\n");
28
},
39
v7m_exception_taken(cpu, excret, true, false);
29
{
40
+ return;
30
.name = TYPE_BCM2837,
41
}
31
+ .clusterid = 0x0,
42
}
32
},
43
/* Clear s0..s15, FPSCR and VPR */
33
};
34
35
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
36
static void bcm2836_realize(DeviceState *dev, Error **errp)
37
{
38
BCM283XState *s = BCM283X(dev);
39
+ BCM283XClass *bc = BCM283X_GET_CLASS(dev);
40
+ const BCM283XInfo *info = bc->info;
41
Object *obj;
42
Error *err = NULL;
43
int n;
44
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
45
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
46
47
for (n = 0; n < BCM283X_NCPUS; n++) {
48
- /* Mirror bcm2836, which has clusterid set to 0xf
49
- * TODO: this should be converted to a property of ARM_CPU
50
- */
51
- s->cpus[n].mp_affinity = 0xF00 | n;
52
+ /* TODO: this should be converted to a property of ARM_CPU */
53
+ s->cpus[n].mp_affinity = (info->clusterid << 8) | n;
54
55
/* set periphbase/CBAR value for CPU-local registers */
56
object_property_set_int(OBJECT(&s->cpus[n]),
57
--
44
--
58
2.16.2
45
2.20.1
59
46
60
47
diff view generated by jsdifflib
1
For the rpi1 and 2 we want to boot the Linux kernel via some
1
For M-profile, we weren't reporting alignment faults triggered by the
2
custom setup code that makes sure that the SMC instruction
2
generic TCG code correctly to the guest. These get passed into
3
acts as a no-op, because it's used for cache maintenance.
3
arm_v7m_cpu_do_interrupt() as an EXCP_DATA_ABORT with an A-profile
4
The rpi3 boots AArch64 kernels, which don't need SMC for
4
style exception.fsr value of 1. We didn't check for this, and so
5
cache maintenance and always expect to be booted non-secure.
5
they fell through into the default of "assume this is an MPU fault"
6
Don't fill in the aarch32-specific parts of the binfo struct.
6
and were reported to the guest as a data access violation MPU fault.
7
8
Report these alignment faults as UsageFaults which set the UNALIGNED
9
bit in the UFSR.
7
10
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20210723162146.5167-4-peter.maydell@linaro.org
11
Message-id: 20180313153458.26822-2-peter.maydell@linaro.org
12
---
14
---
13
hw/arm/raspi.c | 17 +++++++++++++----
15
target/arm/m_helper.c | 8 ++++++++
14
1 file changed, 13 insertions(+), 4 deletions(-)
16
1 file changed, 8 insertions(+)
15
17
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
18
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
17
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
20
--- a/target/arm/m_helper.c
19
+++ b/hw/arm/raspi.c
21
+++ b/target/arm/m_helper.c
20
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
22
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
21
binfo.board_id = raspi_boardid[version];
23
env->v7m.sfsr |= R_V7M_SFSR_LSERR_MASK;
22
binfo.ram_size = ram_size;
24
break;
23
binfo.nb_cpus = smp_cpus;
25
case EXCP_UNALIGNED:
24
- binfo.board_setup_addr = BOARDSETUP_ADDR;
26
+ /* Unaligned faults reported by M-profile aware code */
25
- binfo.write_board_setup = write_board_setup;
27
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE, env->v7m.secure);
26
- binfo.secure_board_setup = true;
28
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_UNALIGNED_MASK;
27
- binfo.secure_boot = true;
29
break;
28
+
30
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
29
+ if (version <= 2) {
31
}
30
+ /* The rpi1 and 2 require some custom setup code to run in Secure
32
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_BUS, false);
31
+ * mode before booting a kernel (to set up the SMC vectors so
33
break;
32
+ * that we get a no-op SMC; this is used by Linux to call the
34
+ case 0x1: /* Alignment fault reported by generic code */
33
+ * firmware for some cache maintenance operations.
35
+ qemu_log_mask(CPU_LOG_INT,
34
+ * The rpi3 doesn't need this.
36
+ "...really UsageFault with UFSR.UNALIGNED\n");
35
+ */
37
+ env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_UNALIGNED_MASK;
36
+ binfo.board_setup_addr = BOARDSETUP_ADDR;
38
+ armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE,
37
+ binfo.write_board_setup = write_board_setup;
39
+ env->v7m.secure);
38
+ binfo.secure_board_setup = true;
40
+ break;
39
+ binfo.secure_boot = true;
41
default:
40
+ }
42
/*
41
43
* All other FSR values are either MPU faults or "can't happen
42
/* Pi2 and Pi3 requires SMP setup */
43
if (version >= 2) {
44
--
44
--
45
2.16.2
45
2.20.1
46
46
47
47
diff view generated by jsdifflib
1
If we're directly booting a Linux kernel and the CPU supports both
1
The ISCR.ISRPENDING bit is set when an external interrupt is pending.
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
2
This is true whether that external interrupt is enabled or not.
3
set the SCR_EL3.HCE bit in this situation, so that the HVC
3
This means that we can't use 's->vectpending == 0' as a shortcut to
4
instruction is enabled rather than UNDEFing. Otherwise at least some
4
"ISRPENDING is zero", because s->vectpending indicates only the
5
kernels will panic when trying to initialize KVM in the guest.
5
highest priority pending enabled interrupt.
6
7
Remove the incorrect optimization so that if there is no pending
8
enabled interrupt we fall through to scanning through the whole
9
interrupt array.
6
10
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20210723162146.5167-5-peter.maydell@linaro.org
9
---
14
---
10
hw/arm/boot.c | 5 +++++
15
hw/intc/armv7m_nvic.c | 9 ++++-----
11
1 file changed, 5 insertions(+)
16
1 file changed, 4 insertions(+), 5 deletions(-)
12
17
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
18
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
14
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/boot.c
20
--- a/hw/intc/armv7m_nvic.c
16
+++ b/hw/arm/boot.c
21
+++ b/hw/intc/armv7m_nvic.c
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
22
@@ -XXX,XX +XXX,XX @@ static bool nvic_isrpending(NVICState *s)
18
assert(!info->secure_board_setup);
23
{
19
}
24
int irq;
20
25
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
26
- /* We can shortcut if the highest priority pending interrupt
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
27
- * happens to be external or if there is nothing pending.
23
+ env->cp15.scr_el3 |= SCR_HCE;
28
+ /*
24
+ }
29
+ * We can shortcut if the highest priority pending interrupt
25
+
30
+ * happens to be external; if not we need to check the whole
26
/* Set to non-secure if not a secure boot */
31
+ * vectors[] array.
27
if (!info->secure_boot &&
32
*/
28
(cs != first_cpu || !info->secure_board_setup)) {
33
if (s->vectpending > NVIC_FIRST_IRQ) {
34
return true;
35
}
36
- if (s->vectpending == 0) {
37
- return false;
38
- }
39
40
for (irq = NVIC_FIRST_IRQ; irq < s->num_irq; irq++) {
41
if (s->vectors[irq].pending) {
29
--
42
--
30
2.16.2
43
2.20.1
31
44
32
45
diff view generated by jsdifflib
1
The TypeInfo and state struct for bcm2386 disagree about what the
1
The VECTPENDING field in the ICSR is 9 bits wide, in bits [20:12] of
2
parent class is -- the TypeInfo says it's TYPE_SYS_BUS_DEVICE,
2
the register. We were incorrectly masking it to 8 bits, so it would
3
but the BCM2386State struct only defines the parent_obj field
3
report the wrong value if the pending exception was greater than 256.
4
as DeviceState. This would have caused problems if anything
4
Fix the bug.
5
actually tried to treat the object as a TYPE_SYS_BUS_DEVICE.
6
Fix the TypeInfo to use TYPE_DEVICE as the parent, since we don't
7
need any of the additional functionality TYPE_SYS_BUS_DEVICE
8
provides.
9
5
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210723162146.5167-6-peter.maydell@linaro.org
13
Message-id: 20180313153458.26822-5-peter.maydell@linaro.org
14
---
9
---
15
hw/arm/bcm2836.c | 2 +-
10
hw/intc/armv7m_nvic.c | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
17
12
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
13
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/bcm2836.c
15
--- a/hw/intc/armv7m_nvic.c
21
+++ b/hw/arm/bcm2836.c
16
+++ b/hw/intc/armv7m_nvic.c
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
17
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
23
18
/* VECTACTIVE */
24
static const TypeInfo bcm2836_type_info = {
19
val = cpu->env.v7m.exception;
25
.name = TYPE_BCM2836,
20
/* VECTPENDING */
26
- .parent = TYPE_SYS_BUS_DEVICE,
21
- val |= (s->vectpending & 0xff) << 12;
27
+ .parent = TYPE_DEVICE,
22
+ val |= (s->vectpending & 0x1ff) << 12;
28
.instance_size = sizeof(BCM2836State),
23
/* ISRPENDING - set if any external IRQ is pending */
29
.instance_init = bcm2836_init,
24
if (nvic_isrpending(s)) {
30
.class_init = bcm2836_class_init,
25
val |= (1 << 22);
31
--
26
--
32
2.16.2
27
2.20.1
33
28
34
29
diff view generated by jsdifflib
1
The raspi3 has AArch64 CPUs, which means that our smpboot
1
In Arm v8.1M the VECTPENDING field in the ICSR has new behaviour: if
2
code for keeping the secondary CPUs in a pen needs to have
2
the register is accessed NonSecure and the highest priority pending
3
a version for A64 as well as A32. Without this, the
3
enabled exception (that would be returned in the VECTPENDING field)
4
secondary CPUs go into an infinite loop of taking undefined
4
targets Secure, then the VECTPENDING field must read 1 rather than
5
instruction exceptions.
5
the exception number of the pending exception. Implement this.
6
6
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180313153458.26822-10-peter.maydell@linaro.org
9
Message-id: 20210723162146.5167-7-peter.maydell@linaro.org
10
---
10
---
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
11
hw/intc/armv7m_nvic.c | 31 ++++++++++++++++++++++++-------
12
1 file changed, 40 insertions(+), 1 deletion(-)
12
1 file changed, 24 insertions(+), 7 deletions(-)
13
13
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
14
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
16
--- a/hw/intc/armv7m_nvic.c
17
+++ b/hw/arm/raspi.c
17
+++ b/hw/intc/armv7m_nvic.c
18
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_acknowledge_irq(void *opaque)
19
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
19
nvic_irq_update(s);
20
#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
21
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
22
+#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
23
24
/* Table of Linux board IDs for different Pi versions */
25
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
26
@@ -XXX,XX +XXX,XX @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
27
info->smp_loader_start);
28
}
20
}
29
21
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
22
+static bool vectpending_targets_secure(NVICState *s)
31
+{
23
+{
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
24
+ /* Return true if s->vectpending targets Secure state */
33
+ * The mechanism for doing the spin-table is also entirely different.
25
+ if (s->vectpending_is_s_banked) {
34
+ * We must have four 64-bit fields at absolute addresses
26
+ return true;
35
+ * 0xd8, 0xe0, 0xe8, 0xf0 in RAM, which are the flag variables for
27
+ }
36
+ * our CPUs, and which we must ensure are zero initialized before
28
+ return !exc_is_banked(s->vectpending) &&
37
+ * the primary CPU goes into the kernel. We put these variables inside
29
+ exc_targets_secure(s, s->vectpending);
38
+ * a rom blob, so that the reset for ROM contents zeroes them for us.
39
+ */
40
+ static const uint32_t smpboot[] = {
41
+ 0xd2801b05, /* mov x5, 0xd8 */
42
+ 0xd53800a6, /* mrs x6, mpidr_el1 */
43
+ 0x924004c6, /* and x6, x6, #0x3 */
44
+ 0xd503205f, /* spin: wfe */
45
+ 0xf86678a4, /* ldr x4, [x5,x6,lsl #3] */
46
+ 0xb4ffffc4, /* cbz x4, spin */
47
+ 0xd2800000, /* mov x0, #0x0 */
48
+ 0xd2800001, /* mov x1, #0x0 */
49
+ 0xd2800002, /* mov x2, #0x0 */
50
+ 0xd2800003, /* mov x3, #0x0 */
51
+ 0xd61f0080, /* br x4 */
52
+ };
53
+
54
+ static const uint64_t spintables[] = {
55
+ 0, 0, 0, 0
56
+ };
57
+
58
+ rom_add_blob_fixed("raspi_smpboot", smpboot, sizeof(smpboot),
59
+ info->smp_loader_start);
60
+ rom_add_blob_fixed("raspi_spintables", spintables, sizeof(spintables),
61
+ SPINTABLE_ADDR);
62
+}
30
+}
63
+
31
+
64
static void write_board_setup(ARMCPU *cpu, const struct arm_boot_info *info)
32
void armv7m_nvic_get_pending_irq_info(void *opaque,
33
int *pirq, bool *ptargets_secure)
65
{
34
{
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
35
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_get_pending_irq_info(void *opaque,
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
36
68
/* Pi2 and Pi3 requires SMP setup */
37
assert(pending > ARMV7M_EXCP_RESET && pending < s->num_irq);
69
if (version >= 2) {
38
70
binfo.smp_loader_start = SMPBOOT_ADDR;
39
- if (s->vectpending_is_s_banked) {
71
- binfo.write_secondary_boot = write_smpboot;
40
- targets_secure = true;
72
+ if (version == 2) {
41
- } else {
73
+ binfo.write_secondary_boot = write_smpboot;
42
- targets_secure = !exc_is_banked(pending) &&
74
+ } else {
43
- exc_targets_secure(s, pending);
75
+ binfo.write_secondary_boot = write_smpboot64;
44
- }
45
+ targets_secure = vectpending_targets_secure(s);
46
47
trace_nvic_get_pending_irq_info(pending, targets_secure);
48
49
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
50
/* VECTACTIVE */
51
val = cpu->env.v7m.exception;
52
/* VECTPENDING */
53
- val |= (s->vectpending & 0x1ff) << 12;
54
+ if (s->vectpending) {
55
+ /*
56
+ * From v8.1M VECTPENDING must read as 1 if accessed as
57
+ * NonSecure and the highest priority pending and enabled
58
+ * exception targets Secure.
59
+ */
60
+ int vp = s->vectpending;
61
+ if (!attrs.secure && arm_feature(&cpu->env, ARM_FEATURE_V8_1M) &&
62
+ vectpending_targets_secure(s)) {
63
+ vp = 1;
64
+ }
65
+ val |= (vp & 0x1ff) << 12;
76
+ }
66
+ }
77
binfo.secondary_cpu_reset_hook = reset_secondary;
67
/* ISRPENDING - set if any external IRQ is pending */
78
}
68
if (nvic_isrpending(s)) {
79
69
val |= (1 << 22);
80
--
70
--
81
2.16.2
71
2.20.1
82
72
83
73
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Missed in commit f3478392 "docs: Move deprecation, build
4
and license info out of system/"
5
6
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20210723065828.1336760-1-maozhongyi@cmss.chinamobile.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
configure | 2 +-
12
target/i386/cpu.c | 2 +-
13
MAINTAINERS | 2 +-
14
3 files changed, 3 insertions(+), 3 deletions(-)
15
16
diff --git a/configure b/configure
17
index XXXXXXX..XXXXXXX 100755
18
--- a/configure
19
+++ b/configure
20
@@ -XXX,XX +XXX,XX @@ fi
21
22
if test -n "${deprecated_features}"; then
23
echo "Warning, deprecated features enabled."
24
- echo "Please see docs/system/deprecated.rst"
25
+ echo "Please see docs/about/deprecated.rst"
26
echo " features: ${deprecated_features}"
27
fi
28
29
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/i386/cpu.c
32
+++ b/target/i386/cpu.c
33
@@ -XXX,XX +XXX,XX @@ static const X86CPUDefinition builtin_x86_defs[] = {
34
* none", but this is just for compatibility while libvirt isn't
35
* adapted to resolve CPU model versions before creating VMs.
36
* See "Runnability guarantee of CPU models" at
37
- * docs/system/deprecated.rst.
38
+ * docs/about/deprecated.rst.
39
*/
40
X86CPUVersion default_cpu_version = 1;
41
42
diff --git a/MAINTAINERS b/MAINTAINERS
43
index XXXXXXX..XXXXXXX 100644
44
--- a/MAINTAINERS
45
+++ b/MAINTAINERS
46
@@ -XXX,XX +XXX,XX @@ F: contrib/gitdm/*
47
48
Incompatible changes
49
R: libvir-list@redhat.com
50
-F: docs/system/deprecated.rst
51
+F: docs/about/deprecated.rst
52
53
Build System
54
------------
55
--
56
2.20.1
57
58
diff view generated by jsdifflib
1
From: Wei Huang <wei@redhat.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
For guest kernel that supports KASLR, the load address can change every
3
Currently, our only caller is sve_zcr_len_for_el, which has
4
time when guest VM runs. To find the physical base address correctly,
4
already masked the length extracted from ZCR_ELx, so the
5
current QEMU dump searches VMCOREINFO for the string "NUMBER(phys_base)=".
5
masking done here is a nop. But we will shortly have uses
6
However this string pattern is only available on x86_64. AArch64 uses a
6
from other locations, where the length will be unmasked.
7
different field, called "NUMBER(PHYS_OFFSET)=". This patch makes sure
8
QEMU dump uses the correct string on AArch64.
9
7
10
Signed-off-by: Wei Huang <wei@redhat.com>
8
Saturate the length to ARM_MAX_VQ instead of truncating to
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
9
the low 4 bits.
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.com
10
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Message-id: 20210723203344.968563-2-richard.henderson@linaro.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
---
15
dump.c | 14 +++++++++++---
16
target/arm/helper.c | 4 +++-
16
1 file changed, 11 insertions(+), 3 deletions(-)
17
1 file changed, 3 insertions(+), 1 deletion(-)
17
18
18
diff --git a/dump.c b/dump.c
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
19
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
20
--- a/dump.c
21
--- a/target/arm/helper.c
21
+++ b/dump.c
22
+++ b/target/arm/helper.c
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
23
@@ -XXX,XX +XXX,XX @@ static uint32_t sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
23
24
{
24
lines = g_strsplit((char *)vmci, "\n", -1);
25
uint32_t end_len;
25
for (i = 0; lines[i]; i++) {
26
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
27
- end_len = start_len &= 0xf;
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
28
+ start_len = MIN(start_len, ARM_MAX_VQ - 1);
28
+ const char *prefix = NULL;
29
+ end_len = start_len;
29
+
30
+
30
+ if (s->dump_info.d_machine == EM_X86_64) {
31
if (!test_bit(start_len, cpu->sve_vq_map)) {
31
+ prefix = "NUMBER(phys_base)=";
32
end_len = find_last_bit(cpu->sve_vq_map, start_len);
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
33
assert(end_len < start_len);
33
+ prefix = "NUMBER(PHYS_OFFSET)=";
34
+ }
35
+
36
+ if (prefix && g_str_has_prefix(lines[i], prefix)) {
37
+ if (qemu_strtou64(lines[i] + strlen(prefix), NULL, 16,
38
&phys_base) < 0) {
39
- warn_report("Failed to read NUMBER(phys_base)=");
40
+ warn_report("Failed to read %s", prefix);
41
} else {
42
s->dump_info.phys_base = phys_base;
43
}
44
--
34
--
45
2.16.2
35
2.20.1
46
36
47
37
diff view generated by jsdifflib
1
Our BCM2836 type is really a generic one that can be any of
1
From: Richard Henderson <richard.henderson@linaro.org>
2
the bcm283x family. Rename it accordingly. We change only
3
the names which are visible via the header file to the
4
rest of the QEMU code, leaving private function names
5
in bcm2836.c as they are.
6
2
7
This is a preliminary to making bcm283x be an abstract
3
Rename from sve_zcr_get_valid_len and make accessible
8
parent class to specific types for the bcm2836 and bcm2837.
4
from outside of helper.c.
9
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20210723203344.968563-3-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180313153458.26822-6-peter.maydell@linaro.org
14
---
10
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
11
target/arm/internals.h | 10 ++++++++++
16
hw/arm/bcm2836.c | 17 +++++++++--------
12
target/arm/helper.c | 4 ++--
17
hw/arm/raspi.c | 16 ++++++++--------
13
2 files changed, 12 insertions(+), 2 deletions(-)
18
3 files changed, 23 insertions(+), 22 deletions(-)
19
14
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/bcm2836.h
17
--- a/target/arm/internals.h
23
+++ b/include/hw/arm/bcm2836.h
18
+++ b/target/arm/internals.h
24
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ void arm_translate_init(void);
25
#include "hw/arm/bcm2835_peripherals.h"
20
void arm_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb);
26
#include "hw/intc/bcm2836_control.h"
21
#endif /* CONFIG_TCG */
27
22
28
-#define TYPE_BCM2836 "bcm2836"
23
+/**
29
-#define BCM2836(obj) OBJECT_CHECK(BCM2836State, (obj), TYPE_BCM2836)
24
+ * aarch64_sve_zcr_get_valid_len:
30
+#define TYPE_BCM283X "bcm283x"
25
+ * @cpu: cpu context
31
+#define BCM283X(obj) OBJECT_CHECK(BCM283XState, (obj), TYPE_BCM283X)
26
+ * @start_len: maximum len to consider
32
27
+ *
33
-#define BCM2836_NCPUS 4
28
+ * Return the maximum supported sve vector length <= @start_len.
34
+#define BCM283X_NCPUS 4
29
+ * Note that both @start_len and the return value are in units
35
30
+ * of ZCR_ELx.LEN, so the vector bit length is (x + 1) * 128.
36
-typedef struct BCM2836State {
31
+ */
37
+typedef struct BCM283XState {
32
+uint32_t aarch64_sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len);
38
/*< private >*/
33
39
DeviceState parent_obj;
34
enum arm_fprounding {
40
/*< public >*/
35
FPROUNDING_TIEEVEN,
41
@@ -XXX,XX +XXX,XX @@ typedef struct BCM2836State {
36
diff --git a/target/arm/helper.c b/target/arm/helper.c
42
char *cpu_type;
43
uint32_t enabled_cpus;
44
45
- ARMCPU cpus[BCM2836_NCPUS];
46
+ ARMCPU cpus[BCM283X_NCPUS];
47
BCM2836ControlState control;
48
BCM2835PeripheralState peripherals;
49
-} BCM2836State;
50
+} BCM283XState;
51
52
#endif /* BCM2836_H */
53
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
54
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/arm/bcm2836.c
38
--- a/target/arm/helper.c
56
+++ b/hw/arm/bcm2836.c
39
+++ b/target/arm/helper.c
57
@@ -XXX,XX +XXX,XX @@
40
@@ -XXX,XX +XXX,XX @@ int sve_exception_el(CPUARMState *env, int el)
58
41
return 0;
59
static void bcm2836_init(Object *obj)
42
}
43
44
-static uint32_t sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
45
+uint32_t aarch64_sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
60
{
46
{
61
- BCM2836State *s = BCM2836(obj);
47
uint32_t end_len;
62
+ BCM283XState *s = BCM283X(obj);
48
63
49
@@ -XXX,XX +XXX,XX @@ uint32_t sve_zcr_len_for_el(CPUARMState *env, int el)
64
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
50
zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[3]);
65
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
51
}
66
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
52
67
53
- return sve_zcr_get_valid_len(cpu, zcr_len);
68
static void bcm2836_realize(DeviceState *dev, Error **errp)
54
+ return aarch64_sve_zcr_get_valid_len(cpu, zcr_len);
69
{
70
- BCM2836State *s = BCM2836(dev);
71
+ BCM283XState *s = BCM283X(dev);
72
Object *obj;
73
Error *err = NULL;
74
int n;
75
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
76
/* common peripherals from bcm2835 */
77
78
obj = OBJECT(dev);
79
- for (n = 0; n < BCM2836_NCPUS; n++) {
80
+ for (n = 0; n < BCM283X_NCPUS; n++) {
81
object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
82
s->cpu_type);
83
object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
84
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
85
sysbus_connect_irq(SYS_BUS_DEVICE(&s->peripherals), 1,
86
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
87
88
- for (n = 0; n < BCM2836_NCPUS; n++) {
89
+ for (n = 0; n < BCM283X_NCPUS; n++) {
90
/* Mirror bcm2836, which has clusterid set to 0xf
91
* TODO: this should be converted to a property of ARM_CPU
92
*/
93
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
94
}
55
}
95
56
96
static Property bcm2836_props[] = {
57
static void zcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
97
- DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
98
- DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
99
+ DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
100
+ DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
101
+ BCM283X_NCPUS),
102
DEFINE_PROP_END_OF_LIST()
103
};
104
105
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
106
}
107
108
static const TypeInfo bcm2836_type_info = {
109
- .name = TYPE_BCM2836,
110
+ .name = TYPE_BCM283X,
111
.parent = TYPE_DEVICE,
112
- .instance_size = sizeof(BCM2836State),
113
+ .instance_size = sizeof(BCM283XState),
114
.instance_init = bcm2836_init,
115
.class_init = bcm2836_class_init,
116
};
117
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
118
index XXXXXXX..XXXXXXX 100644
119
--- a/hw/arm/raspi.c
120
+++ b/hw/arm/raspi.c
121
@@ -XXX,XX +XXX,XX @@
122
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
123
124
typedef struct RasPiState {
125
- BCM2836State soc;
126
+ BCM283XState soc;
127
MemoryRegion ram;
128
} RasPiState;
129
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
131
BusState *bus;
132
DeviceState *carddev;
133
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM2836);
135
+ object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
136
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
137
&error_abort);
138
139
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
140
mc->no_floppy = 1;
141
mc->no_cdrom = 1;
142
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
143
- mc->max_cpus = BCM2836_NCPUS;
144
- mc->min_cpus = BCM2836_NCPUS;
145
- mc->default_cpus = BCM2836_NCPUS;
146
+ mc->max_cpus = BCM283X_NCPUS;
147
+ mc->min_cpus = BCM283X_NCPUS;
148
+ mc->default_cpus = BCM283X_NCPUS;
149
mc->default_ram_size = 1024 * 1024 * 1024;
150
mc->ignore_memory_transaction_failures = true;
151
};
152
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_init(MachineClass *mc)
153
mc->no_floppy = 1;
154
mc->no_cdrom = 1;
155
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53");
156
- mc->max_cpus = BCM2836_NCPUS;
157
- mc->min_cpus = BCM2836_NCPUS;
158
- mc->default_cpus = BCM2836_NCPUS;
159
+ mc->max_cpus = BCM283X_NCPUS;
160
+ mc->min_cpus = BCM283X_NCPUS;
161
+ mc->default_cpus = BCM283X_NCPUS;
162
mc->default_ram_size = 1024 * 1024 * 1024;
163
}
164
DEFINE_MACHINE("raspi3", raspi3_machine_init)
165
--
58
--
166
2.16.2
59
2.20.1
167
60
168
61
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Code of imx_update() is slightly confusing since the "flags" variable
3
Mirror the behavour of /proc/sys/abi/sve_default_vector_length
4
doesn't really corespond to anything in real hardware and server as a
4
under the real linux kernel. We have no way of passing along
5
kitchensink accumulating events normally reported via USR1 and USR2
5
a real default across exec like the kernel can, but this is a
6
registers.
6
decent way of adjusting the startup vector length of a process.
7
7
8
Change the code to explicitly evaluate state of interrupts reported
8
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/482
9
via USR1 and USR2 against corresponding masking bits and use the to
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
detemine if IRQ line should be asserted or not.
11
12
NOTE: Check for UTS1_TXEMPTY being set has been dropped for two
13
reasons:
14
15
1. Emulation code implements a single character FIFO, so this flag
16
will always be set since characters are trasmitted as a part of
17
the code emulating "push" into the FIFO
18
19
2. imx_update() is really just a function doing ORing and maksing
20
of reported events, so checking for UTS1_TXEMPTY should happen,
21
if it's ever really needed should probably happen outside of
22
it.
23
24
Cc: qemu-devel@nongnu.org
25
Cc: qemu-arm@nongnu.org
26
Cc: Bill Paul <wpaul@windriver.com>
27
Cc: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
29
Message-id: 20180315191141.6789-1-andrew.smirnov@gmail.com
30
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20210723203344.968563-4-richard.henderson@linaro.org
12
[PMM: tweaked docs formatting, document -1 special-case,
13
added fixup patch from RTH mentioning QEMU's maximum veclen.]
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
---
15
---
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
16
docs/system/arm/cpu-features.rst | 15 ++++++++
34
1 file changed, 16 insertions(+), 8 deletions(-)
17
target/arm/cpu.h | 5 +++
18
target/arm/cpu.c | 14 ++++++--
19
target/arm/cpu64.c | 60 ++++++++++++++++++++++++++++++++
20
4 files changed, 92 insertions(+), 2 deletions(-)
35
21
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
22
diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst
37
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/char/imx_serial.c
24
--- a/docs/system/arm/cpu-features.rst
39
+++ b/hw/char/imx_serial.c
25
+++ b/docs/system/arm/cpu-features.rst
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
26
@@ -XXX,XX +XXX,XX @@ verbose command lines. However, the recommended way to select vector
41
27
lengths is to explicitly enable each desired length. Therefore only
42
static void imx_update(IMXSerialState *s)
28
example's (1), (4), and (6) exhibit recommended uses of the properties.
29
30
+SVE User-mode Default Vector Length Property
31
+--------------------------------------------
32
+
33
+For qemu-aarch64, the cpu property ``sve-default-vector-length=N`` is
34
+defined to mirror the Linux kernel parameter file
35
+``/proc/sys/abi/sve_default_vector_length``. The default length, ``N``,
36
+is in units of bytes and must be between 16 and 8192.
37
+If not specified, the default vector length is 64.
38
+
39
+If the default length is larger than the maximum vector length enabled,
40
+the actual vector length will be reduced. Note that the maximum vector
41
+length supported by QEMU is 256.
42
+
43
+If this property is set to ``-1`` then the default vector length
44
+is set to the maximum possible length.
45
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/arm/cpu.h
48
+++ b/target/arm/cpu.h
49
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
50
/* Used to set the maximum vector length the cpu will support. */
51
uint32_t sve_max_vq;
52
53
+#ifdef CONFIG_USER_ONLY
54
+ /* Used to set the default vector length at process start. */
55
+ uint32_t sve_default_vq;
56
+#endif
57
+
58
/*
59
* In sve_vq_map each set bit is a supported vector length of
60
* (bit-number + 1) * 16 bytes, i.e. each bit number + 1 is the vector
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_reset(DeviceState *dev)
66
env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 16, 2, 3);
67
/* with reasonable vector length */
68
if (cpu_isar_feature(aa64_sve, cpu)) {
69
- env->vfp.zcr_el[1] = MIN(cpu->sve_max_vq - 1, 3);
70
+ env->vfp.zcr_el[1] =
71
+ aarch64_sve_zcr_get_valid_len(cpu, cpu->sve_default_vq - 1);
72
}
73
/*
74
* Enable TBI0 but not TBI1.
75
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_initfn(Object *obj)
76
QLIST_INIT(&cpu->pre_el_change_hooks);
77
QLIST_INIT(&cpu->el_change_hooks);
78
79
-#ifndef CONFIG_USER_ONLY
80
+#ifdef CONFIG_USER_ONLY
81
+# ifdef TARGET_AARCH64
82
+ /*
83
+ * The linux kernel defaults to 512-bit vectors, when sve is supported.
84
+ * See documentation for /proc/sys/abi/sve_default_vector_length, and
85
+ * our corresponding sve-default-vector-length cpu property.
86
+ */
87
+ cpu->sve_default_vq = 4;
88
+# endif
89
+#else
90
/* Our inbound IRQ and FIQ lines */
91
if (kvm_enabled()) {
92
/* VIRQ and VFIQ are unused with KVM but we add them to maintain
93
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/target/arm/cpu64.c
96
+++ b/target/arm/cpu64.c
97
@@ -XXX,XX +XXX,XX @@ static void cpu_arm_set_sve(Object *obj, bool value, Error **errp)
98
cpu->isar.id_aa64pfr0 = t;
99
}
100
101
+#ifdef CONFIG_USER_ONLY
102
+/* Mirror linux /proc/sys/abi/sve_default_vector_length. */
103
+static void cpu_arm_set_sve_default_vec_len(Object *obj, Visitor *v,
104
+ const char *name, void *opaque,
105
+ Error **errp)
106
+{
107
+ ARMCPU *cpu = ARM_CPU(obj);
108
+ int32_t default_len, default_vq, remainder;
109
+
110
+ if (!visit_type_int32(v, name, &default_len, errp)) {
111
+ return;
112
+ }
113
+
114
+ /* Undocumented, but the kernel allows -1 to indicate "maximum". */
115
+ if (default_len == -1) {
116
+ cpu->sve_default_vq = ARM_MAX_VQ;
117
+ return;
118
+ }
119
+
120
+ default_vq = default_len / 16;
121
+ remainder = default_len % 16;
122
+
123
+ /*
124
+ * Note that the 512 max comes from include/uapi/asm/sve_context.h
125
+ * and is the maximum architectural width of ZCR_ELx.LEN.
126
+ */
127
+ if (remainder || default_vq < 1 || default_vq > 512) {
128
+ error_setg(errp, "cannot set sve-default-vector-length");
129
+ if (remainder) {
130
+ error_append_hint(errp, "Vector length not a multiple of 16\n");
131
+ } else if (default_vq < 1) {
132
+ error_append_hint(errp, "Vector length smaller than 16\n");
133
+ } else {
134
+ error_append_hint(errp, "Vector length larger than %d\n",
135
+ 512 * 16);
136
+ }
137
+ return;
138
+ }
139
+
140
+ cpu->sve_default_vq = default_vq;
141
+}
142
+
143
+static void cpu_arm_get_sve_default_vec_len(Object *obj, Visitor *v,
144
+ const char *name, void *opaque,
145
+ Error **errp)
146
+{
147
+ ARMCPU *cpu = ARM_CPU(obj);
148
+ int32_t value = cpu->sve_default_vq * 16;
149
+
150
+ visit_type_int32(v, name, &value, errp);
151
+}
152
+#endif
153
+
154
void aarch64_add_sve_properties(Object *obj)
43
{
155
{
44
- uint32_t flags;
156
uint32_t vq;
45
+ uint32_t usr1;
157
@@ -XXX,XX +XXX,XX @@ void aarch64_add_sve_properties(Object *obj)
46
+ uint32_t usr2;
158
object_property_add(obj, name, "bool", cpu_arm_get_sve_vq,
47
+ uint32_t mask;
159
cpu_arm_set_sve_vq, NULL, NULL);
48
160
}
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
161
+
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
162
+#ifdef CONFIG_USER_ONLY
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
163
+ /* Mirror linux /proc/sys/abi/sve_default_vector_length. */
52
- } else {
164
+ object_property_add(obj, "sve-default-vector-length", "int32",
53
- flags &= ~USR1_TRDY;
165
+ cpu_arm_get_sve_default_vec_len,
54
- }
166
+ cpu_arm_set_sve_default_vec_len, NULL, NULL);
55
+ /*
167
+#endif
56
+ * Lucky for us TRDY and RRDY has the same offset in both USR1 and
57
+ * UCR1, so we can get away with something as simple as the
58
+ * following:
59
+ */
60
+ usr1 = s->usr1 & s->ucr1 & (USR1_TRDY | USR1_RRDY);
61
+ /*
62
+ * Bits that we want in USR2 are not as conveniently laid out,
63
+ * unfortunately.
64
+ */
65
+ mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
66
+ usr2 = s->usr2 & mask;
67
68
- qemu_set_irq(s->irq, !!flags);
69
+ qemu_set_irq(s->irq, usr1 || usr2);
70
}
168
}
71
169
72
static void imx_serial_reset(IMXSerialState *s)
170
void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp)
73
--
171
--
74
2.16.2
172
2.20.1
75
173
76
174
diff view generated by jsdifflib
1
The bcm2837 is pretty similar to the bcm2836, but it does have
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
some differences. Notably, the MPIDR affinity aff1 values it
3
sets for the CPUs are 0x0, rather than the 0xf that the bcm2836
4
uses, and if this is wrong Linux will not boot.
5
2
6
Rather than trying to have one device with properties that
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
configure it differently for the two cases, create two
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
separate QOM devices for the two SoCs. We use the same approach
5
Message-id: 20210726150953.1218690-1-f4bug@amsat.org
9
as hw/arm/aspeed_soc.c and share code and have a data table
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
that might differ per-SoC. For the moment the two types don't
7
---
11
actually have different behaviour.
8
hw/arm/nseries.c | 2 +-
9
1 file changed, 1 insertion(+), 1 deletion(-)
12
10
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20180313153458.26822-7-peter.maydell@linaro.org
16
---
17
include/hw/arm/bcm2836.h | 19 +++++++++++++++++++
18
hw/arm/bcm2836.c | 37 ++++++++++++++++++++++++++++++++-----
19
hw/arm/raspi.c | 3 ++-
20
3 files changed, 53 insertions(+), 6 deletions(-)
21
22
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
23
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/bcm2836.h
13
--- a/hw/arm/nseries.c
25
+++ b/include/hw/arm/bcm2836.h
14
+++ b/hw/arm/nseries.c
26
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@ static uint32_t mipid_txrx(void *opaque, uint32_t cmd, int len)
27
16
default:
28
#define BCM283X_NCPUS 4
17
bad_cmd:
29
18
qemu_log_mask(LOG_GUEST_ERROR,
30
+/* These type names are for specific SoCs; other than instantiating
19
- "%s: unknown command %02x\n", __func__, s->cmd);
31
+ * them, code using these devices should always handle them via the
20
+ "%s: unknown command 0x%02x\n", __func__, s->cmd);
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
21
break;
33
+ */
22
}
34
+#define TYPE_BCM2836 "bcm2836"
35
+#define TYPE_BCM2837 "bcm2837"
36
+
37
typedef struct BCM283XState {
38
/*< private >*/
39
DeviceState parent_obj;
40
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
41
BCM2835PeripheralState peripherals;
42
} BCM283XState;
43
44
+typedef struct BCM283XInfo BCM283XInfo;
45
+
46
+typedef struct BCM283XClass {
47
+ DeviceClass parent_class;
48
+ const BCM283XInfo *info;
49
+} BCM283XClass;
50
+
51
+#define BCM283X_CLASS(klass) \
52
+ OBJECT_CLASS_CHECK(BCM283XClass, (klass), TYPE_BCM283X)
53
+#define BCM283X_GET_CLASS(obj) \
54
+ OBJECT_GET_CLASS(BCM283XClass, (obj), TYPE_BCM283X)
55
+
56
#endif /* BCM2836_H */
57
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/arm/bcm2836.c
60
+++ b/hw/arm/bcm2836.c
61
@@ -XXX,XX +XXX,XX @@
62
/* "QA7" (Pi2) interrupt controller and mailboxes etc. */
63
#define BCM2836_CONTROL_BASE 0x40000000
64
65
+struct BCM283XInfo {
66
+ const char *name;
67
+};
68
+
69
+static const BCM283XInfo bcm283x_socs[] = {
70
+ {
71
+ .name = TYPE_BCM2836,
72
+ },
73
+ {
74
+ .name = TYPE_BCM2837,
75
+ },
76
+};
77
+
78
static void bcm2836_init(Object *obj)
79
{
80
BCM283XState *s = BCM283X(obj);
81
@@ -XXX,XX +XXX,XX @@ static Property bcm2836_props[] = {
82
DEFINE_PROP_END_OF_LIST()
83
};
84
85
-static void bcm2836_class_init(ObjectClass *oc, void *data)
86
+static void bcm283x_class_init(ObjectClass *oc, void *data)
87
{
88
DeviceClass *dc = DEVICE_CLASS(oc);
89
+ BCM283XClass *bc = BCM283X_CLASS(oc);
90
91
- dc->props = bcm2836_props;
92
+ bc->info = data;
93
dc->realize = bcm2836_realize;
94
+ dc->props = bcm2836_props;
95
}
96
97
-static const TypeInfo bcm2836_type_info = {
98
+static const TypeInfo bcm283x_type_info = {
99
.name = TYPE_BCM283X,
100
.parent = TYPE_DEVICE,
101
.instance_size = sizeof(BCM283XState),
102
.instance_init = bcm2836_init,
103
- .class_init = bcm2836_class_init,
104
+ .class_size = sizeof(BCM283XClass),
105
+ .abstract = true,
106
};
107
108
static void bcm2836_register_types(void)
109
{
110
- type_register_static(&bcm2836_type_info);
111
+ int i;
112
+
113
+ type_register_static(&bcm283x_type_info);
114
+ for (i = 0; i < ARRAY_SIZE(bcm283x_socs); i++) {
115
+ TypeInfo ti = {
116
+ .name = bcm283x_socs[i].name,
117
+ .parent = TYPE_BCM283X,
118
+ .class_init = bcm283x_class_init,
119
+ .class_data = (void *) &bcm283x_socs[i],
120
+ };
121
+ type_register(&ti);
122
+ }
123
}
124
125
type_init(bcm2836_register_types)
126
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
127
index XXXXXXX..XXXXXXX 100644
128
--- a/hw/arm/raspi.c
129
+++ b/hw/arm/raspi.c
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
131
BusState *bus;
132
DeviceState *carddev;
133
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
135
+ object_initialize(&s->soc, sizeof(s->soc),
136
+ version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
137
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
138
&error_abort);
139
23
140
--
24
--
141
2.16.2
25
2.20.1
142
26
143
27
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
The sabrelite machine model used by qemu-system-arm is based on the
3
The macro used to calculate the maximum memory size of the MMIO region
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
4
had a mistake, causing all GPIO models to create a mapping of 0x9D8.
5
controller which is supported in QEMU using the imx_fec.c module
5
The intent was to have it be 0x9D8 - 0x800.
6
(actually called imx.enet for this model.)
7
6
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
7
This extra size doesn't matter on ast2400 and ast2500, which have a 4KB
9
imx.enet device like this:
8
region set aside for the GPIO controller.
10
9
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
10
On the ast2600 the 3.3V and 1.8V GPIO controllers are 2KB apart, so the
12
#define FSL_IMX6_ENET_MAC_IRQ 119
11
regions would overlap. Worse was the 1.8V controller would map over the
12
top of the following peripheral, which happens to be the RTC.
13
13
14
According to https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf,
14
The mmio region used by each device is a maximum of 2KB, so avoid the
15
page 225, in Table 3-1. ARM Cortex A9 domain interrupt summary,
15
calculations and hard code this as the maximum.
16
interrupts are as follows.
17
16
18
150 ENET MAC 0 IRQ
17
Fixes: 36d737ee82b2 ("hw/gpio: Add in AST2600 specific implementation")
19
151 ENET MAC 0 1588 Timer interrupt
18
Signed-off-by: Joel Stanley <joel@jms.id.au>
20
19
Reviewed-by: Rashmica Gupta <rashmica.g@gmail.com>
21
where
20
Reviewed-by: Cédric Le Goater <clg@kaod.org>
22
21
Message-id: 20210713065854.134634-2-joel@jms.id.au
23
150 - 32 == 118
22
[PMM: fix autocorrect error in commit message]
24
151 - 32 == 119
25
26
In other words, the vector definitions in the fsl-imx6.h file are reversed.
27
28
Fixing the interrupts alone causes problems with older Linux kernels:
29
The Ethernet interface will fail to probe with Linux v4.9 and earlier.
30
Linux v4.1 and earlier will crash due to a bug in Ethernet driver probe
31
error handling. This is a Linux kernel problem, not a qemu problem:
32
the Linux kernel only worked by accident since it requested both interrupts.
33
34
For backward compatibility, generate the Ethernet interrupt on both interrupt
35
lines. This was shown to work from all Linux kernel releases starting with
36
v3.16.
37
38
Link: https://bugs.launchpad.net/qemu/+bug/1753309
39
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
40
Message-id: 1520723090-22130-1-git-send-email-linux@roeck-us.net
41
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
24
---
44
include/hw/arm/fsl-imx6.h | 4 ++--
25
hw/gpio/aspeed_gpio.c | 3 +--
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
26
1 file changed, 1 insertion(+), 2 deletions(-)
46
2 files changed, 29 insertions(+), 3 deletions(-)
47
27
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
28
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
49
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/fsl-imx6.h
30
--- a/hw/gpio/aspeed_gpio.c
51
+++ b/include/hw/arm/fsl-imx6.h
31
+++ b/hw/gpio/aspeed_gpio.c
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
32
@@ -XXX,XX +XXX,XX @@
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
33
#define GPIO_1_8V_MEM_SIZE 0x9D8
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
34
#define GPIO_1_8V_REG_ARRAY_SIZE ((GPIO_1_8V_MEM_SIZE - \
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
35
GPIO_1_8V_REG_OFFSET) >> 2)
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
36
-#define GPIO_MAX_MEM_SIZE MAX(GPIO_3_6V_MEM_SIZE, GPIO_1_8V_MEM_SIZE)
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
37
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
38
static int aspeed_evaluate_irq(GPIOSets *regs, int gpio_prev_high, int gpio)
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
60
#define FSL_IMX6_PCIE1_IRQ 120
61
#define FSL_IMX6_PCIE2_IRQ 121
62
#define FSL_IMX6_PCIE3_IRQ 122
63
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/net/imx_fec.c
66
+++ b/hw/net/imx_fec.c
67
@@ -XXX,XX +XXX,XX @@ static void imx_enet_write_bd(IMXENETBufDesc *bd, dma_addr_t addr)
68
69
static void imx_eth_update(IMXFECState *s)
70
{
39
{
71
- if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] & ENET_INT_TS_TIMER) {
40
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_realize(DeviceState *dev, Error **errp)
72
+ /*
41
}
73
+ * Previous versions of qemu had the ENET_INT_MAC and ENET_INT_TS_TIMER
42
74
+ * interrupts swapped. This worked with older versions of Linux (4.14
43
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_gpio_ops, s,
75
+ * and older) since Linux associated both interrupt lines with Ethernet
44
- TYPE_ASPEED_GPIO, GPIO_MAX_MEM_SIZE);
76
+ * MAC interrupts. Specifically,
45
+ TYPE_ASPEED_GPIO, 0x800);
77
+ * - Linux 4.15 and later have separate interrupt handlers for the MAC and
46
78
+ * timer interrupts. Those versions of Linux fail with versions of QEMU
47
sysbus_init_mmio(sbd, &s->iomem);
79
+ * with swapped interrupt assignments.
48
}
80
+ * - In linux 4.14, both interrupt lines were registered with the Ethernet
81
+ * MAC interrupt handler. As a result, all versions of qemu happen to
82
+ * work, though that is accidental.
83
+ * - In Linux 4.9 and older, the timer interrupt was registered directly
84
+ * with the Ethernet MAC interrupt handler. The MAC interrupt was
85
+ * redirected to a GPIO interrupt to work around erratum ERR006687.
86
+ * This was implemented using the SOC's IOMUX block. In qemu, this GPIO
87
+ * interrupt never fired since IOMUX is currently not supported in qemu.
88
+ * Linux instead received MAC interrupts on the timer interrupt.
89
+ * As a result, qemu versions with the swapped interrupt assignment work,
90
+ * albeit accidentally, but qemu versions with the correct interrupt
91
+ * assignment fail.
92
+ *
93
+ * To ensure that all versions of Linux work, generate ENET_INT_MAC
94
+ * interrrupts on both interrupt lines. This should be changed if and when
95
+ * qemu supports IOMUX.
96
+ */
97
+ if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] &
98
+ (ENET_INT_MAC | ENET_INT_TS_TIMER)) {
99
qemu_set_irq(s->irq[1], 1);
100
} else {
101
qemu_set_irq(s->irq[1], 0);
102
--
49
--
103
2.16.2
50
2.20.1
104
51
105
52
diff view generated by jsdifflib