1
Patches for rc1: nothing major, just some minor bugfixes and
1
arm pullreq for rc1. All minor bugfixes, except for the sve-default-vector-length
2
code cleanups.
2
patches, which are somewhere between a bugfix and a new feature.
3
3
4
thanks
4
-- PMM
5
-- PMM
5
6
6
The following changes since commit f7e1914adad8885a5d4c70239ab90d901ed97e9f:
7
The following changes since commit c08ccd1b53f488ac86c1f65cf7623dc91acc249a:
7
8
8
Merge remote-tracking branch 'remotes/alistair/tags/pull-riscv-to-apply-20201109' into staging (2020-11-10 09:24:56 +0000)
9
Merge remote-tracking branch 'remotes/rth-gitlab/tags/pull-tcg-20210726' into staging (2021-07-27 08:35:01 +0100)
9
10
10
are available in the Git repository at:
11
are available in the Git repository at:
11
12
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201110
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210727
13
14
14
for you to fetch changes up to b6c56c8a9a4064ea783f352f43c5df6231a110fa:
15
for you to fetch changes up to e229a179a503f2aee43a76888cf12fbdfe8a3749:
15
16
16
target/arm/translate-neon.c: Handle VTBL UNDEF case before VFP access check (2020-11-10 11:03:48 +0000)
17
hw: aspeed_gpio: Fix memory size (2021-07-27 11:00:00 +0100)
17
18
18
----------------------------------------------------------------
19
----------------------------------------------------------------
19
target-arm queue:
20
target-arm queue:
20
* hw/arm/Kconfig: ARM_V7M depends on PTIMER
21
* hw/arm/smmuv3: Check 31st bit to see if CD is valid
21
* Minor coding style fixes
22
* qemu-options.hx: Fix formatting of -machine memory-backend option
22
* docs: add some notes on the sbsa-ref machine
23
* hw: aspeed_gpio: Fix memory size
23
* hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals
24
* hw/arm/nseries: Display hexadecimal value with '0x' prefix
24
* target/arm: Fix neon VTBL/VTBX for len > 1
25
* Add sve-default-vector-length cpu property
25
* hw/arm/armsse: Correct expansion MPC interrupt lines
26
* docs: Update path that mentions deprecated.rst
26
* hw/misc/stm32f2xx_syscfg: Remove extraneous IRQ
27
* hw/intc/armv7m_nvic: for v8.1M VECTPENDING hides S exceptions from NS
27
* hw/arm/nseries: Remove invalid/unnecessary n8x0_uart_setup()
28
* hw/intc/armv7m_nvic: Correct size of ICSR.VECTPENDING
28
* hw/arm/musicpal: Don't connect two qemu_irqs directly to the same input
29
* hw/intc/armv7m_nvic: ISCR.ISRPENDING is set for non-enabled pending interrupts
29
* hw/arm/musicpal: Only use qdev_get_gpio_in() when necessary
30
* target/arm: Report M-profile alignment faults correctly to the guest
30
* hw/arm/nseries: Check return value from load_image_targphys()
31
* target/arm: Add missing 'return's after calling v7m_exception_taken()
31
* tests/qtest/npcm7xx_rng-test: count runs properly
32
* target/arm: Enforce that M-profile SP low 2 bits are always zero
32
* target/arm/translate-neon.c: Handle VTBL UNDEF case before VFP access check
33
33
34
----------------------------------------------------------------
34
----------------------------------------------------------------
35
Alex Bennée (1):
35
Joe Komlodi (1):
36
docs: add some notes on the sbsa-ref machine
36
hw/arm/smmuv3: Check 31st bit to see if CD is valid
37
37
38
AlexChen (1):
38
Joel Stanley (1):
39
ssi: Fix bad printf format specifiers
39
hw: aspeed_gpio: Fix memory size
40
40
41
Andrew Jones (1):
41
Mao Zhongyi (1):
42
hw/arm/Kconfig: ARM_V7M depends on PTIMER
42
docs: Update path that mentions deprecated.rst
43
43
44
Havard Skinnemoen (1):
44
Peter Maydell (7):
45
tests/qtest/npcm7xx_rng-test: count runs properly
45
qemu-options.hx: Fix formatting of -machine memory-backend option
46
target/arm: Enforce that M-profile SP low 2 bits are always zero
47
target/arm: Add missing 'return's after calling v7m_exception_taken()
48
target/arm: Report M-profile alignment faults correctly to the guest
49
hw/intc/armv7m_nvic: ISCR.ISRPENDING is set for non-enabled pending interrupts
50
hw/intc/armv7m_nvic: Correct size of ICSR.VECTPENDING
51
hw/intc/armv7m_nvic: for v8.1M VECTPENDING hides S exceptions from NS
46
52
47
Peter Maydell (2):
53
Philippe Mathieu-Daudé (1):
48
hw/arm/nseries: Check return value from load_image_targphys()
54
hw/arm/nseries: Display hexadecimal value with '0x' prefix
49
target/arm/translate-neon.c: Handle VTBL UNDEF case before VFP access check
50
55
51
Philippe Mathieu-Daudé (6):
56
Richard Henderson (3):
52
hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals
57
target/arm: Correctly bound length in sve_zcr_get_valid_len
53
hw/arm/armsse: Correct expansion MPC interrupt lines
58
target/arm: Export aarch64_sve_zcr_get_valid_len
54
hw/misc/stm32f2xx_syscfg: Remove extraneous IRQ
59
target/arm: Add sve-default-vector-length cpu property
55
hw/arm/nseries: Remove invalid/unnecessary n8x0_uart_setup()
56
hw/arm/musicpal: Don't connect two qemu_irqs directly to the same input
57
hw/arm/musicpal: Only use qdev_get_gpio_in() when necessary
58
60
59
Richard Henderson (1):
61
docs/system/arm/cpu-features.rst | 15 ++++++++++
60
target/arm: Fix neon VTBL/VTBX for len > 1
62
configure | 2 +-
63
hw/arm/smmuv3-internal.h | 2 +-
64
target/arm/cpu.h | 5 ++++
65
target/arm/internals.h | 10 +++++++
66
hw/arm/nseries.c | 2 +-
67
hw/gpio/aspeed_gpio.c | 3 +-
68
hw/intc/armv7m_nvic.c | 40 +++++++++++++++++++--------
69
target/arm/cpu.c | 14 ++++++++--
70
target/arm/cpu64.c | 60 ++++++++++++++++++++++++++++++++++++++++
71
target/arm/gdbstub.c | 4 +++
72
target/arm/helper.c | 8 ++++--
73
target/arm/m_helper.c | 24 ++++++++++++----
74
target/arm/translate.c | 3 ++
75
target/i386/cpu.c | 2 +-
76
MAINTAINERS | 2 +-
77
qemu-options.hx | 30 +++++++++++---------
78
17 files changed, 183 insertions(+), 43 deletions(-)
61
79
62
Xinhao Zhang (3):
63
target/arm: add spaces around operator
64
target/arm: Don't use '#' flag of printf format
65
target/arm: add space before the open parenthesis '('
66
67
docs/system/arm/sbsa.rst | 32 ++++++++++++++++++++++
68
docs/system/target-arm.rst | 1 +
69
include/hw/misc/stm32f2xx_syscfg.h | 2 --
70
target/arm/helper.h | 2 +-
71
hw/arm/armsse.c | 3 +-
72
hw/arm/musicpal.c | 40 +++++++++++++++++----------
73
hw/arm/nseries.c | 26 ++++++++----------
74
hw/arm/stm32f205_soc.c | 1 -
75
hw/misc/stm32f2xx_syscfg.c | 2 --
76
hw/ssi/imx_spi.c | 2 +-
77
hw/ssi/xilinx_spi.c | 2 +-
78
target/arm/arch_dump.c | 8 +++---
79
target/arm/arm-semi.c | 8 +++---
80
target/arm/helper.c | 2 +-
81
target/arm/op_helper.c | 23 +++++++++-------
82
target/arm/translate-a64.c | 4 +--
83
target/arm/translate.c | 2 +-
84
tests/qtest/npcm7xx_rng-test.c | 2 +-
85
hw/arm/Kconfig | 3 +-
86
target/arm/translate-neon.c.inc | 56 ++++++++++++++------------------------
87
20 files changed, 123 insertions(+), 98 deletions(-)
88
create mode 100644 docs/system/arm/sbsa.rst
89
diff view generated by jsdifflib
Deleted patch
1
From: Andrew Jones <drjones@redhat.com>
2
1
3
commit 32bd322a0134 ("hw/timer/armv7m_systick: Rewrite to use ptimers")
4
changed armv7m_systick to build on ptimers. Make sure we have ptimers
5
in the build when building armv7m_systick.
6
7
Signed-off-by: Andrew Jones <drjones@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20201104103343.30392-1-drjones@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/Kconfig | 1 +
13
1 file changed, 1 insertion(+)
14
15
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/Kconfig
18
+++ b/hw/arm/Kconfig
19
@@ -XXX,XX +XXX,XX @@ config ZYNQ
20
21
config ARM_V7M
22
bool
23
+ select PTIMER
24
25
config ALLWINNER_A10
26
bool
27
--
28
2.20.1
29
30
diff view generated by jsdifflib
Deleted patch
1
From: AlexChen <alex.chen@huawei.com>
2
1
3
We should use printf format specifier "%u" instead of "%d" for
4
argument of type "unsigned int".
5
6
Reported-by: Euler Robot <euler.robot@huawei.com>
7
Signed-off-by: Alex Chen <alex.chen@huawei.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 5FA280F5.8060902@huawei.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/ssi/imx_spi.c | 2 +-
13
hw/ssi/xilinx_spi.c | 2 +-
14
2 files changed, 2 insertions(+), 2 deletions(-)
15
16
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/ssi/imx_spi.c
19
+++ b/hw/ssi/imx_spi.c
20
@@ -XXX,XX +XXX,XX @@ static const char *imx_spi_reg_name(uint32_t reg)
21
case ECSPI_MSGDATA:
22
return "ECSPI_MSGDATA";
23
default:
24
- sprintf(unknown, "%d ?", reg);
25
+ sprintf(unknown, "%u ?", reg);
26
return unknown;
27
}
28
}
29
diff --git a/hw/ssi/xilinx_spi.c b/hw/ssi/xilinx_spi.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/ssi/xilinx_spi.c
32
+++ b/hw/ssi/xilinx_spi.c
33
@@ -XXX,XX +XXX,XX @@ static void xlx_spi_update_irq(XilinxSPI *s)
34
irq chain unless things really changed. */
35
if (pending != s->irqline) {
36
s->irqline = pending;
37
- DB_PRINT("irq_change of state %d ISR:%x IER:%X\n",
38
+ DB_PRINT("irq_change of state %u ISR:%x IER:%X\n",
39
pending, s->regs[R_IPISR], s->regs[R_IPIER]);
40
qemu_set_irq(s->irq, pending);
41
}
42
--
43
2.20.1
44
45
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Joe Komlodi <joe.komlodi@xilinx.com>
2
2
3
We don't need to fill the full pic[] array if we only use
3
The bit to see if a CD is valid is the last bit of the first word of the CD.
4
few of the interrupt lines. Directly call qdev_get_gpio_in()
5
when necessary.
6
4
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Signed-off-by: Joe Komlodi <joe.komlodi@xilinx.com>
8
Message-id: 20201107193403.436146-6-f4bug@amsat.org
6
Message-id: 1626728232-134665-2-git-send-email-joe.komlodi@xilinx.com
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
9
---
12
hw/arm/musicpal.c | 25 +++++++++++++------------
10
hw/arm/smmuv3-internal.h | 2 +-
13
1 file changed, 13 insertions(+), 12 deletions(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
14
12
15
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
13
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/musicpal.c
15
--- a/hw/arm/smmuv3-internal.h
18
+++ b/hw/arm/musicpal.c
16
+++ b/hw/arm/smmuv3-internal.h
19
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info musicpal_binfo = {
17
@@ -XXX,XX +XXX,XX @@ static inline int pa_range(STE *ste)
20
static void musicpal_init(MachineState *machine)
18
21
{
19
/* CD fields */
22
ARMCPU *cpu;
20
23
- qemu_irq pic[32];
21
-#define CD_VALID(x) extract32((x)->word[0], 30, 1)
24
DeviceState *dev;
22
+#define CD_VALID(x) extract32((x)->word[0], 31, 1)
25
+ DeviceState *pic;
23
#define CD_ASID(x) extract32((x)->word[1], 16, 16)
26
DeviceState *uart_orgate;
24
#define CD_TTB(x, sel) \
27
DeviceState *i2c_dev;
25
({ \
28
DeviceState *lcd_dev;
29
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
30
&error_fatal);
31
memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram);
32
33
- dev = sysbus_create_simple(TYPE_MV88W8618_PIC, MP_PIC_BASE,
34
+ pic = sysbus_create_simple(TYPE_MV88W8618_PIC, MP_PIC_BASE,
35
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ));
36
- for (i = 0; i < 32; i++) {
37
- pic[i] = qdev_get_gpio_in(dev, i);
38
- }
39
- sysbus_create_varargs(TYPE_MV88W8618_PIT, MP_PIT_BASE, pic[MP_TIMER1_IRQ],
40
- pic[MP_TIMER2_IRQ], pic[MP_TIMER3_IRQ],
41
- pic[MP_TIMER4_IRQ], NULL);
42
+ sysbus_create_varargs(TYPE_MV88W8618_PIT, MP_PIT_BASE,
43
+ qdev_get_gpio_in(pic, MP_TIMER1_IRQ),
44
+ qdev_get_gpio_in(pic, MP_TIMER2_IRQ),
45
+ qdev_get_gpio_in(pic, MP_TIMER3_IRQ),
46
+ qdev_get_gpio_in(pic, MP_TIMER4_IRQ), NULL);
47
48
/* Logically OR both UART IRQs together */
49
uart_orgate = DEVICE(object_new(TYPE_OR_IRQ));
50
object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fatal);
51
qdev_realize_and_unref(uart_orgate, NULL, &error_fatal);
52
- qdev_connect_gpio_out(DEVICE(uart_orgate), 0, pic[MP_UART_SHARED_IRQ]);
53
+ qdev_connect_gpio_out(DEVICE(uart_orgate), 0,
54
+ qdev_get_gpio_in(pic, MP_UART_SHARED_IRQ));
55
56
serial_mm_init(address_space_mem, MP_UART1_BASE, 2,
57
qdev_get_gpio_in(uart_orgate, 0),
58
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
59
OBJECT(get_system_memory()), &error_fatal);
60
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
61
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, MP_ETH_BASE);
62
- sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[MP_ETH_IRQ]);
63
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
64
+ qdev_get_gpio_in(pic, MP_ETH_IRQ));
65
66
sysbus_create_simple("mv88w8618_wlan", MP_WLAN_BASE, NULL);
67
68
sysbus_create_simple(TYPE_MUSICPAL_MISC, MP_MISC_BASE, NULL);
69
70
dev = sysbus_create_simple(TYPE_MUSICPAL_GPIO, MP_GPIO_BASE,
71
- pic[MP_GPIO_IRQ]);
72
+ qdev_get_gpio_in(pic, MP_GPIO_IRQ));
73
i2c_dev = sysbus_create_simple("gpio_i2c", -1, NULL);
74
i2c = (I2CBus *)qdev_get_child_bus(i2c_dev, "i2c");
75
76
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
77
NULL);
78
sysbus_realize_and_unref(s, &error_fatal);
79
sysbus_mmio_map(s, 0, MP_AUDIO_BASE);
80
- sysbus_connect_irq(s, 0, pic[MP_AUDIO_IRQ]);
81
+ sysbus_connect_irq(s, 0, qdev_get_gpio_in(pic, MP_AUDIO_IRQ));
82
83
musicpal_binfo.ram_size = MP_RAM_DEFAULT_SIZE;
84
arm_load_kernel(cpu, machine, &musicpal_binfo);
85
--
26
--
86
2.20.1
27
2.20.1
87
28
88
29
diff view generated by jsdifflib
1
The nseries machines have a codepath that allows them to load a
1
The documentation of the -machine memory-backend has some minor
2
secondary bootloader. This code wasn't checking that the
2
formatting errors:
3
load_image_targphys() succeeded. Check the return value and report
3
* Misindentation of the initial line meant that the whole option
4
the error to the user.
4
section is incorrectly indented in the HTML output compared to
5
the other -machine options
6
* The examples weren't indented, which meant that they were formatted
7
as plain run-on text including outputting the "::" as text.
8
* The a) b) list has no rst-format markup so it is rendered as
9
a single run-on paragraph
5
10
6
While we're in the vicinity, fix the comment style of the
11
Fix the formatting.
7
comment documenting what this image load is doing.
8
12
9
Fixes: Coverity CID 1192904
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
12
Message-id: 20201103114918.11807-1-peter.maydell@linaro.org
15
Message-id: 20210719105257.3599-1-peter.maydell@linaro.org
13
---
16
---
14
hw/arm/nseries.c | 15 +++++++++++----
17
qemu-options.hx | 30 +++++++++++++++++-------------
15
1 file changed, 11 insertions(+), 4 deletions(-)
18
1 file changed, 17 insertions(+), 13 deletions(-)
16
19
17
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
20
diff --git a/qemu-options.hx b/qemu-options.hx
18
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/nseries.c
22
--- a/qemu-options.hx
20
+++ b/hw/arm/nseries.c
23
+++ b/qemu-options.hx
21
@@ -XXX,XX +XXX,XX @@ static void n8x0_init(MachineState *machine,
24
@@ -XXX,XX +XXX,XX @@ SRST
22
/* No, wait, better start at the ROM. */
25
Enables or disables ACPI Heterogeneous Memory Attribute Table
23
s->mpu->cpu->env.regs[15] = OMAP2_Q2_BASE + 0x400000;
26
(HMAT) support. The default is off.
24
27
25
- /* This is intended for loading the `secondary.bin' program from
28
- ``memory-backend='id'``
26
+ /*
29
+ ``memory-backend='id'``
27
+ * This is intended for loading the `secondary.bin' program from
30
An alternative to legacy ``-mem-path`` and ``mem-prealloc`` options.
28
* Nokia images (the NOLO bootloader). The entry point seems
31
Allows to use a memory backend as main RAM.
29
* to be at OMAP2_Q2_BASE + 0x400000.
32
30
*
33
For example:
31
@@ -XXX,XX +XXX,XX @@ static void n8x0_init(MachineState *machine,
34
::
32
* for them the entry point needs to be set to OMAP2_SRAM_BASE.
35
- -object memory-backend-file,id=pc.ram,size=512M,mem-path=/hugetlbfs,prealloc=on,share=on
33
*
36
- -machine memory-backend=pc.ram
34
* The code above is for loading the `zImage' file from Nokia
37
- -m 512M
35
- * images. */
38
+
36
- load_image_targphys(option_rom[0].name, OMAP2_Q2_BASE + 0x400000,
39
+ -object memory-backend-file,id=pc.ram,size=512M,mem-path=/hugetlbfs,prealloc=on,share=on
37
- machine->ram_size - 0x400000);
40
+ -machine memory-backend=pc.ram
38
+ * images.
41
+ -m 512M
39
+ */
42
40
+ if (load_image_targphys(option_rom[0].name,
43
Migration compatibility note:
41
+ OMAP2_Q2_BASE + 0x400000,
44
- a) as backend id one shall use value of 'default-ram-id', advertised by
42
+ machine->ram_size - 0x400000) < 0) {
45
- machine type (available via ``query-machines`` QMP command), if migration
43
+ error_report("Failed to load secondary bootloader %s",
46
- to/from old QEMU (<5.0) is expected.
44
+ option_rom[0].name);
47
- b) for machine types 4.0 and older, user shall
45
+ exit(EXIT_FAILURE);
48
- use ``x-use-canonical-path-for-ramblock-id=off`` backend option
46
+ }
49
- if migration to/from old QEMU (<5.0) is expected.
47
50
+
48
n800_setup_nolo_tags(nolo_tags);
51
+ * as backend id one shall use value of 'default-ram-id', advertised by
49
cpu_physical_memory_write(OMAP2_SRAM_BASE, nolo_tags, 0x10000);
52
+ machine type (available via ``query-machines`` QMP command), if migration
53
+ to/from old QEMU (<5.0) is expected.
54
+ * for machine types 4.0 and older, user shall
55
+ use ``x-use-canonical-path-for-ramblock-id=off`` backend option
56
+ if migration to/from old QEMU (<5.0) is expected.
57
+
58
For example:
59
::
60
- -object memory-backend-ram,id=pc.ram,size=512M,x-use-canonical-path-for-ramblock-id=off
61
- -machine memory-backend=pc.ram
62
- -m 512M
63
+
64
+ -object memory-backend-ram,id=pc.ram,size=512M,x-use-canonical-path-for-ramblock-id=off
65
+ -machine memory-backend=pc.ram
66
+ -m 512M
67
ERST
68
69
HXCOMM Deprecated by -machine
50
--
70
--
51
2.20.1
71
2.20.1
52
72
53
73
diff view generated by jsdifflib
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
1
For M-profile, unlike A-profile, the low 2 bits of SP are defined to be
2
RES0H, which is to say that they must be hardwired to zero so that
3
guest attempts to write non-zero values to them are ignored.
2
4
3
Fix code style. Space required before the open parenthesis '('.
5
Implement this behaviour by masking out the low bits:
6
* for writes to r13 by the gdbstub
7
* for writes to any of the various flavours of SP via MSR
8
* for writes to r13 via store_reg() in generated code
4
9
5
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
10
Note that all the direct uses of cpu_R[] in translate.c are in places
6
Signed-off-by: Kai Deng <dengkai1@huawei.com>
11
where the register is definitely not r13 (usually because that has
7
Message-id: 20201103114529.638233-3-zhangxinhao1@huawei.com
12
been checked for as an UNDEFINED or UNPREDICTABLE case and handled as
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
UNDEF).
14
15
All the other writes to regs[13] in C code are either:
16
* A-profile only code
17
* writes of values we can guarantee to be aligned, such as
18
- writes of previous-SP-value plus or minus a 4-aligned constant
19
- writes of the value in an SP limit register (which we already
20
enforce to be aligned)
21
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
24
Message-id: 20210723162146.5167-2-peter.maydell@linaro.org
10
---
25
---
11
target/arm/translate.c | 2 +-
26
target/arm/gdbstub.c | 4 ++++
12
1 file changed, 1 insertion(+), 1 deletion(-)
27
target/arm/m_helper.c | 14 ++++++++------
28
target/arm/translate.c | 3 +++
29
3 files changed, 15 insertions(+), 6 deletions(-)
13
30
31
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/gdbstub.c
34
+++ b/target/arm/gdbstub.c
35
@@ -XXX,XX +XXX,XX @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
36
37
if (n < 16) {
38
/* Core integer register. */
39
+ if (n == 13 && arm_feature(env, ARM_FEATURE_M)) {
40
+ /* M profile SP low bits are always 0 */
41
+ tmp &= ~3;
42
+ }
43
env->regs[n] = tmp;
44
return 4;
45
}
46
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/m_helper.c
49
+++ b/target/arm/m_helper.c
50
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
51
if (!env->v7m.secure) {
52
return;
53
}
54
- env->v7m.other_ss_msp = val;
55
+ env->v7m.other_ss_msp = val & ~3;
56
return;
57
case 0x89: /* PSP_NS */
58
if (!env->v7m.secure) {
59
return;
60
}
61
- env->v7m.other_ss_psp = val;
62
+ env->v7m.other_ss_psp = val & ~3;
63
return;
64
case 0x8a: /* MSPLIM_NS */
65
if (!env->v7m.secure) {
66
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
67
68
limit = is_psp ? env->v7m.psplim[false] : env->v7m.msplim[false];
69
70
+ val &= ~0x3;
71
+
72
if (val < limit) {
73
raise_exception_ra(env, EXCP_STKOF, 0, 1, GETPC());
74
}
75
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
76
break;
77
case 8: /* MSP */
78
if (v7m_using_psp(env)) {
79
- env->v7m.other_sp = val;
80
+ env->v7m.other_sp = val & ~3;
81
} else {
82
- env->regs[13] = val;
83
+ env->regs[13] = val & ~3;
84
}
85
break;
86
case 9: /* PSP */
87
if (v7m_using_psp(env)) {
88
- env->regs[13] = val;
89
+ env->regs[13] = val & ~3;
90
} else {
91
- env->v7m.other_sp = val;
92
+ env->v7m.other_sp = val & ~3;
93
}
94
break;
95
case 10: /* MSPLIM */
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
96
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.c
98
--- a/target/arm/translate.c
17
+++ b/target/arm/translate.c
99
+++ b/target/arm/translate.c
18
@@ -XXX,XX +XXX,XX @@ static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
100
@@ -XXX,XX +XXX,XX @@ void store_reg(DisasContext *s, int reg, TCGv_i32 var)
19
- Hardware watchpoints.
20
Hardware breakpoints have already been handled and skip this code.
21
*/
101
*/
22
- switch(dc->base.is_jmp) {
102
tcg_gen_andi_i32(var, var, s->thumb ? ~1 : ~3);
23
+ switch (dc->base.is_jmp) {
103
s->base.is_jmp = DISAS_JUMP;
24
case DISAS_NEXT:
104
+ } else if (reg == 13 && arm_dc_feature(s, ARM_FEATURE_M)) {
25
case DISAS_TOO_MANY:
105
+ /* For M-profile SP bits [1:0] are always zero */
26
gen_goto_tb(dc, 1, dc->base.pc_next);
106
+ tcg_gen_andi_i32(var, var, ~3);
107
}
108
tcg_gen_mov_i32(cpu_R[reg], var);
109
tcg_temp_free_i32(var);
27
--
110
--
28
2.20.1
111
2.20.1
29
112
30
113
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
In do_v7m_exception_exit(), we perform various checks as part of
2
performing the exception return. If one of these checks fails, the
3
architecture requires that we take an appropriate exception on the
4
existing stackframe. We implement this by calling
5
v7m_exception_taken() to set up to take the new exception, and then
6
immediately returning from do_v7m_exception_exit() without proceeding
7
any further with the unstack-and-exception-return process.
2
8
3
The MusicPal board code connects both of the IRQ outputs of the UART
9
In a couple of checks that are new in v8.1M, we forgot the "return"
4
to the same INTC qemu_irq. Connecting two qemu_irqs outputs directly
10
statement, with the effect that if bad code in the guest tripped over
5
to the same input is not valid as it produces subtly wrong behaviour
11
these checks we would set up to take a UsageFault exception but then
6
(for instance if both the IRQ lines are high, and then one goes
12
blunder on trying to also unstack and return from the original
7
low, the INTC input will see this as a high-to-low transition
13
exception, with the probable result that the guest would crash.
8
even though the second IRQ line should still be holding it high).
9
14
10
This kind of wiring needs an explicitly created OR gate; add one.
15
Add the missing return statements.
11
16
12
Inspired-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20201107193403.436146-5-f4bug@amsat.org
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-id: 20210723162146.5167-3-peter.maydell@linaro.org
17
---
20
---
18
hw/arm/musicpal.c | 17 +++++++++++++----
21
target/arm/m_helper.c | 2 ++
19
hw/arm/Kconfig | 1 +
22
1 file changed, 2 insertions(+)
20
2 files changed, 14 insertions(+), 4 deletions(-)
21
23
22
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
24
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
23
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/arm/musicpal.c
26
--- a/target/arm/m_helper.c
25
+++ b/hw/arm/musicpal.c
27
+++ b/target/arm/m_helper.c
26
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
27
#include "ui/console.h"
29
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
28
#include "hw/i2c/i2c.h"
30
"stackframe: NSACR prevents clearing FPU registers\n");
29
#include "hw/irq.h"
31
v7m_exception_taken(cpu, excret, true, false);
30
+#include "hw/or-irq.h"
32
+ return;
31
#include "hw/audio/wm8750.h"
33
} else if (!cpacr_pass) {
32
#include "sysemu/block-backend.h"
34
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE,
33
#include "sysemu/runstate.h"
35
exc_secure);
34
@@ -XXX,XX +XXX,XX @@
36
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
35
#define MP_TIMER4_IRQ 7
37
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
36
#define MP_EHCI_IRQ 8
38
"stackframe: CPACR prevents clearing FPU registers\n");
37
#define MP_ETH_IRQ 9
39
v7m_exception_taken(cpu, excret, true, false);
38
-#define MP_UART1_IRQ 11
40
+ return;
39
-#define MP_UART2_IRQ 11
41
}
40
+#define MP_UART_SHARED_IRQ 11
42
}
41
#define MP_GPIO_IRQ 12
43
/* Clear s0..s15, FPSCR and VPR */
42
#define MP_RTC_IRQ 28
43
#define MP_AUDIO_IRQ 30
44
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
45
ARMCPU *cpu;
46
qemu_irq pic[32];
47
DeviceState *dev;
48
+ DeviceState *uart_orgate;
49
DeviceState *i2c_dev;
50
DeviceState *lcd_dev;
51
DeviceState *key_dev;
52
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
53
pic[MP_TIMER2_IRQ], pic[MP_TIMER3_IRQ],
54
pic[MP_TIMER4_IRQ], NULL);
55
56
- serial_mm_init(address_space_mem, MP_UART1_BASE, 2, pic[MP_UART1_IRQ],
57
+ /* Logically OR both UART IRQs together */
58
+ uart_orgate = DEVICE(object_new(TYPE_OR_IRQ));
59
+ object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fatal);
60
+ qdev_realize_and_unref(uart_orgate, NULL, &error_fatal);
61
+ qdev_connect_gpio_out(DEVICE(uart_orgate), 0, pic[MP_UART_SHARED_IRQ]);
62
+
63
+ serial_mm_init(address_space_mem, MP_UART1_BASE, 2,
64
+ qdev_get_gpio_in(uart_orgate, 0),
65
1825000, serial_hd(0), DEVICE_NATIVE_ENDIAN);
66
- serial_mm_init(address_space_mem, MP_UART2_BASE, 2, pic[MP_UART2_IRQ],
67
+ serial_mm_init(address_space_mem, MP_UART2_BASE, 2,
68
+ qdev_get_gpio_in(uart_orgate, 1),
69
1825000, serial_hd(1), DEVICE_NATIVE_ENDIAN);
70
71
/* Register flash */
72
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/arm/Kconfig
75
+++ b/hw/arm/Kconfig
76
@@ -XXX,XX +XXX,XX @@ config MUSCA
77
78
config MUSICPAL
79
bool
80
+ select OR_IRQ
81
select BITBANG_I2C
82
select MARVELL_88W8618
83
select PTIMER
84
--
44
--
85
2.20.1
45
2.20.1
86
46
87
47
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
For M-profile, we weren't reporting alignment faults triggered by the
2
generic TCG code correctly to the guest. These get passed into
3
arm_v7m_cpu_do_interrupt() as an EXCP_DATA_ABORT with an A-profile
4
style exception.fsr value of 1. We didn't check for this, and so
5
they fell through into the default of "assume this is an MPU fault"
6
and were reported to the guest as a data access violation MPU fault.
2
7
3
The system configuration controller (SYSCFG) doesn't have
8
Report these alignment faults as UsageFaults which set the UNALIGNED
4
any output IRQ (and the INTC input #71 belongs to the UART6).
9
bit in the UFSR.
5
Remove the invalid code.
6
10
7
Fixes: db635521a02 ("stm32f205: Add the stm32f205 SoC")
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20201107193403.436146-3-f4bug@amsat.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20210723162146.5167-4-peter.maydell@linaro.org
12
---
14
---
13
include/hw/misc/stm32f2xx_syscfg.h | 2 --
15
target/arm/m_helper.c | 8 ++++++++
14
hw/arm/stm32f205_soc.c | 1 -
16
1 file changed, 8 insertions(+)
15
hw/misc/stm32f2xx_syscfg.c | 2 --
16
3 files changed, 5 deletions(-)
17
17
18
diff --git a/include/hw/misc/stm32f2xx_syscfg.h b/include/hw/misc/stm32f2xx_syscfg.h
18
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
19
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/misc/stm32f2xx_syscfg.h
20
--- a/target/arm/m_helper.c
21
+++ b/include/hw/misc/stm32f2xx_syscfg.h
21
+++ b/target/arm/m_helper.c
22
@@ -XXX,XX +XXX,XX @@ struct STM32F2XXSyscfgState {
22
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
23
uint32_t syscfg_exticr3;
23
env->v7m.sfsr |= R_V7M_SFSR_LSERR_MASK;
24
uint32_t syscfg_exticr4;
24
break;
25
uint32_t syscfg_cmpcr;
25
case EXCP_UNALIGNED:
26
-
26
+ /* Unaligned faults reported by M-profile aware code */
27
- qemu_irq irq;
27
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE, env->v7m.secure);
28
};
28
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_UNALIGNED_MASK;
29
29
break;
30
#endif /* HW_STM32F2XX_SYSCFG_H */
30
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
31
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
31
}
32
index XXXXXXX..XXXXXXX 100644
32
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_BUS, false);
33
--- a/hw/arm/stm32f205_soc.c
33
break;
34
+++ b/hw/arm/stm32f205_soc.c
34
+ case 0x1: /* Alignment fault reported by generic code */
35
@@ -XXX,XX +XXX,XX @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
35
+ qemu_log_mask(CPU_LOG_INT,
36
}
36
+ "...really UsageFault with UFSR.UNALIGNED\n");
37
busdev = SYS_BUS_DEVICE(dev);
37
+ env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_UNALIGNED_MASK;
38
sysbus_mmio_map(busdev, 0, 0x40013800);
38
+ armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE,
39
- sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, 71));
39
+ env->v7m.secure);
40
40
+ break;
41
/* Attach UART (uses USART registers) and USART controllers */
41
default:
42
for (i = 0; i < STM_NUM_USARTS; i++) {
42
/*
43
diff --git a/hw/misc/stm32f2xx_syscfg.c b/hw/misc/stm32f2xx_syscfg.c
43
* All other FSR values are either MPU faults or "can't happen
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/misc/stm32f2xx_syscfg.c
46
+++ b/hw/misc/stm32f2xx_syscfg.c
47
@@ -XXX,XX +XXX,XX @@ static void stm32f2xx_syscfg_init(Object *obj)
48
{
49
STM32F2XXSyscfgState *s = STM32F2XX_SYSCFG(obj);
50
51
- sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
52
-
53
memory_region_init_io(&s->mmio, obj, &stm32f2xx_syscfg_ops, s,
54
TYPE_STM32F2XX_SYSCFG, 0x400);
55
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
56
--
44
--
57
2.20.1
45
2.20.1
58
46
59
47
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The ISCR.ISRPENDING bit is set when an external interrupt is pending.
2
This is true whether that external interrupt is enabled or not.
3
This means that we can't use 's->vectpending == 0' as a shortcut to
4
"ISRPENDING is zero", because s->vectpending indicates only the
5
highest priority pending enabled interrupt.
2
6
3
We can use one MPC per SRAM bank, but we currently only wire the
7
Remove the incorrect optimization so that if there is no pending
4
IRQ from the first expansion MPC to the IRQ splitter. Fix that.
8
enabled interrupt we fall through to scanning through the whole
9
interrupt array.
5
10
6
Fixes: bb75e16d5e6 ("hw/arm/iotkit: Wire up MPC interrupt lines")
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20201107193403.436146-2-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20210723162146.5167-5-peter.maydell@linaro.org
11
---
14
---
12
hw/arm/armsse.c | 3 ++-
15
hw/intc/armv7m_nvic.c | 9 ++++-----
13
1 file changed, 2 insertions(+), 1 deletion(-)
16
1 file changed, 4 insertions(+), 5 deletions(-)
14
17
15
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
18
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/armsse.c
20
--- a/hw/intc/armv7m_nvic.c
18
+++ b/hw/arm/armsse.c
21
+++ b/hw/intc/armv7m_nvic.c
19
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
22
@@ -XXX,XX +XXX,XX @@ static bool nvic_isrpending(NVICState *s)
20
qdev_get_gpio_in(dev_splitter, 0));
23
{
21
qdev_connect_gpio_out(dev_splitter, 0,
24
int irq;
22
qdev_get_gpio_in_named(dev_secctl,
25
23
- "mpc_status", 0));
26
- /* We can shortcut if the highest priority pending interrupt
24
+ "mpc_status",
27
- * happens to be external or if there is nothing pending.
25
+ i - IOTS_NUM_EXP_MPC));
28
+ /*
26
}
29
+ * We can shortcut if the highest priority pending interrupt
27
30
+ * happens to be external; if not we need to check the whole
28
qdev_connect_gpio_out(dev_splitter, 1,
31
+ * vectors[] array.
32
*/
33
if (s->vectpending > NVIC_FIRST_IRQ) {
34
return true;
35
}
36
- if (s->vectpending == 0) {
37
- return false;
38
- }
39
40
for (irq = NVIC_FIRST_IRQ; irq < s->num_irq; irq++) {
41
if (s->vectors[irq].pending) {
29
--
42
--
30
2.20.1
43
2.20.1
31
44
32
45
diff view generated by jsdifflib
1
From: Havard Skinnemoen <hskinnemoen@google.com>
1
The VECTPENDING field in the ICSR is 9 bits wide, in bits [20:12] of
2
the register. We were incorrectly masking it to 8 bits, so it would
3
report the wrong value if the pending exception was greater than 256.
4
Fix the bug.
2
5
3
The number of runs is equal to the number of 0-1 and 1-0 transitions,
4
plus one. Currently, it's counting the number of times these transitions
5
do _not_ happen, plus one.
6
7
Source:
8
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-22r1a.pdf
9
section 2.3.4 point (3).
10
11
Signed-off-by: Havard Skinnemoen <hskinnemoen@google.com>
12
Message-id: 20201103011457.2959989-2-hskinnemoen@google.com
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20210723162146.5167-6-peter.maydell@linaro.org
15
---
9
---
16
tests/qtest/npcm7xx_rng-test.c | 2 +-
10
hw/intc/armv7m_nvic.c | 2 +-
17
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
18
12
19
diff --git a/tests/qtest/npcm7xx_rng-test.c b/tests/qtest/npcm7xx_rng-test.c
13
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
20
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
21
--- a/tests/qtest/npcm7xx_rng-test.c
15
--- a/hw/intc/armv7m_nvic.c
22
+++ b/tests/qtest/npcm7xx_rng-test.c
16
+++ b/hw/intc/armv7m_nvic.c
23
@@ -XXX,XX +XXX,XX @@ static double calc_runs_p(const unsigned long *buf, unsigned int nr_bits)
17
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
24
pi = (double)nr_ones / nr_bits;
18
/* VECTACTIVE */
25
19
val = cpu->env.v7m.exception;
26
for (k = 0; k < nr_bits - 1; k++) {
20
/* VECTPENDING */
27
- vn_obs += !(test_bit(k, buf) ^ test_bit(k + 1, buf));
21
- val |= (s->vectpending & 0xff) << 12;
28
+ vn_obs += (test_bit(k, buf) ^ test_bit(k + 1, buf));
22
+ val |= (s->vectpending & 0x1ff) << 12;
29
}
23
/* ISRPENDING - set if any external IRQ is pending */
30
vn_obs += 1;
24
if (nvic_isrpending(s)) {
31
25
val |= (1 << 22);
32
--
26
--
33
2.20.1
27
2.20.1
34
28
35
29
diff view generated by jsdifflib
1
Checks for UNDEF cases should go before the "is VFP enabled?" access
1
In Arm v8.1M the VECTPENDING field in the ICSR has new behaviour: if
2
check, except in special cases. Move a stray UNDEF check in the VTBL
2
the register is accessed NonSecure and the highest priority pending
3
trans function up above the access check.
3
enabled exception (that would be returned in the VECTPENDING field)
4
targets Secure, then the VECTPENDING field must read 1 rather than
5
the exception number of the pending exception. Implement this.
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: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20201109145324.2859-1-peter.maydell@linaro.org
9
Message-id: 20210723162146.5167-7-peter.maydell@linaro.org
8
---
10
---
9
target/arm/translate-neon.c.inc | 8 ++++----
11
hw/intc/armv7m_nvic.c | 31 ++++++++++++++++++++++++-------
10
1 file changed, 4 insertions(+), 4 deletions(-)
12
1 file changed, 24 insertions(+), 7 deletions(-)
11
13
12
diff --git a/target/arm/translate-neon.c.inc b/target/arm/translate-neon.c.inc
14
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/translate-neon.c.inc
16
--- a/hw/intc/armv7m_nvic.c
15
+++ b/target/arm/translate-neon.c.inc
17
+++ b/hw/intc/armv7m_nvic.c
16
@@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
18
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_acknowledge_irq(void *opaque)
17
return false;
19
nvic_irq_update(s);
18
}
20
}
19
21
20
- if (!vfp_access_check(s)) {
22
+static bool vectpending_targets_secure(NVICState *s)
21
- return true;
23
+{
22
- }
24
+ /* Return true if s->vectpending targets Secure state */
23
-
25
+ if (s->vectpending_is_s_banked) {
24
if ((a->vn + a->len + 1) > 32) {
25
/*
26
* This is UNPREDICTABLE; we choose to UNDEF to avoid the
27
@@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
28
return false;
29
}
30
31
+ if (!vfp_access_check(s)) {
32
+ return true;
26
+ return true;
33
+ }
27
+ }
28
+ return !exc_is_banked(s->vectpending) &&
29
+ exc_targets_secure(s, s->vectpending);
30
+}
34
+
31
+
35
desc = tcg_const_i32((a->vn << 2) | a->len);
32
void armv7m_nvic_get_pending_irq_info(void *opaque,
36
def = tcg_temp_new_i64();
33
int *pirq, bool *ptargets_secure)
37
if (a->op) {
34
{
35
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_get_pending_irq_info(void *opaque,
36
37
assert(pending > ARMV7M_EXCP_RESET && pending < s->num_irq);
38
39
- if (s->vectpending_is_s_banked) {
40
- targets_secure = true;
41
- } else {
42
- targets_secure = !exc_is_banked(pending) &&
43
- exc_targets_secure(s, pending);
44
- }
45
+ targets_secure = vectpending_targets_secure(s);
46
47
trace_nvic_get_pending_irq_info(pending, targets_secure);
48
49
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
50
/* VECTACTIVE */
51
val = cpu->env.v7m.exception;
52
/* VECTPENDING */
53
- val |= (s->vectpending & 0x1ff) << 12;
54
+ if (s->vectpending) {
55
+ /*
56
+ * From v8.1M VECTPENDING must read as 1 if accessed as
57
+ * NonSecure and the highest priority pending and enabled
58
+ * exception targets Secure.
59
+ */
60
+ int vp = s->vectpending;
61
+ if (!attrs.secure && arm_feature(&cpu->env, ARM_FEATURE_V8_1M) &&
62
+ vectpending_targets_secure(s)) {
63
+ vp = 1;
64
+ }
65
+ val |= (vp & 0x1ff) << 12;
66
+ }
67
/* ISRPENDING - set if any external IRQ is pending */
68
if (nvic_isrpending(s)) {
69
val |= (1 << 22);
38
--
70
--
39
2.20.1
71
2.20.1
40
72
41
73
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
2
3
When using a Cortex-A15, the Virt machine does not use any
3
Missed in commit f3478392 "docs: Move deprecation, build
4
MPCore peripherals. Remove the dependency.
4
and license info out of system/"
5
5
6
Fixes: 7951c7b7c05 ("hw/arm: Express dependencies of the virt machine with Kconfig")
6
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
7
Reported-by: Miroslav Rezanina <mrezanin@redhat.com>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20201107114852.271922-1-philmd@redhat.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20210723065828.1336760-1-maozhongyi@cmss.chinamobile.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
10
---
13
hw/arm/Kconfig | 1 -
11
configure | 2 +-
14
1 file changed, 1 deletion(-)
12
target/i386/cpu.c | 2 +-
13
MAINTAINERS | 2 +-
14
3 files changed, 3 insertions(+), 3 deletions(-)
15
15
16
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
16
diff --git a/configure b/configure
17
index XXXXXXX..XXXXXXX 100755
18
--- a/configure
19
+++ b/configure
20
@@ -XXX,XX +XXX,XX @@ fi
21
22
if test -n "${deprecated_features}"; then
23
echo "Warning, deprecated features enabled."
24
- echo "Please see docs/system/deprecated.rst"
25
+ echo "Please see docs/about/deprecated.rst"
26
echo " features: ${deprecated_features}"
27
fi
28
29
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
17
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/Kconfig
31
--- a/target/i386/cpu.c
19
+++ b/hw/arm/Kconfig
32
+++ b/target/i386/cpu.c
20
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
33
@@ -XXX,XX +XXX,XX @@ static const X86CPUDefinition builtin_x86_defs[] = {
21
imply VFIO_PLATFORM
34
* none", but this is just for compatibility while libvirt isn't
22
imply VFIO_XGMAC
35
* adapted to resolve CPU model versions before creating VMs.
23
imply TPM_TIS_SYSBUS
36
* See "Runnability guarantee of CPU models" at
24
- select A15MPCORE
37
- * docs/system/deprecated.rst.
25
select ACPI
38
+ * docs/about/deprecated.rst.
26
select ARM_SMMUV3
39
*/
27
select GPIO_KEY
40
X86CPUVersion default_cpu_version = 1;
41
42
diff --git a/MAINTAINERS b/MAINTAINERS
43
index XXXXXXX..XXXXXXX 100644
44
--- a/MAINTAINERS
45
+++ b/MAINTAINERS
46
@@ -XXX,XX +XXX,XX @@ F: contrib/gitdm/*
47
48
Incompatible changes
49
R: libvir-list@redhat.com
50
-F: docs/system/deprecated.rst
51
+F: docs/about/deprecated.rst
52
53
Build System
54
------------
28
--
55
--
29
2.20.1
56
2.20.1
30
57
31
58
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We should at least document what this machine is about.
3
Currently, our only caller is sve_zcr_len_for_el, which has
4
already masked the length extracted from ZCR_ELx, so the
5
masking done here is a nop. But we will shortly have uses
6
from other locations, where the length will be unmasked.
4
7
5
Reviewed-by: Graeme Gregory <graeme@nuviainc.com>
8
Saturate the length to ARM_MAX_VQ instead of truncating to
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
the low 4 bits.
7
Message-id: 20201104165254.24822-1-alex.bennee@linaro.org
10
8
Cc: Leif Lindholm <leif@nuviainc.com>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Cc: Shashi Mallela <shashi.mallela@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
13
Message-id: 20210723203344.968563-2-richard.henderson@linaro.org
11
[PMM: fixed filename mismatch]
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
15
---
14
docs/system/arm/sbsa.rst | 32 ++++++++++++++++++++++++++++++++
16
target/arm/helper.c | 4 +++-
15
docs/system/target-arm.rst | 1 +
17
1 file changed, 3 insertions(+), 1 deletion(-)
16
2 files changed, 33 insertions(+)
17
create mode 100644 docs/system/arm/sbsa.rst
18
18
19
diff --git a/docs/system/arm/sbsa.rst b/docs/system/arm/sbsa.rst
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
new file mode 100644
20
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX
21
--- a/target/arm/helper.c
22
--- /dev/null
22
+++ b/target/arm/helper.c
23
+++ b/docs/system/arm/sbsa.rst
23
@@ -XXX,XX +XXX,XX @@ static uint32_t sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
24
@@ -XXX,XX +XXX,XX @@
24
{
25
+Arm Server Base System Architecture Reference board (``sbsa-ref``)
25
uint32_t end_len;
26
+==================================================================
26
27
- end_len = start_len &= 0xf;
28
+ start_len = MIN(start_len, ARM_MAX_VQ - 1);
29
+ end_len = start_len;
27
+
30
+
28
+While the `virt` board is a generic board platform that doesn't match
31
if (!test_bit(start_len, cpu->sve_vq_map)) {
29
+any real hardware the `sbsa-ref` board intends to look like real
32
end_len = find_last_bit(cpu->sve_vq_map, start_len);
30
+hardware. The `Server Base System Architecture
33
assert(end_len < start_len);
31
+<https://developer.arm.com/documentation/den0029/latest>` defines a
32
+minimum base line of hardware support and importantly how the firmware
33
+reports that to any operating system. It is a static system that
34
+reports a very minimal DT to the firmware for non-discoverable
35
+information about components affected by the qemu command line (i.e.
36
+cpus and memory). As a result it must have a firmware specifically
37
+built to expect a certain hardware layout (as you would in a real
38
+machine).
39
+
40
+It is intended to be a machine for developing firmware and testing
41
+standards compliance with operating systems.
42
+
43
+Supported devices
44
+"""""""""""""""""
45
+
46
+The sbsa-ref board supports:
47
+
48
+ - A configurable number of AArch64 CPUs
49
+ - GIC version 3
50
+ - System bus AHCI controller
51
+ - System bus EHCI controller
52
+ - CDROM and hard disc on AHCI bus
53
+ - E1000E ethernet card on PCIe bus
54
+ - VGA display adaptor on PCIe bus
55
+ - A generic SBSA watchdog device
56
+
57
diff --git a/docs/system/target-arm.rst b/docs/system/target-arm.rst
58
index XXXXXXX..XXXXXXX 100644
59
--- a/docs/system/target-arm.rst
60
+++ b/docs/system/target-arm.rst
61
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
62
arm/mps2
63
arm/musca
64
arm/realview
65
+ arm/sbsa
66
arm/versatile
67
arm/vexpress
68
arm/aspeed
69
--
34
--
70
2.20.1
35
2.20.1
71
36
72
37
diff view generated by jsdifflib
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Fix code style. Operator needs spaces both sides.
3
Rename from sve_zcr_get_valid_len and make accessible
4
from outside of helper.c.
4
5
5
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Kai Deng <dengkai1@huawei.com>
7
Message-id: 20201103114529.638233-1-zhangxinhao1@huawei.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20210723203344.968563-3-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/arch_dump.c | 8 ++++----
11
target/arm/internals.h | 10 ++++++++++
12
target/arm/arm-semi.c | 8 ++++----
12
target/arm/helper.c | 4 ++--
13
target/arm/helper.c | 2 +-
13
2 files changed, 12 insertions(+), 2 deletions(-)
14
3 files changed, 9 insertions(+), 9 deletions(-)
15
14
16
diff --git a/target/arm/arch_dump.c b/target/arm/arch_dump.c
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/arch_dump.c
17
--- a/target/arm/internals.h
19
+++ b/target/arm/arch_dump.c
18
+++ b/target/arm/internals.h
20
@@ -XXX,XX +XXX,XX @@ static int aarch64_write_elf64_prfpreg(WriteCoreDumpFunction f,
19
@@ -XXX,XX +XXX,XX @@ void arm_translate_init(void);
21
20
void arm_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb);
22
for (i = 0; i < 32; ++i) {
21
#endif /* CONFIG_TCG */
23
uint64_t *q = aa64_vfp_qreg(env, i);
22
24
- note.vfp.vregs[2*i + 0] = cpu_to_dump64(s, q[0]);
23
+/**
25
- note.vfp.vregs[2*i + 1] = cpu_to_dump64(s, q[1]);
24
+ * aarch64_sve_zcr_get_valid_len:
26
+ note.vfp.vregs[2 * i + 0] = cpu_to_dump64(s, q[0]);
25
+ * @cpu: cpu context
27
+ note.vfp.vregs[2 * i + 1] = cpu_to_dump64(s, q[1]);
26
+ * @start_len: maximum len to consider
28
}
27
+ *
29
28
+ * Return the maximum supported sve vector length <= @start_len.
30
if (s->dump_info.d_endian == ELFDATA2MSB) {
29
+ * Note that both @start_len and the return value are in units
31
@@ -XXX,XX +XXX,XX @@ static int aarch64_write_elf64_prfpreg(WriteCoreDumpFunction f,
30
+ * of ZCR_ELx.LEN, so the vector bit length is (x + 1) * 128.
32
*/
31
+ */
33
for (i = 0; i < 32; ++i) {
32
+uint32_t aarch64_sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len);
34
uint64_t tmp = note.vfp.vregs[2*i];
33
35
- note.vfp.vregs[2*i] = note.vfp.vregs[2*i+1];
34
enum arm_fprounding {
36
- note.vfp.vregs[2*i+1] = tmp;
35
FPROUNDING_TIEEVEN,
37
+ note.vfp.vregs[2 * i] = note.vfp.vregs[2 * i + 1];
38
+ note.vfp.vregs[2 * i + 1] = tmp;
39
}
40
}
41
42
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/arm-semi.c
45
+++ b/target/arm/arm-semi.c
46
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
47
if (use_gdb_syscalls()) {
48
arm_semi_open_guestfd = guestfd;
49
ret = arm_gdb_syscall(cpu, arm_semi_open_cb, "open,%s,%x,1a4", arg0,
50
- (int)arg2+1, gdb_open_modeflags[arg1]);
51
+ (int)arg2 + 1, gdb_open_modeflags[arg1]);
52
} else {
53
ret = set_swi_errno(env, open(s, open_modeflags[arg1], 0644));
54
if (ret == (uint32_t)-1) {
55
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
56
GET_ARG(1);
57
if (use_gdb_syscalls()) {
58
ret = arm_gdb_syscall(cpu, arm_semi_cb, "unlink,%s",
59
- arg0, (int)arg1+1);
60
+ arg0, (int)arg1 + 1);
61
} else {
62
s = lock_user_string(arg0);
63
if (!s) {
64
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
65
GET_ARG(3);
66
if (use_gdb_syscalls()) {
67
return arm_gdb_syscall(cpu, arm_semi_cb, "rename,%s,%s",
68
- arg0, (int)arg1+1, arg2, (int)arg3+1);
69
+ arg0, (int)arg1 + 1, arg2, (int)arg3 + 1);
70
} else {
71
char *s2;
72
s = lock_user_string(arg0);
73
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
74
GET_ARG(1);
75
if (use_gdb_syscalls()) {
76
return arm_gdb_syscall(cpu, arm_semi_cb, "system,%s",
77
- arg0, (int)arg1+1);
78
+ arg0, (int)arg1 + 1);
79
} else {
80
s = lock_user_string(arg0);
81
if (!s) {
82
diff --git a/target/arm/helper.c b/target/arm/helper.c
36
diff --git a/target/arm/helper.c b/target/arm/helper.c
83
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
84
--- a/target/arm/helper.c
38
--- a/target/arm/helper.c
85
+++ b/target/arm/helper.c
39
+++ b/target/arm/helper.c
86
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(usad8)(uint32_t a, uint32_t b)
40
@@ -XXX,XX +XXX,XX @@ int sve_exception_el(CPUARMState *env, int el)
87
uint32_t sum;
41
return 0;
88
sum = do_usad(a, b);
89
sum += do_usad(a >> 8, b >> 8);
90
- sum += do_usad(a >> 16, b >>16);
91
+ sum += do_usad(a >> 16, b >> 16);
92
sum += do_usad(a >> 24, b >> 24);
93
return sum;
94
}
42
}
43
44
-static uint32_t sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
45
+uint32_t aarch64_sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
46
{
47
uint32_t end_len;
48
49
@@ -XXX,XX +XXX,XX @@ uint32_t sve_zcr_len_for_el(CPUARMState *env, int el)
50
zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[3]);
51
}
52
53
- return sve_zcr_get_valid_len(cpu, zcr_len);
54
+ return aarch64_sve_zcr_get_valid_len(cpu, zcr_len);
55
}
56
57
static void zcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
95
--
58
--
96
2.20.1
59
2.20.1
97
60
98
61
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The helper function did not get updated when we reorganized
3
Mirror the behavour of /proc/sys/abi/sve_default_vector_length
4
the vector register file for SVE. Since then, the neon dregs
4
under the real linux kernel. We have no way of passing along
5
are non-sequential and cannot be simply indexed.
5
a real default across exec like the kernel can, but this is a
6
decent way of adjusting the startup vector length of a process.
6
7
7
At the same time, make the helper function operate on 64-bit
8
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/482
8
quantities so that we do not have to call it twice.
9
10
Fixes: c39c2b9043e
11
Reported-by: Ard Biesheuvel <ardb@kernel.org>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
[PMM: use aa32_vfp_dreg() rather than opencoding]
14
Message-id: 20201105171126.88014-1-richard.henderson@linaro.org
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20210723203344.968563-4-richard.henderson@linaro.org
12
[PMM: tweaked docs formatting, document -1 special-case,
13
added fixup patch from RTH mentioning QEMU's maximum veclen.]
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
15
---
18
target/arm/helper.h | 2 +-
16
docs/system/arm/cpu-features.rst | 15 ++++++++
19
target/arm/op_helper.c | 23 +++++++++--------
17
target/arm/cpu.h | 5 +++
20
target/arm/translate-neon.c.inc | 44 +++++++++++----------------------
18
target/arm/cpu.c | 14 ++++++--
21
3 files changed, 29 insertions(+), 40 deletions(-)
19
target/arm/cpu64.c | 60 ++++++++++++++++++++++++++++++++
20
4 files changed, 92 insertions(+), 2 deletions(-)
22
21
23
diff --git a/target/arm/helper.h b/target/arm/helper.h
22
diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst
24
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/helper.h
24
--- a/docs/system/arm/cpu-features.rst
26
+++ b/target/arm/helper.h
25
+++ b/docs/system/arm/cpu-features.rst
27
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(rsqrte_f32, TCG_CALL_NO_RWG, f32, f32, ptr)
26
@@ -XXX,XX +XXX,XX @@ verbose command lines. However, the recommended way to select vector
28
DEF_HELPER_FLAGS_2(rsqrte_f64, TCG_CALL_NO_RWG, f64, f64, ptr)
27
lengths is to explicitly enable each desired length. Therefore only
29
DEF_HELPER_FLAGS_1(recpe_u32, TCG_CALL_NO_RWG, i32, i32)
28
example's (1), (4), and (6) exhibit recommended uses of the properties.
30
DEF_HELPER_FLAGS_1(rsqrte_u32, TCG_CALL_NO_RWG, i32, i32)
29
31
-DEF_HELPER_FLAGS_4(neon_tbl, TCG_CALL_NO_RWG, i32, i32, i32, ptr, i32)
30
+SVE User-mode Default Vector Length Property
32
+DEF_HELPER_FLAGS_4(neon_tbl, TCG_CALL_NO_RWG, i64, env, i32, i64, i64)
31
+--------------------------------------------
33
32
+
34
DEF_HELPER_3(shl_cc, i32, env, i32, i32)
33
+For qemu-aarch64, the cpu property ``sve-default-vector-length=N`` is
35
DEF_HELPER_3(shr_cc, i32, env, i32, i32)
34
+defined to mirror the Linux kernel parameter file
36
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
35
+``/proc/sys/abi/sve_default_vector_length``. The default length, ``N``,
36
+is in units of bytes and must be between 16 and 8192.
37
+If not specified, the default vector length is 64.
38
+
39
+If the default length is larger than the maximum vector length enabled,
40
+the actual vector length will be reduced. Note that the maximum vector
41
+length supported by QEMU is 256.
42
+
43
+If this property is set to ``-1`` then the default vector length
44
+is set to the maximum possible length.
45
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
37
index XXXXXXX..XXXXXXX 100644
46
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/op_helper.c
47
--- a/target/arm/cpu.h
39
+++ b/target/arm/op_helper.c
48
+++ b/target/arm/cpu.h
40
@@ -XXX,XX +XXX,XX @@ void raise_exception_ra(CPUARMState *env, uint32_t excp, uint32_t syndrome,
49
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
41
cpu_loop_exit_restore(cs, ra);
50
/* Used to set the maximum vector length the cpu will support. */
51
uint32_t sve_max_vq;
52
53
+#ifdef CONFIG_USER_ONLY
54
+ /* Used to set the default vector length at process start. */
55
+ uint32_t sve_default_vq;
56
+#endif
57
+
58
/*
59
* In sve_vq_map each set bit is a supported vector length of
60
* (bit-number + 1) * 16 bytes, i.e. each bit number + 1 is the vector
61
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/target/arm/cpu.c
64
+++ b/target/arm/cpu.c
65
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(DeviceState *dev)
66
env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 16, 2, 3);
67
/* with reasonable vector length */
68
if (cpu_isar_feature(aa64_sve, cpu)) {
69
- env->vfp.zcr_el[1] = MIN(cpu->sve_max_vq - 1, 3);
70
+ env->vfp.zcr_el[1] =
71
+ aarch64_sve_zcr_get_valid_len(cpu, cpu->sve_default_vq - 1);
72
}
73
/*
74
* Enable TBI0 but not TBI1.
75
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_initfn(Object *obj)
76
QLIST_INIT(&cpu->pre_el_change_hooks);
77
QLIST_INIT(&cpu->el_change_hooks);
78
79
-#ifndef CONFIG_USER_ONLY
80
+#ifdef CONFIG_USER_ONLY
81
+# ifdef TARGET_AARCH64
82
+ /*
83
+ * The linux kernel defaults to 512-bit vectors, when sve is supported.
84
+ * See documentation for /proc/sys/abi/sve_default_vector_length, and
85
+ * our corresponding sve-default-vector-length cpu property.
86
+ */
87
+ cpu->sve_default_vq = 4;
88
+# endif
89
+#else
90
/* Our inbound IRQ and FIQ lines */
91
if (kvm_enabled()) {
92
/* VIRQ and VFIQ are unused with KVM but we add them to maintain
93
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/target/arm/cpu64.c
96
+++ b/target/arm/cpu64.c
97
@@ -XXX,XX +XXX,XX @@ static void cpu_arm_set_sve(Object *obj, bool value, Error **errp)
98
cpu->isar.id_aa64pfr0 = t;
42
}
99
}
43
100
44
-uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def, void *vn,
101
+#ifdef CONFIG_USER_ONLY
45
- uint32_t maxindex)
102
+/* Mirror linux /proc/sys/abi/sve_default_vector_length. */
46
+uint64_t HELPER(neon_tbl)(CPUARMState *env, uint32_t desc,
103
+static void cpu_arm_set_sve_default_vec_len(Object *obj, Visitor *v,
47
+ uint64_t ireg, uint64_t def)
104
+ const char *name, void *opaque,
105
+ Error **errp)
106
+{
107
+ ARMCPU *cpu = ARM_CPU(obj);
108
+ int32_t default_len, default_vq, remainder;
109
+
110
+ if (!visit_type_int32(v, name, &default_len, errp)) {
111
+ return;
112
+ }
113
+
114
+ /* Undocumented, but the kernel allows -1 to indicate "maximum". */
115
+ if (default_len == -1) {
116
+ cpu->sve_default_vq = ARM_MAX_VQ;
117
+ return;
118
+ }
119
+
120
+ default_vq = default_len / 16;
121
+ remainder = default_len % 16;
122
+
123
+ /*
124
+ * Note that the 512 max comes from include/uapi/asm/sve_context.h
125
+ * and is the maximum architectural width of ZCR_ELx.LEN.
126
+ */
127
+ if (remainder || default_vq < 1 || default_vq > 512) {
128
+ error_setg(errp, "cannot set sve-default-vector-length");
129
+ if (remainder) {
130
+ error_append_hint(errp, "Vector length not a multiple of 16\n");
131
+ } else if (default_vq < 1) {
132
+ error_append_hint(errp, "Vector length smaller than 16\n");
133
+ } else {
134
+ error_append_hint(errp, "Vector length larger than %d\n",
135
+ 512 * 16);
136
+ }
137
+ return;
138
+ }
139
+
140
+ cpu->sve_default_vq = default_vq;
141
+}
142
+
143
+static void cpu_arm_get_sve_default_vec_len(Object *obj, Visitor *v,
144
+ const char *name, void *opaque,
145
+ Error **errp)
146
+{
147
+ ARMCPU *cpu = ARM_CPU(obj);
148
+ int32_t value = cpu->sve_default_vq * 16;
149
+
150
+ visit_type_int32(v, name, &value, errp);
151
+}
152
+#endif
153
+
154
void aarch64_add_sve_properties(Object *obj)
48
{
155
{
49
- uint32_t val, shift;
156
uint32_t vq;
50
- uint64_t *table = vn;
157
@@ -XXX,XX +XXX,XX @@ void aarch64_add_sve_properties(Object *obj)
51
+ uint64_t tmp, val = 0;
158
object_property_add(obj, name, "bool", cpu_arm_get_sve_vq,
52
+ uint32_t maxindex = ((desc & 3) + 1) * 8;
159
cpu_arm_set_sve_vq, NULL, NULL);
53
+ uint32_t base_reg = desc >> 2;
54
+ uint32_t shift, index, reg;
55
56
- val = 0;
57
- for (shift = 0; shift < 32; shift += 8) {
58
- uint32_t index = (ireg >> shift) & 0xff;
59
+ for (shift = 0; shift < 64; shift += 8) {
60
+ index = (ireg >> shift) & 0xff;
61
if (index < maxindex) {
62
- uint32_t tmp = (table[index >> 3] >> ((index & 7) << 3)) & 0xff;
63
- val |= tmp << shift;
64
+ reg = base_reg + (index >> 3);
65
+ tmp = *aa32_vfp_dreg(env, reg);
66
+ tmp = ((tmp >> ((index & 7) << 3)) & 0xff) << shift;
67
} else {
68
- val |= def & (0xff << shift);
69
+ tmp = def & (0xffull << shift);
70
}
71
+ val |= tmp;
72
}
160
}
73
return val;
161
+
162
+#ifdef CONFIG_USER_ONLY
163
+ /* Mirror linux /proc/sys/abi/sve_default_vector_length. */
164
+ object_property_add(obj, "sve-default-vector-length", "int32",
165
+ cpu_arm_get_sve_default_vec_len,
166
+ cpu_arm_set_sve_default_vec_len, NULL, NULL);
167
+#endif
74
}
168
}
75
diff --git a/target/arm/translate-neon.c.inc b/target/arm/translate-neon.c.inc
169
76
index XXXXXXX..XXXXXXX 100644
170
void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp)
77
--- a/target/arm/translate-neon.c.inc
78
+++ b/target/arm/translate-neon.c.inc
79
@@ -XXX,XX +XXX,XX @@ static bool trans_VEXT(DisasContext *s, arg_VEXT *a)
80
81
static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
82
{
83
- int n;
84
- TCGv_i32 tmp, tmp2, tmp3, tmp4;
85
- TCGv_ptr ptr1;
86
+ TCGv_i64 val, def;
87
+ TCGv_i32 desc;
88
89
if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
90
return false;
91
@@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
92
return true;
93
}
94
95
- n = a->len + 1;
96
- if ((a->vn + n) > 32) {
97
+ if ((a->vn + a->len + 1) > 32) {
98
/*
99
* This is UNPREDICTABLE; we choose to UNDEF to avoid the
100
* helper function running off the end of the register file.
101
*/
102
return false;
103
}
104
- n <<= 3;
105
- tmp = tcg_temp_new_i32();
106
- if (a->op) {
107
- read_neon_element32(tmp, a->vd, 0, MO_32);
108
- } else {
109
- tcg_gen_movi_i32(tmp, 0);
110
- }
111
- tmp2 = tcg_temp_new_i32();
112
- read_neon_element32(tmp2, a->vm, 0, MO_32);
113
- ptr1 = vfp_reg_ptr(true, a->vn);
114
- tmp4 = tcg_const_i32(n);
115
- gen_helper_neon_tbl(tmp2, tmp2, tmp, ptr1, tmp4);
116
117
+ desc = tcg_const_i32((a->vn << 2) | a->len);
118
+ def = tcg_temp_new_i64();
119
if (a->op) {
120
- read_neon_element32(tmp, a->vd, 1, MO_32);
121
+ read_neon_element64(def, a->vd, 0, MO_64);
122
} else {
123
- tcg_gen_movi_i32(tmp, 0);
124
+ tcg_gen_movi_i64(def, 0);
125
}
126
- tmp3 = tcg_temp_new_i32();
127
- read_neon_element32(tmp3, a->vm, 1, MO_32);
128
- gen_helper_neon_tbl(tmp3, tmp3, tmp, ptr1, tmp4);
129
- tcg_temp_free_i32(tmp);
130
- tcg_temp_free_i32(tmp4);
131
- tcg_temp_free_ptr(ptr1);
132
+ val = tcg_temp_new_i64();
133
+ read_neon_element64(val, a->vm, 0, MO_64);
134
135
- write_neon_element32(tmp2, a->vd, 0, MO_32);
136
- write_neon_element32(tmp3, a->vd, 1, MO_32);
137
- tcg_temp_free_i32(tmp2);
138
- tcg_temp_free_i32(tmp3);
139
+ gen_helper_neon_tbl(val, cpu_env, desc, val, def);
140
+ write_neon_element64(val, a->vd, 0, MO_64);
141
+
142
+ tcg_temp_free_i64(def);
143
+ tcg_temp_free_i64(val);
144
+ tcg_temp_free_i32(desc);
145
return true;
146
}
147
148
--
171
--
149
2.20.1
172
2.20.1
150
173
151
174
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
omap2420_mpu_init() introduced in commit 827df9f3c5f ("Add basic
4
OMAP2 chip support") takes care of creating the 3 UARTs.
5
6
Then commit 58a26b477e9 ("Emulate a serial bluetooth HCI with H4+
7
extensions and attach to n8x0's UART") added n8x0_uart_setup()
8
which create the UART and connects it to an IRQ output,
9
overwritting the existing peripheral and its IRQ connection.
10
This is incorrect.
11
12
Fortunately we don't need to fix this, because commit 6da68df7f9b
13
("hw/arm/nseries: Replace the bluetooth chardev with a "null"
14
chardev") removed the use of this peripheral. We can simply
15
remove the code.
16
17
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20201107193403.436146-4-f4bug@amsat.org
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20210726150953.1218690-1-f4bug@amsat.org
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
7
---
22
hw/arm/nseries.c | 11 -----------
8
hw/arm/nseries.c | 2 +-
23
1 file changed, 11 deletions(-)
9
1 file changed, 1 insertion(+), 1 deletion(-)
24
10
25
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
11
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
26
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/arm/nseries.c
13
--- a/hw/arm/nseries.c
28
+++ b/hw/arm/nseries.c
14
+++ b/hw/arm/nseries.c
29
@@ -XXX,XX +XXX,XX @@ static void n8x0_cbus_setup(struct n800_s *s)
15
@@ -XXX,XX +XXX,XX @@ static uint32_t mipid_txrx(void *opaque, uint32_t cmd, int len)
30
cbus_attach(cbus, s->tahvo = tahvo_init(tahvo_irq, 1));
16
default:
31
}
17
bad_cmd:
32
18
qemu_log_mask(LOG_GUEST_ERROR,
33
-static void n8x0_uart_setup(struct n800_s *s)
19
- "%s: unknown command %02x\n", __func__, s->cmd);
34
-{
20
+ "%s: unknown command 0x%02x\n", __func__, s->cmd);
35
- Chardev *radio = qemu_chr_new("bt-dummy-uart", "null", NULL);
21
break;
36
- /*
37
- * Note: We used to connect N8X0_BT_RESET_GPIO and N8X0_BT_WKUP_GPIO
38
- * here, but this code has been removed with the bluetooth backend.
39
- */
40
- omap_uart_attach(s->mpu->uart[BT_UART], radio);
41
-}
42
-
43
static void n8x0_usb_setup(struct n800_s *s)
44
{
45
SysBusDevice *dev;
46
@@ -XXX,XX +XXX,XX @@ static void n8x0_init(MachineState *machine,
47
n8x0_spi_setup(s);
48
n8x0_dss_setup(s);
49
n8x0_cbus_setup(s);
50
- n8x0_uart_setup(s);
51
if (machine_usb(machine)) {
52
n8x0_usb_setup(s);
53
}
22
}
23
54
--
24
--
55
2.20.1
25
2.20.1
56
26
57
27
diff view generated by jsdifflib
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Fix code style. Don't use '#' flag of printf format ('%#') in
3
The macro used to calculate the maximum memory size of the MMIO region
4
format strings, use '0x' prefix instead
4
had a mistake, causing all GPIO models to create a mapping of 0x9D8.
5
The intent was to have it be 0x9D8 - 0x800.
5
6
6
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
7
This extra size doesn't matter on ast2400 and ast2500, which have a 4KB
7
Signed-off-by: Kai Deng <dengkai1@huawei.com>
8
region set aside for the GPIO controller.
8
Message-id: 20201103114529.638233-2-zhangxinhao1@huawei.com
9
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
On the ast2600 the 3.3V and 1.8V GPIO controllers are 2KB apart, so the
11
regions would overlap. Worse was the 1.8V controller would map over the
12
top of the following peripheral, which happens to be the RTC.
13
14
The mmio region used by each device is a maximum of 2KB, so avoid the
15
calculations and hard code this as the maximum.
16
17
Fixes: 36d737ee82b2 ("hw/gpio: Add in AST2600 specific implementation")
18
Signed-off-by: Joel Stanley <joel@jms.id.au>
19
Reviewed-by: Rashmica Gupta <rashmica.g@gmail.com>
20
Reviewed-by: Cédric Le Goater <clg@kaod.org>
21
Message-id: 20210713065854.134634-2-joel@jms.id.au
22
[PMM: fix autocorrect error in commit message]
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
24
---
12
target/arm/translate-a64.c | 4 ++--
25
hw/gpio/aspeed_gpio.c | 3 +--
13
1 file changed, 2 insertions(+), 2 deletions(-)
26
1 file changed, 1 insertion(+), 2 deletions(-)
14
27
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
28
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
16
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
30
--- a/hw/gpio/aspeed_gpio.c
18
+++ b/target/arm/translate-a64.c
31
+++ b/hw/gpio/aspeed_gpio.c
19
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_fp16(DisasContext *s, uint32_t insn)
32
@@ -XXX,XX +XXX,XX @@
20
gen_helper_advsimd_acgt_f16(tcg_res, tcg_op1, tcg_op2, fpst);
33
#define GPIO_1_8V_MEM_SIZE 0x9D8
21
break;
34
#define GPIO_1_8V_REG_ARRAY_SIZE ((GPIO_1_8V_MEM_SIZE - \
22
default:
35
GPIO_1_8V_REG_OFFSET) >> 2)
23
- fprintf(stderr, "%s: insn %#04x, fpop %#2x @ %#" PRIx64 "\n",
36
-#define GPIO_MAX_MEM_SIZE MAX(GPIO_3_6V_MEM_SIZE, GPIO_1_8V_MEM_SIZE)
24
+ fprintf(stderr, "%s: insn 0x%04x, fpop 0x%2x @ 0x%" PRIx64 "\n",
37
25
__func__, insn, fpopcode, s->pc_curr);
38
static int aspeed_evaluate_irq(GPIOSets *regs, int gpio_prev_high, int gpio)
26
g_assert_not_reached();
39
{
27
}
40
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_realize(DeviceState *dev, Error **errp)
28
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
29
case 0x7f: /* FSQRT (vector) */
30
break;
31
default:
32
- fprintf(stderr, "%s: insn %#04x fpop %#2x\n", __func__, insn, fpop);
33
+ fprintf(stderr, "%s: insn 0x%04x fpop 0x%2x\n", __func__, insn, fpop);
34
g_assert_not_reached();
35
}
41
}
36
42
43
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_gpio_ops, s,
44
- TYPE_ASPEED_GPIO, GPIO_MAX_MEM_SIZE);
45
+ TYPE_ASPEED_GPIO, 0x800);
46
47
sysbus_init_mmio(sbd, &s->iomem);
48
}
37
--
49
--
38
2.20.1
50
2.20.1
39
51
40
52
diff view generated by jsdifflib