1
Changes v1->v2: it turns out that the raspi3 support exposes a
1
The following changes since commit e670f6d825d4dee248b311197fd4048469d6772b:
2
preexisting bug in our register definitions for VMPIDR/VMIDR:
3
https://lists.gnu.org/archive/html/qemu-devel/2018-02/msg04181.html
4
2
5
So I've dropped the final "enable raspi3 board" patch for the
3
Merge remote-tracking branch 'remotes/legoater/tags/pull-ppc-20220218' into staging (2022-02-20 15:05:41 +0000)
6
moment. When that VMIDR/VMPIDR patch gets reviewed we can
7
put the raspi3 patch in with it.
8
9
10
thanks
11
-- PMM
12
13
The following changes since commit f003d07337a6d4d02c43429b26a4270459afb51a:
14
15
Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2018-02-15 15:45:33 +0000)
16
4
17
are available in the Git repository at:
5
are available in the Git repository at:
18
6
19
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180215-1
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220221
20
8
21
for you to fetch changes up to bade58166f4466546600d824a2695a00269d10eb:
9
for you to fetch changes up to d6333e2543fa41aed4d33f77c808168373e39bff:
22
10
23
raspi: Raspberry Pi 3 support (2018-02-15 18:33:46 +0000)
11
ui/cocoa: Fix the leak of qemu_console_get_label (2022-02-21 09:12:18 +0000)
24
12
25
----------------------------------------------------------------
13
----------------------------------------------------------------
26
target-arm queue:
14
arm, cocoa and misc:
27
* aspeed: code cleanup to use unimplemented_device
15
* MAINTAINERS file updates
28
* preparatory work for 'raspi3' RaspberryPi 3 machine model
16
* Mark remaining global TypeInfo instances as const
29
* more SVE prep work
17
* checkpatch: Ensure that TypeInfos are const
30
* v8M: add minor missing registers
18
* tests/qtest: add qtests for npcm7xx sdhci
31
* v7M: fix bug where we weren't migrating v7m.other_sp
19
* arm hvf: Handle unknown ID registers as RES0
32
* v7M: fix bugs in handling of interrupt registers for
20
* Make KVM -cpu max exactly like -cpu host
33
external interrupts beyond 32
21
* Fix '-cpu max' for HVF
22
* Support PAuth extension for hvf
23
* Kconfig: Add I2C_DEVICES device group
24
* Kconfig: Add 'imply I2C_DEVICES' on boards with available i2c bus
25
* hw/arm/armv7m: Handle disconnected clock inputs
26
* osdep.h: pull out various things into new header files
27
* hw/timer: fix a9gtimer vmstate
28
* hw/arm: add initial mori-bmc board
29
* ui/cocoa: Remove allowedFileTypes restriction in SavePanel
30
* ui/cocoa: Do not alert even without block devices
31
* ui/cocoa: Fix the leak of qemu_console_get_label
34
32
35
----------------------------------------------------------------
33
----------------------------------------------------------------
36
Pekka Enberg (2):
34
Akihiko Odaki (3):
37
bcm2836: Make CPU type configurable
35
MAINTAINERS: Add Akihiko Odaki to macOS-relateds
38
raspi: Raspberry Pi 3 support
36
ui/cocoa: Do not alert even without block devices
37
ui/cocoa: Fix the leak of qemu_console_get_label
39
38
40
Peter Maydell (11):
39
Alexander Graf (2):
41
hw/intc/armv7m_nvic: Don't hardcode M profile ID registers in NVIC
40
hvf: arm: Use macros for sysreg shift/masking
42
hw/intc/armv7m_nvic: Fix ICSR PENDNMISET/CLR handling
41
hvf: arm: Handle unknown ID registers as RES0
43
hw/intc/armv7m_nvic: Implement M profile cache maintenance ops
44
hw/intc/armv7m_nvic: Implement v8M CPPWR register
45
hw/intc/armv7m_nvic: Implement cache ID registers
46
hw/intc/armv7m_nvic: Implement SCR
47
target/arm: Implement writing to CONTROL_NS for v8M
48
hw/intc/armv7m_nvic: Fix byte-to-interrupt number conversions
49
target/arm: Add AIRCR to vmstate struct
50
target/arm: Migrate v7m.other_sp
51
target/arm: Implement v8M MSPLIM and PSPLIM registers
52
42
53
Philippe Mathieu-Daudé (2):
43
Ani Sinha (1):
54
hw/arm/aspeed: directly map the serial device to the system address space
44
MAINTAINERS: Adding myself as a reviewer of some components
55
hw/arm/aspeed: simplify using the 'unimplemented device' for aspeed_soc.io
56
45
57
Richard Henderson (5):
46
Bernhard Beschow (2):
58
target/arm: Remove ARM_CP_64BIT from ZCR_EL registers
47
Mark remaining global TypeInfo instances as const
59
target/arm: Enforce FP access to FPCR/FPSR
48
checkpatch: Ensure that TypeInfos are const
60
target/arm: Suppress TB end for FPCR/FPSR
61
target/arm: Enforce access to ZCR_EL at translation
62
target/arm: Handle SVE registers when using clear_vec_high
63
49
64
include/hw/arm/aspeed_soc.h | 1 -
50
Patrick Venture (1):
65
include/hw/arm/bcm2836.h | 1 +
51
hw/arm: add initial mori-bmc board
66
target/arm/cpu.h | 71 ++++++++++++-----
67
target/arm/internals.h | 6 ++
68
hw/arm/aspeed_soc.c | 35 ++-------
69
hw/arm/bcm2836.c | 17 +++--
70
hw/arm/raspi.c | 34 ++++++---
71
hw/intc/armv7m_nvic.c | 98 ++++++++++++++++++------
72
target/arm/cpu.c | 28 +++++++
73
target/arm/helper.c | 84 +++++++++++++++-----
74
target/arm/machine.c | 84 ++++++++++++++++++++
75
target/arm/translate-a64.c | 181 ++++++++++++++++++++------------------------
76
12 files changed, 429 insertions(+), 211 deletions(-)
77
52
53
Pavel Dovgalyuk (1):
54
hw/timer: fix a9gtimer vmstate
55
56
Peter Maydell (14):
57
target/arm: Move '-cpu host' code to cpu64.c
58
target/arm: Use aarch64_cpu_register() for 'host' CPU type
59
target/arm: Make KVM -cpu max exactly like -cpu host
60
target/arm: Unindent unnecessary else-clause
61
target/arm: Fix '-cpu max' for HVF
62
target/arm: Support PAuth extension for hvf
63
Kconfig: Add I2C_DEVICES device group
64
Kconfig: Add 'imply I2C_DEVICES' on boards with available i2c bus
65
hw/arm/armv7m: Handle disconnected clock inputs
66
include: Move qemu_madvise() and related #defines to new qemu/madvise.h
67
include: Move qemu_mprotect_*() to new qemu/mprotect.h
68
include: Move QEMU_MAP_* constants to mmap-alloc.h
69
include: Move qemu_[id]cache_* declarations to new qemu/cacheinfo.h
70
include: Move hardware version declarations to new qemu/hw-version.h
71
72
Philippe Mathieu-Daudé (1):
73
ui/cocoa: Remove allowedFileTypes restriction in SavePanel
74
75
Shengtan Mao (1):
76
tests/qtest: add qtests for npcm7xx sdhci
77
78
docs/devel/kconfig.rst | 8 +-
79
docs/system/arm/nuvoton.rst | 1 +
80
include/qemu/cacheinfo.h | 21 +++
81
include/qemu/hw-version.h | 27 ++++
82
include/qemu/madvise.h | 95 +++++++++++
83
include/qemu/mmap-alloc.h | 23 +++
84
include/qemu/mprotect.h | 14 ++
85
include/qemu/osdep.h | 132 ----------------
86
accel/tcg/translate-all.c | 1 +
87
backends/hostmem-file.c | 1 +
88
backends/hostmem.c | 1 +
89
hw/arm/armv7m.c | 26 ++-
90
hw/arm/npcm7xx_boards.c | 32 ++++
91
hw/arm/nseries.c | 1 +
92
hw/core/generic-loader.c | 2 +-
93
hw/core/guest-loader.c | 2 +-
94
hw/display/bcm2835_fb.c | 2 +-
95
hw/display/i2c-ddc.c | 2 +-
96
hw/display/macfb.c | 4 +-
97
hw/display/virtio-vga.c | 2 +-
98
hw/dma/bcm2835_dma.c | 2 +-
99
hw/i386/pc_piix.c | 2 +-
100
hw/i386/sgx-epc.c | 2 +-
101
hw/ide/core.c | 1 +
102
hw/intc/bcm2835_ic.c | 2 +-
103
hw/intc/bcm2836_control.c | 2 +-
104
hw/ipmi/ipmi.c | 4 +-
105
hw/mem/nvdimm.c | 2 +-
106
hw/mem/pc-dimm.c | 2 +-
107
hw/misc/bcm2835_mbox.c | 2 +-
108
hw/misc/bcm2835_powermgt.c | 2 +-
109
hw/misc/bcm2835_property.c | 2 +-
110
hw/misc/bcm2835_rng.c | 2 +-
111
hw/misc/pvpanic-isa.c | 2 +-
112
hw/misc/pvpanic-pci.c | 2 +-
113
hw/net/fsl_etsec/etsec.c | 2 +-
114
hw/ppc/prep_systemio.c | 2 +-
115
hw/ppc/spapr_iommu.c | 2 +-
116
hw/s390x/s390-pci-bus.c | 2 +-
117
hw/s390x/sclp.c | 2 +-
118
hw/s390x/tod-kvm.c | 2 +-
119
hw/s390x/tod-tcg.c | 2 +-
120
hw/s390x/tod.c | 2 +-
121
hw/scsi/lsi53c895a.c | 2 +-
122
hw/scsi/megasas.c | 1 +
123
hw/scsi/scsi-bus.c | 1 +
124
hw/scsi/scsi-disk.c | 1 +
125
hw/sd/allwinner-sdhost.c | 2 +-
126
hw/sd/aspeed_sdhci.c | 2 +-
127
hw/sd/bcm2835_sdhost.c | 2 +-
128
hw/sd/cadence_sdhci.c | 2 +-
129
hw/sd/npcm7xx_sdhci.c | 2 +-
130
hw/timer/a9gtimer.c | 21 +++
131
hw/usb/dev-mtp.c | 2 +-
132
hw/usb/host-libusb.c | 2 +-
133
hw/vfio/igd.c | 2 +-
134
hw/virtio/virtio-balloon.c | 1 +
135
hw/virtio/virtio-pmem.c | 2 +-
136
migration/postcopy-ram.c | 1 +
137
migration/qemu-file.c | 1 +
138
migration/ram.c | 1 +
139
plugins/loader.c | 1 +
140
qom/object.c | 4 +-
141
softmmu/physmem.c | 1 +
142
softmmu/vl.c | 1 +
143
target/arm/cpu.c | 30 ----
144
target/arm/cpu64.c | 331 +++++++++++++++++++++------------------
145
target/arm/hvf/hvf.c | 83 +++++++---
146
target/i386/cpu.c | 1 +
147
target/s390x/cpu_models.c | 1 +
148
tcg/region.c | 3 +
149
tcg/tcg.c | 1 +
150
tests/qtest/npcm7xx_sdhci-test.c | 215 +++++++++++++++++++++++++
151
util/atomic64.c | 1 +
152
util/cacheflush.c | 1 +
153
util/cacheinfo.c | 1 +
154
util/osdep.c | 3 +
155
util/oslib-posix.c | 1 +
156
MAINTAINERS | 5 +
157
hw/arm/Kconfig | 10 ++
158
hw/i2c/Kconfig | 5 +
159
hw/rtc/Kconfig | 2 +
160
hw/sensor/Kconfig | 5 +
161
scripts/checkpatch.pl | 1 +
162
tests/qtest/meson.build | 1 +
163
ui/cocoa.m | 15 +-
164
86 files changed, 822 insertions(+), 393 deletions(-)
165
create mode 100644 include/qemu/cacheinfo.h
166
create mode 100644 include/qemu/hw-version.h
167
create mode 100644 include/qemu/madvise.h
168
create mode 100644 include/qemu/mprotect.h
169
create mode 100644 tests/qtest/npcm7xx_sdhci-test.c
170
diff view generated by jsdifflib
New patch
1
From: Ani Sinha <ani@anisinha.ca>
1
2
3
Added myself as a reviewer of vmgenid, unimplemented device and empty slot.
4
5
Signed-off-by: Ani Sinha <ani@anisinha.ca>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20220131122001.1476101-1-ani@anisinha.ca
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
MAINTAINERS | 3 +++
11
1 file changed, 3 insertions(+)
12
13
diff --git a/MAINTAINERS b/MAINTAINERS
14
index XXXXXXX..XXXXXXX 100644
15
--- a/MAINTAINERS
16
+++ b/MAINTAINERS
17
@@ -XXX,XX +XXX,XX @@ F: tests/qtest/prom-env-test.c
18
19
VM Generation ID
20
S: Orphan
21
+R: Ani Sinha <ani@anisinha.ca>
22
F: hw/acpi/vmgenid.c
23
F: include/hw/acpi/vmgenid.h
24
F: docs/specs/vmgenid.txt
25
@@ -XXX,XX +XXX,XX @@ F: hw/misc/led.c
26
Unimplemented device
27
M: Peter Maydell <peter.maydell@linaro.org>
28
R: Philippe Mathieu-Daudé <f4bug@amsat.org>
29
+R: Ani Sinha <ani@anisinha.ca>
30
S: Maintained
31
F: include/hw/misc/unimp.h
32
F: hw/misc/unimp.c
33
@@ -XXX,XX +XXX,XX @@ F: hw/misc/unimp.c
34
Empty slot
35
M: Artyom Tarasenko <atar4qemu@gmail.com>
36
R: Philippe Mathieu-Daudé <f4bug@amsat.org>
37
+R: Ani Sinha <ani@anisinha.ca>
38
S: Maintained
39
F: include/hw/misc/empty_slot.h
40
F: hw/misc/empty_slot.c
41
--
42
2.25.1
43
44
diff view generated by jsdifflib
New patch
1
1
From: Shengtan Mao <stmao@google.com>
2
3
Reviewed-by: Hao Wu <wuhaotsh@google.com>
4
Reviewed-by: Chris Rauer <crauer@google.com>
5
Signed-off-by: Shengtan Mao <stmao@google.com>
6
Signed-off-by: Patrick Venture <venture@google.com>
7
Message-id: 20220208181843.4003568-1-venture@google.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
tests/qtest/npcm7xx_sdhci-test.c | 215 +++++++++++++++++++++++++++++++
12
tests/qtest/meson.build | 1 +
13
2 files changed, 216 insertions(+)
14
create mode 100644 tests/qtest/npcm7xx_sdhci-test.c
15
16
diff --git a/tests/qtest/npcm7xx_sdhci-test.c b/tests/qtest/npcm7xx_sdhci-test.c
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/tests/qtest/npcm7xx_sdhci-test.c
21
@@ -XXX,XX +XXX,XX @@
22
+/*
23
+ * QTests for NPCM7xx SD-3.0 / MMC-4.51 Host Controller
24
+ *
25
+ * Copyright (c) 2022 Google LLC
26
+ *
27
+ * This program is free software; you can redistribute it and/or modify it
28
+ * under the terms of the GNU General Public License as published by the
29
+ * Free Software Foundation; either version 2 of the License, or
30
+ * (at your option) any later version.
31
+ *
32
+ * This program is distributed in the hope that it will be useful, but WITHOUT
33
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
34
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
35
+ * for more details.
36
+ */
37
+
38
+#include "qemu/osdep.h"
39
+#include "hw/sd/npcm7xx_sdhci.h"
40
+
41
+#include "libqos/libqtest.h"
42
+#include "libqtest-single.h"
43
+#include "libqos/sdhci-cmd.h"
44
+
45
+#define NPCM7XX_REG_SIZE 0x100
46
+#define NPCM7XX_MMC_BA 0xF0842000
47
+#define NPCM7XX_BLK_SIZE 512
48
+#define NPCM7XX_TEST_IMAGE_SIZE (1 << 30)
49
+
50
+char *sd_path;
51
+
52
+static QTestState *setup_sd_card(void)
53
+{
54
+ QTestState *qts = qtest_initf(
55
+ "-machine kudo-bmc "
56
+ "-device sd-card,drive=drive0 "
57
+ "-drive id=drive0,if=none,file=%s,format=raw,auto-read-only=off",
58
+ sd_path);
59
+
60
+ qtest_writew(qts, NPCM7XX_MMC_BA + SDHC_SWRST, SDHC_RESET_ALL);
61
+ qtest_writew(qts, NPCM7XX_MMC_BA + SDHC_CLKCON,
62
+ SDHC_CLOCK_SDCLK_EN | SDHC_CLOCK_INT_STABLE |
63
+ SDHC_CLOCK_INT_EN);
64
+ sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0, 0, SDHC_APP_CMD);
65
+ sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0x41200000, 0, (41 << 8));
66
+ sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0, 0, SDHC_ALL_SEND_CID);
67
+ sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0, 0, SDHC_SEND_RELATIVE_ADDR);
68
+ sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0x45670000, 0,
69
+ SDHC_SELECT_DESELECT_CARD);
70
+
71
+ return qts;
72
+}
73
+
74
+static void write_sdread(QTestState *qts, const char *msg)
75
+{
76
+ int fd, ret;
77
+ size_t len = strlen(msg);
78
+ char *rmsg = g_malloc(len);
79
+
80
+ /* write message to sd */
81
+ fd = open(sd_path, O_WRONLY);
82
+ g_assert(fd >= 0);
83
+ ret = write(fd, msg, len);
84
+ close(fd);
85
+ g_assert(ret == len);
86
+
87
+ /* read message using sdhci */
88
+ ret = sdhci_read_cmd(qts, NPCM7XX_MMC_BA, rmsg, len);
89
+ g_assert(ret == len);
90
+ g_assert(!strcmp(rmsg, msg));
91
+
92
+ g_free(rmsg);
93
+}
94
+
95
+/* Check MMC can read values from sd */
96
+static void test_read_sd(void)
97
+{
98
+ QTestState *qts = setup_sd_card();
99
+
100
+ write_sdread(qts, "hello world");
101
+ write_sdread(qts, "goodbye");
102
+
103
+ qtest_quit(qts);
104
+}
105
+
106
+static void sdwrite_read(QTestState *qts, const char *msg)
107
+{
108
+ int fd, ret;
109
+ size_t len = strlen(msg);
110
+ char *rmsg = g_malloc(len);
111
+
112
+ /* write message using sdhci */
113
+ sdhci_write_cmd(qts, NPCM7XX_MMC_BA, msg, len, NPCM7XX_BLK_SIZE);
114
+
115
+ /* read message from sd */
116
+ fd = open(sd_path, O_RDONLY);
117
+ g_assert(fd >= 0);
118
+ ret = read(fd, rmsg, len);
119
+ close(fd);
120
+ g_assert(ret == len);
121
+
122
+ g_assert(!strcmp(rmsg, msg));
123
+
124
+ g_free(rmsg);
125
+}
126
+
127
+/* Check MMC can write values to sd */
128
+static void test_write_sd(void)
129
+{
130
+ QTestState *qts = setup_sd_card();
131
+
132
+ sdwrite_read(qts, "hello world");
133
+ sdwrite_read(qts, "goodbye");
134
+
135
+ qtest_quit(qts);
136
+}
137
+
138
+/* Check SDHCI has correct default values. */
139
+static void test_reset(void)
140
+{
141
+ QTestState *qts = qtest_init("-machine kudo-bmc");
142
+ uint64_t addr = NPCM7XX_MMC_BA;
143
+ uint64_t end_addr = addr + NPCM7XX_REG_SIZE;
144
+ uint16_t prstvals_resets[] = {NPCM7XX_PRSTVALS_0_RESET,
145
+ NPCM7XX_PRSTVALS_1_RESET,
146
+ 0,
147
+ NPCM7XX_PRSTVALS_3_RESET,
148
+ 0,
149
+ 0};
150
+ int i;
151
+ uint32_t mask;
152
+
153
+ while (addr < end_addr) {
154
+ switch (addr - NPCM7XX_MMC_BA) {
155
+ case SDHC_PRNSTS:
156
+ /*
157
+ * ignores bits 20 to 24: they are changed when reading registers
158
+ */
159
+ mask = 0x1f00000;
160
+ g_assert_cmphex(qtest_readl(qts, addr) | mask, ==,
161
+ NPCM7XX_PRSNTS_RESET | mask);
162
+ addr += 4;
163
+ break;
164
+ case SDHC_BLKGAP:
165
+ g_assert_cmphex(qtest_readb(qts, addr), ==, NPCM7XX_BLKGAP_RESET);
166
+ addr += 1;
167
+ break;
168
+ case SDHC_CAPAB:
169
+ g_assert_cmphex(qtest_readq(qts, addr), ==, NPCM7XX_CAPAB_RESET);
170
+ addr += 8;
171
+ break;
172
+ case SDHC_MAXCURR:
173
+ g_assert_cmphex(qtest_readq(qts, addr), ==, NPCM7XX_MAXCURR_RESET);
174
+ addr += 8;
175
+ break;
176
+ case SDHC_HCVER:
177
+ g_assert_cmphex(qtest_readw(qts, addr), ==, NPCM7XX_HCVER_RESET);
178
+ addr += 2;
179
+ break;
180
+ case NPCM7XX_PRSTVALS:
181
+ for (i = 0; i < NPCM7XX_PRSTVALS_SIZE; ++i) {
182
+ g_assert_cmphex(qtest_readw(qts, addr + 2 * i), ==,
183
+ prstvals_resets[i]);
184
+ }
185
+ addr += NPCM7XX_PRSTVALS_SIZE * 2;
186
+ break;
187
+ default:
188
+ g_assert_cmphex(qtest_readb(qts, addr), ==, 0);
189
+ addr += 1;
190
+ }
191
+ }
192
+
193
+ qtest_quit(qts);
194
+}
195
+
196
+static void drive_destroy(void)
197
+{
198
+ unlink(sd_path);
199
+ g_free(sd_path);
200
+}
201
+
202
+static void drive_create(void)
203
+{
204
+ int fd, ret;
205
+ GError *error = NULL;
206
+
207
+ /* Create a temporary raw image */
208
+ fd = g_file_open_tmp("sdhci_XXXXXX", &sd_path, &error);
209
+ if (fd == -1) {
210
+ fprintf(stderr, "unable to create sdhci file: %s\n", error->message);
211
+ g_error_free(error);
212
+ }
213
+ g_assert(sd_path != NULL);
214
+
215
+ ret = ftruncate(fd, NPCM7XX_TEST_IMAGE_SIZE);
216
+ g_assert_cmpint(ret, ==, 0);
217
+ g_message("%s", sd_path);
218
+ close(fd);
219
+}
220
+
221
+int main(int argc, char **argv)
222
+{
223
+ int ret;
224
+
225
+ drive_create();
226
+
227
+ g_test_init(&argc, &argv, NULL);
228
+
229
+ qtest_add_func("npcm7xx_sdhci/reset", test_reset);
230
+ qtest_add_func("npcm7xx_sdhci/write_sd", test_write_sd);
231
+ qtest_add_func("npcm7xx_sdhci/read_sd", test_read_sd);
232
+
233
+ ret = g_test_run();
234
+ drive_destroy();
235
+ return ret;
236
+}
237
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
238
index XXXXXXX..XXXXXXX 100644
239
--- a/tests/qtest/meson.build
240
+++ b/tests/qtest/meson.build
241
@@ -XXX,XX +XXX,XX @@ qtests_npcm7xx = \
242
'npcm7xx_gpio-test',
243
'npcm7xx_pwm-test',
244
'npcm7xx_rng-test',
245
+ 'npcm7xx_sdhci-test',
246
'npcm7xx_smbus-test',
247
'npcm7xx_timer-test',
248
'npcm7xx_watchdog_timer-test'] + \
249
--
250
2.25.1
251
252
diff view generated by jsdifflib
New patch
1
From: Alexander Graf <agraf@csgraf.de>
1
2
3
We are parsing the syndrome field for sysregs in multiple places across
4
the hvf code, but repeat shift/mask operations with hard coded constants
5
every time. This is an error prone approach and makes it harder to reason
6
about the correctness of these operations.
7
8
Let's introduce macros that allow us to unify the constants used as well
9
as create new helpers to extract fields from the sysreg value.
10
11
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Alexander Graf <agraf@csgraf.de>
13
Reviewed-by: Cameron Esfahani <dirty@apple.com <mailto:dirty@apple.com>>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20220209124135.69183-1-agraf@csgraf.de
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
target/arm/hvf/hvf.c | 69 ++++++++++++++++++++++++++++++--------------
19
1 file changed, 47 insertions(+), 22 deletions(-)
20
21
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/hvf/hvf.c
24
+++ b/target/arm/hvf/hvf.c
25
@@ -XXX,XX +XXX,XX @@
26
ENCODE_AA64_CP_REG(CP_REG_ARM64_SYSREG_CP, crn, crm, op0, op1, op2)
27
#define PL1_WRITE_MASK 0x4
28
29
+#define SYSREG_OP0_SHIFT 20
30
+#define SYSREG_OP0_MASK 0x3
31
+#define SYSREG_OP0(sysreg) ((sysreg >> SYSREG_OP0_SHIFT) & SYSREG_OP0_MASK)
32
+#define SYSREG_OP1_SHIFT 14
33
+#define SYSREG_OP1_MASK 0x7
34
+#define SYSREG_OP1(sysreg) ((sysreg >> SYSREG_OP1_SHIFT) & SYSREG_OP1_MASK)
35
+#define SYSREG_CRN_SHIFT 10
36
+#define SYSREG_CRN_MASK 0xf
37
+#define SYSREG_CRN(sysreg) ((sysreg >> SYSREG_CRN_SHIFT) & SYSREG_CRN_MASK)
38
+#define SYSREG_CRM_SHIFT 1
39
+#define SYSREG_CRM_MASK 0xf
40
+#define SYSREG_CRM(sysreg) ((sysreg >> SYSREG_CRM_SHIFT) & SYSREG_CRM_MASK)
41
+#define SYSREG_OP2_SHIFT 17
42
+#define SYSREG_OP2_MASK 0x7
43
+#define SYSREG_OP2(sysreg) ((sysreg >> SYSREG_OP2_SHIFT) & SYSREG_OP2_MASK)
44
+
45
#define SYSREG(op0, op1, crn, crm, op2) \
46
- ((op0 << 20) | (op2 << 17) | (op1 << 14) | (crn << 10) | (crm << 1))
47
-#define SYSREG_MASK SYSREG(0x3, 0x7, 0xf, 0xf, 0x7)
48
+ ((op0 << SYSREG_OP0_SHIFT) | \
49
+ (op1 << SYSREG_OP1_SHIFT) | \
50
+ (crn << SYSREG_CRN_SHIFT) | \
51
+ (crm << SYSREG_CRM_SHIFT) | \
52
+ (op2 << SYSREG_OP2_SHIFT))
53
+#define SYSREG_MASK \
54
+ SYSREG(SYSREG_OP0_MASK, \
55
+ SYSREG_OP1_MASK, \
56
+ SYSREG_CRN_MASK, \
57
+ SYSREG_CRM_MASK, \
58
+ SYSREG_OP2_MASK)
59
#define SYSREG_OSLAR_EL1 SYSREG(2, 0, 1, 0, 4)
60
#define SYSREG_OSLSR_EL1 SYSREG(2, 0, 1, 1, 4)
61
#define SYSREG_OSDLR_EL1 SYSREG(2, 0, 1, 3, 4)
62
@@ -XXX,XX +XXX,XX @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint32_t rt)
63
default:
64
cpu_synchronize_state(cpu);
65
trace_hvf_unhandled_sysreg_read(env->pc, reg,
66
- (reg >> 20) & 0x3,
67
- (reg >> 14) & 0x7,
68
- (reg >> 10) & 0xf,
69
- (reg >> 1) & 0xf,
70
- (reg >> 17) & 0x7);
71
+ SYSREG_OP0(reg),
72
+ SYSREG_OP1(reg),
73
+ SYSREG_CRN(reg),
74
+ SYSREG_CRM(reg),
75
+ SYSREG_OP2(reg));
76
hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized());
77
return 1;
78
}
79
80
trace_hvf_sysreg_read(reg,
81
- (reg >> 20) & 0x3,
82
- (reg >> 14) & 0x7,
83
- (reg >> 10) & 0xf,
84
- (reg >> 1) & 0xf,
85
- (reg >> 17) & 0x7,
86
+ SYSREG_OP0(reg),
87
+ SYSREG_OP1(reg),
88
+ SYSREG_CRN(reg),
89
+ SYSREG_CRM(reg),
90
+ SYSREG_OP2(reg),
91
val);
92
hvf_set_reg(cpu, rt, val);
93
94
@@ -XXX,XX +XXX,XX @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val)
95
CPUARMState *env = &arm_cpu->env;
96
97
trace_hvf_sysreg_write(reg,
98
- (reg >> 20) & 0x3,
99
- (reg >> 14) & 0x7,
100
- (reg >> 10) & 0xf,
101
- (reg >> 1) & 0xf,
102
- (reg >> 17) & 0x7,
103
+ SYSREG_OP0(reg),
104
+ SYSREG_OP1(reg),
105
+ SYSREG_CRN(reg),
106
+ SYSREG_CRM(reg),
107
+ SYSREG_OP2(reg),
108
val);
109
110
switch (reg) {
111
@@ -XXX,XX +XXX,XX @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val)
112
default:
113
cpu_synchronize_state(cpu);
114
trace_hvf_unhandled_sysreg_write(env->pc, reg,
115
- (reg >> 20) & 0x3,
116
- (reg >> 14) & 0x7,
117
- (reg >> 10) & 0xf,
118
- (reg >> 1) & 0xf,
119
- (reg >> 17) & 0x7);
120
+ SYSREG_OP0(reg),
121
+ SYSREG_OP1(reg),
122
+ SYSREG_CRN(reg),
123
+ SYSREG_CRM(reg),
124
+ SYSREG_OP2(reg));
125
hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized());
126
return 1;
127
}
128
--
129
2.25.1
130
131
diff view generated by jsdifflib
1
From: Pekka Enberg <penberg@iki.fi>
1
From: Alexander Graf <agraf@csgraf.de>
2
2
3
This patch adds Raspberry Pi 3 support to hw/arm/raspi.c. The
3
Recent Linux versions added support to read ID_AA64ISAR2_EL1. On M1,
4
differences to Pi 2 are:
4
those reads trap into QEMU which handles them as faults.
5
5
6
- Firmware address
6
However, AArch64 ID registers should always read as RES0. Let's
7
- Board ID
7
handle them accordingly.
8
- Board revision
9
8
10
The CPU is different too, but that's going to be configured as part of
9
This fixes booting Linux 5.17 guests.
11
the machine default CPU when we introduce a new machine type.
12
10
13
The patch was written from scratch by me but the logic is similar to
11
Cc: qemu-stable@nongnu.org
14
Zoltán Baldaszti's previous work, which I used as a reference (with
12
Reported-by: Ivan Babrou <ivan@cloudflare.com>
15
permission from the author):
13
Signed-off-by: Alexander Graf <agraf@csgraf.de>
16
14
Message-id: 20220209124135.69183-2-agraf@csgraf.de
17
https://github.com/bztsrc/qemu-raspi3
18
19
Signed-off-by: Pekka Enberg <penberg@iki.fi>
20
[PMM: fixed trailing whitespace on one line]
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
---
17
---
24
hw/arm/raspi.c | 31 +++++++++++++++++++++----------
18
target/arm/hvf/hvf.c | 14 ++++++++++++++
25
1 file changed, 21 insertions(+), 10 deletions(-)
19
1 file changed, 14 insertions(+)
26
20
27
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
21
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
28
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/raspi.c
23
--- a/target/arm/hvf/hvf.c
30
+++ b/hw/arm/raspi.c
24
+++ b/target/arm/hvf/hvf.c
31
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@ static bool hvf_handle_psci_call(CPUState *cpu)
32
* Rasperry Pi 2 emulation Copyright (c) 2015, Microsoft
26
return true;
33
* Written by Andrew Baumann
34
*
35
+ * Raspberry Pi 3 emulation Copyright (c) 2018 Zoltán Baldaszti
36
+ * Upstream code cleanup (c) 2018 Pekka Enberg
37
+ *
38
* This code is licensed under the GNU GPLv2 and later.
39
*/
40
41
@@ -XXX,XX +XXX,XX @@
42
#define SMPBOOT_ADDR 0x300 /* this should leave enough space for ATAGS */
43
#define MVBAR_ADDR 0x400 /* secure vectors */
44
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
45
-#define FIRMWARE_ADDR 0x8000 /* Pi loads kernel.img here by default */
46
+#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
47
+#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
48
49
/* Table of Linux board IDs for different Pi versions */
50
-static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43};
51
+static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
52
53
typedef struct RasPiState {
54
BCM2836State soc;
55
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
56
binfo.secure_board_setup = true;
57
binfo.secure_boot = true;
58
59
- /* Pi2 requires SMP setup */
60
- if (version == 2) {
61
+ /* Pi2 and Pi3 requires SMP setup */
62
+ if (version >= 2) {
63
binfo.smp_loader_start = SMPBOOT_ADDR;
64
binfo.write_secondary_boot = write_smpboot;
65
binfo.secondary_cpu_reset_hook = reset_secondary;
66
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
67
* the normal Linux boot process
68
*/
69
if (machine->firmware) {
70
+ hwaddr firmware_addr = version == 3 ? FIRMWARE_ADDR_3 : FIRMWARE_ADDR_2;
71
/* load the firmware image (typically kernel.img) */
72
- r = load_image_targphys(machine->firmware, FIRMWARE_ADDR,
73
- ram_size - FIRMWARE_ADDR);
74
+ r = load_image_targphys(machine->firmware, firmware_addr,
75
+ ram_size - firmware_addr);
76
if (r < 0) {
77
error_report("Failed to load firmware from %s", machine->firmware);
78
exit(1);
79
}
80
81
- binfo.entry = FIRMWARE_ADDR;
82
+ binfo.entry = firmware_addr;
83
binfo.firmware_loaded = true;
84
} else {
85
binfo.kernel_filename = machine->kernel_filename;
86
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
87
arm_load_kernel(ARM_CPU(first_cpu), &binfo);
88
}
27
}
89
28
90
-static void raspi2_init(MachineState *machine)
29
+static bool is_id_sysreg(uint32_t reg)
91
+static void raspi_init(MachineState *machine, int version)
30
+{
92
{
31
+ return SYSREG_OP0(reg) == 3 &&
93
RasPiState *s = g_new0(RasPiState, 1);
32
+ SYSREG_OP1(reg) == 0 &&
94
uint32_t vcram_size;
33
+ SYSREG_CRN(reg) == 0 &&
95
@@ -XXX,XX +XXX,XX @@ static void raspi2_init(MachineState *machine)
34
+ SYSREG_CRM(reg) >= 1 &&
96
&error_abort);
35
+ SYSREG_CRM(reg) < 8;
97
object_property_set_int(OBJECT(&s->soc), smp_cpus, "enabled-cpus",
98
&error_abort);
99
- object_property_set_int(OBJECT(&s->soc), 0xa21041, "board-rev",
100
+ int board_rev = version == 3 ? 0xa02082 : 0xa21041;
101
+ object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
102
&error_abort);
103
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_abort);
104
105
@@ -XXX,XX +XXX,XX @@ static void raspi2_init(MachineState *machine)
106
107
vcram_size = object_property_get_uint(OBJECT(&s->soc), "vcram-size",
108
&error_abort);
109
- setup_boot(machine, 2, machine->ram_size - vcram_size);
110
+ setup_boot(machine, version, machine->ram_size - vcram_size);
111
+}
36
+}
112
+
37
+
113
+static void raspi2_init(MachineState *machine)
38
static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint32_t rt)
114
+{
39
{
115
+ raspi_init(machine, 2);
40
ARMCPU *arm_cpu = ARM_CPU(cpu);
116
}
41
@@ -XXX,XX +XXX,XX @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint32_t rt)
117
42
/* Dummy register */
118
static void raspi2_machine_init(MachineClass *mc)
43
break;
44
default:
45
+ if (is_id_sysreg(reg)) {
46
+ /* ID system registers read as RES0 */
47
+ val = 0;
48
+ break;
49
+ }
50
cpu_synchronize_state(cpu);
51
trace_hvf_unhandled_sysreg_read(env->pc, reg,
52
SYSREG_OP0(reg),
119
--
53
--
120
2.16.1
54
2.25.1
121
55
122
56
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Bernhard Beschow <shentey@gmail.com>
2
2
3
Because they are ARM_CP_STATE_AA64, ARM_CP_64BIT is implied.
3
More than 1k of TypeInfo instances are already marked as const. Mark the
4
remaining ones, too.
4
5
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
This commit was created with:
6
Message-id: 20180211205848.4568-2-richard.henderson@linaro.org
7
git grep -z -l 'static TypeInfo' -- '*.c' | \
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
xargs -0 sed -i 's/static TypeInfo/static const TypeInfo/'
9
10
Signed-off-by: Bernhard Beschow <shentey@gmail.com>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Thomas Huth <thuth@redhat.com>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
15
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
16
Acked-by: Corey Minyard <cminyard@mvista.com>
17
Message-id: 20220117145805.173070-2-shentey@gmail.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
19
---
10
target/arm/helper.c | 8 ++++----
20
hw/core/generic-loader.c | 2 +-
11
1 file changed, 4 insertions(+), 4 deletions(-)
21
hw/core/guest-loader.c | 2 +-
22
hw/display/bcm2835_fb.c | 2 +-
23
hw/display/i2c-ddc.c | 2 +-
24
hw/display/macfb.c | 4 ++--
25
hw/display/virtio-vga.c | 2 +-
26
hw/dma/bcm2835_dma.c | 2 +-
27
hw/i386/pc_piix.c | 2 +-
28
hw/i386/sgx-epc.c | 2 +-
29
hw/intc/bcm2835_ic.c | 2 +-
30
hw/intc/bcm2836_control.c | 2 +-
31
hw/ipmi/ipmi.c | 4 ++--
32
hw/mem/nvdimm.c | 2 +-
33
hw/mem/pc-dimm.c | 2 +-
34
hw/misc/bcm2835_mbox.c | 2 +-
35
hw/misc/bcm2835_powermgt.c | 2 +-
36
hw/misc/bcm2835_property.c | 2 +-
37
hw/misc/bcm2835_rng.c | 2 +-
38
hw/misc/pvpanic-isa.c | 2 +-
39
hw/misc/pvpanic-pci.c | 2 +-
40
hw/net/fsl_etsec/etsec.c | 2 +-
41
hw/ppc/prep_systemio.c | 2 +-
42
hw/ppc/spapr_iommu.c | 2 +-
43
hw/s390x/s390-pci-bus.c | 2 +-
44
hw/s390x/sclp.c | 2 +-
45
hw/s390x/tod-kvm.c | 2 +-
46
hw/s390x/tod-tcg.c | 2 +-
47
hw/s390x/tod.c | 2 +-
48
hw/scsi/lsi53c895a.c | 2 +-
49
hw/sd/allwinner-sdhost.c | 2 +-
50
hw/sd/aspeed_sdhci.c | 2 +-
51
hw/sd/bcm2835_sdhost.c | 2 +-
52
hw/sd/cadence_sdhci.c | 2 +-
53
hw/sd/npcm7xx_sdhci.c | 2 +-
54
hw/usb/dev-mtp.c | 2 +-
55
hw/usb/host-libusb.c | 2 +-
56
hw/vfio/igd.c | 2 +-
57
hw/virtio/virtio-pmem.c | 2 +-
58
qom/object.c | 4 ++--
59
39 files changed, 42 insertions(+), 42 deletions(-)
12
60
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
61
diff --git a/hw/core/generic-loader.c b/hw/core/generic-loader.c
14
index XXXXXXX..XXXXXXX 100644
62
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
63
--- a/hw/core/generic-loader.c
16
+++ b/target/arm/helper.c
64
+++ b/hw/core/generic-loader.c
17
@@ -XXX,XX +XXX,XX @@ static void zcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
65
@@ -XXX,XX +XXX,XX @@ static void generic_loader_class_init(ObjectClass *klass, void *data)
18
static const ARMCPRegInfo zcr_el1_reginfo = {
66
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
19
.name = "ZCR_EL1", .state = ARM_CP_STATE_AA64,
67
}
20
.opc0 = 3, .opc1 = 0, .crn = 1, .crm = 2, .opc2 = 0,
68
21
- .access = PL1_RW, .accessfn = zcr_access, .type = ARM_CP_64BIT,
69
-static TypeInfo generic_loader_info = {
22
+ .access = PL1_RW, .accessfn = zcr_access,
70
+static const TypeInfo generic_loader_info = {
23
.fieldoffset = offsetof(CPUARMState, vfp.zcr_el[1]),
71
.name = TYPE_GENERIC_LOADER,
24
.writefn = zcr_write, .raw_writefn = raw_write
72
.parent = TYPE_DEVICE,
73
.instance_size = sizeof(GenericLoaderState),
74
diff --git a/hw/core/guest-loader.c b/hw/core/guest-loader.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/hw/core/guest-loader.c
77
+++ b/hw/core/guest-loader.c
78
@@ -XXX,XX +XXX,XX @@ static void guest_loader_class_init(ObjectClass *klass, void *data)
79
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
80
}
81
82
-static TypeInfo guest_loader_info = {
83
+static const TypeInfo guest_loader_info = {
84
.name = TYPE_GUEST_LOADER,
85
.parent = TYPE_DEVICE,
86
.instance_size = sizeof(GuestLoaderState),
87
diff --git a/hw/display/bcm2835_fb.c b/hw/display/bcm2835_fb.c
88
index XXXXXXX..XXXXXXX 100644
89
--- a/hw/display/bcm2835_fb.c
90
+++ b/hw/display/bcm2835_fb.c
91
@@ -XXX,XX +XXX,XX @@ static void bcm2835_fb_class_init(ObjectClass *klass, void *data)
92
dc->vmsd = &vmstate_bcm2835_fb;
93
}
94
95
-static TypeInfo bcm2835_fb_info = {
96
+static const TypeInfo bcm2835_fb_info = {
97
.name = TYPE_BCM2835_FB,
98
.parent = TYPE_SYS_BUS_DEVICE,
99
.instance_size = sizeof(BCM2835FBState),
100
diff --git a/hw/display/i2c-ddc.c b/hw/display/i2c-ddc.c
101
index XXXXXXX..XXXXXXX 100644
102
--- a/hw/display/i2c-ddc.c
103
+++ b/hw/display/i2c-ddc.c
104
@@ -XXX,XX +XXX,XX @@ static void i2c_ddc_class_init(ObjectClass *oc, void *data)
105
isc->send = i2c_ddc_tx;
106
}
107
108
-static TypeInfo i2c_ddc_info = {
109
+static const TypeInfo i2c_ddc_info = {
110
.name = TYPE_I2CDDC,
111
.parent = TYPE_I2C_SLAVE,
112
.instance_size = sizeof(I2CDDCState),
113
diff --git a/hw/display/macfb.c b/hw/display/macfb.c
114
index XXXXXXX..XXXXXXX 100644
115
--- a/hw/display/macfb.c
116
+++ b/hw/display/macfb.c
117
@@ -XXX,XX +XXX,XX @@ static void macfb_nubus_class_init(ObjectClass *klass, void *data)
118
device_class_set_props(dc, macfb_nubus_properties);
119
}
120
121
-static TypeInfo macfb_sysbus_info = {
122
+static const TypeInfo macfb_sysbus_info = {
123
.name = TYPE_MACFB,
124
.parent = TYPE_SYS_BUS_DEVICE,
125
.instance_size = sizeof(MacfbSysBusState),
126
.class_init = macfb_sysbus_class_init,
25
};
127
};
26
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo zcr_el1_reginfo = {
128
27
static const ARMCPRegInfo zcr_el2_reginfo = {
129
-static TypeInfo macfb_nubus_info = {
28
.name = "ZCR_EL2", .state = ARM_CP_STATE_AA64,
130
+static const TypeInfo macfb_nubus_info = {
29
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 2, .opc2 = 0,
131
.name = TYPE_NUBUS_MACFB,
30
- .access = PL2_RW, .accessfn = zcr_access, .type = ARM_CP_64BIT,
132
.parent = TYPE_NUBUS_DEVICE,
31
+ .access = PL2_RW, .accessfn = zcr_access,
133
.instance_size = sizeof(MacfbNubusState),
32
.fieldoffset = offsetof(CPUARMState, vfp.zcr_el[2]),
134
diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
33
.writefn = zcr_write, .raw_writefn = raw_write
135
index XXXXXXX..XXXXXXX 100644
136
--- a/hw/display/virtio-vga.c
137
+++ b/hw/display/virtio-vga.c
138
@@ -XXX,XX +XXX,XX @@ static void virtio_vga_base_class_init(ObjectClass *klass, void *data)
139
virtio_vga_set_big_endian_fb);
140
}
141
142
-static TypeInfo virtio_vga_base_info = {
143
+static const TypeInfo virtio_vga_base_info = {
144
.name = TYPE_VIRTIO_VGA_BASE,
145
.parent = TYPE_VIRTIO_PCI,
146
.instance_size = sizeof(VirtIOVGABase),
147
diff --git a/hw/dma/bcm2835_dma.c b/hw/dma/bcm2835_dma.c
148
index XXXXXXX..XXXXXXX 100644
149
--- a/hw/dma/bcm2835_dma.c
150
+++ b/hw/dma/bcm2835_dma.c
151
@@ -XXX,XX +XXX,XX @@ static void bcm2835_dma_class_init(ObjectClass *klass, void *data)
152
dc->vmsd = &vmstate_bcm2835_dma;
153
}
154
155
-static TypeInfo bcm2835_dma_info = {
156
+static const TypeInfo bcm2835_dma_info = {
157
.name = TYPE_BCM2835_DMA,
158
.parent = TYPE_SYS_BUS_DEVICE,
159
.instance_size = sizeof(BCM2835DMAState),
160
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
161
index XXXXXXX..XXXXXXX 100644
162
--- a/hw/i386/pc_piix.c
163
+++ b/hw/i386/pc_piix.c
164
@@ -XXX,XX +XXX,XX @@ static void isa_bridge_class_init(ObjectClass *klass, void *data)
165
k->class_id = PCI_CLASS_BRIDGE_ISA;
34
};
166
};
35
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo zcr_el2_reginfo = {
167
36
static const ARMCPRegInfo zcr_no_el2_reginfo = {
168
-static TypeInfo isa_bridge_info = {
37
.name = "ZCR_EL2", .state = ARM_CP_STATE_AA64,
169
+static const TypeInfo isa_bridge_info = {
38
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 2, .opc2 = 0,
170
.name = "igd-passthrough-isa-bridge",
39
- .access = PL2_RW, .type = ARM_CP_64BIT,
171
.parent = TYPE_PCI_DEVICE,
40
+ .access = PL2_RW,
172
.instance_size = sizeof(PCIDevice),
41
.readfn = arm_cp_read_zero, .writefn = arm_cp_write_ignore
173
diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c
174
index XXXXXXX..XXXXXXX 100644
175
--- a/hw/i386/sgx-epc.c
176
+++ b/hw/i386/sgx-epc.c
177
@@ -XXX,XX +XXX,XX @@ static void sgx_epc_class_init(ObjectClass *oc, void *data)
178
mdc->fill_device_info = sgx_epc_md_fill_device_info;
179
}
180
181
-static TypeInfo sgx_epc_info = {
182
+static const TypeInfo sgx_epc_info = {
183
.name = TYPE_SGX_EPC,
184
.parent = TYPE_DEVICE,
185
.instance_size = sizeof(SGXEPCDevice),
186
diff --git a/hw/intc/bcm2835_ic.c b/hw/intc/bcm2835_ic.c
187
index XXXXXXX..XXXXXXX 100644
188
--- a/hw/intc/bcm2835_ic.c
189
+++ b/hw/intc/bcm2835_ic.c
190
@@ -XXX,XX +XXX,XX @@ static void bcm2835_ic_class_init(ObjectClass *klass, void *data)
191
dc->vmsd = &vmstate_bcm2835_ic;
192
}
193
194
-static TypeInfo bcm2835_ic_info = {
195
+static const TypeInfo bcm2835_ic_info = {
196
.name = TYPE_BCM2835_IC,
197
.parent = TYPE_SYS_BUS_DEVICE,
198
.instance_size = sizeof(BCM2835ICState),
199
diff --git a/hw/intc/bcm2836_control.c b/hw/intc/bcm2836_control.c
200
index XXXXXXX..XXXXXXX 100644
201
--- a/hw/intc/bcm2836_control.c
202
+++ b/hw/intc/bcm2836_control.c
203
@@ -XXX,XX +XXX,XX @@ static void bcm2836_control_class_init(ObjectClass *klass, void *data)
204
dc->vmsd = &vmstate_bcm2836_control;
205
}
206
207
-static TypeInfo bcm2836_control_info = {
208
+static const TypeInfo bcm2836_control_info = {
209
.name = TYPE_BCM2836_CONTROL,
210
.parent = TYPE_SYS_BUS_DEVICE,
211
.instance_size = sizeof(BCM2836ControlState),
212
diff --git a/hw/ipmi/ipmi.c b/hw/ipmi/ipmi.c
213
index XXXXXXX..XXXXXXX 100644
214
--- a/hw/ipmi/ipmi.c
215
+++ b/hw/ipmi/ipmi.c
216
@@ -XXX,XX +XXX,XX @@ static void ipmi_interface_class_init(ObjectClass *class, void *data)
217
ik->do_hw_op = ipmi_do_hw_op;
218
}
219
220
-static TypeInfo ipmi_interface_type_info = {
221
+static const TypeInfo ipmi_interface_type_info = {
222
.name = TYPE_IPMI_INTERFACE,
223
.parent = TYPE_INTERFACE,
224
.class_size = sizeof(IPMIInterfaceClass),
225
@@ -XXX,XX +XXX,XX @@ static void bmc_class_init(ObjectClass *oc, void *data)
226
device_class_set_props(dc, ipmi_bmc_properties);
227
}
228
229
-static TypeInfo ipmi_bmc_type_info = {
230
+static const TypeInfo ipmi_bmc_type_info = {
231
.name = TYPE_IPMI_BMC,
232
.parent = TYPE_DEVICE,
233
.instance_size = sizeof(IPMIBmc),
234
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
235
index XXXXXXX..XXXXXXX 100644
236
--- a/hw/mem/nvdimm.c
237
+++ b/hw/mem/nvdimm.c
238
@@ -XXX,XX +XXX,XX @@ static void nvdimm_class_init(ObjectClass *oc, void *data)
239
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
240
}
241
242
-static TypeInfo nvdimm_info = {
243
+static const TypeInfo nvdimm_info = {
244
.name = TYPE_NVDIMM,
245
.parent = TYPE_PC_DIMM,
246
.class_size = sizeof(NVDIMMClass),
247
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
248
index XXXXXXX..XXXXXXX 100644
249
--- a/hw/mem/pc-dimm.c
250
+++ b/hw/mem/pc-dimm.c
251
@@ -XXX,XX +XXX,XX @@ static void pc_dimm_class_init(ObjectClass *oc, void *data)
252
mdc->fill_device_info = pc_dimm_md_fill_device_info;
253
}
254
255
-static TypeInfo pc_dimm_info = {
256
+static const TypeInfo pc_dimm_info = {
257
.name = TYPE_PC_DIMM,
258
.parent = TYPE_DEVICE,
259
.instance_size = sizeof(PCDIMMDevice),
260
diff --git a/hw/misc/bcm2835_mbox.c b/hw/misc/bcm2835_mbox.c
261
index XXXXXXX..XXXXXXX 100644
262
--- a/hw/misc/bcm2835_mbox.c
263
+++ b/hw/misc/bcm2835_mbox.c
264
@@ -XXX,XX +XXX,XX @@ static void bcm2835_mbox_class_init(ObjectClass *klass, void *data)
265
dc->vmsd = &vmstate_bcm2835_mbox;
266
}
267
268
-static TypeInfo bcm2835_mbox_info = {
269
+static const TypeInfo bcm2835_mbox_info = {
270
.name = TYPE_BCM2835_MBOX,
271
.parent = TYPE_SYS_BUS_DEVICE,
272
.instance_size = sizeof(BCM2835MboxState),
273
diff --git a/hw/misc/bcm2835_powermgt.c b/hw/misc/bcm2835_powermgt.c
274
index XXXXXXX..XXXXXXX 100644
275
--- a/hw/misc/bcm2835_powermgt.c
276
+++ b/hw/misc/bcm2835_powermgt.c
277
@@ -XXX,XX +XXX,XX @@ static void bcm2835_powermgt_class_init(ObjectClass *klass, void *data)
278
dc->vmsd = &vmstate_bcm2835_powermgt;
279
}
280
281
-static TypeInfo bcm2835_powermgt_info = {
282
+static const TypeInfo bcm2835_powermgt_info = {
283
.name = TYPE_BCM2835_POWERMGT,
284
.parent = TYPE_SYS_BUS_DEVICE,
285
.instance_size = sizeof(BCM2835PowerMgtState),
286
diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c
287
index XXXXXXX..XXXXXXX 100644
288
--- a/hw/misc/bcm2835_property.c
289
+++ b/hw/misc/bcm2835_property.c
290
@@ -XXX,XX +XXX,XX @@ static void bcm2835_property_class_init(ObjectClass *klass, void *data)
291
dc->vmsd = &vmstate_bcm2835_property;
292
}
293
294
-static TypeInfo bcm2835_property_info = {
295
+static const TypeInfo bcm2835_property_info = {
296
.name = TYPE_BCM2835_PROPERTY,
297
.parent = TYPE_SYS_BUS_DEVICE,
298
.instance_size = sizeof(BCM2835PropertyState),
299
diff --git a/hw/misc/bcm2835_rng.c b/hw/misc/bcm2835_rng.c
300
index XXXXXXX..XXXXXXX 100644
301
--- a/hw/misc/bcm2835_rng.c
302
+++ b/hw/misc/bcm2835_rng.c
303
@@ -XXX,XX +XXX,XX @@ static void bcm2835_rng_class_init(ObjectClass *klass, void *data)
304
dc->vmsd = &vmstate_bcm2835_rng;
305
}
306
307
-static TypeInfo bcm2835_rng_info = {
308
+static const TypeInfo bcm2835_rng_info = {
309
.name = TYPE_BCM2835_RNG,
310
.parent = TYPE_SYS_BUS_DEVICE,
311
.instance_size = sizeof(BCM2835RngState),
312
diff --git a/hw/misc/pvpanic-isa.c b/hw/misc/pvpanic-isa.c
313
index XXXXXXX..XXXXXXX 100644
314
--- a/hw/misc/pvpanic-isa.c
315
+++ b/hw/misc/pvpanic-isa.c
316
@@ -XXX,XX +XXX,XX @@ static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
317
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
318
}
319
320
-static TypeInfo pvpanic_isa_info = {
321
+static const TypeInfo pvpanic_isa_info = {
322
.name = TYPE_PVPANIC_ISA_DEVICE,
323
.parent = TYPE_ISA_DEVICE,
324
.instance_size = sizeof(PVPanicISAState),
325
diff --git a/hw/misc/pvpanic-pci.c b/hw/misc/pvpanic-pci.c
326
index XXXXXXX..XXXXXXX 100644
327
--- a/hw/misc/pvpanic-pci.c
328
+++ b/hw/misc/pvpanic-pci.c
329
@@ -XXX,XX +XXX,XX @@ static void pvpanic_pci_class_init(ObjectClass *klass, void *data)
330
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
331
}
332
333
-static TypeInfo pvpanic_pci_info = {
334
+static const TypeInfo pvpanic_pci_info = {
335
.name = TYPE_PVPANIC_PCI_DEVICE,
336
.parent = TYPE_PCI_DEVICE,
337
.instance_size = sizeof(PVPanicPCIState),
338
diff --git a/hw/net/fsl_etsec/etsec.c b/hw/net/fsl_etsec/etsec.c
339
index XXXXXXX..XXXXXXX 100644
340
--- a/hw/net/fsl_etsec/etsec.c
341
+++ b/hw/net/fsl_etsec/etsec.c
342
@@ -XXX,XX +XXX,XX @@ static void etsec_class_init(ObjectClass *klass, void *data)
343
dc->user_creatable = true;
344
}
345
346
-static TypeInfo etsec_info = {
347
+static const TypeInfo etsec_info = {
348
.name = TYPE_ETSEC_COMMON,
349
.parent = TYPE_SYS_BUS_DEVICE,
350
.instance_size = sizeof(eTSEC),
351
diff --git a/hw/ppc/prep_systemio.c b/hw/ppc/prep_systemio.c
352
index XXXXXXX..XXXXXXX 100644
353
--- a/hw/ppc/prep_systemio.c
354
+++ b/hw/ppc/prep_systemio.c
355
@@ -XXX,XX +XXX,XX @@ static void prep_systemio_class_initfn(ObjectClass *klass, void *data)
356
device_class_set_props(dc, prep_systemio_properties);
357
}
358
359
-static TypeInfo prep_systemio800_info = {
360
+static const TypeInfo prep_systemio800_info = {
361
.name = TYPE_PREP_SYSTEMIO,
362
.parent = TYPE_ISA_DEVICE,
363
.instance_size = sizeof(PrepSystemIoState),
364
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
365
index XXXXXXX..XXXXXXX 100644
366
--- a/hw/ppc/spapr_iommu.c
367
+++ b/hw/ppc/spapr_iommu.c
368
@@ -XXX,XX +XXX,XX @@ static void spapr_tce_table_class_init(ObjectClass *klass, void *data)
369
spapr_register_hypercall(H_STUFF_TCE, h_stuff_tce);
370
}
371
372
-static TypeInfo spapr_tce_table_info = {
373
+static const TypeInfo spapr_tce_table_info = {
374
.name = TYPE_SPAPR_TCE_TABLE,
375
.parent = TYPE_DEVICE,
376
.instance_size = sizeof(SpaprTceTable),
377
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
378
index XXXXXXX..XXXXXXX 100644
379
--- a/hw/s390x/s390-pci-bus.c
380
+++ b/hw/s390x/s390-pci-bus.c
381
@@ -XXX,XX +XXX,XX @@ static const TypeInfo s390_pci_device_info = {
382
.class_init = s390_pci_device_class_init,
42
};
383
};
43
384
44
static const ARMCPRegInfo zcr_el3_reginfo = {
385
-static TypeInfo s390_pci_iommu_info = {
45
.name = "ZCR_EL3", .state = ARM_CP_STATE_AA64,
386
+static const TypeInfo s390_pci_iommu_info = {
46
.opc0 = 3, .opc1 = 6, .crn = 1, .crm = 2, .opc2 = 0,
387
.name = TYPE_S390_PCI_IOMMU,
47
- .access = PL3_RW, .accessfn = zcr_access, .type = ARM_CP_64BIT,
388
.parent = TYPE_OBJECT,
48
+ .access = PL3_RW, .accessfn = zcr_access,
389
.instance_size = sizeof(S390PCIIOMMU),
49
.fieldoffset = offsetof(CPUARMState, vfp.zcr_el[3]),
390
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
50
.writefn = zcr_write, .raw_writefn = raw_write
391
index XXXXXXX..XXXXXXX 100644
51
};
392
--- a/hw/s390x/sclp.c
393
+++ b/hw/s390x/sclp.c
394
@@ -XXX,XX +XXX,XX @@ static void sclp_class_init(ObjectClass *oc, void *data)
395
sc->service_interrupt = service_interrupt;
396
}
397
398
-static TypeInfo sclp_info = {
399
+static const TypeInfo sclp_info = {
400
.name = TYPE_SCLP,
401
.parent = TYPE_DEVICE,
402
.instance_init = sclp_init,
403
diff --git a/hw/s390x/tod-kvm.c b/hw/s390x/tod-kvm.c
404
index XXXXXXX..XXXXXXX 100644
405
--- a/hw/s390x/tod-kvm.c
406
+++ b/hw/s390x/tod-kvm.c
407
@@ -XXX,XX +XXX,XX @@ static void kvm_s390_tod_init(Object *obj)
408
td->stopped = false;
409
}
410
411
-static TypeInfo kvm_s390_tod_info = {
412
+static const TypeInfo kvm_s390_tod_info = {
413
.name = TYPE_KVM_S390_TOD,
414
.parent = TYPE_S390_TOD,
415
.instance_size = sizeof(S390TODState),
416
diff --git a/hw/s390x/tod-tcg.c b/hw/s390x/tod-tcg.c
417
index XXXXXXX..XXXXXXX 100644
418
--- a/hw/s390x/tod-tcg.c
419
+++ b/hw/s390x/tod-tcg.c
420
@@ -XXX,XX +XXX,XX @@ static void qemu_s390_tod_init(Object *obj)
421
}
422
}
423
424
-static TypeInfo qemu_s390_tod_info = {
425
+static const TypeInfo qemu_s390_tod_info = {
426
.name = TYPE_QEMU_S390_TOD,
427
.parent = TYPE_S390_TOD,
428
.instance_size = sizeof(S390TODState),
429
diff --git a/hw/s390x/tod.c b/hw/s390x/tod.c
430
index XXXXXXX..XXXXXXX 100644
431
--- a/hw/s390x/tod.c
432
+++ b/hw/s390x/tod.c
433
@@ -XXX,XX +XXX,XX @@ static void s390_tod_class_init(ObjectClass *oc, void *data)
434
dc->user_creatable = false;
435
}
436
437
-static TypeInfo s390_tod_info = {
438
+static const TypeInfo s390_tod_info = {
439
.name = TYPE_S390_TOD,
440
.parent = TYPE_DEVICE,
441
.instance_size = sizeof(S390TODState),
442
diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
443
index XXXXXXX..XXXXXXX 100644
444
--- a/hw/scsi/lsi53c895a.c
445
+++ b/hw/scsi/lsi53c895a.c
446
@@ -XXX,XX +XXX,XX @@ static void lsi53c810_class_init(ObjectClass *klass, void *data)
447
k->device_id = PCI_DEVICE_ID_LSI_53C810;
448
}
449
450
-static TypeInfo lsi53c810_info = {
451
+static const TypeInfo lsi53c810_info = {
452
.name = TYPE_LSI53C810,
453
.parent = TYPE_LSI53C895A,
454
.class_init = lsi53c810_class_init,
455
diff --git a/hw/sd/allwinner-sdhost.c b/hw/sd/allwinner-sdhost.c
456
index XXXXXXX..XXXXXXX 100644
457
--- a/hw/sd/allwinner-sdhost.c
458
+++ b/hw/sd/allwinner-sdhost.c
459
@@ -XXX,XX +XXX,XX @@ static void allwinner_sdhost_sun5i_class_init(ObjectClass *klass, void *data)
460
sc->max_desc_size = 64 * KiB;
461
}
462
463
-static TypeInfo allwinner_sdhost_info = {
464
+static const TypeInfo allwinner_sdhost_info = {
465
.name = TYPE_AW_SDHOST,
466
.parent = TYPE_SYS_BUS_DEVICE,
467
.instance_init = allwinner_sdhost_init,
468
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
469
index XXXXXXX..XXXXXXX 100644
470
--- a/hw/sd/aspeed_sdhci.c
471
+++ b/hw/sd/aspeed_sdhci.c
472
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_class_init(ObjectClass *classp, void *data)
473
device_class_set_props(dc, aspeed_sdhci_properties);
474
}
475
476
-static TypeInfo aspeed_sdhci_info = {
477
+static const TypeInfo aspeed_sdhci_info = {
478
.name = TYPE_ASPEED_SDHCI,
479
.parent = TYPE_SYS_BUS_DEVICE,
480
.instance_size = sizeof(AspeedSDHCIState),
481
diff --git a/hw/sd/bcm2835_sdhost.c b/hw/sd/bcm2835_sdhost.c
482
index XXXXXXX..XXXXXXX 100644
483
--- a/hw/sd/bcm2835_sdhost.c
484
+++ b/hw/sd/bcm2835_sdhost.c
485
@@ -XXX,XX +XXX,XX @@ static void bcm2835_sdhost_class_init(ObjectClass *klass, void *data)
486
dc->vmsd = &vmstate_bcm2835_sdhost;
487
}
488
489
-static TypeInfo bcm2835_sdhost_info = {
490
+static const TypeInfo bcm2835_sdhost_info = {
491
.name = TYPE_BCM2835_SDHOST,
492
.parent = TYPE_SYS_BUS_DEVICE,
493
.instance_size = sizeof(BCM2835SDHostState),
494
diff --git a/hw/sd/cadence_sdhci.c b/hw/sd/cadence_sdhci.c
495
index XXXXXXX..XXXXXXX 100644
496
--- a/hw/sd/cadence_sdhci.c
497
+++ b/hw/sd/cadence_sdhci.c
498
@@ -XXX,XX +XXX,XX @@ static void cadence_sdhci_class_init(ObjectClass *classp, void *data)
499
dc->vmsd = &vmstate_cadence_sdhci;
500
}
501
502
-static TypeInfo cadence_sdhci_info = {
503
+static const TypeInfo cadence_sdhci_info = {
504
.name = TYPE_CADENCE_SDHCI,
505
.parent = TYPE_SYS_BUS_DEVICE,
506
.instance_size = sizeof(CadenceSDHCIState),
507
diff --git a/hw/sd/npcm7xx_sdhci.c b/hw/sd/npcm7xx_sdhci.c
508
index XXXXXXX..XXXXXXX 100644
509
--- a/hw/sd/npcm7xx_sdhci.c
510
+++ b/hw/sd/npcm7xx_sdhci.c
511
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_sdhci_instance_init(Object *obj)
512
TYPE_SYSBUS_SDHCI);
513
}
514
515
-static TypeInfo npcm7xx_sdhci_info = {
516
+static const TypeInfo npcm7xx_sdhci_info = {
517
.name = TYPE_NPCM7XX_SDHCI,
518
.parent = TYPE_SYS_BUS_DEVICE,
519
.instance_size = sizeof(NPCM7xxSDHCIState),
520
diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c
521
index XXXXXXX..XXXXXXX 100644
522
--- a/hw/usb/dev-mtp.c
523
+++ b/hw/usb/dev-mtp.c
524
@@ -XXX,XX +XXX,XX @@ static void usb_mtp_class_initfn(ObjectClass *klass, void *data)
525
device_class_set_props(dc, mtp_properties);
526
}
527
528
-static TypeInfo mtp_info = {
529
+static const TypeInfo mtp_info = {
530
.name = TYPE_USB_MTP,
531
.parent = TYPE_USB_DEVICE,
532
.instance_size = sizeof(MTPState),
533
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
534
index XXXXXXX..XXXXXXX 100644
535
--- a/hw/usb/host-libusb.c
536
+++ b/hw/usb/host-libusb.c
537
@@ -XXX,XX +XXX,XX @@ static void usb_host_class_initfn(ObjectClass *klass, void *data)
538
set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
539
}
540
541
-static TypeInfo usb_host_dev_info = {
542
+static const TypeInfo usb_host_dev_info = {
543
.name = TYPE_USB_HOST_DEVICE,
544
.parent = TYPE_USB_DEVICE,
545
.instance_size = sizeof(USBHostDevice),
546
diff --git a/hw/vfio/igd.c b/hw/vfio/igd.c
547
index XXXXXXX..XXXXXXX 100644
548
--- a/hw/vfio/igd.c
549
+++ b/hw/vfio/igd.c
550
@@ -XXX,XX +XXX,XX @@ static void vfio_pci_igd_lpc_bridge_class_init(ObjectClass *klass, void *data)
551
k->class_id = PCI_CLASS_BRIDGE_ISA;
552
}
553
554
-static TypeInfo vfio_pci_igd_lpc_bridge_info = {
555
+static const TypeInfo vfio_pci_igd_lpc_bridge_info = {
556
.name = "vfio-pci-igd-lpc-bridge",
557
.parent = TYPE_PCI_DEVICE,
558
.class_init = vfio_pci_igd_lpc_bridge_class_init,
559
diff --git a/hw/virtio/virtio-pmem.c b/hw/virtio/virtio-pmem.c
560
index XXXXXXX..XXXXXXX 100644
561
--- a/hw/virtio/virtio-pmem.c
562
+++ b/hw/virtio/virtio-pmem.c
563
@@ -XXX,XX +XXX,XX @@ static void virtio_pmem_class_init(ObjectClass *klass, void *data)
564
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
565
}
566
567
-static TypeInfo virtio_pmem_info = {
568
+static const TypeInfo virtio_pmem_info = {
569
.name = TYPE_VIRTIO_PMEM,
570
.parent = TYPE_VIRTIO_DEVICE,
571
.class_size = sizeof(VirtIOPMEMClass),
572
diff --git a/qom/object.c b/qom/object.c
573
index XXXXXXX..XXXXXXX 100644
574
--- a/qom/object.c
575
+++ b/qom/object.c
576
@@ -XXX,XX +XXX,XX @@ static void object_class_init(ObjectClass *klass, void *data)
577
578
static void register_types(void)
579
{
580
- static TypeInfo interface_info = {
581
+ static const TypeInfo interface_info = {
582
.name = TYPE_INTERFACE,
583
.class_size = sizeof(InterfaceClass),
584
.abstract = true,
585
};
586
587
- static TypeInfo object_info = {
588
+ static const TypeInfo object_info = {
589
.name = TYPE_OBJECT,
590
.instance_size = sizeof(Object),
591
.class_init = object_class_init,
52
--
592
--
53
2.16.1
593
2.25.1
54
594
55
595
diff view generated by jsdifflib
New patch
1
From: Bernhard Beschow <shentey@gmail.com>
1
2
3
Now that all static TypeInfo instances are declared const, prevent that
4
new non-const instances are created.
5
6
Signed-off-by: Bernhard Beschow <shentey@gmail.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20220117145805.173070-3-shentey@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
scripts/checkpatch.pl | 1 +
12
1 file changed, 1 insertion(+)
13
14
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
15
index XXXXXXX..XXXXXXX 100755
16
--- a/scripts/checkpatch.pl
17
+++ b/scripts/checkpatch.pl
18
@@ -XXX,XX +XXX,XX @@ sub process {
19
                SCSIBusInfo|
20
                SCSIReqOps|
21
                Spice[A-Z][a-zA-Z0-9]*Interface|
22
+                TypeInfo|
23
                USBDesc[A-Z][a-zA-Z0-9]*|
24
                VhostOps|
25
                VMStateDescription|
26
--
27
2.25.1
28
29
diff view generated by jsdifflib
1
Instead of hardcoding the values of M profile ID registers in the
1
Now that KVM has dropped AArch32 host support, the 'host' CPU type is
2
NVIC, use the fields in the CPU struct. This will allow us to
2
always AArch64, and we can move it to cpu64.c. This move will allow
3
give different M profile CPU types different ID register values.
3
us to share code between it and '-cpu max', which should behave
4
4
the same as '-cpu host' when using KVM or HVF.
5
This commit includes the addition of the missing ID_ISAR5,
6
which exists as RES0 in both v7M and v8M.
7
8
(The values of the ID registers might be wrong for the M4 --
9
this commit leaves the behaviour there unchanged.)
10
5
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Andrew Jones <drjones@redhat.com>
9
Reviewed-by: Alexander Graf <agraf@csgraf.de>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20180209165810.6668-2-peter.maydell@linaro.org
11
Message-id: 20220204165506.2846058-2-peter.maydell@linaro.org
15
---
12
---
16
hw/intc/armv7m_nvic.c | 30 ++++++++++++++++--------------
13
target/arm/cpu.c | 30 ------------------------------
17
target/arm/cpu.c | 28 ++++++++++++++++++++++++++++
14
target/arm/cpu64.c | 30 ++++++++++++++++++++++++++++++
18
2 files changed, 44 insertions(+), 14 deletions(-)
15
2 files changed, 30 insertions(+), 30 deletions(-)
19
16
20
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/intc/armv7m_nvic.c
23
+++ b/hw/intc/armv7m_nvic.c
24
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
25
"Aux Fault status registers unimplemented\n");
26
return 0;
27
case 0xd40: /* PFR0. */
28
- return 0x00000030;
29
- case 0xd44: /* PRF1. */
30
- return 0x00000200;
31
+ return cpu->id_pfr0;
32
+ case 0xd44: /* PFR1. */
33
+ return cpu->id_pfr1;
34
case 0xd48: /* DFR0. */
35
- return 0x00100000;
36
+ return cpu->id_dfr0;
37
case 0xd4c: /* AFR0. */
38
- return 0x00000000;
39
+ return cpu->id_afr0;
40
case 0xd50: /* MMFR0. */
41
- return 0x00000030;
42
+ return cpu->id_mmfr0;
43
case 0xd54: /* MMFR1. */
44
- return 0x00000000;
45
+ return cpu->id_mmfr1;
46
case 0xd58: /* MMFR2. */
47
- return 0x00000000;
48
+ return cpu->id_mmfr2;
49
case 0xd5c: /* MMFR3. */
50
- return 0x00000000;
51
+ return cpu->id_mmfr3;
52
case 0xd60: /* ISAR0. */
53
- return 0x01141110;
54
+ return cpu->id_isar0;
55
case 0xd64: /* ISAR1. */
56
- return 0x02111000;
57
+ return cpu->id_isar1;
58
case 0xd68: /* ISAR2. */
59
- return 0x21112231;
60
+ return cpu->id_isar2;
61
case 0xd6c: /* ISAR3. */
62
- return 0x01111110;
63
+ return cpu->id_isar3;
64
case 0xd70: /* ISAR4. */
65
- return 0x01310102;
66
+ return cpu->id_isar4;
67
+ case 0xd74: /* ISAR5. */
68
+ return cpu->id_isar5;
69
/* TODO: Implement debug registers. */
70
case 0xd90: /* MPU_TYPE */
71
/* Unified MPU; if the MPU is not present this value is zero */
72
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
17
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
73
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
74
--- a/target/arm/cpu.c
19
--- a/target/arm/cpu.c
75
+++ b/target/arm/cpu.c
20
+++ b/target/arm/cpu.c
76
@@ -XXX,XX +XXX,XX @@ static void cortex_m3_initfn(Object *obj)
21
@@ -XXX,XX +XXX,XX @@
77
set_feature(&cpu->env, ARM_FEATURE_M);
22
#include "sysemu/tcg.h"
78
cpu->midr = 0x410fc231;
23
#include "sysemu/hw_accel.h"
79
cpu->pmsav7_dregion = 8;
24
#include "kvm_arm.h"
80
+ cpu->id_pfr0 = 0x00000030;
25
-#include "hvf_arm.h"
81
+ cpu->id_pfr1 = 0x00000200;
26
#include "disas/capstone.h"
82
+ cpu->id_dfr0 = 0x00100000;
27
#include "fpu/softfloat.h"
83
+ cpu->id_afr0 = 0x00000000;
28
84
+ cpu->id_mmfr0 = 0x00000030;
29
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
85
+ cpu->id_mmfr1 = 0x00000000;
30
#endif /* CONFIG_TCG */
86
+ cpu->id_mmfr2 = 0x00000000;
87
+ cpu->id_mmfr3 = 0x00000000;
88
+ cpu->id_isar0 = 0x01141110;
89
+ cpu->id_isar1 = 0x02111000;
90
+ cpu->id_isar2 = 0x21112231;
91
+ cpu->id_isar3 = 0x01111110;
92
+ cpu->id_isar4 = 0x01310102;
93
+ cpu->id_isar5 = 0x00000000;
94
}
31
}
95
32
96
static void cortex_m4_initfn(Object *obj)
33
-#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
97
@@ -XXX,XX +XXX,XX @@ static void cortex_m4_initfn(Object *obj)
34
-static void arm_host_initfn(Object *obj)
98
set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
35
-{
99
cpu->midr = 0x410fc240; /* r0p0 */
36
- ARMCPU *cpu = ARM_CPU(obj);
100
cpu->pmsav7_dregion = 8;
37
-
101
+ cpu->id_pfr0 = 0x00000030;
38
-#ifdef CONFIG_KVM
102
+ cpu->id_pfr1 = 0x00000200;
39
- kvm_arm_set_cpu_features_from_host(cpu);
103
+ cpu->id_dfr0 = 0x00100000;
40
- if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
104
+ cpu->id_afr0 = 0x00000000;
41
- aarch64_add_sve_properties(obj);
105
+ cpu->id_mmfr0 = 0x00000030;
42
- aarch64_add_pauth_properties(obj);
106
+ cpu->id_mmfr1 = 0x00000000;
43
- }
107
+ cpu->id_mmfr2 = 0x00000000;
44
-#else
108
+ cpu->id_mmfr3 = 0x00000000;
45
- hvf_arm_set_cpu_features_from_host(cpu);
109
+ cpu->id_isar0 = 0x01141110;
46
-#endif
110
+ cpu->id_isar1 = 0x02111000;
47
- arm_cpu_post_init(obj);
111
+ cpu->id_isar2 = 0x21112231;
48
-}
112
+ cpu->id_isar3 = 0x01111110;
49
-
113
+ cpu->id_isar4 = 0x01310102;
50
-static const TypeInfo host_arm_cpu_type_info = {
114
+ cpu->id_isar5 = 0x00000000;
51
- .name = TYPE_ARM_HOST_CPU,
52
- .parent = TYPE_AARCH64_CPU,
53
- .instance_init = arm_host_initfn,
54
-};
55
-
56
-#endif
57
-
58
static void arm_cpu_instance_init(Object *obj)
59
{
60
ARMCPUClass *acc = ARM_CPU_GET_CLASS(obj);
61
@@ -XXX,XX +XXX,XX @@ static const TypeInfo arm_cpu_type_info = {
62
static void arm_cpu_register_types(void)
63
{
64
type_register_static(&arm_cpu_type_info);
65
-
66
-#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
67
- type_register_static(&host_arm_cpu_type_info);
68
-#endif
115
}
69
}
116
70
117
static void arm_v7m_class_init(ObjectClass *oc, void *data)
71
type_init(arm_cpu_register_types)
72
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/target/arm/cpu64.c
75
+++ b/target/arm/cpu64.c
76
@@ -XXX,XX +XXX,XX @@
77
#endif
78
#include "sysemu/kvm.h"
79
#include "kvm_arm.h"
80
+#include "hvf_arm.h"
81
#include "qapi/visitor.h"
82
#include "hw/qdev-properties.h"
83
84
@@ -XXX,XX +XXX,XX @@ void aarch64_add_pauth_properties(Object *obj)
85
}
86
}
87
88
+#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
89
+static void arm_host_initfn(Object *obj)
90
+{
91
+ ARMCPU *cpu = ARM_CPU(obj);
92
+
93
+#ifdef CONFIG_KVM
94
+ kvm_arm_set_cpu_features_from_host(cpu);
95
+ if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
96
+ aarch64_add_sve_properties(obj);
97
+ aarch64_add_pauth_properties(obj);
98
+ }
99
+#else
100
+ hvf_arm_set_cpu_features_from_host(cpu);
101
+#endif
102
+ arm_cpu_post_init(obj);
103
+}
104
+
105
+static const TypeInfo host_arm_cpu_type_info = {
106
+ .name = TYPE_ARM_HOST_CPU,
107
+ .parent = TYPE_AARCH64_CPU,
108
+ .instance_init = arm_host_initfn,
109
+};
110
+
111
+#endif
112
+
113
/* -cpu max: if KVM is enabled, like -cpu host (best possible with this host);
114
* otherwise, a CPU with as many features enabled as our emulation supports.
115
* The version of '-cpu max' for qemu-system-arm is defined in cpu.c;
116
@@ -XXX,XX +XXX,XX @@ static void aarch64_cpu_register_types(void)
117
for (i = 0; i < ARRAY_SIZE(aarch64_cpus); ++i) {
118
aarch64_cpu_register(&aarch64_cpus[i]);
119
}
120
+
121
+#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
122
+ type_register_static(&host_arm_cpu_type_info);
123
+#endif
124
}
125
126
type_init(aarch64_cpu_register_types)
118
--
127
--
119
2.16.1
128
2.25.1
120
129
121
130
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Use the aarch64_cpu_register() machinery to register the 'host' CPU
2
type. This doesn't gain us anything functionally, but it does mean
3
that the code for initializing it looks more like that for the other
4
CPU types, in that its initfn then doesn't need to call
5
arm_cpu_post_init() (because aarch64_cpu_instance_init() does that
6
for it).
2
7
3
When storing to an AdvSIMD FP register, all of the high
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
bits of the SVE register are zeroed. Therefore, call it
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
more often with is_q as a parameter.
10
Reviewed-by: Andrew Jones <drjones@redhat.com>
11
Reviewed-by: Alexander Graf <agraf@csgraf.de>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20220204165506.2846058-3-peter.maydell@linaro.org
14
---
15
target/arm/cpu64.c | 17 ++++-------------
16
1 file changed, 4 insertions(+), 13 deletions(-)
6
17
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
18
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
8
Message-id: 20180211205848.4568-6-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/translate-a64.c | 162 +++++++++++++++++----------------------------
13
1 file changed, 62 insertions(+), 100 deletions(-)
14
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
20
--- a/target/arm/cpu64.c
18
+++ b/target/arm/translate-a64.c
21
+++ b/target/arm/cpu64.c
19
@@ -XXX,XX +XXX,XX @@ static TCGv_i32 read_fp_sreg(DisasContext *s, int reg)
22
@@ -XXX,XX +XXX,XX @@ void aarch64_add_pauth_properties(Object *obj)
20
return v;
21
}
23
}
22
24
23
+/* Clear the bits above an N-bit vector, for N = (is_q ? 128 : 64).
25
#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
24
+ * If SVE is not enabled, then there are only 128 bits in the vector.
26
-static void arm_host_initfn(Object *obj)
25
+ */
27
+static void aarch64_host_initfn(Object *obj)
26
+static void clear_vec_high(DisasContext *s, bool is_q, int rd)
27
+{
28
+ unsigned ofs = fp_reg_offset(s, rd, MO_64);
29
+ unsigned vsz = vec_full_reg_size(s);
30
+
31
+ if (!is_q) {
32
+ TCGv_i64 tcg_zero = tcg_const_i64(0);
33
+ tcg_gen_st_i64(tcg_zero, cpu_env, ofs + 8);
34
+ tcg_temp_free_i64(tcg_zero);
35
+ }
36
+ if (vsz > 16) {
37
+ tcg_gen_gvec_dup8i(ofs + 16, vsz - 16, vsz - 16, 0);
38
+ }
39
+}
40
+
41
static void write_fp_dreg(DisasContext *s, int reg, TCGv_i64 v)
42
{
28
{
43
- TCGv_i64 tcg_zero = tcg_const_i64(0);
29
ARMCPU *cpu = ARM_CPU(obj);
44
+ unsigned ofs = fp_reg_offset(s, reg, MO_64);
30
45
31
@@ -XXX,XX +XXX,XX @@ static void arm_host_initfn(Object *obj)
46
- tcg_gen_st_i64(v, cpu_env, fp_reg_offset(s, reg, MO_64));
32
#else
47
- tcg_gen_st_i64(tcg_zero, cpu_env, fp_reg_hi_offset(s, reg));
33
hvf_arm_set_cpu_features_from_host(cpu);
48
- tcg_temp_free_i64(tcg_zero);
34
#endif
49
+ tcg_gen_st_i64(v, cpu_env, ofs);
35
- arm_cpu_post_init(obj);
50
+ clear_vec_high(s, false, reg);
51
}
36
}
52
53
static void write_fp_sreg(DisasContext *s, int reg, TCGv_i32 v)
54
@@ -XXX,XX +XXX,XX @@ static void do_fp_ld(DisasContext *s, int destidx, TCGv_i64 tcg_addr, int size)
55
56
tcg_temp_free_i64(tmplo);
57
tcg_temp_free_i64(tmphi);
58
+
59
+ clear_vec_high(s, true, destidx);
60
}
61
62
/*
63
@@ -XXX,XX +XXX,XX @@ static void write_vec_element_i32(DisasContext *s, TCGv_i32 tcg_src,
64
}
65
}
66
67
-/* Clear the high 64 bits of a 128 bit vector (in general non-quad
68
- * vector ops all need to do this).
69
- */
70
-static void clear_vec_high(DisasContext *s, int rd)
71
-{
72
- TCGv_i64 tcg_zero = tcg_const_i64(0);
73
-
37
-
74
- write_vec_element(s, tcg_zero, rd, 1, MO_64);
38
-static const TypeInfo host_arm_cpu_type_info = {
75
- tcg_temp_free_i64(tcg_zero);
39
- .name = TYPE_ARM_HOST_CPU,
76
-}
40
- .parent = TYPE_AARCH64_CPU,
41
- .instance_init = arm_host_initfn,
42
-};
77
-
43
-
78
/* Store from vector register to memory */
44
#endif
79
static void do_vec_st(DisasContext *s, int srcidx, int element,
45
80
TCGv_i64 tcg_addr, int size)
46
/* -cpu max: if KVM is enabled, like -cpu host (best possible with this host);
81
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
47
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo aarch64_cpus[] = {
82
/* For non-quad operations, setting a slice of the low
48
{ .name = "cortex-a72", .initfn = aarch64_a72_initfn },
83
* 64 bits of the register clears the high 64 bits (in
49
{ .name = "a64fx", .initfn = aarch64_a64fx_initfn },
84
* the ARM ARM pseudocode this is implicit in the fact
50
{ .name = "max", .initfn = aarch64_max_initfn },
85
- * that 'rval' is a 64 bit wide variable). We optimize
51
+#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
86
- * by noticing that we only need to do this the first
52
+ { .name = "host", .initfn = aarch64_host_initfn },
87
- * time we touch a register.
53
+#endif
88
+ * that 'rval' is a 64 bit wide variable).
54
};
89
+ * For quad operations, we might still need to zero the
55
90
+ * high bits of SVE. We optimize by noticing that we only
56
static bool aarch64_cpu_get_aarch64(Object *obj, Error **errp)
91
+ * need to do this the first time we touch a register.
57
@@ -XXX,XX +XXX,XX @@ static void aarch64_cpu_register_types(void)
92
*/
58
for (i = 0; i < ARRAY_SIZE(aarch64_cpus); ++i) {
93
- if (!is_q && e == 0 && (r == 0 || xs == selem - 1)) {
59
aarch64_cpu_register(&aarch64_cpus[i]);
94
- clear_vec_high(s, tt);
95
+ if (e == 0 && (r == 0 || xs == selem - 1)) {
96
+ clear_vec_high(s, is_q, tt);
97
}
98
}
99
tcg_gen_addi_i64(tcg_addr, tcg_addr, ebytes);
100
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn)
101
write_vec_element(s, tcg_tmp, rt, 0, MO_64);
102
if (is_q) {
103
write_vec_element(s, tcg_tmp, rt, 1, MO_64);
104
- } else {
105
- clear_vec_high(s, rt);
106
}
107
tcg_temp_free_i64(tcg_tmp);
108
+ clear_vec_high(s, is_q, rt);
109
} else {
110
/* Load/store one element per register */
111
if (is_load) {
112
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_sqshrn(DisasContext *s, bool is_scalar, bool is_q,
113
}
114
115
if (!is_q) {
116
- clear_vec_high(s, rd);
117
write_vec_element(s, tcg_final, rd, 0, MO_64);
118
} else {
119
write_vec_element(s, tcg_final, rd, 1, MO_64);
120
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_sqshrn(DisasContext *s, bool is_scalar, bool is_q,
121
tcg_temp_free_i64(tcg_rd);
122
tcg_temp_free_i32(tcg_rd_narrowed);
123
tcg_temp_free_i64(tcg_final);
124
- return;
125
+
126
+ clear_vec_high(s, is_q, rd);
127
}
128
129
/* SQSHLU, UQSHL, SQSHL: saturating left shifts */
130
@@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q,
131
tcg_temp_free_i64(tcg_op);
132
}
133
tcg_temp_free_i64(tcg_shift);
134
-
135
- if (!is_q) {
136
- clear_vec_high(s, rd);
137
- }
138
+ clear_vec_high(s, is_q, rd);
139
} else {
140
TCGv_i32 tcg_shift = tcg_const_i32(shift);
141
static NeonGenTwoOpEnvFn * const fns[2][2][3] = {
142
@@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q,
143
}
144
tcg_temp_free_i32(tcg_shift);
145
146
- if (!is_q && !scalar) {
147
- clear_vec_high(s, rd);
148
+ if (!scalar) {
149
+ clear_vec_high(s, is_q, rd);
150
}
151
}
152
}
153
@@ -XXX,XX +XXX,XX @@ static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
154
}
155
}
156
157
- if (!is_double && elements == 2) {
158
- clear_vec_high(s, rd);
159
- }
160
-
161
tcg_temp_free_i64(tcg_int);
162
tcg_temp_free_ptr(tcg_fpst);
163
tcg_temp_free_i32(tcg_shift);
164
+
165
+ clear_vec_high(s, elements << size == 16, rd);
166
}
167
168
/* UCVTF/SCVTF - Integer to FP conversion */
169
@@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
170
write_vec_element(s, tcg_op, rd, pass, MO_64);
171
tcg_temp_free_i64(tcg_op);
172
}
173
- if (!is_q) {
174
- clear_vec_high(s, rd);
175
- }
176
+ clear_vec_high(s, is_q, rd);
177
} else {
178
int maxpass = is_scalar ? 1 : is_q ? 4 : 2;
179
for (pass = 0; pass < maxpass; pass++) {
180
@@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
181
}
182
tcg_temp_free_i32(tcg_op);
183
}
184
- if (!is_q && !is_scalar) {
185
- clear_vec_high(s, rd);
186
+ if (!is_scalar) {
187
+ clear_vec_high(s, is_q, rd);
188
}
189
}
190
191
@@ -XXX,XX +XXX,XX @@ static void handle_3same_float(DisasContext *s, int size, int elements,
192
193
tcg_temp_free_ptr(fpst);
194
195
- if ((elements << size) < 4) {
196
- /* scalar, or non-quad vector op */
197
- clear_vec_high(s, rd);
198
- }
199
+ clear_vec_high(s, elements * (size ? 8 : 4) > 8, rd);
200
}
201
202
/* AdvSIMD scalar three same
203
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
204
}
205
write_vec_element(s, tcg_res, rd, pass, MO_64);
206
}
207
- if (is_scalar) {
208
- clear_vec_high(s, rd);
209
- }
210
-
211
tcg_temp_free_i64(tcg_res);
212
tcg_temp_free_i64(tcg_zero);
213
tcg_temp_free_i64(tcg_op);
214
+
215
+ clear_vec_high(s, !is_scalar, rd);
216
} else {
217
TCGv_i32 tcg_op = tcg_temp_new_i32();
218
TCGv_i32 tcg_zero = tcg_const_i32(0);
219
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
220
tcg_temp_free_i32(tcg_res);
221
tcg_temp_free_i32(tcg_zero);
222
tcg_temp_free_i32(tcg_op);
223
- if (!is_q && !is_scalar) {
224
- clear_vec_high(s, rd);
225
+ if (!is_scalar) {
226
+ clear_vec_high(s, is_q, rd);
227
}
228
}
229
230
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_reciprocal(DisasContext *s, int opcode,
231
}
232
write_vec_element(s, tcg_res, rd, pass, MO_64);
233
}
234
- if (is_scalar) {
235
- clear_vec_high(s, rd);
236
- }
237
-
238
tcg_temp_free_i64(tcg_res);
239
tcg_temp_free_i64(tcg_op);
240
+ clear_vec_high(s, !is_scalar, rd);
241
} else {
242
TCGv_i32 tcg_op = tcg_temp_new_i32();
243
TCGv_i32 tcg_res = tcg_temp_new_i32();
244
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_reciprocal(DisasContext *s, int opcode,
245
}
246
tcg_temp_free_i32(tcg_res);
247
tcg_temp_free_i32(tcg_op);
248
- if (!is_q && !is_scalar) {
249
- clear_vec_high(s, rd);
250
+ if (!is_scalar) {
251
+ clear_vec_high(s, is_q, rd);
252
}
253
}
254
tcg_temp_free_ptr(fpst);
255
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_narrow(DisasContext *s, bool scalar,
256
write_vec_element_i32(s, tcg_res[pass], rd, destelt + pass, MO_32);
257
tcg_temp_free_i32(tcg_res[pass]);
258
}
259
- if (!is_q) {
260
- clear_vec_high(s, rd);
261
- }
262
+ clear_vec_high(s, is_q, rd);
263
}
264
265
/* Remaining saturating accumulating ops */
266
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_satacc(DisasContext *s, bool is_scalar, bool is_u,
267
}
268
write_vec_element(s, tcg_rd, rd, pass, MO_64);
269
}
270
- if (is_scalar) {
271
- clear_vec_high(s, rd);
272
- }
273
-
274
tcg_temp_free_i64(tcg_rd);
275
tcg_temp_free_i64(tcg_rn);
276
+ clear_vec_high(s, !is_scalar, rd);
277
} else {
278
TCGv_i32 tcg_rn = tcg_temp_new_i32();
279
TCGv_i32 tcg_rd = tcg_temp_new_i32();
280
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_satacc(DisasContext *s, bool is_scalar, bool is_u,
281
}
282
write_vec_element_i32(s, tcg_rd, rd, pass, MO_32);
283
}
284
-
285
- if (!is_q) {
286
- clear_vec_high(s, rd);
287
- }
288
-
289
tcg_temp_free_i32(tcg_rd);
290
tcg_temp_free_i32(tcg_rn);
291
+ clear_vec_high(s, is_q, rd);
292
}
293
}
294
295
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_shri(DisasContext *s, bool is_q, bool is_u,
296
tcg_temp_free_i64(tcg_round);
297
298
done:
299
- if (!is_q) {
300
- clear_vec_high(s, rd);
301
- }
302
+ clear_vec_high(s, is_q, rd);
303
}
304
305
static void gen_shl8_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
306
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_shrn(DisasContext *s, bool is_q,
307
}
308
309
if (!is_q) {
310
- clear_vec_high(s, rd);
311
write_vec_element(s, tcg_final, rd, 0, MO_64);
312
} else {
313
write_vec_element(s, tcg_final, rd, 1, MO_64);
314
}
60
}
315
-
61
-
316
if (round) {
62
-#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
317
tcg_temp_free_i64(tcg_round);
63
- type_register_static(&host_arm_cpu_type_info);
318
}
64
-#endif
319
tcg_temp_free_i64(tcg_rn);
320
tcg_temp_free_i64(tcg_rd);
321
tcg_temp_free_i64(tcg_final);
322
- return;
323
+
324
+ clear_vec_high(s, is_q, rd);
325
}
65
}
326
66
327
67
type_init(aarch64_cpu_register_types)
328
@@ -XXX,XX +XXX,XX @@ static void handle_3rd_narrowing(DisasContext *s, int is_q, int is_u, int size,
329
write_vec_element_i32(s, tcg_res[pass], rd, pass + part, MO_32);
330
tcg_temp_free_i32(tcg_res[pass]);
331
}
332
- if (!is_q) {
333
- clear_vec_high(s, rd);
334
- }
335
+ clear_vec_high(s, is_q, rd);
336
}
337
338
static void handle_pmull_64(DisasContext *s, int is_q, int rd, int rn, int rm)
339
@@ -XXX,XX +XXX,XX @@ static void handle_simd_3same_pair(DisasContext *s, int is_q, int u, int opcode,
340
write_vec_element_i32(s, tcg_res[pass], rd, pass, MO_32);
341
tcg_temp_free_i32(tcg_res[pass]);
342
}
343
- if (!is_q) {
344
- clear_vec_high(s, rd);
345
- }
346
+ clear_vec_high(s, is_q, rd);
347
}
348
349
if (fpst) {
350
@@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
351
tcg_temp_free_i32(tcg_op2);
352
}
353
}
354
-
355
- if (!is_q) {
356
- clear_vec_high(s, rd);
357
- }
358
+ clear_vec_high(s, is_q, rd);
359
}
360
361
/* AdvSIMD three same
362
@@ -XXX,XX +XXX,XX @@ static void handle_rev(DisasContext *s, int opcode, bool u,
363
write_vec_element(s, tcg_tmp, rd, i, grp_size);
364
tcg_temp_free_i64(tcg_tmp);
365
}
366
- if (!is_q) {
367
- clear_vec_high(s, rd);
368
- }
369
+ clear_vec_high(s, is_q, rd);
370
} else {
371
int revmask = (1 << grp_size) - 1;
372
int esize = 8 << size;
373
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
374
tcg_temp_free_i32(tcg_op);
375
}
376
}
377
- if (!is_q) {
378
- clear_vec_high(s, rd);
379
- }
380
+ clear_vec_high(s, is_q, rd);
381
382
if (need_rmode) {
383
gen_helper_set_rmode(tcg_rmode, tcg_rmode, cpu_env);
384
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
385
tcg_temp_free_i64(tcg_res);
386
}
387
388
- if (is_scalar) {
389
- clear_vec_high(s, rd);
390
- }
391
-
392
tcg_temp_free_i64(tcg_idx);
393
+ clear_vec_high(s, !is_scalar, rd);
394
} else if (!is_long) {
395
/* 32 bit floating point, or 16 or 32 bit integer.
396
* For the 16 bit scalar case we use the usual Neon helpers and
397
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
398
}
399
400
tcg_temp_free_i32(tcg_idx);
401
-
402
- if (!is_q) {
403
- clear_vec_high(s, rd);
404
- }
405
+ clear_vec_high(s, is_q, rd);
406
} else {
407
/* long ops: 16x16->32 or 32x32->64 */
408
TCGv_i64 tcg_res[2];
409
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
410
}
411
tcg_temp_free_i64(tcg_idx);
412
413
- if (is_scalar) {
414
- clear_vec_high(s, rd);
415
- }
416
+ clear_vec_high(s, !is_scalar, rd);
417
} else {
418
TCGv_i32 tcg_idx = tcg_temp_new_i32();
419
420
--
68
--
421
2.16.1
69
2.25.1
422
70
423
71
diff view generated by jsdifflib
New patch
1
Currently for KVM the intention is that '-cpu max' and '-cpu host'
2
are the same thing, but because we did this with two separate
3
pieces of code they have got a little bit out of sync. Specifically,
4
'max' has a 'sve-max-vq' property, and 'host' does not.
1
5
6
Bring the two together by having the initfn for 'max' actually
7
call the initfn for 'host'. This will result in 'max' no longer
8
exposing the 'sve-max-vq' property when using KVM.
9
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Andrew Jones <drjones@redhat.com>
13
Reviewed-by: Alexander Graf <agraf@csgraf.de>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20220204165506.2846058-4-peter.maydell@linaro.org
16
---
17
target/arm/cpu64.c | 14 ++++++++------
18
1 file changed, 8 insertions(+), 6 deletions(-)
19
20
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/cpu64.c
23
+++ b/target/arm/cpu64.c
24
@@ -XXX,XX +XXX,XX @@ void aarch64_add_pauth_properties(Object *obj)
25
}
26
}
27
28
-#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
29
static void aarch64_host_initfn(Object *obj)
30
{
31
+#if defined(CONFIG_KVM)
32
ARMCPU *cpu = ARM_CPU(obj);
33
-
34
-#ifdef CONFIG_KVM
35
kvm_arm_set_cpu_features_from_host(cpu);
36
if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
37
aarch64_add_sve_properties(obj);
38
aarch64_add_pauth_properties(obj);
39
}
40
-#else
41
+#elif defined(CONFIG_HVF)
42
+ ARMCPU *cpu = ARM_CPU(obj);
43
hvf_arm_set_cpu_features_from_host(cpu);
44
+#else
45
+ g_assert_not_reached();
46
#endif
47
}
48
-#endif
49
50
/* -cpu max: if KVM is enabled, like -cpu host (best possible with this host);
51
* otherwise, a CPU with as many features enabled as our emulation supports.
52
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
53
ARMCPU *cpu = ARM_CPU(obj);
54
55
if (kvm_enabled()) {
56
- kvm_arm_set_cpu_features_from_host(cpu);
57
+ /* With KVM, '-cpu max' is identical to '-cpu host' */
58
+ aarch64_host_initfn(obj);
59
+ return;
60
} else {
61
uint64_t t;
62
uint32_t u;
63
--
64
2.25.1
65
66
diff view generated by jsdifflib
1
The v8M architecture includes hardware support for enforcing
1
Now that the if() branch of the condition in aarch64_max_initfn()
2
stack pointer limits. We don't implement this behaviour yet,
2
returns early, we don't need to keep the rest of the code in
3
but provide the MSPLIM and PSPLIM stack pointer limit registers
3
the function inside an else block. Remove the else, unindenting
4
as reads-as-written, so that when we do implement the checks
4
that code.
5
in future this won't break guest migration.
6
5
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Andrew Jones <drjones@redhat.com>
9
Reviewed-by: Alexander Graf <agraf@csgraf.de>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180209165810.6668-12-peter.maydell@linaro.org
11
Message-id: 20220204165506.2846058-5-peter.maydell@linaro.org
10
---
12
---
11
target/arm/cpu.h | 2 ++
13
target/arm/cpu64.c | 289 +++++++++++++++++++++++----------------------
12
target/arm/helper.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
14
1 file changed, 146 insertions(+), 143 deletions(-)
13
target/arm/machine.c | 21 +++++++++++++++++++++
14
3 files changed, 69 insertions(+)
15
15
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
18
--- a/target/arm/cpu64.c
19
+++ b/target/arm/cpu.h
19
+++ b/target/arm/cpu64.c
20
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
20
@@ -XXX,XX +XXX,XX @@ static void aarch64_host_initfn(Object *obj)
21
uint32_t secure; /* Is CPU in Secure state? (not guest visible) */
21
static void aarch64_max_initfn(Object *obj)
22
uint32_t csselr[M_REG_NUM_BANKS];
22
{
23
uint32_t scr[M_REG_NUM_BANKS];
23
ARMCPU *cpu = ARM_CPU(obj);
24
+ uint32_t msplim[M_REG_NUM_BANKS];
24
+ uint64_t t;
25
+ uint32_t psplim[M_REG_NUM_BANKS];
25
+ uint32_t u;
26
} v7m;
26
27
27
if (kvm_enabled()) {
28
/* Information associated with an exception about to be taken:
28
/* With KVM, '-cpu max' is identical to '-cpu host' */
29
diff --git a/target/arm/helper.c b/target/arm/helper.c
29
aarch64_host_initfn(obj);
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/helper.c
32
+++ b/target/arm/helper.c
33
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
34
return 0;
35
}
36
return env->v7m.other_ss_psp;
37
+ case 0x8a: /* MSPLIM_NS */
38
+ if (!env->v7m.secure) {
39
+ return 0;
40
+ }
41
+ return env->v7m.msplim[M_REG_NS];
42
+ case 0x8b: /* PSPLIM_NS */
43
+ if (!env->v7m.secure) {
44
+ return 0;
45
+ }
46
+ return env->v7m.psplim[M_REG_NS];
47
case 0x90: /* PRIMASK_NS */
48
if (!env->v7m.secure) {
49
return 0;
50
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
51
return v7m_using_psp(env) ? env->v7m.other_sp : env->regs[13];
52
case 9: /* PSP */
53
return v7m_using_psp(env) ? env->regs[13] : env->v7m.other_sp;
54
+ case 10: /* MSPLIM */
55
+ if (!arm_feature(env, ARM_FEATURE_V8)) {
56
+ goto bad_reg;
57
+ }
58
+ return env->v7m.msplim[env->v7m.secure];
59
+ case 11: /* PSPLIM */
60
+ if (!arm_feature(env, ARM_FEATURE_V8)) {
61
+ goto bad_reg;
62
+ }
63
+ return env->v7m.psplim[env->v7m.secure];
64
case 16: /* PRIMASK */
65
return env->v7m.primask[env->v7m.secure];
66
case 17: /* BASEPRI */
67
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
68
case 19: /* FAULTMASK */
69
return env->v7m.faultmask[env->v7m.secure];
70
default:
71
+ bad_reg:
72
qemu_log_mask(LOG_GUEST_ERROR, "Attempt to read unknown special"
73
" register %d\n", reg);
74
return 0;
75
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
76
}
77
env->v7m.other_ss_psp = val;
78
return;
79
+ case 0x8a: /* MSPLIM_NS */
80
+ if (!env->v7m.secure) {
81
+ return;
82
+ }
83
+ env->v7m.msplim[M_REG_NS] = val & ~7;
84
+ return;
85
+ case 0x8b: /* PSPLIM_NS */
86
+ if (!env->v7m.secure) {
87
+ return;
88
+ }
89
+ env->v7m.psplim[M_REG_NS] = val & ~7;
90
+ return;
91
case 0x90: /* PRIMASK_NS */
92
if (!env->v7m.secure) {
93
return;
94
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
95
env->v7m.other_sp = val;
96
}
97
break;
98
+ case 10: /* MSPLIM */
99
+ if (!arm_feature(env, ARM_FEATURE_V8)) {
100
+ goto bad_reg;
101
+ }
102
+ env->v7m.msplim[env->v7m.secure] = val & ~7;
103
+ break;
104
+ case 11: /* PSPLIM */
105
+ if (!arm_feature(env, ARM_FEATURE_V8)) {
106
+ goto bad_reg;
107
+ }
108
+ env->v7m.psplim[env->v7m.secure] = val & ~7;
109
+ break;
110
case 16: /* PRIMASK */
111
env->v7m.primask[env->v7m.secure] = val & 1;
112
break;
113
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
114
env->v7m.control[env->v7m.secure] |= val & R_V7M_CONTROL_NPRIV_MASK;
115
break;
116
default:
117
+ bad_reg:
118
qemu_log_mask(LOG_GUEST_ERROR, "Attempt to write unknown special"
119
" register %d\n", reg);
120
return;
30
return;
121
diff --git a/target/arm/machine.c b/target/arm/machine.c
31
- } else {
122
index XXXXXXX..XXXXXXX 100644
32
- uint64_t t;
123
--- a/target/arm/machine.c
33
- uint32_t u;
124
+++ b/target/arm/machine.c
34
- aarch64_a57_initfn(obj);
125
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_other_sp = {
35
+ }
126
}
36
127
};
37
- /*
128
38
- * Reset MIDR so the guest doesn't mistake our 'max' CPU type for a real
129
+static bool m_v8m_needed(void *opaque)
39
- * one and try to apply errata workarounds or use impdef features we
130
+{
40
- * don't provide.
131
+ ARMCPU *cpu = opaque;
41
- * An IMPLEMENTER field of 0 means "reserved for software use";
132
+ CPUARMState *env = &cpu->env;
42
- * ARCHITECTURE must be 0xf indicating "v7 or later, check ID registers
43
- * to see which features are present";
44
- * the VARIANT, PARTNUM and REVISION fields are all implementation
45
- * defined and we choose to define PARTNUM just in case guest
46
- * code needs to distinguish this QEMU CPU from other software
47
- * implementations, though this shouldn't be needed.
48
- */
49
- t = FIELD_DP64(0, MIDR_EL1, IMPLEMENTER, 0);
50
- t = FIELD_DP64(t, MIDR_EL1, ARCHITECTURE, 0xf);
51
- t = FIELD_DP64(t, MIDR_EL1, PARTNUM, 'Q');
52
- t = FIELD_DP64(t, MIDR_EL1, VARIANT, 0);
53
- t = FIELD_DP64(t, MIDR_EL1, REVISION, 0);
54
- cpu->midr = t;
55
+ /* '-cpu max' for TCG: we currently do this as "A57 with extra things" */
56
57
- t = cpu->isar.id_aa64isar0;
58
- t = FIELD_DP64(t, ID_AA64ISAR0, AES, 2); /* AES + PMULL */
59
- t = FIELD_DP64(t, ID_AA64ISAR0, SHA1, 1);
60
- t = FIELD_DP64(t, ID_AA64ISAR0, SHA2, 2); /* SHA512 */
61
- t = FIELD_DP64(t, ID_AA64ISAR0, CRC32, 1);
62
- t = FIELD_DP64(t, ID_AA64ISAR0, ATOMIC, 2);
63
- t = FIELD_DP64(t, ID_AA64ISAR0, RDM, 1);
64
- t = FIELD_DP64(t, ID_AA64ISAR0, SHA3, 1);
65
- t = FIELD_DP64(t, ID_AA64ISAR0, SM3, 1);
66
- t = FIELD_DP64(t, ID_AA64ISAR0, SM4, 1);
67
- t = FIELD_DP64(t, ID_AA64ISAR0, DP, 1);
68
- t = FIELD_DP64(t, ID_AA64ISAR0, FHM, 1);
69
- t = FIELD_DP64(t, ID_AA64ISAR0, TS, 2); /* v8.5-CondM */
70
- t = FIELD_DP64(t, ID_AA64ISAR0, TLB, 2); /* FEAT_TLBIRANGE */
71
- t = FIELD_DP64(t, ID_AA64ISAR0, RNDR, 1);
72
- cpu->isar.id_aa64isar0 = t;
73
+ aarch64_a57_initfn(obj);
74
75
- t = cpu->isar.id_aa64isar1;
76
- t = FIELD_DP64(t, ID_AA64ISAR1, DPB, 2);
77
- t = FIELD_DP64(t, ID_AA64ISAR1, JSCVT, 1);
78
- t = FIELD_DP64(t, ID_AA64ISAR1, FCMA, 1);
79
- t = FIELD_DP64(t, ID_AA64ISAR1, SB, 1);
80
- t = FIELD_DP64(t, ID_AA64ISAR1, SPECRES, 1);
81
- t = FIELD_DP64(t, ID_AA64ISAR1, BF16, 1);
82
- t = FIELD_DP64(t, ID_AA64ISAR1, FRINTTS, 1);
83
- t = FIELD_DP64(t, ID_AA64ISAR1, LRCPC, 2); /* ARMv8.4-RCPC */
84
- t = FIELD_DP64(t, ID_AA64ISAR1, I8MM, 1);
85
- cpu->isar.id_aa64isar1 = t;
86
+ /*
87
+ * Reset MIDR so the guest doesn't mistake our 'max' CPU type for a real
88
+ * one and try to apply errata workarounds or use impdef features we
89
+ * don't provide.
90
+ * An IMPLEMENTER field of 0 means "reserved for software use";
91
+ * ARCHITECTURE must be 0xf indicating "v7 or later, check ID registers
92
+ * to see which features are present";
93
+ * the VARIANT, PARTNUM and REVISION fields are all implementation
94
+ * defined and we choose to define PARTNUM just in case guest
95
+ * code needs to distinguish this QEMU CPU from other software
96
+ * implementations, though this shouldn't be needed.
97
+ */
98
+ t = FIELD_DP64(0, MIDR_EL1, IMPLEMENTER, 0);
99
+ t = FIELD_DP64(t, MIDR_EL1, ARCHITECTURE, 0xf);
100
+ t = FIELD_DP64(t, MIDR_EL1, PARTNUM, 'Q');
101
+ t = FIELD_DP64(t, MIDR_EL1, VARIANT, 0);
102
+ t = FIELD_DP64(t, MIDR_EL1, REVISION, 0);
103
+ cpu->midr = t;
104
105
- t = cpu->isar.id_aa64pfr0;
106
- t = FIELD_DP64(t, ID_AA64PFR0, SVE, 1);
107
- t = FIELD_DP64(t, ID_AA64PFR0, FP, 1);
108
- t = FIELD_DP64(t, ID_AA64PFR0, ADVSIMD, 1);
109
- t = FIELD_DP64(t, ID_AA64PFR0, SEL2, 1);
110
- t = FIELD_DP64(t, ID_AA64PFR0, DIT, 1);
111
- cpu->isar.id_aa64pfr0 = t;
112
+ t = cpu->isar.id_aa64isar0;
113
+ t = FIELD_DP64(t, ID_AA64ISAR0, AES, 2); /* AES + PMULL */
114
+ t = FIELD_DP64(t, ID_AA64ISAR0, SHA1, 1);
115
+ t = FIELD_DP64(t, ID_AA64ISAR0, SHA2, 2); /* SHA512 */
116
+ t = FIELD_DP64(t, ID_AA64ISAR0, CRC32, 1);
117
+ t = FIELD_DP64(t, ID_AA64ISAR0, ATOMIC, 2);
118
+ t = FIELD_DP64(t, ID_AA64ISAR0, RDM, 1);
119
+ t = FIELD_DP64(t, ID_AA64ISAR0, SHA3, 1);
120
+ t = FIELD_DP64(t, ID_AA64ISAR0, SM3, 1);
121
+ t = FIELD_DP64(t, ID_AA64ISAR0, SM4, 1);
122
+ t = FIELD_DP64(t, ID_AA64ISAR0, DP, 1);
123
+ t = FIELD_DP64(t, ID_AA64ISAR0, FHM, 1);
124
+ t = FIELD_DP64(t, ID_AA64ISAR0, TS, 2); /* v8.5-CondM */
125
+ t = FIELD_DP64(t, ID_AA64ISAR0, TLB, 2); /* FEAT_TLBIRANGE */
126
+ t = FIELD_DP64(t, ID_AA64ISAR0, RNDR, 1);
127
+ cpu->isar.id_aa64isar0 = t;
128
129
- t = cpu->isar.id_aa64pfr1;
130
- t = FIELD_DP64(t, ID_AA64PFR1, BT, 1);
131
- t = FIELD_DP64(t, ID_AA64PFR1, SSBS, 2);
132
- /*
133
- * Begin with full support for MTE. This will be downgraded to MTE=0
134
- * during realize if the board provides no tag memory, much like
135
- * we do for EL2 with the virtualization=on property.
136
- */
137
- t = FIELD_DP64(t, ID_AA64PFR1, MTE, 3);
138
- cpu->isar.id_aa64pfr1 = t;
139
+ t = cpu->isar.id_aa64isar1;
140
+ t = FIELD_DP64(t, ID_AA64ISAR1, DPB, 2);
141
+ t = FIELD_DP64(t, ID_AA64ISAR1, JSCVT, 1);
142
+ t = FIELD_DP64(t, ID_AA64ISAR1, FCMA, 1);
143
+ t = FIELD_DP64(t, ID_AA64ISAR1, SB, 1);
144
+ t = FIELD_DP64(t, ID_AA64ISAR1, SPECRES, 1);
145
+ t = FIELD_DP64(t, ID_AA64ISAR1, BF16, 1);
146
+ t = FIELD_DP64(t, ID_AA64ISAR1, FRINTTS, 1);
147
+ t = FIELD_DP64(t, ID_AA64ISAR1, LRCPC, 2); /* ARMv8.4-RCPC */
148
+ t = FIELD_DP64(t, ID_AA64ISAR1, I8MM, 1);
149
+ cpu->isar.id_aa64isar1 = t;
150
151
- t = cpu->isar.id_aa64mmfr0;
152
- t = FIELD_DP64(t, ID_AA64MMFR0, PARANGE, 5); /* PARange: 48 bits */
153
- cpu->isar.id_aa64mmfr0 = t;
154
+ t = cpu->isar.id_aa64pfr0;
155
+ t = FIELD_DP64(t, ID_AA64PFR0, SVE, 1);
156
+ t = FIELD_DP64(t, ID_AA64PFR0, FP, 1);
157
+ t = FIELD_DP64(t, ID_AA64PFR0, ADVSIMD, 1);
158
+ t = FIELD_DP64(t, ID_AA64PFR0, SEL2, 1);
159
+ t = FIELD_DP64(t, ID_AA64PFR0, DIT, 1);
160
+ cpu->isar.id_aa64pfr0 = t;
161
162
- t = cpu->isar.id_aa64mmfr1;
163
- t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* HPD */
164
- t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
165
- t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1);
166
- t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
167
- t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2); /* VMID16 */
168
- t = FIELD_DP64(t, ID_AA64MMFR1, XNX, 1); /* TTS2UXN */
169
- cpu->isar.id_aa64mmfr1 = t;
170
+ t = cpu->isar.id_aa64pfr1;
171
+ t = FIELD_DP64(t, ID_AA64PFR1, BT, 1);
172
+ t = FIELD_DP64(t, ID_AA64PFR1, SSBS, 2);
173
+ /*
174
+ * Begin with full support for MTE. This will be downgraded to MTE=0
175
+ * during realize if the board provides no tag memory, much like
176
+ * we do for EL2 with the virtualization=on property.
177
+ */
178
+ t = FIELD_DP64(t, ID_AA64PFR1, MTE, 3);
179
+ cpu->isar.id_aa64pfr1 = t;
180
181
- t = cpu->isar.id_aa64mmfr2;
182
- t = FIELD_DP64(t, ID_AA64MMFR2, UAO, 1);
183
- t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1); /* TTCNP */
184
- t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* TTST */
185
- cpu->isar.id_aa64mmfr2 = t;
186
+ t = cpu->isar.id_aa64mmfr0;
187
+ t = FIELD_DP64(t, ID_AA64MMFR0, PARANGE, 5); /* PARange: 48 bits */
188
+ cpu->isar.id_aa64mmfr0 = t;
189
190
- t = cpu->isar.id_aa64zfr0;
191
- t = FIELD_DP64(t, ID_AA64ZFR0, SVEVER, 1);
192
- t = FIELD_DP64(t, ID_AA64ZFR0, AES, 2); /* PMULL */
193
- t = FIELD_DP64(t, ID_AA64ZFR0, BITPERM, 1);
194
- t = FIELD_DP64(t, ID_AA64ZFR0, BFLOAT16, 1);
195
- t = FIELD_DP64(t, ID_AA64ZFR0, SHA3, 1);
196
- t = FIELD_DP64(t, ID_AA64ZFR0, SM4, 1);
197
- t = FIELD_DP64(t, ID_AA64ZFR0, I8MM, 1);
198
- t = FIELD_DP64(t, ID_AA64ZFR0, F32MM, 1);
199
- t = FIELD_DP64(t, ID_AA64ZFR0, F64MM, 1);
200
- cpu->isar.id_aa64zfr0 = t;
201
+ t = cpu->isar.id_aa64mmfr1;
202
+ t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* HPD */
203
+ t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
204
+ t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1);
205
+ t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
206
+ t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2); /* VMID16 */
207
+ t = FIELD_DP64(t, ID_AA64MMFR1, XNX, 1); /* TTS2UXN */
208
+ cpu->isar.id_aa64mmfr1 = t;
209
210
- /* Replicate the same data to the 32-bit id registers. */
211
- u = cpu->isar.id_isar5;
212
- u = FIELD_DP32(u, ID_ISAR5, AES, 2); /* AES + PMULL */
213
- u = FIELD_DP32(u, ID_ISAR5, SHA1, 1);
214
- u = FIELD_DP32(u, ID_ISAR5, SHA2, 1);
215
- u = FIELD_DP32(u, ID_ISAR5, CRC32, 1);
216
- u = FIELD_DP32(u, ID_ISAR5, RDM, 1);
217
- u = FIELD_DP32(u, ID_ISAR5, VCMA, 1);
218
- cpu->isar.id_isar5 = u;
219
+ t = cpu->isar.id_aa64mmfr2;
220
+ t = FIELD_DP64(t, ID_AA64MMFR2, UAO, 1);
221
+ t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1); /* TTCNP */
222
+ t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* TTST */
223
+ cpu->isar.id_aa64mmfr2 = t;
224
225
- u = cpu->isar.id_isar6;
226
- u = FIELD_DP32(u, ID_ISAR6, JSCVT, 1);
227
- u = FIELD_DP32(u, ID_ISAR6, DP, 1);
228
- u = FIELD_DP32(u, ID_ISAR6, FHM, 1);
229
- u = FIELD_DP32(u, ID_ISAR6, SB, 1);
230
- u = FIELD_DP32(u, ID_ISAR6, SPECRES, 1);
231
- u = FIELD_DP32(u, ID_ISAR6, BF16, 1);
232
- u = FIELD_DP32(u, ID_ISAR6, I8MM, 1);
233
- cpu->isar.id_isar6 = u;
234
+ t = cpu->isar.id_aa64zfr0;
235
+ t = FIELD_DP64(t, ID_AA64ZFR0, SVEVER, 1);
236
+ t = FIELD_DP64(t, ID_AA64ZFR0, AES, 2); /* PMULL */
237
+ t = FIELD_DP64(t, ID_AA64ZFR0, BITPERM, 1);
238
+ t = FIELD_DP64(t, ID_AA64ZFR0, BFLOAT16, 1);
239
+ t = FIELD_DP64(t, ID_AA64ZFR0, SHA3, 1);
240
+ t = FIELD_DP64(t, ID_AA64ZFR0, SM4, 1);
241
+ t = FIELD_DP64(t, ID_AA64ZFR0, I8MM, 1);
242
+ t = FIELD_DP64(t, ID_AA64ZFR0, F32MM, 1);
243
+ t = FIELD_DP64(t, ID_AA64ZFR0, F64MM, 1);
244
+ cpu->isar.id_aa64zfr0 = t;
245
246
- u = cpu->isar.id_pfr0;
247
- u = FIELD_DP32(u, ID_PFR0, DIT, 1);
248
- cpu->isar.id_pfr0 = u;
249
+ /* Replicate the same data to the 32-bit id registers. */
250
+ u = cpu->isar.id_isar5;
251
+ u = FIELD_DP32(u, ID_ISAR5, AES, 2); /* AES + PMULL */
252
+ u = FIELD_DP32(u, ID_ISAR5, SHA1, 1);
253
+ u = FIELD_DP32(u, ID_ISAR5, SHA2, 1);
254
+ u = FIELD_DP32(u, ID_ISAR5, CRC32, 1);
255
+ u = FIELD_DP32(u, ID_ISAR5, RDM, 1);
256
+ u = FIELD_DP32(u, ID_ISAR5, VCMA, 1);
257
+ cpu->isar.id_isar5 = u;
258
259
- u = cpu->isar.id_pfr2;
260
- u = FIELD_DP32(u, ID_PFR2, SSBS, 1);
261
- cpu->isar.id_pfr2 = u;
262
+ u = cpu->isar.id_isar6;
263
+ u = FIELD_DP32(u, ID_ISAR6, JSCVT, 1);
264
+ u = FIELD_DP32(u, ID_ISAR6, DP, 1);
265
+ u = FIELD_DP32(u, ID_ISAR6, FHM, 1);
266
+ u = FIELD_DP32(u, ID_ISAR6, SB, 1);
267
+ u = FIELD_DP32(u, ID_ISAR6, SPECRES, 1);
268
+ u = FIELD_DP32(u, ID_ISAR6, BF16, 1);
269
+ u = FIELD_DP32(u, ID_ISAR6, I8MM, 1);
270
+ cpu->isar.id_isar6 = u;
271
272
- u = cpu->isar.id_mmfr3;
273
- u = FIELD_DP32(u, ID_MMFR3, PAN, 2); /* ATS1E1 */
274
- cpu->isar.id_mmfr3 = u;
275
+ u = cpu->isar.id_pfr0;
276
+ u = FIELD_DP32(u, ID_PFR0, DIT, 1);
277
+ cpu->isar.id_pfr0 = u;
278
279
- u = cpu->isar.id_mmfr4;
280
- u = FIELD_DP32(u, ID_MMFR4, HPDS, 1); /* AA32HPD */
281
- u = FIELD_DP32(u, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
282
- u = FIELD_DP32(u, ID_MMFR4, CNP, 1); /* TTCNP */
283
- u = FIELD_DP32(u, ID_MMFR4, XNX, 1); /* TTS2UXN */
284
- cpu->isar.id_mmfr4 = u;
285
+ u = cpu->isar.id_pfr2;
286
+ u = FIELD_DP32(u, ID_PFR2, SSBS, 1);
287
+ cpu->isar.id_pfr2 = u;
288
289
- t = cpu->isar.id_aa64dfr0;
290
- t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 5); /* v8.4-PMU */
291
- cpu->isar.id_aa64dfr0 = t;
292
+ u = cpu->isar.id_mmfr3;
293
+ u = FIELD_DP32(u, ID_MMFR3, PAN, 2); /* ATS1E1 */
294
+ cpu->isar.id_mmfr3 = u;
295
296
- u = cpu->isar.id_dfr0;
297
- u = FIELD_DP32(u, ID_DFR0, PERFMON, 5); /* v8.4-PMU */
298
- cpu->isar.id_dfr0 = u;
299
+ u = cpu->isar.id_mmfr4;
300
+ u = FIELD_DP32(u, ID_MMFR4, HPDS, 1); /* AA32HPD */
301
+ u = FIELD_DP32(u, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
302
+ u = FIELD_DP32(u, ID_MMFR4, CNP, 1); /* TTCNP */
303
+ u = FIELD_DP32(u, ID_MMFR4, XNX, 1); /* TTS2UXN */
304
+ cpu->isar.id_mmfr4 = u;
305
306
- u = cpu->isar.mvfr1;
307
- u = FIELD_DP32(u, MVFR1, FPHP, 3); /* v8.2-FP16 */
308
- u = FIELD_DP32(u, MVFR1, SIMDHP, 2); /* v8.2-FP16 */
309
- cpu->isar.mvfr1 = u;
310
+ t = cpu->isar.id_aa64dfr0;
311
+ t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 5); /* v8.4-PMU */
312
+ cpu->isar.id_aa64dfr0 = t;
133
+
313
+
134
+ return arm_feature(env, ARM_FEATURE_M) && arm_feature(env, ARM_FEATURE_V8);
314
+ u = cpu->isar.id_dfr0;
135
+}
315
+ u = FIELD_DP32(u, ID_DFR0, PERFMON, 5); /* v8.4-PMU */
316
+ cpu->isar.id_dfr0 = u;
136
+
317
+
137
+static const VMStateDescription vmstate_m_v8m = {
318
+ u = cpu->isar.mvfr1;
138
+ .name = "cpu/m/v8m",
319
+ u = FIELD_DP32(u, MVFR1, FPHP, 3); /* v8.2-FP16 */
139
+ .version_id = 1,
320
+ u = FIELD_DP32(u, MVFR1, SIMDHP, 2); /* v8.2-FP16 */
140
+ .minimum_version_id = 1,
321
+ cpu->isar.mvfr1 = u;
141
+ .needed = m_v8m_needed,
322
142
+ .fields = (VMStateField[]) {
323
#ifdef CONFIG_USER_ONLY
143
+ VMSTATE_UINT32_ARRAY(env.v7m.msplim, ARMCPU, M_REG_NUM_BANKS),
324
- /* For usermode -cpu max we can use a larger and more efficient DCZ
144
+ VMSTATE_UINT32_ARRAY(env.v7m.psplim, ARMCPU, M_REG_NUM_BANKS),
325
- * blocksize since we don't have to follow what the hardware does.
145
+ VMSTATE_END_OF_LIST()
326
- */
146
+ }
327
- cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */
147
+};
328
- cpu->dcz_blocksize = 7; /* 512 bytes */
148
+
329
+ /*
149
static const VMStateDescription vmstate_m = {
330
+ * For usermode -cpu max we can use a larger and more efficient DCZ
150
.name = "cpu/m",
331
+ * blocksize since we don't have to follow what the hardware does.
151
.version_id = 4,
332
+ */
152
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
333
+ cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */
153
&vmstate_m_csselr,
334
+ cpu->dcz_blocksize = 7; /* 512 bytes */
154
&vmstate_m_scr,
335
#endif
155
&vmstate_m_other_sp,
336
156
+ &vmstate_m_v8m,
337
- bitmap_fill(cpu->sve_vq_supported, ARM_MAX_VQ);
157
NULL
338
- }
158
}
339
+ bitmap_fill(cpu->sve_vq_supported, ARM_MAX_VQ);
159
};
340
341
aarch64_add_pauth_properties(obj);
342
aarch64_add_sve_properties(obj);
160
--
343
--
161
2.16.1
344
2.25.1
162
345
163
346
diff view generated by jsdifflib
1
In commit abc24d86cc0364f we accidentally broke migration of
1
Currently when using hvf we mishandle '-cpu max': we fall through to
2
the stack pointer value for the mode (process, handler) the CPU
2
the TCG version of its initfn, which then sets a lot of feature bits
3
is not currently running as. (The commit correctly removed the
3
that the real host CPU doesn't have. The hvf accelerator code then
4
no-longer-used v7m.current_sp flag from the VMState but also
4
exposes these bogus ID register values to the guest because it
5
deleted the still very much in use v7m.other_sp SP value field.)
5
doesn't check that the host really has the features.
6
6
7
Add a subsection to migrate it again. (We don't need to care
7
Make '-cpu host' be like '-cpu max' for hvf, as we do with kvm.
8
about trying to retain compatibility with pre-abc24d86cc0364f
9
versions of QEMU, because that commit bumped the version_id
10
and we've since bumped it again a couple of times.)
11
8
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Andrew Jones <drjones@redhat.com>
12
Reviewed-by: Alexander Graf <agraf@csgraf.de>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20180209165810.6668-11-peter.maydell@linaro.org
14
Message-id: 20220204165506.2846058-6-peter.maydell@linaro.org
15
---
15
---
16
target/arm/machine.c | 11 +++++++++++
16
target/arm/cpu64.c | 5 +++--
17
1 file changed, 11 insertions(+)
17
1 file changed, 3 insertions(+), 2 deletions(-)
18
18
19
diff --git a/target/arm/machine.c b/target/arm/machine.c
19
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
20
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/machine.c
21
--- a/target/arm/cpu64.c
22
+++ b/target/arm/machine.c
22
+++ b/target/arm/cpu64.c
23
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_scr = {
23
@@ -XXX,XX +XXX,XX @@
24
#include "hw/loader.h"
25
#endif
26
#include "sysemu/kvm.h"
27
+#include "sysemu/hvf.h"
28
#include "kvm_arm.h"
29
#include "hvf_arm.h"
30
#include "qapi/visitor.h"
31
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
32
uint64_t t;
33
uint32_t u;
34
35
- if (kvm_enabled()) {
36
- /* With KVM, '-cpu max' is identical to '-cpu host' */
37
+ if (kvm_enabled() || hvf_enabled()) {
38
+ /* With KVM or HVF, '-cpu max' is identical to '-cpu host' */
39
aarch64_host_initfn(obj);
40
return;
24
}
41
}
25
};
26
27
+static const VMStateDescription vmstate_m_other_sp = {
28
+ .name = "cpu/m/other-sp",
29
+ .version_id = 1,
30
+ .minimum_version_id = 1,
31
+ .fields = (VMStateField[]) {
32
+ VMSTATE_UINT32(env.v7m.other_sp, ARMCPU),
33
+ VMSTATE_END_OF_LIST()
34
+ }
35
+};
36
+
37
static const VMStateDescription vmstate_m = {
38
.name = "cpu/m",
39
.version_id = 4,
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
41
&vmstate_m_faultmask_primask,
42
&vmstate_m_csselr,
43
&vmstate_m_scr,
44
+ &vmstate_m_other_sp,
45
NULL
46
}
47
};
48
--
42
--
49
2.16.1
43
2.25.1
50
44
51
45
diff view generated by jsdifflib
1
In commit commit 3b2e934463121 we added support for the AIRCR
1
Currently we don't allow guests under hvf to use the PAuth extension,
2
register holding state, but forgot to add it to the vmstate
2
because we didn't have any special code to handle that, and therefore
3
structs. Since it only holds r/w state if the security extension
3
in arm_cpu_pauth_finalize() we will sanitize the ID_AA64ISAR1 value
4
is implemented, we can just add it to vmstate_m_security.
4
the guest sees to clear the PAuth related fields.
5
6
Add support for this in the same way that KVM does it, by defaulting
7
to "PAuth enabled" if the host CPU has it and allowing the user to
8
disable it via '-cpu pauth=no' on the command line.
5
9
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Andrew Jones <drjones@redhat.com>
13
Reviewed-by: Alexander Graf <agraf@csgraf.de>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20180209165810.6668-10-peter.maydell@linaro.org
15
Message-id: 20220204165506.2846058-7-peter.maydell@linaro.org
9
---
16
---
10
target/arm/machine.c | 4 ++++
17
target/arm/cpu64.c | 14 ++++++++++----
11
1 file changed, 4 insertions(+)
18
1 file changed, 10 insertions(+), 4 deletions(-)
12
19
13
diff --git a/target/arm/machine.c b/target/arm/machine.c
20
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
14
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/machine.c
22
--- a/target/arm/cpu64.c
16
+++ b/target/arm/machine.c
23
+++ b/target/arm/cpu64.c
17
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
24
@@ -XXX,XX +XXX,XX @@ void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp)
18
VMSTATE_VALIDATE("SAU_RNR is valid", sau_rnr_vmstate_validate),
25
uint64_t t;
19
VMSTATE_UINT32(env.sau.ctrl, ARMCPU),
26
20
VMSTATE_UINT32(env.v7m.scr[M_REG_S], ARMCPU),
27
/* Exit early if PAuth is enabled, and fall through to disable it */
21
+ /* AIRCR is not secure-only, but our implementation is R/O if the
28
- if (kvm_enabled() && cpu->prop_pauth) {
22
+ * security extension is unimplemented, so we migrate it here.
29
+ if ((kvm_enabled() || hvf_enabled()) && cpu->prop_pauth) {
23
+ */
30
if (!cpu_isar_feature(aa64_pauth, cpu)) {
24
+ VMSTATE_UINT32(env.v7m.aircr, ARMCPU),
31
- error_setg(errp, "'pauth' feature not supported by KVM on this host");
25
VMSTATE_END_OF_LIST()
32
+ error_setg(errp, "'pauth' feature not supported by %s on this host",
26
}
33
+ kvm_enabled() ? "KVM" : "hvf");
27
};
34
}
35
36
return;
37
@@ -XXX,XX +XXX,XX @@ void aarch64_add_pauth_properties(Object *obj)
38
39
/* Default to PAUTH on, with the architected algorithm on TCG. */
40
qdev_property_add_static(DEVICE(obj), &arm_cpu_pauth_property);
41
- if (kvm_enabled()) {
42
+ if (kvm_enabled() || hvf_enabled()) {
43
/*
44
* Mirror PAuth support from the probed sysregs back into the
45
- * property for KVM. Is it just a bit backward? Yes it is!
46
+ * property for KVM or hvf. Is it just a bit backward? Yes it is!
47
+ * Note that prop_pauth is true whether the host CPU supports the
48
+ * architected QARMA5 algorithm or the IMPDEF one. We don't
49
+ * provide the separate pauth-impdef property for KVM or hvf,
50
+ * only for TCG.
51
*/
52
cpu->prop_pauth = cpu_isar_feature(aa64_pauth, cpu);
53
} else {
54
@@ -XXX,XX +XXX,XX @@ static void aarch64_host_initfn(Object *obj)
55
#elif defined(CONFIG_HVF)
56
ARMCPU *cpu = ARM_CPU(obj);
57
hvf_arm_set_cpu_features_from_host(cpu);
58
+ aarch64_add_pauth_properties(obj);
59
#else
60
g_assert_not_reached();
61
#endif
28
--
62
--
29
2.16.1
63
2.25.1
30
64
31
65
diff view generated by jsdifflib
1
We were previously making the system control register (SCR)
1
Currently there is no way for a board model's Kconfig stanza to
2
just RAZ/WI. Although we don't implement the functionality
2
say "I have an i2c bus which the user can plug an i2c device into,
3
this register controls, we should at least provide the state,
3
build all the free-standing i2c devices". The Kconfig mechanism
4
including the banked state for v8M.
4
for this is the "device group". Add an I2C_DEVICES group along
5
the same lines as the existing PCI_DEVICES. Simple free-standing
6
i2c devices which a user might plausibly want to be able to
7
plug in on the QEMU commandline should have
8
default y if I2C_DEVICES
9
and board models which have an i2c bus that is user-accessible
10
should use
11
imply I2C_DEVICES
12
to cause those pluggable devices to be built.
13
14
In this commit we mark only a fairly conservative set of i2c devices
15
as belonging to the I2C_DEVICES group: the simple sensors and RTCs
16
(not including PMBus devices or devices which need GPIO lines to be
17
connected).
5
18
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
8
Message-id: 20180209165810.6668-7-peter.maydell@linaro.org
21
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
22
Reviewed-by: Hao Wu <wuhaotsh@google.com>
23
Message-id: 20220208155911.3408455-2-peter.maydell@linaro.org
9
---
24
---
10
target/arm/cpu.h | 7 +++++++
25
docs/devel/kconfig.rst | 8 ++++++--
11
hw/intc/armv7m_nvic.c | 12 ++++++++----
26
hw/i2c/Kconfig | 5 +++++
12
target/arm/machine.c | 12 ++++++++++++
27
hw/rtc/Kconfig | 2 ++
13
3 files changed, 27 insertions(+), 4 deletions(-)
28
hw/sensor/Kconfig | 5 +++++
29
4 files changed, 18 insertions(+), 2 deletions(-)
14
30
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
31
diff --git a/docs/devel/kconfig.rst b/docs/devel/kconfig.rst
16
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/cpu.h
33
--- a/docs/devel/kconfig.rst
18
+++ b/target/arm/cpu.h
34
+++ b/docs/devel/kconfig.rst
19
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
35
@@ -XXX,XX +XXX,XX @@ declares its dependencies in different ways:
20
uint32_t aircr; /* only holds r/w state if security extn implemented */
36
no directive and are not used in the Makefile either; they only appear
21
uint32_t secure; /* Is CPU in Secure state? (not guest visible) */
37
as conditions for ``default y`` directives.
22
uint32_t csselr[M_REG_NUM_BANKS];
38
23
+ uint32_t scr[M_REG_NUM_BANKS];
39
- QEMU currently has two device groups, ``PCI_DEVICES`` and
24
} v7m;
40
- ``TEST_DEVICES``. PCI devices usually have a ``default y if
25
41
+ QEMU currently has three device groups, ``PCI_DEVICES``, ``I2C_DEVICES``,
26
/* Information associated with an exception about to be taken:
42
+ and ``TEST_DEVICES``. PCI devices usually have a ``default y if
27
@@ -XXX,XX +XXX,XX @@ FIELD(V7M_CCR, STKALIGN, 9, 1)
43
PCI_DEVICES`` directive rather than just ``default y``. This lets
28
FIELD(V7M_CCR, DC, 16, 1)
44
some boards (notably s390) easily support a subset of PCI devices,
29
FIELD(V7M_CCR, IC, 17, 1)
45
for example only VFIO (passthrough) and virtio-pci devices.
30
46
+ ``I2C_DEVICES`` is similar to ``PCI_DEVICES``. It contains i2c devices
31
+/* V7M SCR bits */
47
+ that users might reasonably want to plug in to an i2c bus on any
32
+FIELD(V7M_SCR, SLEEPONEXIT, 1, 1)
48
+ board (and not ones which are very board-specific or that need
33
+FIELD(V7M_SCR, SLEEPDEEP, 2, 1)
49
+ to be wired up in a way that can't be done on the command line).
34
+FIELD(V7M_SCR, SLEEPDEEPS, 3, 1)
50
``TEST_DEVICES`` instead is used for devices that are rarely used on
35
+FIELD(V7M_SCR, SEVONPEND, 4, 1)
51
production virtual machines, but provide useful hooks to test QEMU
52
or KVM.
53
diff --git a/hw/i2c/Kconfig b/hw/i2c/Kconfig
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/i2c/Kconfig
56
+++ b/hw/i2c/Kconfig
57
@@ -XXX,XX +XXX,XX @@
58
config I2C
59
bool
60
61
+config I2C_DEVICES
62
+ # Device group for i2c devices which can reasonably be user-plugged
63
+ # to any board's i2c bus
64
+ bool
36
+
65
+
37
/* V7M AIRCR bits */
66
config SMBUS
38
FIELD(V7M_AIRCR, VECTRESET, 0, 1)
67
bool
39
FIELD(V7M_AIRCR, VECTCLRACTIVE, 1, 1)
68
select I2C
40
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
69
diff --git a/hw/rtc/Kconfig b/hw/rtc/Kconfig
41
index XXXXXXX..XXXXXXX 100644
70
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/intc/armv7m_nvic.c
71
--- a/hw/rtc/Kconfig
43
+++ b/hw/intc/armv7m_nvic.c
72
+++ b/hw/rtc/Kconfig
44
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
73
@@ -XXX,XX +XXX,XX @@
45
}
74
config DS1338
46
return val;
75
bool
47
case 0xd10: /* System Control. */
76
depends on I2C
48
- /* TODO: Implement SLEEPONEXIT. */
77
+ default y if I2C_DEVICES
49
- return 0;
78
50
+ return cpu->env.v7m.scr[attrs.secure];
79
config M41T80
51
case 0xd14: /* Configuration Control. */
80
bool
52
/* The BFHFNMIGN bit is the only non-banked bit; we
81
depends on I2C
53
* keep it in the non-secure copy of the register.
82
+ default y if I2C_DEVICES
54
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
83
55
}
84
config M48T59
56
break;
85
bool
57
case 0xd10: /* System Control. */
86
diff --git a/hw/sensor/Kconfig b/hw/sensor/Kconfig
58
- /* TODO: Implement control registers. */
59
- qemu_log_mask(LOG_UNIMP, "NVIC: SCR unimplemented\n");
60
+ /* We don't implement deep-sleep so these bits are RAZ/WI.
61
+ * The other bits in the register are banked.
62
+ * QEMU's implementation ignores SEVONPEND and SLEEPONEXIT, which
63
+ * is architecturally permitted.
64
+ */
65
+ value &= ~(R_V7M_SCR_SLEEPDEEP_MASK | R_V7M_SCR_SLEEPDEEPS_MASK);
66
+ cpu->env.v7m.scr[attrs.secure] = value;
67
break;
68
case 0xd14: /* Configuration Control. */
69
/* Enforce RAZ/WI on reserved and must-RAZ/WI bits */
70
diff --git a/target/arm/machine.c b/target/arm/machine.c
71
index XXXXXXX..XXXXXXX 100644
87
index XXXXXXX..XXXXXXX 100644
72
--- a/target/arm/machine.c
88
--- a/hw/sensor/Kconfig
73
+++ b/target/arm/machine.c
89
+++ b/hw/sensor/Kconfig
74
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_csselr = {
90
@@ -XXX,XX +XXX,XX @@
75
}
91
config TMP105
76
};
92
bool
77
93
depends on I2C
78
+static const VMStateDescription vmstate_m_scr = {
94
+ default y if I2C_DEVICES
79
+ .name = "cpu/m/scr",
95
80
+ .version_id = 1,
96
config TMP421
81
+ .minimum_version_id = 1,
97
bool
82
+ .fields = (VMStateField[]) {
98
depends on I2C
83
+ VMSTATE_UINT32(env.v7m.scr[M_REG_NS], ARMCPU),
99
+ default y if I2C_DEVICES
84
+ VMSTATE_END_OF_LIST()
100
85
+ }
101
config DPS310
86
+};
102
bool
87
+
103
depends on I2C
88
static const VMStateDescription vmstate_m = {
104
+ default y if I2C_DEVICES
89
.name = "cpu/m",
105
90
.version_id = 4,
106
config EMC141X
91
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
107
bool
92
.subsections = (const VMStateDescription*[]) {
108
depends on I2C
93
&vmstate_m_faultmask_primask,
109
+ default y if I2C_DEVICES
94
&vmstate_m_csselr,
110
95
+ &vmstate_m_scr,
111
config ADM1272
96
NULL
112
bool
97
}
113
@@ -XXX,XX +XXX,XX @@ config MAX34451
98
};
114
config LSM303DLHC_MAG
99
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
115
bool
100
VMSTATE_UINT32(env.sau.rnr, ARMCPU),
116
depends on I2C
101
VMSTATE_VALIDATE("SAU_RNR is valid", sau_rnr_vmstate_validate),
117
+ default y if I2C_DEVICES
102
VMSTATE_UINT32(env.sau.ctrl, ARMCPU),
103
+ VMSTATE_UINT32(env.v7m.scr[M_REG_S], ARMCPU),
104
VMSTATE_END_OF_LIST()
105
}
106
};
107
--
118
--
108
2.16.1
119
2.25.1
109
120
110
121
diff view generated by jsdifflib
1
In commit 50f11062d4c896 we added support for MSR/MRS access
1
For arm boards with an i2c bus which a user could reasonably
2
to the NS banked special registers, but we forgot to implement
2
want to plug arbitrary devices, add 'imply I2C_DEVICES' to the
3
the support for writing to CONTROL_NS. Correct the omission.
3
Kconfig stanza.
4
4
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
7
Message-id: 20180209165810.6668-8-peter.maydell@linaro.org
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Hao Wu <wuhaotsh@google.com>
9
Message-id: 20220208155911.3408455-3-peter.maydell@linaro.org
8
---
10
---
9
target/arm/helper.c | 10 ++++++++++
11
hw/arm/Kconfig | 10 ++++++++++
10
1 file changed, 10 insertions(+)
12
1 file changed, 10 insertions(+)
11
13
12
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/helper.c
16
--- a/hw/arm/Kconfig
15
+++ b/target/arm/helper.c
17
+++ b/hw/arm/Kconfig
16
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
18
@@ -XXX,XX +XXX,XX @@ config DIGIC
17
}
19
18
env->v7m.faultmask[M_REG_NS] = val & 1;
20
config EXYNOS4
19
return;
21
bool
20
+ case 0x94: /* CONTROL_NS */
22
+ imply I2C_DEVICES
21
+ if (!env->v7m.secure) {
23
select A9MPCORE
22
+ return;
24
select I2C
23
+ }
25
select LAN9118
24
+ write_v7m_control_spsel_for_secstate(env,
26
@@ -XXX,XX +XXX,XX @@ config REALVIEW
25
+ val & R_V7M_CONTROL_SPSEL_MASK,
27
bool
26
+ M_REG_NS);
28
imply PCI_DEVICES
27
+ env->v7m.control[M_REG_NS] &= ~R_V7M_CONTROL_NPRIV_MASK;
29
imply PCI_TESTDEV
28
+ env->v7m.control[M_REG_NS] |= val & R_V7M_CONTROL_NPRIV_MASK;
30
+ imply I2C_DEVICES
29
+ return;
31
select SMC91C111
30
case 0x98: /* SP_NS */
32
select LAN9118
31
{
33
select A9MPCORE
32
/* This gives the non-secure SP selected based on whether we're
34
@@ -XXX,XX +XXX,XX @@ config SABRELITE
35
36
config STELLARIS
37
bool
38
+ imply I2C_DEVICES
39
select ARM_V7M
40
select CMSDK_APB_WATCHDOG
41
select I2C
42
@@ -XXX,XX +XXX,XX @@ config NPCM7XX
43
44
config FSL_IMX25
45
bool
46
+ imply I2C_DEVICES
47
select IMX
48
select IMX_FEC
49
select IMX_I2C
50
@@ -XXX,XX +XXX,XX @@ config FSL_IMX25
51
52
config FSL_IMX31
53
bool
54
+ imply I2C_DEVICES
55
select SERIAL
56
select IMX
57
select IMX_I2C
58
@@ -XXX,XX +XXX,XX @@ config FSL_IMX31
59
60
config FSL_IMX6
61
bool
62
+ imply I2C_DEVICES
63
select A9MPCORE
64
select IMX
65
select IMX_FEC
66
@@ -XXX,XX +XXX,XX @@ config ASPEED_SOC
67
68
config MPS2
69
bool
70
+ imply I2C_DEVICES
71
select ARMSSE
72
select LAN9118
73
select MPS2_FPGAIO
74
@@ -XXX,XX +XXX,XX @@ config FSL_IMX7
75
bool
76
imply PCI_DEVICES
77
imply TEST_DEVICES
78
+ imply I2C_DEVICES
79
select A15MPCORE
80
select PCI
81
select IMX
82
@@ -XXX,XX +XXX,XX @@ config ARM_SMMUV3
83
84
config FSL_IMX6UL
85
bool
86
+ imply I2C_DEVICES
87
select A15MPCORE
88
select IMX
89
select IMX_FEC
90
@@ -XXX,XX +XXX,XX @@ config MICROBIT
91
92
config NRF51_SOC
93
bool
94
+ imply I2C_DEVICES
95
select I2C
96
select ARM_V7M
97
select UNIMP
33
--
98
--
34
2.16.1
99
2.25.1
35
100
36
101
diff view generated by jsdifflib
New patch
1
In the armv7m object, handle clock inputs that aren't connected.
2
This is always an error for 'cpuclk'. For 'refclk' it is OK for this
3
to be disconnected, but we need to handle it by not trying to connect
4
a sourceless-clock to the systick device.
1
5
6
This fixes a bug where on the mps2-an521 and similar boards (which
7
do not have a refclk) the systick device incorrectly reset with
8
SYST_CSR.CLKSOURCE 0 ("use refclk") rather than 1 ("use CPU clock").
9
10
Cc: qemu-stable@nongnu.org
11
Reported-by: Richard Petri <git@rpls.de>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20220208171643.3486277-1-peter.maydell@linaro.org
16
---
17
hw/arm/armv7m.c | 26 ++++++++++++++++++++++----
18
1 file changed, 22 insertions(+), 4 deletions(-)
19
20
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/armv7m.c
23
+++ b/hw/arm/armv7m.c
24
@@ -XXX,XX +XXX,XX @@ static void armv7m_realize(DeviceState *dev, Error **errp)
25
return;
26
}
27
28
+ /* cpuclk must be connected; refclk is optional */
29
+ if (!clock_has_source(s->cpuclk)) {
30
+ error_setg(errp, "armv7m: cpuclk must be connected");
31
+ return;
32
+ }
33
+
34
memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -1);
35
36
s->cpu = ARM_CPU(object_new_with_props(s->cpu_type, OBJECT(s), "cpu",
37
@@ -XXX,XX +XXX,XX @@ static void armv7m_realize(DeviceState *dev, Error **errp)
38
&s->sysreg_ns_mem);
39
}
40
41
- /* Create and map the systick devices */
42
- qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "refclk", s->refclk);
43
+ /*
44
+ * Create and map the systick devices. Note that we only connect
45
+ * refclk if it has been connected to us; otherwise the systick
46
+ * device gets the wrong answer for clock_has_source(refclk), because
47
+ * it has an immediate source (the ARMv7M's clock object) but not
48
+ * an ultimate source, and then it won't correctly auto-select the
49
+ * CPU clock as its only possible clock source.
50
+ */
51
+ if (clock_has_source(s->refclk)) {
52
+ qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "refclk",
53
+ s->refclk);
54
+ }
55
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "cpuclk", s->cpuclk);
56
if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {
57
return;
58
@@ -XXX,XX +XXX,XX @@ static void armv7m_realize(DeviceState *dev, Error **errp)
59
*/
60
object_initialize_child(OBJECT(dev), "systick-reg-s",
61
&s->systick[M_REG_S], TYPE_SYSTICK);
62
- qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "refclk",
63
- s->refclk);
64
+ if (clock_has_source(s->refclk)) {
65
+ qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "refclk",
66
+ s->refclk);
67
+ }
68
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "cpuclk",
69
s->cpuclk);
70
71
--
72
2.25.1
73
74
diff view generated by jsdifflib
1
The Coprocessor Power Control Register (CPPWR) is new in v8M.
1
The function qemu_madvise() and the QEMU_MADV_* constants associated
2
It allows software to control whether coprocessors are allowed
2
with it are used in only 10 files. Move them out of osdep.h to a new
3
to power down and lose their state. QEMU doesn't have any
3
qemu/madvise.h header that is included where it is needed.
4
notion of power control, so we choose the IMPDEF option of
5
making the whole register RAZ/WI (indicating that no coprocessors
6
can ever power down and lose state).
7
4
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180209165810.6668-5-peter.maydell@linaro.org
8
Message-id: 20220208200856.3558249-2-peter.maydell@linaro.org
11
---
9
---
12
hw/intc/armv7m_nvic.c | 14 ++++++++++++++
10
include/qemu/madvise.h | 95 ++++++++++++++++++++++++++++++++++++++
13
1 file changed, 14 insertions(+)
11
include/qemu/osdep.h | 82 --------------------------------
12
backends/hostmem-file.c | 1 +
13
backends/hostmem.c | 1 +
14
hw/virtio/virtio-balloon.c | 1 +
15
migration/postcopy-ram.c | 1 +
16
migration/qemu-file.c | 1 +
17
migration/ram.c | 1 +
18
softmmu/physmem.c | 1 +
19
tcg/region.c | 1 +
20
util/osdep.c | 1 +
21
util/oslib-posix.c | 1 +
22
12 files changed, 105 insertions(+), 82 deletions(-)
23
create mode 100644 include/qemu/madvise.h
14
24
15
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
25
diff --git a/include/qemu/madvise.h b/include/qemu/madvise.h
16
index XXXXXXX..XXXXXXX 100644
26
new file mode 100644
17
--- a/hw/intc/armv7m_nvic.c
27
index XXXXXXX..XXXXXXX
18
+++ b/hw/intc/armv7m_nvic.c
28
--- /dev/null
19
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
29
+++ b/include/qemu/madvise.h
20
switch (offset) {
30
@@ -XXX,XX +XXX,XX @@
21
case 4: /* Interrupt Control Type. */
31
+/*
22
return ((s->num_irq - NVIC_FIRST_IRQ) / 32) - 1;
32
+ * QEMU madvise wrapper functions
23
+ case 0xc: /* CPPWR */
33
+ *
24
+ if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
34
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
25
+ goto bad_offset;
35
+ * See the COPYING file in the top-level directory.
26
+ }
36
+ */
27
+ /* We make the IMPDEF choice that nothing can ever go into a
37
+
28
+ * non-retentive power state, which allows us to RAZ/WI this.
38
+#ifndef QEMU_MADVISE_H
29
+ */
39
+#define QEMU_MADVISE_H
30
+ return 0;
40
+
31
case 0x380 ... 0x3bf: /* NVIC_ITNS<n> */
41
+#define QEMU_MADV_INVALID -1
32
{
42
+
33
int startvec = 8 * (offset - 0x380) + NVIC_FIRST_IRQ;
43
+#if defined(CONFIG_MADVISE)
34
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
44
+
35
ARMCPU *cpu = s->cpu;
45
+#define QEMU_MADV_WILLNEED MADV_WILLNEED
36
46
+#define QEMU_MADV_DONTNEED MADV_DONTNEED
37
switch (offset) {
47
+#ifdef MADV_DONTFORK
38
+ case 0xc: /* CPPWR */
48
+#define QEMU_MADV_DONTFORK MADV_DONTFORK
39
+ if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
49
+#else
40
+ goto bad_offset;
50
+#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
41
+ }
51
+#endif
42
+ /* Make the IMPDEF choice to RAZ/WI this. */
52
+#ifdef MADV_MERGEABLE
43
+ break;
53
+#define QEMU_MADV_MERGEABLE MADV_MERGEABLE
44
case 0x380 ... 0x3bf: /* NVIC_ITNS<n> */
54
+#else
45
{
55
+#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
46
int startvec = 8 * (offset - 0x380) + NVIC_FIRST_IRQ;
56
+#endif
57
+#ifdef MADV_UNMERGEABLE
58
+#define QEMU_MADV_UNMERGEABLE MADV_UNMERGEABLE
59
+#else
60
+#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
61
+#endif
62
+#ifdef MADV_DODUMP
63
+#define QEMU_MADV_DODUMP MADV_DODUMP
64
+#else
65
+#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
66
+#endif
67
+#ifdef MADV_DONTDUMP
68
+#define QEMU_MADV_DONTDUMP MADV_DONTDUMP
69
+#else
70
+#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
71
+#endif
72
+#ifdef MADV_HUGEPAGE
73
+#define QEMU_MADV_HUGEPAGE MADV_HUGEPAGE
74
+#else
75
+#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
76
+#endif
77
+#ifdef MADV_NOHUGEPAGE
78
+#define QEMU_MADV_NOHUGEPAGE MADV_NOHUGEPAGE
79
+#else
80
+#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
81
+#endif
82
+#ifdef MADV_REMOVE
83
+#define QEMU_MADV_REMOVE MADV_REMOVE
84
+#else
85
+#define QEMU_MADV_REMOVE QEMU_MADV_DONTNEED
86
+#endif
87
+#ifdef MADV_POPULATE_WRITE
88
+#define QEMU_MADV_POPULATE_WRITE MADV_POPULATE_WRITE
89
+#else
90
+#define QEMU_MADV_POPULATE_WRITE QEMU_MADV_INVALID
91
+#endif
92
+
93
+#elif defined(CONFIG_POSIX_MADVISE)
94
+
95
+#define QEMU_MADV_WILLNEED POSIX_MADV_WILLNEED
96
+#define QEMU_MADV_DONTNEED POSIX_MADV_DONTNEED
97
+#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
98
+#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
99
+#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
100
+#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
101
+#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
102
+#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
103
+#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
104
+#define QEMU_MADV_REMOVE QEMU_MADV_DONTNEED
105
+#define QEMU_MADV_POPULATE_WRITE QEMU_MADV_INVALID
106
+
107
+#else /* no-op */
108
+
109
+#define QEMU_MADV_WILLNEED QEMU_MADV_INVALID
110
+#define QEMU_MADV_DONTNEED QEMU_MADV_INVALID
111
+#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
112
+#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
113
+#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
114
+#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
115
+#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
116
+#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
117
+#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
118
+#define QEMU_MADV_REMOVE QEMU_MADV_INVALID
119
+#define QEMU_MADV_POPULATE_WRITE QEMU_MADV_INVALID
120
+
121
+#endif
122
+
123
+int qemu_madvise(void *addr, size_t len, int advice);
124
+
125
+#endif
126
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
127
index XXXXXXX..XXXXXXX 100644
128
--- a/include/qemu/osdep.h
129
+++ b/include/qemu/osdep.h
130
@@ -XXX,XX +XXX,XX @@ static inline void qemu_cleanup_generic_vfree(void *p)
131
#define QEMU_MAP_NORESERVE (1 << 3)
132
133
134
-#define QEMU_MADV_INVALID -1
135
-
136
-#if defined(CONFIG_MADVISE)
137
-
138
-#define QEMU_MADV_WILLNEED MADV_WILLNEED
139
-#define QEMU_MADV_DONTNEED MADV_DONTNEED
140
-#ifdef MADV_DONTFORK
141
-#define QEMU_MADV_DONTFORK MADV_DONTFORK
142
-#else
143
-#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
144
-#endif
145
-#ifdef MADV_MERGEABLE
146
-#define QEMU_MADV_MERGEABLE MADV_MERGEABLE
147
-#else
148
-#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
149
-#endif
150
-#ifdef MADV_UNMERGEABLE
151
-#define QEMU_MADV_UNMERGEABLE MADV_UNMERGEABLE
152
-#else
153
-#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
154
-#endif
155
-#ifdef MADV_DODUMP
156
-#define QEMU_MADV_DODUMP MADV_DODUMP
157
-#else
158
-#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
159
-#endif
160
-#ifdef MADV_DONTDUMP
161
-#define QEMU_MADV_DONTDUMP MADV_DONTDUMP
162
-#else
163
-#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
164
-#endif
165
-#ifdef MADV_HUGEPAGE
166
-#define QEMU_MADV_HUGEPAGE MADV_HUGEPAGE
167
-#else
168
-#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
169
-#endif
170
-#ifdef MADV_NOHUGEPAGE
171
-#define QEMU_MADV_NOHUGEPAGE MADV_NOHUGEPAGE
172
-#else
173
-#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
174
-#endif
175
-#ifdef MADV_REMOVE
176
-#define QEMU_MADV_REMOVE MADV_REMOVE
177
-#else
178
-#define QEMU_MADV_REMOVE QEMU_MADV_DONTNEED
179
-#endif
180
-#ifdef MADV_POPULATE_WRITE
181
-#define QEMU_MADV_POPULATE_WRITE MADV_POPULATE_WRITE
182
-#else
183
-#define QEMU_MADV_POPULATE_WRITE QEMU_MADV_INVALID
184
-#endif
185
-
186
-#elif defined(CONFIG_POSIX_MADVISE)
187
-
188
-#define QEMU_MADV_WILLNEED POSIX_MADV_WILLNEED
189
-#define QEMU_MADV_DONTNEED POSIX_MADV_DONTNEED
190
-#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
191
-#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
192
-#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
193
-#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
194
-#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
195
-#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
196
-#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
197
-#define QEMU_MADV_REMOVE QEMU_MADV_DONTNEED
198
-#define QEMU_MADV_POPULATE_WRITE QEMU_MADV_INVALID
199
-
200
-#else /* no-op */
201
-
202
-#define QEMU_MADV_WILLNEED QEMU_MADV_INVALID
203
-#define QEMU_MADV_DONTNEED QEMU_MADV_INVALID
204
-#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
205
-#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
206
-#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
207
-#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
208
-#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
209
-#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
210
-#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
211
-#define QEMU_MADV_REMOVE QEMU_MADV_INVALID
212
-#define QEMU_MADV_POPULATE_WRITE QEMU_MADV_INVALID
213
-
214
-#endif
215
216
#ifdef _WIN32
217
#define HAVE_CHARDEV_SERIAL 1
218
@@ -XXX,XX +XXX,XX @@ void sigaction_invoke(struct sigaction *action,
219
struct qemu_signalfd_siginfo *info);
220
#endif
221
222
-int qemu_madvise(void *addr, size_t len, int advice);
223
int qemu_mprotect_rw(void *addr, size_t size);
224
int qemu_mprotect_rwx(void *addr, size_t size);
225
int qemu_mprotect_none(void *addr, size_t size);
226
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
227
index XXXXXXX..XXXXXXX 100644
228
--- a/backends/hostmem-file.c
229
+++ b/backends/hostmem-file.c
230
@@ -XXX,XX +XXX,XX @@
231
#include "qapi/error.h"
232
#include "qemu/error-report.h"
233
#include "qemu/module.h"
234
+#include "qemu/madvise.h"
235
#include "sysemu/hostmem.h"
236
#include "qom/object_interfaces.h"
237
#include "qom/object.h"
238
diff --git a/backends/hostmem.c b/backends/hostmem.c
239
index XXXXXXX..XXXXXXX 100644
240
--- a/backends/hostmem.c
241
+++ b/backends/hostmem.c
242
@@ -XXX,XX +XXX,XX @@
243
#include "qemu/config-file.h"
244
#include "qom/object_interfaces.h"
245
#include "qemu/mmap-alloc.h"
246
+#include "qemu/madvise.h"
247
248
#ifdef CONFIG_NUMA
249
#include <numaif.h>
250
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
251
index XXXXXXX..XXXXXXX 100644
252
--- a/hw/virtio/virtio-balloon.c
253
+++ b/hw/virtio/virtio-balloon.c
254
@@ -XXX,XX +XXX,XX @@
255
#include "qemu/iov.h"
256
#include "qemu/module.h"
257
#include "qemu/timer.h"
258
+#include "qemu/madvise.h"
259
#include "hw/virtio/virtio.h"
260
#include "hw/mem/pc-dimm.h"
261
#include "hw/qdev-properties.h"
262
diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c
263
index XXXXXXX..XXXXXXX 100644
264
--- a/migration/postcopy-ram.c
265
+++ b/migration/postcopy-ram.c
266
@@ -XXX,XX +XXX,XX @@
267
268
#include "qemu/osdep.h"
269
#include "qemu/rcu.h"
270
+#include "qemu/madvise.h"
271
#include "exec/target_page.h"
272
#include "migration.h"
273
#include "qemu-file.h"
274
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
275
index XXXXXXX..XXXXXXX 100644
276
--- a/migration/qemu-file.c
277
+++ b/migration/qemu-file.c
278
@@ -XXX,XX +XXX,XX @@
279
*/
280
#include "qemu/osdep.h"
281
#include <zlib.h>
282
+#include "qemu/madvise.h"
283
#include "qemu/error-report.h"
284
#include "qemu/iov.h"
285
#include "migration.h"
286
diff --git a/migration/ram.c b/migration/ram.c
287
index XXXXXXX..XXXXXXX 100644
288
--- a/migration/ram.c
289
+++ b/migration/ram.c
290
@@ -XXX,XX +XXX,XX @@
291
#include "qemu/cutils.h"
292
#include "qemu/bitops.h"
293
#include "qemu/bitmap.h"
294
+#include "qemu/madvise.h"
295
#include "qemu/main-loop.h"
296
#include "xbzrle.h"
297
#include "ram.h"
298
diff --git a/softmmu/physmem.c b/softmmu/physmem.c
299
index XXXXXXX..XXXXXXX 100644
300
--- a/softmmu/physmem.c
301
+++ b/softmmu/physmem.c
302
@@ -XXX,XX +XXX,XX @@
303
304
#include "qemu/cutils.h"
305
#include "qemu/cacheflush.h"
306
+#include "qemu/madvise.h"
307
308
#ifdef CONFIG_TCG
309
#include "hw/core/tcg-cpu-ops.h"
310
diff --git a/tcg/region.c b/tcg/region.c
311
index XXXXXXX..XXXXXXX 100644
312
--- a/tcg/region.c
313
+++ b/tcg/region.c
314
@@ -XXX,XX +XXX,XX @@
315
316
#include "qemu/osdep.h"
317
#include "qemu/units.h"
318
+#include "qemu/madvise.h"
319
#include "qapi/error.h"
320
#include "exec/exec-all.h"
321
#include "tcg/tcg.h"
322
diff --git a/util/osdep.c b/util/osdep.c
323
index XXXXXXX..XXXXXXX 100644
324
--- a/util/osdep.c
325
+++ b/util/osdep.c
326
@@ -XXX,XX +XXX,XX @@ extern int madvise(char *, size_t, int);
327
#include "qemu/cutils.h"
328
#include "qemu/sockets.h"
329
#include "qemu/error-report.h"
330
+#include "qemu/madvise.h"
331
#include "monitor/monitor.h"
332
333
static bool fips_enabled = false;
334
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
335
index XXXXXXX..XXXXXXX 100644
336
--- a/util/oslib-posix.c
337
+++ b/util/oslib-posix.c
338
@@ -XXX,XX +XXX,XX @@
339
#include "trace.h"
340
#include "qapi/error.h"
341
#include "qemu/error-report.h"
342
+#include "qemu/madvise.h"
343
#include "qemu/sockets.h"
344
#include "qemu/thread.h"
345
#include <libgen.h>
47
--
346
--
48
2.16.1
347
2.25.1
49
348
50
349
diff view generated by jsdifflib
1
In many of the NVIC registers relating to interrupts, we
1
The qemu_mprotect_*() family of functions are used in very few files;
2
have to convert from a byte offset within a register set
2
move them from osdep.h to a new qemu/mprotect.h.
3
into the number of the first interrupt which is affected.
4
We were getting this wrong for:
5
* reads of NVIC_ISPR<n>, NVIC_ISER<n>, NVIC_ICPR<n>, NVIC_ICER<n>,
6
NVIC_IABR<n> -- in all these cases we were missing the "* 8"
7
needed to convert from the byte offset to the interrupt number
8
(since all these registers use one bit per interrupt)
9
* writes of NVIC_IPR<n> had the opposite problem of a spurious
10
"* 8" (since these registers use one byte per interrupt)
11
3
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20180209165810.6668-9-peter.maydell@linaro.org
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220208200856.3558249-3-peter.maydell@linaro.org
15
---
8
---
16
hw/intc/armv7m_nvic.c | 8 ++++----
9
include/qemu/mprotect.h | 14 ++++++++++++++
17
1 file changed, 4 insertions(+), 4 deletions(-)
10
include/qemu/osdep.h | 4 ----
11
tcg/region.c | 1 +
12
util/osdep.c | 1 +
13
4 files changed, 16 insertions(+), 4 deletions(-)
14
create mode 100644 include/qemu/mprotect.h
18
15
19
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
16
diff --git a/include/qemu/mprotect.h b/include/qemu/mprotect.h
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/include/qemu/mprotect.h
21
@@ -XXX,XX +XXX,XX @@
22
+/*
23
+ * QEMU mprotect functions
24
+ *
25
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
26
+ * See the COPYING file in the top-level directory.
27
+ */
28
+#ifndef QEMU_MPROTECT_H
29
+#define QEMU_MPROTECT_H
30
+
31
+int qemu_mprotect_rw(void *addr, size_t size);
32
+int qemu_mprotect_rwx(void *addr, size_t size);
33
+int qemu_mprotect_none(void *addr, size_t size);
34
+
35
+#endif
36
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
20
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/intc/armv7m_nvic.c
38
--- a/include/qemu/osdep.h
22
+++ b/hw/intc/armv7m_nvic.c
39
+++ b/include/qemu/osdep.h
23
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_read(void *opaque, hwaddr addr,
40
@@ -XXX,XX +XXX,XX @@ void sigaction_invoke(struct sigaction *action,
24
/* fall through */
41
struct qemu_signalfd_siginfo *info);
25
case 0x180 ... 0x1bf: /* NVIC Clear enable */
42
#endif
26
val = 0;
43
27
- startvec = offset - 0x180 + NVIC_FIRST_IRQ; /* vector # */
44
-int qemu_mprotect_rw(void *addr, size_t size);
28
+ startvec = 8 * (offset - 0x180) + NVIC_FIRST_IRQ; /* vector # */
45
-int qemu_mprotect_rwx(void *addr, size_t size);
29
46
-int qemu_mprotect_none(void *addr, size_t size);
30
for (i = 0, end = size * 8; i < end && startvec + i < s->num_irq; i++) {
47
-
31
if (s->vectors[startvec + i].enabled &&
48
/*
32
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_read(void *opaque, hwaddr addr,
49
* Don't introduce new usage of this function, prefer the following
33
/* fall through */
50
* qemu_open/qemu_create that take an "Error **errp"
34
case 0x280 ... 0x2bf: /* NVIC Clear pend */
51
diff --git a/tcg/region.c b/tcg/region.c
35
val = 0;
52
index XXXXXXX..XXXXXXX 100644
36
- startvec = offset - 0x280 + NVIC_FIRST_IRQ; /* vector # */
53
--- a/tcg/region.c
37
+ startvec = 8 * (offset - 0x280) + NVIC_FIRST_IRQ; /* vector # */
54
+++ b/tcg/region.c
38
for (i = 0, end = size * 8; i < end && startvec + i < s->num_irq; i++) {
55
@@ -XXX,XX +XXX,XX @@
39
if (s->vectors[startvec + i].pending &&
56
#include "qemu/osdep.h"
40
(attrs.secure || s->itns[startvec + i])) {
57
#include "qemu/units.h"
41
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_read(void *opaque, hwaddr addr,
58
#include "qemu/madvise.h"
42
break;
59
+#include "qemu/mprotect.h"
43
case 0x300 ... 0x33f: /* NVIC Active */
60
#include "qapi/error.h"
44
val = 0;
61
#include "exec/exec-all.h"
45
- startvec = offset - 0x300 + NVIC_FIRST_IRQ; /* vector # */
62
#include "tcg/tcg.h"
46
+ startvec = 8 * (offset - 0x300) + NVIC_FIRST_IRQ; /* vector # */
63
diff --git a/util/osdep.c b/util/osdep.c
47
64
index XXXXXXX..XXXXXXX 100644
48
for (i = 0, end = size * 8; i < end && startvec + i < s->num_irq; i++) {
65
--- a/util/osdep.c
49
if (s->vectors[startvec + i].active &&
66
+++ b/util/osdep.c
50
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
67
@@ -XXX,XX +XXX,XX @@ extern int madvise(char *, size_t, int);
51
case 0x300 ... 0x33f: /* NVIC Active */
68
#include "qemu/sockets.h"
52
return MEMTX_OK; /* R/O */
69
#include "qemu/error-report.h"
53
case 0x400 ... 0x5ef: /* NVIC Priority */
70
#include "qemu/madvise.h"
54
- startvec = 8 * (offset - 0x400) + NVIC_FIRST_IRQ; /* vector # */
71
+#include "qemu/mprotect.h"
55
+ startvec = (offset - 0x400) + NVIC_FIRST_IRQ; /* vector # */
72
#include "monitor/monitor.h"
56
73
57
for (i = 0; i < size && startvec + i < s->num_irq; i++) {
74
static bool fips_enabled = false;
58
if (attrs.secure || s->itns[startvec + i]) {
59
--
75
--
60
2.16.1
76
2.25.1
61
77
62
78
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The QEMU_MAP_* constants are used only as arguments to the
2
qemu_ram_mmap() function. Move them to mmap-alloc.h, where that
3
function's prototype is defined.
2
4
3
(qemu) info mtree
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
address-space: cpu-memory-0
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
0000000000000000-ffffffffffffffff (prio 0, i/o): system
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
0000000000000000-0000000007ffffff (prio 0, rom): aspeed.boot_rom
8
Message-id: 20220208200856.3558249-4-peter.maydell@linaro.org
7
- 000000001e600000-000000001e7fffff (prio -1, i/o): aspeed_soc.io
9
---
8
+ 000000001e600000-000000001e7fffff (prio -1000, i/o): aspeed_soc.io
10
include/qemu/mmap-alloc.h | 23 +++++++++++++++++++++++
9
000000001e620000-000000001e6200ff (prio 0, i/o): aspeed.smc.ast2500-fmc
11
include/qemu/osdep.h | 25 -------------------------
10
000000001e630000-000000001e6300ff (prio 0, i/o): aspeed.smc.ast2500-spi1
12
2 files changed, 23 insertions(+), 25 deletions(-)
11
000000001e631000-000000001e6310ff (prio 0, i/o): aspeed.smc.ast2500-spi2
12
13
13
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
diff --git a/include/qemu/mmap-alloc.h b/include/qemu/mmap-alloc.h
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
15
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
16
Message-id: 20180209085755.30414-3-f4bug@amsat.org
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
19
include/hw/arm/aspeed_soc.h | 1 -
20
hw/arm/aspeed_soc.c | 32 +++-----------------------------
21
2 files changed, 3 insertions(+), 30 deletions(-)
22
23
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
24
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/arm/aspeed_soc.h
16
--- a/include/qemu/mmap-alloc.h
26
+++ b/include/hw/arm/aspeed_soc.h
17
+++ b/include/qemu/mmap-alloc.h
27
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCState {
18
@@ -XXX,XX +XXX,XX @@ void *qemu_ram_mmap(int fd,
28
19
29
/*< public >*/
20
void qemu_ram_munmap(int fd, void *ptr, size_t size);
30
ARMCPU cpu;
21
31
- MemoryRegion iomem;
22
+/*
32
MemoryRegion sram;
23
+ * Abstraction of PROT_ and MAP_ flags as passed to mmap(), for example,
33
AspeedVICState vic;
24
+ * consumed by qemu_ram_mmap().
34
AspeedTimerCtrlState timerctrl;
25
+ */
35
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
26
+
27
+/* Map PROT_READ instead of PROT_READ | PROT_WRITE. */
28
+#define QEMU_MAP_READONLY (1 << 0)
29
+
30
+/* Use MAP_SHARED instead of MAP_PRIVATE. */
31
+#define QEMU_MAP_SHARED (1 << 1)
32
+
33
+/*
34
+ * Use MAP_SYNC | MAP_SHARED_VALIDATE if supported. Ignored without
35
+ * QEMU_MAP_SHARED. If mapping fails, warn and fallback to !QEMU_MAP_SYNC.
36
+ */
37
+#define QEMU_MAP_SYNC (1 << 2)
38
+
39
+/*
40
+ * Use MAP_NORESERVE to skip reservation of swap space (or huge pages if
41
+ * applicable). Bail out if not supported/effective.
42
+ */
43
+#define QEMU_MAP_NORESERVE (1 << 3)
44
+
45
#endif
46
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
36
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
37
--- a/hw/arm/aspeed_soc.c
48
--- a/include/qemu/osdep.h
38
+++ b/hw/arm/aspeed_soc.c
49
+++ b/include/qemu/osdep.h
39
@@ -XXX,XX +XXX,XX @@
50
@@ -XXX,XX +XXX,XX @@ static inline void qemu_cleanup_generic_vfree(void *p)
40
#include "qemu-common.h"
51
*/
41
#include "cpu.h"
52
#define QEMU_AUTO_VFREE __attribute__((cleanup(qemu_cleanup_generic_vfree)))
42
#include "exec/address-spaces.h"
43
+#include "hw/misc/unimp.h"
44
#include "hw/arm/aspeed_soc.h"
45
#include "hw/char/serial.h"
46
#include "qemu/log.h"
47
@@ -XXX,XX +XXX,XX @@ static const AspeedSoCInfo aspeed_socs[] = {
48
},
49
};
50
53
51
-/*
54
-/*
52
- * IO handlers: simply catch any reads/writes to IO addresses that aren't
55
- * Abstraction of PROT_ and MAP_ flags as passed to mmap(), for example,
53
- * handled by a device mapping.
56
- * consumed by qemu_ram_mmap().
54
- */
57
- */
55
-
58
-
56
-static uint64_t aspeed_soc_io_read(void *p, hwaddr offset, unsigned size)
59
-/* Map PROT_READ instead of PROT_READ | PROT_WRITE. */
57
-{
60
-#define QEMU_MAP_READONLY (1 << 0)
58
- qemu_log_mask(LOG_UNIMP, "%s: 0x%" HWADDR_PRIx " [%u]\n",
59
- __func__, offset, size);
60
- return 0;
61
-}
62
-
61
-
63
-static void aspeed_soc_io_write(void *opaque, hwaddr offset, uint64_t value,
62
-/* Use MAP_SHARED instead of MAP_PRIVATE. */
64
- unsigned size)
63
-#define QEMU_MAP_SHARED (1 << 1)
65
-{
66
- qemu_log_mask(LOG_UNIMP, "%s: 0x%" HWADDR_PRIx " <- 0x%" PRIx64 " [%u]\n",
67
- __func__, offset, value, size);
68
-}
69
-
64
-
70
-static const MemoryRegionOps aspeed_soc_io_ops = {
65
-/*
71
- .read = aspeed_soc_io_read,
66
- * Use MAP_SYNC | MAP_SHARED_VALIDATE if supported. Ignored without
72
- .write = aspeed_soc_io_write,
67
- * QEMU_MAP_SHARED. If mapping fails, warn and fallback to !QEMU_MAP_SYNC.
73
- .endianness = DEVICE_LITTLE_ENDIAN,
68
- */
74
-};
69
-#define QEMU_MAP_SYNC (1 << 2)
75
-
70
-
76
static void aspeed_soc_init(Object *obj)
71
-/*
77
{
72
- * Use MAP_NORESERVE to skip reservation of swap space (or huge pages if
78
AspeedSoCState *s = ASPEED_SOC(obj);
73
- * applicable). Bail out if not supported/effective.
79
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
74
- */
80
Error *err = NULL, *local_err = NULL;
75
-#define QEMU_MAP_NORESERVE (1 << 3)
81
76
-
82
/* IO space */
77
-
83
- memory_region_init_io(&s->iomem, NULL, &aspeed_soc_io_ops, NULL,
78
-
84
- "aspeed_soc.io", ASPEED_SOC_IOMEM_SIZE);
79
#ifdef _WIN32
85
- memory_region_add_subregion_overlap(get_system_memory(),
80
#define HAVE_CHARDEV_SERIAL 1
86
- ASPEED_SOC_IOMEM_BASE, &s->iomem, -1);
81
#elif defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
87
+ create_unimplemented_device("aspeed_soc.io",
88
+ ASPEED_SOC_IOMEM_BASE, ASPEED_SOC_IOMEM_SIZE);
89
90
/* CPU */
91
object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
92
--
82
--
93
2.16.1
83
2.25.1
94
84
95
85
diff view generated by jsdifflib
1
For M profile cores, cache maintenance operations are done by
1
The qemu_icache_linesize, qemu_icache_linesize_log,
2
writing to special registers in the system register space.
2
qemu_dcache_linesize, and qemu_dcache_linesize_log variables are not
3
For QEMU, cache operations are always NOPs, since we don't
3
used in many files. Move them out of osdep.h to a new
4
implement the cache. Implementing these explicitly avoids
4
qemu/cacheinfo.h, and document them.
5
a spurious LOG_GUEST_ERROR when the guest uses them.
6
5
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180209165810.6668-4-peter.maydell@linaro.org
9
Message-id: 20220208200856.3558249-5-peter.maydell@linaro.org
10
---
10
---
11
hw/intc/armv7m_nvic.c | 12 ++++++++++++
11
include/qemu/cacheinfo.h | 21 +++++++++++++++++++++
12
1 file changed, 12 insertions(+)
12
include/qemu/osdep.h | 5 -----
13
accel/tcg/translate-all.c | 1 +
14
plugins/loader.c | 1 +
15
tcg/region.c | 1 +
16
tcg/tcg.c | 1 +
17
util/atomic64.c | 1 +
18
util/cacheflush.c | 1 +
19
util/cacheinfo.c | 1 +
20
9 files changed, 28 insertions(+), 5 deletions(-)
21
create mode 100644 include/qemu/cacheinfo.h
13
22
14
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
23
diff --git a/include/qemu/cacheinfo.h b/include/qemu/cacheinfo.h
24
new file mode 100644
25
index XXXXXXX..XXXXXXX
26
--- /dev/null
27
+++ b/include/qemu/cacheinfo.h
28
@@ -XXX,XX +XXX,XX @@
29
+/*
30
+ * QEMU host cacheinfo information
31
+ *
32
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
33
+ * See the COPYING file in the top-level directory.
34
+ */
35
+#ifndef QEMU_CACHEINFO_H
36
+#define QEMU_CACHEINFO_H
37
+
38
+/*
39
+ * These variables represent our best guess at the host icache and
40
+ * dcache sizes, expressed both as the size in bytes and as the
41
+ * base-2 log of the size in bytes. They are initialized at startup
42
+ * (via an attribute 'constructor' function).
43
+ */
44
+extern int qemu_icache_linesize;
45
+extern int qemu_icache_linesize_log;
46
+extern int qemu_dcache_linesize;
47
+extern int qemu_dcache_linesize_log;
48
+
49
+#endif
50
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
15
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/intc/armv7m_nvic.c
52
--- a/include/qemu/osdep.h
17
+++ b/hw/intc/armv7m_nvic.c
53
+++ b/include/qemu/osdep.h
18
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
54
@@ -XXX,XX +XXX,XX @@ pid_t qemu_fork(Error **errp);
19
}
55
extern uintptr_t qemu_real_host_page_size;
20
break;
56
extern intptr_t qemu_real_host_page_mask;
21
}
57
22
+ case 0xf50: /* ICIALLU */
58
-extern int qemu_icache_linesize;
23
+ case 0xf58: /* ICIMVAU */
59
-extern int qemu_icache_linesize_log;
24
+ case 0xf5c: /* DCIMVAC */
60
-extern int qemu_dcache_linesize;
25
+ case 0xf60: /* DCISW */
61
-extern int qemu_dcache_linesize_log;
26
+ case 0xf64: /* DCCMVAU */
62
-
27
+ case 0xf68: /* DCCMVAC */
63
/*
28
+ case 0xf6c: /* DCCSW */
64
* After using getopt or getopt_long, if you need to parse another set
29
+ case 0xf70: /* DCCIMVAC */
65
* of options, then you must reset optind. Unfortunately the way to
30
+ case 0xf74: /* DCCISW */
66
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
31
+ case 0xf78: /* BPIALL */
67
index XXXXXXX..XXXXXXX 100644
32
+ /* Cache and branch predictor maintenance: for QEMU these always NOP */
68
--- a/accel/tcg/translate-all.c
33
+ break;
69
+++ b/accel/tcg/translate-all.c
34
default:
70
@@ -XXX,XX +XXX,XX @@
35
bad_offset:
71
#include "qemu/qemu-print.h"
36
qemu_log_mask(LOG_GUEST_ERROR,
72
#include "qemu/timer.h"
73
#include "qemu/main-loop.h"
74
+#include "qemu/cacheinfo.h"
75
#include "exec/log.h"
76
#include "sysemu/cpus.h"
77
#include "sysemu/cpu-timers.h"
78
diff --git a/plugins/loader.c b/plugins/loader.c
79
index XXXXXXX..XXXXXXX 100644
80
--- a/plugins/loader.c
81
+++ b/plugins/loader.c
82
@@ -XXX,XX +XXX,XX @@
83
#include "qemu/rcu_queue.h"
84
#include "qemu/qht.h"
85
#include "qemu/bitmap.h"
86
+#include "qemu/cacheinfo.h"
87
#include "qemu/xxhash.h"
88
#include "qemu/plugin.h"
89
#include "hw/core/cpu.h"
90
diff --git a/tcg/region.c b/tcg/region.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/tcg/region.c
93
+++ b/tcg/region.c
94
@@ -XXX,XX +XXX,XX @@
95
#include "qemu/units.h"
96
#include "qemu/madvise.h"
97
#include "qemu/mprotect.h"
98
+#include "qemu/cacheinfo.h"
99
#include "qapi/error.h"
100
#include "exec/exec-all.h"
101
#include "tcg/tcg.h"
102
diff --git a/tcg/tcg.c b/tcg/tcg.c
103
index XXXXXXX..XXXXXXX 100644
104
--- a/tcg/tcg.c
105
+++ b/tcg/tcg.c
106
@@ -XXX,XX +XXX,XX @@
107
#include "qemu/qemu-print.h"
108
#include "qemu/timer.h"
109
#include "qemu/cacheflush.h"
110
+#include "qemu/cacheinfo.h"
111
112
/* Note: the long term plan is to reduce the dependencies on the QEMU
113
CPU definitions. Currently they are used for qemu_ld/st
114
diff --git a/util/atomic64.c b/util/atomic64.c
115
index XXXXXXX..XXXXXXX 100644
116
--- a/util/atomic64.c
117
+++ b/util/atomic64.c
118
@@ -XXX,XX +XXX,XX @@
119
#include "qemu/osdep.h"
120
#include "qemu/atomic.h"
121
#include "qemu/thread.h"
122
+#include "qemu/cacheinfo.h"
123
124
#ifdef CONFIG_ATOMIC64
125
#error This file must only be compiled if !CONFIG_ATOMIC64
126
diff --git a/util/cacheflush.c b/util/cacheflush.c
127
index XXXXXXX..XXXXXXX 100644
128
--- a/util/cacheflush.c
129
+++ b/util/cacheflush.c
130
@@ -XXX,XX +XXX,XX @@
131
132
#include "qemu/osdep.h"
133
#include "qemu/cacheflush.h"
134
+#include "qemu/cacheinfo.h"
135
#include "qemu/bitops.h"
136
137
138
diff --git a/util/cacheinfo.c b/util/cacheinfo.c
139
index XXXXXXX..XXXXXXX 100644
140
--- a/util/cacheinfo.c
141
+++ b/util/cacheinfo.c
142
@@ -XXX,XX +XXX,XX @@
143
#include "qemu/osdep.h"
144
#include "qemu/host-utils.h"
145
#include "qemu/atomic.h"
146
+#include "qemu/cacheinfo.h"
147
148
int qemu_icache_linesize = 0;
149
int qemu_icache_linesize_log;
37
--
150
--
38
2.16.1
151
2.25.1
39
152
40
153
diff view generated by jsdifflib
1
The PENDNMISET/CLR bits in the ICSR should be RAZ/WI from
1
The "hardware version" machinery (qemu_set_hw_version(),
2
NonSecure state if the AIRCR.BFHFNMINS bit is zero. We had
2
qemu_hw_version(), and the QEMU_HW_VERSION define) is used by fewer
3
misimplemented this as making the bits RAZ/WI from both
3
than 10 files. Move it out from osdep.h into a new
4
Secure and NonSecure states. Fix this bug by checking
4
qemu/hw-version.h.
5
attrs.secure so that Secure code can pend and unpend NMIs.
6
5
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180209165810.6668-3-peter.maydell@linaro.org
9
Message-id: 20220208200856.3558249-6-peter.maydell@linaro.org
10
---
10
---
11
hw/intc/armv7m_nvic.c | 6 +++---
11
include/qemu/hw-version.h | 27 +++++++++++++++++++++++++++
12
1 file changed, 3 insertions(+), 3 deletions(-)
12
include/qemu/osdep.h | 16 ----------------
13
hw/arm/nseries.c | 1 +
14
hw/ide/core.c | 1 +
15
hw/scsi/megasas.c | 1 +
16
hw/scsi/scsi-bus.c | 1 +
17
hw/scsi/scsi-disk.c | 1 +
18
softmmu/vl.c | 1 +
19
target/i386/cpu.c | 1 +
20
target/s390x/cpu_models.c | 1 +
21
util/osdep.c | 1 +
22
11 files changed, 36 insertions(+), 16 deletions(-)
23
create mode 100644 include/qemu/hw-version.h
13
24
14
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
25
diff --git a/include/qemu/hw-version.h b/include/qemu/hw-version.h
26
new file mode 100644
27
index XXXXXXX..XXXXXXX
28
--- /dev/null
29
+++ b/include/qemu/hw-version.h
30
@@ -XXX,XX +XXX,XX @@
31
+/*
32
+ * QEMU "hardware version" machinery
33
+ *
34
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
35
+ * See the COPYING file in the top-level directory.
36
+ */
37
+#ifndef QEMU_HW_VERSION_H
38
+#define QEMU_HW_VERSION_H
39
+
40
+/*
41
+ * Starting on QEMU 2.5, qemu_hw_version() returns "2.5+" by default
42
+ * instead of QEMU_VERSION, so setting hw_version on MachineClass
43
+ * is no longer mandatory.
44
+ *
45
+ * Do NOT change this string, or it will break compatibility on all
46
+ * machine classes that don't set hw_version.
47
+ */
48
+#define QEMU_HW_VERSION "2.5+"
49
+
50
+/* QEMU "hardware version" setting. Used to replace code that exposed
51
+ * QEMU_VERSION to guests in the past and need to keep compatibility.
52
+ * Do not use qemu_hw_version() in new code.
53
+ */
54
+void qemu_set_hw_version(const char *);
55
+const char *qemu_hw_version(void);
56
+
57
+#endif
58
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
15
index XXXXXXX..XXXXXXX 100644
59
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/intc/armv7m_nvic.c
60
--- a/include/qemu/osdep.h
17
+++ b/hw/intc/armv7m_nvic.c
61
+++ b/include/qemu/osdep.h
18
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
62
@@ -XXX,XX +XXX,XX @@ static inline void qemu_timersub(const struct timeval *val1,
19
}
63
20
}
64
void qemu_set_cloexec(int fd);
21
/* NMIPENDSET */
65
22
- if ((cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK) &&
66
-/* Starting on QEMU 2.5, qemu_hw_version() returns "2.5+" by default
23
- s->vectors[ARMV7M_EXCP_NMI].pending) {
67
- * instead of QEMU_VERSION, so setting hw_version on MachineClass
24
+ if ((attrs.secure || (cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK))
68
- * is no longer mandatory.
25
+ && s->vectors[ARMV7M_EXCP_NMI].pending) {
69
- *
26
val |= (1 << 31);
70
- * Do NOT change this string, or it will break compatibility on all
27
}
71
- * machine classes that don't set hw_version.
28
/* ISRPREEMPT: RES0 when halting debug not implemented */
72
- */
29
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
73
-#define QEMU_HW_VERSION "2.5+"
30
break;
74
-
31
}
75
-/* QEMU "hardware version" setting. Used to replace code that exposed
32
case 0xd04: /* Interrupt Control State (ICSR) */
76
- * QEMU_VERSION to guests in the past and need to keep compatibility.
33
- if (cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK) {
77
- * Do not use qemu_hw_version() in new code.
34
+ if (attrs.secure || cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK) {
78
- */
35
if (value & (1 << 31)) {
79
-void qemu_set_hw_version(const char *);
36
armv7m_nvic_set_pending(s, ARMV7M_EXCP_NMI, false);
80
-const char *qemu_hw_version(void);
37
} else if (value & (1 << 30) &&
81
-
82
void fips_set_state(bool requested);
83
bool fips_get_state(void);
84
85
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/hw/arm/nseries.c
88
+++ b/hw/arm/nseries.c
89
@@ -XXX,XX +XXX,XX @@
90
#include "chardev/char.h"
91
#include "qemu/cutils.h"
92
#include "qemu/bswap.h"
93
+#include "qemu/hw-version.h"
94
#include "sysemu/reset.h"
95
#include "sysemu/runstate.h"
96
#include "sysemu/sysemu.h"
97
diff --git a/hw/ide/core.c b/hw/ide/core.c
98
index XXXXXXX..XXXXXXX 100644
99
--- a/hw/ide/core.c
100
+++ b/hw/ide/core.c
101
@@ -XXX,XX +XXX,XX @@
102
#include "qemu/error-report.h"
103
#include "qemu/main-loop.h"
104
#include "qemu/timer.h"
105
+#include "qemu/hw-version.h"
106
#include "sysemu/sysemu.h"
107
#include "sysemu/blockdev.h"
108
#include "sysemu/dma.h"
109
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
110
index XXXXXXX..XXXXXXX 100644
111
--- a/hw/scsi/megasas.c
112
+++ b/hw/scsi/megasas.c
113
@@ -XXX,XX +XXX,XX @@
114
#include "hw/pci/msix.h"
115
#include "qemu/iov.h"
116
#include "qemu/module.h"
117
+#include "qemu/hw-version.h"
118
#include "hw/scsi/scsi.h"
119
#include "scsi/constants.h"
120
#include "trace.h"
121
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/hw/scsi/scsi-bus.c
124
+++ b/hw/scsi/scsi-bus.c
125
@@ -XXX,XX +XXX,XX @@
126
#include "qemu/error-report.h"
127
#include "qemu/module.h"
128
#include "qemu/option.h"
129
+#include "qemu/hw-version.h"
130
#include "hw/qdev-properties.h"
131
#include "hw/scsi/scsi.h"
132
#include "migration/qemu-file-types.h"
133
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
134
index XXXXXXX..XXXXXXX 100644
135
--- a/hw/scsi/scsi-disk.c
136
+++ b/hw/scsi/scsi-disk.c
137
@@ -XXX,XX +XXX,XX @@
138
#include "qemu/error-report.h"
139
#include "qemu/main-loop.h"
140
#include "qemu/module.h"
141
+#include "qemu/hw-version.h"
142
#include "hw/scsi/scsi.h"
143
#include "migration/qemu-file-types.h"
144
#include "migration/vmstate.h"
145
diff --git a/softmmu/vl.c b/softmmu/vl.c
146
index XXXXXXX..XXXXXXX 100644
147
--- a/softmmu/vl.c
148
+++ b/softmmu/vl.c
149
@@ -XXX,XX +XXX,XX @@
150
#include "qemu-version.h"
151
#include "qemu/cutils.h"
152
#include "qemu/help_option.h"
153
+#include "qemu/hw-version.h"
154
#include "qemu/uuid.h"
155
#include "sysemu/reset.h"
156
#include "sysemu/runstate.h"
157
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
158
index XXXXXXX..XXXXXXX 100644
159
--- a/target/i386/cpu.c
160
+++ b/target/i386/cpu.c
161
@@ -XXX,XX +XXX,XX @@
162
#include "qemu/units.h"
163
#include "qemu/cutils.h"
164
#include "qemu/qemu-print.h"
165
+#include "qemu/hw-version.h"
166
#include "cpu.h"
167
#include "tcg/helper-tcg.h"
168
#include "sysemu/reset.h"
169
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
170
index XXXXXXX..XXXXXXX 100644
171
--- a/target/s390x/cpu_models.c
172
+++ b/target/s390x/cpu_models.c
173
@@ -XXX,XX +XXX,XX @@
174
#include "qapi/error.h"
175
#include "qapi/visitor.h"
176
#include "qemu/module.h"
177
+#include "qemu/hw-version.h"
178
#include "qemu/qemu-print.h"
179
#ifndef CONFIG_USER_ONLY
180
#include "sysemu/sysemu.h"
181
diff --git a/util/osdep.c b/util/osdep.c
182
index XXXXXXX..XXXXXXX 100644
183
--- a/util/osdep.c
184
+++ b/util/osdep.c
185
@@ -XXX,XX +XXX,XX @@ extern int madvise(char *, size_t, int);
186
#include "qemu/error-report.h"
187
#include "qemu/madvise.h"
188
#include "qemu/mprotect.h"
189
+#include "qemu/hw-version.h"
190
#include "monitor/monitor.h"
191
192
static bool fips_enabled = false;
38
--
193
--
39
2.16.1
194
2.25.1
40
195
41
196
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Akihiko Odaki <akihiko.odaki@gmail.com>
2
2
3
Nothing in either register affects the TB.
3
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
4
4
Reviewed-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20180211205848.4568-4-richard.henderson@linaro.org
6
Message-id: 20220213021215.1974-1-akihiko.odaki@gmail.com
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
8
---
10
target/arm/helper.c | 4 ++--
9
MAINTAINERS | 2 ++
11
1 file changed, 2 insertions(+), 2 deletions(-)
10
1 file changed, 2 insertions(+)
12
11
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
12
diff --git a/MAINTAINERS b/MAINTAINERS
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
14
--- a/MAINTAINERS
16
+++ b/target/arm/helper.c
15
+++ b/MAINTAINERS
17
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
16
@@ -XXX,XX +XXX,XX @@ F: audio/alsaaudio.c
18
.writefn = aa64_daif_write, .resetfn = arm_cp_reset_ignore },
17
Core Audio framework backend
19
{ .name = "FPCR", .state = ARM_CP_STATE_AA64,
18
M: Gerd Hoffmann <kraxel@redhat.com>
20
.opc0 = 3, .opc1 = 3, .opc2 = 0, .crn = 4, .crm = 4,
19
R: Christian Schoenebeck <qemu_oss@crudebyte.com>
21
- .access = PL0_RW, .type = ARM_CP_FPU,
20
+R: Akihiko Odaki <akihiko.odaki@gmail.com>
22
+ .access = PL0_RW, .type = ARM_CP_FPU | ARM_CP_SUPPRESS_TB_END,
21
S: Odd Fixes
23
.readfn = aa64_fpcr_read, .writefn = aa64_fpcr_write },
22
F: audio/coreaudio.c
24
{ .name = "FPSR", .state = ARM_CP_STATE_AA64,
23
25
.opc0 = 3, .opc1 = 3, .opc2 = 1, .crn = 4, .crm = 4,
24
@@ -XXX,XX +XXX,XX @@ F: util/drm.c
26
- .access = PL0_RW, .type = ARM_CP_FPU,
25
27
+ .access = PL0_RW, .type = ARM_CP_FPU | ARM_CP_SUPPRESS_TB_END,
26
Cocoa graphics
28
.readfn = aa64_fpsr_read, .writefn = aa64_fpsr_write },
27
M: Peter Maydell <peter.maydell@linaro.org>
29
{ .name = "DCZID_EL0", .state = ARM_CP_STATE_AA64,
28
+R: Akihiko Odaki <akihiko.odaki@gmail.com>
30
.opc0 = 3, .opc1 = 3, .opc2 = 7, .crn = 0, .crm = 0,
29
S: Odd Fixes
30
F: ui/cocoa.m
31
31
--
32
--
32
2.16.1
33
2.25.1
33
34
34
35
diff view generated by jsdifflib
1
M profile cores have a similar setup for cache ID registers
1
From: Pavel Dovgalyuk <pavel.dovgalyuk@ispras.ru>
2
to A profile:
3
* Cache Level ID Register (CLIDR) is a fixed value
4
* Cache Type Register (CTR) is a fixed value
5
* Cache Size ID Registers (CCSIDR) are a bank of registers;
6
which one you see is selected by the Cache Size Selection
7
Register (CSSELR)
8
2
9
The only difference is that they're in the NVIC memory mapped
3
A9 gtimer includes global control field and number of per-cpu fields.
10
register space rather than being coprocessor registers.
4
But only per-cpu ones are migrated. This patch adds a subsection for
11
Implement the M profile view of them.
5
global control field migration.
12
6
13
Since neither Cortex-M3 nor Cortex-M4 implement caches,
7
Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru>
14
we don't need to update their init functions and can leave
8
Message-id: 164422345976.2186660.1104517592452494510.stgit@pasha-ThinkPad-X280
15
the ctr/clidr/ccsidr[] fields in their ARMCPU structs at zero.
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Newer cores (like the Cortex-M33) will want to be able to
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
set these ID registers to non-zero values, though.
11
---
12
hw/timer/a9gtimer.c | 21 +++++++++++++++++++++
13
1 file changed, 21 insertions(+)
18
14
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
diff --git a/hw/timer/a9gtimer.c b/hw/timer/a9gtimer.c
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Message-id: 20180209165810.6668-6-peter.maydell@linaro.org
22
---
23
target/arm/cpu.h | 26 ++++++++++++++++++++++++++
24
hw/intc/armv7m_nvic.c | 16 ++++++++++++++++
25
target/arm/machine.c | 36 ++++++++++++++++++++++++++++++++++++
26
3 files changed, 78 insertions(+)
27
28
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
29
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/cpu.h
17
--- a/hw/timer/a9gtimer.c
31
+++ b/target/arm/cpu.h
18
+++ b/hw/timer/a9gtimer.c
32
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
19
@@ -XXX,XX +XXX,XX @@ static void a9_gtimer_realize(DeviceState *dev, Error **errp)
33
uint32_t faultmask[M_REG_NUM_BANKS];
34
uint32_t aircr; /* only holds r/w state if security extn implemented */
35
uint32_t secure; /* Is CPU in Secure state? (not guest visible) */
36
+ uint32_t csselr[M_REG_NUM_BANKS];
37
} v7m;
38
39
/* Information associated with an exception about to be taken:
40
@@ -XXX,XX +XXX,XX @@ FIELD(V7M_MPU_CTRL, ENABLE, 0, 1)
41
FIELD(V7M_MPU_CTRL, HFNMIENA, 1, 1)
42
FIELD(V7M_MPU_CTRL, PRIVDEFENA, 2, 1)
43
44
+/* v7M CLIDR bits */
45
+FIELD(V7M_CLIDR, CTYPE_ALL, 0, 21)
46
+FIELD(V7M_CLIDR, LOUIS, 21, 3)
47
+FIELD(V7M_CLIDR, LOC, 24, 3)
48
+FIELD(V7M_CLIDR, LOUU, 27, 3)
49
+FIELD(V7M_CLIDR, ICB, 30, 2)
50
+
51
+FIELD(V7M_CSSELR, IND, 0, 1)
52
+FIELD(V7M_CSSELR, LEVEL, 1, 3)
53
+/* We use the combination of InD and Level to index into cpu->ccsidr[];
54
+ * define a mask for this and check that it doesn't permit running off
55
+ * the end of the array.
56
+ */
57
+FIELD(V7M_CSSELR, INDEX, 0, 4)
58
+
59
+QEMU_BUILD_BUG_ON(ARRAY_SIZE(((ARMCPU *)0)->ccsidr) <= R_V7M_CSSELR_INDEX_MASK);
60
+
61
/* If adding a feature bit which corresponds to a Linux ELF
62
* HWCAP bit, remember to update the feature-bit-to-hwcap
63
* mapping in linux-user/elfload.c:get_elf_hwcap().
64
@@ -XXX,XX +XXX,XX @@ static inline int arm_debug_target_el(CPUARMState *env)
65
}
20
}
66
}
21
}
67
22
68
+static inline bool arm_v7m_csselr_razwi(ARMCPU *cpu)
23
+static bool vmstate_a9_gtimer_control_needed(void *opaque)
69
+{
24
+{
70
+ /* If all the CLIDR.Ctypem bits are 0 there are no caches, and
25
+ A9GTimerState *s = opaque;
71
+ * CSSELR is RAZ/WI.
26
+ return s->control != 0;
72
+ */
73
+ return (cpu->clidr & R_V7M_CLIDR_CTYPE_ALL_MASK) != 0;
74
+}
27
+}
75
+
28
+
76
static inline bool aa64_generate_debug_exceptions(CPUARMState *env)
29
static const VMStateDescription vmstate_a9_gtimer_per_cpu = {
77
{
30
.name = "arm.cortex-a9-global-timer.percpu",
78
if (arm_is_secure(env)) {
31
.version_id = 1,
79
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
32
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_a9_gtimer_per_cpu = {
80
index XXXXXXX..XXXXXXX 100644
81
--- a/hw/intc/armv7m_nvic.c
82
+++ b/hw/intc/armv7m_nvic.c
83
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
84
return cpu->id_isar4;
85
case 0xd74: /* ISAR5. */
86
return cpu->id_isar5;
87
+ case 0xd78: /* CLIDR */
88
+ return cpu->clidr;
89
+ case 0xd7c: /* CTR */
90
+ return cpu->ctr;
91
+ case 0xd80: /* CSSIDR */
92
+ {
93
+ int idx = cpu->env.v7m.csselr[attrs.secure] & R_V7M_CSSELR_INDEX_MASK;
94
+ return cpu->ccsidr[idx];
95
+ }
96
+ case 0xd84: /* CSSELR */
97
+ return cpu->env.v7m.csselr[attrs.secure];
98
/* TODO: Implement debug registers. */
99
case 0xd90: /* MPU_TYPE */
100
/* Unified MPU; if the MPU is not present this value is zero */
101
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
102
qemu_log_mask(LOG_UNIMP,
103
"NVIC: Aux fault status registers unimplemented\n");
104
break;
105
+ case 0xd84: /* CSSELR */
106
+ if (!arm_v7m_csselr_razwi(cpu)) {
107
+ cpu->env.v7m.csselr[attrs.secure] = value & R_V7M_CSSELR_INDEX_MASK;
108
+ }
109
+ break;
110
case 0xd90: /* MPU_TYPE */
111
return; /* RO */
112
case 0xd94: /* MPU_CTRL */
113
diff --git a/target/arm/machine.c b/target/arm/machine.c
114
index XXXXXXX..XXXXXXX 100644
115
--- a/target/arm/machine.c
116
+++ b/target/arm/machine.c
117
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_faultmask_primask = {
118
}
33
}
119
};
34
};
120
35
121
+/* CSSELR is in a subsection because we didn't implement it previously.
36
+static const VMStateDescription vmstate_a9_gtimer_control = {
122
+ * Migration from an old implementation will leave it at zero, which
37
+ .name = "arm.cortex-a9-global-timer.control",
123
+ * is OK since the only CPUs in the old implementation make the
124
+ * register RAZ/WI.
125
+ * Since there was no version of QEMU which implemented the CSSELR for
126
+ * just non-secure, we transfer both banks here rather than putting
127
+ * the secure banked version in the m-security subsection.
128
+ */
129
+static bool csselr_vmstate_validate(void *opaque, int version_id)
130
+{
131
+ ARMCPU *cpu = opaque;
132
+
133
+ return cpu->env.v7m.csselr[M_REG_NS] <= R_V7M_CSSELR_INDEX_MASK
134
+ && cpu->env.v7m.csselr[M_REG_S] <= R_V7M_CSSELR_INDEX_MASK;
135
+}
136
+
137
+static bool m_csselr_needed(void *opaque)
138
+{
139
+ ARMCPU *cpu = opaque;
140
+
141
+ return !arm_v7m_csselr_razwi(cpu);
142
+}
143
+
144
+static const VMStateDescription vmstate_m_csselr = {
145
+ .name = "cpu/m/csselr",
146
+ .version_id = 1,
38
+ .version_id = 1,
147
+ .minimum_version_id = 1,
39
+ .minimum_version_id = 1,
148
+ .needed = m_csselr_needed,
40
+ .needed = vmstate_a9_gtimer_control_needed,
149
+ .fields = (VMStateField[]) {
41
+ .fields = (VMStateField[]) {
150
+ VMSTATE_UINT32_ARRAY(env.v7m.csselr, ARMCPU, M_REG_NUM_BANKS),
42
+ VMSTATE_UINT32(control, A9GTimerState),
151
+ VMSTATE_VALIDATE("CSSELR is valid", csselr_vmstate_validate),
152
+ VMSTATE_END_OF_LIST()
43
+ VMSTATE_END_OF_LIST()
153
+ }
44
+ }
154
+};
45
+};
155
+
46
+
156
static const VMStateDescription vmstate_m = {
47
static const VMStateDescription vmstate_a9_gtimer = {
157
.name = "cpu/m",
48
.name = "arm.cortex-a9-global-timer",
158
.version_id = 4,
49
.version_id = 1,
159
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
50
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_a9_gtimer = {
160
},
51
1, vmstate_a9_gtimer_per_cpu,
161
.subsections = (const VMStateDescription*[]) {
52
A9GTimerPerCPU),
162
&vmstate_m_faultmask_primask,
53
VMSTATE_END_OF_LIST()
163
+ &vmstate_m_csselr,
54
+ },
164
NULL
55
+ .subsections = (const VMStateDescription*[]) {
56
+ &vmstate_a9_gtimer_control,
57
+ NULL
165
}
58
}
166
};
59
};
60
167
--
61
--
168
2.16.1
62
2.25.1
169
63
170
64
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Patrick Venture <venture@google.com>
2
2
3
This also makes sure that we get the correct ordering of
3
This is the BMC attached to the OpenBMC Mori board.
4
SVE vs FP exceptions.
5
4
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Patrick Venture <venture@google.com>
7
Message-id: 20180211205848.4568-5-richard.henderson@linaro.org
6
Reviewed-by: Chris Rauer <crauer@google.com>
7
Reviewed-by: Ilkyun Choi <ikchoi@google.com>
8
Message-id: 20220208233104.284425-1-venture@google.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
target/arm/cpu.h | 3 ++-
12
docs/system/arm/nuvoton.rst | 1 +
12
target/arm/internals.h | 6 ++++++
13
hw/arm/npcm7xx_boards.c | 32 ++++++++++++++++++++++++++++++++
13
target/arm/helper.c | 22 ++++------------------
14
2 files changed, 33 insertions(+)
14
target/arm/translate-a64.c | 16 ++++++++++++++++
15
4 files changed, 28 insertions(+), 19 deletions(-)
16
15
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
diff --git a/docs/system/arm/nuvoton.rst b/docs/system/arm/nuvoton.rst
18
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
18
--- a/docs/system/arm/nuvoton.rst
20
+++ b/target/arm/cpu.h
19
+++ b/docs/system/arm/nuvoton.rst
21
@@ -XXX,XX +XXX,XX @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
20
@@ -XXX,XX +XXX,XX @@ Hyperscale applications. The following machines are based on this chip :
22
#define ARM_CP_DC_ZVA (ARM_CP_SPECIAL | 0x0500)
21
- ``quanta-gbs-bmc`` Quanta GBS server BMC
23
#define ARM_LAST_SPECIAL ARM_CP_DC_ZVA
22
- ``quanta-gsj`` Quanta GSJ server BMC
24
#define ARM_CP_FPU 0x1000
23
- ``kudo-bmc`` Fii USA Kudo server BMC
25
+#define ARM_CP_SVE 0x2000
24
+- ``mori-bmc`` Fii USA Mori server BMC
26
/* Used only as a terminator for ARMCPRegInfo lists */
25
27
#define ARM_CP_SENTINEL 0xffff
26
There are also two more SoCs, NPCM710 and NPCM705, which are single-core
28
/* Mask of only the flag bits in a type field */
27
variants of NPCM750 and NPCM730, respectively. These are currently not
29
-#define ARM_CP_FLAG_MASK 0x10ff
28
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
30
+#define ARM_CP_FLAG_MASK 0x30ff
31
32
/* Valid values for ARMCPRegInfo state field, indicating which of
33
* the AArch32 and AArch64 execution states this register is visible in.
34
diff --git a/target/arm/internals.h b/target/arm/internals.h
35
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/internals.h
30
--- a/hw/arm/npcm7xx_boards.c
37
+++ b/target/arm/internals.h
31
+++ b/hw/arm/npcm7xx_boards.c
38
@@ -XXX,XX +XXX,XX @@ enum arm_exception_class {
32
@@ -XXX,XX +XXX,XX @@
39
EC_AA64_HVC = 0x16,
33
#define QUANTA_GSJ_POWER_ON_STRAPS 0x00001fff
40
EC_AA64_SMC = 0x17,
34
#define QUANTA_GBS_POWER_ON_STRAPS 0x000017ff
41
EC_SYSTEMREGISTERTRAP = 0x18,
35
#define KUDO_BMC_POWER_ON_STRAPS 0x00001fff
42
+ EC_SVEACCESSTRAP = 0x19,
36
+#define MORI_BMC_POWER_ON_STRAPS 0x00001fff
43
EC_INSNABORT = 0x20,
37
44
EC_INSNABORT_SAME_EL = 0x21,
38
static const char npcm7xx_default_bootrom[] = "npcm7xx_bootrom.bin";
45
EC_PCALIGNMENT = 0x22,
39
46
@@ -XXX,XX +XXX,XX @@ static inline uint32_t syn_fp_access_trap(int cv, int cond, bool is_16bit)
40
@@ -XXX,XX +XXX,XX @@ static void kudo_bmc_init(MachineState *machine)
47
| (cv << 24) | (cond << 20);
41
npcm7xx_load_kernel(machine, soc);
48
}
42
}
49
43
50
+static inline uint32_t syn_sve_access_trap(void)
44
+static void mori_bmc_init(MachineState *machine)
51
+{
45
+{
52
+ return EC_SVEACCESSTRAP << ARM_EL_EC_SHIFT;
46
+ NPCM7xxState *soc;
47
+
48
+ soc = npcm7xx_create_soc(machine, MORI_BMC_POWER_ON_STRAPS);
49
+ npcm7xx_connect_dram(soc, machine->ram);
50
+ qdev_realize(DEVICE(soc), NULL, &error_fatal);
51
+
52
+ npcm7xx_load_bootrom(machine, soc);
53
+ npcm7xx_connect_flash(&soc->fiu[1], 0, "mx66u51235f",
54
+ drive_get(IF_MTD, 3, 0));
55
+
56
+ npcm7xx_load_kernel(machine, soc);
53
+}
57
+}
54
+
58
+
55
static inline uint32_t syn_insn_abort(int same_el, int ea, int s1ptw, int fsc)
59
static void npcm7xx_set_soc_type(NPCM7xxMachineClass *nmc, const char *type)
56
{
60
{
57
return (EC_INSNABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
61
NPCM7xxClass *sc = NPCM7XX_CLASS(object_class_by_name(type));
58
diff --git a/target/arm/helper.c b/target/arm/helper.c
62
@@ -XXX,XX +XXX,XX @@ static void kudo_bmc_machine_class_init(ObjectClass *oc, void *data)
59
index XXXXXXX..XXXXXXX 100644
63
mc->default_ram_size = 1 * GiB;
60
--- a/target/arm/helper.c
61
+++ b/target/arm/helper.c
62
@@ -XXX,XX +XXX,XX @@ static int sve_exception_el(CPUARMState *env)
63
return 0;
64
}
65
66
-static CPAccessResult zcr_access(CPUARMState *env, const ARMCPRegInfo *ri,
67
- bool isread)
68
-{
69
- switch (sve_exception_el(env)) {
70
- case 3:
71
- return CP_ACCESS_TRAP_EL3;
72
- case 2:
73
- return CP_ACCESS_TRAP_EL2;
74
- case 1:
75
- return CP_ACCESS_TRAP;
76
- }
77
- return CP_ACCESS_OK;
78
-}
79
-
80
static void zcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
81
uint64_t value)
82
{
83
@@ -XXX,XX +XXX,XX @@ static void zcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
84
static const ARMCPRegInfo zcr_el1_reginfo = {
85
.name = "ZCR_EL1", .state = ARM_CP_STATE_AA64,
86
.opc0 = 3, .opc1 = 0, .crn = 1, .crm = 2, .opc2 = 0,
87
- .access = PL1_RW, .accessfn = zcr_access,
88
+ .access = PL1_RW, .type = ARM_CP_SVE | ARM_CP_FPU,
89
.fieldoffset = offsetof(CPUARMState, vfp.zcr_el[1]),
90
.writefn = zcr_write, .raw_writefn = raw_write
91
};
64
};
92
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo zcr_el1_reginfo = {
65
93
static const ARMCPRegInfo zcr_el2_reginfo = {
66
+static void mori_bmc_machine_class_init(ObjectClass *oc, void *data)
94
.name = "ZCR_EL2", .state = ARM_CP_STATE_AA64,
95
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 2, .opc2 = 0,
96
- .access = PL2_RW, .accessfn = zcr_access,
97
+ .access = PL2_RW, .type = ARM_CP_SVE | ARM_CP_FPU,
98
.fieldoffset = offsetof(CPUARMState, vfp.zcr_el[2]),
99
.writefn = zcr_write, .raw_writefn = raw_write
100
};
101
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo zcr_el2_reginfo = {
102
static const ARMCPRegInfo zcr_no_el2_reginfo = {
103
.name = "ZCR_EL2", .state = ARM_CP_STATE_AA64,
104
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 2, .opc2 = 0,
105
- .access = PL2_RW,
106
+ .access = PL2_RW, .type = ARM_CP_SVE | ARM_CP_FPU,
107
.readfn = arm_cp_read_zero, .writefn = arm_cp_write_ignore
108
};
109
110
static const ARMCPRegInfo zcr_el3_reginfo = {
111
.name = "ZCR_EL3", .state = ARM_CP_STATE_AA64,
112
.opc0 = 3, .opc1 = 6, .crn = 1, .crm = 2, .opc2 = 0,
113
- .access = PL3_RW, .accessfn = zcr_access,
114
+ .access = PL3_RW, .type = ARM_CP_SVE | ARM_CP_FPU,
115
.fieldoffset = offsetof(CPUARMState, vfp.zcr_el[3]),
116
.writefn = zcr_write, .raw_writefn = raw_write
117
};
118
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
119
index XXXXXXX..XXXXXXX 100644
120
--- a/target/arm/translate-a64.c
121
+++ b/target/arm/translate-a64.c
122
@@ -XXX,XX +XXX,XX @@ static inline bool fp_access_check(DisasContext *s)
123
return false;
124
}
125
126
+/* Check that SVE access is enabled. If it is, return true.
127
+ * If not, emit code to generate an appropriate exception and return false.
128
+ */
129
+static inline bool sve_access_check(DisasContext *s)
130
+{
67
+{
131
+ if (s->sve_excp_el) {
68
+ NPCM7xxMachineClass *nmc = NPCM7XX_MACHINE_CLASS(oc);
132
+ gen_exception_insn(s, 4, EXCP_UDEF, syn_sve_access_trap(),
69
+ MachineClass *mc = MACHINE_CLASS(oc);
133
+ s->sve_excp_el);
70
+
134
+ return false;
71
+ npcm7xx_set_soc_type(nmc, TYPE_NPCM730);
135
+ }
72
+
136
+ return true;
73
+ mc->desc = "Mori BMC (Cortex-A9)";
74
+ mc->init = mori_bmc_init;
75
+ mc->default_ram_size = 1 * GiB;
137
+}
76
+}
138
+
77
+
139
/*
78
static const TypeInfo npcm7xx_machine_types[] = {
140
* This utility function is for doing register extension with an
79
{
141
* optional shift. You will likely want to pass a temporary for the
80
.name = TYPE_NPCM7XX_MACHINE,
142
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
81
@@ -XXX,XX +XXX,XX @@ static const TypeInfo npcm7xx_machine_types[] = {
143
default:
82
.name = MACHINE_TYPE_NAME("kudo-bmc"),
144
break;
83
.parent = TYPE_NPCM7XX_MACHINE,
145
}
84
.class_init = kudo_bmc_machine_class_init,
146
+ if ((ri->type & ARM_CP_SVE) && !sve_access_check(s)) {
85
+ }, {
147
+ return;
86
+ .name = MACHINE_TYPE_NAME("mori-bmc"),
148
+ }
87
+ .parent = TYPE_NPCM7XX_MACHINE,
149
if ((ri->type & ARM_CP_FPU) && !fp_access_check(s)) {
88
+ .class_init = mori_bmc_machine_class_init,
150
return;
89
},
151
}
90
};
91
152
--
92
--
153
2.16.1
93
2.25.1
154
94
155
95
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
(qemu) info mtree
3
setAllowedFileTypes is deprecated in macOS 12.
4
address-space: cpu-memory-0
5
0000000000000000-ffffffffffffffff (prio 0, i/o): system
6
0000000000000000-0000000007ffffff (prio 0, rom): aspeed.boot_rom
7
000000001e600000-000000001e7fffff (prio -1, i/o): aspeed_soc.io
8
- 000000001e784000-000000001e78401f (prio 0, i/o): serial
9
000000001e620000-000000001e6200ff (prio 0, i/o): aspeed.smc.ast2500-fmc
10
000000001e630000-000000001e6300ff (prio 0, i/o): aspeed.smc.ast2500-spi1
11
[...]
12
000000001e720000-000000001e728fff (prio 0, ram): aspeed.sram
13
000000001e782000-000000001e782fff (prio 0, i/o): aspeed.timer
14
+ 000000001e784000-000000001e78401f (prio 0, i/o): serial
15
000000001e785000-000000001e78501f (prio 0, i/o): aspeed.wdt
16
000000001e785020-000000001e78503f (prio 0, i/o): aspeed.wdt
17
4
5
Per Akihiko Odaki [*]:
6
7
An image file, which is being chosen by the panel, can be a
8
raw file and have a variety of file extensions and many are not
9
covered by the provided list (e.g. "udf"). Other platforms like
10
GTK can provide an option to open a file with an extension not
11
listed, but Cocoa can't. It forces the user to rename the file
12
to give an extension in the list. Moreover, Cocoa does not tell
13
which extensions are in the list so the user needs to read the
14
source code, which is pretty bad.
15
16
Since this code is harming the usability rather than improving it,
17
simply remove the [NSSavePanel allowedFileTypes:] call, fixing:
18
19
[2789/6622] Compiling Objective-C object libcommon.fa.p/ui_cocoa.m.o
20
ui/cocoa.m:1411:16: error: 'setAllowedFileTypes:' is deprecated: first deprecated in macOS 12.0 - Use -allowedContentTypes instead [-Werror,-Wdeprecated-declarations]
21
[openPanel setAllowedFileTypes: supportedImageFileTypes];
22
^
23
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSSavePanel.h:215:49: note: property 'allowedFileTypes' is declared deprecated here
24
@property (nullable, copy) NSArray<NSString *> *allowedFileTypes API_DEPRECATED("Use -allowedContentTypes instead", macos(10.3,12.0));
25
^
26
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSSavePanel.h:215:49: note: 'setAllowedFileTypes:' has been explicitly marked deprecated here
27
FAILED: libcommon.fa.p/ui_cocoa.m.o
28
29
[*] https://lore.kernel.org/qemu-devel/4dde2e66-63cb-4390-9538-c032310db3e3@gmail.com/
30
31
Suggested-by: Akihiko Odaki <akihiko.odaki@gmail.com>
32
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
33
Tested-by: Roman Bolshakov <r.bolshakov@yadro.com>
34
Reviewed-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
18
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
35
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Reviewed-by: Cédric Le Goater <clg@kaod.org>
36
Message-id: 20220215080307.69550-11-f4bug@amsat.org
20
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
37
Reviewed by: Cameron Esfahani <dirty@apple.com>
21
Message-id: 20180209085755.30414-2-f4bug@amsat.org
38
Reviewed-by: Akihiko Odaki <akihiko.odaki@gmail.com>
39
Tested-by: Akihiko Odaki <akihiko.odaki@gmail.com>
40
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
---
42
---
24
hw/arm/aspeed_soc.c | 3 ++-
43
ui/cocoa.m | 6 ------
25
1 file changed, 2 insertions(+), 1 deletion(-)
44
1 file changed, 6 deletions(-)
26
45
27
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
46
diff --git a/ui/cocoa.m b/ui/cocoa.m
28
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/aspeed_soc.c
48
--- a/ui/cocoa.m
30
+++ b/hw/arm/aspeed_soc.c
49
+++ b/ui/cocoa.m
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
50
@@ -XXX,XX +XXX,XX @@ static int gArgc;
32
/* UART - attach an 8250 to the IO space as our UART5 */
51
static char **gArgv;
33
if (serial_hds[0]) {
52
static bool stretch_video;
34
qemu_irq uart5 = qdev_get_gpio_in(DEVICE(&s->vic), uart_irqs[4]);
53
static NSTextField *pauseLabel;
35
- serial_mm_init(&s->iomem, ASPEED_SOC_UART_5_BASE, 2,
54
-static NSArray * supportedImageFileTypes;
36
+ serial_mm_init(get_system_memory(),
55
37
+ ASPEED_SOC_IOMEM_BASE + ASPEED_SOC_UART_5_BASE, 2,
56
static QemuSemaphore display_init_sem;
38
uart5, 38400, serial_hds[0], DEVICE_LITTLE_ENDIAN);
57
static QemuSemaphore app_started_sem;
58
@@ -XXX,XX +XXX,XX @@ QemuCocoaView *cocoaView;
59
[pauseLabel setTextColor: [NSColor blackColor]];
60
[pauseLabel sizeToFit];
61
62
- // set the supported image file types that can be opened
63
- supportedImageFileTypes = [NSArray arrayWithObjects: @"img", @"iso", @"dmg",
64
- @"qcow", @"qcow2", @"cloop", @"vmdk", @"cdr",
65
- @"toast", nil];
66
[self make_about_window];
39
}
67
}
40
68
return self;
69
@@ -XXX,XX +XXX,XX @@ QemuCocoaView *cocoaView;
70
openPanel = [NSOpenPanel openPanel];
71
[openPanel setCanChooseFiles: YES];
72
[openPanel setAllowsMultipleSelection: NO];
73
- [openPanel setAllowedFileTypes: supportedImageFileTypes];
74
if([openPanel runModal] == NSModalResponseOK) {
75
NSString * file = [[[openPanel URLs] objectAtIndex: 0] path];
76
if(file == nil) {
41
--
77
--
42
2.16.1
78
2.25.1
43
79
44
80
diff view generated by jsdifflib
1
From: Pekka Enberg <penberg@iki.fi>
1
From: Akihiko Odaki <akihiko.odaki@gmail.com>
2
2
3
This patch adds a "cpu-type" property to BCM2836 SoC in preparation for
3
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
4
reusing the code for the Raspberry Pi 3, which has a different processor
4
Message-id: 20220215080307.69550-13-f4bug@amsat.org
5
model.
5
Message-Id: <20220213021418.2155-1-akihiko.odaki@gmail.com>
6
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Pekka Enberg <penberg@iki.fi>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
8
---
11
include/hw/arm/bcm2836.h | 1 +
9
ui/cocoa.m | 5 -----
12
hw/arm/bcm2836.c | 17 +++++++++--------
10
1 file changed, 5 deletions(-)
13
hw/arm/raspi.c | 3 +++
14
3 files changed, 13 insertions(+), 8 deletions(-)
15
11
16
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
12
diff --git a/ui/cocoa.m b/ui/cocoa.m
17
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/bcm2836.h
14
--- a/ui/cocoa.m
19
+++ b/include/hw/arm/bcm2836.h
15
+++ b/ui/cocoa.m
20
@@ -XXX,XX +XXX,XX @@ typedef struct BCM2836State {
16
@@ -XXX,XX +XXX,XX @@ static void addRemovableDevicesMenuItems(void)
21
DeviceState parent_obj;
17
22
/*< public >*/
18
currentDevice = qmp_query_block(NULL);
23
19
pointerToFree = currentDevice;
24
+ char *cpu_type;
20
- if(currentDevice == NULL) {
25
uint32_t enabled_cpus;
21
- NSBeep();
26
22
- QEMU_Alert(@"Failed to query for block devices!");
27
ARMCPU cpus[BCM2836_NCPUS];
23
- return;
28
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/arm/bcm2836.c
31
+++ b/hw/arm/bcm2836.c
32
@@ -XXX,XX +XXX,XX @@
33
static void bcm2836_init(Object *obj)
34
{
35
BCM2836State *s = BCM2836(obj);
36
- int n;
37
-
38
- for (n = 0; n < BCM2836_NCPUS; n++) {
39
- object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
40
- "cortex-a15-" TYPE_ARM_CPU);
41
- object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
42
- &error_abort);
43
- }
24
- }
44
25
45
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
26
menu = [[[NSApp mainMenu] itemWithTitle:@"Machine"] submenu];
46
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
27
47
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
48
49
/* common peripherals from bcm2835 */
50
51
+ obj = OBJECT(dev);
52
+ for (n = 0; n < BCM2836_NCPUS; n++) {
53
+ object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
54
+ s->cpu_type);
55
+ object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
56
+ &error_abort);
57
+ }
58
+
59
obj = object_property_get_link(OBJECT(dev), "ram", &err);
60
if (obj == NULL) {
61
error_setg(errp, "%s: required ram link not found: %s",
62
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
63
}
64
65
static Property bcm2836_props[] = {
66
+ DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
67
DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
68
DEFINE_PROP_END_OF_LIST()
69
};
70
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
71
index XXXXXXX..XXXXXXX 100644
72
--- a/hw/arm/raspi.c
73
+++ b/hw/arm/raspi.c
74
@@ -XXX,XX +XXX,XX @@ static void raspi2_init(MachineState *machine)
75
/* Setup the SOC */
76
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
77
&error_abort);
78
+ object_property_set_str(OBJECT(&s->soc), machine->cpu_type, "cpu-type",
79
+ &error_abort);
80
object_property_set_int(OBJECT(&s->soc), smp_cpus, "enabled-cpus",
81
&error_abort);
82
object_property_set_int(OBJECT(&s->soc), 0xa21041, "board-rev",
83
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
84
mc->no_parallel = 1;
85
mc->no_floppy = 1;
86
mc->no_cdrom = 1;
87
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
88
mc->max_cpus = BCM2836_NCPUS;
89
mc->min_cpus = BCM2836_NCPUS;
90
mc->default_cpus = BCM2836_NCPUS;
91
--
28
--
92
2.16.1
29
2.25.1
93
30
94
31
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Akihiko Odaki <akihiko.odaki@gmail.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
4
Message-id: 20180211205848.4568-3-richard.henderson@linaro.org
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220215080307.69550-14-f4bug@amsat.org
6
Message-Id: <20220213021329.2066-1-akihiko.odaki@gmail.com>
7
[PMD: Use g_autofree, suggested by Zoltan BALATON]
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/cpu.h | 35 ++++++++++++++++++-----------------
11
ui/cocoa.m | 4 +++-
9
target/arm/helper.c | 6 ++++--
12
1 file changed, 3 insertions(+), 1 deletion(-)
10
target/arm/translate-a64.c | 3 +++
11
3 files changed, 25 insertions(+), 19 deletions(-)
12
13
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
diff --git a/ui/cocoa.m b/ui/cocoa.m
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu.h
16
--- a/ui/cocoa.m
16
+++ b/target/arm/cpu.h
17
+++ b/ui/cocoa.m
17
@@ -XXX,XX +XXX,XX @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
18
@@ -XXX,XX +XXX,XX @@ static void create_initial_menus(void)
19
/* Returns a name for a given console */
20
static NSString * getConsoleName(QemuConsole * console)
21
{
22
- return [NSString stringWithFormat: @"%s", qemu_console_get_label(console)];
23
+ g_autofree char *label = qemu_console_get_label(console);
24
+
25
+ return [NSString stringWithUTF8String:label];
18
}
26
}
19
27
20
/* ARMCPRegInfo type field bits. If the SPECIAL bit is set this is a
28
/* Add an entry to the View menu for each console */
21
- * special-behaviour cp reg and bits [15..8] indicate what behaviour
22
+ * special-behaviour cp reg and bits [11..8] indicate what behaviour
23
* it has. Otherwise it is a simple cp reg, where CONST indicates that
24
* TCG can assume the value to be constant (ie load at translate time)
25
* and 64BIT indicates a 64 bit wide coprocessor register. SUPPRESS_TB_END
26
@@ -XXX,XX +XXX,XX @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
27
* need to be surrounded by gen_io_start()/gen_io_end(). In particular,
28
* registers which implement clocks or timers require this.
29
*/
30
-#define ARM_CP_SPECIAL 1
31
-#define ARM_CP_CONST 2
32
-#define ARM_CP_64BIT 4
33
-#define ARM_CP_SUPPRESS_TB_END 8
34
-#define ARM_CP_OVERRIDE 16
35
-#define ARM_CP_ALIAS 32
36
-#define ARM_CP_IO 64
37
-#define ARM_CP_NO_RAW 128
38
-#define ARM_CP_NOP (ARM_CP_SPECIAL | (1 << 8))
39
-#define ARM_CP_WFI (ARM_CP_SPECIAL | (2 << 8))
40
-#define ARM_CP_NZCV (ARM_CP_SPECIAL | (3 << 8))
41
-#define ARM_CP_CURRENTEL (ARM_CP_SPECIAL | (4 << 8))
42
-#define ARM_CP_DC_ZVA (ARM_CP_SPECIAL | (5 << 8))
43
-#define ARM_LAST_SPECIAL ARM_CP_DC_ZVA
44
+#define ARM_CP_SPECIAL 0x0001
45
+#define ARM_CP_CONST 0x0002
46
+#define ARM_CP_64BIT 0x0004
47
+#define ARM_CP_SUPPRESS_TB_END 0x0008
48
+#define ARM_CP_OVERRIDE 0x0010
49
+#define ARM_CP_ALIAS 0x0020
50
+#define ARM_CP_IO 0x0040
51
+#define ARM_CP_NO_RAW 0x0080
52
+#define ARM_CP_NOP (ARM_CP_SPECIAL | 0x0100)
53
+#define ARM_CP_WFI (ARM_CP_SPECIAL | 0x0200)
54
+#define ARM_CP_NZCV (ARM_CP_SPECIAL | 0x0300)
55
+#define ARM_CP_CURRENTEL (ARM_CP_SPECIAL | 0x0400)
56
+#define ARM_CP_DC_ZVA (ARM_CP_SPECIAL | 0x0500)
57
+#define ARM_LAST_SPECIAL ARM_CP_DC_ZVA
58
+#define ARM_CP_FPU 0x1000
59
/* Used only as a terminator for ARMCPRegInfo lists */
60
-#define ARM_CP_SENTINEL 0xffff
61
+#define ARM_CP_SENTINEL 0xffff
62
/* Mask of only the flag bits in a type field */
63
-#define ARM_CP_FLAG_MASK 0xff
64
+#define ARM_CP_FLAG_MASK 0x10ff
65
66
/* Valid values for ARMCPRegInfo state field, indicating which of
67
* the AArch32 and AArch64 execution states this register is visible in.
68
diff --git a/target/arm/helper.c b/target/arm/helper.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/target/arm/helper.c
71
+++ b/target/arm/helper.c
72
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
73
.writefn = aa64_daif_write, .resetfn = arm_cp_reset_ignore },
74
{ .name = "FPCR", .state = ARM_CP_STATE_AA64,
75
.opc0 = 3, .opc1 = 3, .opc2 = 0, .crn = 4, .crm = 4,
76
- .access = PL0_RW, .readfn = aa64_fpcr_read, .writefn = aa64_fpcr_write },
77
+ .access = PL0_RW, .type = ARM_CP_FPU,
78
+ .readfn = aa64_fpcr_read, .writefn = aa64_fpcr_write },
79
{ .name = "FPSR", .state = ARM_CP_STATE_AA64,
80
.opc0 = 3, .opc1 = 3, .opc2 = 1, .crn = 4, .crm = 4,
81
- .access = PL0_RW, .readfn = aa64_fpsr_read, .writefn = aa64_fpsr_write },
82
+ .access = PL0_RW, .type = ARM_CP_FPU,
83
+ .readfn = aa64_fpsr_read, .writefn = aa64_fpsr_write },
84
{ .name = "DCZID_EL0", .state = ARM_CP_STATE_AA64,
85
.opc0 = 3, .opc1 = 3, .opc2 = 7, .crn = 0, .crm = 0,
86
.access = PL0_R, .type = ARM_CP_NO_RAW,
87
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
88
index XXXXXXX..XXXXXXX 100644
89
--- a/target/arm/translate-a64.c
90
+++ b/target/arm/translate-a64.c
91
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
92
default:
93
break;
94
}
95
+ if ((ri->type & ARM_CP_FPU) && !fp_access_check(s)) {
96
+ return;
97
+ }
98
99
if ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) && (ri->type & ARM_CP_IO)) {
100
gen_io_start();
101
--
29
--
102
2.16.1
30
2.25.1
103
31
104
32
diff view generated by jsdifflib