1
ARM queue: nothing particularly exciting, but 18 patches
1
Arm patch queue -- these are all bug fix patches but we might
2
is enough to send out.
2
as well put them in to rc0...
3
3
4
thanks
4
thanks
5
-- PMM
5
-- PMM
6
6
7
The following changes since commit 3dabde1128b671f36ac6cb36b97b273139964420:
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
8
8
9
Merge remote-tracking branch 'remotes/dgilbert/tags/pull-hmp-20170914' into staging (2017-09-14 16:33:02 +0100)
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
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-20170914
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
14
14
15
for you to fetch changes up to ce3bc112cdb1d462e2d52eaa17a7314e7f3af504:
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
16
16
17
mps2-an511: Fix wiring of UART overflow interrupt lines (2017-09-14 18:43:19 +0100)
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
18
18
19
----------------------------------------------------------------
19
----------------------------------------------------------------
20
target-arm queue:
20
target-arm queue:
21
* v7M: various code cleanups
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
22
* v7M: set correct BFSR bits on bus fault
22
* dump: Update correct kdump phys_base field for AArch64
23
* v7M: clear exclusive monitor on reset and exception entry/exit
23
* char: i.MX: Add support for "TX complete" interrupt
24
* v7M: don't apply priority mask to negative priorities
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
25
* zcu102: support 'secure' and 'virtualization' machine properties
25
to boot a Debian Linux kernel on raspi3
26
* aarch64: fix ERET single stepping
27
* gpex: implement PCI INTx routing
28
* mps2-an511: fix UART overflow interrupt line wiring
29
26
30
----------------------------------------------------------------
27
----------------------------------------------------------------
31
Alistair Francis (5):
28
Andrey Smirnov (2):
32
xlnx-ep108: Rename to ZCU102
29
char: i.MX: Simplify imx_update()
33
xlnx-zcu102: Manually create the machines
30
char: i.MX: Add support for "TX complete" interrupt
34
xlnx-zcu102: Add a machine level secure property
35
xlnx-zcu102: Add a machine level virtualization property
36
xlnx-zcu102: Mark the EP108 machine as deprecated
37
31
38
Jaroslaw Pelczar (1):
32
Guenter Roeck (1):
39
AArch64: Fix single stepping of ERET instruction
33
fsl-imx6: Swap Ethernet interrupt defines
40
34
41
Peter Maydell (8):
35
Peter Maydell (9):
42
target/arm: Use M_REG_NUM_BANKS rather than hardcoding 2
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
43
target/arm: Clear exclusive monitor on v7M reset, exception entry/exit
37
hw/arm/boot: assert that secure_boot and secure_board_setup are false for AArch64
44
target/arm: Get PRECISERR and IBUSERR the right way round
38
hw/arm/boot: If booting a kernel in EL2, set SCR_EL3.HCE
45
nvic: Don't apply group priority mask to negative priorities
39
hw/arm/bcm2386: Fix parent type of bcm2386
46
target/arm: Remove unnecessary '| 0xf0000000' from do_v7m_exception_exit()
40
hw/arm/bcm2836: Rename bcm2836 type/struct to bcm283x
47
target/arm: Add and use defines for EXCRET constants
41
hw/arm/bcm2836: Create proper bcm2837 device
48
target/arm: Rename 'type' to 'excret' in do_v7m_exception_exit()
42
hw/arm/bcm2836: Use correct affinity values for BCM2837
49
mps2-an511: Fix wiring of UART overflow interrupt lines
43
hw/arm/bcm2836: Hardcode correct CPU type
44
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs
50
45
51
Pranavkumar Sawargaonkar (3):
46
Wei Huang (1):
52
hw/pci-host/gpex: Set INTx index/gsi mapping
47
dump: Update correct kdump phys_base field for AArch64
53
hw/arm/virt: Set INTx/gsi mapping
54
hw/pci-host/gpex: Implement PCI INTx routing
55
48
56
Richard Henderson (1):
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
57
target/arm: Avoid an extra temporary for store_exclusive
50
include/hw/arm/fsl-imx6.h | 4 +-
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(-)
58
59
59
hw/arm/Makefile.objs | 2 +-
60
include/hw/arm/xlnx-zynqmp.h | 2 +
61
include/hw/pci-host/gpex.h | 3 +
62
target/arm/cpu.h | 35 +++---
63
target/arm/internals.h | 20 ++++
64
hw/arm/mps2.c | 4 +-
65
hw/arm/virt.c | 1 +
66
hw/arm/xlnx-ep108.c | 139 -----------------------
67
hw/arm/xlnx-zcu102.c | 259 +++++++++++++++++++++++++++++++++++++++++++
68
hw/arm/xlnx-zynqmp.c | 3 +-
69
hw/intc/armv7m_nvic.c | 11 +-
70
hw/pci-host/gpex.c | 22 ++++
71
target/arm/cpu.c | 6 +
72
target/arm/helper.c | 43 ++++---
73
target/arm/op_helper.c | 2 +-
74
target/arm/translate-a64.c | 27 ++---
75
16 files changed, 382 insertions(+), 197 deletions(-)
76
delete mode 100644 hw/arm/xlnx-ep108.c
77
create mode 100644 hw/arm/xlnx-zcu102.c
78
diff view generated by jsdifflib
Deleted patch
1
Use a symbolic constant M_REG_NUM_BANKS for the array size for
2
registers which are banked by M profile security state, rather
3
than hardcoding lots of 2s.
4
1
5
Suggested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
9
Message-id: 1505137930-13255-2-git-send-email-peter.maydell@linaro.org
10
---
11
target/arm/cpu.h | 35 +++++++++++++++++++----------------
12
1 file changed, 19 insertions(+), 16 deletions(-)
13
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.h
17
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@
19
* accessed via env->registerfield[env->v7m.secure] (whether the security
20
* extension is implemented or not).
21
*/
22
-#define M_REG_NS 0
23
-#define M_REG_S 1
24
+enum {
25
+ M_REG_NS = 0,
26
+ M_REG_S = 1,
27
+ M_REG_NUM_BANKS = 2,
28
+};
29
30
/* ARM-specific interrupt pending bits. */
31
#define CPU_INTERRUPT_FIQ CPU_INTERRUPT_TGT_EXT_1
32
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
33
uint32_t other_sp;
34
uint32_t other_ss_msp;
35
uint32_t other_ss_psp;
36
- uint32_t vecbase[2];
37
- uint32_t basepri[2];
38
- uint32_t control[2];
39
- uint32_t ccr[2]; /* Configuration and Control */
40
- uint32_t cfsr[2]; /* Configurable Fault Status */
41
+ uint32_t vecbase[M_REG_NUM_BANKS];
42
+ uint32_t basepri[M_REG_NUM_BANKS];
43
+ uint32_t control[M_REG_NUM_BANKS];
44
+ uint32_t ccr[M_REG_NUM_BANKS]; /* Configuration and Control */
45
+ uint32_t cfsr[M_REG_NUM_BANKS]; /* Configurable Fault Status */
46
uint32_t hfsr; /* HardFault Status */
47
uint32_t dfsr; /* Debug Fault Status Register */
48
- uint32_t mmfar[2]; /* MemManage Fault Address */
49
+ uint32_t mmfar[M_REG_NUM_BANKS]; /* MemManage Fault Address */
50
uint32_t bfar; /* BusFault Address */
51
- unsigned mpu_ctrl[2]; /* MPU_CTRL */
52
+ unsigned mpu_ctrl[M_REG_NUM_BANKS]; /* MPU_CTRL */
53
int exception;
54
- uint32_t primask[2];
55
- uint32_t faultmask[2];
56
+ uint32_t primask[M_REG_NUM_BANKS];
57
+ uint32_t faultmask[M_REG_NUM_BANKS];
58
uint32_t secure; /* Is CPU in Secure state? (not guest visible) */
59
} v7m;
60
61
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
62
uint32_t *drbar;
63
uint32_t *drsr;
64
uint32_t *dracr;
65
- uint32_t rnr[2];
66
+ uint32_t rnr[M_REG_NUM_BANKS];
67
} pmsav7;
68
69
/* PMSAv8 MPU */
70
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
71
* pmsav7.rnr (region number register)
72
* pmsav7_dregion (number of configured regions)
73
*/
74
- uint32_t *rbar[2];
75
- uint32_t *rlar[2];
76
- uint32_t mair0[2];
77
- uint32_t mair1[2];
78
+ uint32_t *rbar[M_REG_NUM_BANKS];
79
+ uint32_t *rlar[M_REG_NUM_BANKS];
80
+ uint32_t mair0[M_REG_NUM_BANKS];
81
+ uint32_t mair1[M_REG_NUM_BANKS];
82
} pmsav8;
83
84
void *nvic;
85
--
86
2.7.4
87
88
diff view generated by jsdifflib
1
From: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
1
From: Guenter Roeck <linux@roeck-us.net>
2
2
3
Now we are able to retrieve the gsi from the INTx pin, let's
3
The sabrelite machine model used by qemu-system-arm is based on the
4
enable intx_to_irq routing. From that point on, irqfd becomes
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
5
usable along with INTx when assigning a PCIe device.
5
controller which is supported in QEMU using the imx_fec.c module
6
(actually called imx.enet for this model.)
6
7
7
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
8
Signed-off-by: Tushar Jagad <tushar.jagad@linaro.org>
9
imx.enet device like this:
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
10
10
Reviewed-by: Andrew Jones <drjones@redhat.com>
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
11
Tested-by: Feng Kan <fkan@apm.com>
12
#define FSL_IMX6_ENET_MAC_IRQ 119
12
Message-id: 1505296004-6798-4-git-send-email-eric.auger@redhat.com
13
14
According to https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf,
15
page 225, in Table 3-1. ARM Cortex A9 domain interrupt summary,
16
interrupts are as follows.
17
18
150 ENET MAC 0 IRQ
19
151 ENET MAC 0 1588 Timer interrupt
20
21
where
22
23
150 - 32 == 118
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>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
43
---
15
hw/pci-host/gpex.c | 12 ++++++++++++
44
include/hw/arm/fsl-imx6.h | 4 ++--
16
1 file changed, 12 insertions(+)
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
46
2 files changed, 29 insertions(+), 3 deletions(-)
17
47
18
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
19
index XXXXXXX..XXXXXXX 100644
49
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/pci-host/gpex.c
50
--- a/include/hw/arm/fsl-imx6.h
21
+++ b/hw/pci-host/gpex.c
51
+++ b/include/hw/arm/fsl-imx6.h
22
@@ -XXX,XX +XXX,XX @@ int gpex_set_irq_num(GPEXHost *s, int index, int gsi)
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
23
return 0;
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
24
}
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
25
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
26
+static PCIINTxRoute gpex_route_intx_pin_to_irq(void *opaque, int pin)
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
27
+{
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
28
+ PCIINTxRoute route;
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
29
+ GPEXHost *s = opaque;
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
30
+
60
#define FSL_IMX6_PCIE1_IRQ 120
31
+ route.mode = PCI_INTX_ENABLED;
61
#define FSL_IMX6_PCIE2_IRQ 121
32
+ route.irq = s->irq_num[pin];
62
#define FSL_IMX6_PCIE3_IRQ 122
33
+
63
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
34
+ return route;
64
index XXXXXXX..XXXXXXX 100644
35
+}
65
--- a/hw/net/imx_fec.c
36
+
66
+++ b/hw/net/imx_fec.c
37
static void gpex_host_realize(DeviceState *dev, Error **errp)
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)
38
{
70
{
39
PCIHostState *pci = PCI_HOST_BRIDGE(dev);
71
- if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] & ENET_INT_TS_TIMER) {
40
@@ -XXX,XX +XXX,XX @@ static void gpex_host_realize(DeviceState *dev, Error **errp)
72
+ /*
41
&s->io_ioport, 0, 4, TYPE_PCIE_BUS);
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
qdev_set_parent_bus(DEVICE(&s->gpex_root), BUS(pci->bus));
75
+ * and older) since Linux associated both interrupt lines with Ethernet
44
+ pci_bus_set_route_irq_fn(pci->bus, gpex_route_intx_pin_to_irq);
76
+ * MAC interrupts. Specifically,
45
qdev_init_nofail(DEVICE(&s->gpex_root));
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
79
+ * with swapped interrupt assignments.
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);
48
--
102
--
49
2.7.4
103
2.16.2
50
104
51
105
diff view generated by jsdifflib
1
From: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
1
From: Wei Huang <wei@redhat.com>
2
2
3
Let's provide the GPEX host bridge with the INTx/gsi mapping. This is
3
For guest kernel that supports KASLR, the load address can change every
4
needed for INTx/gsi routing.
4
time when guest VM runs. To find the physical base address correctly,
5
current QEMU dump searches VMCOREINFO for the string "NUMBER(phys_base)=".
6
However this string pattern is only available on x86_64. AArch64 uses a
7
different field, called "NUMBER(PHYS_OFFSET)=". This patch makes sure
8
QEMU dump uses the correct string on AArch64.
5
9
6
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
10
Signed-off-by: Wei Huang <wei@redhat.com>
7
Signed-off-by: Tushar Jagad <tushar.jagad@linaro.org>
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
8
Signed-off-by: Eric Auger <eric.auger@redhat.com>
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.com
9
Reviewed-by: Andrew Jones <drjones@redhat.com>
10
Tested-by: Feng Kan <fkan@apm.com>
11
Message-id: 1505296004-6798-3-git-send-email-eric.auger@redhat.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
---
14
hw/arm/virt.c | 1 +
15
dump.c | 14 +++++++++++---
15
1 file changed, 1 insertion(+)
16
1 file changed, 11 insertions(+), 3 deletions(-)
16
17
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
diff --git a/dump.c b/dump.c
18
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/virt.c
20
--- a/dump.c
20
+++ b/hw/arm/virt.c
21
+++ b/dump.c
21
@@ -XXX,XX +XXX,XX @@ static void create_pcie(const VirtMachineState *vms, qemu_irq *pic)
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
22
23
23
for (i = 0; i < GPEX_NUM_IRQS; i++) {
24
lines = g_strsplit((char *)vmci, "\n", -1);
24
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
25
for (i = 0; lines[i]; i++) {
25
+ gpex_set_irq_num(GPEX_HOST(dev), i, irq + i);
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
26
}
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
27
28
+ const char *prefix = NULL;
28
pci = PCI_HOST_BRIDGE(dev);
29
+
30
+ if (s->dump_info.d_machine == EM_X86_64) {
31
+ prefix = "NUMBER(phys_base)=";
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
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
}
29
--
44
--
30
2.7.4
45
2.16.2
31
46
32
47
diff view generated by jsdifflib
1
From: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
2
2
3
To implement INTx to gsi routing we need to pass the gpex host
3
Code of imx_update() is slightly confusing since the "flags" variable
4
bridge the gsi associated to each INTx index. Let's introduce
4
doesn't really corespond to anything in real hardware and server as a
5
irq_num array and gpex_set_irq_num setter function.
5
kitchensink accumulating events normally reported via USR1 and USR2
6
registers.
6
7
7
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
8
Change the code to explicitly evaluate state of interrupts reported
8
Signed-off-by: Tushar Jagad <tushar.jagad@linaro.org>
9
via USR1 and USR2 against corresponding masking bits and use the to
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
10
detemine if IRQ line should be asserted or not.
10
Tested-by: Feng Kan <fkan@apm.com>
11
11
Reviewed-by: Andrew Jones <drjones@redhat.com>
12
NOTE: Check for UTS1_TXEMPTY being set has been dropped for two
12
Message-id: 1505296004-6798-2-git-send-email-eric.auger@redhat.com
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>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
32
---
15
include/hw/pci-host/gpex.h | 3 +++
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
16
hw/pci-host/gpex.c | 10 ++++++++++
34
1 file changed, 16 insertions(+), 8 deletions(-)
17
2 files changed, 13 insertions(+)
18
35
19
diff --git a/include/hw/pci-host/gpex.h b/include/hw/pci-host/gpex.h
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
20
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/pci-host/gpex.h
38
--- a/hw/char/imx_serial.c
22
+++ b/include/hw/pci-host/gpex.h
39
+++ b/hw/char/imx_serial.c
23
@@ -XXX,XX +XXX,XX @@ typedef struct GPEXHost {
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
24
MemoryRegion io_ioport;
41
25
MemoryRegion io_mmio;
42
static void imx_update(IMXSerialState *s)
26
qemu_irq irq[GPEX_NUM_IRQS];
43
{
27
+ int irq_num[GPEX_NUM_IRQS];
44
- uint32_t flags;
28
} GPEXHost;
45
+ uint32_t usr1;
29
46
+ uint32_t usr2;
30
+int gpex_set_irq_num(GPEXHost *s, int index, int gsi);
47
+ uint32_t mask;
31
+
48
32
#endif /* HW_GPEX_H */
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
33
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
34
index XXXXXXX..XXXXXXX 100644
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
35
--- a/hw/pci-host/gpex.c
52
- } else {
36
+++ b/hw/pci-host/gpex.c
53
- flags &= ~USR1_TRDY;
37
@@ -XXX,XX +XXX,XX @@ static void gpex_set_irq(void *opaque, int irq_num, int level)
54
- }
38
qemu_set_irq(s->irq[irq_num], level);
55
+ /*
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);
39
}
70
}
40
71
41
+int gpex_set_irq_num(GPEXHost *s, int index, int gsi)
72
static void imx_serial_reset(IMXSerialState *s)
42
+{
43
+ if (index >= GPEX_NUM_IRQS) {
44
+ return -EINVAL;
45
+ }
46
+
47
+ s->irq_num[index] = gsi;
48
+ return 0;
49
+}
50
+
51
static void gpex_host_realize(DeviceState *dev, Error **errp)
52
{
53
PCIHostState *pci = PCI_HOST_BRIDGE(dev);
54
--
73
--
55
2.7.4
74
2.16.2
56
75
57
76
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
2
2
3
Instead of copying addr to a local temp, reuse the value (which we
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
4
have just compared as equal) already saved in cpu_exclusive_addr.
4
it is needed to support guests other than Linux.
5
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Based on the patch by Bill Paul as found here:
7
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
7
https://bugs.launchpad.net/qemu/+bug/1753314
8
Message-id: 20170908163859.29820-1-richard.henderson@linaro.org
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>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
18
---
11
target/arm/translate-a64.c | 26 +++++++++-----------------
19
include/hw/char/imx_serial.h | 3 +++
12
1 file changed, 9 insertions(+), 17 deletions(-)
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
21
2 files changed, 20 insertions(+), 3 deletions(-)
13
22
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
15
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-a64.c
25
--- a/include/hw/char/imx_serial.h
17
+++ b/target/arm/translate-a64.c
26
+++ b/include/hw/char/imx_serial.h
18
@@ -XXX,XX +XXX,XX @@ static void gen_load_exclusive(DisasContext *s, int rt, int rt2,
27
@@ -XXX,XX +XXX,XX @@
19
}
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
20
29
#define UCR2_SRST (1<<0) /* Reset complete */
21
static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2,
30
22
- TCGv_i64 inaddr, int size, int is_pair)
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
23
+ TCGv_i64 addr, int size, int is_pair)
32
+
24
{
33
#define UTS1_TXEMPTY (1<<6)
25
/* if (env->exclusive_addr == addr && env->exclusive_val == [addr]
34
#define UTS1_RXEMPTY (1<<5)
26
* && (!is_pair || env->exclusive_high == [addr + datasize])) {
35
#define UTS1_TXFULL (1<<4)
27
@@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2,
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.
28
*/
69
*/
29
TCGLabel *fail_label = gen_new_label();
70
mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
30
TCGLabel *done_label = gen_new_label();
71
+ /*
31
- TCGv_i64 addr = tcg_temp_local_new_i64();
72
+ * TCEN and TXDC are both bit 3
32
TCGv_i64 tmp;
73
+ */
33
74
+ mask |= s->ucr4 & UCR4_TCEN;
34
- /* Copy input into a local temp so it is not trashed when the
75
+
35
- * basic block ends at the branch insn.
76
usr2 = s->usr2 & mask;
36
- */
77
37
- tcg_gen_mov_i64(addr, inaddr);
78
qemu_set_irq(s->irq, usr1 || usr2);
38
tcg_gen_brcond_i64(TCG_COND_NE, addr, cpu_exclusive_addr, fail_label);
79
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_serial_read(void *opaque, hwaddr offset,
39
80
return s->ucr3;
40
tmp = tcg_temp_new_i64();
81
41
@@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2,
82
case 0x23: /* UCR4 */
42
} else {
83
+ return s->ucr4;
43
tcg_gen_concat32_i64(tmp, cpu_reg(s, rt2), cpu_reg(s, rt));
84
+
44
}
85
case 0x29: /* BRM Incremental */
45
- tcg_gen_atomic_cmpxchg_i64(tmp, addr, cpu_exclusive_val, tmp,
86
return 0x0; /* TODO */
46
+ tcg_gen_atomic_cmpxchg_i64(tmp, cpu_exclusive_addr,
87
47
+ cpu_exclusive_val, tmp,
88
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
48
get_mem_index(s),
89
* qemu_chr_fe_write and background I/O callbacks */
49
MO_64 | MO_ALIGN | s->be_data);
90
qemu_chr_fe_write_all(&s->chr, &ch, 1);
50
tcg_gen_setcond_i64(TCG_COND_NE, tmp, tmp, cpu_exclusive_val);
91
s->usr1 &= ~USR1_TRDY;
51
} else if (s->be_data == MO_LE) {
92
+ s->usr2 &= ~USR2_TXDC;
52
- gen_helper_paired_cmpxchg64_le(tmp, cpu_env, addr, cpu_reg(s, rt),
93
imx_update(s);
53
- cpu_reg(s, rt2));
94
s->usr1 |= USR1_TRDY;
54
+ gen_helper_paired_cmpxchg64_le(tmp, cpu_env, cpu_exclusive_addr,
95
+ s->usr2 |= USR2_TXDC;
55
+ cpu_reg(s, rt), cpu_reg(s, rt2));
96
imx_update(s);
56
} else {
57
- gen_helper_paired_cmpxchg64_be(tmp, cpu_env, addr, cpu_reg(s, rt),
58
- cpu_reg(s, rt2));
59
+ gen_helper_paired_cmpxchg64_be(tmp, cpu_env, cpu_exclusive_addr,
60
+ cpu_reg(s, rt), cpu_reg(s, rt2));
61
}
97
}
62
} else {
98
break;
63
- TCGv_i64 val = cpu_reg(s, rt);
99
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
64
- tcg_gen_atomic_cmpxchg_i64(tmp, addr, cpu_exclusive_val, val,
100
s->ucr3 = value & 0xffff;
65
- get_mem_index(s),
101
break;
66
+ tcg_gen_atomic_cmpxchg_i64(tmp, cpu_exclusive_addr, cpu_exclusive_val,
102
67
+ cpu_reg(s, rt), get_mem_index(s),
103
- case 0x2d: /* UTS1 */
68
size | MO_ALIGN | s->be_data);
104
case 0x23: /* UCR4 */
69
tcg_gen_setcond_i64(TCG_COND_NE, tmp, tmp, cpu_exclusive_val);
105
+ s->ucr4 = value & 0xffff;
70
}
106
+ imx_update(s);
71
-
107
+ break;
72
- tcg_temp_free_i64(addr);
108
+
73
-
109
+ case 0x2d: /* UTS1 */
74
tcg_gen_mov_i64(cpu_reg(s, rd), tmp);
110
qemu_log_mask(LOG_UNIMP, "[%s]%s: Unimplemented reg 0x%"
75
tcg_temp_free_i64(tmp);
111
HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
76
tcg_gen_br(done_label);
112
/* TODO */
77
--
113
--
78
2.7.4
114
2.16.2
79
115
80
116
diff view generated by jsdifflib
1
The exception-return magic values get some new bits in v8M, which
1
For the rpi1 and 2 we want to boot the Linux kernel via some
2
makes some bit definitions for them worthwhile.
2
custom setup code that makes sure that the SMC instruction
3
3
acts as a no-op, because it's used for cache maintenance.
4
We don't use the bit definitions for the switch on the low bits
4
The rpi3 boots AArch64 kernels, which don't need SMC for
5
which checks the return type for v7M, because this is defined
5
cache maintenance and always expect to be booted non-secure.
6
in the v7M ARM ARM as a set of valid values rather than via
6
Don't fill in the aarch32-specific parts of the binfo struct.
7
per-bit checks.
8
7
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
9
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
11
Message-id: 1505137930-13255-7-git-send-email-peter.maydell@linaro.org
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20180313153458.26822-2-peter.maydell@linaro.org
12
---
12
---
13
target/arm/internals.h | 10 ++++++++++
13
hw/arm/raspi.c | 17 +++++++++++++----
14
target/arm/helper.c | 14 +++++++++-----
14
1 file changed, 13 insertions(+), 4 deletions(-)
15
2 files changed, 19 insertions(+), 5 deletions(-)
16
15
17
diff --git a/target/arm/internals.h b/target/arm/internals.h
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
18
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/internals.h
18
--- a/hw/arm/raspi.c
20
+++ b/target/arm/internals.h
19
+++ b/hw/arm/raspi.c
21
@@ -XXX,XX +XXX,XX @@ FIELD(V7M_CONTROL, NPRIV, 0, 1)
20
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
22
FIELD(V7M_CONTROL, SPSEL, 1, 1)
21
binfo.board_id = raspi_boardid[version];
23
FIELD(V7M_CONTROL, FPCA, 2, 1)
22
binfo.ram_size = ram_size;
24
23
binfo.nb_cpus = smp_cpus;
25
+/* Bit definitions for v7M exception return payload */
24
- binfo.board_setup_addr = BOARDSETUP_ADDR;
26
+FIELD(V7M_EXCRET, ES, 0, 1)
25
- binfo.write_board_setup = write_board_setup;
27
+FIELD(V7M_EXCRET, RES0, 1, 1)
26
- binfo.secure_board_setup = true;
28
+FIELD(V7M_EXCRET, SPSEL, 2, 1)
27
- binfo.secure_boot = true;
29
+FIELD(V7M_EXCRET, MODE, 3, 1)
30
+FIELD(V7M_EXCRET, FTYPE, 4, 1)
31
+FIELD(V7M_EXCRET, DCRS, 5, 1)
32
+FIELD(V7M_EXCRET, S, 6, 1)
33
+FIELD(V7M_EXCRET, RES1, 7, 25) /* including the must-be-1 prefix */
34
+
28
+
35
/*
29
+ if (version <= 2) {
36
* For AArch64, map a given EL to an index in the banked_spsr array.
30
+ /* The rpi1 and 2 require some custom setup code to run in Secure
37
* Note that this mapping and the AArch32 mapping defined in bank_number()
31
+ * mode before booting a kernel (to set up the SMC vectors so
38
diff --git a/target/arm/helper.c b/target/arm/helper.c
32
+ * that we get a no-op SMC; this is used by Linux to call the
39
index XXXXXXX..XXXXXXX 100644
33
+ * firmware for some cache maintenance operations.
40
--- a/target/arm/helper.c
34
+ * The rpi3 doesn't need this.
41
+++ b/target/arm/helper.c
35
+ */
42
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
36
+ binfo.board_setup_addr = BOARDSETUP_ADDR;
43
" previous exception %d\n",
37
+ binfo.write_board_setup = write_board_setup;
44
type, env->v7m.exception);
38
+ binfo.secure_board_setup = true;
45
39
+ binfo.secure_boot = true;
46
- if (extract32(type, 5, 23) != extract32(-1, 5, 23)) {
40
+ }
47
+ if ((type & R_V7M_EXCRET_RES1_MASK) != R_V7M_EXCRET_RES1_MASK) {
41
48
qemu_log_mask(LOG_GUEST_ERROR, "M profile: zero high bits in exception "
42
/* Pi2 and Pi3 requires SMP setup */
49
"exit PC value 0x%" PRIx32 " are UNPREDICTABLE\n", type);
43
if (version >= 2) {
50
}
51
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
52
* which security state's faultmask to clear. (v8M ARM ARM R_KBNF.)
53
*/
54
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
55
- int es = type & 1;
56
+ int es = type & R_V7M_EXCRET_ES_MASK;
57
if (armv7m_nvic_raw_execution_priority(env->nvic) >= 0) {
58
env->v7m.faultmask[es] = 0;
59
}
60
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
61
return; /* Never happens. Keep compiler happy. */
62
}
63
64
- lr = 0xfffffff1;
65
+ lr = R_V7M_EXCRET_RES1_MASK |
66
+ R_V7M_EXCRET_S_MASK |
67
+ R_V7M_EXCRET_DCRS_MASK |
68
+ R_V7M_EXCRET_FTYPE_MASK |
69
+ R_V7M_EXCRET_ES_MASK;
70
if (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) {
71
- lr |= 4;
72
+ lr |= R_V7M_EXCRET_SPSEL_MASK;
73
}
74
if (!arm_v7m_is_handler_mode(env)) {
75
- lr |= 8;
76
+ lr |= R_V7M_EXCRET_MODE_MASK;
77
}
78
79
v7m_push_stack(cpu);
80
--
44
--
81
2.7.4
45
2.16.2
82
46
83
47
diff view generated by jsdifflib
1
In the v7M and v8M ARM ARM, the magic exception return values are
1
Add some assertions that if we're about to boot an AArch64 kernel,
2
referred to as EXC_RETURN values, and in QEMU we use V7M_EXCRET_*
2
the board code has not mistakenly set either secure_boot or
3
constants to define bits within them. Rename the 'type' variable
3
secure_board_setup. It doesn't make sense to set secure_boot,
4
which holds the exception return value in do_v7m_exception_exit()
4
because all AArch64 kernels must be booted in non-secure mode.
5
to excret, making it clearer that it does hold an EXC_RETURN value.
5
6
It might in theory make sense to set secure_board_setup, but
7
we don't currently support that, because only the AArch32
8
bootloader[] code calls this hook; bootloader_aarch64[] does not.
9
Since we don't have a current need for this functionality, just
10
assert that we don't try to use it. If it's needed we'll add
11
it later.
6
12
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
15
Message-id: 20180313153458.26822-3-peter.maydell@linaro.org
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 1505137930-13255-8-git-send-email-peter.maydell@linaro.org
12
---
16
---
13
target/arm/helper.c | 23 ++++++++++++-----------
17
hw/arm/boot.c | 7 +++++++
14
1 file changed, 12 insertions(+), 11 deletions(-)
18
1 file changed, 7 insertions(+)
15
19
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
17
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/helper.c
22
--- a/hw/arm/boot.c
19
+++ b/target/arm/helper.c
23
+++ b/hw/arm/boot.c
20
@@ -XXX,XX +XXX,XX @@ static void v7m_push_stack(ARMCPU *cpu)
24
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
21
static void do_v7m_exception_exit(ARMCPU *cpu)
25
} else {
22
{
26
env->pstate = PSTATE_MODE_EL1h;
23
CPUARMState *env = &cpu->env;
27
}
24
- uint32_t type;
28
+ /* AArch64 kernels never boot in secure mode */
25
+ uint32_t excret;
29
+ assert(!info->secure_boot);
26
uint32_t xpsr;
30
+ /* This hook is only supported for AArch32 currently:
27
bool ufault = false;
31
+ * bootloader_aarch64[] will not call the hook, and
28
bool return_to_sp_process = false;
32
+ * the code above has already dropped us into EL2 or EL1.
29
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
33
+ */
30
* the target value up between env->regs[15] and env->thumb in
34
+ assert(!info->secure_board_setup);
31
* gen_bx(). Reconstitute it.
35
}
32
*/
36
33
- type = env->regs[15];
37
/* Set to non-secure if not a secure boot */
34
+ excret = env->regs[15];
35
if (env->thumb) {
36
- type |= 1;
37
+ excret |= 1;
38
}
39
40
qemu_log_mask(CPU_LOG_INT, "Exception return: magic PC %" PRIx32
41
" previous exception %d\n",
42
- type, env->v7m.exception);
43
+ excret, env->v7m.exception);
44
45
- if ((type & R_V7M_EXCRET_RES1_MASK) != R_V7M_EXCRET_RES1_MASK) {
46
+ if ((excret & R_V7M_EXCRET_RES1_MASK) != R_V7M_EXCRET_RES1_MASK) {
47
qemu_log_mask(LOG_GUEST_ERROR, "M profile: zero high bits in exception "
48
- "exit PC value 0x%" PRIx32 " are UNPREDICTABLE\n", type);
49
+ "exit PC value 0x%" PRIx32 " are UNPREDICTABLE\n",
50
+ excret);
51
}
52
53
if (env->v7m.exception != ARMV7M_EXCP_NMI) {
54
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
55
* which security state's faultmask to clear. (v8M ARM ARM R_KBNF.)
56
*/
57
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
58
- int es = type & R_V7M_EXCRET_ES_MASK;
59
+ int es = excret & R_V7M_EXCRET_ES_MASK;
60
if (armv7m_nvic_raw_execution_priority(env->nvic) >= 0) {
61
env->v7m.faultmask[es] = 0;
62
}
63
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
64
g_assert_not_reached();
65
}
66
67
- switch (type & 0xf) {
68
+ switch (excret & 0xf) {
69
case 1: /* Return to Handler */
70
return_to_handler = true;
71
break;
72
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
73
*/
74
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
75
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
76
- v7m_exception_taken(cpu, type);
77
+ v7m_exception_taken(cpu, excret);
78
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
79
"stackframe: failed exception return integrity check\n");
80
return;
81
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
82
83
/* The restored xPSR exception field will be zero if we're
84
* resuming in Thread mode. If that doesn't match what the
85
- * exception return type specified then this is a UsageFault.
86
+ * exception return excret specified then this is a UsageFault.
87
*/
88
if (return_to_handler != arm_v7m_is_handler_mode(env)) {
89
/* Take an INVPC UsageFault by pushing the stack again. */
90
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
91
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
92
v7m_push_stack(cpu);
93
- v7m_exception_taken(cpu, type);
94
+ v7m_exception_taken(cpu, excret);
95
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on new stackframe: "
96
"failed exception return integrity check\n");
97
return;
98
--
38
--
99
2.7.4
39
2.16.2
100
40
101
41
diff view generated by jsdifflib
1
In several places we were unconditionally applying the
1
If we're directly booting a Linux kernel and the CPU supports both
2
nvic_gprio_mask() to a priority value. This is incorrect
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
3
if the priority is one of the fixed negative priority
3
set the SCR_EL3.HCE bit in this situation, so that the HVC
4
values (for NMI and HardFault), so don't do it.
4
instruction is enabled rather than UNDEFing. Otherwise at least some
5
5
kernels will panic when trying to initialize KVM in the guest.
6
This bug would have caused both NMI and HardFault to be
7
considered as the same priority and so NMI wouldn't
8
correctly preempt HardFault.
9
6
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
12
Message-id: 1505137930-13255-5-git-send-email-peter.maydell@linaro.org
13
---
9
---
14
hw/intc/armv7m_nvic.c | 11 +++++++++--
10
hw/arm/boot.c | 5 +++++
15
1 file changed, 9 insertions(+), 2 deletions(-)
11
1 file changed, 5 insertions(+)
16
12
17
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/armv7m_nvic.c
15
--- a/hw/arm/boot.c
20
+++ b/hw/intc/armv7m_nvic.c
16
+++ b/hw/arm/boot.c
21
@@ -XXX,XX +XXX,XX @@ static void nvic_recompute_state(NVICState *s)
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
22
}
18
assert(!info->secure_board_setup);
23
}
19
}
24
20
25
+ if (active_prio > 0) {
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
26
+ active_prio &= nvic_gprio_mask(s);
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
27
+ }
23
+ env->cp15.scr_el3 |= SCR_HCE;
24
+ }
28
+
25
+
29
s->vectpending = pend_irq;
26
/* Set to non-secure if not a secure boot */
30
- s->exception_prio = active_prio & nvic_gprio_mask(s);
27
if (!info->secure_boot &&
31
+ s->exception_prio = active_prio;
28
(cs != first_cpu || !info->secure_board_setup)) {
32
33
trace_nvic_recompute_state(s->vectpending, s->exception_prio);
34
}
35
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_acknowledge_irq(void *opaque)
36
assert(vec->enabled);
37
assert(vec->pending);
38
39
- pendgroupprio = vec->prio & nvic_gprio_mask(s);
40
+ pendgroupprio = vec->prio;
41
+ if (pendgroupprio > 0) {
42
+ pendgroupprio &= nvic_gprio_mask(s);
43
+ }
44
assert(pendgroupprio < running);
45
46
trace_nvic_acknowledge_irq(pending, vec->prio);
47
--
29
--
48
2.7.4
30
2.16.2
49
31
50
32
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@xilinx.com>
1
The TypeInfo and state struct for bcm2386 disagree about what the
2
parent class is -- the TypeInfo says it's TYPE_SYS_BUS_DEVICE,
3
but the BCM2386State struct only defines the parent_obj field
4
as DeviceState. This would have caused problems if anything
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.
2
9
3
The EP108 is the same as the ZCU102, mark it as deprecated as we don't
4
need two machines.
5
6
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
7
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
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-5-peter.maydell@linaro.org
9
---
14
---
10
hw/arm/xlnx-zcu102.c | 2 +-
15
hw/arm/bcm2836.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
16
1 file changed, 1 insertion(+), 1 deletion(-)
12
17
13
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
14
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/xlnx-zcu102.c
20
--- a/hw/arm/bcm2836.c
16
+++ b/hw/arm/xlnx-zcu102.c
21
+++ b/hw/arm/bcm2836.c
17
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
18
{
23
19
MachineClass *mc = MACHINE_CLASS(oc);
24
static const TypeInfo bcm2836_type_info = {
20
25
.name = TYPE_BCM2836,
21
- mc->desc = "Xilinx ZynqMP EP108 board";
26
- .parent = TYPE_SYS_BUS_DEVICE,
22
+ mc->desc = "Xilinx ZynqMP EP108 board (Deprecated, please use xlnx-zcu102)";
27
+ .parent = TYPE_DEVICE,
23
mc->init = xlnx_ep108_init;
28
.instance_size = sizeof(BCM2836State),
24
mc->block_default_type = IF_IDE;
29
.instance_init = bcm2836_init,
25
mc->units_per_default_bus = 1;
30
.class_init = bcm2836_class_init,
26
--
31
--
27
2.7.4
32
2.16.2
28
33
29
34
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@xilinx.com>
1
Our BCM2836 type is really a generic one that can be any of
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.
2
6
3
Add a machine level secure property. This defaults to false and can be
7
This is a preliminary to making bcm283x be an abstract
4
set to true using this machine command line argument:
8
parent class to specific types for the bcm2836 and bcm2837.
5
-machine xlnx-zcu102,secure=on
6
9
7
This follows what the ARM virt machine does.
10
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
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
16
hw/arm/bcm2836.c | 17 +++++++++--------
17
hw/arm/raspi.c | 16 ++++++++--------
18
3 files changed, 23 insertions(+), 22 deletions(-)
8
19
9
This property only applies to the ZCU102 machine. The EP108 machine does
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
10
not have this property.
11
12
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
13
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/arm/xlnx-zcu102.c | 32 ++++++++++++++++++++++++++++++++
17
1 file changed, 32 insertions(+)
18
19
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
20
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/xlnx-zcu102.c
22
--- a/include/hw/arm/bcm2836.h
22
+++ b/hw/arm/xlnx-zcu102.c
23
+++ b/include/hw/arm/bcm2836.h
23
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZCU102 {
24
@@ -XXX,XX +XXX,XX @@
24
25
#include "hw/arm/bcm2835_peripherals.h"
25
XlnxZynqMPState soc;
26
#include "hw/intc/bcm2836_control.h"
26
MemoryRegion ddr_ram;
27
27
+
28
-#define TYPE_BCM2836 "bcm2836"
28
+ bool secure;
29
-#define BCM2836(obj) OBJECT_CHECK(BCM2836State, (obj), TYPE_BCM2836)
29
} XlnxZCU102;
30
+#define TYPE_BCM283X "bcm283x"
30
31
+#define BCM283X(obj) OBJECT_CHECK(BCM283XState, (obj), TYPE_BCM283X)
31
#define TYPE_ZCU102_MACHINE MACHINE_TYPE_NAME("xlnx-zcu102")
32
32
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZCU102 {
33
-#define BCM2836_NCPUS 4
33
34
+#define BCM283X_NCPUS 4
34
static struct arm_boot_info xlnx_zcu102_binfo;
35
35
36
-typedef struct BCM2836State {
36
+static bool zcu102_get_secure(Object *obj, Error **errp)
37
+typedef struct BCM283XState {
37
+{
38
/*< private >*/
38
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
39
DeviceState parent_obj;
39
+
40
/*< public >*/
40
+ return s->secure;
41
@@ -XXX,XX +XXX,XX @@ typedef struct BCM2836State {
41
+}
42
char *cpu_type;
42
+
43
uint32_t enabled_cpus;
43
+static void zcu102_set_secure(Object *obj, bool value, Error **errp)
44
44
+{
45
- ARMCPU cpus[BCM2836_NCPUS];
45
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
46
+ ARMCPU cpus[BCM283X_NCPUS];
46
+
47
BCM2836ControlState control;
47
+ s->secure = value;
48
BCM2835PeripheralState peripherals;
48
+}
49
-} BCM2836State;
49
+
50
+} BCM283XState;
50
static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
51
52
#endif /* BCM2836_H */
53
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/arm/bcm2836.c
56
+++ b/hw/arm/bcm2836.c
57
@@ -XXX,XX +XXX,XX @@
58
59
static void bcm2836_init(Object *obj)
51
{
60
{
52
int i;
61
- BCM2836State *s = BCM2836(obj);
53
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
62
+ BCM283XState *s = BCM283X(obj);
54
63
55
object_property_set_link(OBJECT(&s->soc), OBJECT(&s->ddr_ram),
64
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
56
"ddr-ram", &error_abort);
65
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
57
+ object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
66
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
58
+ &error_fatal);
67
59
68
static void bcm2836_realize(DeviceState *dev, Error **errp)
60
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
61
62
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_init(MachineState *machine)
63
64
static void xlnx_ep108_machine_instance_init(Object *obj)
65
{
69
{
66
+ XlnxZCU102 *s = EP108_MACHINE(obj);
70
- BCM2836State *s = BCM2836(dev);
67
+
71
+ BCM283XState *s = BCM283X(dev);
68
+ /* EP108, we don't support setting secure */
72
Object *obj;
69
+ s->secure = false;
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)
70
}
94
}
71
95
72
static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
96
static Property bcm2836_props[] = {
73
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_init(MachineState *machine)
97
- DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
74
98
- DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
75
static void xlnx_zcu102_machine_instance_init(Object *obj)
99
+ DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
76
{
100
+ DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
77
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
101
+ BCM283X_NCPUS),
78
+
102
DEFINE_PROP_END_OF_LIST()
79
+ /* Default to secure mode being disabled */
103
};
80
+ s->secure = false;
104
81
+ object_property_add_bool(obj, "secure", zcu102_get_secure,
105
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
82
+ zcu102_set_secure, NULL);
83
+ object_property_set_description(obj, "secure",
84
+ "Set on/off to enable/disable the ARM "
85
+ "Security Extensions (TrustZone)",
86
+ NULL);
87
}
106
}
88
107
89
static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
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)
90
--
165
--
91
2.7.4
166
2.16.2
92
167
93
168
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@xilinx.com>
1
The bcm2837 is pretty similar to the bcm2836, but it does have
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.
2
5
3
Add a machine level virtualization property. This defaults to false and can be
6
Rather than trying to have one device with properties that
4
set to true using this machine command line argument:
7
configure it differently for the two cases, create two
5
-machine xlnx-zcu102,virtualization=on
8
separate QOM devices for the two SoCs. We use the same approach
9
as hw/arm/aspeed_soc.c and share code and have a data table
10
that might differ per-SoC. For the moment the two types don't
11
actually have different behaviour.
6
12
7
This follows what the ARM virt machine does.
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
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(-)
8
21
9
This property only applies to the ZCU102 machine. The EP108 machine does
22
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
10
not have this property.
11
12
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
13
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
include/hw/arm/xlnx-zynqmp.h | 2 ++
17
hw/arm/xlnx-zcu102.c | 30 +++++++++++++++++++++++++++++-
18
hw/arm/xlnx-zynqmp.c | 3 ++-
19
3 files changed, 33 insertions(+), 2 deletions(-)
20
21
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
22
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/arm/xlnx-zynqmp.h
24
--- a/include/hw/arm/bcm2836.h
24
+++ b/include/hw/arm/xlnx-zynqmp.h
25
+++ b/include/hw/arm/bcm2836.h
25
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZynqMPState {
26
@@ -XXX,XX +XXX,XX @@
26
27
27
/* Has the ARM Security extensions? */
28
#define BCM283X_NCPUS 4
28
bool secure;
29
29
+ /* Has the ARM Virtualization extensions? */
30
+/* These type names are for specific SoCs; other than instantiating
30
+ bool virt;
31
+ * them, code using these devices should always handle them via the
31
/* Has the RPU subsystem? */
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
32
bool has_rpu;
33
+ */
33
} XlnxZynqMPState;
34
+#define TYPE_BCM2836 "bcm2836"
34
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
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
35
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/arm/xlnx-zcu102.c
59
--- a/hw/arm/bcm2836.c
37
+++ b/hw/arm/xlnx-zcu102.c
60
+++ b/hw/arm/bcm2836.c
38
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZCU102 {
61
@@ -XXX,XX +XXX,XX @@
39
MemoryRegion ddr_ram;
62
/* "QA7" (Pi2) interrupt controller and mailboxes etc. */
40
63
#define BCM2836_CONTROL_BASE 0x40000000
41
bool secure;
64
42
+ bool virt;
65
+struct BCM283XInfo {
43
} XlnxZCU102;
66
+ const char *name;
44
67
+};
45
#define TYPE_ZCU102_MACHINE MACHINE_TYPE_NAME("xlnx-zcu102")
68
+
46
@@ -XXX,XX +XXX,XX @@ static void zcu102_set_secure(Object *obj, bool value, Error **errp)
69
+static const BCM283XInfo bcm283x_socs[] = {
47
s->secure = value;
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;
48
}
95
}
49
96
50
+static bool zcu102_get_virt(Object *obj, Error **errp)
97
-static const TypeInfo bcm2836_type_info = {
51
+{
98
+static const TypeInfo bcm283x_type_info = {
52
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
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;
53
+
112
+
54
+ return s->virt;
113
+ type_register_static(&bcm283x_type_info);
55
+}
114
+ for (i = 0; i < ARRAY_SIZE(bcm283x_socs); i++) {
56
+
115
+ TypeInfo ti = {
57
+static void zcu102_set_virt(Object *obj, bool value, Error **errp)
116
+ .name = bcm283x_socs[i].name,
58
+{
117
+ .parent = TYPE_BCM283X,
59
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
118
+ .class_init = bcm283x_class_init,
60
+
119
+ .class_data = (void *) &bcm283x_socs[i],
61
+ s->virt = value;
120
+ };
62
+}
121
+ type_register(&ti);
63
+
122
+ }
64
static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
65
{
66
int i;
67
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
68
"ddr-ram", &error_abort);
69
object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
70
&error_fatal);
71
+ object_property_set_bool(OBJECT(&s->soc), s->virt, "virtualization",
72
+ &error_fatal);
73
74
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
75
76
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_machine_instance_init(Object *obj)
77
{
78
XlnxZCU102 *s = EP108_MACHINE(obj);
79
80
- /* EP108, we don't support setting secure */
81
+ /* EP108, we don't support setting secure or virt */
82
s->secure = false;
83
+ s->virt = false;
84
}
123
}
85
124
86
static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
125
type_init(bcm2836_register_types)
87
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_instance_init(Object *obj)
126
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
88
"Set on/off to enable/disable the ARM "
89
"Security Extensions (TrustZone)",
90
NULL);
91
+
92
+ /* Default to virt (EL2) being disabled */
93
+ s->virt = false;
94
+ object_property_add_bool(obj, "virtualization", zcu102_get_virt,
95
+ zcu102_set_virt, NULL);
96
+ object_property_set_description(obj, "virtualization",
97
+ "Set on/off to enable/disable emulating a "
98
+ "guest CPU which implements the ARM "
99
+ "Virtualization Extensions",
100
+ NULL);
101
}
102
103
static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
104
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
105
index XXXXXXX..XXXXXXX 100644
127
index XXXXXXX..XXXXXXX 100644
106
--- a/hw/arm/xlnx-zynqmp.c
128
--- a/hw/arm/raspi.c
107
+++ b/hw/arm/xlnx-zynqmp.c
129
+++ b/hw/arm/raspi.c
108
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
109
object_property_set_bool(OBJECT(&s->apu_cpu[i]),
131
BusState *bus;
110
s->secure, "has_el3", NULL);
132
DeviceState *carddev;
111
object_property_set_bool(OBJECT(&s->apu_cpu[i]),
133
112
- false, "has_el2", NULL);
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
113
+ s->virt, "has_el2", NULL);
135
+ object_initialize(&s->soc, sizeof(s->soc),
114
object_property_set_int(OBJECT(&s->apu_cpu[i]), GIC_BASE_ADDR,
136
+ version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
115
"reset-cbar", &error_abort);
137
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
116
object_property_set_bool(OBJECT(&s->apu_cpu[i]), true, "realized",
138
&error_abort);
117
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
139
118
static Property xlnx_zynqmp_props[] = {
119
DEFINE_PROP_STRING("boot-cpu", XlnxZynqMPState, boot_cpu),
120
DEFINE_PROP_BOOL("secure", XlnxZynqMPState, secure, false),
121
+ DEFINE_PROP_BOOL("virtualization", XlnxZynqMPState, virt, false),
122
DEFINE_PROP_BOOL("has_rpu", XlnxZynqMPState, has_rpu, false),
123
DEFINE_PROP_LINK("ddr-ram", XlnxZynqMPState, ddr_ram, TYPE_MEMORY_REGION,
124
MemoryRegion *),
125
--
140
--
126
2.7.4
141
2.16.2
127
142
128
143
diff view generated by jsdifflib
1
For a bus fault, the M profile BFSR bit PRECISERR means a bus
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
2
fault on a data access, and IBUSERR means a bus fault on an
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
3
instruction access. We had these the wrong way around; fix this.
3
is required for Linux to boot.
4
4
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
6
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 1505137930-13255-4-git-send-email-peter.maydell@linaro.org
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
9
---
9
---
10
target/arm/helper.c | 8 ++++----
10
hw/arm/bcm2836.c | 11 +++++++----
11
1 file changed, 4 insertions(+), 4 deletions(-)
11
1 file changed, 7 insertions(+), 4 deletions(-)
12
12
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
15
--- a/hw/arm/bcm2836.c
16
+++ b/target/arm/helper.c
16
+++ b/hw/arm/bcm2836.c
17
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
17
@@ -XXX,XX +XXX,XX @@
18
case 0x8: /* External Abort */
18
19
switch (cs->exception_index) {
19
struct BCM283XInfo {
20
case EXCP_PREFETCH_ABORT:
20
const char *name;
21
- env->v7m.cfsr[M_REG_NS] |= R_V7M_CFSR_PRECISERR_MASK;
21
+ int clusterid;
22
- qemu_log_mask(CPU_LOG_INT, "...with CFSR.PRECISERR\n");
22
};
23
+ env->v7m.cfsr[M_REG_NS] |= R_V7M_CFSR_IBUSERR_MASK;
23
24
+ qemu_log_mask(CPU_LOG_INT, "...with CFSR.IBUSERR\n");
24
static const BCM283XInfo bcm283x_socs[] = {
25
break;
25
{
26
case EXCP_DATA_ABORT:
26
.name = TYPE_BCM2836,
27
env->v7m.cfsr[M_REG_NS] |=
27
+ .clusterid = 0xf,
28
- (R_V7M_CFSR_IBUSERR_MASK | R_V7M_CFSR_BFARVALID_MASK);
28
},
29
+ (R_V7M_CFSR_PRECISERR_MASK | R_V7M_CFSR_BFARVALID_MASK);
29
{
30
env->v7m.bfar = env->exception.vaddress;
30
.name = TYPE_BCM2837,
31
qemu_log_mask(CPU_LOG_INT,
31
+ .clusterid = 0x0,
32
- "...with CFSR.IBUSERR and BFAR 0x%x\n",
32
},
33
+ "...with CFSR.PRECISERR and BFAR 0x%x\n",
33
};
34
env->v7m.bfar);
34
35
break;
35
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
36
}
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]),
37
--
57
--
38
2.7.4
58
2.16.2
39
59
40
60
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@xilinx.com>
1
Now we have separate types for BCM2386 and BCM2387, we might as well
2
just hard-code the CPU type they use rather than having it passed
3
through as an object property. This then lets us put the initialization
4
of the CPU object in init rather than realize.
2
5
3
In preperation for future work let's manually create the Xilnx machines.
6
Note that this change means that it's no longer possible on
4
This will allow us to set properties for the machines in the future.
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.
5
10
6
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
11
This does require us to only build the bcm2837 object on
7
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
13
due to the missing cortex-a53 device and "make check" will fail.
14
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20180313153458.26822-9-peter.maydell@linaro.org
9
---
19
---
10
hw/arm/xlnx-zcu102.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++-----
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
11
1 file changed, 67 insertions(+), 7 deletions(-)
21
hw/arm/raspi.c | 2 --
22
2 files changed, 15 insertions(+), 11 deletions(-)
12
23
13
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
14
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/xlnx-zcu102.c
26
--- a/hw/arm/bcm2836.c
16
+++ b/hw/arm/xlnx-zcu102.c
27
+++ b/hw/arm/bcm2836.c
17
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@
18
#include "qemu/log.h"
29
19
30
struct BCM283XInfo {
20
typedef struct XlnxZCU102 {
31
const char *name;
21
+ MachineState parent_obj;
32
+ const char *cpu_type;
33
int clusterid;
34
};
35
36
static const BCM283XInfo bcm283x_socs[] = {
37
{
38
.name = TYPE_BCM2836,
39
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a15"),
40
.clusterid = 0xf,
41
},
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;
22
+
57
+
23
XlnxZynqMPState soc;
58
+ for (n = 0; n < BCM283X_NCPUS; n++) {
24
MemoryRegion ddr_ram;
59
+ object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
25
} XlnxZCU102;
60
+ info->cpu_type);
26
61
+ object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
27
+#define TYPE_ZCU102_MACHINE MACHINE_TYPE_NAME("xlnx-zcu102")
62
+ &error_abort);
28
+#define ZCU102_MACHINE(obj) \
63
+ }
29
+ OBJECT_CHECK(XlnxZCU102, (obj), TYPE_ZCU102_MACHINE)
64
30
+
65
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
31
+#define TYPE_EP108_MACHINE MACHINE_TYPE_NAME("xlnx-ep108")
66
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
32
+#define EP108_MACHINE(obj) \
67
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
33
+ OBJECT_CHECK(XlnxZCU102, (obj), TYPE_EP108_MACHINE)
68
34
+
69
/* common peripherals from bcm2835 */
35
static struct arm_boot_info xlnx_zcu102_binfo;
70
36
71
- obj = OBJECT(dev);
37
-static void xlnx_zcu102_init(MachineState *machine)
72
- for (n = 0; n < BCM283X_NCPUS; n++) {
38
+static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
73
- object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
39
{
74
- s->cpu_type);
40
- XlnxZCU102 *s = g_new0(XlnxZCU102, 1);
75
- object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
41
int i;
76
- &error_abort);
42
uint64_t ram_size = machine->ram_size;
77
- }
43
78
-
44
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_init(MachineState *machine)
79
obj = object_property_get_link(OBJECT(dev), "ram", &err);
45
arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_zcu102_binfo);
80
if (obj == NULL) {
81
error_setg(errp, "%s: required ram link not found: %s",
82
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
46
}
83
}
47
84
48
-static void xlnx_ep108_machine_init(MachineClass *mc)
85
static Property bcm2836_props[] = {
49
+static void xlnx_ep108_init(MachineState *machine)
86
- DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
50
+{
87
DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
51
+ XlnxZCU102 *s = EP108_MACHINE(machine);
88
BCM283X_NCPUS),
52
+
89
DEFINE_PROP_END_OF_LIST()
53
+ xlnx_zynqmp_init(s, machine);
90
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
54
+}
91
index XXXXXXX..XXXXXXX 100644
55
+
92
--- a/hw/arm/raspi.c
56
+static void xlnx_ep108_machine_instance_init(Object *obj)
93
+++ b/hw/arm/raspi.c
57
{
94
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
58
+}
95
/* Setup the SOC */
59
+
96
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
60
+static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
97
&error_abort);
61
+{
98
- object_property_set_str(OBJECT(&s->soc), machine->cpu_type, "cpu-type",
62
+ MachineClass *mc = MACHINE_CLASS(oc);
99
- &error_abort);
63
+
100
object_property_set_int(OBJECT(&s->soc), smp_cpus, "enabled-cpus",
64
mc->desc = "Xilinx ZynqMP EP108 board";
101
&error_abort);
65
- mc->init = xlnx_zcu102_init;
102
int board_rev = version == 3 ? 0xa02082 : 0xa21041;
66
+ mc->init = xlnx_ep108_init;
67
mc->block_default_type = IF_IDE;
68
mc->units_per_default_bus = 1;
69
mc->ignore_memory_transaction_failures = true;
70
}
71
72
-DEFINE_MACHINE("xlnx-ep108", xlnx_ep108_machine_init)
73
+static const TypeInfo xlnx_ep108_machine_init_typeinfo = {
74
+ .name = MACHINE_TYPE_NAME("xlnx-ep108"),
75
+ .parent = TYPE_MACHINE,
76
+ .class_init = xlnx_ep108_machine_class_init,
77
+ .instance_init = xlnx_ep108_machine_instance_init,
78
+ .instance_size = sizeof(XlnxZCU102),
79
+};
80
81
-static void xlnx_zcu102_machine_init(MachineClass *mc)
82
+static void xlnx_ep108_machine_init_register_types(void)
83
{
84
+ type_register_static(&xlnx_ep108_machine_init_typeinfo);
85
+}
86
+
87
+static void xlnx_zcu102_init(MachineState *machine)
88
+{
89
+ XlnxZCU102 *s = ZCU102_MACHINE(machine);
90
+
91
+ xlnx_zynqmp_init(s, machine);
92
+}
93
+
94
+static void xlnx_zcu102_machine_instance_init(Object *obj)
95
+{
96
+}
97
+
98
+static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
99
+{
100
+ MachineClass *mc = MACHINE_CLASS(oc);
101
+
102
mc->desc = "Xilinx ZynqMP ZCU102 board";
103
mc->init = xlnx_zcu102_init;
104
mc->block_default_type = IF_IDE;
105
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_init(MachineClass *mc)
106
mc->ignore_memory_transaction_failures = true;
107
}
108
109
-DEFINE_MACHINE("xlnx-zcu102", xlnx_zcu102_machine_init)
110
+static const TypeInfo xlnx_zcu102_machine_init_typeinfo = {
111
+ .name = MACHINE_TYPE_NAME("xlnx-zcu102"),
112
+ .parent = TYPE_MACHINE,
113
+ .class_init = xlnx_zcu102_machine_class_init,
114
+ .instance_init = xlnx_zcu102_machine_instance_init,
115
+ .instance_size = sizeof(XlnxZCU102),
116
+};
117
+
118
+static void xlnx_zcu102_machine_init_register_types(void)
119
+{
120
+ type_register_static(&xlnx_zcu102_machine_init_typeinfo);
121
+}
122
+
123
+type_init(xlnx_zcu102_machine_init_register_types)
124
+type_init(xlnx_ep108_machine_init_register_types)
125
--
103
--
126
2.7.4
104
2.16.2
127
105
128
106
diff view generated by jsdifflib
1
For M profile we must clear the exclusive monitor on reset, exception
1
The raspi3 has AArch64 CPUs, which means that our smpboot
2
entry and exception exit. We weren't doing any of these things; fix
2
code for keeping the secondary CPUs in a pen needs to have
3
this bug.
3
a version for A64 as well as A32. Without this, the
4
secondary CPUs go into an infinite loop of taking undefined
5
instruction exceptions.
4
6
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180313153458.26822-10-peter.maydell@linaro.org
8
Message-id: 1505137930-13255-3-git-send-email-peter.maydell@linaro.org
9
---
10
---
10
target/arm/internals.h | 10 ++++++++++
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
11
target/arm/cpu.c | 6 ++++++
12
1 file changed, 40 insertions(+), 1 deletion(-)
12
target/arm/helper.c | 2 ++
13
target/arm/op_helper.c | 2 +-
14
4 files changed, 19 insertions(+), 1 deletion(-)
15
13
16
diff --git a/target/arm/internals.h b/target/arm/internals.h
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/internals.h
16
--- a/hw/arm/raspi.c
19
+++ b/target/arm/internals.h
17
+++ b/hw/arm/raspi.c
20
@@ -XXX,XX +XXX,XX @@ void arm_handle_psci_call(ARMCPU *cpu);
18
@@ -XXX,XX +XXX,XX @@
21
#endif
19
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
22
20
#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
23
/**
21
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
24
+ * arm_clear_exclusive: clear the exclusive monitor
22
+#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
25
+ * @env: CPU env
23
26
+ * Clear the CPU's exclusive monitor, like the guest CLREX instruction.
24
/* Table of Linux board IDs for different Pi versions */
27
+ */
25
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
28
+static inline void arm_clear_exclusive(CPUARMState *env)
26
@@ -XXX,XX +XXX,XX @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
27
info->smp_loader_start);
28
}
29
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
29
+{
31
+{
30
+ env->exclusive_addr = -1;
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
33
+ * The mechanism for doing the spin-table is also entirely different.
34
+ * We must have four 64-bit fields at absolute addresses
35
+ * 0xd8, 0xe0, 0xe8, 0xf0 in RAM, which are the flag variables for
36
+ * our CPUs, and which we must ensure are zero initialized before
37
+ * the primary CPU goes into the kernel. We put these variables inside
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);
31
+}
62
+}
32
+
63
+
33
+/**
64
static void write_board_setup(ARMCPU *cpu, const struct arm_boot_info *info)
34
* ARMMMUFaultInfo: Information describing an ARM MMU Fault
65
{
35
* @s2addr: Address that caused a fault at stage 2
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
36
* @stage2: True if we faulted at stage 2
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
37
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
68
/* Pi2 and Pi3 requires SMP setup */
38
index XXXXXXX..XXXXXXX 100644
69
if (version >= 2) {
39
--- a/target/arm/cpu.c
70
binfo.smp_loader_start = SMPBOOT_ADDR;
40
+++ b/target/arm/cpu.c
71
- binfo.write_secondary_boot = write_smpboot;
41
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
72
+ if (version == 2) {
42
env->regs[15] = 0xFFFF0000;
73
+ binfo.write_secondary_boot = write_smpboot;
74
+ } else {
75
+ binfo.write_secondary_boot = write_smpboot64;
76
+ }
77
binfo.secondary_cpu_reset_hook = reset_secondary;
43
}
78
}
44
79
45
+ /* M profile requires that reset clears the exclusive monitor;
46
+ * A profile does not, but clearing it makes more sense than having it
47
+ * set with an exclusive access on address zero.
48
+ */
49
+ arm_clear_exclusive(env);
50
+
51
env->vfp.xregs[ARM_VFP_FPEXC] = 0;
52
#endif
53
54
diff --git a/target/arm/helper.c b/target/arm/helper.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/target/arm/helper.c
57
+++ b/target/arm/helper.c
58
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr)
59
60
armv7m_nvic_acknowledge_irq(env->nvic);
61
switch_v7m_sp(env, 0);
62
+ arm_clear_exclusive(env);
63
/* Clear IT bits */
64
env->condexec_bits = 0;
65
env->regs[14] = lr;
66
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
67
}
68
69
/* Otherwise, we have a successful exception exit. */
70
+ arm_clear_exclusive(env);
71
qemu_log_mask(CPU_LOG_INT, "...successful exception return\n");
72
}
73
74
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/target/arm/op_helper.c
77
+++ b/target/arm/op_helper.c
78
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env)
79
80
aarch64_save_sp(env, cur_el);
81
82
- env->exclusive_addr = -1;
83
+ arm_clear_exclusive(env);
84
85
/* We must squash the PSTATE.SS bit to zero unless both of the
86
* following hold:
87
--
80
--
88
2.7.4
81
2.16.2
89
82
90
83
diff view generated by jsdifflib
Deleted patch
1
In do_v7m_exception_exit(), there's no need to force the high 4
2
bits of 'type' to 1 when calling v7m_exception_taken(), because
3
we know that they're always 1 or we could not have got to this
4
"handle return to magic exception return address" code. Remove
5
the unnecessary ORs.
6
1
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Acked-by: Alistair Francis <alistair.francis@xilinx.com>
10
Message-id: 1505137930-13255-6-git-send-email-peter.maydell@linaro.org
11
---
12
target/arm/helper.c | 4 ++--
13
1 file changed, 2 insertions(+), 2 deletions(-)
14
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
18
+++ b/target/arm/helper.c
19
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
20
*/
21
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
22
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
23
- v7m_exception_taken(cpu, type | 0xf0000000);
24
+ v7m_exception_taken(cpu, type);
25
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
26
"stackframe: failed exception return integrity check\n");
27
return;
28
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
29
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
30
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
31
v7m_push_stack(cpu);
32
- v7m_exception_taken(cpu, type | 0xf0000000);
33
+ v7m_exception_taken(cpu, type);
34
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on new stackframe: "
35
"failed exception return integrity check\n");
36
return;
37
--
38
2.7.4
39
40
diff view generated by jsdifflib
Deleted patch
1
From: Alistair Francis <alistair.francis@xilinx.com>
2
1
3
The EP108 is a early access development board. Now that silicon is in
4
production people have access to the ZCU102. Let's rename the internal
5
QEMU files and variables to use the ZCU102.
6
7
There is no functional change here as the EP108 is still a valid board
8
option.
9
10
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/Makefile.objs | 2 +-
15
hw/arm/{xlnx-ep108.c => xlnx-zcu102.c} | 30 +++++++++++++++---------------
16
2 files changed, 16 insertions(+), 16 deletions(-)
17
rename hw/arm/{xlnx-ep108.c => xlnx-zcu102.c} (85%)
18
19
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/Makefile.objs
22
+++ b/hw/arm/Makefile.objs
23
@@ -XXX,XX +XXX,XX @@ obj-y += omap1.o omap2.o strongarm.o
24
obj-$(CONFIG_ALLWINNER_A10) += allwinner-a10.o cubieboard.o
25
obj-$(CONFIG_RASPI) += bcm2835_peripherals.o bcm2836.o raspi.o
26
obj-$(CONFIG_STM32F205_SOC) += stm32f205_soc.o
27
-obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-zynqmp.o xlnx-ep108.o
28
+obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-zynqmp.o xlnx-zcu102.o
29
obj-$(CONFIG_FSL_IMX25) += fsl-imx25.o imx25_pdk.o
30
obj-$(CONFIG_FSL_IMX31) += fsl-imx31.o kzm.o
31
obj-$(CONFIG_FSL_IMX6) += fsl-imx6.o sabrelite.o
32
diff --git a/hw/arm/xlnx-ep108.c b/hw/arm/xlnx-zcu102.c
33
similarity index 85%
34
rename from hw/arm/xlnx-ep108.c
35
rename to hw/arm/xlnx-zcu102.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/hw/arm/xlnx-ep108.c
38
+++ b/hw/arm/xlnx-zcu102.c
39
@@ -XXX,XX +XXX,XX @@
40
/*
41
- * Xilinx ZynqMP EP108 board
42
+ * Xilinx ZynqMP ZCU102 board
43
*
44
* Copyright (C) 2015 Xilinx Inc
45
* Written by Peter Crosthwaite <peter.crosthwaite@xilinx.com>
46
@@ -XXX,XX +XXX,XX @@
47
#include "exec/address-spaces.h"
48
#include "qemu/log.h"
49
50
-typedef struct XlnxEP108 {
51
+typedef struct XlnxZCU102 {
52
XlnxZynqMPState soc;
53
MemoryRegion ddr_ram;
54
-} XlnxEP108;
55
+} XlnxZCU102;
56
57
-static struct arm_boot_info xlnx_ep108_binfo;
58
+static struct arm_boot_info xlnx_zcu102_binfo;
59
60
-static void xlnx_ep108_init(MachineState *machine)
61
+static void xlnx_zcu102_init(MachineState *machine)
62
{
63
- XlnxEP108 *s = g_new0(XlnxEP108, 1);
64
+ XlnxZCU102 *s = g_new0(XlnxZCU102, 1);
65
int i;
66
uint64_t ram_size = machine->ram_size;
67
68
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_init(MachineState *machine)
69
}
70
71
if (ram_size < 0x08000000) {
72
- qemu_log("WARNING: RAM size 0x%" PRIx64 " is small for EP108",
73
+ qemu_log("WARNING: RAM size 0x%" PRIx64 " is small for ZCU102",
74
ram_size);
75
}
76
77
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_init(MachineState *machine)
78
79
/* TODO create and connect IDE devices for ide_drive_get() */
80
81
- xlnx_ep108_binfo.ram_size = ram_size;
82
- xlnx_ep108_binfo.kernel_filename = machine->kernel_filename;
83
- xlnx_ep108_binfo.kernel_cmdline = machine->kernel_cmdline;
84
- xlnx_ep108_binfo.initrd_filename = machine->initrd_filename;
85
- xlnx_ep108_binfo.loader_start = 0;
86
- arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_ep108_binfo);
87
+ xlnx_zcu102_binfo.ram_size = ram_size;
88
+ xlnx_zcu102_binfo.kernel_filename = machine->kernel_filename;
89
+ xlnx_zcu102_binfo.kernel_cmdline = machine->kernel_cmdline;
90
+ xlnx_zcu102_binfo.initrd_filename = machine->initrd_filename;
91
+ xlnx_zcu102_binfo.loader_start = 0;
92
+ arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_zcu102_binfo);
93
}
94
95
static void xlnx_ep108_machine_init(MachineClass *mc)
96
{
97
mc->desc = "Xilinx ZynqMP EP108 board";
98
- mc->init = xlnx_ep108_init;
99
+ mc->init = xlnx_zcu102_init;
100
mc->block_default_type = IF_IDE;
101
mc->units_per_default_bus = 1;
102
mc->ignore_memory_transaction_failures = true;
103
@@ -XXX,XX +XXX,XX @@ DEFINE_MACHINE("xlnx-ep108", xlnx_ep108_machine_init)
104
static void xlnx_zcu102_machine_init(MachineClass *mc)
105
{
106
mc->desc = "Xilinx ZynqMP ZCU102 board";
107
- mc->init = xlnx_ep108_init;
108
+ mc->init = xlnx_zcu102_init;
109
mc->block_default_type = IF_IDE;
110
mc->units_per_default_bus = 1;
111
mc->ignore_memory_transaction_failures = true;
112
--
113
2.7.4
114
115
diff view generated by jsdifflib
Deleted patch
1
From: Jaroslaw Pelczar <j.pelczar@samsung.com>
2
1
3
Previously when single stepping through ERET instruction via GDB
4
would result in debugger entering the "next" PC after ERET instruction.
5
When debugging in kernel mode, this will also cause unintended behavior,
6
because debugger will try to access memory from EL0 point of view.
7
8
Signed-off-by: Jaroslaw Pelczar <j.pelczar@samsung.com>
9
Message-id: 001c01d32895$483027f0$d89077d0$@samsung.com
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/translate-a64.c | 1 +
14
1 file changed, 1 insertion(+)
15
16
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-a64.c
19
+++ b/target/arm/translate-a64.c
20
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
21
default:
22
gen_a64_set_pc_im(dc->pc);
23
/* fall through */
24
+ case DISAS_EXIT:
25
case DISAS_JUMP:
26
if (dc->base.singlestep_enabled) {
27
gen_exception_internal(EXCP_DEBUG);
28
--
29
2.7.4
30
31
diff view generated by jsdifflib
Deleted patch
1
Fix an error that meant we were wiring every UART's overflow
2
interrupts into the same inputs 0 and 1 of the OR gate,
3
rather than giving each its own input.
4
1
5
Cc: qemu-stable@nongnu.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
9
Message-id: 1505232834-20890-1-git-send-email-peter.maydell@linaro.org
10
---
11
hw/arm/mps2.c | 4 ++--
12
1 file changed, 2 insertions(+), 2 deletions(-)
13
14
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/mps2.c
17
+++ b/hw/arm/mps2.c
18
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
19
cmsdk_apb_uart_create(uartbase[i],
20
qdev_get_gpio_in(txrx_orgate_dev, 0),
21
qdev_get_gpio_in(txrx_orgate_dev, 1),
22
- qdev_get_gpio_in(orgate_dev, 0),
23
- qdev_get_gpio_in(orgate_dev, 1),
24
+ qdev_get_gpio_in(orgate_dev, i * 2),
25
+ qdev_get_gpio_in(orgate_dev, i * 2 + 1),
26
NULL,
27
uartchr, SYSCLK_FRQ);
28
}
29
--
30
2.7.4
31
32
diff view generated by jsdifflib