1
Arm patch queue -- these are all bug fix patches but we might
1
The following changes since commit 6eeea6725a70e6fcb5abba0764496bdab07ddfb3:
2
as well put them in to rc0...
3
2
4
thanks
3
Merge remote-tracking branch 'remotes/huth-gitlab/tags/pull-request-2020-10-06' into staging (2020-10-06 21:13:34 +0100)
5
-- PMM
6
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
8
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
10
4
11
are available in the Git repository at:
5
are available in the Git repository at:
12
6
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201008
14
8
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
9
for you to fetch changes up to ba118c26e16a97e6ff6de8184057d3420ce16a23:
16
10
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
11
target/arm: Make '-cpu max' have a 48-bit PA (2020-10-08 15:24:32 +0100)
18
12
19
----------------------------------------------------------------
13
----------------------------------------------------------------
20
target-arm queue:
14
target-arm queue:
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
15
* hw/ssi/npcm7xx_fiu: Fix handling of unsigned integer
22
* dump: Update correct kdump phys_base field for AArch64
16
* hw/arm/fsl-imx25: Fix a typo
23
* char: i.MX: Add support for "TX complete" interrupt
17
* hw/arm/sbsa-ref : Fix SMMUv3 Initialisation
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
18
* hw/arm/sbsa-ref : allocate IRQs for SMMUv3
25
to boot a Debian Linux kernel on raspi3
19
* hw/char/bcm2835_aux: Allow less than 32-bit accesses
20
* hw/arm/virt: Implement kvm-steal-time
21
* target/arm: Make '-cpu max' have a 48-bit PA
26
22
27
----------------------------------------------------------------
23
----------------------------------------------------------------
28
Andrey Smirnov (2):
24
Andrew Jones (6):
29
char: i.MX: Simplify imx_update()
25
linux headers: sync to 5.9-rc7
30
char: i.MX: Add support for "TX complete" interrupt
26
target/arm/kvm: Make uncalled stubs explicitly unreachable
27
hw/arm/virt: Move post cpu realize check into its own function
28
hw/arm/virt: Move kvm pmu setup to virt_cpu_post_init
29
tests/qtest: Restore aarch64 arm-cpu-features test
30
hw/arm/virt: Implement kvm-steal-time
31
31
32
Guenter Roeck (1):
32
Graeme Gregory (2):
33
fsl-imx6: Swap Ethernet interrupt defines
33
hw/arm/sbsa-ref : Fix SMMUv3 Initialisation
34
hw/arm/sbsa-ref : allocate IRQs for SMMUv3
34
35
35
Peter Maydell (9):
36
Peter Maydell (1):
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
37
target/arm: Make '-cpu max' have a 48-bit PA
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
38
46
Wei Huang (1):
39
Philippe Mathieu-Daudé (3):
47
dump: Update correct kdump phys_base field for AArch64
40
hw/ssi/npcm7xx_fiu: Fix handling of unsigned integer
41
hw/arm/fsl-imx25: Fix a typo
42
hw/char/bcm2835_aux: Allow less than 32-bit accesses
48
43
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
44
docs/system/arm/cpu-features.rst | 11 ++++
50
include/hw/arm/fsl-imx6.h | 4 +-
45
include/hw/arm/fsl-imx25.h | 2 +-
51
include/hw/char/imx_serial.h | 3 ++
46
include/hw/arm/virt.h | 5 ++
52
dump.c | 14 +++++--
47
linux-headers/linux/kvm.h | 6 ++-
53
hw/arm/bcm2836.c | 87 +++++++++++++++++++++++++++++++-------------
48
target/arm/cpu.h | 4 ++
54
hw/arm/boot.c | 12 ++++++
49
target/arm/kvm_arm.h | 94 ++++++++++++++++++++++++++-------
55
hw/arm/raspi.c | 77 +++++++++++++++++++++++++++++++--------
50
hw/arm/sbsa-ref.c | 3 +-
56
hw/char/imx_serial.c | 44 ++++++++++++++++------
51
hw/arm/virt.c | 110 ++++++++++++++++++++++++++++-----------
57
hw/net/imx_fec.c | 28 +++++++++++++-
52
hw/char/bcm2835_aux.c | 4 +-
58
9 files changed, 237 insertions(+), 63 deletions(-)
53
hw/ssi/npcm7xx_fiu.c | 12 ++---
54
target/arm/cpu.c | 8 +++
55
target/arm/cpu64.c | 4 ++
56
target/arm/kvm.c | 16 ++++++
57
target/arm/kvm64.c | 64 +++++++++++++++++++++--
58
target/arm/monitor.c | 2 +-
59
tests/qtest/arm-cpu-features.c | 25 +++++++--
60
hw/ssi/trace-events | 2 +-
61
tests/qtest/meson.build | 3 +-
62
18 files changed, 303 insertions(+), 72 deletions(-)
59
63
diff view generated by jsdifflib
1
If we're directly booting a Linux kernel and the CPU supports both
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
3
set the SCR_EL3.HCE bit in this situation, so that the HVC
4
instruction is enabled rather than UNDEFing. Otherwise at least some
5
kernels will panic when trying to initialize KVM in the guest.
6
2
3
Fix integer handling issues handling issue reported by Coverity:
4
5
hw/ssi/npcm7xx_fiu.c: 162 in npcm7xx_fiu_flash_read()
6
>>> CID 1432730: Integer handling issues (NEGATIVE_RETURNS)
7
>>> "npcm7xx_fiu_cs_index(fiu, f)" is passed to a parameter that cannot be negative.
8
162 npcm7xx_fiu_select(fiu, npcm7xx_fiu_cs_index(fiu, f));
9
10
hw/ssi/npcm7xx_fiu.c: 221 in npcm7xx_fiu_flash_write()
11
218 cs_id = npcm7xx_fiu_cs_index(fiu, f);
12
219 trace_npcm7xx_fiu_flash_write(DEVICE(fiu)->canonical_path, cs_id, addr,
13
220 size, v);
14
>>> CID 1432729: Integer handling issues (NEGATIVE_RETURNS)
15
>>> "cs_id" is passed to a parameter that cannot be negative.
16
221 npcm7xx_fiu_select(fiu, cs_id);
17
18
Since the index of the flash can not be negative, return an
19
unsigned type.
20
21
Reported-by: Coverity (CID 1432729 & 1432730: NEGATIVE_RETURNS)
22
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
23
Reviewed-by: Havard Skinnemoen <hskinnemoen@google.com>
24
Message-id: 20200919132435.310527-1-f4bug@amsat.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
9
---
26
---
10
hw/arm/boot.c | 5 +++++
27
hw/ssi/npcm7xx_fiu.c | 12 ++++++------
11
1 file changed, 5 insertions(+)
28
hw/ssi/trace-events | 2 +-
29
2 files changed, 7 insertions(+), 7 deletions(-)
12
30
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
31
diff --git a/hw/ssi/npcm7xx_fiu.c b/hw/ssi/npcm7xx_fiu.c
14
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/boot.c
33
--- a/hw/ssi/npcm7xx_fiu.c
16
+++ b/hw/arm/boot.c
34
+++ b/hw/ssi/npcm7xx_fiu.c
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
35
@@ -XXX,XX +XXX,XX @@ enum NPCM7xxFIURegister {
18
assert(!info->secure_board_setup);
36
* Returns the index of flash in the fiu->flash array. This corresponds to the
19
}
37
* chip select ID of the flash.
20
38
*/
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
39
-static int npcm7xx_fiu_cs_index(NPCM7xxFIUState *fiu, NPCM7xxFIUFlash *flash)
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
40
+static unsigned npcm7xx_fiu_cs_index(NPCM7xxFIUState *fiu,
23
+ env->cp15.scr_el3 |= SCR_HCE;
41
+ NPCM7xxFIUFlash *flash)
24
+ }
42
{
25
+
43
int index = flash - fiu->flash;
26
/* Set to non-secure if not a secure boot */
44
27
if (!info->secure_boot &&
45
@@ -XXX,XX +XXX,XX @@ static int npcm7xx_fiu_cs_index(NPCM7xxFIUState *fiu, NPCM7xxFIUFlash *flash)
28
(cs != first_cpu || !info->secure_board_setup)) {
46
}
47
48
/* Assert the chip select specified in the UMA Control/Status Register. */
49
-static void npcm7xx_fiu_select(NPCM7xxFIUState *s, int cs_id)
50
+static void npcm7xx_fiu_select(NPCM7xxFIUState *s, unsigned cs_id)
51
{
52
trace_npcm7xx_fiu_select(DEVICE(s)->canonical_path, cs_id);
53
54
if (cs_id < s->cs_count) {
55
qemu_irq_lower(s->cs_lines[cs_id]);
56
+ s->active_cs = cs_id;
57
} else {
58
qemu_log_mask(LOG_GUEST_ERROR,
59
"%s: UMA to CS%d; this module has only %d chip selects",
60
DEVICE(s)->canonical_path, cs_id, s->cs_count);
61
- cs_id = -1;
62
+ s->active_cs = -1;
63
}
64
-
65
- s->active_cs = cs_id;
66
}
67
68
/* Deassert the currently active chip select. */
69
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_fiu_flash_write(void *opaque, hwaddr addr, uint64_t v,
70
NPCM7xxFIUFlash *f = opaque;
71
NPCM7xxFIUState *fiu = f->fiu;
72
uint32_t dwr_cfg;
73
- int cs_id;
74
+ unsigned cs_id;
75
int i;
76
77
if (fiu->active_cs != -1) {
78
diff --git a/hw/ssi/trace-events b/hw/ssi/trace-events
79
index XXXXXXX..XXXXXXX 100644
80
--- a/hw/ssi/trace-events
81
+++ b/hw/ssi/trace-events
82
@@ -XXX,XX +XXX,XX @@ npcm7xx_fiu_deselect(const char *id, int cs) "%s deselect CS%d"
83
npcm7xx_fiu_ctrl_read(const char *id, uint64_t addr, uint32_t data) "%s offset: 0x%04" PRIx64 " value: 0x%08" PRIx32
84
npcm7xx_fiu_ctrl_write(const char *id, uint64_t addr, uint32_t data) "%s offset: 0x%04" PRIx64 " value: 0x%08" PRIx32
85
npcm7xx_fiu_flash_read(const char *id, int cs, uint64_t addr, unsigned int size, uint64_t value) "%s[%d] offset: 0x%08" PRIx64 " size: %u value: 0x%" PRIx64
86
-npcm7xx_fiu_flash_write(const char *id, int cs, uint64_t addr, unsigned int size, uint64_t value) "%s[%d] offset: 0x%08" PRIx64 " size: %u value: 0x%" PRIx64
87
+npcm7xx_fiu_flash_write(const char *id, unsigned cs, uint64_t addr, unsigned int size, uint64_t value) "%s[%d] offset: 0x%08" PRIx64 " size: %u value: 0x%" PRIx64
29
--
88
--
30
2.16.2
89
2.20.1
31
90
32
91
diff view generated by jsdifflib
1
The TypeInfo and state struct for bcm2386 disagree about what the
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
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.
9
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Message-id: 20201002080935.1660005-1-f4bug@amsat.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180313153458.26822-5-peter.maydell@linaro.org
14
---
7
---
15
hw/arm/bcm2836.c | 2 +-
8
include/hw/arm/fsl-imx25.h | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
9
1 file changed, 1 insertion(+), 1 deletion(-)
17
10
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
11
diff --git a/include/hw/arm/fsl-imx25.h b/include/hw/arm/fsl-imx25.h
19
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/bcm2836.c
13
--- a/include/hw/arm/fsl-imx25.h
21
+++ b/hw/arm/bcm2836.c
14
+++ b/include/hw/arm/fsl-imx25.h
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
15
@@ -XXX,XX +XXX,XX @@ struct FslIMX25State {
23
16
* 0xBB00_0000 0xBB00_0FFF 4 Kbytes NAND flash main area buffer
24
static const TypeInfo bcm2836_type_info = {
17
* 0xBB00_1000 0xBB00_11FF 512 B NAND flash spare area buffer
25
.name = TYPE_BCM2836,
18
* 0xBB00_1200 0xBB00_1DFF 3 Kbytes Reserved
26
- .parent = TYPE_SYS_BUS_DEVICE,
19
- * 0xBB00_1E00 0xBB00_1FFF 512 B NAND flash control regisers
27
+ .parent = TYPE_DEVICE,
20
+ * 0xBB00_1E00 0xBB00_1FFF 512 B NAND flash control registers
28
.instance_size = sizeof(BCM2836State),
21
* 0xBB01_2000 0xBFFF_FFFF 96 Mbytes (minus 8 Kbytes) Reserved
29
.instance_init = bcm2836_init,
22
* 0xC000_0000 0xFFFF_FFFF 1024 Mbytes Reserved
30
.class_init = bcm2836_class_init,
23
*/
31
--
24
--
32
2.16.2
25
2.20.1
33
26
34
27
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Graeme Gregory <graeme@nuviainc.com>
2
2
3
Code of imx_update() is slightly confusing since the "flags" variable
3
SMMUv3 has an error in a previous patch where an i was transposed to a 1
4
doesn't really corespond to anything in real hardware and server as a
4
meaning interrupts would not have been correctly assigned to the SMMUv3
5
kitchensink accumulating events normally reported via USR1 and USR2
5
instance.
6
registers.
7
6
8
Change the code to explicitly evaluate state of interrupts reported
7
Fixes: 48ba18e6d3f3 ("hw/arm/sbsa-ref: Simplify by moving the gic in the machine state")
9
via USR1 and USR2 against corresponding masking bits and use the to
8
Signed-off-by: Graeme Gregory <graeme@nuviainc.com>
10
detemine if IRQ line should be asserted or not.
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
12
NOTE: Check for UTS1_TXEMPTY being set has been dropped for two
11
Message-id: 20201007100732.4103790-2-graeme@nuviainc.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>
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
---
13
---
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
14
hw/arm/sbsa-ref.c | 2 +-
34
1 file changed, 16 insertions(+), 8 deletions(-)
15
1 file changed, 1 insertion(+), 1 deletion(-)
35
16
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
17
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
37
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/char/imx_serial.c
19
--- a/hw/arm/sbsa-ref.c
39
+++ b/hw/char/imx_serial.c
20
+++ b/hw/arm/sbsa-ref.c
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
21
@@ -XXX,XX +XXX,XX @@ static void create_smmu(const SBSAMachineState *sms, PCIBus *bus)
41
22
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
42
static void imx_update(IMXSerialState *s)
23
for (i = 0; i < NUM_SMMU_IRQS; i++) {
43
{
24
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
44
- uint32_t flags;
25
- qdev_get_gpio_in(sms->gic, irq + 1));
45
+ uint32_t usr1;
26
+ qdev_get_gpio_in(sms->gic, irq + i));
46
+ uint32_t usr2;
27
}
47
+ uint32_t mask;
48
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
52
- } else {
53
- flags &= ~USR1_TRDY;
54
- }
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);
70
}
28
}
71
29
72
static void imx_serial_reset(IMXSerialState *s)
73
--
30
--
74
2.16.2
31
2.20.1
75
32
76
33
diff view generated by jsdifflib
1
Now we have separate types for BCM2386 and BCM2387, we might as well
1
From: Graeme Gregory <graeme@nuviainc.com>
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.
5
2
6
Note that this change means that it's no longer possible on
3
Original commit did not allocate IRQs for the SMMUv3 in the irqmap
7
the command line to use -cpu to ask for a different kind of
4
effectively using irq 0->3 (shared with other devices). Assuming
8
CPU than the SoC supports. This was never a supported thing to
5
original intent was to allocate unique IRQs then add an allocation
9
do anyway; we were just not sanity-checking the command line.
6
to the irqmap.
10
7
11
This does require us to only build the bcm2837 object on
8
Fixes: e9fdf453240 ("hw/arm: Add arm SBSA reference machine, devices part")
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
due to the missing cortex-a53 device and "make check" will fail.
10
Signed-off-by: Graeme Gregory <graeme@nuviainc.com>
11
Reviewed-by: Eric Auger <eric.auger@redhat.com>
12
Message-id: 20201007100732.4103790-3-graeme@nuviainc.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/arm/sbsa-ref.c | 1 +
16
1 file changed, 1 insertion(+)
14
17
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
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
19
---
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
21
hw/arm/raspi.c | 2 --
22
2 files changed, 15 insertions(+), 11 deletions(-)
23
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
25
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/bcm2836.c
20
--- a/hw/arm/sbsa-ref.c
27
+++ b/hw/arm/bcm2836.c
21
+++ b/hw/arm/sbsa-ref.c
28
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ static const int sbsa_ref_irqmap[] = {
29
23
[SBSA_SECURE_UART_MM] = 9,
30
struct BCM283XInfo {
24
[SBSA_AHCI] = 10,
31
const char *name;
25
[SBSA_EHCI] = 11,
32
+ const char *cpu_type;
26
+ [SBSA_SMMU] = 12, /* ... to 15 */
33
int clusterid;
34
};
27
};
35
28
36
static const BCM283XInfo bcm283x_socs[] = {
29
static uint64_t sbsa_ref_cpu_mp_affinity(SBSAMachineState *sms, int idx)
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;
57
+
58
+ for (n = 0; n < BCM283X_NCPUS; n++) {
59
+ object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
60
+ info->cpu_type);
61
+ object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
62
+ &error_abort);
63
+ }
64
65
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
66
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
67
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
68
69
/* common peripherals from bcm2835 */
70
71
- obj = OBJECT(dev);
72
- for (n = 0; n < BCM283X_NCPUS; n++) {
73
- object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
74
- s->cpu_type);
75
- object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
76
- &error_abort);
77
- }
78
-
79
obj = object_property_get_link(OBJECT(dev), "ram", &err);
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)
83
}
84
85
static Property bcm2836_props[] = {
86
- DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
87
DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
88
BCM283X_NCPUS),
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
--
30
--
104
2.16.2
31
2.20.1
105
32
106
33
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
3
The "BCM2835 ARM Peripherals" datasheet [*] chapter 2
4
it is needed to support guests other than Linux.
4
("Auxiliaries: UART1 & SPI1, SPI2"), list the register
5
sizes as 3/8/16/32 bits. We assume this means this
6
peripheral allows 8-bit accesses.
5
7
6
Based on the patch by Bill Paul as found here:
8
This was not an issue until commit 5d971f9e67 which reverted
7
https://bugs.launchpad.net/qemu/+bug/1753314
9
("memory: accept mismatching sizes in memory_region_access_valid").
8
10
9
Cc: qemu-devel@nongnu.org
11
The model is implemented as 32-bit accesses (see commit 97398d900c,
10
Cc: qemu-arm@nongnu.org
12
all registers are 32-bit) so replace MemoryRegionOps.valid as
11
Cc: Bill Paul <wpaul@windriver.com>
13
MemoryRegionOps.impl, and re-introduce MemoryRegionOps.valid
12
Cc: Peter Maydell <peter.maydell@linaro.org>
14
with a 8/32-bit range.
13
Signed-off-by: Bill Paul <wpaul@windriver.com>
15
14
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
16
[*] https://www.raspberrypi.org/app/uploads/2012/02/BCM2835-ARM-Peripherals.pdf
15
Message-id: 20180315191141.6789-2-andrew.smirnov@gmail.com
17
18
Fixes: 97398d900c ("bcm2835_aux: add emulation of BCM2835 AUX (aka UART1) block")
19
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
Message-id: 20201002181032.1899463-1-f4bug@amsat.org
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
23
---
19
include/hw/char/imx_serial.h | 3 +++
24
hw/char/bcm2835_aux.c | 4 +++-
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
25
1 file changed, 3 insertions(+), 1 deletion(-)
21
2 files changed, 20 insertions(+), 3 deletions(-)
22
26
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
27
diff --git a/hw/char/bcm2835_aux.c b/hw/char/bcm2835_aux.c
24
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/char/imx_serial.h
29
--- a/hw/char/bcm2835_aux.c
26
+++ b/include/hw/char/imx_serial.h
30
+++ b/hw/char/bcm2835_aux.c
27
@@ -XXX,XX +XXX,XX @@
31
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps bcm2835_aux_ops = {
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
32
.read = bcm2835_aux_read,
29
#define UCR2_SRST (1<<0) /* Reset complete */
33
.write = bcm2835_aux_write,
30
34
.endianness = DEVICE_NATIVE_ENDIAN,
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
35
- .valid.min_access_size = 4,
32
+
36
+ .impl.min_access_size = 4,
33
#define UTS1_TXEMPTY (1<<6)
37
+ .impl.max_access_size = 4,
34
#define UTS1_RXEMPTY (1<<5)
38
+ .valid.min_access_size = 1,
35
#define UTS1_TXFULL (1<<4)
39
.valid.max_access_size = 4,
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
};
40
};
67
@@ -XXX,XX +XXX,XX @@ static void imx_update(IMXSerialState *s)
41
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
--
42
--
114
2.16.2
43
2.20.1
115
44
116
45
diff view generated by jsdifflib
1
The bcm2837 is pretty similar to the bcm2836, but it does have
1
From: Andrew Jones <drjones@redhat.com>
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
Update against Linux 5.9-rc7.
7
configure it differently for the two cases, create two
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.
12
4
5
Cc: Paolo Bonzini <pbonzini@redhat.com>
6
Signed-off-by: Andrew Jones <drjones@redhat.com>
7
Message-id: 20201001061718.101915-2-drjones@redhat.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
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
---
9
---
17
include/hw/arm/bcm2836.h | 19 +++++++++++++++++++
10
linux-headers/linux/kvm.h | 6 ++++--
18
hw/arm/bcm2836.c | 37 ++++++++++++++++++++++++++++++++-----
11
1 file changed, 4 insertions(+), 2 deletions(-)
19
hw/arm/raspi.c | 3 ++-
20
3 files changed, 53 insertions(+), 6 deletions(-)
21
12
22
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
13
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
23
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/bcm2836.h
15
--- a/linux-headers/linux/kvm.h
25
+++ b/include/hw/arm/bcm2836.h
16
+++ b/linux-headers/linux/kvm.h
26
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ struct kvm_ppc_resize_hpt {
27
18
#define KVM_VM_PPC_HV 1
28
#define BCM283X_NCPUS 4
19
#define KVM_VM_PPC_PR 2
29
20
30
+/* These type names are for specific SoCs; other than instantiating
21
-/* on MIPS, 0 forces trap & emulate, 1 forces VZ ASE */
31
+ * them, code using these devices should always handle them via the
22
-#define KVM_VM_MIPS_TE        0
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
23
+/* on MIPS, 0 indicates auto, 1 forces VZ ASE, 2 forces trap & emulate */
33
+ */
24
+#define KVM_VM_MIPS_AUTO    0
34
+#define TYPE_BCM2836 "bcm2836"
25
#define KVM_VM_MIPS_VZ        1
35
+#define TYPE_BCM2837 "bcm2837"
26
+#define KVM_VM_MIPS_TE        2
36
+
27
37
typedef struct BCM283XState {
28
#define KVM_S390_SIE_PAGE_OFFSET 1
38
/*< private >*/
29
39
DeviceState parent_obj;
30
@@ -XXX,XX +XXX,XX @@ struct kvm_ppc_resize_hpt {
40
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
31
#define KVM_CAP_LAST_CPU 184
41
BCM2835PeripheralState peripherals;
32
#define KVM_CAP_SMALLER_MAXPHYADDR 185
42
} BCM283XState;
33
#define KVM_CAP_S390_DIAG318 186
43
34
+#define KVM_CAP_STEAL_TIME 187
44
+typedef struct BCM283XInfo BCM283XInfo;
35
45
+
36
#ifdef KVM_CAP_IRQ_ROUTING
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
37
140
--
38
--
141
2.16.2
39
2.20.1
142
40
143
41
diff view generated by jsdifflib
1
Our BCM2836 type is really a generic one that can be any of
1
From: Andrew Jones <drjones@redhat.com>
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
When we compile without KVM support !defined(CONFIG_KVM) we generate
8
parent class to specific types for the bcm2836 and bcm2837.
4
stubs for functions that the linker will still encounter. Sometimes
5
these stubs can be executed safely and are placed in paths where they
6
get executed with or without KVM. Other functions should never be
7
called without KVM. Those functions should be guarded by kvm_enabled(),
8
but should also be robust to refactoring mistakes. Putting a
9
g_assert_not_reached() in the function should help. Additionally,
10
the g_assert_not_reached() calls may actually help the linker remove
11
some code.
9
12
13
We remove the stubs for kvm_arm_get/put_virtual_time(), as they aren't
14
necessary at all - the only caller is in kvm.c
15
16
Reviewed-by: Eric Auger <eric.auger@redhat.com>
17
Signed-off-by: Andrew Jones <drjones@redhat.com>
18
Message-id: 20201001061718.101915-3-drjones@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
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
---
20
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
21
target/arm/kvm_arm.h | 51 +++++++++++++++++++++++++++-----------------
16
hw/arm/bcm2836.c | 17 +++++++++--------
22
1 file changed, 32 insertions(+), 19 deletions(-)
17
hw/arm/raspi.c | 16 ++++++++--------
18
3 files changed, 23 insertions(+), 22 deletions(-)
19
23
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
24
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
21
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/bcm2836.h
26
--- a/target/arm/kvm_arm.h
23
+++ b/include/hw/arm/bcm2836.h
27
+++ b/target/arm/kvm_arm.h
24
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@ int kvm_arm_set_irq(int cpu, int irqtype, int irq, int level);
25
#include "hw/arm/bcm2835_peripherals.h"
29
26
#include "hw/intc/bcm2836_control.h"
30
#else
27
31
28
-#define TYPE_BCM2836 "bcm2836"
32
-static inline void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
29
-#define BCM2836(obj) OBJECT_CHECK(BCM2836State, (obj), TYPE_BCM2836)
33
-{
30
+#define TYPE_BCM283X "bcm283x"
34
- /*
31
+#define BCM283X(obj) OBJECT_CHECK(BCM283XState, (obj), TYPE_BCM283X)
35
- * This should never actually be called in the "not KVM" case,
32
36
- * but set up the fields to indicate an error anyway.
33
-#define BCM2836_NCPUS 4
37
- */
34
+#define BCM283X_NCPUS 4
38
- cpu->kvm_target = QEMU_KVM_ARM_TARGET_NONE;
35
39
- cpu->host_cpu_probe_failed = true;
36
-typedef struct BCM2836State {
40
-}
37
+typedef struct BCM283XState {
41
-
38
/*< private >*/
42
-static inline void kvm_arm_add_vcpu_properties(Object *obj) {}
39
DeviceState parent_obj;
43
-
40
/*< public >*/
44
+/*
41
@@ -XXX,XX +XXX,XX @@ typedef struct BCM2836State {
45
+ * It's safe to call these functions without KVM support.
42
char *cpu_type;
46
+ * They should either do nothing or return "not supported".
43
uint32_t enabled_cpus;
47
+ */
44
48
static inline bool kvm_arm_aarch32_supported(void)
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
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)
60
{
49
{
61
- BCM2836State *s = BCM2836(obj);
50
return false;
62
+ BCM283XState *s = BCM283X(obj);
51
@@ -XXX,XX +XXX,XX @@ static inline bool kvm_arm_sve_supported(void)
63
52
return false;
64
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
53
}
65
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
54
66
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
55
+/*
67
56
+ * These functions should never actually be called without KVM support.
68
static void bcm2836_realize(DeviceState *dev, Error **errp)
57
+ */
58
+static inline void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
59
+{
60
+ g_assert_not_reached();
61
+}
62
+
63
+static inline void kvm_arm_add_vcpu_properties(Object *obj)
64
+{
65
+ g_assert_not_reached();
66
+}
67
+
68
static inline int kvm_arm_get_max_vm_ipa_size(MachineState *ms)
69
{
69
{
70
- BCM2836State *s = BCM2836(dev);
70
- return -ENOENT;
71
+ BCM283XState *s = BCM283X(dev);
71
+ g_assert_not_reached();
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
}
72
}
95
73
96
static Property bcm2836_props[] = {
74
static inline int kvm_arm_vgic_probe(void)
97
- DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
75
{
98
- DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
76
- return 0;
99
+ DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
77
+ g_assert_not_reached();
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
}
78
}
107
79
108
static const TypeInfo bcm2836_type_info = {
80
-static inline void kvm_arm_pmu_set_irq(CPUState *cs, int irq) {}
109
- .name = TYPE_BCM2836,
81
-static inline void kvm_arm_pmu_init(CPUState *cs) {}
110
+ .name = TYPE_BCM283X,
82
+static inline void kvm_arm_pmu_set_irq(CPUState *cs, int irq)
111
.parent = TYPE_DEVICE,
83
+{
112
- .instance_size = sizeof(BCM2836State),
84
+ g_assert_not_reached();
113
+ .instance_size = sizeof(BCM283XState),
85
+}
114
.instance_init = bcm2836_init,
86
115
.class_init = bcm2836_class_init,
87
-static inline void kvm_arm_sve_get_vls(CPUState *cs, unsigned long *map) {}
116
};
88
+static inline void kvm_arm_pmu_init(CPUState *cs)
117
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
89
+{
118
index XXXXXXX..XXXXXXX 100644
90
+ g_assert_not_reached();
119
--- a/hw/arm/raspi.c
91
+}
120
+++ b/hw/arm/raspi.c
92
+
121
@@ -XXX,XX +XXX,XX @@
93
+static inline void kvm_arm_sve_get_vls(CPUState *cs, unsigned long *map)
122
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
94
+{
123
95
+ g_assert_not_reached();
124
typedef struct RasPiState {
96
+}
125
- BCM2836State soc;
97
126
+ BCM283XState soc;
98
-static inline void kvm_arm_get_virtual_time(CPUState *cs) {}
127
MemoryRegion ram;
99
-static inline void kvm_arm_put_virtual_time(CPUState *cs) {}
128
} RasPiState;
100
#endif
129
101
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
102
static inline const char *gic_class_name(void)
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
--
103
--
166
2.16.2
104
2.20.1
167
105
168
106
diff view generated by jsdifflib
1
The raspi3 has AArch64 CPUs, which means that our smpboot
1
From: Andrew Jones <drjones@redhat.com>
2
code for keeping the secondary CPUs in a pen needs to have
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.
6
2
3
We'll add more to this new function in coming patches so we also
4
state the gic must be created and call it below create_gic().
5
6
No functional change intended.
7
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Andrew Jones <drjones@redhat.com>
11
Message-id: 20201001061718.101915-4-drjones@redhat.com
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180313153458.26822-10-peter.maydell@linaro.org
10
---
13
---
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
14
hw/arm/virt.c | 43 +++++++++++++++++++++++++++----------------
12
1 file changed, 40 insertions(+), 1 deletion(-)
15
1 file changed, 27 insertions(+), 16 deletions(-)
13
16
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
19
--- a/hw/arm/virt.c
17
+++ b/hw/arm/raspi.c
20
+++ b/hw/arm/virt.c
18
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ static void finalize_gic_version(VirtMachineState *vms)
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 */
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
}
23
}
29
24
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
25
+/*
26
+ * virt_cpu_post_init() must be called after the CPUs have
27
+ * been realized and the GIC has been created.
28
+ */
29
+static void virt_cpu_post_init(VirtMachineState *vms)
31
+{
30
+{
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
31
+ bool aarch64;
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
+
32
+
54
+ static const uint64_t spintables[] = {
33
+ aarch64 = object_property_get_bool(OBJECT(first_cpu), "aarch64", NULL);
55
+ 0, 0, 0, 0
56
+ };
57
+
34
+
58
+ rom_add_blob_fixed("raspi_smpboot", smpboot, sizeof(smpboot),
35
+ if (!kvm_enabled()) {
59
+ info->smp_loader_start);
36
+ if (aarch64 && vms->highmem) {
60
+ rom_add_blob_fixed("raspi_spintables", spintables, sizeof(spintables),
37
+ int requested_pa_size = 64 - clz64(vms->highest_gpa);
61
+ SPINTABLE_ADDR);
38
+ int pamax = arm_pamax(ARM_CPU(first_cpu));
39
+
40
+ if (pamax < requested_pa_size) {
41
+ error_report("VCPU supports less PA bits (%d) than "
42
+ "requested by the memory map (%d)",
43
+ pamax, requested_pa_size);
44
+ exit(1);
45
+ }
46
+ }
47
+ }
62
+}
48
+}
63
+
49
+
64
static void write_board_setup(ARMCPU *cpu, const struct arm_boot_info *info)
50
static void machvirt_init(MachineState *machine)
65
{
51
{
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
52
VirtMachineState *vms = VIRT_MACHINE(machine);
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
53
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
68
/* Pi2 and Pi3 requires SMP setup */
54
fdt_add_timer_nodes(vms);
69
if (version >= 2) {
55
fdt_add_cpu_nodes(vms);
70
binfo.smp_loader_start = SMPBOOT_ADDR;
56
71
- binfo.write_secondary_boot = write_smpboot;
57
- if (!kvm_enabled()) {
72
+ if (version == 2) {
58
- ARMCPU *cpu = ARM_CPU(first_cpu);
73
+ binfo.write_secondary_boot = write_smpboot;
59
- bool aarch64 = object_property_get_bool(OBJECT(cpu), "aarch64", NULL);
74
+ } else {
60
-
75
+ binfo.write_secondary_boot = write_smpboot64;
61
- if (aarch64 && vms->highmem) {
76
+ }
62
- int requested_pa_size, pamax = arm_pamax(cpu);
77
binfo.secondary_cpu_reset_hook = reset_secondary;
63
-
78
}
64
- requested_pa_size = 64 - clz64(vms->highest_gpa);
79
65
- if (pamax < requested_pa_size) {
66
- error_report("VCPU supports less PA bits (%d) than requested "
67
- "by the memory map (%d)", pamax, requested_pa_size);
68
- exit(1);
69
- }
70
- }
71
- }
72
-
73
memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base,
74
machine->ram);
75
if (machine->device_memory) {
76
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
77
78
create_gic(vms);
79
80
+ virt_cpu_post_init(vms);
81
+
82
fdt_add_pmu_nodes(vms);
83
84
create_uart(vms, VIRT_UART, sysmem, serial_hd(0));
80
--
85
--
81
2.16.2
86
2.20.1
82
87
83
88
diff view generated by jsdifflib
1
From: Wei Huang <wei@redhat.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
For guest kernel that supports KASLR, the load address can change every
3
Move the KVM PMU setup part of fdt_add_pmu_nodes() to
4
time when guest VM runs. To find the physical base address correctly,
4
virt_cpu_post_init(), which is a more appropriate location. Now
5
current QEMU dump searches VMCOREINFO for the string "NUMBER(phys_base)=".
5
fdt_add_pmu_nodes() is also named more appropriately, because it
6
However this string pattern is only available on x86_64. AArch64 uses a
6
no longer does anything but fdt node creation.
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
No functional change intended.
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
9
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Eric Auger <eric.auger@redhat.com>
12
Signed-off-by: Andrew Jones <drjones@redhat.com>
13
Message-id: 20201001061718.101915-5-drjones@redhat.com
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
hw/arm/virt.c | 34 ++++++++++++++++++----------------
16
1 file changed, 11 insertions(+), 3 deletions(-)
17
1 file changed, 18 insertions(+), 16 deletions(-)
17
18
18
diff --git a/dump.c b/dump.c
19
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
19
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
20
--- a/dump.c
21
--- a/hw/arm/virt.c
21
+++ b/dump.c
22
+++ b/hw/arm/virt.c
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
23
@@ -XXX,XX +XXX,XX @@ static void fdt_add_gic_node(VirtMachineState *vms)
23
24
24
lines = g_strsplit((char *)vmci, "\n", -1);
25
static void fdt_add_pmu_nodes(const VirtMachineState *vms)
25
for (i = 0; lines[i]; i++) {
26
{
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
27
- CPUState *cpu;
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
28
- ARMCPU *armcpu;
28
+ const char *prefix = NULL;
29
+ ARMCPU *armcpu = ARM_CPU(first_cpu);
29
+
30
uint32_t irqflags = GIC_FDT_IRQ_FLAGS_LEVEL_HI;
30
+ if (s->dump_info.d_machine == EM_X86_64) {
31
31
+ prefix = "NUMBER(phys_base)=";
32
- CPU_FOREACH(cpu) {
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
33
- armcpu = ARM_CPU(cpu);
33
+ prefix = "NUMBER(PHYS_OFFSET)=";
34
- if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
35
- return;
36
- }
37
- if (kvm_enabled()) {
38
- if (kvm_irqchip_in_kernel()) {
39
- kvm_arm_pmu_set_irq(cpu, PPI(VIRTUAL_PMU_IRQ));
40
- }
41
- kvm_arm_pmu_init(cpu);
42
- }
43
+ if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
44
+ assert(!object_property_get_bool(OBJECT(armcpu), "pmu", NULL));
45
+ return;
46
}
47
48
if (vms->gic_version == VIRT_GIC_VERSION_2) {
49
@@ -XXX,XX +XXX,XX @@ static void fdt_add_pmu_nodes(const VirtMachineState *vms)
50
(1 << vms->smp_cpus) - 1);
51
}
52
53
- armcpu = ARM_CPU(qemu_get_cpu(0));
54
qemu_fdt_add_subnode(vms->fdt, "/pmu");
55
if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) {
56
const char compat[] = "arm,armv8-pmuv3";
57
@@ -XXX,XX +XXX,XX @@ static void finalize_gic_version(VirtMachineState *vms)
58
*/
59
static void virt_cpu_post_init(VirtMachineState *vms)
60
{
61
- bool aarch64;
62
+ bool aarch64, pmu;
63
+ CPUState *cpu;
64
65
aarch64 = object_property_get_bool(OBJECT(first_cpu), "aarch64", NULL);
66
+ pmu = object_property_get_bool(OBJECT(first_cpu), "pmu", NULL);
67
68
- if (!kvm_enabled()) {
69
+ if (kvm_enabled()) {
70
+ CPU_FOREACH(cpu) {
71
+ if (pmu) {
72
+ assert(arm_feature(&ARM_CPU(cpu)->env, ARM_FEATURE_PMU));
73
+ if (kvm_irqchip_in_kernel()) {
74
+ kvm_arm_pmu_set_irq(cpu, PPI(VIRTUAL_PMU_IRQ));
75
+ }
76
+ kvm_arm_pmu_init(cpu);
77
+ }
34
+ }
78
+ }
35
+
79
+ } else {
36
+ if (prefix && g_str_has_prefix(lines[i], prefix)) {
80
if (aarch64 && vms->highmem) {
37
+ if (qemu_strtou64(lines[i] + strlen(prefix), NULL, 16,
81
int requested_pa_size = 64 - clz64(vms->highest_gpa);
38
&phys_base) < 0) {
82
int pamax = arm_pamax(ARM_CPU(first_cpu));
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
--
83
--
45
2.16.2
84
2.20.1
46
85
47
86
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
The sabrelite machine model used by qemu-system-arm is based on the
3
arm-cpu-features got dropped from the AArch64 tests during the meson
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
4
conversion shuffle.
5
controller which is supported in QEMU using the imx_fec.c module
6
(actually called imx.enet for this model.)
7
5
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
6
Signed-off-by: Andrew Jones <drjones@redhat.com>
9
imx.enet device like this:
7
Message-id: 20201001061718.101915-6-drjones@redhat.com
10
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
12
#define FSL_IMX6_ENET_MAC_IRQ 119
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>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
10
---
44
include/hw/arm/fsl-imx6.h | 4 ++--
11
tests/qtest/meson.build | 3 ++-
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
12
1 file changed, 2 insertions(+), 1 deletion(-)
46
2 files changed, 29 insertions(+), 3 deletions(-)
47
13
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
14
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
49
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/fsl-imx6.h
16
--- a/tests/qtest/meson.build
51
+++ b/include/hw/arm/fsl-imx6.h
17
+++ b/tests/qtest/meson.build
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
18
@@ -XXX,XX +XXX,XX @@ qtests_aarch64 = \
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
19
(cpu != 'arm' ? ['bios-tables-test'] : []) + \
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
20
(config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-test'] : []) + \
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
21
(config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-swtpm-test'] : []) + \
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
22
- ['numa-test',
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
23
+ ['arm-cpu-features',
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
24
+ 'numa-test',
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
25
'boot-serial-test',
60
#define FSL_IMX6_PCIE1_IRQ 120
26
'migration-test']
61
#define FSL_IMX6_PCIE2_IRQ 121
27
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
{
71
- if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] & ENET_INT_TS_TIMER) {
72
+ /*
73
+ * Previous versions of qemu had the ENET_INT_MAC and ENET_INT_TS_TIMER
74
+ * interrupts swapped. This worked with older versions of Linux (4.14
75
+ * and older) since Linux associated both interrupt lines with Ethernet
76
+ * MAC interrupts. Specifically,
77
+ * - Linux 4.15 and later have separate interrupt handlers for the MAC and
78
+ * timer interrupts. Those versions of Linux fail with versions of QEMU
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);
102
--
28
--
103
2.16.2
29
2.20.1
104
30
105
31
diff view generated by jsdifflib
Deleted patch
1
For the rpi1 and 2 we want to boot the Linux kernel via some
2
custom setup code that makes sure that the SMC instruction
3
acts as a no-op, because it's used for cache maintenance.
4
The rpi3 boots AArch64 kernels, which don't need SMC for
5
cache maintenance and always expect to be booted non-secure.
6
Don't fill in the aarch32-specific parts of the binfo struct.
7
1
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20180313153458.26822-2-peter.maydell@linaro.org
12
---
13
hw/arm/raspi.c | 17 +++++++++++++----
14
1 file changed, 13 insertions(+), 4 deletions(-)
15
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
19
+++ b/hw/arm/raspi.c
20
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
21
binfo.board_id = raspi_boardid[version];
22
binfo.ram_size = ram_size;
23
binfo.nb_cpus = smp_cpus;
24
- binfo.board_setup_addr = BOARDSETUP_ADDR;
25
- binfo.write_board_setup = write_board_setup;
26
- binfo.secure_board_setup = true;
27
- binfo.secure_boot = true;
28
+
29
+ if (version <= 2) {
30
+ /* The rpi1 and 2 require some custom setup code to run in Secure
31
+ * mode before booting a kernel (to set up the SMC vectors so
32
+ * that we get a no-op SMC; this is used by Linux to call the
33
+ * firmware for some cache maintenance operations.
34
+ * The rpi3 doesn't need this.
35
+ */
36
+ binfo.board_setup_addr = BOARDSETUP_ADDR;
37
+ binfo.write_board_setup = write_board_setup;
38
+ binfo.secure_board_setup = true;
39
+ binfo.secure_boot = true;
40
+ }
41
42
/* Pi2 and Pi3 requires SMP setup */
43
if (version >= 2) {
44
--
45
2.16.2
46
47
diff view generated by jsdifflib
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
1
From: Andrew Jones <drjones@redhat.com>
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
3
is required for Linux to boot.
4
2
3
We add the kvm-steal-time CPU property and implement it for machvirt.
4
A tiny bit of refactoring was also done to allow pmu and pvtime to
5
use the same vcpu device helper functions.
6
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Signed-off-by: Andrew Jones <drjones@redhat.com>
9
Message-id: 20201001061718.101915-7-drjones@redhat.com
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
9
---
11
---
10
hw/arm/bcm2836.c | 11 +++++++----
12
docs/system/arm/cpu-features.rst | 11 ++++++
11
1 file changed, 7 insertions(+), 4 deletions(-)
13
include/hw/arm/virt.h | 5 +++
14
target/arm/cpu.h | 4 ++
15
target/arm/kvm_arm.h | 43 +++++++++++++++++++++
16
hw/arm/virt.c | 43 +++++++++++++++++++--
17
target/arm/cpu.c | 8 ++++
18
target/arm/kvm.c | 16 ++++++++
19
target/arm/kvm64.c | 64 +++++++++++++++++++++++++++++---
20
target/arm/monitor.c | 2 +-
21
tests/qtest/arm-cpu-features.c | 25 +++++++++++--
22
10 files changed, 208 insertions(+), 13 deletions(-)
12
23
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
24
diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst
14
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/bcm2836.c
26
--- a/docs/system/arm/cpu-features.rst
16
+++ b/hw/arm/bcm2836.c
27
+++ b/docs/system/arm/cpu-features.rst
28
@@ -XXX,XX +XXX,XX @@ the list of KVM VCPU features and their descriptions.
29
adjustment, also restoring the legacy (pre-5.0)
30
behavior.
31
32
+ kvm-steal-time Since v5.2, kvm-steal-time is enabled by
33
+ default when KVM is enabled, the feature is
34
+ supported, and the guest is 64-bit.
35
+
36
+ When kvm-steal-time is enabled a 64-bit guest
37
+ can account for time its CPUs were not running
38
+ due to the host not scheduling the corresponding
39
+ VCPU threads. The accounting statistics may
40
+ influence the guest scheduler behavior and/or be
41
+ exposed to the guest userspace.
42
+
43
SVE CPU Properties
44
==================
45
46
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
47
index XXXXXXX..XXXXXXX 100644
48
--- a/include/hw/arm/virt.h
49
+++ b/include/hw/arm/virt.h
17
@@ -XXX,XX +XXX,XX @@
50
@@ -XXX,XX +XXX,XX @@
18
51
19
struct BCM283XInfo {
52
#define PPI(irq) ((irq) + 16)
20
const char *name;
53
21
+ int clusterid;
54
+/* See Linux kernel arch/arm64/include/asm/pvclock-abi.h */
55
+#define PVTIME_SIZE_PER_CPU 64
56
+
57
enum {
58
VIRT_FLASH,
59
VIRT_MEM,
60
@@ -XXX,XX +XXX,XX @@ enum {
61
VIRT_PCDIMM_ACPI,
62
VIRT_ACPI_GED,
63
VIRT_NVDIMM_ACPI,
64
+ VIRT_PVTIME,
65
VIRT_LOWMEMMAP_LAST,
22
};
66
};
23
67
24
static const BCM283XInfo bcm283x_socs[] = {
68
@@ -XXX,XX +XXX,XX @@ struct VirtMachineClass {
25
{
69
bool no_highmem_ecam;
26
.name = TYPE_BCM2836,
70
bool no_ged; /* Machines < 4.2 has no support for ACPI GED device */
27
+ .clusterid = 0xf,
71
bool kvm_no_adjvtime;
28
},
72
+ bool no_kvm_steal_time;
29
{
73
bool acpi_expose_flash;
30
.name = TYPE_BCM2837,
31
+ .clusterid = 0x0,
32
},
33
};
74
};
34
75
35
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
76
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
36
static void bcm2836_realize(DeviceState *dev, Error **errp)
77
index XXXXXXX..XXXXXXX 100644
37
{
78
--- a/target/arm/cpu.h
38
BCM283XState *s = BCM283X(dev);
79
+++ b/target/arm/cpu.h
39
+ BCM283XClass *bc = BCM283X_GET_CLASS(dev);
80
@@ -XXX,XX +XXX,XX @@
40
+ const BCM283XInfo *info = bc->info;
81
#include "hw/registerfields.h"
41
Object *obj;
82
#include "cpu-qom.h"
42
Error *err = NULL;
83
#include "exec/cpu-defs.h"
43
int n;
84
+#include "qapi/qapi-types-common.h"
44
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
85
45
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
86
/* ARM processors have a weak memory model */
46
87
#define TCG_GUEST_DEFAULT_MO (0)
47
for (n = 0; n < BCM283X_NCPUS; n++) {
88
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
48
- /* Mirror bcm2836, which has clusterid set to 0xf
89
bool kvm_vtime_dirty;
49
- * TODO: this should be converted to a property of ARM_CPU
90
uint64_t kvm_vtime;
50
- */
91
51
- s->cpus[n].mp_affinity = 0xF00 | n;
92
+ /* KVM steal time */
52
+ /* TODO: this should be converted to a property of ARM_CPU */
93
+ OnOffAuto kvm_steal_time;
53
+ s->cpus[n].mp_affinity = (info->clusterid << 8) | n;
94
+
54
95
/* Uniprocessor system with MP extensions */
55
/* set periphbase/CBAR value for CPU-local registers */
96
bool mp_is_up;
56
object_property_set_int(OBJECT(&s->cpus[n]),
97
98
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
99
index XXXXXXX..XXXXXXX 100644
100
--- a/target/arm/kvm_arm.h
101
+++ b/target/arm/kvm_arm.h
102
@@ -XXX,XX +XXX,XX @@ void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu);
103
*/
104
void kvm_arm_add_vcpu_properties(Object *obj);
105
106
+/**
107
+ * kvm_arm_steal_time_finalize:
108
+ * @cpu: ARMCPU for which to finalize kvm-steal-time
109
+ * @errp: Pointer to Error* for error propagation
110
+ *
111
+ * Validate the kvm-steal-time property selection and set its default
112
+ * based on KVM support and guest configuration.
113
+ */
114
+void kvm_arm_steal_time_finalize(ARMCPU *cpu, Error **errp);
115
+
116
+/**
117
+ * kvm_arm_steal_time_supported:
118
+ *
119
+ * Returns: true if KVM can enable steal time reporting
120
+ * and false otherwise.
121
+ */
122
+bool kvm_arm_steal_time_supported(void);
123
+
124
/**
125
* kvm_arm_aarch32_supported:
126
*
127
@@ -XXX,XX +XXX,XX @@ int kvm_arm_vgic_probe(void);
128
129
void kvm_arm_pmu_set_irq(CPUState *cs, int irq);
130
void kvm_arm_pmu_init(CPUState *cs);
131
+
132
+/**
133
+ * kvm_arm_pvtime_init:
134
+ * @cs: CPUState
135
+ * @ipa: Per-vcpu guest physical base address of the pvtime structures
136
+ *
137
+ * Initializes PVTIME for the VCPU, setting the PVTIME IPA to @ipa.
138
+ */
139
+void kvm_arm_pvtime_init(CPUState *cs, uint64_t ipa);
140
+
141
int kvm_arm_set_irq(int cpu, int irqtype, int irq, int level);
142
143
#else
144
@@ -XXX,XX +XXX,XX @@ static inline bool kvm_arm_sve_supported(void)
145
return false;
146
}
147
148
+static inline bool kvm_arm_steal_time_supported(void)
149
+{
150
+ return false;
151
+}
152
+
153
/*
154
* These functions should never actually be called without KVM support.
155
*/
156
@@ -XXX,XX +XXX,XX @@ static inline void kvm_arm_pmu_init(CPUState *cs)
157
g_assert_not_reached();
158
}
159
160
+static inline void kvm_arm_pvtime_init(CPUState *cs, uint64_t ipa)
161
+{
162
+ g_assert_not_reached();
163
+}
164
+
165
+static inline void kvm_arm_steal_time_finalize(ARMCPU *cpu, Error **errp)
166
+{
167
+ g_assert_not_reached();
168
+}
169
+
170
static inline void kvm_arm_sve_get_vls(CPUState *cs, unsigned long *map)
171
{
172
g_assert_not_reached();
173
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
174
index XXXXXXX..XXXXXXX 100644
175
--- a/hw/arm/virt.c
176
+++ b/hw/arm/virt.c
177
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry base_memmap[] = {
178
[VIRT_PCDIMM_ACPI] = { 0x09070000, MEMORY_HOTPLUG_IO_LEN },
179
[VIRT_ACPI_GED] = { 0x09080000, ACPI_GED_EVT_SEL_LEN },
180
[VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
181
+ [VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
182
[VIRT_MMIO] = { 0x0a000000, 0x00000200 },
183
/* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
184
[VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 },
185
@@ -XXX,XX +XXX,XX @@ static void finalize_gic_version(VirtMachineState *vms)
186
* virt_cpu_post_init() must be called after the CPUs have
187
* been realized and the GIC has been created.
188
*/
189
-static void virt_cpu_post_init(VirtMachineState *vms)
190
+static void virt_cpu_post_init(VirtMachineState *vms, int max_cpus,
191
+ MemoryRegion *sysmem)
192
{
193
- bool aarch64, pmu;
194
+ bool aarch64, pmu, steal_time;
195
CPUState *cpu;
196
197
aarch64 = object_property_get_bool(OBJECT(first_cpu), "aarch64", NULL);
198
pmu = object_property_get_bool(OBJECT(first_cpu), "pmu", NULL);
199
+ steal_time = object_property_get_bool(OBJECT(first_cpu),
200
+ "kvm-steal-time", NULL);
201
202
if (kvm_enabled()) {
203
+ hwaddr pvtime_reg_base = vms->memmap[VIRT_PVTIME].base;
204
+ hwaddr pvtime_reg_size = vms->memmap[VIRT_PVTIME].size;
205
+
206
+ if (steal_time) {
207
+ MemoryRegion *pvtime = g_new(MemoryRegion, 1);
208
+ hwaddr pvtime_size = max_cpus * PVTIME_SIZE_PER_CPU;
209
+
210
+ /* The memory region size must be a multiple of host page size. */
211
+ pvtime_size = REAL_HOST_PAGE_ALIGN(pvtime_size);
212
+
213
+ if (pvtime_size > pvtime_reg_size) {
214
+ error_report("pvtime requires a %ld byte memory region for "
215
+ "%d CPUs, but only %ld has been reserved",
216
+ pvtime_size, max_cpus, pvtime_reg_size);
217
+ exit(1);
218
+ }
219
+
220
+ memory_region_init_ram(pvtime, NULL, "pvtime", pvtime_size, NULL);
221
+ memory_region_add_subregion(sysmem, pvtime_reg_base, pvtime);
222
+ }
223
+
224
CPU_FOREACH(cpu) {
225
if (pmu) {
226
assert(arm_feature(&ARM_CPU(cpu)->env, ARM_FEATURE_PMU));
227
@@ -XXX,XX +XXX,XX @@ static void virt_cpu_post_init(VirtMachineState *vms)
228
}
229
kvm_arm_pmu_init(cpu);
230
}
231
+ if (steal_time) {
232
+ kvm_arm_pvtime_init(cpu, pvtime_reg_base +
233
+ cpu->cpu_index * PVTIME_SIZE_PER_CPU);
234
+ }
235
}
236
} else {
237
if (aarch64 && vms->highmem) {
238
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
239
object_property_set_bool(cpuobj, "kvm-no-adjvtime", true, NULL);
240
}
241
242
+ if (vmc->no_kvm_steal_time &&
243
+ object_property_find(cpuobj, "kvm-steal-time")) {
244
+ object_property_set_bool(cpuobj, "kvm-steal-time", false, NULL);
245
+ }
246
+
247
if (vmc->no_pmu && object_property_find(cpuobj, "pmu")) {
248
object_property_set_bool(cpuobj, "pmu", false, NULL);
249
}
250
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
251
252
create_gic(vms);
253
254
- virt_cpu_post_init(vms);
255
+ virt_cpu_post_init(vms, possible_cpus->len, sysmem);
256
257
fdt_add_pmu_nodes(vms);
258
259
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 2)
260
261
static void virt_machine_5_1_options(MachineClass *mc)
262
{
263
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
264
+
265
virt_machine_5_2_options(mc);
266
compat_props_add(mc->compat_props, hw_compat_5_1, hw_compat_5_1_len);
267
+ vmc->no_kvm_steal_time = true;
268
}
269
DEFINE_VIRT_MACHINE(5, 1)
270
271
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
272
index XXXXXXX..XXXXXXX 100644
273
--- a/target/arm/cpu.c
274
+++ b/target/arm/cpu.c
275
@@ -XXX,XX +XXX,XX @@ void arm_cpu_finalize_features(ARMCPU *cpu, Error **errp)
276
return;
277
}
278
}
279
+
280
+ if (kvm_enabled()) {
281
+ kvm_arm_steal_time_finalize(cpu, &local_err);
282
+ if (local_err != NULL) {
283
+ error_propagate(errp, local_err);
284
+ return;
285
+ }
286
+ }
287
}
288
289
static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
290
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
291
index XXXXXXX..XXXXXXX 100644
292
--- a/target/arm/kvm.c
293
+++ b/target/arm/kvm.c
294
@@ -XXX,XX +XXX,XX @@ static void kvm_no_adjvtime_set(Object *obj, bool value, Error **errp)
295
ARM_CPU(obj)->kvm_adjvtime = !value;
296
}
297
298
+static bool kvm_steal_time_get(Object *obj, Error **errp)
299
+{
300
+ return ARM_CPU(obj)->kvm_steal_time != ON_OFF_AUTO_OFF;
301
+}
302
+
303
+static void kvm_steal_time_set(Object *obj, bool value, Error **errp)
304
+{
305
+ ARM_CPU(obj)->kvm_steal_time = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
306
+}
307
+
308
/* KVM VCPU properties should be prefixed with "kvm-". */
309
void kvm_arm_add_vcpu_properties(Object *obj)
310
{
311
@@ -XXX,XX +XXX,XX @@ void kvm_arm_add_vcpu_properties(Object *obj)
312
"the virtual counter. VM stopped time "
313
"will be counted.");
314
}
315
+
316
+ cpu->kvm_steal_time = ON_OFF_AUTO_AUTO;
317
+ object_property_add_bool(obj, "kvm-steal-time", kvm_steal_time_get,
318
+ kvm_steal_time_set);
319
+ object_property_set_description(obj, "kvm-steal-time",
320
+ "Set off to disable KVM steal time.");
321
}
322
323
bool kvm_arm_pmu_supported(void)
324
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
325
index XXXXXXX..XXXXXXX 100644
326
--- a/target/arm/kvm64.c
327
+++ b/target/arm/kvm64.c
328
@@ -XXX,XX +XXX,XX @@
329
#include <linux/kvm.h>
330
331
#include "qemu-common.h"
332
+#include "qapi/error.h"
333
#include "cpu.h"
334
#include "qemu/timer.h"
335
#include "qemu/error-report.h"
336
@@ -XXX,XX +XXX,XX @@ static CPUWatchpoint *find_hw_watchpoint(CPUState *cpu, target_ulong addr)
337
return NULL;
338
}
339
340
-static bool kvm_arm_pmu_set_attr(CPUState *cs, struct kvm_device_attr *attr)
341
+static bool kvm_arm_set_device_attr(CPUState *cs, struct kvm_device_attr *attr,
342
+ const char *name)
343
{
344
int err;
345
346
err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr);
347
if (err != 0) {
348
- error_report("PMU: KVM_HAS_DEVICE_ATTR: %s", strerror(-err));
349
+ error_report("%s: KVM_HAS_DEVICE_ATTR: %s", name, strerror(-err));
350
return false;
351
}
352
353
err = kvm_vcpu_ioctl(cs, KVM_SET_DEVICE_ATTR, attr);
354
if (err != 0) {
355
- error_report("PMU: KVM_SET_DEVICE_ATTR: %s", strerror(-err));
356
+ error_report("%s: KVM_SET_DEVICE_ATTR: %s", name, strerror(-err));
357
return false;
358
}
359
360
@@ -XXX,XX +XXX,XX @@ void kvm_arm_pmu_init(CPUState *cs)
361
if (!ARM_CPU(cs)->has_pmu) {
362
return;
363
}
364
- if (!kvm_arm_pmu_set_attr(cs, &attr)) {
365
+ if (!kvm_arm_set_device_attr(cs, &attr, "PMU")) {
366
error_report("failed to init PMU");
367
abort();
368
}
369
@@ -XXX,XX +XXX,XX @@ void kvm_arm_pmu_set_irq(CPUState *cs, int irq)
370
if (!ARM_CPU(cs)->has_pmu) {
371
return;
372
}
373
- if (!kvm_arm_pmu_set_attr(cs, &attr)) {
374
+ if (!kvm_arm_set_device_attr(cs, &attr, "PMU")) {
375
error_report("failed to set irq for PMU");
376
abort();
377
}
378
}
379
380
+void kvm_arm_pvtime_init(CPUState *cs, uint64_t ipa)
381
+{
382
+ struct kvm_device_attr attr = {
383
+ .group = KVM_ARM_VCPU_PVTIME_CTRL,
384
+ .attr = KVM_ARM_VCPU_PVTIME_IPA,
385
+ .addr = (uint64_t)&ipa,
386
+ };
387
+
388
+ if (ARM_CPU(cs)->kvm_steal_time == ON_OFF_AUTO_OFF) {
389
+ return;
390
+ }
391
+ if (!kvm_arm_set_device_attr(cs, &attr, "PVTIME IPA")) {
392
+ error_report("failed to init PVTIME IPA");
393
+ abort();
394
+ }
395
+}
396
+
397
static int read_sys_reg32(int fd, uint32_t *pret, uint64_t id)
398
{
399
uint64_t ret;
400
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
401
return true;
402
}
403
404
+void kvm_arm_steal_time_finalize(ARMCPU *cpu, Error **errp)
405
+{
406
+ bool has_steal_time = kvm_arm_steal_time_supported();
407
+
408
+ if (cpu->kvm_steal_time == ON_OFF_AUTO_AUTO) {
409
+ if (!has_steal_time || !arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
410
+ cpu->kvm_steal_time = ON_OFF_AUTO_OFF;
411
+ } else {
412
+ cpu->kvm_steal_time = ON_OFF_AUTO_ON;
413
+ }
414
+ } else if (cpu->kvm_steal_time == ON_OFF_AUTO_ON) {
415
+ if (!has_steal_time) {
416
+ error_setg(errp, "'kvm-steal-time' cannot be enabled "
417
+ "on this host");
418
+ return;
419
+ } else if (!arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
420
+ /*
421
+ * DEN0057A chapter 2 says "This specification only covers
422
+ * systems in which the Execution state of the hypervisor
423
+ * as well as EL1 of virtual machines is AArch64.". And,
424
+ * to ensure that, the smc/hvc calls are only specified as
425
+ * smc64/hvc64.
426
+ */
427
+ error_setg(errp, "'kvm-steal-time' cannot be enabled "
428
+ "for AArch32 guests");
429
+ return;
430
+ }
431
+ }
432
+}
433
+
434
bool kvm_arm_aarch32_supported(void)
435
{
436
return kvm_check_extension(kvm_state, KVM_CAP_ARM_EL1_32BIT);
437
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_sve_supported(void)
438
return kvm_check_extension(kvm_state, KVM_CAP_ARM_SVE);
439
}
440
441
+bool kvm_arm_steal_time_supported(void)
442
+{
443
+ return kvm_check_extension(kvm_state, KVM_CAP_STEAL_TIME);
444
+}
445
+
446
QEMU_BUILD_BUG_ON(KVM_ARM64_SVE_VQ_MIN != 1);
447
448
void kvm_arm_sve_get_vls(CPUState *cs, unsigned long *map)
449
diff --git a/target/arm/monitor.c b/target/arm/monitor.c
450
index XXXXXXX..XXXXXXX 100644
451
--- a/target/arm/monitor.c
452
+++ b/target/arm/monitor.c
453
@@ -XXX,XX +XXX,XX @@ static const char *cpu_model_advertised_features[] = {
454
"sve128", "sve256", "sve384", "sve512",
455
"sve640", "sve768", "sve896", "sve1024", "sve1152", "sve1280",
456
"sve1408", "sve1536", "sve1664", "sve1792", "sve1920", "sve2048",
457
- "kvm-no-adjvtime",
458
+ "kvm-no-adjvtime", "kvm-steal-time",
459
NULL
460
};
461
462
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
463
index XXXXXXX..XXXXXXX 100644
464
--- a/tests/qtest/arm-cpu-features.c
465
+++ b/tests/qtest/arm-cpu-features.c
466
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion(const void *data)
467
assert_set_feature(qts, "max", "pmu", true);
468
469
assert_has_not_feature(qts, "max", "kvm-no-adjvtime");
470
+ assert_has_not_feature(qts, "max", "kvm-steal-time");
471
472
if (g_str_equal(qtest_get_arch(), "aarch64")) {
473
assert_has_feature_enabled(qts, "max", "aarch64");
474
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion_kvm(const void *data)
475
assert_set_feature(qts, "host", "kvm-no-adjvtime", false);
476
477
if (g_str_equal(qtest_get_arch(), "aarch64")) {
478
+ bool kvm_supports_steal_time;
479
bool kvm_supports_sve;
480
char max_name[8], name[8];
481
uint32_t max_vq, vq;
482
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion_kvm(const void *data)
483
QDict *resp;
484
char *error;
485
486
+ assert_error(qts, "cortex-a15",
487
+ "We cannot guarantee the CPU type 'cortex-a15' works "
488
+ "with KVM on this host", NULL);
489
+
490
assert_has_feature_enabled(qts, "host", "aarch64");
491
492
/* Enabling and disabling pmu should always work. */
493
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion_kvm(const void *data)
494
assert_set_feature(qts, "host", "pmu", false);
495
assert_set_feature(qts, "host", "pmu", true);
496
497
- assert_error(qts, "cortex-a15",
498
- "We cannot guarantee the CPU type 'cortex-a15' works "
499
- "with KVM on this host", NULL);
500
-
501
+ /*
502
+ * Some features would be enabled by default, but they're disabled
503
+ * because this instance of KVM doesn't support them. Test that the
504
+ * features are present, and, when enabled, issue further tests.
505
+ */
506
+ assert_has_feature(qts, "host", "kvm-steal-time");
507
assert_has_feature(qts, "host", "sve");
508
+
509
resp = do_query_no_props(qts, "host");
510
+ kvm_supports_steal_time = resp_get_feature(resp, "kvm-steal-time");
511
kvm_supports_sve = resp_get_feature(resp, "sve");
512
vls = resp_get_sve_vls(resp);
513
qobject_unref(resp);
514
515
+ if (kvm_supports_steal_time) {
516
+ /* If we have steal-time then we should be able to toggle it. */
517
+ assert_set_feature(qts, "host", "kvm-steal-time", false);
518
+ assert_set_feature(qts, "host", "kvm-steal-time", true);
519
+ }
520
+
521
if (kvm_supports_sve) {
522
g_assert(vls != 0);
523
max_vq = 64 - __builtin_clzll(vls);
524
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion_kvm(const void *data)
525
assert_has_not_feature(qts, "host", "aarch64");
526
assert_has_not_feature(qts, "host", "pmu");
527
assert_has_not_feature(qts, "host", "sve");
528
+ assert_has_not_feature(qts, "host", "kvm-steal-time");
529
}
530
531
qtest_quit(qts);
57
--
532
--
58
2.16.2
533
2.20.1
59
534
60
535
diff view generated by jsdifflib
1
Add some assertions that if we're about to boot an AArch64 kernel,
1
QEMU supports a 48-bit physical address range, but we don't currently
2
the board code has not mistakenly set either secure_boot or
2
expose it in the '-cpu max' ID registers (you get the same range as
3
secure_board_setup. It doesn't make sense to set secure_boot,
3
Cortex-A57, which is 44 bits).
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
Set the ID_AA64MMFR0.PARange field to indicate 48 bits.
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.
12
6
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20180313153458.26822-3-peter.maydell@linaro.org
9
Message-id: 20201001160116.18095-1-peter.maydell@linaro.org
16
---
10
---
17
hw/arm/boot.c | 7 +++++++
11
target/arm/cpu64.c | 4 ++++
18
1 file changed, 7 insertions(+)
12
1 file changed, 4 insertions(+)
19
13
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
14
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
16
--- a/target/arm/cpu64.c
23
+++ b/hw/arm/boot.c
17
+++ b/target/arm/cpu64.c
24
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
18
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
25
} else {
19
t = FIELD_DP64(t, ID_AA64PFR1, MTE, 2);
26
env->pstate = PSTATE_MODE_EL1h;
20
cpu->isar.id_aa64pfr1 = t;
27
}
21
28
+ /* AArch64 kernels never boot in secure mode */
22
+ t = cpu->isar.id_aa64mmfr0;
29
+ assert(!info->secure_boot);
23
+ t = FIELD_DP64(t, ID_AA64MMFR0, PARANGE, 5); /* PARange: 48 bits */
30
+ /* This hook is only supported for AArch32 currently:
24
+ cpu->isar.id_aa64mmfr0 = t;
31
+ * bootloader_aarch64[] will not call the hook, and
25
+
32
+ * the code above has already dropped us into EL2 or EL1.
26
t = cpu->isar.id_aa64mmfr1;
33
+ */
27
t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* HPD */
34
+ assert(!info->secure_board_setup);
28
t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
35
}
36
37
/* Set to non-secure if not a secure boot */
38
--
29
--
39
2.16.2
30
2.20.1
40
31
41
32
diff view generated by jsdifflib