1
Another lump of target-arm patches. I still have some patches in
1
A largish pullreq but it's almost all docs fixes.
2
my to-review queue, but this is a big enough set that I wanted
3
to send it out.
4
2
5
thanks
6
-- PMM
3
-- PMM
7
4
8
The following changes since commit 04bb7fe2bf55bdf66d5b7a5a719b40bbb4048178:
5
The following changes since commit 10a3c4a4b3e14208cfed274514d1911e5230935f:
9
6
10
Merge remote-tracking branch 'remotes/rth/tags/pull-tcg-20180208' into staging (2018-02-08 17:41:15 +0000)
7
Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging (2021-08-02 09:47:07 +0100)
11
8
12
are available in the Git repository at:
9
are available in the Git repository at:
13
10
14
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180209
11
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210802
15
12
16
for you to fetch changes up to bbba7757bacc9f890a3f028d328b4b429dbe78ec:
13
for you to fetch changes up to 4a64939db76b10d8d41d2af3c6aad8142da55450:
17
14
18
hw/core/generic-loader: Allow PC to be set on command line (2018-02-09 10:55:40 +0000)
15
docs: Move user-facing barrier docs into system manual (2021-08-02 12:55:51 +0100)
19
16
20
----------------------------------------------------------------
17
----------------------------------------------------------------
21
target-arm queue:
18
target-arm queue:
22
* Support M profile derived exceptions on exception entry and exit
19
* Add documentation of Arm 'mainstone', 'kzm', 'imx25-pdk' boards
23
* Implement AArch64 v8.2 crypto insns (SHA-512, SHA-3, SM3, SM4)
20
* MAINTAINERS: Don't list Andrzej Zaborowski for various components
24
* Implement working i.MX6 SD controller
21
* docs: Remove stale TODO comments about license and version
25
* Various devices preparatory to i.MX7 support
22
* docs: Move licence/copyright from HTML output to rST comments
26
* Preparatory patches for SVE emulation
23
* docs: Format literal text correctly
27
* v8M: Fix bug in implementation of 'TT' insn
24
* hw/arm/boot: Report error if there is no fw_cfg device in the machine
28
* Give useful error if user tries to use userspace GICv3 with KVM
25
* docs: rSTify barrier.txt and bootindex.txt
29
26
30
----------------------------------------------------------------
27
----------------------------------------------------------------
31
Andrey Smirnov (10):
28
Peter Maydell (21):
32
sdhci: Add i.MX specific subtype of SDHCI
29
docs: Add documentation of Arm 'mainstone' board
33
hw: i.MX: Convert i.MX6 to use TYPE_IMX_USDHC
30
docs: Add documentation of Arm 'kzm' board
34
i.MX: Add code to emulate i.MX7 CCM, PMU and ANALOG IP blocks
31
docs: Add documentation of Arm 'imx25-pdk' board
35
i.MX: Add code to emulate i.MX2 watchdog IP block
32
MAINTAINERS: Don't list Andrzej Zaborowski for various components
36
i.MX: Add code to emulate i.MX7 SNVS IP-block
33
docs: Remove stale TODO comments about license and version
37
i.MX: Add code to emulate GPCv2 IP block
34
docs: Move licence/copyright from HTML output to rST comments
38
i.MX: Add i.MX7 GPT variant
35
docs/devel/build-system.rst: Format literals correctly
39
i.MX: Add implementation of i.MX7 GPR IP block
36
docs/devel/build-system.rst: Correct typo in example code
40
usb: Add basic code to emulate Chipidea USB IP
37
docs/devel/ebpf_rss.rst: Format literals correctly
41
hw/arm: Move virt's PSCI DT fixup code to arm/boot.c
38
docs/devel/migration.rst: Format literals correctly
39
docs/devel: Format literals correctly
40
docs/system/s390x/protvirt.rst: Format literals correctly
41
docs/system/arm/cpu-features.rst: Format literals correctly
42
docs: Format literals correctly
43
docs/about/removed-features: Fix markup error
44
docs/tools/virtiofsd.rst: Delete stray backtick
45
hw/arm/boot: Report error if there is no fw_cfg device in the machine
46
docs: Move bootindex.txt into system section and rstify
47
docs: Move the protocol part of barrier.txt into interop
48
ui/input-barrier: Move TODOs from barrier.txt to a comment
49
docs: Move user-facing barrier docs into system manual
42
50
43
Ard Biesheuvel (5):
51
docs/about/index.rst | 2 +-
44
target/arm: implement SHA-512 instructions
52
docs/about/removed-features.rst | 2 +-
45
target/arm: implement SHA-3 instructions
53
docs/barrier.txt | 370 -----------------------
46
target/arm: implement SM3 instructions
54
docs/bootindex.txt | 52 ----
47
target/arm: implement SM4 instructions
55
docs/devel/build-system.rst | 160 +++++-----
48
target/arm: enable user-mode SHA-3, SM3, SM4 and SHA-512 instruction support
56
docs/devel/ebpf_rss.rst | 18 +-
57
docs/devel/migration.rst | 36 +--
58
docs/devel/qgraph.rst | 8 +-
59
docs/devel/tcg-plugins.rst | 14 +-
60
docs/devel/testing.rst | 8 +-
61
docs/interop/barrier.rst | 426 +++++++++++++++++++++++++++
62
docs/interop/index.rst | 1 +
63
docs/interop/live-block-operations.rst | 2 +-
64
docs/interop/qemu-ga-ref.rst | 9 -
65
docs/interop/qemu-qmp-ref.rst | 9 -
66
docs/interop/qemu-storage-daemon-qmp-ref.rst | 9 -
67
docs/interop/vhost-user-gpu.rst | 7 +-
68
docs/interop/vhost-user.rst | 12 +-
69
docs/system/arm/cpu-features.rst | 116 ++++----
70
docs/system/arm/imx25-pdk.rst | 19 ++
71
docs/system/arm/kzm.rst | 18 ++
72
docs/system/arm/mainstone.rst | 25 ++
73
docs/system/arm/nuvoton.rst | 2 +-
74
docs/system/arm/sbsa.rst | 4 +-
75
docs/system/arm/virt.rst | 2 +-
76
docs/system/barrier.rst | 44 +++
77
docs/system/bootindex.rst | 76 +++++
78
docs/system/cpu-hotplug.rst | 2 +-
79
docs/system/generic-loader.rst | 4 +-
80
docs/system/guest-loader.rst | 6 +-
81
docs/system/index.rst | 2 +
82
docs/system/ppc/powernv.rst | 8 +-
83
docs/system/riscv/microchip-icicle-kit.rst | 2 +-
84
docs/system/riscv/virt.rst | 2 +-
85
docs/system/s390x/protvirt.rst | 12 +-
86
docs/system/target-arm.rst | 3 +
87
docs/tools/virtiofsd.rst | 2 +-
88
hw/arm/boot.c | 9 +
89
hw/arm/sbsa-ref.c | 7 -
90
ui/input-barrier.c | 5 +
91
MAINTAINERS | 8 +-
92
41 files changed, 849 insertions(+), 674 deletions(-)
93
delete mode 100644 docs/barrier.txt
94
delete mode 100644 docs/bootindex.txt
95
create mode 100644 docs/interop/barrier.rst
96
create mode 100644 docs/system/arm/imx25-pdk.rst
97
create mode 100644 docs/system/arm/kzm.rst
98
create mode 100644 docs/system/arm/mainstone.rst
99
create mode 100644 docs/system/barrier.rst
100
create mode 100644 docs/system/bootindex.rst
49
101
50
Christoffer Dall (1):
51
target/arm/kvm: gic: Prevent creating userspace GICv3 with KVM
52
53
Peter Maydell (9):
54
target/arm: Add armv7m_nvic_set_pending_derived()
55
target/arm: Split "get pending exception info" from "acknowledge it"
56
target/arm: Add ignore_stackfaults argument to v7m_exception_taken()
57
target/arm: Make v7M exception entry stack push check MPU
58
target/arm: Make v7m_push_callee_stack() honour MPU
59
target/arm: Make exception vector loads honour the SAU
60
target/arm: Handle exceptions during exception stack pop
61
target/arm/translate.c: Fix missing 'break' for TT insns
62
hw/core/generic-loader: Allow PC to be set on command line
63
64
Richard Henderson (5):
65
target/arm: Expand vector registers for SVE
66
target/arm: Add predicate registers for SVE
67
target/arm: Add SVE to migration state
68
target/arm: Add ZCR_ELx
69
target/arm: Add SVE state to TB->FLAGS
70
71
hw/intc/Makefile.objs | 2 +-
72
hw/misc/Makefile.objs | 4 +
73
hw/usb/Makefile.objs | 1 +
74
hw/sd/sdhci-internal.h | 23 ++
75
include/hw/intc/imx_gpcv2.h | 22 ++
76
include/hw/misc/imx2_wdt.h | 33 +++
77
include/hw/misc/imx7_ccm.h | 139 +++++++++++
78
include/hw/misc/imx7_gpr.h | 28 +++
79
include/hw/misc/imx7_snvs.h | 35 +++
80
include/hw/sd/sdhci.h | 13 ++
81
include/hw/timer/imx_gpt.h | 1 +
82
include/hw/usb/chipidea.h | 16 ++
83
target/arm/cpu.h | 120 ++++++++--
84
target/arm/helper.h | 12 +
85
target/arm/kvm_arm.h | 4 +
86
target/arm/translate.h | 2 +
87
hw/arm/boot.c | 65 ++++++
88
hw/arm/fsl-imx6.c | 2 +-
89
hw/arm/virt.c | 61 -----
90
hw/core/generic-loader.c | 2 +-
91
hw/intc/armv7m_nvic.c | 98 +++++++-
92
hw/intc/imx_gpcv2.c | 125 ++++++++++
93
hw/misc/imx2_wdt.c | 89 +++++++
94
hw/misc/imx7_ccm.c | 277 ++++++++++++++++++++++
95
hw/misc/imx7_gpr.c | 124 ++++++++++
96
hw/misc/imx7_snvs.c | 83 +++++++
97
hw/sd/sdhci.c | 230 ++++++++++++++++++-
98
hw/timer/imx_gpt.c | 25 ++
99
hw/usb/chipidea.c | 176 ++++++++++++++
100
linux-user/elfload.c | 19 ++
101
target/arm/cpu64.c | 4 +
102
target/arm/crypto_helper.c | 277 +++++++++++++++++++++-
103
target/arm/helper.c | 548 +++++++++++++++++++++++++++++++++++++-------
104
target/arm/machine.c | 88 ++++++-
105
target/arm/translate-a64.c | 350 +++++++++++++++++++++++++++-
106
target/arm/translate.c | 8 +-
107
hw/intc/trace-events | 5 +-
108
hw/misc/trace-events | 4 +
109
38 files changed, 2928 insertions(+), 187 deletions(-)
110
create mode 100644 include/hw/intc/imx_gpcv2.h
111
create mode 100644 include/hw/misc/imx2_wdt.h
112
create mode 100644 include/hw/misc/imx7_ccm.h
113
create mode 100644 include/hw/misc/imx7_gpr.h
114
create mode 100644 include/hw/misc/imx7_snvs.h
115
create mode 100644 include/hw/usb/chipidea.h
116
create mode 100644 hw/intc/imx_gpcv2.c
117
create mode 100644 hw/misc/imx2_wdt.c
118
create mode 100644 hw/misc/imx7_ccm.c
119
create mode 100644 hw/misc/imx7_gpr.c
120
create mode 100644 hw/misc/imx7_snvs.c
121
create mode 100644 hw/usb/chipidea.c
122
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
Add brief documentation of the Arm 'mainstone' board.
2
2
3
Add code to emulate Chipidea USB IP (used in i.MX SoCs). Tested to
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
work against:
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20210722175229.29065-2-peter.maydell@linaro.org
6
---
7
docs/system/arm/mainstone.rst | 25 +++++++++++++++++++++++++
8
docs/system/target-arm.rst | 1 +
9
MAINTAINERS | 1 +
10
3 files changed, 27 insertions(+)
11
create mode 100644 docs/system/arm/mainstone.rst
5
12
6
-usb -drive if=none,id=stick,file=usb.img,format=raw -device \
13
diff --git a/docs/system/arm/mainstone.rst b/docs/system/arm/mainstone.rst
7
usb-storage,bus=usb-bus.0,drive=stick
8
9
Cc: Peter Maydell <peter.maydell@linaro.org>
10
Cc: Jason Wang <jasowang@redhat.com>
11
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
13
Cc: Michael S. Tsirkin <mst@redhat.com>
14
Cc: qemu-devel@nongnu.org
15
Cc: qemu-arm@nongnu.org
16
Cc: yurovsky@gmail.com
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
21
hw/usb/Makefile.objs | 1 +
22
include/hw/usb/chipidea.h | 16 +++++
23
hw/usb/chipidea.c | 176 ++++++++++++++++++++++++++++++++++++++++++++++
24
3 files changed, 193 insertions(+)
25
create mode 100644 include/hw/usb/chipidea.h
26
create mode 100644 hw/usb/chipidea.c
27
28
diff --git a/hw/usb/Makefile.objs b/hw/usb/Makefile.objs
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/usb/Makefile.objs
31
+++ b/hw/usb/Makefile.objs
32
@@ -XXX,XX +XXX,XX @@ common-obj-$(CONFIG_USB_XHCI_NEC) += hcd-xhci-nec.o
33
common-obj-$(CONFIG_USB_MUSB) += hcd-musb.o
34
35
obj-$(CONFIG_TUSB6010) += tusb6010.o
36
+obj-$(CONFIG_IMX) += chipidea.o
37
38
# emulated usb devices
39
common-obj-$(CONFIG_USB) += dev-hub.o
40
diff --git a/include/hw/usb/chipidea.h b/include/hw/usb/chipidea.h
41
new file mode 100644
14
new file mode 100644
42
index XXXXXXX..XXXXXXX
15
index XXXXXXX..XXXXXXX
43
--- /dev/null
16
--- /dev/null
44
+++ b/include/hw/usb/chipidea.h
17
+++ b/docs/system/arm/mainstone.rst
45
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
46
+#ifndef CHIPIDEA_H
19
+Intel Mainstone II board (``mainstone``)
47
+#define CHIPIDEA_H
20
+========================================
48
+
21
+
49
+#include "hw/usb/hcd-ehci.h"
22
+The ``mainstone`` board emulates the Intel Mainstone II development
23
+board, which uses a PXA270 CPU.
50
+
24
+
51
+typedef struct ChipideaState {
25
+Emulated devices:
52
+ /*< private >*/
53
+ EHCISysBusState parent_obj;
54
+
26
+
55
+ MemoryRegion iomem[3];
27
+- Flash memory
56
+} ChipideaState;
28
+- Keypad
57
+
29
+- MMC controller
58
+#define TYPE_CHIPIDEA "usb-chipidea"
30
+- 91C111 ethernet
59
+#define CHIPIDEA(obj) OBJECT_CHECK(ChipideaState, (obj), TYPE_CHIPIDEA)
31
+- PIC
60
+
32
+- Timer
61
+#endif /* CHIPIDEA_H */
33
+- DMA
62
diff --git a/hw/usb/chipidea.c b/hw/usb/chipidea.c
34
+- GPIO
63
new file mode 100644
35
+- FIR
64
index XXXXXXX..XXXXXXX
36
+- Serial
65
--- /dev/null
37
+- LCD controller
66
+++ b/hw/usb/chipidea.c
38
+- SSP
67
@@ -XXX,XX +XXX,XX @@
39
+- USB controller
68
+/*
40
+- RTC
69
+ * Copyright (c) 2018, Impinj, Inc.
41
+- PCMCIA
70
+ *
42
+- I2C
71
+ * Chipidea USB block emulation code
43
+- I2S
72
+ *
44
diff --git a/docs/system/target-arm.rst b/docs/system/target-arm.rst
73
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
45
index XXXXXXX..XXXXXXX 100644
74
+ *
46
--- a/docs/system/target-arm.rst
75
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
47
+++ b/docs/system/target-arm.rst
76
+ * See the COPYING file in the top-level directory.
48
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
77
+ */
49
arm/highbank
78
+
50
arm/musicpal
79
+#include "qemu/osdep.h"
51
arm/gumstix
80
+#include "hw/usb/hcd-ehci.h"
52
+ arm/mainstone
81
+#include "hw/usb/chipidea.h"
53
arm/nrf
82
+#include "qemu/log.h"
54
arm/nseries
83
+
55
arm/nuvoton
84
+enum {
56
diff --git a/MAINTAINERS b/MAINTAINERS
85
+ CHIPIDEA_USBx_DCIVERSION = 0x000,
57
index XXXXXXX..XXXXXXX 100644
86
+ CHIPIDEA_USBx_DCCPARAMS = 0x004,
58
--- a/MAINTAINERS
87
+ CHIPIDEA_USBx_DCCPARAMS_HC = BIT(8),
59
+++ b/MAINTAINERS
88
+};
60
@@ -XXX,XX +XXX,XX @@ F: include/hw/arm/pxa.h
89
+
61
F: include/hw/arm/sharpsl.h
90
+static uint64_t chipidea_read(void *opaque, hwaddr offset,
62
F: include/hw/display/tc6393xb.h
91
+ unsigned size)
63
F: docs/system/arm/xscale.rst
92
+{
64
+F: docs/system/arm/mainstone.rst
93
+ return 0;
65
94
+}
66
SABRELITE / i.MX6
95
+
67
M: Peter Maydell <peter.maydell@linaro.org>
96
+static void chipidea_write(void *opaque, hwaddr offset,
97
+ uint64_t value, unsigned size)
98
+{
99
+}
100
+
101
+static const struct MemoryRegionOps chipidea_ops = {
102
+ .read = chipidea_read,
103
+ .write = chipidea_write,
104
+ .endianness = DEVICE_NATIVE_ENDIAN,
105
+ .impl = {
106
+ /*
107
+ * Our device would not work correctly if the guest was doing
108
+ * unaligned access. This might not be a limitation on the
109
+ * real device but in practice there is no reason for a guest
110
+ * to access this device unaligned.
111
+ */
112
+ .min_access_size = 4,
113
+ .max_access_size = 4,
114
+ .unaligned = false,
115
+ },
116
+};
117
+
118
+static uint64_t chipidea_dc_read(void *opaque, hwaddr offset,
119
+ unsigned size)
120
+{
121
+ switch (offset) {
122
+ case CHIPIDEA_USBx_DCIVERSION:
123
+ return 0x1;
124
+ case CHIPIDEA_USBx_DCCPARAMS:
125
+ /*
126
+ * Real hardware (at least i.MX7) will also report the
127
+ * controller as "Device Capable" (and 8 supported endpoints),
128
+ * but there doesn't seem to be much point in doing so, since
129
+ * we don't emulate that part.
130
+ */
131
+ return CHIPIDEA_USBx_DCCPARAMS_HC;
132
+ }
133
+
134
+ return 0;
135
+}
136
+
137
+static void chipidea_dc_write(void *opaque, hwaddr offset,
138
+ uint64_t value, unsigned size)
139
+{
140
+}
141
+
142
+static const struct MemoryRegionOps chipidea_dc_ops = {
143
+ .read = chipidea_dc_read,
144
+ .write = chipidea_dc_write,
145
+ .endianness = DEVICE_NATIVE_ENDIAN,
146
+ .impl = {
147
+ /*
148
+ * Our device would not work correctly if the guest was doing
149
+ * unaligned access. This might not be a limitation on the real
150
+ * device but in practice there is no reason for a guest to access
151
+ * this device unaligned.
152
+ */
153
+ .min_access_size = 4,
154
+ .max_access_size = 4,
155
+ .unaligned = false,
156
+ },
157
+};
158
+
159
+static void chipidea_init(Object *obj)
160
+{
161
+ EHCIState *ehci = &SYS_BUS_EHCI(obj)->ehci;
162
+ ChipideaState *ci = CHIPIDEA(obj);
163
+ int i;
164
+
165
+ for (i = 0; i < ARRAY_SIZE(ci->iomem); i++) {
166
+ const struct {
167
+ const char *name;
168
+ hwaddr offset;
169
+ uint64_t size;
170
+ const struct MemoryRegionOps *ops;
171
+ } regions[ARRAY_SIZE(ci->iomem)] = {
172
+ /*
173
+ * Registers located between offsets 0x000 and 0xFC
174
+ */
175
+ {
176
+ .name = TYPE_CHIPIDEA ".misc",
177
+ .offset = 0x000,
178
+ .size = 0x100,
179
+ .ops = &chipidea_ops,
180
+ },
181
+ /*
182
+ * Registers located between offsets 0x1A4 and 0x1DC
183
+ */
184
+ {
185
+ .name = TYPE_CHIPIDEA ".endpoints",
186
+ .offset = 0x1A4,
187
+ .size = 0x1DC - 0x1A4 + 4,
188
+ .ops = &chipidea_ops,
189
+ },
190
+ /*
191
+ * USB_x_DCIVERSION and USB_x_DCCPARAMS
192
+ */
193
+ {
194
+ .name = TYPE_CHIPIDEA ".dc",
195
+ .offset = 0x120,
196
+ .size = 8,
197
+ .ops = &chipidea_dc_ops,
198
+ },
199
+ };
200
+
201
+ memory_region_init_io(&ci->iomem[i],
202
+ obj,
203
+ regions[i].ops,
204
+ ci,
205
+ regions[i].name,
206
+ regions[i].size);
207
+
208
+ memory_region_add_subregion(&ehci->mem,
209
+ regions[i].offset,
210
+ &ci->iomem[i]);
211
+ }
212
+}
213
+
214
+static void chipidea_class_init(ObjectClass *klass, void *data)
215
+{
216
+ DeviceClass *dc = DEVICE_CLASS(klass);
217
+ SysBusEHCIClass *sec = SYS_BUS_EHCI_CLASS(klass);
218
+
219
+ /*
220
+ * Offsets used were taken from i.MX7Dual Applications Processor
221
+ * Reference Manual, Rev 0.1, p. 3177, Table 11-59
222
+ */
223
+ sec->capsbase = 0x100;
224
+ sec->opregbase = 0x140;
225
+ sec->portnr = 1;
226
+
227
+ set_bit(DEVICE_CATEGORY_USB, dc->categories);
228
+ dc->desc = "Chipidea USB Module";
229
+}
230
+
231
+static const TypeInfo chipidea_info = {
232
+ .name = TYPE_CHIPIDEA,
233
+ .parent = TYPE_SYS_BUS_EHCI,
234
+ .instance_size = sizeof(ChipideaState),
235
+ .instance_init = chipidea_init,
236
+ .class_init = chipidea_class_init,
237
+};
238
+
239
+static void chipidea_register_type(void)
240
+{
241
+ type_register_static(&chipidea_info);
242
+}
243
+type_init(chipidea_register_type)
244
--
68
--
245
2.16.1
69
2.20.1
246
70
247
71
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
Add brief documentation of the Arm 'kzm' board.
2
2
3
Add minimal code needed to allow upstream Linux guest to boot.
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20210722175229.29065-3-peter.maydell@linaro.org
6
---
7
docs/system/arm/kzm.rst | 18 ++++++++++++++++++
8
docs/system/target-arm.rst | 1 +
9
MAINTAINERS | 1 +
10
3 files changed, 20 insertions(+)
11
create mode 100644 docs/system/arm/kzm.rst
4
12
5
Cc: Peter Maydell <peter.maydell@linaro.org>
13
diff --git a/docs/system/arm/kzm.rst b/docs/system/arm/kzm.rst
6
Cc: Jason Wang <jasowang@redhat.com>
7
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
9
Cc: Michael S. Tsirkin <mst@redhat.com>
10
Cc: qemu-devel@nongnu.org
11
Cc: qemu-arm@nongnu.org
12
Cc: yurovsky@gmail.com
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/misc/Makefile.objs | 1 +
19
include/hw/misc/imx7_gpr.h | 28 ++++++++++
20
hw/misc/imx7_gpr.c | 124 +++++++++++++++++++++++++++++++++++++++++++++
21
hw/misc/trace-events | 4 ++
22
4 files changed, 157 insertions(+)
23
create mode 100644 include/hw/misc/imx7_gpr.h
24
create mode 100644 hw/misc/imx7_gpr.c
25
26
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/misc/Makefile.objs
29
+++ b/hw/misc/Makefile.objs
30
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_IMX) += imx6_src.o
31
obj-$(CONFIG_IMX) += imx7_ccm.o
32
obj-$(CONFIG_IMX) += imx2_wdt.o
33
obj-$(CONFIG_IMX) += imx7_snvs.o
34
+obj-$(CONFIG_IMX) += imx7_gpr.o
35
obj-$(CONFIG_MILKYMIST) += milkymist-hpdmc.o
36
obj-$(CONFIG_MILKYMIST) += milkymist-pfpu.o
37
obj-$(CONFIG_MAINSTONE) += mst_fpga.o
38
diff --git a/include/hw/misc/imx7_gpr.h b/include/hw/misc/imx7_gpr.h
39
new file mode 100644
14
new file mode 100644
40
index XXXXXXX..XXXXXXX
15
index XXXXXXX..XXXXXXX
41
--- /dev/null
16
--- /dev/null
42
+++ b/include/hw/misc/imx7_gpr.h
17
+++ b/docs/system/arm/kzm.rst
43
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
44
+/*
19
+Kyoto Microcomputer KZM-ARM11-01 (``kzm``)
45
+ * Copyright (c) 2017, Impinj, Inc.
20
+==========================================
46
+ *
47
+ * i.MX7 GPR IP block emulation code
48
+ *
49
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
50
+ *
51
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
52
+ * See the COPYING file in the top-level directory.
53
+ */
54
+
21
+
55
+#ifndef IMX7_GPR_H
22
+The ``kzm`` board emulates the Kyoto Microcomputer KZM-ARM11-01
56
+#define IMX7_GPR_H
23
+evaluation board, which is based on an NXP i.MX32 SoC
24
+which uses an ARM1136 CPU.
57
+
25
+
58
+#include "qemu/bitops.h"
26
+Emulated devices:
59
+#include "hw/sysbus.h"
60
+
27
+
61
+#define TYPE_IMX7_GPR "imx7.gpr"
28
+- UARTs
62
+#define IMX7_GPR(obj) OBJECT_CHECK(IMX7GPRState, (obj), TYPE_IMX7_GPR)
29
+- LAN9118 ethernet
63
+
30
+- AVIC
64
+typedef struct IMX7GPRState {
31
+- CCM
65
+ /* <private> */
32
+- GPT
66
+ SysBusDevice parent_obj;
33
+- EPIT timers
67
+
34
+- I2C
68
+ MemoryRegion mmio;
35
+- GPIO controllers
69
+} IMX7GPRState;
36
+- Watchdog timer
70
+
37
diff --git a/docs/system/target-arm.rst b/docs/system/target-arm.rst
71
+#endif /* IMX7_GPR_H */
72
diff --git a/hw/misc/imx7_gpr.c b/hw/misc/imx7_gpr.c
73
new file mode 100644
74
index XXXXXXX..XXXXXXX
75
--- /dev/null
76
+++ b/hw/misc/imx7_gpr.c
77
@@ -XXX,XX +XXX,XX @@
78
+/*
79
+ * Copyright (c) 2018, Impinj, Inc.
80
+ *
81
+ * i.MX7 GPR IP block emulation code
82
+ *
83
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
84
+ *
85
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
86
+ * See the COPYING file in the top-level directory.
87
+ *
88
+ * Bare minimum emulation code needed to support being able to shut
89
+ * down linux guest gracefully.
90
+ */
91
+
92
+#include "qemu/osdep.h"
93
+#include "hw/misc/imx7_gpr.h"
94
+#include "qemu/log.h"
95
+#include "sysemu/sysemu.h"
96
+
97
+#include "trace.h"
98
+
99
+enum IMX7GPRRegisters {
100
+ IOMUXC_GPR0 = 0x00,
101
+ IOMUXC_GPR1 = 0x04,
102
+ IOMUXC_GPR2 = 0x08,
103
+ IOMUXC_GPR3 = 0x0c,
104
+ IOMUXC_GPR4 = 0x10,
105
+ IOMUXC_GPR5 = 0x14,
106
+ IOMUXC_GPR6 = 0x18,
107
+ IOMUXC_GPR7 = 0x1c,
108
+ IOMUXC_GPR8 = 0x20,
109
+ IOMUXC_GPR9 = 0x24,
110
+ IOMUXC_GPR10 = 0x28,
111
+ IOMUXC_GPR11 = 0x2c,
112
+ IOMUXC_GPR12 = 0x30,
113
+ IOMUXC_GPR13 = 0x34,
114
+ IOMUXC_GPR14 = 0x38,
115
+ IOMUXC_GPR15 = 0x3c,
116
+ IOMUXC_GPR16 = 0x40,
117
+ IOMUXC_GPR17 = 0x44,
118
+ IOMUXC_GPR18 = 0x48,
119
+ IOMUXC_GPR19 = 0x4c,
120
+ IOMUXC_GPR20 = 0x50,
121
+ IOMUXC_GPR21 = 0x54,
122
+ IOMUXC_GPR22 = 0x58,
123
+};
124
+
125
+#define IMX7D_GPR1_IRQ_MASK BIT(12)
126
+#define IMX7D_GPR1_ENET1_TX_CLK_SEL_MASK BIT(13)
127
+#define IMX7D_GPR1_ENET2_TX_CLK_SEL_MASK BIT(14)
128
+#define IMX7D_GPR1_ENET_TX_CLK_SEL_MASK (0x3 << 13)
129
+#define IMX7D_GPR1_ENET1_CLK_DIR_MASK BIT(17)
130
+#define IMX7D_GPR1_ENET2_CLK_DIR_MASK BIT(18)
131
+#define IMX7D_GPR1_ENET_CLK_DIR_MASK (0x3 << 17)
132
+
133
+#define IMX7D_GPR5_CSI_MUX_CONTROL_MIPI BIT(4)
134
+#define IMX7D_GPR12_PCIE_PHY_REFCLK_SEL BIT(5)
135
+#define IMX7D_GPR22_PCIE_PHY_PLL_LOCKED BIT(31)
136
+
137
+
138
+static uint64_t imx7_gpr_read(void *opaque, hwaddr offset, unsigned size)
139
+{
140
+ trace_imx7_gpr_read(offset);
141
+
142
+ if (offset == IOMUXC_GPR22) {
143
+ return IMX7D_GPR22_PCIE_PHY_PLL_LOCKED;
144
+ }
145
+
146
+ return 0;
147
+}
148
+
149
+static void imx7_gpr_write(void *opaque, hwaddr offset,
150
+ uint64_t v, unsigned size)
151
+{
152
+ trace_imx7_gpr_write(offset, v);
153
+}
154
+
155
+static const struct MemoryRegionOps imx7_gpr_ops = {
156
+ .read = imx7_gpr_read,
157
+ .write = imx7_gpr_write,
158
+ .endianness = DEVICE_NATIVE_ENDIAN,
159
+ .impl = {
160
+ /*
161
+ * Our device would not work correctly if the guest was doing
162
+ * unaligned access. This might not be a limitation on the
163
+ * real device but in practice there is no reason for a guest
164
+ * to access this device unaligned.
165
+ */
166
+ .min_access_size = 4,
167
+ .max_access_size = 4,
168
+ .unaligned = false,
169
+ },
170
+};
171
+
172
+static void imx7_gpr_init(Object *obj)
173
+{
174
+ SysBusDevice *sd = SYS_BUS_DEVICE(obj);
175
+ IMX7GPRState *s = IMX7_GPR(obj);
176
+
177
+ memory_region_init_io(&s->mmio, obj, &imx7_gpr_ops, s,
178
+ TYPE_IMX7_GPR, 64 * 1024);
179
+ sysbus_init_mmio(sd, &s->mmio);
180
+}
181
+
182
+static void imx7_gpr_class_init(ObjectClass *klass, void *data)
183
+{
184
+ DeviceClass *dc = DEVICE_CLASS(klass);
185
+
186
+ dc->desc = "i.MX7 General Purpose Registers Module";
187
+}
188
+
189
+static const TypeInfo imx7_gpr_info = {
190
+ .name = TYPE_IMX7_GPR,
191
+ .parent = TYPE_SYS_BUS_DEVICE,
192
+ .instance_size = sizeof(IMX7GPRState),
193
+ .instance_init = imx7_gpr_init,
194
+ .class_init = imx7_gpr_class_init,
195
+};
196
+
197
+static void imx7_gpr_register_type(void)
198
+{
199
+ type_register_static(&imx7_gpr_info);
200
+}
201
+type_init(imx7_gpr_register_type)
202
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
203
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
204
--- a/hw/misc/trace-events
39
--- a/docs/system/target-arm.rst
205
+++ b/hw/misc/trace-events
40
+++ b/docs/system/target-arm.rst
206
@@ -XXX,XX +XXX,XX @@ mps2_scc_cfg_read(unsigned function, unsigned device, uint32_t value) "MPS2 SCC
41
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
207
msf2_sysreg_write(uint64_t offset, uint32_t val, uint32_t prev) "msf2-sysreg write: addr 0x%08" HWADDR_PRIx " data 0x%" PRIx32 " prev 0x%" PRIx32
42
arm/musicpal
208
msf2_sysreg_read(uint64_t offset, uint32_t val) "msf2-sysreg read: addr 0x%08" HWADDR_PRIx " data 0x%08" PRIx32
43
arm/gumstix
209
msf2_sysreg_write_pll_status(void) "Invalid write to read only PLL status register"
44
arm/mainstone
210
+
45
+ arm/kzm
211
+#hw/misc/imx7_gpr.c
46
arm/nrf
212
+imx7_gpr_read(uint64_t offset) "addr 0x%08" HWADDR_PRIx
47
arm/nseries
213
+imx7_gpr_write(uint64_t offset, uint64_t value) "addr 0x%08" HWADDR_PRIx "value 0x%08" HWADDR_PRIx
48
arm/nuvoton
49
diff --git a/MAINTAINERS b/MAINTAINERS
50
index XXXXXXX..XXXXXXX 100644
51
--- a/MAINTAINERS
52
+++ b/MAINTAINERS
53
@@ -XXX,XX +XXX,XX @@ F: hw/*/imx_*
54
F: hw/*/*imx31*
55
F: include/hw/*/imx_*
56
F: include/hw/*/*imx31*
57
+F: docs/system/arm/kzm.rst
58
59
Integrator CP
60
M: Peter Maydell <peter.maydell@linaro.org>
214
--
61
--
215
2.16.1
62
2.20.1
216
63
217
64
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
Add brief documentation of the Arm 'imx25-pdk' board.
2
2
3
Add minimal code needed to allow upstream Linux guest to boot.
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20210722175229.29065-4-peter.maydell@linaro.org
6
---
7
docs/system/arm/imx25-pdk.rst | 19 +++++++++++++++++++
8
docs/system/target-arm.rst | 1 +
9
MAINTAINERS | 1 +
10
3 files changed, 21 insertions(+)
11
create mode 100644 docs/system/arm/imx25-pdk.rst
4
12
5
Cc: Peter Maydell <peter.maydell@linaro.org>
13
diff --git a/docs/system/arm/imx25-pdk.rst b/docs/system/arm/imx25-pdk.rst
6
Cc: Jason Wang <jasowang@redhat.com>
7
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
9
Cc: Michael S. Tsirkin <mst@redhat.com>
10
Cc: qemu-devel@nongnu.org
11
Cc: qemu-arm@nongnu.org
12
Cc: yurovsky@gmail.com
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/intc/Makefile.objs | 2 +-
18
include/hw/intc/imx_gpcv2.h | 22 ++++++++
19
hw/intc/imx_gpcv2.c | 125 ++++++++++++++++++++++++++++++++++++++++++++
20
3 files changed, 148 insertions(+), 1 deletion(-)
21
create mode 100644 include/hw/intc/imx_gpcv2.h
22
create mode 100644 hw/intc/imx_gpcv2.c
23
24
diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
25
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/intc/Makefile.objs
27
+++ b/hw/intc/Makefile.objs
28
@@ -XXX,XX +XXX,XX @@ common-obj-$(CONFIG_XILINX) += xilinx_intc.o
29
common-obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-pmu-iomod-intc.o
30
common-obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-zynqmp-ipi.o
31
common-obj-$(CONFIG_ETRAXFS) += etraxfs_pic.o
32
-common-obj-$(CONFIG_IMX) += imx_avic.o
33
+common-obj-$(CONFIG_IMX) += imx_avic.o imx_gpcv2.o
34
common-obj-$(CONFIG_LM32) += lm32_pic.o
35
common-obj-$(CONFIG_REALVIEW) += realview_gic.o
36
common-obj-$(CONFIG_SLAVIO) += slavio_intctl.o
37
diff --git a/include/hw/intc/imx_gpcv2.h b/include/hw/intc/imx_gpcv2.h
38
new file mode 100644
14
new file mode 100644
39
index XXXXXXX..XXXXXXX
15
index XXXXXXX..XXXXXXX
40
--- /dev/null
16
--- /dev/null
41
+++ b/include/hw/intc/imx_gpcv2.h
17
+++ b/docs/system/arm/imx25-pdk.rst
42
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
43
+#ifndef IMX_GPCV2_H
19
+NXP i.MX25 PDK board (``imx25-pdk``)
44
+#define IMX_GPCV2_H
20
+====================================
45
+
21
+
46
+#include "hw/sysbus.h"
22
+The ``imx25-pdk`` board emulates the NXP i.MX25 Product Development Kit
23
+board, which is based on an i.MX25 SoC which uses an ARM926 CPU.
47
+
24
+
48
+enum IMXGPCv2Registers {
25
+Emulated devices:
49
+ GPC_NUM = 0xE00 / sizeof(uint32_t),
50
+};
51
+
26
+
52
+typedef struct IMXGPCv2State {
27
+- SD controller
53
+ /*< private >*/
28
+- AVIC
54
+ SysBusDevice parent_obj;
29
+- CCM
55
+
30
+- GPT
56
+ /*< public >*/
31
+- EPIT timers
57
+ MemoryRegion iomem;
32
+- FEC
58
+ uint32_t regs[GPC_NUM];
33
+- RNGC
59
+} IMXGPCv2State;
34
+- I2C
60
+
35
+- GPIO controllers
61
+#define TYPE_IMX_GPCV2 "imx-gpcv2"
36
+- Watchdog timer
62
+#define IMX_GPCV2(obj) OBJECT_CHECK(IMXGPCv2State, (obj), TYPE_IMX_GPCV2)
37
+- USB controllers
63
+
38
diff --git a/docs/system/target-arm.rst b/docs/system/target-arm.rst
64
+#endif /* IMX_GPCV2_H */
39
index XXXXXXX..XXXXXXX 100644
65
diff --git a/hw/intc/imx_gpcv2.c b/hw/intc/imx_gpcv2.c
40
--- a/docs/system/target-arm.rst
66
new file mode 100644
41
+++ b/docs/system/target-arm.rst
67
index XXXXXXX..XXXXXXX
42
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
68
--- /dev/null
43
arm/nrf
69
+++ b/hw/intc/imx_gpcv2.c
44
arm/nseries
70
@@ -XXX,XX +XXX,XX @@
45
arm/nuvoton
71
+/*
46
+ arm/imx25-pdk
72
+ * Copyright (c) 2018, Impinj, Inc.
47
arm/orangepi
73
+ *
48
arm/palm
74
+ * i.MX7 GPCv2 block emulation code
49
arm/raspi
75
+ *
50
diff --git a/MAINTAINERS b/MAINTAINERS
76
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
51
index XXXXXXX..XXXXXXX 100644
77
+ *
52
--- a/MAINTAINERS
78
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
53
+++ b/MAINTAINERS
79
+ * See the COPYING file in the top-level directory.
54
@@ -XXX,XX +XXX,XX @@ F: hw/watchdog/wdt_imx2.c
80
+ */
55
F: include/hw/arm/fsl-imx25.h
81
+
56
F: include/hw/misc/imx25_ccm.h
82
+#include "qemu/osdep.h"
57
F: include/hw/watchdog/wdt_imx2.h
83
+#include "hw/intc/imx_gpcv2.h"
58
+F: docs/system/arm/imx25-pdk.rst
84
+#include "qemu/log.h"
59
85
+
60
i.MX31 (kzm)
86
+#define GPC_PU_PGC_SW_PUP_REQ 0x0f8
61
M: Peter Maydell <peter.maydell@linaro.org>
87
+#define GPC_PU_PGC_SW_PDN_REQ 0x104
88
+
89
+#define USB_HSIC_PHY_SW_Pxx_REQ BIT(4)
90
+#define USB_OTG2_PHY_SW_Pxx_REQ BIT(3)
91
+#define USB_OTG1_PHY_SW_Pxx_REQ BIT(2)
92
+#define PCIE_PHY_SW_Pxx_REQ BIT(1)
93
+#define MIPI_PHY_SW_Pxx_REQ BIT(0)
94
+
95
+
96
+static void imx_gpcv2_reset(DeviceState *dev)
97
+{
98
+ IMXGPCv2State *s = IMX_GPCV2(dev);
99
+
100
+ memset(s->regs, 0, sizeof(s->regs));
101
+}
102
+
103
+static uint64_t imx_gpcv2_read(void *opaque, hwaddr offset,
104
+ unsigned size)
105
+{
106
+ IMXGPCv2State *s = opaque;
107
+
108
+ return s->regs[offset / sizeof(uint32_t)];
109
+}
110
+
111
+static void imx_gpcv2_write(void *opaque, hwaddr offset,
112
+ uint64_t value, unsigned size)
113
+{
114
+ IMXGPCv2State *s = opaque;
115
+ const size_t idx = offset / sizeof(uint32_t);
116
+
117
+ s->regs[idx] = value;
118
+
119
+ /*
120
+ * Real HW will clear those bits once as a way to indicate that
121
+ * power up request is complete
122
+ */
123
+ if (offset == GPC_PU_PGC_SW_PUP_REQ ||
124
+ offset == GPC_PU_PGC_SW_PDN_REQ) {
125
+ s->regs[idx] &= ~(USB_HSIC_PHY_SW_Pxx_REQ |
126
+ USB_OTG2_PHY_SW_Pxx_REQ |
127
+ USB_OTG1_PHY_SW_Pxx_REQ |
128
+ PCIE_PHY_SW_Pxx_REQ |
129
+ MIPI_PHY_SW_Pxx_REQ);
130
+ }
131
+}
132
+
133
+static const struct MemoryRegionOps imx_gpcv2_ops = {
134
+ .read = imx_gpcv2_read,
135
+ .write = imx_gpcv2_write,
136
+ .endianness = DEVICE_NATIVE_ENDIAN,
137
+ .impl = {
138
+ /*
139
+ * Our device would not work correctly if the guest was doing
140
+ * unaligned access. This might not be a limitation on the real
141
+ * device but in practice there is no reason for a guest to access
142
+ * this device unaligned.
143
+ */
144
+ .min_access_size = 4,
145
+ .max_access_size = 4,
146
+ .unaligned = false,
147
+ },
148
+};
149
+
150
+static void imx_gpcv2_init(Object *obj)
151
+{
152
+ SysBusDevice *sd = SYS_BUS_DEVICE(obj);
153
+ IMXGPCv2State *s = IMX_GPCV2(obj);
154
+
155
+ memory_region_init_io(&s->iomem,
156
+ obj,
157
+ &imx_gpcv2_ops,
158
+ s,
159
+ TYPE_IMX_GPCV2 ".iomem",
160
+ sizeof(s->regs));
161
+ sysbus_init_mmio(sd, &s->iomem);
162
+}
163
+
164
+static const VMStateDescription vmstate_imx_gpcv2 = {
165
+ .name = TYPE_IMX_GPCV2,
166
+ .version_id = 1,
167
+ .minimum_version_id = 1,
168
+ .fields = (VMStateField[]) {
169
+ VMSTATE_UINT32_ARRAY(regs, IMXGPCv2State, GPC_NUM),
170
+ VMSTATE_END_OF_LIST()
171
+ },
172
+};
173
+
174
+static void imx_gpcv2_class_init(ObjectClass *klass, void *data)
175
+{
176
+ DeviceClass *dc = DEVICE_CLASS(klass);
177
+
178
+ dc->reset = imx_gpcv2_reset;
179
+ dc->vmsd = &vmstate_imx_gpcv2;
180
+ dc->desc = "i.MX GPCv2 Module";
181
+}
182
+
183
+static const TypeInfo imx_gpcv2_info = {
184
+ .name = TYPE_IMX_GPCV2,
185
+ .parent = TYPE_SYS_BUS_DEVICE,
186
+ .instance_size = sizeof(IMXGPCv2State),
187
+ .instance_init = imx_gpcv2_init,
188
+ .class_init = imx_gpcv2_class_init,
189
+};
190
+
191
+static void imx_gpcv2_register_type(void)
192
+{
193
+ type_register_static(&imx_gpcv2_info);
194
+}
195
+type_init(imx_gpcv2_register_type)
196
--
62
--
197
2.16.1
63
2.20.1
198
64
199
65
diff view generated by jsdifflib
1
From: Christoffer Dall <christoffer.dall@linaro.org>
1
Andrzej Zaborowski is listed as an "Odd Fixes" maintainer for the
2
nSeries, Palm and PXA2XX boards, as well as the "Maintained" status
3
Arm 32-bit TCG backend.
2
4
3
KVM doesn't support emulating a GICv3 in userspace, only GICv2. We
5
Andrzej's last email to qemu-devel was back in 2017, and the email
4
currently attempt this anyway, and as a result a KVM guest doesn't
6
before that was all the way back in 2013. We don't really need to
5
receive interrupts and the user is left wondering why. Report an error
7
fill his email up with CCs on QEMU patches any more...
6
to the user if this particular combination is requested.
7
8
8
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
9
Remove Andrzej from the various boards sections (leaving them still
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Odd Fixes with me as the backup patch reviewer). Add Richard
10
Message-id: 20180201205307.30343-1-christoffer.dall@linaro.org
11
Henderson as the maintainer for the Arm TCG backend, since removing
12
Andrzej would otherwise leave that section with no M: line at all.
13
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Message-id: 20210722180951.29802-1-peter.maydell@linaro.org
12
---
17
---
13
target/arm/kvm_arm.h | 4 ++++
18
MAINTAINERS | 5 +----
14
1 file changed, 4 insertions(+)
19
1 file changed, 1 insertion(+), 4 deletions(-)
15
20
16
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
21
diff --git a/MAINTAINERS b/MAINTAINERS
17
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/kvm_arm.h
23
--- a/MAINTAINERS
19
+++ b/target/arm/kvm_arm.h
24
+++ b/MAINTAINERS
20
@@ -XXX,XX +XXX,XX @@ static inline const char *gicv3_class_name(void)
25
@@ -XXX,XX +XXX,XX @@ F: roms/vbootrom
21
exit(1);
26
F: docs/system/arm/nuvoton.rst
22
#endif
27
23
} else {
28
nSeries
24
+ if (kvm_enabled()) {
29
-M: Andrzej Zaborowski <balrogg@gmail.com>
25
+ error_report("Userspace GICv3 is not supported with KVM");
30
M: Peter Maydell <peter.maydell@linaro.org>
26
+ exit(1);
31
L: qemu-arm@nongnu.org
27
+ }
32
S: Odd Fixes
28
return "arm-gicv3";
33
@@ -XXX,XX +XXX,XX @@ F: tests/acceptance/machine_arm_n8x0.py
29
}
34
F: docs/system/arm/nseries.rst
30
}
35
36
Palm
37
-M: Andrzej Zaborowski <balrogg@gmail.com>
38
M: Peter Maydell <peter.maydell@linaro.org>
39
L: qemu-arm@nongnu.org
40
S: Odd Fixes
41
@@ -XXX,XX +XXX,XX @@ F: include/hw/intc/realview_gic.h
42
F: docs/system/arm/realview.rst
43
44
PXA2XX
45
-M: Andrzej Zaborowski <balrogg@gmail.com>
46
M: Peter Maydell <peter.maydell@linaro.org>
47
L: qemu-arm@nongnu.org
48
S: Odd Fixes
49
@@ -XXX,XX +XXX,XX @@ F: disas/arm-a64.cc
50
F: disas/libvixl/
51
52
ARM TCG target
53
-M: Andrzej Zaborowski <balrogg@gmail.com>
54
+M: Richard Henderson <richard.henderson@linaro.org>
55
S: Maintained
56
L: qemu-arm@nongnu.org
57
F: tcg/arm/
31
--
58
--
32
2.16.1
59
2.20.1
33
60
34
61
diff view generated by jsdifflib
1
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
1
Since commits 13f934e79fa and 3a50c8f3067aaf, our HTML docs include a
2
footer to all pages stating the license and version. We can
3
therefore delete the TODO comments suggesting we should do that from
4
our .rst files.
2
5
3
This implements emulation of the new SM3 instructions that have
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
been added as an optional extension to the ARMv8 Crypto Extensions
7
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
5
in ARM v8.2.
8
Reviewed-by: Cleber Rosa <crosa@redhat.com>
9
Reviewed-by: Markus Armbruster <armbru@redhat.com>
10
Message-id: 20210722192016.24915-2-peter.maydell@linaro.org
11
---
12
docs/interop/qemu-ga-ref.rst | 9 ---------
13
docs/interop/qemu-qmp-ref.rst | 9 ---------
14
docs/interop/qemu-storage-daemon-qmp-ref.rst | 9 ---------
15
3 files changed, 27 deletions(-)
6
16
7
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
17
diff --git a/docs/interop/qemu-ga-ref.rst b/docs/interop/qemu-ga-ref.rst
8
Message-id: 20180207111729.15737-4-ard.biesheuvel@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/cpu.h | 1 +
13
target/arm/helper.h | 4 ++
14
target/arm/crypto_helper.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++
15
target/arm/translate-a64.c | 88 ++++++++++++++++++++++++++++++++++++++++--
16
4 files changed, 186 insertions(+), 3 deletions(-)
17
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.h
19
--- a/docs/interop/qemu-ga-ref.rst
21
+++ b/target/arm/cpu.h
20
+++ b/docs/interop/qemu-ga-ref.rst
22
@@ -XXX,XX +XXX,XX @@ enum arm_features {
21
@@ -XXX,XX +XXX,XX @@
23
ARM_FEATURE_SVE, /* has Scalable Vector Extension */
22
QEMU Guest Agent Protocol Reference
24
ARM_FEATURE_V8_SHA512, /* implements SHA512 part of v8 Crypto Extensions */
23
===================================
25
ARM_FEATURE_V8_SHA3, /* implements SHA3 part of v8 Crypto Extensions */
24
26
+ ARM_FEATURE_V8_SM3, /* implements SM3 part of v8 Crypto Extensions */
25
-..
27
};
26
- TODO: the old Texinfo manual used to note that this manual
28
27
- is GPL-v2-or-later. We should make that reader-visible
29
static inline int arm_feature(CPUARMState *env, int feature)
28
- both here and in our Sphinx manuals more generally.
30
diff --git a/target/arm/helper.h b/target/arm/helper.h
29
-
30
-..
31
- TODO: display the QEMU version, both here and in our Sphinx manuals
32
- more generally.
33
-
34
.. contents::
35
:depth: 3
36
37
diff --git a/docs/interop/qemu-qmp-ref.rst b/docs/interop/qemu-qmp-ref.rst
31
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/helper.h
39
--- a/docs/interop/qemu-qmp-ref.rst
33
+++ b/target/arm/helper.h
40
+++ b/docs/interop/qemu-qmp-ref.rst
34
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(crypto_sha512h2, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
41
@@ -XXX,XX +XXX,XX @@
35
DEF_HELPER_FLAGS_2(crypto_sha512su0, TCG_CALL_NO_RWG, void, ptr, ptr)
42
QEMU QMP Reference Manual
36
DEF_HELPER_FLAGS_3(crypto_sha512su1, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
43
=========================
37
44
38
+DEF_HELPER_FLAGS_5(crypto_sm3tt, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32, i32)
45
-..
39
+DEF_HELPER_FLAGS_3(crypto_sm3partw1, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
46
- TODO: the old Texinfo manual used to note that this manual
40
+DEF_HELPER_FLAGS_3(crypto_sm3partw2, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
47
- is GPL-v2-or-later. We should make that reader-visible
41
+
48
- both here and in our Sphinx manuals more generally.
42
DEF_HELPER_FLAGS_3(crc32, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
49
-
43
DEF_HELPER_FLAGS_3(crc32c, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
50
-..
44
DEF_HELPER_2(dc_zva, void, env, i64)
51
- TODO: display the QEMU version, both here and in our Sphinx manuals
45
diff --git a/target/arm/crypto_helper.c b/target/arm/crypto_helper.c
52
- more generally.
53
-
54
.. contents::
55
:depth: 3
56
57
diff --git a/docs/interop/qemu-storage-daemon-qmp-ref.rst b/docs/interop/qemu-storage-daemon-qmp-ref.rst
46
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
47
--- a/target/arm/crypto_helper.c
59
--- a/docs/interop/qemu-storage-daemon-qmp-ref.rst
48
+++ b/target/arm/crypto_helper.c
60
+++ b/docs/interop/qemu-storage-daemon-qmp-ref.rst
49
@@ -XXX,XX +XXX,XX @@ void HELPER(crypto_sha512su1)(void *vd, void *vn, void *vm)
61
@@ -XXX,XX +XXX,XX @@
50
rd[0] += s1_512(rn[0]) + rm[0];
62
QEMU Storage Daemon QMP Reference Manual
51
rd[1] += s1_512(rn[1]) + rm[1];
63
========================================
52
}
64
53
+
65
-..
54
+void HELPER(crypto_sm3partw1)(void *vd, void *vn, void *vm)
66
- TODO: the old Texinfo manual used to note that this manual
55
+{
67
- is GPL-v2-or-later. We should make that reader-visible
56
+ uint64_t *rd = vd;
68
- both here and in our Sphinx manuals more generally.
57
+ uint64_t *rn = vn;
69
-
58
+ uint64_t *rm = vm;
70
-..
59
+ union CRYPTO_STATE d = { .l = { rd[0], rd[1] } };
71
- TODO: display the QEMU version, both here and in our Sphinx manuals
60
+ union CRYPTO_STATE n = { .l = { rn[0], rn[1] } };
72
- more generally.
61
+ union CRYPTO_STATE m = { .l = { rm[0], rm[1] } };
73
-
62
+ uint32_t t;
74
.. contents::
63
+
75
:depth: 3
64
+ t = CR_ST_WORD(d, 0) ^ CR_ST_WORD(n, 0) ^ ror32(CR_ST_WORD(m, 1), 17);
65
+ CR_ST_WORD(d, 0) = t ^ ror32(t, 17) ^ ror32(t, 9);
66
+
67
+ t = CR_ST_WORD(d, 1) ^ CR_ST_WORD(n, 1) ^ ror32(CR_ST_WORD(m, 2), 17);
68
+ CR_ST_WORD(d, 1) = t ^ ror32(t, 17) ^ ror32(t, 9);
69
+
70
+ t = CR_ST_WORD(d, 2) ^ CR_ST_WORD(n, 2) ^ ror32(CR_ST_WORD(m, 3), 17);
71
+ CR_ST_WORD(d, 2) = t ^ ror32(t, 17) ^ ror32(t, 9);
72
+
73
+ t = CR_ST_WORD(d, 3) ^ CR_ST_WORD(n, 3) ^ ror32(CR_ST_WORD(d, 0), 17);
74
+ CR_ST_WORD(d, 3) = t ^ ror32(t, 17) ^ ror32(t, 9);
75
+
76
+ rd[0] = d.l[0];
77
+ rd[1] = d.l[1];
78
+}
79
+
80
+void HELPER(crypto_sm3partw2)(void *vd, void *vn, void *vm)
81
+{
82
+ uint64_t *rd = vd;
83
+ uint64_t *rn = vn;
84
+ uint64_t *rm = vm;
85
+ union CRYPTO_STATE d = { .l = { rd[0], rd[1] } };
86
+ union CRYPTO_STATE n = { .l = { rn[0], rn[1] } };
87
+ union CRYPTO_STATE m = { .l = { rm[0], rm[1] } };
88
+ uint32_t t = CR_ST_WORD(n, 0) ^ ror32(CR_ST_WORD(m, 0), 25);
89
+
90
+ CR_ST_WORD(d, 0) ^= t;
91
+ CR_ST_WORD(d, 1) ^= CR_ST_WORD(n, 1) ^ ror32(CR_ST_WORD(m, 1), 25);
92
+ CR_ST_WORD(d, 2) ^= CR_ST_WORD(n, 2) ^ ror32(CR_ST_WORD(m, 2), 25);
93
+ CR_ST_WORD(d, 3) ^= CR_ST_WORD(n, 3) ^ ror32(CR_ST_WORD(m, 3), 25) ^
94
+ ror32(t, 17) ^ ror32(t, 2) ^ ror32(t, 26);
95
+
96
+ rd[0] = d.l[0];
97
+ rd[1] = d.l[1];
98
+}
99
+
100
+void HELPER(crypto_sm3tt)(void *vd, void *vn, void *vm, uint32_t imm2,
101
+ uint32_t opcode)
102
+{
103
+ uint64_t *rd = vd;
104
+ uint64_t *rn = vn;
105
+ uint64_t *rm = vm;
106
+ union CRYPTO_STATE d = { .l = { rd[0], rd[1] } };
107
+ union CRYPTO_STATE n = { .l = { rn[0], rn[1] } };
108
+ union CRYPTO_STATE m = { .l = { rm[0], rm[1] } };
109
+ uint32_t t;
110
+
111
+ assert(imm2 < 4);
112
+
113
+ if (opcode == 0 || opcode == 2) {
114
+ /* SM3TT1A, SM3TT2A */
115
+ t = par(CR_ST_WORD(d, 3), CR_ST_WORD(d, 2), CR_ST_WORD(d, 1));
116
+ } else if (opcode == 1) {
117
+ /* SM3TT1B */
118
+ t = maj(CR_ST_WORD(d, 3), CR_ST_WORD(d, 2), CR_ST_WORD(d, 1));
119
+ } else if (opcode == 3) {
120
+ /* SM3TT2B */
121
+ t = cho(CR_ST_WORD(d, 3), CR_ST_WORD(d, 2), CR_ST_WORD(d, 1));
122
+ } else {
123
+ g_assert_not_reached();
124
+ }
125
+
126
+ t += CR_ST_WORD(d, 0) + CR_ST_WORD(m, imm2);
127
+
128
+ CR_ST_WORD(d, 0) = CR_ST_WORD(d, 1);
129
+
130
+ if (opcode < 2) {
131
+ /* SM3TT1A, SM3TT1B */
132
+ t += CR_ST_WORD(n, 3) ^ ror32(CR_ST_WORD(d, 3), 20);
133
+
134
+ CR_ST_WORD(d, 1) = ror32(CR_ST_WORD(d, 2), 23);
135
+ } else {
136
+ /* SM3TT2A, SM3TT2B */
137
+ t += CR_ST_WORD(n, 3);
138
+ t ^= rol32(t, 9) ^ rol32(t, 17);
139
+
140
+ CR_ST_WORD(d, 1) = ror32(CR_ST_WORD(d, 2), 13);
141
+ }
142
+
143
+ CR_ST_WORD(d, 2) = CR_ST_WORD(d, 3);
144
+ CR_ST_WORD(d, 3) = t;
145
+
146
+ rd[0] = d.l[0];
147
+ rd[1] = d.l[1];
148
+}
149
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
150
index XXXXXXX..XXXXXXX 100644
151
--- a/target/arm/translate-a64.c
152
+++ b/target/arm/translate-a64.c
153
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_three_reg_sha512(DisasContext *s, uint32_t insn)
154
break;
155
}
156
} else {
157
- unallocated_encoding(s);
158
- return;
159
+ switch (opcode) {
160
+ case 0: /* SM3PARTW1 */
161
+ feature = ARM_FEATURE_V8_SM3;
162
+ genfn = gen_helper_crypto_sm3partw1;
163
+ break;
164
+ case 1: /* SM3PARTW2 */
165
+ feature = ARM_FEATURE_V8_SM3;
166
+ genfn = gen_helper_crypto_sm3partw2;
167
+ break;
168
+ default:
169
+ unallocated_encoding(s);
170
+ return;
171
+ }
172
}
173
174
if (!arm_dc_feature(s, feature)) {
175
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_four_reg(DisasContext *s, uint32_t insn)
176
case 1: /* BCAX */
177
feature = ARM_FEATURE_V8_SHA3;
178
break;
179
+ case 2: /* SM3SS1 */
180
+ feature = ARM_FEATURE_V8_SM3;
181
+ break;
182
default:
183
unallocated_encoding(s);
184
return;
185
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_four_reg(DisasContext *s, uint32_t insn)
186
tcg_temp_free_i64(tcg_res[0]);
187
tcg_temp_free_i64(tcg_res[1]);
188
} else {
189
- g_assert_not_reached();
190
+ TCGv_i32 tcg_op1, tcg_op2, tcg_op3, tcg_res, tcg_zero;
191
+
192
+ tcg_op1 = tcg_temp_new_i32();
193
+ tcg_op2 = tcg_temp_new_i32();
194
+ tcg_op3 = tcg_temp_new_i32();
195
+ tcg_res = tcg_temp_new_i32();
196
+ tcg_zero = tcg_const_i32(0);
197
+
198
+ read_vec_element_i32(s, tcg_op1, rn, 3, MO_32);
199
+ read_vec_element_i32(s, tcg_op2, rm, 3, MO_32);
200
+ read_vec_element_i32(s, tcg_op3, ra, 3, MO_32);
201
+
202
+ tcg_gen_rotri_i32(tcg_res, tcg_op1, 20);
203
+ tcg_gen_add_i32(tcg_res, tcg_res, tcg_op2);
204
+ tcg_gen_add_i32(tcg_res, tcg_res, tcg_op3);
205
+ tcg_gen_rotri_i32(tcg_res, tcg_res, 25);
206
+
207
+ write_vec_element_i32(s, tcg_zero, rd, 0, MO_32);
208
+ write_vec_element_i32(s, tcg_zero, rd, 1, MO_32);
209
+ write_vec_element_i32(s, tcg_zero, rd, 2, MO_32);
210
+ write_vec_element_i32(s, tcg_res, rd, 3, MO_32);
211
+
212
+ tcg_temp_free_i32(tcg_op1);
213
+ tcg_temp_free_i32(tcg_op2);
214
+ tcg_temp_free_i32(tcg_op3);
215
+ tcg_temp_free_i32(tcg_res);
216
+ tcg_temp_free_i32(tcg_zero);
217
}
218
}
219
220
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_xar(DisasContext *s, uint32_t insn)
221
tcg_temp_free_i64(tcg_res[1]);
222
}
223
224
+/* Crypto three-reg imm2
225
+ * 31 21 20 16 15 14 13 12 11 10 9 5 4 0
226
+ * +-----------------------+------+-----+------+--------+------+------+
227
+ * | 1 1 0 0 1 1 1 0 0 1 0 | Rm | 1 0 | imm2 | opcode | Rn | Rd |
228
+ * +-----------------------+------+-----+------+--------+------+------+
229
+ */
230
+static void disas_crypto_three_reg_imm2(DisasContext *s, uint32_t insn)
231
+{
232
+ int opcode = extract32(insn, 10, 2);
233
+ int imm2 = extract32(insn, 12, 2);
234
+ int rm = extract32(insn, 16, 5);
235
+ int rn = extract32(insn, 5, 5);
236
+ int rd = extract32(insn, 0, 5);
237
+ TCGv_ptr tcg_rd_ptr, tcg_rn_ptr, tcg_rm_ptr;
238
+ TCGv_i32 tcg_imm2, tcg_opcode;
239
+
240
+ if (!arm_dc_feature(s, ARM_FEATURE_V8_SM3)) {
241
+ unallocated_encoding(s);
242
+ return;
243
+ }
244
+
245
+ if (!fp_access_check(s)) {
246
+ return;
247
+ }
248
+
249
+ tcg_rd_ptr = vec_full_reg_ptr(s, rd);
250
+ tcg_rn_ptr = vec_full_reg_ptr(s, rn);
251
+ tcg_rm_ptr = vec_full_reg_ptr(s, rm);
252
+ tcg_imm2 = tcg_const_i32(imm2);
253
+ tcg_opcode = tcg_const_i32(opcode);
254
+
255
+ gen_helper_crypto_sm3tt(tcg_rd_ptr, tcg_rn_ptr, tcg_rm_ptr, tcg_imm2,
256
+ tcg_opcode);
257
+
258
+ tcg_temp_free_ptr(tcg_rd_ptr);
259
+ tcg_temp_free_ptr(tcg_rn_ptr);
260
+ tcg_temp_free_ptr(tcg_rm_ptr);
261
+ tcg_temp_free_i32(tcg_imm2);
262
+ tcg_temp_free_i32(tcg_opcode);
263
+}
264
+
265
/* C3.6 Data processing - SIMD, inc Crypto
266
*
267
* As the decode gets a little complex we are using a table based
268
@@ -XXX,XX +XXX,XX @@ static const AArch64DecodeTable data_proc_simd[] = {
269
{ 0xcec08000, 0xfffff000, disas_crypto_two_reg_sha512 },
270
{ 0xce000000, 0xff808000, disas_crypto_four_reg },
271
{ 0xce800000, 0xffe00000, disas_crypto_xar },
272
+ { 0xce408000, 0xffe0c000, disas_crypto_three_reg_imm2 },
273
{ 0x00000000, 0x00000000, NULL }
274
};
275
76
276
--
77
--
277
2.16.1
78
2.20.1
278
79
279
80
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Our built HTML documentation now has a standard footer which
2
gives the license for QEMU (and its documentation as a whole).
3
In almost all pages, we either don't bother to state the
4
copyright/license for the individual rST sources, or we put
5
it in an rST comment. There are just three pages which render
6
copyright or license information into the user-visible HTML.
2
7
3
Add both SVE exception state and vector length.
8
Quoting a specific (different) license for an individual HTML
9
page within the manual is confusing. Downgrade the license
10
and copyright info to a comment within the rST source, bringing
11
these pages in line with the rest of our documents.
4
12
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Suggested-by: Markus Armbruster <armbru@redhat.com>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20180123035349.24538-6-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
16
Reviewed-by: Cleber Rosa <crosa@redhat.com>
17
Reviewed-by: Markus Armbruster <armbru@redhat.com>
18
Acked-by: Michael S. Tsirkin <mst@redhat.com>
19
Message-id: 20210722192016.24915-3-peter.maydell@linaro.org
9
---
20
---
10
target/arm/cpu.h | 8 ++++++++
21
docs/interop/vhost-user-gpu.rst | 7 ++++---
11
target/arm/translate.h | 2 ++
22
docs/interop/vhost-user.rst | 12 +++++++-----
12
target/arm/helper.c | 25 ++++++++++++++++++++++++-
23
docs/system/generic-loader.rst | 4 ++--
13
target/arm/translate-a64.c | 2 ++
24
3 files changed, 13 insertions(+), 10 deletions(-)
14
4 files changed, 36 insertions(+), 1 deletion(-)
15
25
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
26
diff --git a/docs/interop/vhost-user-gpu.rst b/docs/interop/vhost-user-gpu.rst
17
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
28
--- a/docs/interop/vhost-user-gpu.rst
19
+++ b/target/arm/cpu.h
29
+++ b/docs/interop/vhost-user-gpu.rst
20
@@ -XXX,XX +XXX,XX @@ static inline bool arm_cpu_data_is_big_endian(CPUARMState *env)
30
@@ -XXX,XX +XXX,XX @@
21
#define ARM_TBFLAG_TBI0_MASK (0x1ull << ARM_TBFLAG_TBI0_SHIFT)
31
Vhost-user-gpu Protocol
22
#define ARM_TBFLAG_TBI1_SHIFT 1 /* TBI1 for EL0/1 */
32
=======================
23
#define ARM_TBFLAG_TBI1_MASK (0x1ull << ARM_TBFLAG_TBI1_SHIFT)
33
24
+#define ARM_TBFLAG_SVEEXC_EL_SHIFT 2
34
-:Licence: This work is licensed under the terms of the GNU GPL,
25
+#define ARM_TBFLAG_SVEEXC_EL_MASK (0x3 << ARM_TBFLAG_SVEEXC_EL_SHIFT)
35
- version 2 or later. See the COPYING file in the top-level
26
+#define ARM_TBFLAG_ZCR_LEN_SHIFT 4
36
- directory.
27
+#define ARM_TBFLAG_ZCR_LEN_MASK (0xf << ARM_TBFLAG_ZCR_LEN_SHIFT)
37
+..
28
38
+ Licence: This work is licensed under the terms of the GNU GPL,
29
/* some convenience accessor macros */
39
+ version 2 or later. See the COPYING file in the top-level
30
#define ARM_TBFLAG_AARCH64_STATE(F) \
40
+ directory.
31
@@ -XXX,XX +XXX,XX @@ static inline bool arm_cpu_data_is_big_endian(CPUARMState *env)
41
32
(((F) & ARM_TBFLAG_TBI0_MASK) >> ARM_TBFLAG_TBI0_SHIFT)
42
.. contents:: Table of Contents
33
#define ARM_TBFLAG_TBI1(F) \
43
34
(((F) & ARM_TBFLAG_TBI1_MASK) >> ARM_TBFLAG_TBI1_SHIFT)
44
diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst
35
+#define ARM_TBFLAG_SVEEXC_EL(F) \
36
+ (((F) & ARM_TBFLAG_SVEEXC_EL_MASK) >> ARM_TBFLAG_SVEEXC_EL_SHIFT)
37
+#define ARM_TBFLAG_ZCR_LEN(F) \
38
+ (((F) & ARM_TBFLAG_ZCR_LEN_MASK) >> ARM_TBFLAG_ZCR_LEN_SHIFT)
39
40
static inline bool bswap_code(bool sctlr_b)
41
{
42
diff --git a/target/arm/translate.h b/target/arm/translate.h
43
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/translate.h
46
--- a/docs/interop/vhost-user.rst
45
+++ b/target/arm/translate.h
47
+++ b/docs/interop/vhost-user.rst
46
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
48
@@ -XXX,XX +XXX,XX @@
47
bool tbi1; /* TBI1 for EL0/1, not used for EL2/3 */
49
===================
48
bool ns; /* Use non-secure CPREG bank on access */
50
Vhost-user Protocol
49
int fp_excp_el; /* FP exception EL or 0 if enabled */
51
===================
50
+ int sve_excp_el; /* SVE exception EL or 0 if enabled */
52
-:Copyright: 2014 Virtual Open Systems Sarl.
51
+ int sve_len; /* SVE vector length in bytes */
53
-:Copyright: 2019 Intel Corporation
52
/* Flag indicating that exceptions from secure mode are routed to EL3. */
54
-:Licence: This work is licensed under the terms of the GNU GPL,
53
bool secure_routed_to_el3;
55
- version 2 or later. See the COPYING file in the top-level
54
bool vfp_enabled; /* FP enabled via FPSCR.EN */
56
- directory.
55
diff --git a/target/arm/helper.c b/target/arm/helper.c
57
+
58
+..
59
+ Copyright 2014 Virtual Open Systems Sarl.
60
+ Copyright 2019 Intel Corporation
61
+ Licence: This work is licensed under the terms of the GNU GPL,
62
+ version 2 or later. See the COPYING file in the top-level
63
+ directory.
64
65
.. contents:: Table of Contents
66
67
diff --git a/docs/system/generic-loader.rst b/docs/system/generic-loader.rst
56
index XXXXXXX..XXXXXXX 100644
68
index XXXXXXX..XXXXXXX 100644
57
--- a/target/arm/helper.c
69
--- a/docs/system/generic-loader.rst
58
+++ b/target/arm/helper.c
70
+++ b/docs/system/generic-loader.rst
59
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
71
@@ -XXX,XX +XXX,XX @@
60
target_ulong *cs_base, uint32_t *pflags)
72
..
61
{
73
Copyright (c) 2016, Xilinx Inc.
62
ARMMMUIdx mmu_idx = core_to_arm_mmu_idx(env, cpu_mmu_index(env, false));
74
63
+ int fp_el = fp_exception_el(env);
75
-This work is licensed under the terms of the GNU GPL, version 2 or later. See
64
uint32_t flags;
76
-the COPYING file in the top-level directory.
65
77
+ This work is licensed under the terms of the GNU GPL, version 2 or later. See
66
if (is_a64(env)) {
78
+ the COPYING file in the top-level directory.
67
+ int sve_el = sve_exception_el(env);
79
68
+ uint32_t zcr_len;
80
Generic Loader
69
+
81
--------------
70
*pc = env->pc;
71
flags = ARM_TBFLAG_AARCH64_STATE_MASK;
72
/* Get control bits for tagged addresses */
73
flags |= (arm_regime_tbi0(env, mmu_idx) << ARM_TBFLAG_TBI0_SHIFT);
74
flags |= (arm_regime_tbi1(env, mmu_idx) << ARM_TBFLAG_TBI1_SHIFT);
75
+ flags |= sve_el << ARM_TBFLAG_SVEEXC_EL_SHIFT;
76
+
77
+ /* If SVE is disabled, but FP is enabled,
78
+ then the effective len is 0. */
79
+ if (sve_el != 0 && fp_el == 0) {
80
+ zcr_len = 0;
81
+ } else {
82
+ int current_el = arm_current_el(env);
83
+
84
+ zcr_len = env->vfp.zcr_el[current_el <= 1 ? 1 : current_el];
85
+ zcr_len &= 0xf;
86
+ if (current_el < 2 && arm_feature(env, ARM_FEATURE_EL2)) {
87
+ zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[2]);
88
+ }
89
+ if (current_el < 3 && arm_feature(env, ARM_FEATURE_EL3)) {
90
+ zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[3]);
91
+ }
92
+ }
93
+ flags |= zcr_len << ARM_TBFLAG_ZCR_LEN_SHIFT;
94
} else {
95
*pc = env->regs[15];
96
flags = (env->thumb << ARM_TBFLAG_THUMB_SHIFT)
97
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
98
if (arm_cpu_data_is_big_endian(env)) {
99
flags |= ARM_TBFLAG_BE_DATA_MASK;
100
}
101
- flags |= fp_exception_el(env) << ARM_TBFLAG_FPEXC_EL_SHIFT;
102
+ flags |= fp_el << ARM_TBFLAG_FPEXC_EL_SHIFT;
103
104
if (arm_v7m_is_handler_mode(env)) {
105
flags |= ARM_TBFLAG_HANDLER_MASK;
106
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/arm/translate-a64.c
109
+++ b/target/arm/translate-a64.c
110
@@ -XXX,XX +XXX,XX @@ static int aarch64_tr_init_disas_context(DisasContextBase *dcbase,
111
dc->user = (dc->current_el == 0);
112
#endif
113
dc->fp_excp_el = ARM_TBFLAG_FPEXC_EL(dc->base.tb->flags);
114
+ dc->sve_excp_el = ARM_TBFLAG_SVEEXC_EL(dc->base.tb->flags);
115
+ dc->sve_len = (ARM_TBFLAG_ZCR_LEN(dc->base.tb->flags) + 1) * 16;
116
dc->vec_len = 0;
117
dc->vec_stride = 0;
118
dc->cp_regs = arm_cpu->cp_regs;
119
--
82
--
120
2.16.1
83
2.20.1
121
84
122
85
diff view generated by jsdifflib
1
The code where we added the TT instruction was accidentally
1
In rST markup, single backticks `like this` represent "interpreted
2
missing a 'break', which meant that after generating the code
2
text", which can be handled as a bunch of different things if tagged
3
to execute the TT we would fall through to 'goto illegal_op'
3
with a specific "role":
4
and generate code to take an UNDEF insn.
4
https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#interpreted-text
5
(the most common one for us is "reference to a URL, which gets
6
hyperlinked").
7
8
The default "role" if none is specified is "title_reference",
9
intended for references to book or article titles, and it renders
10
into the HTML as <cite>...</cite> (usually comes out as italics).
11
12
build-system.rst seems to have been written under the mistaken
13
assumption that single-backticks mark up literal text (function
14
names, etc) which should be rendered in a fixed-width font.
15
The rST markup for this is ``double backticks``.
16
17
Update all the markup.
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: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20180206103941.13985-1-peter.maydell@linaro.org
21
Message-id: 20210726142338.31872-2-peter.maydell@linaro.org
9
---
22
---
10
target/arm/translate.c | 1 +
23
docs/devel/build-system.rst | 156 ++++++++++++++++++------------------
11
1 file changed, 1 insertion(+)
24
1 file changed, 78 insertions(+), 78 deletions(-)
12
25
13
diff --git a/target/arm/translate.c b/target/arm/translate.c
26
diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
14
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.c
28
--- a/docs/devel/build-system.rst
16
+++ b/target/arm/translate.c
29
+++ b/docs/devel/build-system.rst
17
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
30
@@ -XXX,XX +XXX,XX @@ following tasks:
18
tcg_temp_free_i32(addr);
31
- Add a Meson build option to meson_options.txt.
19
tcg_temp_free_i32(op);
32
20
store_reg(s, rd, ttresp);
33
- Add support to the command line arg parser to handle any new
21
+ break;
34
- `--enable-XXX`/`--disable-XXX` flags required by the feature.
22
}
35
+ ``--enable-XXX``/``--disable-XXX`` flags required by the feature.
23
goto illegal_op;
36
24
}
37
- Add information to the help output message to report on the new
38
feature flag.
39
40
- Add code to perform the actual feature check.
41
42
- - Add code to include the feature status in `config-host.h`
43
+ - Add code to include the feature status in ``config-host.h``
44
45
- Add code to print out the feature status in the configure summary
46
upon completion.
47
@@ -XXX,XX +XXX,XX @@ Helper functions
48
The configure script provides a variety of helper functions to assist
49
developers in checking for system features:
50
51
-`do_cc $ARGS...`
52
+``do_cc $ARGS...``
53
Attempt to run the system C compiler passing it $ARGS...
54
55
-`do_cxx $ARGS...`
56
+``do_cxx $ARGS...``
57
Attempt to run the system C++ compiler passing it $ARGS...
58
59
-`compile_object $CFLAGS`
60
+``compile_object $CFLAGS``
61
Attempt to compile a test program with the system C compiler using
62
$CFLAGS. The test program must have been previously written to a file
63
- called $TMPC. The replacement in Meson is the compiler object `cc`,
64
- which has methods such as `cc.compiles()`,
65
- `cc.check_header()`, `cc.has_function()`.
66
+ called $TMPC. The replacement in Meson is the compiler object ``cc``,
67
+ which has methods such as ``cc.compiles()``,
68
+ ``cc.check_header()``, ``cc.has_function()``.
69
70
-`compile_prog $CFLAGS $LDFLAGS`
71
+``compile_prog $CFLAGS $LDFLAGS``
72
Attempt to compile a test program with the system C compiler using
73
$CFLAGS and link it with the system linker using $LDFLAGS. The test
74
program must have been previously written to a file called $TMPC.
75
- The replacement in Meson is `cc.find_library()` and `cc.links()`.
76
+ The replacement in Meson is ``cc.find_library()`` and ``cc.links()``.
77
78
-`has $COMMAND`
79
+``has $COMMAND``
80
Determine if $COMMAND exists in the current environment, either as a
81
shell builtin, or executable binary, returning 0 on success. The
82
- replacement in Meson is `find_program()`.
83
+ replacement in Meson is ``find_program()``.
84
85
-`check_define $NAME`
86
+``check_define $NAME``
87
Determine if the macro $NAME is defined by the system C compiler
88
89
-`check_include $NAME`
90
+``check_include $NAME``
91
Determine if the include $NAME file is available to the system C
92
- compiler. The replacement in Meson is `cc.has_header()`.
93
+ compiler. The replacement in Meson is ``cc.has_header()``.
94
95
-`write_c_skeleton`
96
+``write_c_skeleton``
97
Write a minimal C program main() function to the temporary file
98
indicated by $TMPC
99
100
-`feature_not_found $NAME $REMEDY`
101
+``feature_not_found $NAME $REMEDY``
102
Print a message to stderr that the feature $NAME was not available
103
on the system, suggesting the user try $REMEDY to address the
104
problem.
105
106
-`error_exit $MESSAGE $MORE...`
107
+``error_exit $MESSAGE $MORE...``
108
Print $MESSAGE to stderr, followed by $MORE... and then exit from the
109
configure script with non-zero status
110
111
-`query_pkg_config $ARGS...`
112
+``query_pkg_config $ARGS...``
113
Run pkg-config passing it $ARGS. If QEMU is doing a static build,
114
then --static will be automatically added to $ARGS
115
116
@@ -XXX,XX +XXX,XX @@ process for:
117
118
4) other data files, such as icons or desktop files
119
120
-All executables are built by default, except for some `contrib/`
121
+All executables are built by default, except for some ``contrib/``
122
binaries that are known to fail to build on some platforms (for example
123
32-bit or big-endian platforms). Tests are also built by default,
124
though that might change in the future.
125
@@ -XXX,XX +XXX,XX @@ though that might change in the future.
126
The source code is highly modularized, split across many files to
127
facilitate building of all of these components with as little duplicated
128
compilation as possible. Using the Meson "sourceset" functionality,
129
-`meson.build` files group the source files in rules that are
130
+``meson.build`` files group the source files in rules that are
131
enabled according to the available system libraries and to various
132
configuration symbols. Sourcesets belong to one of four groups:
133
134
Subsystem sourcesets:
135
Various subsystems that are common to both tools and emulators have
136
- their own sourceset, for example `block_ss` for the block device subsystem,
137
- `chardev_ss` for the character device subsystem, etc. These sourcesets
138
+ their own sourceset, for example ``block_ss`` for the block device subsystem,
139
+ ``chardev_ss`` for the character device subsystem, etc. These sourcesets
140
are then turned into static libraries as follows::
141
142
libchardev = static_library('chardev', chardev_ss.sources(),
143
@@ -XXX,XX +XXX,XX @@ Subsystem sourcesets:
144
145
chardev = declare_dependency(link_whole: libchardev)
146
147
- As of Meson 0.55.1, the special `.fa` suffix should be used for everything
148
- that is used with `link_whole`, to ensure that the link flags are placed
149
+ As of Meson 0.55.1, the special ``.fa`` suffix should be used for everything
150
+ that is used with ``link_whole``, to ensure that the link flags are placed
151
correctly in the command line.
152
153
Target-independent emulator sourcesets:
154
@@ -XXX,XX +XXX,XX @@ Target-independent emulator sourcesets:
155
This includes error handling infrastructure, standard data structures,
156
platform portability wrapper functions, etc.
157
158
- Target-independent code lives in the `common_ss`, `softmmu_ss` and
159
- `user_ss` sourcesets. `common_ss` is linked into all emulators,
160
- `softmmu_ss` only in system emulators, `user_ss` only in user-mode
161
+ Target-independent code lives in the ``common_ss``, ``softmmu_ss`` and
162
+ ``user_ss`` sourcesets. ``common_ss`` is linked into all emulators,
163
+ ``softmmu_ss`` only in system emulators, ``user_ss`` only in user-mode
164
emulators.
165
166
Target-independent sourcesets must exercise particular care when using
167
- `if_false` rules. The `if_false` rule will be used correctly when linking
168
+ ``if_false`` rules. The ``if_false`` rule will be used correctly when linking
169
emulator binaries; however, when *compiling* target-independent files
170
- into .o files, Meson may need to pick *both* the `if_true` and
171
- `if_false` sides to cater for targets that want either side. To
172
+ into .o files, Meson may need to pick *both* the ``if_true`` and
173
+ ``if_false`` sides to cater for targets that want either side. To
174
achieve that, you can add a special rule using the ``CONFIG_ALL``
175
symbol::
176
177
@@ -XXX,XX +XXX,XX @@ Target-dependent emulator sourcesets:
178
In the target-dependent set lives CPU emulation, some device emulation and
179
much glue code. This sometimes also has to be compiled multiple times,
180
once for each target being built. Target-dependent files are included
181
- in the `specific_ss` sourceset.
182
+ in the ``specific_ss`` sourceset.
183
184
- Each emulator also includes sources for files in the `hw/` and `target/`
185
+ Each emulator also includes sources for files in the ``hw/`` and ``target/``
186
subdirectories. The subdirectory used for each emulator comes
187
from the target's definition of ``TARGET_BASE_ARCH`` or (if missing)
188
- ``TARGET_ARCH``, as found in `default-configs/targets/*.mak`.
189
+ ``TARGET_ARCH``, as found in ``default-configs/targets/*.mak``.
190
191
- Each subdirectory in `hw/` adds one sourceset to the `hw_arch` dictionary,
192
+ Each subdirectory in ``hw/`` adds one sourceset to the ``hw_arch`` dictionary,
193
for example::
194
195
arm_ss = ss.source_set()
196
@@ -XXX,XX +XXX,XX @@ Target-dependent emulator sourcesets:
197
198
The sourceset is only used for system emulators.
199
200
- Each subdirectory in `target/` instead should add one sourceset to each
201
- of the `target_arch` and `target_softmmu_arch`, which are used respectively
202
+ Each subdirectory in ``target/`` instead should add one sourceset to each
203
+ of the ``target_arch`` and ``target_softmmu_arch``, which are used respectively
204
for all emulators and for system emulators only. For example::
205
206
arm_ss = ss.source_set()
207
@@ -XXX,XX +XXX,XX @@ Target-dependent emulator sourcesets:
208
target_softmmu_arch += {'arm': arm_softmmu_ss}
209
210
Module sourcesets:
211
- There are two dictionaries for modules: `modules` is used for
212
- target-independent modules and `target_modules` is used for
213
- target-dependent modules. When modules are disabled the `module`
214
- source sets are added to `softmmu_ss` and the `target_modules`
215
- source sets are added to `specific_ss`.
216
+ There are two dictionaries for modules: ``modules`` is used for
217
+ target-independent modules and ``target_modules`` is used for
218
+ target-dependent modules. When modules are disabled the ``module``
219
+ source sets are added to ``softmmu_ss`` and the ``target_modules``
220
+ source sets are added to ``specific_ss``.
221
222
Both dictionaries are nested. One dictionary is created per
223
subdirectory, and these per-subdirectory dictionaries are added to
224
@@ -XXX,XX +XXX,XX @@ Module sourcesets:
225
modules += { 'hw-display': hw_display_modules }
226
227
Utility sourcesets:
228
- All binaries link with a static library `libqemuutil.a`. This library
229
+ All binaries link with a static library ``libqemuutil.a``. This library
230
is built from several sourcesets; most of them however host generated
231
- code, and the only two of general interest are `util_ss` and `stub_ss`.
232
+ code, and the only two of general interest are ``util_ss`` and ``stub_ss``.
233
234
The separation between these two is purely for documentation purposes.
235
- `util_ss` contains generic utility files. Even though this code is only
236
+ ``util_ss`` contains generic utility files. Even though this code is only
237
linked in some binaries, sometimes it requires hooks only in some of
238
these and depend on other functions that are not fully implemented by
239
- all QEMU binaries. `stub_ss` links dummy stubs that will only be linked
240
+ all QEMU binaries. ``stub_ss`` links dummy stubs that will only be linked
241
into the binary if the real implementation is not present. In a way,
242
the stubs can be thought of as a portable implementation of the weak
243
symbols concept.
244
@@ -XXX,XX +XXX,XX @@ Utility sourcesets:
245
The following files concur in the definition of which files are linked
246
into each emulator:
247
248
-`default-configs/devices/*.mak`
249
- The files under `default-configs/devices/` control the boards and devices
250
+``default-configs/devices/*.mak``
251
+ The files under ``default-configs/devices/`` control the boards and devices
252
that are built into each QEMU system emulation targets. They merely contain
253
a list of config variable definitions such as::
254
255
@@ -XXX,XX +XXX,XX @@ into each emulator:
256
CONFIG_XLNX_ZYNQMP_ARM=y
257
CONFIG_XLNX_VERSAL=y
258
259
-`*/Kconfig`
260
- These files are processed together with `default-configs/devices/*.mak` and
261
+``*/Kconfig``
262
+ These files are processed together with ``default-configs/devices/*.mak`` and
263
describe the dependencies between various features, subsystems and
264
device models. They are described in :ref:`kconfig`
265
266
-`default-configs/targets/*.mak`
267
- These files mostly define symbols that appear in the `*-config-target.h`
268
+``default-configs/targets/*.mak``
269
+ These files mostly define symbols that appear in the ``*-config-target.h``
270
file for each emulator [#cfgtarget]_. However, the ``TARGET_ARCH``
271
- and ``TARGET_BASE_ARCH`` will also be used to select the `hw/` and
272
- `target/` subdirectories that are compiled into each target.
273
+ and ``TARGET_BASE_ARCH`` will also be used to select the ``hw/`` and
274
+ ``target/`` subdirectories that are compiled into each target.
275
276
-.. [#cfgtarget] This header is included by `qemu/osdep.h` when
277
+.. [#cfgtarget] This header is included by ``qemu/osdep.h`` when
278
compiling files from the target-specific sourcesets.
279
280
These files rarely need changing unless you are adding a completely
281
@@ -XXX,XX +XXX,XX @@ Support scripts
282
---------------
283
284
Meson has a special convention for invoking Python scripts: if their
285
-first line is `#! /usr/bin/env python3` and the file is *not* executable,
286
+first line is ``#! /usr/bin/env python3`` and the file is *not* executable,
287
find_program() arranges to invoke the script under the same Python
288
interpreter that was used to invoke Meson. This is the most common
289
and preferred way to invoke support scripts from Meson build files,
290
because it automatically uses the value of configure's --python= option.
291
292
-In case the script is not written in Python, use a `#! /usr/bin/env ...`
293
+In case the script is not written in Python, use a ``#! /usr/bin/env ...``
294
line and make the script executable.
295
296
Scripts written in Python, where it is desirable to make the script
297
executable (for example for test scripts that developers may want to
298
invoke from the command line, such as tests/qapi-schema/test-qapi.py),
299
-should be invoked through the `python` variable in meson.build. For
300
+should be invoked through the ``python`` variable in meson.build. For
301
example::
302
303
test('QAPI schema regression tests', python,
304
@@ -XXX,XX +XXX,XX @@ rules and wraps them so that e.g. submodules are built before QEMU.
305
The resulting build system is largely non-recursive in nature, in
306
contrast to common practices seen with automake.
307
308
-Tests are also ran by the Makefile with the traditional `make check`
309
-phony target, while benchmarks are run with `make bench`. Meson test
310
-suites such as `unit` can be ran with `make check-unit` too. It is also
311
-possible to run tests defined in meson.build with `meson test`.
312
+Tests are also ran by the Makefile with the traditional ``make check``
313
+phony target, while benchmarks are run with ``make bench``. Meson test
314
+suites such as ``unit`` can be ran with ``make check-unit`` too. It is also
315
+possible to run tests defined in meson.build with ``meson test``.
316
317
Important files for the build system
318
====================================
319
@@ -XXX,XX +XXX,XX @@ The following key files are statically defined in the source tree, with
320
the rules needed to build QEMU. Their behaviour is influenced by a
321
number of dynamically created files listed later.
322
323
-`Makefile`
324
+``Makefile``
325
The main entry point used when invoking make to build all the components
326
of QEMU. The default 'all' target will naturally result in the build of
327
every component. Makefile takes care of recursively building submodules
328
directly via a non-recursive set of rules.
329
330
-`*/meson.build`
331
+``*/meson.build``
332
The meson.build file in the root directory is the main entry point for the
333
Meson build system, and it coordinates the configuration and build of all
334
executables. Build rules for various subdirectories are included in
335
other meson.build files spread throughout the QEMU source tree.
336
337
-`tests/Makefile.include`
338
+``tests/Makefile.include``
339
Rules for external test harnesses. These include the TCG tests,
340
- `qemu-iotests` and the Avocado-based acceptance tests.
341
+ ``qemu-iotests`` and the Avocado-based acceptance tests.
342
343
-`tests/docker/Makefile.include`
344
+``tests/docker/Makefile.include``
345
Rules for Docker tests. Like tests/Makefile, this file is included
346
directly by the top level Makefile, anything defined in this file will
347
influence the entire build system.
348
349
-`tests/vm/Makefile.include`
350
+``tests/vm/Makefile.include``
351
Rules for VM-based tests. Like tests/Makefile, this file is included
352
directly by the top level Makefile, anything defined in this file will
353
influence the entire build system.
354
@@ -XXX,XX +XXX,XX @@ Makefile.
355
356
Built by configure:
357
358
-`config-host.mak`
359
+``config-host.mak``
360
When configure has determined the characteristics of the build host it
361
will write a long list of variables to config-host.mak file. This
362
provides the various install directories, compiler / linker flags and a
363
- variety of `CONFIG_*` variables related to optionally enabled features.
364
+ variety of ``CONFIG_*`` variables related to optionally enabled features.
365
This is imported by the top level Makefile and meson.build in order to
366
tailor the build output.
367
368
@@ -XXX,XX +XXX,XX @@ Built by configure:
369
370
Built by Meson:
371
372
-`${TARGET-NAME}-config-devices.mak`
373
+``${TARGET-NAME}-config-devices.mak``
374
TARGET-NAME is again the name of a system or userspace emulator. The
375
config-devices.mak file is automatically generated by make using the
376
scripts/make_device_config.sh program, feeding it the
377
default-configs/$TARGET-NAME file as input.
378
379
-`config-host.h`, `$TARGET-NAME/config-target.h`, `$TARGET-NAME/config-devices.h`
380
+``config-host.h``, ``$TARGET-NAME/config-target.h``, ``$TARGET-NAME/config-devices.h``
381
These files are used by source code to determine what features
382
are enabled. They are generated from the contents of the corresponding
383
- `*.h` files using the scripts/create_config program. This extracts
384
+ ``*.h`` files using the scripts/create_config program. This extracts
385
relevant variables and formats them as C preprocessor macros.
386
387
-`build.ninja`
388
+``build.ninja``
389
The build rules.
390
391
392
Built by Makefile:
393
394
-`Makefile.ninja`
395
+``Makefile.ninja``
396
A Makefile include that bridges to ninja for the actual build. The
397
Makefile is mostly a list of targets that Meson included in build.ninja.
398
399
-`Makefile.mtest`
400
+``Makefile.mtest``
401
The Makefile definitions that let "make check" run tests defined in
402
meson.build. The rules are produced from Meson's JSON description of
403
tests (obtained with "meson introspect --tests") through the script
404
@@ -XXX,XX +XXX,XX @@ Built by Makefile:
405
Useful make targets
406
-------------------
407
408
-`help`
409
+``help``
410
Print a help message for the most common build targets.
411
412
-`print-VAR`
413
+``print-VAR``
414
Print the value of the variable VAR. Useful for debugging the build
415
system.
25
--
416
--
26
2.16.1
417
2.20.1
27
418
28
419
diff view generated by jsdifflib
1
Make the load of the exception vector from the vector table honour
1
One of the example meson.build fragments incorrectly quotes some
2
the SAU and any bus error on the load (possibly provoking a derived
2
symbols as 'CONFIG_FOO`; the correct syntax here is 'CONFIG_FOO'.
3
exception), rather than simply aborting if the load fails.
3
(This isn't a rST formatting mistake because the example is displayed
4
literally; it's just the wrong kind of quote.)
4
5
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 1517324542-6607-7-git-send-email-peter.maydell@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20210726142338.31872-3-peter.maydell@linaro.org
8
---
10
---
9
target/arm/helper.c | 71 +++++++++++++++++++++++++++++++++++++++++------------
11
docs/devel/build-system.rst | 4 ++--
10
1 file changed, 55 insertions(+), 16 deletions(-)
12
1 file changed, 2 insertions(+), 2 deletions(-)
11
13
12
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/helper.c
16
--- a/docs/devel/build-system.rst
15
+++ b/target/arm/helper.c
17
+++ b/docs/devel/build-system.rst
16
@@ -XXX,XX +XXX,XX @@ static uint32_t *get_v7m_sp_ptr(CPUARMState *env, bool secure, bool threadmode,
18
@@ -XXX,XX +XXX,XX @@ Target-independent emulator sourcesets:
17
}
19
symbol::
18
}
20
19
21
# Some targets have CONFIG_ACPI, some don't, so this is not enough
20
-static uint32_t arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure)
22
- softmmu_ss.add(when: 'CONFIG_ACPI`, if_true: files('acpi.c'),
21
+static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
23
+ softmmu_ss.add(when: 'CONFIG_ACPI', if_true: files('acpi.c'),
22
+ uint32_t *pvec)
24
if_false: files('acpi-stub.c'))
23
{
25
24
CPUState *cs = CPU(cpu);
26
# This is required as well:
25
CPUARMState *env = &cpu->env;
27
- softmmu_ss.add(when: 'CONFIG_ALL`, if_true: files('acpi-stub.c'))
26
MemTxResult result;
28
+ softmmu_ss.add(when: 'CONFIG_ALL', if_true: files('acpi-stub.c'))
27
- hwaddr vec = env->v7m.vecbase[targets_secure] + exc * 4;
29
28
- uint32_t addr;
30
Target-dependent emulator sourcesets:
29
+ uint32_t addr = env->v7m.vecbase[targets_secure] + exc * 4;
31
In the target-dependent set lives CPU emulation, some device emulation and
30
+ uint32_t vector_entry;
31
+ MemTxAttrs attrs = {};
32
+ ARMMMUIdx mmu_idx;
33
+ bool exc_secure;
34
+
35
+ mmu_idx = arm_v7m_mmu_idx_for_secstate_and_priv(env, targets_secure, true);
36
37
- addr = address_space_ldl(cs->as, vec,
38
- MEMTXATTRS_UNSPECIFIED, &result);
39
+ /* We don't do a get_phys_addr() here because the rules for vector
40
+ * loads are special: they always use the default memory map, and
41
+ * the default memory map permits reads from all addresses.
42
+ * Since there's no easy way to pass through to pmsav8_mpu_lookup()
43
+ * that we want this special case which would always say "yes",
44
+ * we just do the SAU lookup here followed by a direct physical load.
45
+ */
46
+ attrs.secure = targets_secure;
47
+ attrs.user = false;
48
+
49
+ if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
50
+ V8M_SAttributes sattrs = {};
51
+
52
+ v8m_security_lookup(env, addr, MMU_DATA_LOAD, mmu_idx, &sattrs);
53
+ if (sattrs.ns) {
54
+ attrs.secure = false;
55
+ } else if (!targets_secure) {
56
+ /* NS access to S memory */
57
+ goto load_fail;
58
+ }
59
+ }
60
+
61
+ vector_entry = address_space_ldl(arm_addressspace(cs, attrs), addr,
62
+ attrs, &result);
63
if (result != MEMTX_OK) {
64
- /* Architecturally this should cause a HardFault setting HSFR.VECTTBL,
65
- * which would then be immediately followed by our failing to load
66
- * the entry vector for that HardFault, which is a Lockup case.
67
- * Since we don't model Lockup, we just report this guest error
68
- * via cpu_abort().
69
- */
70
- cpu_abort(cs, "Failed to read from %s exception vector table "
71
- "entry %08x\n", targets_secure ? "secure" : "nonsecure",
72
- (unsigned)vec);
73
+ goto load_fail;
74
}
75
- return addr;
76
+ *pvec = vector_entry;
77
+ return true;
78
+
79
+load_fail:
80
+ /* All vector table fetch fails are reported as HardFault, with
81
+ * HFSR.VECTTBL and .FORCED set. (FORCED is set because
82
+ * technically the underlying exception is a MemManage or BusFault
83
+ * that is escalated to HardFault.) This is a terminal exception,
84
+ * so we will either take the HardFault immediately or else enter
85
+ * lockup (the latter case is handled in armv7m_nvic_set_pending_derived()).
86
+ */
87
+ exc_secure = targets_secure ||
88
+ !(cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK);
89
+ env->v7m.hfsr |= R_V7M_HFSR_VECTTBL_MASK | R_V7M_HFSR_FORCED_MASK;
90
+ armv7m_nvic_set_pending_derived(env->nvic, ARMV7M_EXCP_HARD, exc_secure);
91
+ return false;
92
}
93
94
static bool v7m_push_callee_stack(ARMCPU *cpu, uint32_t lr, bool dotailchain,
95
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
96
return;
97
}
98
99
- addr = arm_v7m_load_vector(cpu, exc, targets_secure);
100
+ if (!arm_v7m_load_vector(cpu, exc, targets_secure, &addr)) {
101
+ /* Vector load failed: derived exception */
102
+ v7m_exception_taken(cpu, lr, true, true);
103
+ return;
104
+ }
105
106
/* Now we've done everything that might cause a derived exception
107
* we can go ahead and activate whichever exception we're going to
108
--
32
--
109
2.16.1
33
2.20.1
110
34
111
35
diff view generated by jsdifflib
1
Make v7m_push_callee_stack() honour the MPU by using the
1
In rST markup, single backticks `like this` represent "interpreted
2
new v7m_stack_write() function. We return a flag to indicate
2
text", which can be handled as a bunch of different things if tagged
3
whether the pushes failed, which we can then use in
3
with a specific "role":
4
v7m_exception_taken() to cause us to handle the derived
4
https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#interpreted-text
5
exception correctly.
5
(the most common one for us is "reference to a URL, which gets
6
hyperlinked").
7
8
The default "role" if none is specified is "title_reference",
9
intended for references to book or article titles, and it renders
10
into the HTML as <cite>...</cite> (usually comes out as italics).
11
12
To format a literal (generally rendered as fixed-width font),
13
double-backticks are required.
14
15
ebpf_rss.rst gets this wrong in a few places; correct them.
6
16
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Message-id: 1517324542-6607-6-git-send-email-peter.maydell@linaro.org
20
Message-id: 20210726142338.31872-4-peter.maydell@linaro.org
11
---
21
---
12
target/arm/helper.c | 64 ++++++++++++++++++++++++++++++++++++++++-------------
22
docs/devel/ebpf_rss.rst | 18 +++++++++---------
13
1 file changed, 49 insertions(+), 15 deletions(-)
23
1 file changed, 9 insertions(+), 9 deletions(-)
14
24
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
25
diff --git a/docs/devel/ebpf_rss.rst b/docs/devel/ebpf_rss.rst
16
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
27
--- a/docs/devel/ebpf_rss.rst
18
+++ b/target/arm/helper.c
28
+++ b/docs/devel/ebpf_rss.rst
19
@@ -XXX,XX +XXX,XX @@ static uint32_t arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure)
29
@@ -XXX,XX +XXX,XX @@ eBPF RSS implementation
20
return addr;
30
21
}
31
eBPF RSS loading functionality located in ebpf/ebpf_rss.c and ebpf/ebpf_rss.h.
22
32
23
-static void v7m_push_callee_stack(ARMCPU *cpu, uint32_t lr, bool dotailchain,
33
-The `struct EBPFRSSContext` structure that holds 4 file descriptors:
24
+static bool v7m_push_callee_stack(ARMCPU *cpu, uint32_t lr, bool dotailchain,
34
+The ``struct EBPFRSSContext`` structure that holds 4 file descriptors:
25
bool ignore_faults)
35
26
{
36
- ctx - pointer of the libbpf context.
27
/* For v8M, push the callee-saves register part of the stack frame.
37
- program_fd - file descriptor of the eBPF RSS program.
28
@@ -XXX,XX +XXX,XX @@ static void v7m_push_callee_stack(ARMCPU *cpu, uint32_t lr, bool dotailchain,
38
@@ -XXX,XX +XXX,XX @@ The `struct EBPFRSSContext` structure that holds 4 file descriptors:
29
* In the tailchaining case this may not be the current stack.
39
- map_toeplitz_key - file descriptor of the 'Toeplitz key' map. One element of the 40byte key prepared for the hashing algorithm.
30
*/
40
- map_indirections_table - 128 elements of queue indexes.
31
CPUARMState *env = &cpu->env;
41
32
- CPUState *cs = CPU(cpu);
42
-`struct EBPFRSSConfig` fields:
33
uint32_t *frame_sp_p;
43
+``struct EBPFRSSConfig`` fields:
34
uint32_t frameptr;
44
35
+ ARMMMUIdx mmu_idx;
45
-- redirect - "boolean" value, should the hash be calculated, on false - `default_queue` would be used as the final decision.
36
+ bool stacked_ok;
46
+- redirect - "boolean" value, should the hash be calculated, on false - ``default_queue`` would be used as the final decision.
37
47
- populate_hash - for now, not used. eBPF RSS doesn't support hash reporting.
38
if (dotailchain) {
48
-- hash_types - binary mask of different hash types. See `VIRTIO_NET_RSS_HASH_TYPE_*` defines. If for packet hash should not be calculated - `default_queue` would be used.
39
- frame_sp_p = get_v7m_sp_ptr(env, true,
49
+- hash_types - binary mask of different hash types. See ``VIRTIO_NET_RSS_HASH_TYPE_*`` defines. If for packet hash should not be calculated - ``default_queue`` would be used.
40
- lr & R_V7M_EXCRET_MODE_MASK,
50
- indirections_len - length of the indirections table, maximum 128.
41
+ bool mode = lr & R_V7M_EXCRET_MODE_MASK;
51
- default_queue - the queue index that used for packet that shouldn't be hashed. For some packets, the hash can't be calculated(g.e ARP).
42
+ bool priv = !(env->v7m.control[M_REG_S] & R_V7M_CONTROL_NPRIV_MASK) ||
52
43
+ !mode;
53
Functions:
44
+
54
45
+ mmu_idx = arm_v7m_mmu_idx_for_secstate_and_priv(env, M_REG_S, priv);
55
-- `ebpf_rss_init()` - sets ctx to NULL, which indicates that EBPFRSSContext is not loaded.
46
+ frame_sp_p = get_v7m_sp_ptr(env, M_REG_S, mode,
56
-- `ebpf_rss_load()` - creates 3 maps and loads eBPF program from the rss.bpf.skeleton.h. Returns 'true' on success. After that, program_fd can be used to set steering for TAP.
47
lr & R_V7M_EXCRET_SPSEL_MASK);
57
-- `ebpf_rss_set_all()` - sets values for eBPF maps. `indirections_table` length is in EBPFRSSConfig. `toeplitz_key` is VIRTIO_NET_RSS_MAX_KEY_SIZE aka 40 bytes array.
48
} else {
58
-- `ebpf_rss_unload()` - close all file descriptors and set ctx to NULL.
49
+ mmu_idx = core_to_arm_mmu_idx(env, cpu_mmu_index(env, false));
59
+- ``ebpf_rss_init()`` - sets ctx to NULL, which indicates that EBPFRSSContext is not loaded.
50
frame_sp_p = &env->regs[13];
60
+- ``ebpf_rss_load()`` - creates 3 maps and loads eBPF program from the rss.bpf.skeleton.h. Returns 'true' on success. After that, program_fd can be used to set steering for TAP.
51
}
61
+- ``ebpf_rss_set_all()`` - sets values for eBPF maps. ``indirections_table`` length is in EBPFRSSConfig. ``toeplitz_key`` is VIRTIO_NET_RSS_MAX_KEY_SIZE aka 40 bytes array.
52
62
+- ``ebpf_rss_unload()`` - close all file descriptors and set ctx to NULL.
53
frameptr = *frame_sp_p - 0x28;
63
54
64
Simplified eBPF RSS workflow:
55
- stl_phys(cs->as, frameptr, 0xfefa125b);
65
56
- stl_phys(cs->as, frameptr + 0x8, env->regs[4]);
66
@@ -XXX,XX +XXX,XX @@ Simplified eBPF RSS workflow:
57
- stl_phys(cs->as, frameptr + 0xc, env->regs[5]);
67
NetClientState SetSteeringEBPF()
58
- stl_phys(cs->as, frameptr + 0x10, env->regs[6]);
68
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59
- stl_phys(cs->as, frameptr + 0x14, env->regs[7]);
69
60
- stl_phys(cs->as, frameptr + 0x18, env->regs[8]);
70
-For now, `set_steering_ebpf()` method supported by Linux TAP NetClientState. The method requires an eBPF program file descriptor as an argument.
61
- stl_phys(cs->as, frameptr + 0x1c, env->regs[9]);
71
+For now, ``set_steering_ebpf()`` method supported by Linux TAP NetClientState. The method requires an eBPF program file descriptor as an argument.
62
- stl_phys(cs->as, frameptr + 0x20, env->regs[10]);
63
- stl_phys(cs->as, frameptr + 0x24, env->regs[11]);
64
+ /* Write as much of the stack frame as we can. A write failure may
65
+ * cause us to pend a derived exception.
66
+ */
67
+ stacked_ok =
68
+ v7m_stack_write(cpu, frameptr, 0xfefa125b, mmu_idx, ignore_faults) &&
69
+ v7m_stack_write(cpu, frameptr + 0x8, env->regs[4], mmu_idx,
70
+ ignore_faults) &&
71
+ v7m_stack_write(cpu, frameptr + 0xc, env->regs[5], mmu_idx,
72
+ ignore_faults) &&
73
+ v7m_stack_write(cpu, frameptr + 0x10, env->regs[6], mmu_idx,
74
+ ignore_faults) &&
75
+ v7m_stack_write(cpu, frameptr + 0x14, env->regs[7], mmu_idx,
76
+ ignore_faults) &&
77
+ v7m_stack_write(cpu, frameptr + 0x18, env->regs[8], mmu_idx,
78
+ ignore_faults) &&
79
+ v7m_stack_write(cpu, frameptr + 0x1c, env->regs[9], mmu_idx,
80
+ ignore_faults) &&
81
+ v7m_stack_write(cpu, frameptr + 0x20, env->regs[10], mmu_idx,
82
+ ignore_faults) &&
83
+ v7m_stack_write(cpu, frameptr + 0x24, env->regs[11], mmu_idx,
84
+ ignore_faults);
85
86
+ /* Update SP regardless of whether any of the stack accesses failed.
87
+ * When we implement v8M stack limit checking then this attempt to
88
+ * update SP might also fail and result in a derived exception.
89
+ */
90
*frame_sp_p = frameptr;
91
+
92
+ return !stacked_ok;
93
}
94
95
static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
96
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
97
uint32_t addr;
98
bool targets_secure;
99
int exc;
100
+ bool push_failed = false;
101
102
armv7m_nvic_get_pending_irq_info(env->nvic, &exc, &targets_secure);
103
104
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
105
*/
106
if (lr & R_V7M_EXCRET_DCRS_MASK &&
107
!(dotailchain && (lr & R_V7M_EXCRET_ES_MASK))) {
108
- v7m_push_callee_stack(cpu, lr, dotailchain,
109
- ignore_stackfaults);
110
+ push_failed = v7m_push_callee_stack(cpu, lr, dotailchain,
111
+ ignore_stackfaults);
112
}
113
lr |= R_V7M_EXCRET_DCRS_MASK;
114
}
115
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
116
}
117
}
118
119
+ if (push_failed && !ignore_stackfaults) {
120
+ /* Derived exception on callee-saves register stacking:
121
+ * we might now want to take a different exception which
122
+ * targets a different security state, so try again from the top.
123
+ */
124
+ v7m_exception_taken(cpu, lr, true, true);
125
+ return;
126
+ }
127
+
128
addr = arm_v7m_load_vector(cpu, exc, targets_secure);
129
130
/* Now we've done everything that might cause a derived exception
131
--
72
--
132
2.16.1
73
2.20.1
133
74
134
75
diff view generated by jsdifflib
1
The memory writes done to push registers on the stack
1
In rST markup, single backticks `like this` represent "interpreted
2
on exception entry in M profile CPUs are supposed to
2
text", which can be handled as a bunch of different things if tagged
3
go via MPU permissions checks, which may cause us to
3
with a specific "role":
4
take a derived exception instead of the original one of
4
https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#interpreted-text
5
the MPU lookup fails. We were implementing these as
5
(the most common one for us is "reference to a URL, which gets
6
always-succeeds direct writes to physical memory.
6
hyperlinked").
7
Rewrite v7m_push_stack() to do the necessary checks.
7
8
The default "role" if none is specified is "title_reference",
9
intended for references to book or article titles, and it renders
10
into the HTML as <cite>...</cite> (usually comes out as italics).
11
12
To format a literal (generally rendered as fixed-width font),
13
double-backticks are required.
14
15
Mostly migration.rst gets this right, but some places incorrectly use
16
single backticks where double backticks were intended; correct them.
8
17
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 1517324542-6607-5-git-send-email-peter.maydell@linaro.org
20
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
21
Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
22
Message-id: 20210726142338.31872-5-peter.maydell@linaro.org
12
---
23
---
13
target/arm/helper.c | 103 ++++++++++++++++++++++++++++++++++++++++++++--------
24
docs/devel/migration.rst | 36 ++++++++++++++++++------------------
14
1 file changed, 87 insertions(+), 16 deletions(-)
25
1 file changed, 18 insertions(+), 18 deletions(-)
15
26
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
27
diff --git a/docs/devel/migration.rst b/docs/devel/migration.rst
17
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/helper.c
29
--- a/docs/devel/migration.rst
19
+++ b/target/arm/helper.c
30
+++ b/docs/devel/migration.rst
20
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
31
@@ -XXX,XX +XXX,XX @@ savevm/loadvm functionality.
21
return target_el;
32
Debugging
22
}
33
=========
23
34
24
-static void v7m_push(CPUARMState *env, uint32_t val)
35
-The migration stream can be analyzed thanks to `scripts/analyze-migration.py`.
25
+static bool v7m_stack_write(ARMCPU *cpu, uint32_t addr, uint32_t value,
36
+The migration stream can be analyzed thanks to ``scripts/analyze-migration.py``.
26
+ ARMMMUIdx mmu_idx, bool ignfault)
37
27
{
38
Example usage:
28
- CPUState *cs = CPU(arm_env_get_cpu(env));
39
29
+ CPUState *cs = CPU(cpu);
40
@@ -XXX,XX +XXX,XX @@ Common infrastructure
30
+ CPUARMState *env = &cpu->env;
41
=====================
31
+ MemTxAttrs attrs = {};
42
32
+ MemTxResult txres;
43
The files, sockets or fd's that carry the migration stream are abstracted by
33
+ target_ulong page_size;
44
-the ``QEMUFile`` type (see `migration/qemu-file.h`). In most cases this
34
+ hwaddr physaddr;
45
-is connected to a subtype of ``QIOChannel`` (see `io/`).
35
+ int prot;
46
+the ``QEMUFile`` type (see ``migration/qemu-file.h``). In most cases this
36
+ ARMMMUFaultInfo fi;
47
+is connected to a subtype of ``QIOChannel`` (see ``io/``).
37
+ bool secure = mmu_idx & ARM_MMU_IDX_M_S;
48
38
+ int exc;
49
39
+ bool exc_secure;
50
Saving the state of one device
40
51
@@ -XXX,XX +XXX,XX @@ An example (from hw/input/pckbd.c)
41
- env->regs[13] -= 4;
52
};
42
- stl_phys(cs->as, env->regs[13], val);
53
43
+ if (get_phys_addr(env, addr, MMU_DATA_STORE, mmu_idx, &physaddr,
54
We are declaring the state with name "pckbd".
44
+ &attrs, &prot, &page_size, &fi, NULL)) {
55
-The `version_id` is 3, and the fields are 4 uint8_t in a KBDState structure.
45
+ /* MPU/SAU lookup failed */
56
+The ``version_id`` is 3, and the fields are 4 uint8_t in a KBDState structure.
46
+ if (fi.type == ARMFault_QEMU_SFault) {
57
We registered this with:
47
+ qemu_log_mask(CPU_LOG_INT,
58
48
+ "...SecureFault with SFSR.AUVIOL during stacking\n");
59
.. code:: c
49
+ env->v7m.sfsr |= R_V7M_SFSR_AUVIOL_MASK | R_V7M_SFSR_SFARVALID_MASK;
60
50
+ env->v7m.sfar = addr;
61
vmstate_register(NULL, 0, &vmstate_kbd, s);
51
+ exc = ARMV7M_EXCP_SECURE;
62
52
+ exc_secure = false;
63
-For devices that are `qdev` based, we can register the device in the class
53
+ } else {
64
+For devices that are ``qdev`` based, we can register the device in the class
54
+ qemu_log_mask(CPU_LOG_INT, "...MemManageFault with CFSR.MSTKERR\n");
65
init function:
55
+ env->v7m.cfsr[secure] |= R_V7M_CFSR_MSTKERR_MASK;
66
56
+ exc = ARMV7M_EXCP_MEM;
67
.. code:: c
57
+ exc_secure = secure;
68
@@ -XXX,XX +XXX,XX @@ another to load the state back.
58
+ }
69
SaveVMHandlers *ops,
59
+ goto pend_fault;
70
void *opaque);
60
+ }
71
61
+ address_space_stl_le(arm_addressspace(cs, attrs), physaddr, value,
72
-Two functions in the ``ops`` structure are the `save_state`
62
+ attrs, &txres);
73
-and `load_state` functions. Notice that `load_state` receives a version_id
63
+ if (txres != MEMTX_OK) {
74
-parameter to know what state format is receiving. `save_state` doesn't
64
+ /* BusFault trying to write the data */
75
+Two functions in the ``ops`` structure are the ``save_state``
65
+ qemu_log_mask(CPU_LOG_INT, "...BusFault with BFSR.STKERR\n");
76
+and ``load_state`` functions. Notice that ``load_state`` receives a version_id
66
+ env->v7m.cfsr[M_REG_NS] |= R_V7M_CFSR_STKERR_MASK;
77
+parameter to know what state format is receiving. ``save_state`` doesn't
67
+ exc = ARMV7M_EXCP_BUS;
78
have a version_id parameter because it always uses the latest version.
68
+ exc_secure = false;
79
69
+ goto pend_fault;
80
Note that because the VMState macros still save the data in a raw
70
+ }
81
@@ -XXX,XX +XXX,XX @@ migration of a device, and using them breaks backward-migration
71
+ return true;
82
compatibility; in general most changes can be made by adding Subsections
72
+
83
(see above) or _TEST macros (see above) which won't break compatibility.
73
+pend_fault:
84
74
+ /* By pending the exception at this point we are making
85
-Each version is associated with a series of fields saved. The `save_state` always saves
75
+ * the IMPDEF choice "overridden exceptions pended" (see the
86
-the state as the newer version. But `load_state` sometimes is able to
76
+ * MergeExcInfo() pseudocode). The other choice would be to not
87
+Each version is associated with a series of fields saved. The ``save_state`` always saves
77
+ * pend them now and then make a choice about which to throw away
88
+the state as the newer version. But ``load_state`` sometimes is able to
78
+ * later if we have two derived exceptions.
89
load state from an older version.
79
+ * The only case when we must not pend the exception but instead
90
80
+ * throw it away is if we are doing the push of the callee registers
91
You can see that there are several version fields:
81
+ * and we've already generated a derived exception. Even in this
92
82
+ * case we will still update the fault status registers.
93
-- `version_id`: the maximum version_id supported by VMState for that device.
83
+ */
94
-- `minimum_version_id`: the minimum version_id that VMState is able to understand
84
+ if (!ignfault) {
95
+- ``version_id``: the maximum version_id supported by VMState for that device.
85
+ armv7m_nvic_set_pending_derived(env->nvic, exc, exc_secure);
96
+- ``minimum_version_id``: the minimum version_id that VMState is able to understand
86
+ }
97
for that device.
87
+ return false;
98
-- `minimum_version_id_old`: For devices that were not able to port to vmstate, we can
88
}
99
+- ``minimum_version_id_old``: For devices that were not able to port to vmstate, we can
89
100
assign a function that knows how to read this old state. This field is
90
/* Return true if we're using the process stack pointer (not the MSP) */
101
- ignored if there is no `load_state_old` handler.
91
@@ -XXX,XX +XXX,XX @@ static bool v7m_push_stack(ARMCPU *cpu)
102
+ ignored if there is no ``load_state_old`` handler.
92
* should ignore further stack faults trying to process
103
93
* that derived exception.)
104
VMState is able to read versions from minimum_version_id to
94
*/
105
version_id. And the function ``load_state_old()`` (if present) is able to
95
+ bool stacked_ok;
106
@@ -XXX,XX +XXX,XX @@ data and then transferred to the main structure.
96
CPUARMState *env = &cpu->env;
107
97
uint32_t xpsr = xpsr_read(env);
108
If you use memory API functions that update memory layout outside
98
+ uint32_t frameptr = env->regs[13];
109
initialization (i.e., in response to a guest action), this is a strong
99
+ ARMMMUIdx mmu_idx = core_to_arm_mmu_idx(env, cpu_mmu_index(env, false));
110
-indication that you need to call these functions in a `post_load` callback.
100
111
+indication that you need to call these functions in a ``post_load`` callback.
101
/* Align stack pointer if the guest wants that */
112
Examples of such memory API functions are:
102
- if ((env->regs[13] & 4) &&
113
103
+ if ((frameptr & 4) &&
114
- memory_region_add_subregion()
104
(env->v7m.ccr[env->v7m.secure] & R_V7M_CCR_STKALIGN_MASK)) {
115
@@ -XXX,XX +XXX,XX @@ Postcopy migration with shared memory needs explicit support from the other
105
- env->regs[13] -= 4;
116
processes that share memory and from QEMU. There are restrictions on the type of
106
+ frameptr -= 4;
117
memory that userfault can support shared.
107
xpsr |= XPSR_SPREALIGN;
118
108
}
119
-The Linux kernel userfault support works on `/dev/shm` memory and on `hugetlbfs`
109
- /* Switch to the handler mode. */
120
-(although the kernel doesn't provide an equivalent to `madvise(MADV_DONTNEED)`
110
- v7m_push(env, xpsr);
121
+The Linux kernel userfault support works on ``/dev/shm`` memory and on ``hugetlbfs``
111
- v7m_push(env, env->regs[15]);
122
+(although the kernel doesn't provide an equivalent to ``madvise(MADV_DONTNEED)``
112
- v7m_push(env, env->regs[14]);
123
for hugetlbfs which may be a problem in some configurations).
113
- v7m_push(env, env->regs[12]);
124
114
- v7m_push(env, env->regs[3]);
125
The vhost-user code in QEMU supports clients that have Postcopy support,
115
- v7m_push(env, env->regs[2]);
126
-and the `vhost-user-bridge` (in `tests/`) and the DPDK package have changes
116
- v7m_push(env, env->regs[1]);
127
+and the ``vhost-user-bridge`` (in ``tests/``) and the DPDK package have changes
117
- v7m_push(env, env->regs[0]);
128
to support postcopy.
118
129
119
- return false;
130
The client needs to open a userfaultfd and register the areas
120
+ frameptr -= 0x20;
121
+
122
+ /* Write as much of the stack frame as we can. If we fail a stack
123
+ * write this will result in a derived exception being pended
124
+ * (which may be taken in preference to the one we started with
125
+ * if it has higher priority).
126
+ */
127
+ stacked_ok =
128
+ v7m_stack_write(cpu, frameptr, env->regs[0], mmu_idx, false) &&
129
+ v7m_stack_write(cpu, frameptr + 4, env->regs[1], mmu_idx, false) &&
130
+ v7m_stack_write(cpu, frameptr + 8, env->regs[2], mmu_idx, false) &&
131
+ v7m_stack_write(cpu, frameptr + 12, env->regs[3], mmu_idx, false) &&
132
+ v7m_stack_write(cpu, frameptr + 16, env->regs[12], mmu_idx, false) &&
133
+ v7m_stack_write(cpu, frameptr + 20, env->regs[14], mmu_idx, false) &&
134
+ v7m_stack_write(cpu, frameptr + 24, env->regs[15], mmu_idx, false) &&
135
+ v7m_stack_write(cpu, frameptr + 28, xpsr, mmu_idx, false);
136
+
137
+ /* Update SP regardless of whether any of the stack accesses failed.
138
+ * When we implement v8M stack limit checking then this attempt to
139
+ * update SP might also fail and result in a derived exception.
140
+ */
141
+ env->regs[13] = frameptr;
142
+
143
+ return !stacked_ok;
144
}
145
146
static void do_v7m_exception_exit(ARMCPU *cpu)
147
--
131
--
148
2.16.1
132
2.20.1
149
133
150
134
diff view generated by jsdifflib
1
Currently armv7m_nvic_acknowledge_irq() does three things:
1
In rST markup, single backticks `like this` represent "interpreted
2
* make the current highest priority pending interrupt active
2
text", which can be handled as a bunch of different things if tagged
3
* return a bool indicating whether that interrupt is targeting
3
with a specific "role":
4
Secure or NonSecure state
4
https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#interpreted-text
5
* implicitly tell the caller which is the highest priority
5
(the most common one for us is "reference to a URL, which gets
6
pending interrupt by setting env->v7m.exception
6
hyperlinked").
7
7
8
We need to split these jobs, because v7m_exception_taken()
8
The default "role" if none is specified is "title_reference",
9
needs to know whether the pending interrupt targets Secure so
9
intended for references to book or article titles, and it renders
10
it can choose to stack callee-saves registers or not, but it
10
into the HTML as <cite>...</cite> (usually comes out as italics).
11
must not make the interrupt active until after it has done
12
that stacking, in case the stacking causes a derived exception.
13
Similarly, it needs to know the number of the pending interrupt
14
so it can read the correct vector table entry before the
15
interrupt is made active, because vector table reads might
16
also cause a derived exception.
17
11
18
Create a new armv7m_nvic_get_pending_irq_info() function which simply
12
Fix various places in the devel section of the manual which were
19
returns information about the highest priority pending interrupt, and
13
using single backticks when double backticks (for literal text)
20
use it to rearrange the v7m_exception_taken() code so we don't
14
were intended.
21
acknowledge the exception until we've done all the things which could
22
possibly cause a derived exception.
23
15
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
26
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
27
Message-id: 1517324542-6607-3-git-send-email-peter.maydell@linaro.org
19
Message-id: 20210726142338.31872-6-peter.maydell@linaro.org
28
---
20
---
29
target/arm/cpu.h | 19 ++++++++++++++++---
21
docs/devel/qgraph.rst | 8 ++++----
30
hw/intc/armv7m_nvic.c | 30 +++++++++++++++++++++++-------
22
docs/devel/tcg-plugins.rst | 14 +++++++-------
31
target/arm/helper.c | 16 ++++++++++++----
23
docs/devel/testing.rst | 8 ++++----
32
hw/intc/trace-events | 3 ++-
24
3 files changed, 15 insertions(+), 15 deletions(-)
33
4 files changed, 53 insertions(+), 15 deletions(-)
34
25
35
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
26
diff --git a/docs/devel/qgraph.rst b/docs/devel/qgraph.rst
36
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/cpu.h
28
--- a/docs/devel/qgraph.rst
38
+++ b/target/arm/cpu.h
29
+++ b/docs/devel/qgraph.rst
39
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending(void *opaque, int irq, bool secure);
30
@@ -XXX,XX +XXX,XX @@ Notes for the nodes:
40
* a different exception).
31
Edges
41
*/
32
^^^^^^
42
void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure);
33
43
+/**
34
-An edge relation between two nodes (drivers or machines) `X` and `Y` can be:
44
+ * armv7m_nvic_get_pending_irq_info: return highest priority pending
35
+An edge relation between two nodes (drivers or machines) ``X`` and ``Y`` can be:
45
+ * exception, and whether it targets Secure state
36
46
+ * @opaque: the NVIC
37
-- ``X CONSUMES Y``: `Y` can be plugged into `X`
47
+ * @pirq: set to pending exception number
38
-- ``X PRODUCES Y``: `X` provides the interface `Y`
48
+ * @ptargets_secure: set to whether pending exception targets Secure
39
-- ``X CONTAINS Y``: `Y` is part of `X` component
49
+ *
40
+- ``X CONSUMES Y``: ``Y`` can be plugged into ``X``
50
+ * This function writes the number of the highest priority pending
41
+- ``X PRODUCES Y``: ``X`` provides the interface ``Y``
51
+ * exception (the one which would be made active by
42
+- ``X CONTAINS Y``: ``Y`` is part of ``X`` component
52
+ * armv7m_nvic_acknowledge_irq()) to @pirq, and sets @ptargets_secure
43
53
+ * to true if the current highest priority pending exception should
44
Execution steps
54
+ * be taken to Secure state, false for NS.
45
^^^^^^^^^^^^^^^
55
+ */
46
diff --git a/docs/devel/tcg-plugins.rst b/docs/devel/tcg-plugins.rst
56
+void armv7m_nvic_get_pending_irq_info(void *opaque, int *pirq,
57
+ bool *ptargets_secure);
58
/**
59
* armv7m_nvic_acknowledge_irq: make highest priority pending exception active
60
* @opaque: the NVIC
61
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure);
62
* Move the current highest priority pending exception from the pending
63
* state to the active state, and update v7m.exception to indicate that
64
* it is the exception currently being handled.
65
- *
66
- * Returns: true if exception should be taken to Secure state, false for NS
67
*/
68
-bool armv7m_nvic_acknowledge_irq(void *opaque);
69
+void armv7m_nvic_acknowledge_irq(void *opaque);
70
/**
71
* armv7m_nvic_complete_irq: complete specified interrupt or exception
72
* @opaque: the NVIC
73
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
74
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
75
--- a/hw/intc/armv7m_nvic.c
48
--- a/docs/devel/tcg-plugins.rst
76
+++ b/hw/intc/armv7m_nvic.c
49
+++ b/docs/devel/tcg-plugins.rst
77
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure)
50
@@ -XXX,XX +XXX,XX @@ version they were built against. This can be done simply by::
78
}
51
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
79
52
80
/* Make pending IRQ active. */
53
The core code will refuse to load a plugin that doesn't export a
81
-bool armv7m_nvic_acknowledge_irq(void *opaque)
54
-`qemu_plugin_version` symbol or if plugin version is outside of QEMU's
82
+void armv7m_nvic_acknowledge_irq(void *opaque)
55
+``qemu_plugin_version`` symbol or if plugin version is outside of QEMU's
83
{
56
supported range of API versions.
84
NVICState *s = (NVICState *)opaque;
57
85
CPUARMState *env = &s->cpu->env;
58
-Additionally the `qemu_info_t` structure which is passed to the
86
const int pending = s->vectpending;
59
-`qemu_plugin_install` method of a plugin will detail the minimum and
87
const int running = nvic_exec_prio(s);
60
+Additionally the ``qemu_info_t`` structure which is passed to the
88
VecInfo *vec;
61
+``qemu_plugin_install`` method of a plugin will detail the minimum and
89
- bool targets_secure;
62
current API versions supported by QEMU. The API version will be
90
63
incremented if new APIs are added. The minimum API version will be
91
assert(pending > ARMV7M_EXCP_RESET && pending < s->num_irq);
64
incremented if existing APIs are changed or removed.
92
65
@@ -XXX,XX +XXX,XX @@ Example Plugins
93
if (s->vectpending_is_s_banked) {
66
94
vec = &s->sec_vectors[pending];
67
There are a number of plugins included with QEMU and you are
95
- targets_secure = true;
68
encouraged to contribute your own plugins plugins upstream. There is a
96
} else {
69
-`contrib/plugins` directory where they can go.
97
vec = &s->vectors[pending];
70
+``contrib/plugins`` directory where they can go.
98
- targets_secure = !exc_is_banked(s->vectpending) &&
71
99
- exc_targets_secure(s, s->vectpending);
72
- tests/plugins
100
}
73
101
74
These are some basic plugins that are used to test and exercise the
102
assert(vec->enabled);
75
-API during the `make check-tcg` target.
103
@@ -XXX,XX +XXX,XX @@ bool armv7m_nvic_acknowledge_irq(void *opaque)
76
+API during the ``make check-tcg`` target.
104
77
105
assert(s->vectpending_prio < running);
78
- contrib/plugins/hotblocks.c
106
79
107
- trace_nvic_acknowledge_irq(pending, s->vectpending_prio, targets_secure);
80
@@ -XXX,XX +XXX,XX @@ with linux-user execution as system emulation tends to generate
108
+ trace_nvic_acknowledge_irq(pending, s->vectpending_prio);
81
re-translations as blocks from different programs get swapped in and
109
82
out of system memory.
110
vec->active = 1;
83
111
vec->pending = 0;
84
-If your program is single-threaded you can use the `inline` option for
112
@@ -XXX,XX +XXX,XX @@ bool armv7m_nvic_acknowledge_irq(void *opaque)
85
+If your program is single-threaded you can use the ``inline`` option for
113
write_v7m_exception(env, s->vectpending);
86
slightly faster (but not thread safe) counters.
114
87
115
nvic_irq_update(s);
88
Example::
116
+}
89
@@ -XXX,XX +XXX,XX @@ which will lead to a sorted list after the class breakdown::
117
+
90
...
118
+void armv7m_nvic_get_pending_irq_info(void *opaque,
91
119
+ int *pirq, bool *ptargets_secure)
92
To find the argument shorthand for the class you need to examine the
120
+{
93
-source code of the plugin at the moment, specifically the `*opt`
121
+ NVICState *s = (NVICState *)opaque;
94
+source code of the plugin at the moment, specifically the ``*opt``
122
+ const int pending = s->vectpending;
95
argument in the InsnClassExecCount tables.
123
+ bool targets_secure;
96
124
+
97
- contrib/plugins/lockstep.c
125
+ assert(pending > ARMV7M_EXCP_RESET && pending < s->num_irq);
98
diff --git a/docs/devel/testing.rst b/docs/devel/testing.rst
126
+
127
+ if (s->vectpending_is_s_banked) {
128
+ targets_secure = true;
129
+ } else {
130
+ targets_secure = !exc_is_banked(pending) &&
131
+ exc_targets_secure(s, pending);
132
+ }
133
+
134
+ trace_nvic_get_pending_irq_info(pending, targets_secure);
135
136
- return targets_secure;
137
+ *ptargets_secure = targets_secure;
138
+ *pirq = pending;
139
}
140
141
int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure)
142
diff --git a/target/arm/helper.c b/target/arm/helper.c
143
index XXXXXXX..XXXXXXX 100644
99
index XXXXXXX..XXXXXXX 100644
144
--- a/target/arm/helper.c
100
--- a/docs/devel/testing.rst
145
+++ b/target/arm/helper.c
101
+++ b/docs/devel/testing.rst
146
@@ -XXX,XX +XXX,XX @@ static uint32_t *get_v7m_sp_ptr(CPUARMState *env, bool secure, bool threadmode,
102
@@ -XXX,XX +XXX,XX @@ The base test class has also support for tests with more than one
147
}
103
QEMUMachine. The way to get machines is through the ``self.get_vm()``
148
}
104
method which will return a QEMUMachine instance. The ``self.get_vm()``
149
105
method accepts arguments that will be passed to the QEMUMachine creation
150
-static uint32_t arm_v7m_load_vector(ARMCPU *cpu, bool targets_secure)
106
-and also an optional `name` attribute so you can identify a specific
151
+static uint32_t arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure)
107
+and also an optional ``name`` attribute so you can identify a specific
152
{
108
machine and get it more than once through the tests methods. A simple
153
CPUState *cs = CPU(cpu);
109
and hypothetical example follows:
154
CPUARMState *env = &cpu->env;
110
155
MemTxResult result;
111
@@ -XXX,XX +XXX,XX @@ Here is a list of the most used variables:
156
- hwaddr vec = env->v7m.vecbase[targets_secure] + env->v7m.exception * 4;
112
AVOCADO_ALLOW_LARGE_STORAGE
157
+ hwaddr vec = env->v7m.vecbase[targets_secure] + exc * 4;
113
~~~~~~~~~~~~~~~~~~~~~~~~~~~
158
uint32_t addr;
114
Tests which are going to fetch or produce assets considered *large* are not
159
115
-going to run unless that `AVOCADO_ALLOW_LARGE_STORAGE=1` is exported on
160
addr = address_space_ldl(cs->as, vec,
116
+going to run unless that ``AVOCADO_ALLOW_LARGE_STORAGE=1`` is exported on
161
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain)
117
the environment.
162
CPUARMState *env = &cpu->env;
118
163
uint32_t addr;
119
The definition of *large* is a bit arbitrary here, but it usually means an
164
bool targets_secure;
120
@@ -XXX,XX +XXX,XX @@ skipped by default. The definition of *not safe* is also arbitrary but
165
+ int exc;
121
usually it means a blob which either its source or build process aren't
166
122
public available.
167
- targets_secure = armv7m_nvic_acknowledge_irq(env->nvic);
123
168
+ armv7m_nvic_get_pending_irq_info(env->nvic, &exc, &targets_secure);
124
-You should export `AVOCADO_ALLOW_UNTRUSTED_CODE=1` on the environment in
169
125
+You should export ``AVOCADO_ALLOW_UNTRUSTED_CODE=1`` on the environment in
170
if (arm_feature(env, ARM_FEATURE_V8)) {
126
order to allow tests which make use of those kind of assets.
171
if (arm_feature(env, ARM_FEATURE_M_SECURITY) &&
127
172
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain)
128
AVOCADO_TIMEOUT_EXPECTED
173
}
129
@@ -XXX,XX +XXX,XX @@ property defined in the test class, for further details::
174
}
130
Even though the timeout can be set by the test developer, there are some tests
175
131
that may not have a well-defined limit of time to finish under certain
176
+ addr = arm_v7m_load_vector(cpu, exc, targets_secure);
132
conditions. For example, tests that take longer to execute when QEMU is
177
+
133
-compiled with debug flags. Therefore, the `AVOCADO_TIMEOUT_EXPECTED` variable
178
+ /* Now we've done everything that might cause a derived exception
134
+compiled with debug flags. Therefore, the ``AVOCADO_TIMEOUT_EXPECTED`` variable
179
+ * we can go ahead and activate whichever exception we're going to
135
has been used to determine whether those tests should run or not.
180
+ * take (which might now be the derived exception).
136
181
+ */
137
GITLAB_CI
182
+ armv7m_nvic_acknowledge_irq(env->nvic);
183
+
184
/* Switch to target security state -- must do this before writing SPSEL */
185
switch_v7m_security_state(env, targets_secure);
186
write_v7m_control_spsel(env, 0);
187
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain)
188
/* Clear IT bits */
189
env->condexec_bits = 0;
190
env->regs[14] = lr;
191
- addr = arm_v7m_load_vector(cpu, targets_secure);
192
env->regs[15] = addr & 0xfffffffe;
193
env->thumb = addr & 1;
194
}
195
diff --git a/hw/intc/trace-events b/hw/intc/trace-events
196
index XXXXXXX..XXXXXXX 100644
197
--- a/hw/intc/trace-events
198
+++ b/hw/intc/trace-events
199
@@ -XXX,XX +XXX,XX @@ nvic_escalate_disabled(int irq) "NVIC escalating irq %d to HardFault: disabled"
200
nvic_set_pending(int irq, bool secure, bool derived, int en, int prio) "NVIC set pending irq %d secure-bank %d derived %d (enabled: %d priority %d)"
201
nvic_clear_pending(int irq, bool secure, int en, int prio) "NVIC clear pending irq %d secure-bank %d (enabled: %d priority %d)"
202
nvic_set_pending_level(int irq) "NVIC set pending: irq %d higher prio than vectpending: setting irq line to 1"
203
-nvic_acknowledge_irq(int irq, int prio, bool targets_secure) "NVIC acknowledge IRQ: %d now active (prio %d targets_secure %d)"
204
+nvic_acknowledge_irq(int irq, int prio) "NVIC acknowledge IRQ: %d now active (prio %d)"
205
+nvic_get_pending_irq_info(int irq, bool secure) "NVIC next IRQ %d: targets_secure: %d"
206
nvic_complete_irq(int irq, bool secure) "NVIC complete IRQ %d (secure %d)"
207
nvic_set_irq_level(int irq, int level) "NVIC external irq %d level set to %d"
208
nvic_sysreg_read(uint64_t addr, uint32_t value, unsigned size) "NVIC sysreg read addr 0x%" PRIx64 " data 0x%" PRIx32 " size %u"
209
--
138
--
210
2.16.1
139
2.20.1
211
140
212
141
diff view generated by jsdifflib
1
In order to support derived exceptions (exceptions generated in
1
In rST markup, single backticks `like this` represent "interpreted
2
the course of trying to take an exception), we need to be able
2
text", which can be handled as a bunch of different things if tagged
3
to handle prioritizing whether to take the original exception
3
with a specific "role":
4
or the derived exception.
4
https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#interpreted-text
5
(the most common one for us is "reference to a URL, which gets
6
hyperlinked").
5
7
6
We do this by introducing a new function
8
The default "role" if none is specified is "title_reference",
7
armv7m_nvic_set_pending_derived() which the exception-taking code in
9
intended for references to book or article titles, and it renders
8
helper.c will call when a derived exception occurs. Derived
10
into the HTML as <cite>...</cite> (usually comes out as italics).
9
exceptions are dealt with mostly like normal pending exceptions, so
10
we share the implementation with the armv7m_nvic_set_pending()
11
function.
12
11
13
Note that the way we structure this is significantly different
12
To format a literal (generally rendered as fixed-width font),
14
from the v8M Arm ARM pseudocode: that does all the prioritization
13
double-backticks are required.
15
logic in the DerivedLateArrival() function, whereas we choose to
14
16
let the existing "identify highest priority exception" logic
15
protvirt.rst consistently uses single backticks when double backticks
17
do the prioritization for us. The effect is the same, though.
16
are required; correct it.
18
17
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Message-id: 1517324542-6607-2-git-send-email-peter.maydell@linaro.org
20
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
21
Acked-by: Cornelia Huck <cohuck@redhat.com>
22
Message-id: 20210726142338.31872-7-peter.maydell@linaro.org
22
---
23
---
23
target/arm/cpu.h | 13 ++++++++++
24
docs/system/s390x/protvirt.rst | 12 ++++++------
24
hw/intc/armv7m_nvic.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++--
25
1 file changed, 6 insertions(+), 6 deletions(-)
25
hw/intc/trace-events | 2 +-
26
3 files changed, 80 insertions(+), 3 deletions(-)
27
26
28
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
27
diff --git a/docs/system/s390x/protvirt.rst b/docs/system/s390x/protvirt.rst
29
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/cpu.h
29
--- a/docs/system/s390x/protvirt.rst
31
+++ b/target/arm/cpu.h
30
+++ b/docs/system/s390x/protvirt.rst
32
@@ -XXX,XX +XXX,XX @@ static inline bool armv7m_nvic_can_take_pending_exception(void *opaque)
31
@@ -XXX,XX +XXX,XX @@ Prerequisites
33
* of architecturally banked exceptions.
32
To run PVMs, a machine with the Protected Virtualization feature, as
34
*/
33
indicated by the Ultravisor Call facility (stfle bit 158), is
35
void armv7m_nvic_set_pending(void *opaque, int irq, bool secure);
34
required. The Ultravisor needs to be initialized at boot by setting
36
+/**
35
-`prot_virt=1` on the host's kernel command line.
37
+ * armv7m_nvic_set_pending_derived: mark this derived exception as pending
36
+``prot_virt=1`` on the host's kernel command line.
38
+ * @opaque: the NVIC
37
39
+ * @irq: the exception number to mark pending
38
Running PVMs requires using the KVM hypervisor.
40
+ * @secure: false for non-banked exceptions or for the nonsecure
39
41
+ * version of a banked exception, true for the secure version of a banked
40
-If those requirements are met, the capability `KVM_CAP_S390_PROTECTED`
42
+ * exception.
41
+If those requirements are met, the capability ``KVM_CAP_S390_PROTECTED``
43
+ *
42
will indicate that KVM can support PVMs on that LPAR.
44
+ * Similar to armv7m_nvic_set_pending(), but specifically for derived
43
45
+ * exceptions (exceptions generated in the course of trying to take
44
46
+ * a different exception).
45
@@ -XXX,XX +XXX,XX @@ Running a Protected Virtual Machine
47
+ */
46
-----------------------------------
48
+void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure);
47
49
/**
48
To run a PVM you will need to select a CPU model which includes the
50
* armv7m_nvic_acknowledge_irq: make highest priority pending exception active
49
-`Unpack facility` (stfle bit 161 represented by the feature
51
* @opaque: the NVIC
50
-`unpack`/`S390_FEAT_UNPACK`), and add these options to the command line::
52
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
51
+``Unpack facility`` (stfle bit 161 represented by the feature
53
index XXXXXXX..XXXXXXX 100644
52
+``unpack``/``S390_FEAT_UNPACK``), and add these options to the command line::
54
--- a/hw/intc/armv7m_nvic.c
53
55
+++ b/hw/intc/armv7m_nvic.c
54
-object s390-pv-guest,id=pv0 \
56
@@ -XXX,XX +XXX,XX @@ static void armv7m_nvic_clear_pending(void *opaque, int irq, bool secure)
55
-machine confidential-guest-support=pv0
57
}
56
58
}
57
Adding these options will:
59
58
60
-void armv7m_nvic_set_pending(void *opaque, int irq, bool secure)
59
-* Ensure the `unpack` facility is available
61
+static void do_armv7m_nvic_set_pending(void *opaque, int irq, bool secure,
60
+* Ensure the ``unpack`` facility is available
62
+ bool derived)
61
* Enable the IOMMU by default for all I/O devices
63
{
62
* Initialize the PV mechanism
64
+ /* Pend an exception, including possibly escalating it to HardFault.
63
65
+ *
64
@@ -XXX,XX +XXX,XX @@ from the disk boot. This memory layout includes the encrypted
66
+ * This function handles both "normal" pending of interrupts and
65
components (kernel, initrd, cmdline), the stage3a loader and
67
+ * exceptions, and also derived exceptions (ones which occur as
66
metadata. In case this boot method is used, the command line
68
+ * a result of trying to take some other exception).
67
options -initrd and -cmdline are ineffective. The preparation of a PVM
69
+ *
68
-image is done via the `genprotimg` tool from the s390-tools
70
+ * If derived == true, the caller guarantees that we are part way through
69
+image is done via the ``genprotimg`` tool from the s390-tools
71
+ * trying to take an exception (but have not yet called
70
collection.
72
+ * armv7m_nvic_acknowledge_irq() to make it active), and so:
73
+ * - s->vectpending is the "original exception" we were trying to take
74
+ * - irq is the "derived exception"
75
+ * - nvic_exec_prio(s) gives the priority before exception entry
76
+ * Here we handle the prioritization logic which the pseudocode puts
77
+ * in the DerivedLateArrival() function.
78
+ */
79
+
80
NVICState *s = (NVICState *)opaque;
81
bool banked = exc_is_banked(irq);
82
VecInfo *vec;
83
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending(void *opaque, int irq, bool secure)
84
85
vec = (banked && secure) ? &s->sec_vectors[irq] : &s->vectors[irq];
86
87
- trace_nvic_set_pending(irq, secure, vec->enabled, vec->prio);
88
+ trace_nvic_set_pending(irq, secure, derived, vec->enabled, vec->prio);
89
+
90
+ if (derived) {
91
+ /* Derived exceptions are always synchronous. */
92
+ assert(irq >= ARMV7M_EXCP_HARD && irq < ARMV7M_EXCP_PENDSV);
93
+
94
+ if (irq == ARMV7M_EXCP_DEBUG &&
95
+ exc_group_prio(s, vec->prio, secure) >= nvic_exec_prio(s)) {
96
+ /* DebugMonitorFault, but its priority is lower than the
97
+ * preempted exception priority: just ignore it.
98
+ */
99
+ return;
100
+ }
101
+
102
+ if (irq == ARMV7M_EXCP_HARD && vec->prio >= s->vectpending_prio) {
103
+ /* If this is a terminal exception (one which means we cannot
104
+ * take the original exception, like a failure to read its
105
+ * vector table entry), then we must take the derived exception.
106
+ * If the derived exception can't take priority over the
107
+ * original exception, then we go into Lockup.
108
+ *
109
+ * For QEMU, we rely on the fact that a derived exception is
110
+ * terminal if and only if it's reported to us as HardFault,
111
+ * which saves having to have an extra argument is_terminal
112
+ * that we'd only use in one place.
113
+ */
114
+ cpu_abort(&s->cpu->parent_obj,
115
+ "Lockup: can't take terminal derived exception "
116
+ "(original exception priority %d)\n",
117
+ s->vectpending_prio);
118
+ }
119
+ /* We now continue with the same code as for a normal pending
120
+ * exception, which will cause us to pend the derived exception.
121
+ * We'll then take either the original or the derived exception
122
+ * based on which is higher priority by the usual mechanism
123
+ * for selecting the highest priority pending interrupt.
124
+ */
125
+ }
126
127
if (irq >= ARMV7M_EXCP_HARD && irq < ARMV7M_EXCP_PENDSV) {
128
/* If a synchronous exception is pending then it may be
129
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending(void *opaque, int irq, bool secure)
130
}
131
}
132
133
+void armv7m_nvic_set_pending(void *opaque, int irq, bool secure)
134
+{
135
+ do_armv7m_nvic_set_pending(opaque, irq, secure, false);
136
+}
137
+
138
+void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure)
139
+{
140
+ do_armv7m_nvic_set_pending(opaque, irq, secure, true);
141
+}
142
+
143
/* Make pending IRQ active. */
144
bool armv7m_nvic_acknowledge_irq(void *opaque)
145
{
146
diff --git a/hw/intc/trace-events b/hw/intc/trace-events
147
index XXXXXXX..XXXXXXX 100644
148
--- a/hw/intc/trace-events
149
+++ b/hw/intc/trace-events
150
@@ -XXX,XX +XXX,XX @@ nvic_set_prio(int irq, bool secure, uint8_t prio) "NVIC set irq %d secure-bank %
151
nvic_irq_update(int vectpending, int pendprio, int exception_prio, int level) "NVIC vectpending %d pending prio %d exception_prio %d: setting irq line to %d"
152
nvic_escalate_prio(int irq, int irqprio, int runprio) "NVIC escalating irq %d to HardFault: insufficient priority %d >= %d"
153
nvic_escalate_disabled(int irq) "NVIC escalating irq %d to HardFault: disabled"
154
-nvic_set_pending(int irq, bool secure, int en, int prio) "NVIC set pending irq %d secure-bank %d (enabled: %d priority %d)"
155
+nvic_set_pending(int irq, bool secure, bool derived, int en, int prio) "NVIC set pending irq %d secure-bank %d derived %d (enabled: %d priority %d)"
156
nvic_clear_pending(int irq, bool secure, int en, int prio) "NVIC clear pending irq %d secure-bank %d (enabled: %d priority %d)"
157
nvic_set_pending_level(int irq) "NVIC set pending: irq %d higher prio than vectpending: setting irq line to 1"
158
nvic_acknowledge_irq(int irq, int prio, bool targets_secure) "NVIC acknowledge IRQ: %d now active (prio %d targets_secure %d)"
159
--
71
--
160
2.16.1
72
2.20.1
161
73
162
74
diff view generated by jsdifflib
1
In the v8M architecture, if the process of taking an exception
1
In rST markup, single backticks `like this` represent "interpreted
2
results in a further exception this is called a derived exception
2
text", which can be handled as a bunch of different things if tagged
3
(for example, an MPU exception when writing the exception frame to
3
with a specific "role":
4
memory). If the derived exception happens while pushing the initial
4
https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#interpreted-text
5
stack frame, we must ignore any subsequent possible exception
5
(the most common one for us is "reference to a URL, which gets
6
pushing the callee-saves registers.
6
hyperlinked").
7
7
8
In preparation for making the stack writes check for exceptions,
8
The default "role" if none is specified is "title_reference",
9
add a return value from v7m_push_stack() and a new parameter to
9
intended for references to book or article titles, and it renders
10
v7m_exception_taken(), so that the former can tell the latter that
10
into the HTML as <cite>...</cite> (usually comes out as italics).
11
it needs to ignore failures to write to the stack. We also plumb
11
12
the argument through to v7m_push_callee_stack(), which is where
12
To format a literal (generally rendered as fixed-width font),
13
the code to ignore the failures will be.
13
double-backticks are required.
14
14
15
(Note that the v8M ARM pseudocode structures this slightly differently:
15
cpu-features.rst consistently uses single backticks when double backticks
16
derived exceptions cause the attempt to process the original
16
are required; correct it.
17
exception to be abandoned; then at the top level it calls
18
DerivedLateArrival to prioritize the derived exception and call
19
TakeException from there. We choose to let the NVIC do the prioritization
20
and continue forward with a call to TakeException which will then
21
take either the original or the derived exception. The effect is
22
the same, but this structure works better for QEMU because we don't
23
have a convenient top level place to do the abandon-and-retry logic.)
24
17
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
27
Message-id: 1517324542-6607-4-git-send-email-peter.maydell@linaro.org
20
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
21
Message-id: 20210726142338.31872-8-peter.maydell@linaro.org
28
---
22
---
29
target/arm/helper.c | 35 +++++++++++++++++++++++------------
23
docs/system/arm/cpu-features.rst | 116 +++++++++++++++----------------
30
1 file changed, 23 insertions(+), 12 deletions(-)
24
1 file changed, 58 insertions(+), 58 deletions(-)
31
25
32
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst
33
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/helper.c
28
--- a/docs/system/arm/cpu-features.rst
35
+++ b/target/arm/helper.c
29
+++ b/docs/system/arm/cpu-features.rst
36
@@ -XXX,XX +XXX,XX @@ static uint32_t arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure)
30
@@ -XXX,XX +XXX,XX @@ is the Performance Monitoring Unit (PMU). CPU types such as the
37
return addr;
31
Cortex-A15 and the Cortex-A57, which respectively implement Arm
38
}
32
architecture reference manuals ARMv7-A and ARMv8-A, may both optionally
39
33
implement PMUs. For example, if a user wants to use a Cortex-A15 without
40
-static void v7m_push_callee_stack(ARMCPU *cpu, uint32_t lr, bool dotailchain)
34
-a PMU, then the `-cpu` parameter should contain `pmu=off` on the QEMU
41
+static void v7m_push_callee_stack(ARMCPU *cpu, uint32_t lr, bool dotailchain,
35
-command line, i.e. `-cpu cortex-a15,pmu=off`.
42
+ bool ignore_faults)
36
+a PMU, then the ``-cpu`` parameter should contain ``pmu=off`` on the QEMU
43
{
37
+command line, i.e. ``-cpu cortex-a15,pmu=off``.
44
/* For v8M, push the callee-saves register part of the stack frame.
38
45
* Compare the v8M pseudocode PushCalleeStack().
39
As not all CPU types support all optional CPU features, then whether or
46
@@ -XXX,XX +XXX,XX @@ static void v7m_push_callee_stack(ARMCPU *cpu, uint32_t lr, bool dotailchain)
40
not a CPU property exists depends on the CPU type. For example, CPUs
47
*frame_sp_p = frameptr;
41
that implement the ARMv8-A architecture reference manual may optionally
48
}
42
support the AArch32 CPU feature, which may be enabled by disabling the
49
43
-`aarch64` CPU property. A CPU type such as the Cortex-A15, which does
50
-static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain)
44
-not implement ARMv8-A, will not have the `aarch64` CPU property.
51
+static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
45
+``aarch64`` CPU property. A CPU type such as the Cortex-A15, which does
52
+ bool ignore_stackfaults)
46
+not implement ARMv8-A, will not have the ``aarch64`` CPU property.
53
{
47
54
/* Do the "take the exception" parts of exception entry,
48
QEMU's support may be limited for some CPU features, only partially
55
* but not the pushing of state to the stack. This is
49
supporting the feature or only supporting the feature under certain
56
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain)
50
-configurations. For example, the `aarch64` CPU feature, which, when
57
*/
51
+configurations. For example, the ``aarch64`` CPU feature, which, when
58
if (lr & R_V7M_EXCRET_DCRS_MASK &&
52
disabled, enables the optional AArch32 CPU feature, is only supported
59
!(dotailchain && (lr & R_V7M_EXCRET_ES_MASK))) {
53
when using the KVM accelerator and when running on a host CPU type that
60
- v7m_push_callee_stack(cpu, lr, dotailchain);
54
-supports the feature. While `aarch64` currently only works with KVM,
61
+ v7m_push_callee_stack(cpu, lr, dotailchain,
55
+supports the feature. While ``aarch64`` currently only works with KVM,
62
+ ignore_stackfaults);
56
it could work with TCG. CPU features that are specific to KVM are
63
}
57
prefixed with "kvm-" and are described in "KVM VCPU Features".
64
lr |= R_V7M_EXCRET_DCRS_MASK;
58
65
}
59
@@ -XXX,XX +XXX,XX @@ CPU Feature Probing
66
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain)
60
===================
67
env->thumb = addr & 1;
61
68
}
62
Determining which CPU features are available and functional for a given
69
63
-CPU type is possible with the `query-cpu-model-expansion` QMP command.
70
-static void v7m_push_stack(ARMCPU *cpu)
64
-Below are some examples where `scripts/qmp/qmp-shell` (see the top comment
71
+static bool v7m_push_stack(ARMCPU *cpu)
65
+CPU type is possible with the ``query-cpu-model-expansion`` QMP command.
72
{
66
+Below are some examples where ``scripts/qmp/qmp-shell`` (see the top comment
73
/* Do the "set up stack frame" part of exception entry,
67
block in the script for usage) is used to issue the QMP commands.
74
* similar to pseudocode PushStack().
68
75
+ * Return true if we generate a derived exception (and so
69
-1. Determine which CPU features are available for the `max` CPU type
76
+ * should ignore further stack faults trying to process
70
- (Note, we started QEMU with qemu-system-aarch64, so `max` is
77
+ * that derived exception.)
71
+1. Determine which CPU features are available for the ``max`` CPU type
78
*/
72
+ (Note, we started QEMU with qemu-system-aarch64, so ``max`` is
79
CPUARMState *env = &cpu->env;
73
implementing the ARMv8-A reference manual in this case)::
80
uint32_t xpsr = xpsr_read(env);
74
81
@@ -XXX,XX +XXX,XX @@ static void v7m_push_stack(ARMCPU *cpu)
75
(QEMU) query-cpu-model-expansion type=full model={"name":"max"}
82
v7m_push(env, env->regs[2]);
76
@@ -XXX,XX +XXX,XX @@ block in the script for usage) is used to issue the QMP commands.
83
v7m_push(env, env->regs[1]);
77
"sve896": true, "sve1280": true, "sve2048": true
84
v7m_push(env, env->regs[0]);
78
}}}}
85
+
79
86
+ return false;
80
-We see that the `max` CPU type has the `pmu`, `aarch64`, `sve`, and many
87
}
81
-`sve<N>` CPU features. We also see that all the CPU features are
88
82
-enabled, as they are all `true`. (The `sve<N>` CPU features are all
89
static void do_v7m_exception_exit(ARMCPU *cpu)
83
+We see that the ``max`` CPU type has the ``pmu``, ``aarch64``, ``sve``, and many
90
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
84
+``sve<N>`` CPU features. We also see that all the CPU features are
91
if (sfault) {
85
+enabled, as they are all ``true``. (The ``sve<N>`` CPU features are all
92
env->v7m.sfsr |= R_V7M_SFSR_INVER_MASK;
86
optional SVE vector lengths (see "SVE CPU Properties"). While with TCG
93
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_SECURE, false);
87
all SVE vector lengths can be supported, when KVM is in use it's more
94
- v7m_exception_taken(cpu, excret, true);
88
likely that only a few lengths will be supported, if SVE is supported at
95
+ v7m_exception_taken(cpu, excret, true, false);
89
@@ -XXX,XX +XXX,XX @@ all.)
96
qemu_log_mask(CPU_LOG_INT, "...taking SecureFault on existing "
90
"sve896": true, "sve1280": true, "sve2048": true
97
"stackframe: failed EXC_RETURN.ES validity check\n");
91
}}}}
98
return;
92
99
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
93
-We see it worked, as `pmu` is now `false`.
100
*/
94
+We see it worked, as ``pmu`` is now ``false``.
101
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
95
102
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE, env->v7m.secure);
96
-(3) Let's try to disable `aarch64`, which enables the AArch32 CPU feature::
103
- v7m_exception_taken(cpu, excret, true);
97
+(3) Let's try to disable ``aarch64``, which enables the AArch32 CPU feature::
104
+ v7m_exception_taken(cpu, excret, true, false);
98
105
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
99
(QEMU) query-cpu-model-expansion type=full model={"name":"max","props":{"aarch64":false}}
106
"stackframe: failed exception return integrity check\n");
100
{"error": {
107
return;
101
@@ -XXX,XX +XXX,XX @@ We see it worked, as `pmu` is now `false`.
108
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
102
It looks like this feature is limited to a configuration we do not
109
/* Take a SecureFault on the current stack */
103
currently have.
110
env->v7m.sfsr |= R_V7M_SFSR_INVIS_MASK;
104
111
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_SECURE, false);
105
-(4) Let's disable `sve` and see what happens to all the optional SVE
112
- v7m_exception_taken(cpu, excret, true);
106
+(4) Let's disable ``sve`` and see what happens to all the optional SVE
113
+ v7m_exception_taken(cpu, excret, true, false);
107
vector lengths::
114
qemu_log_mask(CPU_LOG_INT, "...taking SecureFault on existing "
108
115
"stackframe: failed exception return integrity "
109
(QEMU) query-cpu-model-expansion type=full model={"name":"max","props":{"sve":false}}
116
"signature check\n");
110
@@ -XXX,XX +XXX,XX @@ currently have.
117
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
111
"sve896": false, "sve1280": false, "sve2048": false
118
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE,
112
}}}}
119
env->v7m.secure);
113
120
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
114
-As expected they are now all `false`.
121
- v7m_exception_taken(cpu, excret, true);
115
+As expected they are now all ``false``.
122
+ v7m_exception_taken(cpu, excret, true, false);
116
123
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
117
(5) Let's try probing CPU features for the Cortex-A15 CPU type::
124
"stackframe: failed exception return integrity "
118
125
"check\n");
119
(QEMU) query-cpu-model-expansion type=full model={"name":"cortex-a15"}
126
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
120
{"return": {"model": {"name": "cortex-a15", "props": {"pmu": true}}}}
127
/* Take an INVPC UsageFault by pushing the stack again;
121
128
* we know we're v7M so this is never a Secure UsageFault.
122
-Only the `pmu` CPU feature is available.
129
*/
123
+Only the ``pmu`` CPU feature is available.
130
+ bool ignore_stackfaults;
124
131
+
125
A note about CPU feature dependencies
132
assert(!arm_feature(env, ARM_FEATURE_V8));
126
-------------------------------------
133
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE, false);
127
@@ -XXX,XX +XXX,XX @@ A note about CPU models and KVM
134
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
128
-------------------------------
135
- v7m_push_stack(cpu);
129
136
- v7m_exception_taken(cpu, excret, false);
130
Named CPU models generally do not work with KVM. There are a few cases
137
+ ignore_stackfaults = v7m_push_stack(cpu);
131
-that do work, e.g. using the named CPU model `cortex-a57` with KVM on a
138
+ v7m_exception_taken(cpu, excret, false, ignore_stackfaults);
132
-seattle host, but mostly if KVM is enabled the `host` CPU type must be
139
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on new stackframe: "
133
+that do work, e.g. using the named CPU model ``cortex-a57`` with KVM on a
140
"failed exception return integrity check\n");
134
+seattle host, but mostly if KVM is enabled the ``host`` CPU type must be
141
return;
135
used. This means the guest is provided all the same CPU features as the
142
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
136
-host CPU type has. And, for this reason, the `host` CPU type should
143
ARMCPU *cpu = ARM_CPU(cs);
137
+host CPU type has. And, for this reason, the ``host`` CPU type should
144
CPUARMState *env = &cpu->env;
138
enable all CPU features that the host has by default. Indeed it's even
145
uint32_t lr;
139
a bit strange to allow disabling CPU features that the host has when using
146
+ bool ignore_stackfaults;
140
-the `host` CPU type, but in the absence of CPU models it's the best we can
147
141
+the ``host`` CPU type, but in the absence of CPU models it's the best we can
148
arm_log_exception(cs->exception_index);
142
do if we want to launch guests without all the host's CPU features enabled.
149
143
150
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
144
-Enabling KVM also affects the `query-cpu-model-expansion` QMP command. The
151
lr |= R_V7M_EXCRET_MODE_MASK;
145
+Enabling KVM also affects the ``query-cpu-model-expansion`` QMP command. The
152
}
146
affect is not only limited to specific features, as pointed out in example
153
147
(3) of "CPU Feature Probing", but also to which CPU types may be expanded.
154
- v7m_push_stack(cpu);
148
-When KVM is enabled, only the `max`, `host`, and current CPU type may be
155
- v7m_exception_taken(cpu, lr, false);
149
+When KVM is enabled, only the ``max``, ``host``, and current CPU type may be
156
+ ignore_stackfaults = v7m_push_stack(cpu);
150
expanded. This restriction is necessary as it's not possible to know all
157
+ v7m_exception_taken(cpu, lr, false, ignore_stackfaults);
151
CPU types that may work with KVM, but it does impose a small risk of users
158
qemu_log_mask(CPU_LOG_INT, "... as %d\n", env->v7m.exception);
152
experiencing unexpected errors. For example on a seattle, as mentioned
159
}
153
-above, the `cortex-a57` CPU type is also valid when KVM is enabled.
154
-Therefore a user could use the `host` CPU type for the current type, but
155
-then attempt to query `cortex-a57`, however that query will fail with our
156
+above, the ``cortex-a57`` CPU type is also valid when KVM is enabled.
157
+Therefore a user could use the ``host`` CPU type for the current type, but
158
+then attempt to query ``cortex-a57``, however that query will fail with our
159
restrictions. This shouldn't be an issue though as management layers and
160
-users have been preferring the `host` CPU type for use with KVM for quite
161
+users have been preferring the ``host`` CPU type for use with KVM for quite
162
some time. Additionally, if the KVM-enabled QEMU instance running on a
163
-seattle host is using the `cortex-a57` CPU type, then querying `cortex-a57`
164
+seattle host is using the ``cortex-a57`` CPU type, then querying ``cortex-a57``
165
will work.
166
167
Using CPU Features
168
@@ -XXX,XX +XXX,XX @@ QEMU command line with that CPU type::
169
$ qemu-system-aarch64 -M virt -cpu max,pmu=off,sve=on,sve128=on,sve256=on
170
171
The example above disables the PMU and enables the first two SVE vector
172
-lengths for the `max` CPU type. Note, the `sve=on` isn't actually
173
-necessary, because, as we observed above with our probe of the `max` CPU
174
-type, `sve` is already on by default. Also, based on our probe of
175
+lengths for the ``max`` CPU type. Note, the ``sve=on`` isn't actually
176
+necessary, because, as we observed above with our probe of the ``max`` CPU
177
+type, ``sve`` is already on by default. Also, based on our probe of
178
defaults, it would seem we need to disable many SVE vector lengths, rather
179
than only enabling the two we want. This isn't the case, because, as
180
-disabling many SVE vector lengths would be quite verbose, the `sve<N>` CPU
181
+disabling many SVE vector lengths would be quite verbose, the ``sve<N>`` CPU
182
properties have special semantics (see "SVE CPU Property Parsing
183
Semantics").
184
185
@@ -XXX,XX +XXX,XX @@ TCG VCPU Features
186
TCG VCPU features are CPU features that are specific to TCG.
187
Below is the list of TCG VCPU features and their descriptions.
188
189
- pauth Enable or disable `FEAT_Pauth`, pointer
190
+ pauth Enable or disable ``FEAT_Pauth``, pointer
191
authentication. By default, the feature is
192
- enabled with `-cpu max`.
193
+ enabled with ``-cpu max``.
194
195
- pauth-impdef When `FEAT_Pauth` is enabled, either the
196
+ pauth-impdef When ``FEAT_Pauth`` is enabled, either the
197
*impdef* (Implementation Defined) algorithm
198
is enabled or the *architected* QARMA algorithm
199
is enabled. By default the impdef algorithm
200
@@ -XXX,XX +XXX,XX @@ Below is the list of TCG VCPU features and their descriptions.
201
SVE CPU Properties
202
==================
203
204
-There are two types of SVE CPU properties: `sve` and `sve<N>`. The first
205
-is used to enable or disable the entire SVE feature, just as the `pmu`
206
+There are two types of SVE CPU properties: ``sve`` and ``sve<N>``. The first
207
+is used to enable or disable the entire SVE feature, just as the ``pmu``
208
CPU property completely enables or disables the PMU. The second type
209
-is used to enable or disable specific vector lengths, where `N` is the
210
-number of bits of the length. The `sve<N>` CPU properties have special
211
+is used to enable or disable specific vector lengths, where ``N`` is the
212
+number of bits of the length. The ``sve<N>`` CPU properties have special
213
dependencies and constraints, see "SVE CPU Property Dependencies and
214
Constraints" below. Additionally, as we want all supported vector lengths
215
to be enabled by default, then, in order to avoid overly verbose command
216
-lines (command lines full of `sve<N>=off`, for all `N` not wanted), we
217
+lines (command lines full of ``sve<N>=off``, for all ``N`` not wanted), we
218
provide the parsing semantics listed in "SVE CPU Property Parsing
219
Semantics".
220
221
SVE CPU Property Dependencies and Constraints
222
---------------------------------------------
223
224
- 1) At least one vector length must be enabled when `sve` is enabled.
225
+ 1) At least one vector length must be enabled when ``sve`` is enabled.
226
227
- 2) If a vector length `N` is enabled, then, when KVM is enabled, all
228
+ 2) If a vector length ``N`` is enabled, then, when KVM is enabled, all
229
smaller, host supported vector lengths must also be enabled. If
230
KVM is not enabled, then only all the smaller, power-of-two vector
231
lengths must be enabled. E.g. with KVM if the host supports all
232
- vector lengths up to 512-bits (128, 256, 384, 512), then if `sve512`
233
+ vector lengths up to 512-bits (128, 256, 384, 512), then if ``sve512``
234
is enabled, the 128-bit vector length, 256-bit vector length, and
235
384-bit vector length must also be enabled. Without KVM, the 384-bit
236
vector length would not be required.
237
238
3) If KVM is enabled then only vector lengths that the host CPU type
239
support may be enabled. If SVE is not supported by the host, then
240
- no `sve*` properties may be enabled.
241
+ no ``sve*`` properties may be enabled.
242
243
SVE CPU Property Parsing Semantics
244
----------------------------------
245
246
- 1) If SVE is disabled (`sve=off`), then which SVE vector lengths
247
+ 1) If SVE is disabled (``sve=off``), then which SVE vector lengths
248
are enabled or disabled is irrelevant to the guest, as the entire
249
SVE feature is disabled and that disables all vector lengths for
250
- the guest. However QEMU will still track any `sve<N>` CPU
251
- properties provided by the user. If later an `sve=on` is provided,
252
- then the guest will get only the enabled lengths. If no `sve=on`
253
+ the guest. However QEMU will still track any ``sve<N>`` CPU
254
+ properties provided by the user. If later an ``sve=on`` is provided,
255
+ then the guest will get only the enabled lengths. If no ``sve=on``
256
is provided and there are explicitly enabled vector lengths, then
257
an error is generated.
258
259
- 2) If SVE is enabled (`sve=on`), but no `sve<N>` CPU properties are
260
+ 2) If SVE is enabled (``sve=on``), but no ``sve<N>`` CPU properties are
261
provided, then all supported vector lengths are enabled, which when
262
KVM is not in use means including the non-power-of-two lengths, and,
263
when KVM is in use, it means all vector lengths supported by the host
264
@@ -XXX,XX +XXX,XX @@ SVE CPU Property Parsing Semantics
265
constraint (2) of "SVE CPU Property Dependencies and Constraints").
266
267
5) When KVM is enabled, if the host does not support SVE, then an error
268
- is generated when attempting to enable any `sve*` properties (see
269
+ is generated when attempting to enable any ``sve*`` properties (see
270
constraint (3) of "SVE CPU Property Dependencies and Constraints").
271
272
6) When KVM is enabled, if the host does support SVE, then an error is
273
@@ -XXX,XX +XXX,XX @@ SVE CPU Property Parsing Semantics
274
by the host (see constraint (3) of "SVE CPU Property Dependencies and
275
Constraints").
276
277
- 7) If one or more `sve<N>` CPU properties are set `off`, but no `sve<N>`,
278
- CPU properties are set `on`, then the specified vector lengths are
279
+ 7) If one or more ``sve<N>`` CPU properties are set ``off``, but no ``sve<N>``,
280
+ CPU properties are set ``on``, then the specified vector lengths are
281
disabled but the default for any unspecified lengths remains enabled.
282
When KVM is not enabled, disabling a power-of-two vector length also
283
disables all vector lengths larger than the power-of-two length.
284
@@ -XXX,XX +XXX,XX @@ SVE CPU Property Parsing Semantics
285
disables all larger vector lengths (see constraint (2) of "SVE CPU
286
Property Dependencies and Constraints").
287
288
- 8) If one or more `sve<N>` CPU properties are set to `on`, then they
289
+ 8) If one or more ``sve<N>`` CPU properties are set to ``on``, then they
290
are enabled and all unspecified lengths default to disabled, except
291
for the required lengths per constraint (2) of "SVE CPU Property
292
Dependencies and Constraints", which will even be auto-enabled if
293
they were not explicitly enabled.
294
295
- 9) If SVE was disabled (`sve=off`), allowing all vector lengths to be
296
+ 9) If SVE was disabled (``sve=off``), allowing all vector lengths to be
297
explicitly disabled (i.e. avoiding the error specified in (3) of
298
- "SVE CPU Property Parsing Semantics"), then if later an `sve=on` is
299
+ "SVE CPU Property Parsing Semantics"), then if later an ``sve=on`` is
300
provided an error will be generated. To avoid this error, one must
301
enable at least one vector length prior to enabling SVE.
302
303
@@ -XXX,XX +XXX,XX @@ SVE CPU Property Examples
304
305
$ qemu-system-aarch64 -M virt -cpu max,sve=off
306
307
- 2) Implicitly enable all vector lengths for the `max` CPU type::
308
+ 2) Implicitly enable all vector lengths for the ``max`` CPU type::
309
310
$ qemu-system-aarch64 -M virt -cpu max
311
312
3) When KVM is enabled, implicitly enable all host CPU supported vector
313
- lengths with the `host` CPU type::
314
+ lengths with the ``host`` CPU type::
315
316
$ qemu-system-aarch64 -M virt,accel=kvm -cpu host
160
317
161
--
318
--
162
2.16.1
319
2.20.1
163
320
164
321
diff view generated by jsdifflib
1
Handle possible MPU faults, SAU faults or bus errors when
1
In rST markup, single backticks `like this` represent "interpreted
2
popping register state off the stack during exception return.
2
text", which can be handled as a bunch of different things if tagged
3
with a specific "role":
4
https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#interpreted-text
5
(the most common one for us is "reference to a URL, which gets
6
hyperlinked").
7
8
The default "role" if none is specified is "title_reference",
9
intended for references to book or article titles, and it renders
10
into the HTML as <cite>...</cite> (usually comes out as italics).
11
12
This commit fixes various places in the manual which were
13
using single backticks when double backticks (for literal text)
14
were intended, and covers those files where only one or two
15
instances of these errors were made.
3
16
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 1517324542-6607-8-git-send-email-peter.maydell@linaro.org
7
---
19
---
8
target/arm/helper.c | 115 ++++++++++++++++++++++++++++++++++++++++++----------
20
docs/about/index.rst | 2 +-
9
1 file changed, 94 insertions(+), 21 deletions(-)
21
docs/interop/live-block-operations.rst | 2 +-
22
docs/system/arm/nuvoton.rst | 2 +-
23
docs/system/arm/sbsa.rst | 4 ++--
24
docs/system/arm/virt.rst | 2 +-
25
docs/system/cpu-hotplug.rst | 2 +-
26
docs/system/guest-loader.rst | 6 +++---
27
docs/system/ppc/powernv.rst | 8 ++++----
28
docs/system/riscv/microchip-icicle-kit.rst | 2 +-
29
docs/system/riscv/virt.rst | 2 +-
30
10 files changed, 16 insertions(+), 16 deletions(-)
10
31
11
diff --git a/target/arm/helper.c b/target/arm/helper.c
32
diff --git a/docs/about/index.rst b/docs/about/index.rst
12
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/helper.c
34
--- a/docs/about/index.rst
14
+++ b/target/arm/helper.c
35
+++ b/docs/about/index.rst
15
@@ -XXX,XX +XXX,XX @@ pend_fault:
36
@@ -XXX,XX +XXX,XX @@ where QEMU can launch processes compiled for one CPU on another CPU.
16
return false;
37
In this mode the CPU is always emulated.
17
}
38
18
39
QEMU also provides a number of standalone commandline utilities,
19
+static bool v7m_stack_read(ARMCPU *cpu, uint32_t *dest, uint32_t addr,
40
-such as the `qemu-img` disk image utility that allows you to create,
20
+ ARMMMUIdx mmu_idx)
41
+such as the ``qemu-img`` disk image utility that allows you to create,
21
+{
42
convert and modify disk images.
22
+ CPUState *cs = CPU(cpu);
43
23
+ CPUARMState *env = &cpu->env;
44
.. toctree::
24
+ MemTxAttrs attrs = {};
45
diff --git a/docs/interop/live-block-operations.rst b/docs/interop/live-block-operations.rst
25
+ MemTxResult txres;
46
index XXXXXXX..XXXXXXX 100644
26
+ target_ulong page_size;
47
--- a/docs/interop/live-block-operations.rst
27
+ hwaddr physaddr;
48
+++ b/docs/interop/live-block-operations.rst
28
+ int prot;
49
@@ -XXX,XX +XXX,XX @@ the content of image [D].
29
+ ARMMMUFaultInfo fi;
30
+ bool secure = mmu_idx & ARM_MMU_IDX_M_S;
31
+ int exc;
32
+ bool exc_secure;
33
+ uint32_t value;
34
+
35
+ if (get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &physaddr,
36
+ &attrs, &prot, &page_size, &fi, NULL)) {
37
+ /* MPU/SAU lookup failed */
38
+ if (fi.type == ARMFault_QEMU_SFault) {
39
+ qemu_log_mask(CPU_LOG_INT,
40
+ "...SecureFault with SFSR.AUVIOL during unstack\n");
41
+ env->v7m.sfsr |= R_V7M_SFSR_AUVIOL_MASK | R_V7M_SFSR_SFARVALID_MASK;
42
+ env->v7m.sfar = addr;
43
+ exc = ARMV7M_EXCP_SECURE;
44
+ exc_secure = false;
45
+ } else {
46
+ qemu_log_mask(CPU_LOG_INT,
47
+ "...MemManageFault with CFSR.MUNSTKERR\n");
48
+ env->v7m.cfsr[secure] |= R_V7M_CFSR_MUNSTKERR_MASK;
49
+ exc = ARMV7M_EXCP_MEM;
50
+ exc_secure = secure;
51
+ }
52
+ goto pend_fault;
53
+ }
54
+
55
+ value = address_space_ldl(arm_addressspace(cs, attrs), physaddr,
56
+ attrs, &txres);
57
+ if (txres != MEMTX_OK) {
58
+ /* BusFault trying to read the data */
59
+ qemu_log_mask(CPU_LOG_INT, "...BusFault with BFSR.UNSTKERR\n");
60
+ env->v7m.cfsr[M_REG_NS] |= R_V7M_CFSR_UNSTKERR_MASK;
61
+ exc = ARMV7M_EXCP_BUS;
62
+ exc_secure = false;
63
+ goto pend_fault;
64
+ }
65
+
66
+ *dest = value;
67
+ return true;
68
+
69
+pend_fault:
70
+ /* By pending the exception at this point we are making
71
+ * the IMPDEF choice "overridden exceptions pended" (see the
72
+ * MergeExcInfo() pseudocode). The other choice would be to not
73
+ * pend them now and then make a choice about which to throw away
74
+ * later if we have two derived exceptions.
75
+ */
76
+ armv7m_nvic_set_pending(env->nvic, exc, exc_secure);
77
+ return false;
78
+}
79
+
80
/* Return true if we're using the process stack pointer (not the MSP) */
81
static bool v7m_using_psp(CPUARMState *env)
82
{
83
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
84
!return_to_handler,
85
return_to_sp_process);
86
uint32_t frameptr = *frame_sp_p;
87
+ bool pop_ok = true;
88
+ ARMMMUIdx mmu_idx;
89
+
90
+ mmu_idx = arm_v7m_mmu_idx_for_secstate_and_priv(env, return_to_secure,
91
+ !return_to_handler);
92
93
if (!QEMU_IS_ALIGNED(frameptr, 8) &&
94
arm_feature(env, ARM_FEATURE_V8)) {
95
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
96
return;
97
}
98
99
- env->regs[4] = ldl_phys(cs->as, frameptr + 0x8);
100
- env->regs[5] = ldl_phys(cs->as, frameptr + 0xc);
101
- env->regs[6] = ldl_phys(cs->as, frameptr + 0x10);
102
- env->regs[7] = ldl_phys(cs->as, frameptr + 0x14);
103
- env->regs[8] = ldl_phys(cs->as, frameptr + 0x18);
104
- env->regs[9] = ldl_phys(cs->as, frameptr + 0x1c);
105
- env->regs[10] = ldl_phys(cs->as, frameptr + 0x20);
106
- env->regs[11] = ldl_phys(cs->as, frameptr + 0x24);
107
+ pop_ok =
108
+ v7m_stack_read(cpu, &env->regs[4], frameptr + 0x8, mmu_idx) &&
109
+ v7m_stack_read(cpu, &env->regs[4], frameptr + 0x8, mmu_idx) &&
110
+ v7m_stack_read(cpu, &env->regs[5], frameptr + 0xc, mmu_idx) &&
111
+ v7m_stack_read(cpu, &env->regs[6], frameptr + 0x10, mmu_idx) &&
112
+ v7m_stack_read(cpu, &env->regs[7], frameptr + 0x14, mmu_idx) &&
113
+ v7m_stack_read(cpu, &env->regs[8], frameptr + 0x18, mmu_idx) &&
114
+ v7m_stack_read(cpu, &env->regs[9], frameptr + 0x1c, mmu_idx) &&
115
+ v7m_stack_read(cpu, &env->regs[10], frameptr + 0x20, mmu_idx) &&
116
+ v7m_stack_read(cpu, &env->regs[11], frameptr + 0x24, mmu_idx);
117
118
frameptr += 0x28;
119
}
50
}
120
51
121
- /* Pop registers. TODO: make these accesses use the correct
52
(6) [On *destination* QEMU] Finally, resume the guest vCPUs by issuing the
122
- * attributes and address space (S/NS, priv/unpriv) and handle
53
- QMP command `cont`::
123
- * memory transaction failures.
54
+ QMP command ``cont``::
124
- */
55
125
- env->regs[0] = ldl_phys(cs->as, frameptr);
56
(QEMU) cont
126
- env->regs[1] = ldl_phys(cs->as, frameptr + 0x4);
57
{
127
- env->regs[2] = ldl_phys(cs->as, frameptr + 0x8);
58
diff --git a/docs/system/arm/nuvoton.rst b/docs/system/arm/nuvoton.rst
128
- env->regs[3] = ldl_phys(cs->as, frameptr + 0xc);
59
index XXXXXXX..XXXXXXX 100644
129
- env->regs[12] = ldl_phys(cs->as, frameptr + 0x10);
60
--- a/docs/system/arm/nuvoton.rst
130
- env->regs[14] = ldl_phys(cs->as, frameptr + 0x14);
61
+++ b/docs/system/arm/nuvoton.rst
131
- env->regs[15] = ldl_phys(cs->as, frameptr + 0x18);
62
@@ -XXX,XX +XXX,XX @@ Boot options
132
+ /* Pop registers */
63
------------
133
+ pop_ok = pop_ok &&
64
134
+ v7m_stack_read(cpu, &env->regs[0], frameptr, mmu_idx) &&
65
The Nuvoton machines can boot from an OpenBMC firmware image, or directly into
135
+ v7m_stack_read(cpu, &env->regs[1], frameptr + 0x4, mmu_idx) &&
66
-a kernel using the ``-kernel`` option. OpenBMC images for `quanta-gsj` and
136
+ v7m_stack_read(cpu, &env->regs[2], frameptr + 0x8, mmu_idx) &&
67
+a kernel using the ``-kernel`` option. OpenBMC images for ``quanta-gsj`` and
137
+ v7m_stack_read(cpu, &env->regs[3], frameptr + 0xc, mmu_idx) &&
68
possibly others can be downloaded from the OpenPOWER jenkins :
138
+ v7m_stack_read(cpu, &env->regs[12], frameptr + 0x10, mmu_idx) &&
69
139
+ v7m_stack_read(cpu, &env->regs[14], frameptr + 0x14, mmu_idx) &&
70
https://openpower.xyz/
140
+ v7m_stack_read(cpu, &env->regs[15], frameptr + 0x18, mmu_idx) &&
71
diff --git a/docs/system/arm/sbsa.rst b/docs/system/arm/sbsa.rst
141
+ v7m_stack_read(cpu, &xpsr, frameptr + 0x1c, mmu_idx);
72
index XXXXXXX..XXXXXXX 100644
142
+
73
--- a/docs/system/arm/sbsa.rst
143
+ if (!pop_ok) {
74
+++ b/docs/system/arm/sbsa.rst
144
+ /* v7m_stack_read() pended a fault, so take it (as a tail
75
@@ -XXX,XX +XXX,XX @@
145
+ * chained exception on the same stack frame)
76
Arm Server Base System Architecture Reference board (``sbsa-ref``)
146
+ */
77
==================================================================
147
+ v7m_exception_taken(cpu, excret, true, false);
78
148
+ return;
79
-While the `virt` board is a generic board platform that doesn't match
149
+ }
80
-any real hardware the `sbsa-ref` board intends to look like real
150
81
+While the ``virt`` board is a generic board platform that doesn't match
151
/* Returning from an exception with a PC with bit 0 set is defined
82
+any real hardware the ``sbsa-ref`` board intends to look like real
152
* behaviour on v8M (bit 0 is ignored), but for v7M it was specified
83
hardware. The `Server Base System Architecture
153
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
84
<https://developer.arm.com/documentation/den0029/latest>`_ defines a
154
}
85
minimum base line of hardware support and importantly how the firmware
155
}
86
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
156
87
index XXXXXXX..XXXXXXX 100644
157
- xpsr = ldl_phys(cs->as, frameptr + 0x1c);
88
--- a/docs/system/arm/virt.rst
158
-
89
+++ b/docs/system/arm/virt.rst
159
if (arm_feature(env, ARM_FEATURE_V8)) {
90
@@ -XXX,XX +XXX,XX @@
160
/* For v8M we have to check whether the xPSR exception field
91
'virt' generic virtual platform (``virt``)
161
* matches the EXCRET value for return to handler/thread
92
==========================================
93
94
-The `virt` board is a platform which does not correspond to any
95
+The ``virt`` board is a platform which does not correspond to any
96
real hardware; it is designed for use in virtual machines.
97
It is the recommended board type if you simply want to run
98
a guest such as Linux and do not care about reproducing the
99
diff --git a/docs/system/cpu-hotplug.rst b/docs/system/cpu-hotplug.rst
100
index XXXXXXX..XXXXXXX 100644
101
--- a/docs/system/cpu-hotplug.rst
102
+++ b/docs/system/cpu-hotplug.rst
103
@@ -XXX,XX +XXX,XX @@ vCPU hotplug
104
}
105
(QEMU)
106
107
-(5) Optionally, run QMP `query-cpus-fast` for some details about the
108
+(5) Optionally, run QMP ``query-cpus-fast`` for some details about the
109
vCPUs::
110
111
(QEMU) query-cpus-fast
112
diff --git a/docs/system/guest-loader.rst b/docs/system/guest-loader.rst
113
index XXXXXXX..XXXXXXX 100644
114
--- a/docs/system/guest-loader.rst
115
+++ b/docs/system/guest-loader.rst
116
@@ -XXX,XX +XXX,XX @@
117
Guest Loader
118
------------
119
120
-The guest loader is similar to the `generic-loader` although it is
121
+The guest loader is similar to the ``generic-loader`` although it is
122
aimed at a particular use case of loading hypervisor guests. This is
123
useful for debugging hypervisors without having to jump through the
124
hoops of firmware and boot-loaders.
125
@@ -XXX,XX +XXX,XX @@ multi-boot capability. A typical example would look like:
126
In the above example the Xen hypervisor is loaded by the -kernel
127
parameter and passed it's boot arguments via -append. The Dom0 guest
128
is loaded into the areas of memory. Each blob will get
129
-`/chosen/module@<addr>` entry in the FDT to indicate it's location and
130
+``/chosen/module@<addr>`` entry in the FDT to indicate it's location and
131
size. Additional information can be passed with by using additional
132
arguments.
133
134
Currently the only supported machines which use FDT data to boot are
135
-the ARM and RiscV `virt` machines.
136
+the ARM and RiscV ``virt`` machines.
137
138
Arguments
139
^^^^^^^^^
140
diff --git a/docs/system/ppc/powernv.rst b/docs/system/ppc/powernv.rst
141
index XXXXXXX..XXXXXXX 100644
142
--- a/docs/system/ppc/powernv.rst
143
+++ b/docs/system/ppc/powernv.rst
144
@@ -XXX,XX +XXX,XX @@ Firmware
145
--------
146
147
The OPAL firmware (OpenPower Abstraction Layer) for OpenPower systems
148
-includes the runtime services `skiboot` and the bootloader kernel and
149
-initramfs `skiroot`. Source code can be found on GitHub:
150
+includes the runtime services ``skiboot`` and the bootloader kernel and
151
+initramfs ``skiroot``. Source code can be found on GitHub:
152
153
https://github.com/open-power.
154
155
-Prebuilt images of `skiboot` and `skiboot` are made available on the `OpenPOWER <https://openpower.xyz/job/openpower/job/openpower-op-build/>`__ site. To boot a POWER9 machine, use the `witherspoon <https://openpower.xyz/job/openpower/job/openpower-op-build/label=slave,target=witherspoon/lastSuccessfulBuild/>`__ images. For POWER8, use
156
+Prebuilt images of ``skiboot`` and ``skiboot`` are made available on the `OpenPOWER <https://openpower.xyz/job/openpower/job/openpower-op-build/>`__ site. To boot a POWER9 machine, use the `witherspoon <https://openpower.xyz/job/openpower/job/openpower-op-build/label=slave,target=witherspoon/lastSuccessfulBuild/>`__ images. For POWER8, use
157
the `palmetto <https://openpower.xyz/job/openpower/job/openpower-op-build/label=slave,target=palmetto/lastSuccessfulBuild/>`__ images.
158
159
-QEMU includes a prebuilt image of `skiboot` which is updated when a
160
+QEMU includes a prebuilt image of ``skiboot`` which is updated when a
161
more recent version is required by the models.
162
163
Boot options
164
diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
165
index XXXXXXX..XXXXXXX 100644
166
--- a/docs/system/riscv/microchip-icicle-kit.rst
167
+++ b/docs/system/riscv/microchip-icicle-kit.rst
168
@@ -XXX,XX +XXX,XX @@ Then we can boot the machine by:
169
-serial chardev:serial1
170
171
With above command line, current terminal session will be used for the first
172
-serial port. Open another terminal window, and use `minicom` to connect the
173
+serial port. Open another terminal window, and use ``minicom`` to connect the
174
second serial port.
175
176
.. code-block:: bash
177
diff --git a/docs/system/riscv/virt.rst b/docs/system/riscv/virt.rst
178
index XXXXXXX..XXXXXXX 100644
179
--- a/docs/system/riscv/virt.rst
180
+++ b/docs/system/riscv/virt.rst
181
@@ -XXX,XX +XXX,XX @@
182
'virt' Generic Virtual Platform (``virt``)
183
==========================================
184
185
-The `virt` board is a platform which does not correspond to any real hardware;
186
+The ``virt`` board is a platform which does not correspond to any real hardware;
187
it is designed for use in virtual machines. It is the recommended board type
188
if you simply want to run a guest such as Linux and do not care about
189
reproducing the idiosyncrasies and limitations of a particular bit of
162
--
190
--
163
2.16.1
191
2.20.1
164
192
165
193
diff view generated by jsdifflib
Deleted patch
1
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
2
1
3
This implements emulation of the new SHA-512 instructions that have
4
been added as an optional extensions to the ARMv8 Crypto Extensions
5
in ARM v8.2.
6
7
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
8
Message-id: 20180207111729.15737-2-ard.biesheuvel@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/cpu.h | 1 +
13
target/arm/helper.h | 5 +++
14
target/arm/crypto_helper.c | 90 ++++++++++++++++++++++++++++++++++++-
15
target/arm/translate-a64.c | 110 +++++++++++++++++++++++++++++++++++++++++++++
16
4 files changed, 205 insertions(+), 1 deletion(-)
17
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.h
21
+++ b/target/arm/cpu.h
22
@@ -XXX,XX +XXX,XX @@ enum arm_features {
23
ARM_FEATURE_M_SECURITY, /* M profile Security Extension */
24
ARM_FEATURE_JAZELLE, /* has (trivial) Jazelle implementation */
25
ARM_FEATURE_SVE, /* has Scalable Vector Extension */
26
+ ARM_FEATURE_V8_SHA512, /* implements SHA512 part of v8 Crypto Extensions */
27
};
28
29
static inline int arm_feature(CPUARMState *env, int feature)
30
diff --git a/target/arm/helper.h b/target/arm/helper.h
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/helper.h
33
+++ b/target/arm/helper.h
34
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(crypto_sha256h2, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
35
DEF_HELPER_FLAGS_2(crypto_sha256su0, TCG_CALL_NO_RWG, void, ptr, ptr)
36
DEF_HELPER_FLAGS_3(crypto_sha256su1, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
37
38
+DEF_HELPER_FLAGS_3(crypto_sha512h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
39
+DEF_HELPER_FLAGS_3(crypto_sha512h2, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
40
+DEF_HELPER_FLAGS_2(crypto_sha512su0, TCG_CALL_NO_RWG, void, ptr, ptr)
41
+DEF_HELPER_FLAGS_3(crypto_sha512su1, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
42
+
43
DEF_HELPER_FLAGS_3(crc32, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
44
DEF_HELPER_FLAGS_3(crc32c, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
45
DEF_HELPER_2(dc_zva, void, env, i64)
46
diff --git a/target/arm/crypto_helper.c b/target/arm/crypto_helper.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/crypto_helper.c
49
+++ b/target/arm/crypto_helper.c
50
@@ -XXX,XX +XXX,XX @@
51
/*
52
* crypto_helper.c - emulate v8 Crypto Extensions instructions
53
*
54
- * Copyright (C) 2013 - 2014 Linaro Ltd <ard.biesheuvel@linaro.org>
55
+ * Copyright (C) 2013 - 2018 Linaro Ltd <ard.biesheuvel@linaro.org>
56
*
57
* This library is free software; you can redistribute it and/or
58
* modify it under the terms of the GNU Lesser General Public
59
@@ -XXX,XX +XXX,XX @@ void HELPER(crypto_sha256su1)(void *vd, void *vn, void *vm)
60
rd[0] = d.l[0];
61
rd[1] = d.l[1];
62
}
63
+
64
+/*
65
+ * The SHA-512 logical functions (same as above but using 64-bit operands)
66
+ */
67
+
68
+static uint64_t cho512(uint64_t x, uint64_t y, uint64_t z)
69
+{
70
+ return (x & (y ^ z)) ^ z;
71
+}
72
+
73
+static uint64_t maj512(uint64_t x, uint64_t y, uint64_t z)
74
+{
75
+ return (x & y) | ((x | y) & z);
76
+}
77
+
78
+static uint64_t S0_512(uint64_t x)
79
+{
80
+ return ror64(x, 28) ^ ror64(x, 34) ^ ror64(x, 39);
81
+}
82
+
83
+static uint64_t S1_512(uint64_t x)
84
+{
85
+ return ror64(x, 14) ^ ror64(x, 18) ^ ror64(x, 41);
86
+}
87
+
88
+static uint64_t s0_512(uint64_t x)
89
+{
90
+ return ror64(x, 1) ^ ror64(x, 8) ^ (x >> 7);
91
+}
92
+
93
+static uint64_t s1_512(uint64_t x)
94
+{
95
+ return ror64(x, 19) ^ ror64(x, 61) ^ (x >> 6);
96
+}
97
+
98
+void HELPER(crypto_sha512h)(void *vd, void *vn, void *vm)
99
+{
100
+ uint64_t *rd = vd;
101
+ uint64_t *rn = vn;
102
+ uint64_t *rm = vm;
103
+ uint64_t d0 = rd[0];
104
+ uint64_t d1 = rd[1];
105
+
106
+ d1 += S1_512(rm[1]) + cho512(rm[1], rn[0], rn[1]);
107
+ d0 += S1_512(d1 + rm[0]) + cho512(d1 + rm[0], rm[1], rn[0]);
108
+
109
+ rd[0] = d0;
110
+ rd[1] = d1;
111
+}
112
+
113
+void HELPER(crypto_sha512h2)(void *vd, void *vn, void *vm)
114
+{
115
+ uint64_t *rd = vd;
116
+ uint64_t *rn = vn;
117
+ uint64_t *rm = vm;
118
+ uint64_t d0 = rd[0];
119
+ uint64_t d1 = rd[1];
120
+
121
+ d1 += S0_512(rm[0]) + maj512(rn[0], rm[1], rm[0]);
122
+ d0 += S0_512(d1) + maj512(d1, rm[0], rm[1]);
123
+
124
+ rd[0] = d0;
125
+ rd[1] = d1;
126
+}
127
+
128
+void HELPER(crypto_sha512su0)(void *vd, void *vn)
129
+{
130
+ uint64_t *rd = vd;
131
+ uint64_t *rn = vn;
132
+ uint64_t d0 = rd[0];
133
+ uint64_t d1 = rd[1];
134
+
135
+ d0 += s0_512(rd[1]);
136
+ d1 += s0_512(rn[0]);
137
+
138
+ rd[0] = d0;
139
+ rd[1] = d1;
140
+}
141
+
142
+void HELPER(crypto_sha512su1)(void *vd, void *vn, void *vm)
143
+{
144
+ uint64_t *rd = vd;
145
+ uint64_t *rn = vn;
146
+ uint64_t *rm = vm;
147
+
148
+ rd[0] += s1_512(rn[0]) + rm[0];
149
+ rd[1] += s1_512(rn[1]) + rm[1];
150
+}
151
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
152
index XXXXXXX..XXXXXXX 100644
153
--- a/target/arm/translate-a64.c
154
+++ b/target/arm/translate-a64.c
155
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_two_reg_sha(DisasContext *s, uint32_t insn)
156
tcg_temp_free_ptr(tcg_rn_ptr);
157
}
158
159
+/* Crypto three-reg SHA512
160
+ * 31 21 20 16 15 14 13 12 11 10 9 5 4 0
161
+ * +-----------------------+------+---+---+-----+--------+------+------+
162
+ * | 1 1 0 0 1 1 1 0 0 1 1 | Rm | 1 | O | 0 0 | opcode | Rn | Rd |
163
+ * +-----------------------+------+---+---+-----+--------+------+------+
164
+ */
165
+static void disas_crypto_three_reg_sha512(DisasContext *s, uint32_t insn)
166
+{
167
+ int opcode = extract32(insn, 10, 2);
168
+ int o = extract32(insn, 14, 1);
169
+ int rm = extract32(insn, 16, 5);
170
+ int rn = extract32(insn, 5, 5);
171
+ int rd = extract32(insn, 0, 5);
172
+ int feature;
173
+ CryptoThreeOpFn *genfn;
174
+
175
+ if (o == 0) {
176
+ switch (opcode) {
177
+ case 0: /* SHA512H */
178
+ feature = ARM_FEATURE_V8_SHA512;
179
+ genfn = gen_helper_crypto_sha512h;
180
+ break;
181
+ case 1: /* SHA512H2 */
182
+ feature = ARM_FEATURE_V8_SHA512;
183
+ genfn = gen_helper_crypto_sha512h2;
184
+ break;
185
+ case 2: /* SHA512SU1 */
186
+ feature = ARM_FEATURE_V8_SHA512;
187
+ genfn = gen_helper_crypto_sha512su1;
188
+ break;
189
+ default:
190
+ unallocated_encoding(s);
191
+ return;
192
+ }
193
+ } else {
194
+ unallocated_encoding(s);
195
+ return;
196
+ }
197
+
198
+ if (!arm_dc_feature(s, feature)) {
199
+ unallocated_encoding(s);
200
+ return;
201
+ }
202
+
203
+ if (!fp_access_check(s)) {
204
+ return;
205
+ }
206
+
207
+ if (genfn) {
208
+ TCGv_ptr tcg_rd_ptr, tcg_rn_ptr, tcg_rm_ptr;
209
+
210
+ tcg_rd_ptr = vec_full_reg_ptr(s, rd);
211
+ tcg_rn_ptr = vec_full_reg_ptr(s, rn);
212
+ tcg_rm_ptr = vec_full_reg_ptr(s, rm);
213
+
214
+ genfn(tcg_rd_ptr, tcg_rn_ptr, tcg_rm_ptr);
215
+
216
+ tcg_temp_free_ptr(tcg_rd_ptr);
217
+ tcg_temp_free_ptr(tcg_rn_ptr);
218
+ tcg_temp_free_ptr(tcg_rm_ptr);
219
+ } else {
220
+ g_assert_not_reached();
221
+ }
222
+}
223
+
224
+/* Crypto two-reg SHA512
225
+ * 31 12 11 10 9 5 4 0
226
+ * +-----------------------------------------+--------+------+------+
227
+ * | 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 | opcode | Rn | Rd |
228
+ * +-----------------------------------------+--------+------+------+
229
+ */
230
+static void disas_crypto_two_reg_sha512(DisasContext *s, uint32_t insn)
231
+{
232
+ int opcode = extract32(insn, 10, 2);
233
+ int rn = extract32(insn, 5, 5);
234
+ int rd = extract32(insn, 0, 5);
235
+ TCGv_ptr tcg_rd_ptr, tcg_rn_ptr;
236
+ int feature;
237
+ CryptoTwoOpFn *genfn;
238
+
239
+ switch (opcode) {
240
+ case 0: /* SHA512SU0 */
241
+ feature = ARM_FEATURE_V8_SHA512;
242
+ genfn = gen_helper_crypto_sha512su0;
243
+ break;
244
+ default:
245
+ unallocated_encoding(s);
246
+ return;
247
+ }
248
+
249
+ if (!arm_dc_feature(s, feature)) {
250
+ unallocated_encoding(s);
251
+ return;
252
+ }
253
+
254
+ if (!fp_access_check(s)) {
255
+ return;
256
+ }
257
+
258
+ tcg_rd_ptr = vec_full_reg_ptr(s, rd);
259
+ tcg_rn_ptr = vec_full_reg_ptr(s, rn);
260
+
261
+ genfn(tcg_rd_ptr, tcg_rn_ptr);
262
+
263
+ tcg_temp_free_ptr(tcg_rd_ptr);
264
+ tcg_temp_free_ptr(tcg_rn_ptr);
265
+}
266
+
267
/* C3.6 Data processing - SIMD, inc Crypto
268
*
269
* As the decode gets a little complex we are using a table based
270
@@ -XXX,XX +XXX,XX @@ static const AArch64DecodeTable data_proc_simd[] = {
271
{ 0x4e280800, 0xff3e0c00, disas_crypto_aes },
272
{ 0x5e000000, 0xff208c00, disas_crypto_three_reg_sha },
273
{ 0x5e280800, 0xff3e0c00, disas_crypto_two_reg_sha },
274
+ { 0xce608000, 0xffe0b000, disas_crypto_three_reg_sha512 },
275
+ { 0xcec08000, 0xfffff000, disas_crypto_two_reg_sha512 },
276
{ 0x00000000, 0x00000000, NULL }
277
};
278
279
--
280
2.16.1
281
282
diff view generated by jsdifflib
Deleted patch
1
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
2
1
3
This implements emulation of the new SHA-3 instructions that have
4
been added as an optional extensions to the ARMv8 Crypto Extensions
5
in ARM v8.2.
6
7
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
8
Message-id: 20180207111729.15737-3-ard.biesheuvel@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/cpu.h | 1 +
13
target/arm/translate-a64.c | 148 +++++++++++++++++++++++++++++++++++++++++++--
14
2 files changed, 145 insertions(+), 4 deletions(-)
15
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
19
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ enum arm_features {
21
ARM_FEATURE_JAZELLE, /* has (trivial) Jazelle implementation */
22
ARM_FEATURE_SVE, /* has Scalable Vector Extension */
23
ARM_FEATURE_V8_SHA512, /* implements SHA512 part of v8 Crypto Extensions */
24
+ ARM_FEATURE_V8_SHA3, /* implements SHA3 part of v8 Crypto Extensions */
25
};
26
27
static inline int arm_feature(CPUARMState *env, int feature)
28
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/translate-a64.c
31
+++ b/target/arm/translate-a64.c
32
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_three_reg_sha512(DisasContext *s, uint32_t insn)
33
feature = ARM_FEATURE_V8_SHA512;
34
genfn = gen_helper_crypto_sha512su1;
35
break;
36
- default:
37
- unallocated_encoding(s);
38
- return;
39
+ case 3: /* RAX1 */
40
+ feature = ARM_FEATURE_V8_SHA3;
41
+ genfn = NULL;
42
+ break;
43
}
44
} else {
45
unallocated_encoding(s);
46
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_three_reg_sha512(DisasContext *s, uint32_t insn)
47
tcg_temp_free_ptr(tcg_rn_ptr);
48
tcg_temp_free_ptr(tcg_rm_ptr);
49
} else {
50
- g_assert_not_reached();
51
+ TCGv_i64 tcg_op1, tcg_op2, tcg_res[2];
52
+ int pass;
53
+
54
+ tcg_op1 = tcg_temp_new_i64();
55
+ tcg_op2 = tcg_temp_new_i64();
56
+ tcg_res[0] = tcg_temp_new_i64();
57
+ tcg_res[1] = tcg_temp_new_i64();
58
+
59
+ for (pass = 0; pass < 2; pass++) {
60
+ read_vec_element(s, tcg_op1, rn, pass, MO_64);
61
+ read_vec_element(s, tcg_op2, rm, pass, MO_64);
62
+
63
+ tcg_gen_rotli_i64(tcg_res[pass], tcg_op2, 1);
64
+ tcg_gen_xor_i64(tcg_res[pass], tcg_res[pass], tcg_op1);
65
+ }
66
+ write_vec_element(s, tcg_res[0], rd, 0, MO_64);
67
+ write_vec_element(s, tcg_res[1], rd, 1, MO_64);
68
+
69
+ tcg_temp_free_i64(tcg_op1);
70
+ tcg_temp_free_i64(tcg_op2);
71
+ tcg_temp_free_i64(tcg_res[0]);
72
+ tcg_temp_free_i64(tcg_res[1]);
73
}
74
}
75
76
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_two_reg_sha512(DisasContext *s, uint32_t insn)
77
tcg_temp_free_ptr(tcg_rn_ptr);
78
}
79
80
+/* Crypto four-register
81
+ * 31 23 22 21 20 16 15 14 10 9 5 4 0
82
+ * +-------------------+-----+------+---+------+------+------+
83
+ * | 1 1 0 0 1 1 1 0 0 | Op0 | Rm | 0 | Ra | Rn | Rd |
84
+ * +-------------------+-----+------+---+------+------+------+
85
+ */
86
+static void disas_crypto_four_reg(DisasContext *s, uint32_t insn)
87
+{
88
+ int op0 = extract32(insn, 21, 2);
89
+ int rm = extract32(insn, 16, 5);
90
+ int ra = extract32(insn, 10, 5);
91
+ int rn = extract32(insn, 5, 5);
92
+ int rd = extract32(insn, 0, 5);
93
+ int feature;
94
+
95
+ switch (op0) {
96
+ case 0: /* EOR3 */
97
+ case 1: /* BCAX */
98
+ feature = ARM_FEATURE_V8_SHA3;
99
+ break;
100
+ default:
101
+ unallocated_encoding(s);
102
+ return;
103
+ }
104
+
105
+ if (!arm_dc_feature(s, feature)) {
106
+ unallocated_encoding(s);
107
+ return;
108
+ }
109
+
110
+ if (!fp_access_check(s)) {
111
+ return;
112
+ }
113
+
114
+ if (op0 < 2) {
115
+ TCGv_i64 tcg_op1, tcg_op2, tcg_op3, tcg_res[2];
116
+ int pass;
117
+
118
+ tcg_op1 = tcg_temp_new_i64();
119
+ tcg_op2 = tcg_temp_new_i64();
120
+ tcg_op3 = tcg_temp_new_i64();
121
+ tcg_res[0] = tcg_temp_new_i64();
122
+ tcg_res[1] = tcg_temp_new_i64();
123
+
124
+ for (pass = 0; pass < 2; pass++) {
125
+ read_vec_element(s, tcg_op1, rn, pass, MO_64);
126
+ read_vec_element(s, tcg_op2, rm, pass, MO_64);
127
+ read_vec_element(s, tcg_op3, ra, pass, MO_64);
128
+
129
+ if (op0 == 0) {
130
+ /* EOR3 */
131
+ tcg_gen_xor_i64(tcg_res[pass], tcg_op2, tcg_op3);
132
+ } else {
133
+ /* BCAX */
134
+ tcg_gen_andc_i64(tcg_res[pass], tcg_op2, tcg_op3);
135
+ }
136
+ tcg_gen_xor_i64(tcg_res[pass], tcg_res[pass], tcg_op1);
137
+ }
138
+ write_vec_element(s, tcg_res[0], rd, 0, MO_64);
139
+ write_vec_element(s, tcg_res[1], rd, 1, MO_64);
140
+
141
+ tcg_temp_free_i64(tcg_op1);
142
+ tcg_temp_free_i64(tcg_op2);
143
+ tcg_temp_free_i64(tcg_op3);
144
+ tcg_temp_free_i64(tcg_res[0]);
145
+ tcg_temp_free_i64(tcg_res[1]);
146
+ } else {
147
+ g_assert_not_reached();
148
+ }
149
+}
150
+
151
+/* Crypto XAR
152
+ * 31 21 20 16 15 10 9 5 4 0
153
+ * +-----------------------+------+--------+------+------+
154
+ * | 1 1 0 0 1 1 1 0 1 0 0 | Rm | imm6 | Rn | Rd |
155
+ * +-----------------------+------+--------+------+------+
156
+ */
157
+static void disas_crypto_xar(DisasContext *s, uint32_t insn)
158
+{
159
+ int rm = extract32(insn, 16, 5);
160
+ int imm6 = extract32(insn, 10, 6);
161
+ int rn = extract32(insn, 5, 5);
162
+ int rd = extract32(insn, 0, 5);
163
+ TCGv_i64 tcg_op1, tcg_op2, tcg_res[2];
164
+ int pass;
165
+
166
+ if (!arm_dc_feature(s, ARM_FEATURE_V8_SHA3)) {
167
+ unallocated_encoding(s);
168
+ return;
169
+ }
170
+
171
+ if (!fp_access_check(s)) {
172
+ return;
173
+ }
174
+
175
+ tcg_op1 = tcg_temp_new_i64();
176
+ tcg_op2 = tcg_temp_new_i64();
177
+ tcg_res[0] = tcg_temp_new_i64();
178
+ tcg_res[1] = tcg_temp_new_i64();
179
+
180
+ for (pass = 0; pass < 2; pass++) {
181
+ read_vec_element(s, tcg_op1, rn, pass, MO_64);
182
+ read_vec_element(s, tcg_op2, rm, pass, MO_64);
183
+
184
+ tcg_gen_xor_i64(tcg_res[pass], tcg_op1, tcg_op2);
185
+ tcg_gen_rotri_i64(tcg_res[pass], tcg_res[pass], imm6);
186
+ }
187
+ write_vec_element(s, tcg_res[0], rd, 0, MO_64);
188
+ write_vec_element(s, tcg_res[1], rd, 1, MO_64);
189
+
190
+ tcg_temp_free_i64(tcg_op1);
191
+ tcg_temp_free_i64(tcg_op2);
192
+ tcg_temp_free_i64(tcg_res[0]);
193
+ tcg_temp_free_i64(tcg_res[1]);
194
+}
195
+
196
/* C3.6 Data processing - SIMD, inc Crypto
197
*
198
* As the decode gets a little complex we are using a table based
199
@@ -XXX,XX +XXX,XX @@ static const AArch64DecodeTable data_proc_simd[] = {
200
{ 0x5e280800, 0xff3e0c00, disas_crypto_two_reg_sha },
201
{ 0xce608000, 0xffe0b000, disas_crypto_three_reg_sha512 },
202
{ 0xcec08000, 0xfffff000, disas_crypto_two_reg_sha512 },
203
+ { 0xce000000, 0xff808000, disas_crypto_four_reg },
204
+ { 0xce800000, 0xffe00000, disas_crypto_xar },
205
{ 0x00000000, 0x00000000, NULL }
206
};
207
208
--
209
2.16.1
210
211
diff view generated by jsdifflib
Deleted patch
1
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
2
1
3
This implements emulation of the new SM4 instructions that have
4
been added as an optional extension to the ARMv8 Crypto Extensions
5
in ARM v8.2.
6
7
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
8
Message-id: 20180207111729.15737-5-ard.biesheuvel@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/cpu.h | 1 +
13
target/arm/helper.h | 3 ++
14
target/arm/crypto_helper.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++
15
target/arm/translate-a64.c | 8 ++++
16
4 files changed, 103 insertions(+)
17
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.h
21
+++ b/target/arm/cpu.h
22
@@ -XXX,XX +XXX,XX @@ enum arm_features {
23
ARM_FEATURE_V8_SHA512, /* implements SHA512 part of v8 Crypto Extensions */
24
ARM_FEATURE_V8_SHA3, /* implements SHA3 part of v8 Crypto Extensions */
25
ARM_FEATURE_V8_SM3, /* implements SM3 part of v8 Crypto Extensions */
26
+ ARM_FEATURE_V8_SM4, /* implements SM4 part of v8 Crypto Extensions */
27
};
28
29
static inline int arm_feature(CPUARMState *env, int feature)
30
diff --git a/target/arm/helper.h b/target/arm/helper.h
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/helper.h
33
+++ b/target/arm/helper.h
34
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(crypto_sm3tt, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32, i32)
35
DEF_HELPER_FLAGS_3(crypto_sm3partw1, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
36
DEF_HELPER_FLAGS_3(crypto_sm3partw2, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
37
38
+DEF_HELPER_FLAGS_2(crypto_sm4e, TCG_CALL_NO_RWG, void, ptr, ptr)
39
+DEF_HELPER_FLAGS_3(crypto_sm4ekey, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
40
+
41
DEF_HELPER_FLAGS_3(crc32, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
42
DEF_HELPER_FLAGS_3(crc32c, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
43
DEF_HELPER_2(dc_zva, void, env, i64)
44
diff --git a/target/arm/crypto_helper.c b/target/arm/crypto_helper.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/crypto_helper.c
47
+++ b/target/arm/crypto_helper.c
48
@@ -XXX,XX +XXX,XX @@ void HELPER(crypto_sm3tt)(void *vd, void *vn, void *vm, uint32_t imm2,
49
rd[0] = d.l[0];
50
rd[1] = d.l[1];
51
}
52
+
53
+static uint8_t const sm4_sbox[] = {
54
+ 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7,
55
+ 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05,
56
+ 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3,
57
+ 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,
58
+ 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a,
59
+ 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62,
60
+ 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95,
61
+ 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6,
62
+ 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba,
63
+ 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8,
64
+ 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b,
65
+ 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35,
66
+ 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2,
67
+ 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87,
68
+ 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52,
69
+ 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e,
70
+ 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5,
71
+ 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1,
72
+ 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55,
73
+ 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3,
74
+ 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60,
75
+ 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f,
76
+ 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f,
77
+ 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51,
78
+ 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f,
79
+ 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8,
80
+ 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd,
81
+ 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0,
82
+ 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e,
83
+ 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84,
84
+ 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20,
85
+ 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48,
86
+};
87
+
88
+void HELPER(crypto_sm4e)(void *vd, void *vn)
89
+{
90
+ uint64_t *rd = vd;
91
+ uint64_t *rn = vn;
92
+ union CRYPTO_STATE d = { .l = { rd[0], rd[1] } };
93
+ union CRYPTO_STATE n = { .l = { rn[0], rn[1] } };
94
+ uint32_t t, i;
95
+
96
+ for (i = 0; i < 4; i++) {
97
+ t = CR_ST_WORD(d, (i + 1) % 4) ^
98
+ CR_ST_WORD(d, (i + 2) % 4) ^
99
+ CR_ST_WORD(d, (i + 3) % 4) ^
100
+ CR_ST_WORD(n, i);
101
+
102
+ t = sm4_sbox[t & 0xff] |
103
+ sm4_sbox[(t >> 8) & 0xff] << 8 |
104
+ sm4_sbox[(t >> 16) & 0xff] << 16 |
105
+ sm4_sbox[(t >> 24) & 0xff] << 24;
106
+
107
+ CR_ST_WORD(d, i) ^= t ^ rol32(t, 2) ^ rol32(t, 10) ^ rol32(t, 18) ^
108
+ rol32(t, 24);
109
+ }
110
+
111
+ rd[0] = d.l[0];
112
+ rd[1] = d.l[1];
113
+}
114
+
115
+void HELPER(crypto_sm4ekey)(void *vd, void *vn, void* vm)
116
+{
117
+ uint64_t *rd = vd;
118
+ uint64_t *rn = vn;
119
+ uint64_t *rm = vm;
120
+ union CRYPTO_STATE d;
121
+ union CRYPTO_STATE n = { .l = { rn[0], rn[1] } };
122
+ union CRYPTO_STATE m = { .l = { rm[0], rm[1] } };
123
+ uint32_t t, i;
124
+
125
+ d = n;
126
+ for (i = 0; i < 4; i++) {
127
+ t = CR_ST_WORD(d, (i + 1) % 4) ^
128
+ CR_ST_WORD(d, (i + 2) % 4) ^
129
+ CR_ST_WORD(d, (i + 3) % 4) ^
130
+ CR_ST_WORD(m, i);
131
+
132
+ t = sm4_sbox[t & 0xff] |
133
+ sm4_sbox[(t >> 8) & 0xff] << 8 |
134
+ sm4_sbox[(t >> 16) & 0xff] << 16 |
135
+ sm4_sbox[(t >> 24) & 0xff] << 24;
136
+
137
+ CR_ST_WORD(d, i) ^= t ^ rol32(t, 13) ^ rol32(t, 23);
138
+ }
139
+
140
+ rd[0] = d.l[0];
141
+ rd[1] = d.l[1];
142
+}
143
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
144
index XXXXXXX..XXXXXXX 100644
145
--- a/target/arm/translate-a64.c
146
+++ b/target/arm/translate-a64.c
147
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_three_reg_sha512(DisasContext *s, uint32_t insn)
148
feature = ARM_FEATURE_V8_SM3;
149
genfn = gen_helper_crypto_sm3partw2;
150
break;
151
+ case 2: /* SM4EKEY */
152
+ feature = ARM_FEATURE_V8_SM4;
153
+ genfn = gen_helper_crypto_sm4ekey;
154
+ break;
155
default:
156
unallocated_encoding(s);
157
return;
158
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_two_reg_sha512(DisasContext *s, uint32_t insn)
159
feature = ARM_FEATURE_V8_SHA512;
160
genfn = gen_helper_crypto_sha512su0;
161
break;
162
+ case 1: /* SM4E */
163
+ feature = ARM_FEATURE_V8_SM4;
164
+ genfn = gen_helper_crypto_sm4e;
165
+ break;
166
default:
167
unallocated_encoding(s);
168
return;
169
--
170
2.16.1
171
172
diff view generated by jsdifflib
Deleted patch
1
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
2
1
3
Add support for the new ARMv8.2 SHA-3, SM3, SM4 and SHA-512 instructions to
4
AArch64 user mode emulation.
5
6
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
7
Message-id: 20180207111729.15737-6-ard.biesheuvel@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
linux-user/elfload.c | 19 +++++++++++++++++++
12
target/arm/cpu64.c | 4 ++++
13
2 files changed, 23 insertions(+)
14
15
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/linux-user/elfload.c
18
+++ b/linux-user/elfload.c
19
@@ -XXX,XX +XXX,XX @@ enum {
20
ARM_HWCAP_A64_SHA1 = 1 << 5,
21
ARM_HWCAP_A64_SHA2 = 1 << 6,
22
ARM_HWCAP_A64_CRC32 = 1 << 7,
23
+ ARM_HWCAP_A64_ATOMICS = 1 << 8,
24
+ ARM_HWCAP_A64_FPHP = 1 << 9,
25
+ ARM_HWCAP_A64_ASIMDHP = 1 << 10,
26
+ ARM_HWCAP_A64_CPUID = 1 << 11,
27
+ ARM_HWCAP_A64_ASIMDRDM = 1 << 12,
28
+ ARM_HWCAP_A64_JSCVT = 1 << 13,
29
+ ARM_HWCAP_A64_FCMA = 1 << 14,
30
+ ARM_HWCAP_A64_LRCPC = 1 << 15,
31
+ ARM_HWCAP_A64_DCPOP = 1 << 16,
32
+ ARM_HWCAP_A64_SHA3 = 1 << 17,
33
+ ARM_HWCAP_A64_SM3 = 1 << 18,
34
+ ARM_HWCAP_A64_SM4 = 1 << 19,
35
+ ARM_HWCAP_A64_ASIMDDP = 1 << 20,
36
+ ARM_HWCAP_A64_SHA512 = 1 << 21,
37
+ ARM_HWCAP_A64_SVE = 1 << 22,
38
};
39
40
#define ELF_HWCAP get_elf_hwcap()
41
@@ -XXX,XX +XXX,XX @@ static uint32_t get_elf_hwcap(void)
42
GET_FEATURE(ARM_FEATURE_V8_SHA1, ARM_HWCAP_A64_SHA1);
43
GET_FEATURE(ARM_FEATURE_V8_SHA256, ARM_HWCAP_A64_SHA2);
44
GET_FEATURE(ARM_FEATURE_CRC, ARM_HWCAP_A64_CRC32);
45
+ GET_FEATURE(ARM_FEATURE_V8_SHA3, ARM_HWCAP_A64_SHA3);
46
+ GET_FEATURE(ARM_FEATURE_V8_SM3, ARM_HWCAP_A64_SM3);
47
+ GET_FEATURE(ARM_FEATURE_V8_SM4, ARM_HWCAP_A64_SM4);
48
+ GET_FEATURE(ARM_FEATURE_V8_SHA512, ARM_HWCAP_A64_SHA512);
49
#undef GET_FEATURE
50
51
return hwcaps;
52
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/target/arm/cpu64.c
55
+++ b/target/arm/cpu64.c
56
@@ -XXX,XX +XXX,XX @@ static void aarch64_any_initfn(Object *obj)
57
set_feature(&cpu->env, ARM_FEATURE_V8_AES);
58
set_feature(&cpu->env, ARM_FEATURE_V8_SHA1);
59
set_feature(&cpu->env, ARM_FEATURE_V8_SHA256);
60
+ set_feature(&cpu->env, ARM_FEATURE_V8_SHA512);
61
+ set_feature(&cpu->env, ARM_FEATURE_V8_SHA3);
62
+ set_feature(&cpu->env, ARM_FEATURE_V8_SM3);
63
+ set_feature(&cpu->env, ARM_FEATURE_V8_SM4);
64
set_feature(&cpu->env, ARM_FEATURE_V8_PMULL);
65
set_feature(&cpu->env, ARM_FEATURE_CRC);
66
cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */
67
--
68
2.16.1
69
70
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
The section describing the removed feature "-usbdevice ccid" had a
2
typo so the markup started with single backtick and ended with double
3
backtick; fix it.
2
4
3
Convert i.MX6 to use TYPE_IMX_USDHC since that's what real HW comes
4
with.
5
6
Cc: Peter Maydell <peter.maydell@linaro.org>
7
Cc: Jason Wang <jasowang@redhat.com>
8
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
10
Cc: Michael S. Tsirkin <mst@redhat.com>
11
Cc: qemu-devel@nongnu.org
12
Cc: qemu-arm@nongnu.org
13
Cc: yurovsky@gmail.com
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
16
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>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20210726142338.31872-10-peter.maydell@linaro.org
17
---
9
---
18
hw/arm/fsl-imx6.c | 2 +-
10
docs/about/removed-features.rst | 2 +-
19
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
20
12
21
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
13
diff --git a/docs/about/removed-features.rst b/docs/about/removed-features.rst
22
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/arm/fsl-imx6.c
15
--- a/docs/about/removed-features.rst
24
+++ b/hw/arm/fsl-imx6.c
16
+++ b/docs/about/removed-features.rst
25
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_init(Object *obj)
17
@@ -XXX,XX +XXX,XX @@ devices. Drives the board doesn't pick up can no longer be used with
26
}
18
'''''''''''''''''''''''''''''''''''''
27
19
28
for (i = 0; i < FSL_IMX6_NUM_ESDHCS; i++) {
20
This option was undocumented and not used in the field.
29
- object_initialize(&s->esdhc[i], sizeof(s->esdhc[i]), TYPE_SYSBUS_SDHCI);
21
-Use `-device usb-ccid`` instead.
30
+ object_initialize(&s->esdhc[i], sizeof(s->esdhc[i]), TYPE_IMX_USDHC);
22
+Use ``-device usb-ccid`` instead.
31
qdev_set_parent_bus(DEVICE(&s->esdhc[i]), sysbus_get_default());
23
32
snprintf(name, NAME_SIZE, "sdhc%d", i + 1);
24
RISC-V firmware not booted by default (removed in 5.1)
33
object_property_add_child(obj, name, OBJECT(&s->esdhc[i]), NULL);
25
''''''''''''''''''''''''''''''''''''''''''''''''''''''
34
--
26
--
35
2.16.1
27
2.20.1
36
28
37
29
diff view generated by jsdifflib
1
The documentation for the generic loader claims that you can
1
The documentation of the posix_acl option has a stray backtick
2
set the PC for a CPU with an option of the form
2
at the end of the text (which is rendered literally into the HTML).
3
-device loader,cpu-num=0,addr=0x10000004
3
Delete it.
4
5
However if you try this QEMU complains:
6
cpu_num must be specified when setting a program counter
7
8
This is because we were testing against 0 rather than CPU_NONE.
9
4
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20180205150426.20542-1-peter.maydell@linaro.org
8
Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
9
Message-id: 20210726142338.31872-11-peter.maydell@linaro.org
14
---
10
---
15
hw/core/generic-loader.c | 2 +-
11
docs/tools/virtiofsd.rst | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
17
13
18
diff --git a/hw/core/generic-loader.c b/hw/core/generic-loader.c
14
diff --git a/docs/tools/virtiofsd.rst b/docs/tools/virtiofsd.rst
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/core/generic-loader.c
16
--- a/docs/tools/virtiofsd.rst
21
+++ b/hw/core/generic-loader.c
17
+++ b/docs/tools/virtiofsd.rst
22
@@ -XXX,XX +XXX,XX @@ static void generic_loader_realize(DeviceState *dev, Error **errp)
18
@@ -XXX,XX +XXX,XX @@ Options
23
error_setg(errp, "data can not be specified when setting a "
19
default is ``no_xattr``.
24
"program counter");
20
25
return;
21
* posix_acl|no_posix_acl -
26
- } else if (!s->cpu_num) {
22
- Enable/disable posix acl support. Posix ACLs are disabled by default`.
27
+ } else if (s->cpu_num == CPU_NONE) {
23
+ Enable/disable posix acl support. Posix ACLs are disabled by default.
28
error_setg(errp, "cpu_num must be specified when setting a "
24
29
"program counter");
25
.. option:: --socket-path=PATH
30
return;
26
31
--
27
--
32
2.16.1
28
2.20.1
33
29
34
30
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
If the user provides both a BIOS/firmware image and also a guest
2
kernel filename, arm_setup_firmware_boot() will pass the
3
kernel image to the firmware via the fw_cfg device. However we
4
weren't checking whether there really was a fw_cfg device present,
5
and if there wasn't we would crash.
2
6
3
Move virt's PSCI DT fixup code to arm/boot.c and set this fixup to
7
This crash can be provoked with a command line such as
4
happen automatically for every board that doesn't mark "psci-conduit"
8
qemu-system-aarch64 -M raspi3 -kernel /dev/null -bios /dev/null -display none
5
as disabled. This way emulated boards other than "virt" that rely on
6
PSIC for SMP could benefit from that code.
7
9
8
Cc: Peter Maydell <peter.maydell@linaro.org>
10
It is currently only possible on the raspi3 machine, because unless
9
Cc: Jason Wang <jasowang@redhat.com>
11
the machine sets info->firmware_loaded we won't call
10
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
arm_setup_firmware_boot(), and the only machines which set that are:
11
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
13
* virt (has a fw-cfg device)
12
Cc: Michael S. Tsirkin <mst@redhat.com>
14
* sbsa-ref (checks itself for kernel_filename && firmware_loaded)
13
Cc: qemu-devel@nongnu.org
15
* raspi3 (crashes)
14
Cc: qemu-arm@nongnu.org
16
15
Cc: yurovsky@gmail.com
17
But this is an unfortunate beartrap to leave for future machine
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
model implementors, so we should handle this situation in boot.c.
17
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
19
20
Check in arm_setup_firmware_boot() whether the fw-cfg device exists
21
before trying to load files into it, and if it doesn't exist then
22
exit with a hopefully helpful error message.
23
24
Because we now handle this check in a machine-agnostic way, we
25
can remove the check from sbsa-ref.
26
27
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/503
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
30
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
31
Message-id: 20210726163351.32086-1-peter.maydell@linaro.org
20
---
32
---
21
hw/arm/boot.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
33
hw/arm/boot.c | 9 +++++++++
22
hw/arm/virt.c | 61 -------------------------------------------------------
34
hw/arm/sbsa-ref.c | 7 -------
23
2 files changed, 65 insertions(+), 61 deletions(-)
35
2 files changed, 9 insertions(+), 7 deletions(-)
24
36
25
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
37
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
26
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/arm/boot.c
39
--- a/hw/arm/boot.c
28
+++ b/hw/arm/boot.c
40
+++ b/hw/arm/boot.c
29
@@ -XXX,XX +XXX,XX @@ static void set_kernel_args_old(const struct arm_boot_info *info)
41
@@ -XXX,XX +XXX,XX @@ static void arm_setup_firmware_boot(ARMCPU *cpu, struct arm_boot_info *info)
30
}
42
bool try_decompressing_kernel;
31
}
43
32
44
fw_cfg = fw_cfg_find();
33
+static void fdt_add_psci_node(void *fdt)
34
+{
35
+ uint32_t cpu_suspend_fn;
36
+ uint32_t cpu_off_fn;
37
+ uint32_t cpu_on_fn;
38
+ uint32_t migrate_fn;
39
+ ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(0));
40
+ const char *psci_method;
41
+ int64_t psci_conduit;
42
+
45
+
43
+ psci_conduit = object_property_get_int(OBJECT(armcpu),
46
+ if (!fw_cfg) {
44
+ "psci-conduit",
47
+ error_report("This machine type does not support loading both "
45
+ &error_abort);
48
+ "a guest firmware/BIOS image and a guest kernel at "
46
+ switch (psci_conduit) {
49
+ "the same time. You should change your QEMU command "
47
+ case QEMU_PSCI_CONDUIT_DISABLED:
50
+ "line to specify one or the other, but not both.");
48
+ return;
51
+ exit(1);
49
+ case QEMU_PSCI_CONDUIT_HVC:
52
+ }
50
+ psci_method = "hvc";
51
+ break;
52
+ case QEMU_PSCI_CONDUIT_SMC:
53
+ psci_method = "smc";
54
+ break;
55
+ default:
56
+ g_assert_not_reached();
57
+ }
58
+
53
+
59
+ qemu_fdt_add_subnode(fdt, "/psci");
54
try_decompressing_kernel = arm_feature(&cpu->env,
60
+ if (armcpu->psci_version == 2) {
55
ARM_FEATURE_AARCH64);
61
+ const char comp[] = "arm,psci-0.2\0arm,psci";
56
62
+ qemu_fdt_setprop(fdt, "/psci", "compatible", comp, sizeof(comp));
57
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
63
+
64
+ cpu_off_fn = QEMU_PSCI_0_2_FN_CPU_OFF;
65
+ if (arm_feature(&armcpu->env, ARM_FEATURE_AARCH64)) {
66
+ cpu_suspend_fn = QEMU_PSCI_0_2_FN64_CPU_SUSPEND;
67
+ cpu_on_fn = QEMU_PSCI_0_2_FN64_CPU_ON;
68
+ migrate_fn = QEMU_PSCI_0_2_FN64_MIGRATE;
69
+ } else {
70
+ cpu_suspend_fn = QEMU_PSCI_0_2_FN_CPU_SUSPEND;
71
+ cpu_on_fn = QEMU_PSCI_0_2_FN_CPU_ON;
72
+ migrate_fn = QEMU_PSCI_0_2_FN_MIGRATE;
73
+ }
74
+ } else {
75
+ qemu_fdt_setprop_string(fdt, "/psci", "compatible", "arm,psci");
76
+
77
+ cpu_suspend_fn = QEMU_PSCI_0_1_FN_CPU_SUSPEND;
78
+ cpu_off_fn = QEMU_PSCI_0_1_FN_CPU_OFF;
79
+ cpu_on_fn = QEMU_PSCI_0_1_FN_CPU_ON;
80
+ migrate_fn = QEMU_PSCI_0_1_FN_MIGRATE;
81
+ }
82
+
83
+ /* We adopt the PSCI spec's nomenclature, and use 'conduit' to refer
84
+ * to the instruction that should be used to invoke PSCI functions.
85
+ * However, the device tree binding uses 'method' instead, so that is
86
+ * what we should use here.
87
+ */
88
+ qemu_fdt_setprop_string(fdt, "/psci", "method", psci_method);
89
+
90
+ qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend", cpu_suspend_fn);
91
+ qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off", cpu_off_fn);
92
+ qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on", cpu_on_fn);
93
+ qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
94
+}
95
+
96
/**
97
* load_dtb() - load a device tree binary image into memory
98
* @addr: the address to load the image at
99
@@ -XXX,XX +XXX,XX @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
100
}
101
}
102
103
+ fdt_add_psci_node(fdt);
104
+
105
if (binfo->modify_dtb) {
106
binfo->modify_dtb(binfo, fdt);
107
}
108
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
109
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
110
--- a/hw/arm/virt.c
59
--- a/hw/arm/sbsa-ref.c
111
+++ b/hw/arm/virt.c
60
+++ b/hw/arm/sbsa-ref.c
112
@@ -XXX,XX +XXX,XX @@ static void create_fdt(VirtMachineState *vms)
61
@@ -XXX,XX +XXX,XX @@ static void sbsa_ref_init(MachineState *machine)
113
}
62
114
}
63
firmware_loaded = sbsa_firmware_init(sms, sysmem, secure_sysmem);
115
64
116
-static void fdt_add_psci_node(const VirtMachineState *vms)
65
- if (machine->kernel_filename && firmware_loaded) {
117
-{
66
- error_report("sbsa-ref: No fw_cfg device on this machine, "
118
- uint32_t cpu_suspend_fn;
67
- "so -kernel option is not supported when firmware loaded, "
119
- uint32_t cpu_off_fn;
68
- "please load OS from hard disk instead");
120
- uint32_t cpu_on_fn;
69
- exit(1);
121
- uint32_t migrate_fn;
122
- void *fdt = vms->fdt;
123
- ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(0));
124
- const char *psci_method;
125
-
126
- switch (vms->psci_conduit) {
127
- case QEMU_PSCI_CONDUIT_DISABLED:
128
- return;
129
- case QEMU_PSCI_CONDUIT_HVC:
130
- psci_method = "hvc";
131
- break;
132
- case QEMU_PSCI_CONDUIT_SMC:
133
- psci_method = "smc";
134
- break;
135
- default:
136
- g_assert_not_reached();
137
- }
70
- }
138
-
71
-
139
- qemu_fdt_add_subnode(fdt, "/psci");
72
/*
140
- if (armcpu->psci_version == 2) {
73
* This machine has EL3 enabled, external firmware should supply PSCI
141
- const char comp[] = "arm,psci-0.2\0arm,psci";
74
* implementation, so the QEMU's internal PSCI is disabled.
142
- qemu_fdt_setprop(fdt, "/psci", "compatible", comp, sizeof(comp));
143
-
144
- cpu_off_fn = QEMU_PSCI_0_2_FN_CPU_OFF;
145
- if (arm_feature(&armcpu->env, ARM_FEATURE_AARCH64)) {
146
- cpu_suspend_fn = QEMU_PSCI_0_2_FN64_CPU_SUSPEND;
147
- cpu_on_fn = QEMU_PSCI_0_2_FN64_CPU_ON;
148
- migrate_fn = QEMU_PSCI_0_2_FN64_MIGRATE;
149
- } else {
150
- cpu_suspend_fn = QEMU_PSCI_0_2_FN_CPU_SUSPEND;
151
- cpu_on_fn = QEMU_PSCI_0_2_FN_CPU_ON;
152
- migrate_fn = QEMU_PSCI_0_2_FN_MIGRATE;
153
- }
154
- } else {
155
- qemu_fdt_setprop_string(fdt, "/psci", "compatible", "arm,psci");
156
-
157
- cpu_suspend_fn = QEMU_PSCI_0_1_FN_CPU_SUSPEND;
158
- cpu_off_fn = QEMU_PSCI_0_1_FN_CPU_OFF;
159
- cpu_on_fn = QEMU_PSCI_0_1_FN_CPU_ON;
160
- migrate_fn = QEMU_PSCI_0_1_FN_MIGRATE;
161
- }
162
-
163
- /* We adopt the PSCI spec's nomenclature, and use 'conduit' to refer
164
- * to the instruction that should be used to invoke PSCI functions.
165
- * However, the device tree binding uses 'method' instead, so that is
166
- * what we should use here.
167
- */
168
- qemu_fdt_setprop_string(fdt, "/psci", "method", psci_method);
169
-
170
- qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend", cpu_suspend_fn);
171
- qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off", cpu_off_fn);
172
- qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on", cpu_on_fn);
173
- qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
174
-}
175
-
176
static void fdt_add_timer_nodes(const VirtMachineState *vms)
177
{
178
/* On real hardware these interrupts are level-triggered.
179
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
180
}
181
fdt_add_timer_nodes(vms);
182
fdt_add_cpu_nodes(vms);
183
- fdt_add_psci_node(vms);
184
185
memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram",
186
machine->ram_size);
187
--
75
--
188
2.16.1
76
2.20.1
189
77
190
78
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
Move bootindex.txt into the system section of the manual and turn it
2
into rST format. To make the document make more sense in the context
3
of the system manual, expand the title and introductory paragraphs to
4
give more context.
2
5
3
Add enough code to emulate i.MX2 watchdog IP block so it would be
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
possible to reboot the machine running Linux Guest.
7
Reviewed-by: Markus Armbruster <armbru@redhat.com>
8
Message-id: 20210727194955.7764-1-peter.maydell@linaro.org
9
---
10
docs/bootindex.txt | 52 ---------------------------
11
docs/system/bootindex.rst | 76 +++++++++++++++++++++++++++++++++++++++
12
docs/system/index.rst | 1 +
13
3 files changed, 77 insertions(+), 52 deletions(-)
14
delete mode 100644 docs/bootindex.txt
15
create mode 100644 docs/system/bootindex.rst
5
16
6
Cc: Peter Maydell <peter.maydell@linaro.org>
17
diff --git a/docs/bootindex.txt b/docs/bootindex.txt
7
Cc: Jason Wang <jasowang@redhat.com>
18
deleted file mode 100644
8
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
index XXXXXXX..XXXXXXX
9
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
20
--- a/docs/bootindex.txt
10
Cc: Michael S. Tsirkin <mst@redhat.com>
21
+++ /dev/null
11
Cc: qemu-devel@nongnu.org
22
@@ -XXX,XX +XXX,XX @@
12
Cc: qemu-arm@nongnu.org
23
-= Bootindex property =
13
Cc: yurovsky@gmail.com
24
-
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
25
-Block and net devices have bootindex property. This property is used to
15
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
26
-determine the order in which firmware will consider devices for booting
16
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
27
-the guest OS. If the bootindex property is not set for a device, it gets
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
-lowest boot priority. There is no particular order in which devices with
18
---
29
-unset bootindex property will be considered for booting, but they will
19
hw/misc/Makefile.objs | 1 +
30
-still be bootable.
20
include/hw/misc/imx2_wdt.h | 33 +++++++++++++++++
31
-
21
hw/misc/imx2_wdt.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++
32
-== Example ==
22
3 files changed, 123 insertions(+)
33
-
23
create mode 100644 include/hw/misc/imx2_wdt.h
34
-Let's assume we have a QEMU machine with two NICs (virtio, e1000) and two
24
create mode 100644 hw/misc/imx2_wdt.c
35
-disks (IDE, virtio):
25
36
-
26
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
37
-qemu -drive file=disk1.img,if=none,id=disk1
27
index XXXXXXX..XXXXXXX 100644
38
- -device ide-hd,drive=disk1,bootindex=4
28
--- a/hw/misc/Makefile.objs
39
- -drive file=disk2.img,if=none,id=disk2
29
+++ b/hw/misc/Makefile.objs
40
- -device virtio-blk-pci,drive=disk2,bootindex=3
30
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_IMX) += imx25_ccm.o
41
- -netdev type=user,id=net0 -device virtio-net-pci,netdev=net0,bootindex=2
31
obj-$(CONFIG_IMX) += imx6_ccm.o
42
- -netdev type=user,id=net1 -device e1000,netdev=net1,bootindex=1
32
obj-$(CONFIG_IMX) += imx6_src.o
43
-
33
obj-$(CONFIG_IMX) += imx7_ccm.o
44
-Given the command above, firmware should try to boot from the e1000 NIC
34
+obj-$(CONFIG_IMX) += imx2_wdt.o
45
-first. If this fails, it should try the virtio NIC next; if this fails
35
obj-$(CONFIG_MILKYMIST) += milkymist-hpdmc.o
46
-too, it should try the virtio disk, and then the IDE disk.
36
obj-$(CONFIG_MILKYMIST) += milkymist-pfpu.o
47
-
37
obj-$(CONFIG_MAINSTONE) += mst_fpga.o
48
-== Limitations ==
38
diff --git a/include/hw/misc/imx2_wdt.h b/include/hw/misc/imx2_wdt.h
49
-
50
-1. Some firmware has limitations on which devices can be considered for
51
-booting. For instance, the PC BIOS boot specification allows only one
52
-disk to be bootable. If boot from disk fails for some reason, the BIOS
53
-won't retry booting from other disk. It can still try to boot from
54
-floppy or net, though.
55
-
56
-2. Sometimes, firmware cannot map the device path QEMU wants firmware to
57
-boot from to a boot method. It doesn't happen for devices the firmware
58
-can natively boot from, but if firmware relies on an option ROM for
59
-booting, and the same option ROM is used for booting from more then one
60
-device, the firmware may not be able to ask the option ROM to boot from
61
-a particular device reliably. For instance with the PC BIOS, if a SCSI HBA
62
-has three bootable devices target1, target3, target5 connected to it,
63
-the option ROM will have a boot method for each of them, but it is not
64
-possible to map from boot method back to a specific target. This is a
65
-shortcoming of the PC BIOS boot specification.
66
-
67
-== Mixing bootindex and boot order parameters ==
68
-
69
-Note that it does not make sense to use the bootindex property together
70
-with the "-boot order=..." (or "-boot once=...") parameter. The guest
71
-firmware implementations normally either support the one or the other,
72
-but not both parameters at the same time. Mixing them will result in
73
-undefined behavior, and thus the guest firmware will likely not boot
74
-from the expected devices.
75
diff --git a/docs/system/bootindex.rst b/docs/system/bootindex.rst
39
new file mode 100644
76
new file mode 100644
40
index XXXXXXX..XXXXXXX
77
index XXXXXXX..XXXXXXX
41
--- /dev/null
78
--- /dev/null
42
+++ b/include/hw/misc/imx2_wdt.h
79
+++ b/docs/system/bootindex.rst
43
@@ -XXX,XX +XXX,XX @@
80
@@ -XXX,XX +XXX,XX @@
44
+/*
81
+Managing device boot order with bootindex properties
45
+ * Copyright (c) 2017, Impinj, Inc.
82
+====================================================
46
+ *
47
+ * i.MX2 Watchdog IP block
48
+ *
49
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
50
+ *
51
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
52
+ * See the COPYING file in the top-level directory.
53
+ */
54
+
83
+
55
+#ifndef IMX2_WDT_H
84
+QEMU can tell QEMU-aware guest firmware (like the x86 PC BIOS)
56
+#define IMX2_WDT_H
85
+which order it should look for a bootable OS on which devices.
86
+A simple way to set this order is to use the ``-boot order=`` option,
87
+but you can also do this more flexibly, by setting a ``bootindex``
88
+property on the individual block or net devices you specify
89
+on the QEMU command line.
57
+
90
+
58
+#include "hw/sysbus.h"
91
+The ``bootindex`` properties are used to determine the order in which
92
+firmware will consider devices for booting the guest OS. If the
93
+``bootindex`` property is not set for a device, it gets the lowest
94
+boot priority. There is no particular order in which devices with no
95
+``bootindex`` property set will be considered for booting, but they
96
+will still be bootable.
59
+
97
+
60
+#define TYPE_IMX2_WDT "imx2.wdt"
98
+Some guest machine types (for instance the s390x machines) do
61
+#define IMX2_WDT(obj) OBJECT_CHECK(IMX2WdtState, (obj), TYPE_IMX2_WDT)
99
+not support ``-boot order=``; on those machines you must always
100
+use ``bootindex`` properties.
62
+
101
+
63
+enum IMX2WdtRegisters {
102
+There is no way to set a ``bootindex`` property if you are using
64
+ IMX2_WDT_WCR = 0x0000,
103
+a short-form option like ``-hda`` or ``-cdrom``, so to use
65
+ IMX2_WDT_REG_NUM = 0x0008 / sizeof(uint16_t) + 1,
104
+``bootindex`` properties you will need to expand out those options
66
+};
105
+into long-form ``-drive`` and ``-device`` option pairs.
67
+
106
+
107
+Example
108
+-------
68
+
109
+
69
+typedef struct IMX2WdtState {
110
+Let's assume we have a QEMU machine with two NICs (virtio, e1000) and two
70
+ /* <private> */
111
+disks (IDE, virtio):
71
+ SysBusDevice parent_obj;
72
+
112
+
73
+ MemoryRegion mmio;
113
+.. parsed-literal::
74
+} IMX2WdtState;
75
+
114
+
76
+#endif /* IMX7_SNVS_H */
115
+ |qemu_system| -drive file=disk1.img,if=none,id=disk1 \\
77
diff --git a/hw/misc/imx2_wdt.c b/hw/misc/imx2_wdt.c
116
+ -device ide-hd,drive=disk1,bootindex=4 \\
78
new file mode 100644
117
+ -drive file=disk2.img,if=none,id=disk2 \\
79
index XXXXXXX..XXXXXXX
118
+ -device virtio-blk-pci,drive=disk2,bootindex=3 \\
80
--- /dev/null
119
+ -netdev type=user,id=net0 \\
81
+++ b/hw/misc/imx2_wdt.c
120
+ -device virtio-net-pci,netdev=net0,bootindex=2 \\
82
@@ -XXX,XX +XXX,XX @@
121
+ -netdev type=user,id=net1 \\
83
+/*
122
+ -device e1000,netdev=net1,bootindex=1
84
+ * Copyright (c) 2018, Impinj, Inc.
85
+ *
86
+ * i.MX2 Watchdog IP block
87
+ *
88
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
89
+ *
90
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
91
+ * See the COPYING file in the top-level directory.
92
+ */
93
+
123
+
94
+#include "qemu/osdep.h"
124
+Given the command above, firmware should try to boot from the e1000 NIC
95
+#include "qemu/bitops.h"
125
+first. If this fails, it should try the virtio NIC next; if this fails
96
+#include "sysemu/watchdog.h"
126
+too, it should try the virtio disk, and then the IDE disk.
97
+
127
+
98
+#include "hw/misc/imx2_wdt.h"
128
+Limitations
129
+-----------
99
+
130
+
100
+#define IMX2_WDT_WCR_WDA BIT(5) /* -> External Reset WDOG_B */
131
+Some firmware has limitations on which devices can be considered for
101
+#define IMX2_WDT_WCR_SRS BIT(4) /* -> Software Reset Signal */
132
+booting. For instance, the PC BIOS boot specification allows only one
133
+disk to be bootable. If boot from disk fails for some reason, the BIOS
134
+won't retry booting from other disk. It can still try to boot from
135
+floppy or net, though.
102
+
136
+
103
+static uint64_t imx2_wdt_read(void *opaque, hwaddr addr,
137
+Sometimes, firmware cannot map the device path QEMU wants firmware to
104
+ unsigned int size)
138
+boot from to a boot method. It doesn't happen for devices the firmware
105
+{
139
+can natively boot from, but if firmware relies on an option ROM for
106
+ return 0;
140
+booting, and the same option ROM is used for booting from more then one
107
+}
141
+device, the firmware may not be able to ask the option ROM to boot from
142
+a particular device reliably. For instance with the PC BIOS, if a SCSI HBA
143
+has three bootable devices target1, target3, target5 connected to it,
144
+the option ROM will have a boot method for each of them, but it is not
145
+possible to map from boot method back to a specific target. This is a
146
+shortcoming of the PC BIOS boot specification.
108
+
147
+
109
+static void imx2_wdt_write(void *opaque, hwaddr addr,
148
+Mixing bootindex and boot order parameters
110
+ uint64_t value, unsigned int size)
149
+------------------------------------------
111
+{
112
+ if (addr == IMX2_WDT_WCR &&
113
+ (value & (IMX2_WDT_WCR_WDA | IMX2_WDT_WCR_SRS))) {
114
+ watchdog_perform_action();
115
+ }
116
+}
117
+
150
+
118
+static const MemoryRegionOps imx2_wdt_ops = {
151
+Note that it does not make sense to use the bootindex property together
119
+ .read = imx2_wdt_read,
152
+with the ``-boot order=...`` (or ``-boot once=...``) parameter. The guest
120
+ .write = imx2_wdt_write,
153
+firmware implementations normally either support the one or the other,
121
+ .endianness = DEVICE_NATIVE_ENDIAN,
154
+but not both parameters at the same time. Mixing them will result in
122
+ .impl = {
155
+undefined behavior, and thus the guest firmware will likely not boot
123
+ /*
156
+from the expected devices.
124
+ * Our device would not work correctly if the guest was doing
157
diff --git a/docs/system/index.rst b/docs/system/index.rst
125
+ * unaligned access. This might not be a limitation on the
158
index XXXXXXX..XXXXXXX 100644
126
+ * real device but in practice there is no reason for a guest
159
--- a/docs/system/index.rst
127
+ * to access this device unaligned.
160
+++ b/docs/system/index.rst
128
+ */
161
@@ -XXX,XX +XXX,XX @@ or Hypervisor.Framework.
129
+ .min_access_size = 4,
162
authz
130
+ .max_access_size = 4,
163
gdb
131
+ .unaligned = false,
164
managed-startup
132
+ },
165
+ bootindex
133
+};
166
cpu-hotplug
134
+
167
pr-manager
135
+static void imx2_wdt_realize(DeviceState *dev, Error **errp)
168
targets
136
+{
137
+ IMX2WdtState *s = IMX2_WDT(dev);
138
+
139
+ memory_region_init_io(&s->mmio, OBJECT(dev),
140
+ &imx2_wdt_ops, s,
141
+ TYPE_IMX2_WDT".mmio",
142
+ IMX2_WDT_REG_NUM * sizeof(uint16_t));
143
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio);
144
+}
145
+
146
+static void imx2_wdt_class_init(ObjectClass *klass, void *data)
147
+{
148
+ DeviceClass *dc = DEVICE_CLASS(klass);
149
+
150
+ dc->realize = imx2_wdt_realize;
151
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
152
+}
153
+
154
+static const TypeInfo imx2_wdt_info = {
155
+ .name = TYPE_IMX2_WDT,
156
+ .parent = TYPE_SYS_BUS_DEVICE,
157
+ .instance_size = sizeof(IMX2WdtState),
158
+ .class_init = imx2_wdt_class_init,
159
+};
160
+
161
+static WatchdogTimerModel model = {
162
+ .wdt_name = "imx2-watchdog",
163
+ .wdt_description = "i.MX2 Watchdog",
164
+};
165
+
166
+static void imx2_wdt_register_type(void)
167
+{
168
+ watchdog_add_model(&model);
169
+ type_register_static(&imx2_wdt_info);
170
+}
171
+type_init(imx2_wdt_register_type)
172
--
169
--
173
2.16.1
170
2.20.1
174
171
175
172
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
Most of docs/barrier.txt is describing the protocol implemented
2
by the input-barrier device. Move this into the interop
3
section of the manual, and rstify it.
2
4
3
Add minimal code needed to allow upstream Linux guest to boot.
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
7
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
8
Message-id: 20210727204112.12579-2-peter.maydell@linaro.org
9
---
10
docs/barrier.txt | 318 -----------------------------
11
docs/interop/barrier.rst | 426 +++++++++++++++++++++++++++++++++++++++
12
docs/interop/index.rst | 1 +
13
3 files changed, 427 insertions(+), 318 deletions(-)
14
create mode 100644 docs/interop/barrier.rst
4
15
5
Cc: Peter Maydell <peter.maydell@linaro.org>
16
diff --git a/docs/barrier.txt b/docs/barrier.txt
6
Cc: Jason Wang <jasowang@redhat.com>
7
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
9
Cc: Michael S. Tsirkin <mst@redhat.com>
10
Cc: qemu-devel@nongnu.org
11
Cc: qemu-arm@nongnu.org
12
Cc: yurovsky@gmail.com
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/misc/Makefile.objs | 1 +
18
include/hw/misc/imx7_ccm.h | 139 +++++++++++++++++++++++
19
hw/misc/imx7_ccm.c | 277 +++++++++++++++++++++++++++++++++++++++++++++
20
3 files changed, 417 insertions(+)
21
create mode 100644 include/hw/misc/imx7_ccm.h
22
create mode 100644 hw/misc/imx7_ccm.c
23
24
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/misc/Makefile.objs
18
--- a/docs/barrier.txt
27
+++ b/hw/misc/Makefile.objs
19
+++ b/docs/barrier.txt
28
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_IMX) += imx31_ccm.o
20
@@ -XXX,XX +XXX,XX @@
29
obj-$(CONFIG_IMX) += imx25_ccm.o
21
30
obj-$(CONFIG_IMX) += imx6_ccm.o
22
(qemu) object_del barrier0
31
obj-$(CONFIG_IMX) += imx6_src.o
23
(qemu) object_add input-barrier,id=barrier0,name=VM-1
32
+obj-$(CONFIG_IMX) += imx7_ccm.o
24
-
33
obj-$(CONFIG_MILKYMIST) += milkymist-hpdmc.o
25
-* Message format
34
obj-$(CONFIG_MILKYMIST) += milkymist-pfpu.o
26
-
35
obj-$(CONFIG_MAINSTONE) += mst_fpga.o
27
- Message format between the server and client is in two parts:
36
diff --git a/include/hw/misc/imx7_ccm.h b/include/hw/misc/imx7_ccm.h
28
-
29
- 1- the payload length is a 32bit integer in network endianness,
30
- 2- the payload
31
-
32
- The payload starts with a 4byte string (without NUL) which is the
33
- command. The first command between the server and the client
34
- is the only command not encoded on 4 bytes ("Barrier").
35
- The remaining part of the payload is decoded according to the command.
36
-
37
-* Protocol Description (from barrier/src/lib/barrier/protocol_types.h)
38
-
39
- - barrierCmdHello "Barrier"
40
-
41
- Direction: server -> client
42
- Parameters: { int16_t minor, int16_t major }
43
- Description:
44
-
45
- Say hello to client
46
- minor = protocol major version number supported by server
47
- major = protocol minor version number supported by server
48
-
49
- - barrierCmdHelloBack "Barrier"
50
-
51
- Direction: client ->server
52
- Parameters: { int16_t minor, int16_t major, char *name}
53
- Description:
54
-
55
- Respond to hello from server
56
- minor = protocol major version number supported by client
57
- major = protocol minor version number supported by client
58
- name = client name
59
-
60
- - barrierCmdDInfo "DINF"
61
-
62
- Direction: client ->server
63
- Parameters: { int16_t x_origin, int16_t y_origin, int16_t width, int16_t height, int16_t x, int16_t y}
64
- Description:
65
-
66
- The client screen must send this message in response to the
67
- barrierCmdQInfo message. It must also send this message when the
68
- screen's resolution changes. In this case, the client screen should
69
- ignore any barrierCmdDMouseMove messages until it receives a
70
- barrierCmdCInfoAck in order to prevent attempts to move the mouse off
71
- the new screen area.
72
-
73
- - barrierCmdCNoop "CNOP"
74
-
75
- Direction: client -> server
76
- Parameters: None
77
- Description:
78
-
79
- No operation
80
-
81
- - barrierCmdCClose "CBYE"
82
-
83
- Direction: server -> client
84
- Parameters: None
85
- Description:
86
-
87
- Close connection
88
-
89
- - barrierCmdCEnter "CINN"
90
-
91
- Direction: server -> client
92
- Parameters: { int16_t x, int16_t y, int32_t seq, int16_t modifier }
93
- Description:
94
-
95
- Enter screen.
96
- x,y = entering screen absolute coordinates
97
- seq = sequence number, which is used to order messages between
98
- screens. the secondary screen must return this number
99
- with some messages
100
- modifier = modifier key mask. this will have bits set for each
101
- toggle modifier key that is activated on entry to the
102
- screen. the secondary screen should adjust its toggle
103
- modifiers to reflect that state.
104
-
105
- - barrierCmdCLeave "COUT"
106
-
107
- Direction: server -> client
108
- Parameters: None
109
- Description:
110
-
111
- Leaving screen. the secondary screen should send clipboard data in
112
- response to this message for those clipboards that it has grabbed
113
- (i.e. has sent a barrierCmdCClipboard for and has not received a
114
- barrierCmdCClipboard for with a greater sequence number) and that
115
- were grabbed or have changed since the last leave.
116
-
117
- - barrierCmdCClipboard "CCLP"
118
-
119
- Direction: server -> client
120
- Parameters: { int8_t id, int32_t seq }
121
- Description:
122
-
123
- Grab clipboard. Sent by screen when some other app on that screen
124
- grabs a clipboard.
125
- id = the clipboard identifier
126
- seq = sequence number. Client must use the sequence number passed in
127
- the most recent barrierCmdCEnter. the server always sends 0.
128
-
129
- - barrierCmdCScreenSaver "CSEC"
130
-
131
- Direction: server -> client
132
- Parameters: { int8_t started }
133
- Description:
134
-
135
- Screensaver change.
136
- started = Screensaver on primary has started (1) or closed (0)
137
-
138
- - barrierCmdCResetOptions "CROP"
139
-
140
- Direction: server -> client
141
- Parameters: None
142
- Description:
143
-
144
- Reset options. Client should reset all of its options to their
145
- defaults.
146
-
147
- - barrierCmdCInfoAck "CIAK"
148
-
149
- Direction: server -> client
150
- Parameters: None
151
- Description:
152
-
153
- Resolution change acknowledgment. Sent by server in response to a
154
- client screen's barrierCmdDInfo. This is sent for every
155
- barrierCmdDInfo, whether or not the server had sent a barrierCmdQInfo.
156
-
157
- - barrierCmdCKeepAlive "CALV"
158
-
159
- Direction: server -> client
160
- Parameters: None
161
- Description:
162
-
163
- Keep connection alive. Sent by the server periodically to verify
164
- that connections are still up and running. clients must reply in
165
- kind on receipt. if the server gets an error sending the message or
166
- does not receive a reply within a reasonable time then the server
167
- disconnects the client. if the client doesn't receive these (or any
168
- message) periodically then it should disconnect from the server. the
169
- appropriate interval is defined by an option.
170
-
171
- - barrierCmdDKeyDown "DKDN"
172
-
173
- Direction: server -> client
174
- Parameters: { int16_t keyid, int16_t modifier [,int16_t button] }
175
- Description:
176
-
177
- Key pressed.
178
- keyid = X11 key id
179
- modified = modified mask
180
- button = X11 Xkb keycode (optional)
181
-
182
- - barrierCmdDKeyRepeat "DKRP"
183
-
184
- Direction: server -> client
185
- Parameters: { int16_t keyid, int16_t modifier, int16_t repeat [,int16_t button] }
186
- Description:
187
-
188
- Key auto-repeat.
189
- keyid = X11 key id
190
- modified = modified mask
191
- repeat = number of repeats
192
- button = X11 Xkb keycode (optional)
193
-
194
- - barrierCmdDKeyUp "DKUP"
195
-
196
- Direction: server -> client
197
- Parameters: { int16_t keyid, int16_t modifier [,int16_t button] }
198
- Description:
199
-
200
- Key released.
201
- keyid = X11 key id
202
- modified = modified mask
203
- button = X11 Xkb keycode (optional)
204
-
205
- - barrierCmdDMouseDown "DMDN"
206
-
207
- Direction: server -> client
208
- Parameters: { int8_t button }
209
- Description:
210
-
211
- Mouse button pressed.
212
- button = button id
213
-
214
- - barrierCmdDMouseUp "DMUP"
215
-
216
- Direction: server -> client
217
- Parameters: { int8_t button }
218
- Description:
219
-
220
- Mouse button release.
221
- button = button id
222
-
223
- - barrierCmdDMouseMove "DMMV"
224
-
225
- Direction: server -> client
226
- Parameters: { int16_t x, int16_t y }
227
- Description:
228
-
229
- Absolute mouse moved.
230
- x,y = absolute screen coordinates
231
-
232
- - barrierCmdDMouseRelMove "DMRM"
233
-
234
- Direction: server -> client
235
- Parameters: { int16_t x, int16_t y }
236
- Description:
237
-
238
- Relative mouse moved.
239
- x,y = r relative screen coordinates
240
-
241
- - barrierCmdDMouseWheel "DMWM"
242
-
243
- Direction: server -> client
244
- Parameters: { int16_t x , int16_t y } or { int16_t y }
245
- Description:
246
-
247
- Mouse scroll. The delta should be +120 for one tick forward (away
248
- from the user) or right and -120 for one tick backward (toward the
249
- user) or left.
250
- x = x delta
251
- y = y delta
252
-
253
- - barrierCmdDClipboard "DCLP"
254
-
255
- Direction: server -> client
256
- Parameters: { int8_t id, int32_t seq, int8_t mark, char *data }
257
- Description:
258
-
259
- Clipboard data.
260
- id = clipboard id
261
- seq = sequence number. The sequence number is 0 when sent by the
262
- server. Client screens should use the/ sequence number from
263
- the most recent barrierCmdCEnter.
264
-
265
- - barrierCmdDSetOptions "DSOP"
266
-
267
- Direction: server -> client
268
- Parameters: { int32 t nb, { int32_t id, int32_t val }[] }
269
- Description:
270
-
271
- Set options. Client should set the given option/value pairs.
272
- nb = numbers of { id, val } entries
273
- id = option id
274
- val = option new value
275
-
276
- - barrierCmdDFileTransfer "DFTR"
277
-
278
- Direction: server -> client
279
- Parameters: { int8_t mark, char *content }
280
- Description:
281
-
282
- Transfer file data.
283
- mark = 0 means the content followed is the file size
284
- 1 means the content followed is the chunk data
285
- 2 means the file transfer is finished
286
-
287
- - barrierCmdDDragInfo "DDRG" int16_t char *
288
-
289
- Direction: server -> client
290
- Parameters: { int16_t nb, char *content }
291
- Description:
292
-
293
- Drag information.
294
- nb = number of dragging objects
295
- content = object's directory
296
-
297
- - barrierCmdQInfo "QINF"
298
-
299
- Direction: server -> client
300
- Parameters: None
301
- Description:
302
-
303
- Query screen info
304
- Client should reply with a barrierCmdDInfo
305
-
306
- - barrierCmdEIncompatible "EICV"
307
-
308
- Direction: server -> client
309
- Parameters: { int16_t nb, major *minor }
310
- Description:
311
-
312
- Incompatible version.
313
- major = major version
314
- minor = minor version
315
-
316
- - barrierCmdEBusy "EBSY"
317
-
318
- Direction: server -> client
319
- Parameters: None
320
- Description:
321
-
322
- Name provided when connecting is already in use.
323
-
324
- - barrierCmdEUnknown "EUNK"
325
-
326
- Direction: server -> client
327
- Parameters: None
328
- Description:
329
-
330
- Unknown client. Name provided when connecting is not in primary's
331
- screen configuration map.
332
-
333
- - barrierCmdEBad "EBAD"
334
-
335
- Direction: server -> client
336
- Parameters: None
337
- Description:
338
-
339
- Protocol violation. Server should disconnect after sending this
340
- message.
341
-
342
* TO DO
343
344
- Enable SSL
345
diff --git a/docs/interop/barrier.rst b/docs/interop/barrier.rst
37
new file mode 100644
346
new file mode 100644
38
index XXXXXXX..XXXXXXX
347
index XXXXXXX..XXXXXXX
39
--- /dev/null
348
--- /dev/null
40
+++ b/include/hw/misc/imx7_ccm.h
349
+++ b/docs/interop/barrier.rst
41
@@ -XXX,XX +XXX,XX @@
350
@@ -XXX,XX +XXX,XX @@
42
+/*
351
+Barrier client protocol
43
+ * Copyright (c) 2017, Impinj, Inc.
352
+=======================
44
+ *
353
+
45
+ * i.MX7 CCM, PMU and ANALOG IP blocks emulation code
354
+QEMU's ``input-barrier`` device implements the client end of
46
+ *
355
+the KVM (Keyboard-Video-Mouse) software
47
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
356
+`Barrier <https://github.com/debauchee/barrier>`__.
48
+ *
357
+
49
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
358
+This document briefly describes the protocol as we implement it.
50
+ * See the COPYING file in the top-level directory.
359
+
51
+ */
360
+Message format
52
+
361
+--------------
53
+#ifndef IMX7_CCM_H
362
+
54
+#define IMX7_CCM_H
363
+Message format between the server and client is in two parts:
55
+
364
+
56
+#include "hw/misc/imx_ccm.h"
365
+#. the payload length, a 32bit integer in network endianness
57
+#include "qemu/bitops.h"
366
+#. the payload
58
+
367
+
59
+enum IMX7AnalogRegisters {
368
+The payload starts with a 4byte string (without NUL) which is the
60
+ ANALOG_PLL_ARM,
369
+command. The first command between the server and the client
61
+ ANALOG_PLL_ARM_SET,
370
+is the only command not encoded on 4 bytes ("Barrier").
62
+ ANALOG_PLL_ARM_CLR,
371
+The remaining part of the payload is decoded according to the command.
63
+ ANALOG_PLL_ARM_TOG,
372
+
64
+ ANALOG_PLL_DDR,
373
+Protocol Description
65
+ ANALOG_PLL_DDR_SET,
374
+--------------------
66
+ ANALOG_PLL_DDR_CLR,
375
+
67
+ ANALOG_PLL_DDR_TOG,
376
+This comes from ``barrier/src/lib/barrier/protocol_types.h``.
68
+ ANALOG_PLL_DDR_SS,
377
+
69
+ ANALOG_PLL_DDR_SS_SET,
378
+barrierCmdHello "Barrier"
70
+ ANALOG_PLL_DDR_SS_CLR,
379
+^^^^^^^^^^^^^^^^^^^^^^^^^^
71
+ ANALOG_PLL_DDR_SS_TOG,
380
+
72
+ ANALOG_PLL_DDR_NUM,
381
+Direction:
73
+ ANALOG_PLL_DDR_NUM_SET,
382
+ server -> client
74
+ ANALOG_PLL_DDR_NUM_CLR,
383
+Parameters:
75
+ ANALOG_PLL_DDR_NUM_TOG,
384
+ ``{ int16_t minor, int16_t major }``
76
+ ANALOG_PLL_DDR_DENOM,
385
+Description:
77
+ ANALOG_PLL_DDR_DENOM_SET,
386
+ Say hello to client
78
+ ANALOG_PLL_DDR_DENOM_CLR,
387
+
79
+ ANALOG_PLL_DDR_DENOM_TOG,
388
+ ``minor`` = protocol major version number supported by server
80
+ ANALOG_PLL_480,
389
+
81
+ ANALOG_PLL_480_SET,
390
+ ``major`` = protocol minor version number supported by server
82
+ ANALOG_PLL_480_CLR,
391
+
83
+ ANALOG_PLL_480_TOG,
392
+barrierCmdHelloBack "Barrier"
84
+ ANALOG_PLL_480A,
393
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
85
+ ANALOG_PLL_480A_SET,
394
+
86
+ ANALOG_PLL_480A_CLR,
395
+Direction:
87
+ ANALOG_PLL_480A_TOG,
396
+ client ->server
88
+ ANALOG_PLL_480B,
397
+Parameters:
89
+ ANALOG_PLL_480B_SET,
398
+ ``{ int16_t minor, int16_t major, char *name}``
90
+ ANALOG_PLL_480B_CLR,
399
+Description:
91
+ ANALOG_PLL_480B_TOG,
400
+ Respond to hello from server
92
+ ANALOG_PLL_ENET,
401
+
93
+ ANALOG_PLL_ENET_SET,
402
+ ``minor`` = protocol major version number supported by client
94
+ ANALOG_PLL_ENET_CLR,
403
+
95
+ ANALOG_PLL_ENET_TOG,
404
+ ``major`` = protocol minor version number supported by client
96
+ ANALOG_PLL_AUDIO,
405
+
97
+ ANALOG_PLL_AUDIO_SET,
406
+ ``name`` = client name
98
+ ANALOG_PLL_AUDIO_CLR,
407
+
99
+ ANALOG_PLL_AUDIO_TOG,
408
+barrierCmdDInfo "DINF"
100
+ ANALOG_PLL_AUDIO_SS,
409
+^^^^^^^^^^^^^^^^^^^^^^^
101
+ ANALOG_PLL_AUDIO_SS_SET,
410
+
102
+ ANALOG_PLL_AUDIO_SS_CLR,
411
+Direction:
103
+ ANALOG_PLL_AUDIO_SS_TOG,
412
+ client ->server
104
+ ANALOG_PLL_AUDIO_NUM,
413
+Parameters:
105
+ ANALOG_PLL_AUDIO_NUM_SET,
414
+ ``{ int16_t x_origin, int16_t y_origin, int16_t width, int16_t height, int16_t x, int16_t y}``
106
+ ANALOG_PLL_AUDIO_NUM_CLR,
415
+Description:
107
+ ANALOG_PLL_AUDIO_NUM_TOG,
416
+ The client screen must send this message in response to the
108
+ ANALOG_PLL_AUDIO_DENOM,
417
+ barrierCmdQInfo message. It must also send this message when the
109
+ ANALOG_PLL_AUDIO_DENOM_SET,
418
+ screen's resolution changes. In this case, the client screen should
110
+ ANALOG_PLL_AUDIO_DENOM_CLR,
419
+ ignore any barrierCmdDMouseMove messages until it receives a
111
+ ANALOG_PLL_AUDIO_DENOM_TOG,
420
+ barrierCmdCInfoAck in order to prevent attempts to move the mouse off
112
+ ANALOG_PLL_VIDEO,
421
+ the new screen area.
113
+ ANALOG_PLL_VIDEO_SET,
422
+
114
+ ANALOG_PLL_VIDEO_CLR,
423
+barrierCmdCNoop "CNOP"
115
+ ANALOG_PLL_VIDEO_TOG,
424
+^^^^^^^^^^^^^^^^^^^^^^^
116
+ ANALOG_PLL_VIDEO_SS,
425
+
117
+ ANALOG_PLL_VIDEO_SS_SET,
426
+Direction:
118
+ ANALOG_PLL_VIDEO_SS_CLR,
427
+ client -> server
119
+ ANALOG_PLL_VIDEO_SS_TOG,
428
+Parameters:
120
+ ANALOG_PLL_VIDEO_NUM,
429
+ None
121
+ ANALOG_PLL_VIDEO_NUM_SET,
430
+Description:
122
+ ANALOG_PLL_VIDEO_NUM_CLR,
431
+ No operation
123
+ ANALOG_PLL_VIDEO_NUM_TOG,
432
+
124
+ ANALOG_PLL_VIDEO_DENOM,
433
+barrierCmdCClose "CBYE"
125
+ ANALOG_PLL_VIDEO_DENOM_SET,
434
+^^^^^^^^^^^^^^^^^^^^^^^
126
+ ANALOG_PLL_VIDEO_DENOM_CLR,
435
+
127
+ ANALOG_PLL_VIDEO_DENOM_TOG,
436
+Direction:
128
+ ANALOG_PLL_MISC0,
437
+ server -> client
129
+ ANALOG_PLL_MISC0_SET,
438
+Parameters:
130
+ ANALOG_PLL_MISC0_CLR,
439
+ None
131
+ ANALOG_PLL_MISC0_TOG,
440
+Description:
132
+
441
+ Close connection
133
+ ANALOG_DIGPROG = 0x800 / sizeof(uint32_t),
442
+
134
+ ANALOG_MAX,
443
+barrierCmdCEnter "CINN"
135
+
444
+^^^^^^^^^^^^^^^^^^^^^^^
136
+ ANALOG_PLL_LOCK = BIT(31)
445
+
137
+};
446
+Direction:
138
+
447
+ server -> client
139
+enum IMX7CCMRegisters {
448
+Parameters:
140
+ CCM_MAX = 0xBE00 / sizeof(uint32_t) + 1,
449
+ ``{ int16_t x, int16_t y, int32_t seq, int16_t modifier }``
141
+};
450
+Description:
142
+
451
+ Enter screen.
143
+enum IMX7PMURegisters {
452
+
144
+ PMU_MAX = 0x140 / sizeof(uint32_t),
453
+ ``x``, ``y`` = entering screen absolute coordinates
145
+};
454
+
146
+
455
+ ``seq`` = sequence number, which is used to order messages between
147
+#define TYPE_IMX7_CCM "imx7.ccm"
456
+ screens. the secondary screen must return this number
148
+#define IMX7_CCM(obj) OBJECT_CHECK(IMX7CCMState, (obj), TYPE_IMX7_CCM)
457
+ with some messages
149
+
458
+
150
+typedef struct IMX7CCMState {
459
+ ``modifier`` = modifier key mask. this will have bits set for each
151
+ /* <private> */
460
+ toggle modifier key that is activated on entry to the
152
+ IMXCCMState parent_obj;
461
+ screen. the secondary screen should adjust its toggle
153
+
462
+ modifiers to reflect that state.
154
+ /* <public> */
463
+
155
+ MemoryRegion iomem;
464
+barrierCmdCLeave "COUT"
156
+
465
+^^^^^^^^^^^^^^^^^^^^^^^
157
+ uint32_t ccm[CCM_MAX];
466
+
158
+} IMX7CCMState;
467
+Direction:
159
+
468
+ server -> client
160
+
469
+Parameters:
161
+#define TYPE_IMX7_ANALOG "imx7.analog"
470
+ None
162
+#define IMX7_ANALOG(obj) OBJECT_CHECK(IMX7AnalogState, (obj), TYPE_IMX7_ANALOG)
471
+Description:
163
+
472
+ Leaving screen. the secondary screen should send clipboard data in
164
+typedef struct IMX7AnalogState {
473
+ response to this message for those clipboards that it has grabbed
165
+ /* <private> */
474
+ (i.e. has sent a barrierCmdCClipboard for and has not received a
166
+ IMXCCMState parent_obj;
475
+ barrierCmdCClipboard for with a greater sequence number) and that
167
+
476
+ were grabbed or have changed since the last leave.
168
+ /* <public> */
477
+
169
+ struct {
478
+barrierCmdCClipboard "CCLP"
170
+ MemoryRegion container;
479
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
171
+ MemoryRegion analog;
480
+
172
+ MemoryRegion digprog;
481
+Direction:
173
+ MemoryRegion pmu;
482
+ server -> client
174
+ } mmio;
483
+Parameters:
175
+
484
+ ``{ int8_t id, int32_t seq }``
176
+ uint32_t analog[ANALOG_MAX];
485
+Description:
177
+ uint32_t pmu[PMU_MAX];
486
+ Grab clipboard. Sent by screen when some other app on that screen
178
+} IMX7AnalogState;
487
+ grabs a clipboard.
179
+
488
+
180
+#endif /* IMX7_CCM_H */
489
+ ``id`` = the clipboard identifier
181
diff --git a/hw/misc/imx7_ccm.c b/hw/misc/imx7_ccm.c
490
+
182
new file mode 100644
491
+ ``seq`` = sequence number. Client must use the sequence number passed in
183
index XXXXXXX..XXXXXXX
492
+ the most recent barrierCmdCEnter. the server always sends 0.
184
--- /dev/null
493
+
185
+++ b/hw/misc/imx7_ccm.c
494
+barrierCmdCScreenSaver "CSEC"
186
@@ -XXX,XX +XXX,XX @@
495
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
187
+/*
496
+
188
+ * Copyright (c) 2018, Impinj, Inc.
497
+Direction:
189
+ *
498
+ server -> client
190
+ * i.MX7 CCM, PMU and ANALOG IP blocks emulation code
499
+Parameters:
191
+ *
500
+ ``{ int8_t started }``
192
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
501
+Description:
193
+ *
502
+ Screensaver change.
194
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
503
+
195
+ * See the COPYING file in the top-level directory.
504
+ ``started`` = Screensaver on primary has started (1) or closed (0)
196
+ */
505
+
197
+
506
+barrierCmdCResetOptions "CROP"
198
+#include "qemu/osdep.h"
507
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
199
+#include "qemu/log.h"
508
+
200
+
509
+Direction:
201
+#include "hw/misc/imx7_ccm.h"
510
+ server -> client
202
+
511
+Parameters:
203
+static void imx7_analog_reset(DeviceState *dev)
512
+ None
204
+{
513
+Description:
205
+ IMX7AnalogState *s = IMX7_ANALOG(dev);
514
+ Reset options. Client should reset all of its options to their
206
+
515
+ defaults.
207
+ memset(s->pmu, 0, sizeof(s->pmu));
516
+
208
+ memset(s->analog, 0, sizeof(s->analog));
517
+barrierCmdCInfoAck "CIAK"
209
+
518
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
210
+ s->analog[ANALOG_PLL_ARM] = 0x00002042;
519
+
211
+ s->analog[ANALOG_PLL_DDR] = 0x0060302c;
520
+Direction:
212
+ s->analog[ANALOG_PLL_DDR_SS] = 0x00000000;
521
+ server -> client
213
+ s->analog[ANALOG_PLL_DDR_NUM] = 0x06aaac4d;
522
+Parameters:
214
+ s->analog[ANALOG_PLL_DDR_DENOM] = 0x100003ec;
523
+ None
215
+ s->analog[ANALOG_PLL_480] = 0x00002000;
524
+Description:
216
+ s->analog[ANALOG_PLL_480A] = 0x52605a56;
525
+ Resolution change acknowledgment. Sent by server in response to a
217
+ s->analog[ANALOG_PLL_480B] = 0x52525216;
526
+ client screen's barrierCmdDInfo. This is sent for every
218
+ s->analog[ANALOG_PLL_ENET] = 0x00001fc0;
527
+ barrierCmdDInfo, whether or not the server had sent a barrierCmdQInfo.
219
+ s->analog[ANALOG_PLL_AUDIO] = 0x0001301b;
528
+
220
+ s->analog[ANALOG_PLL_AUDIO_SS] = 0x00000000;
529
+barrierCmdCKeepAlive "CALV"
221
+ s->analog[ANALOG_PLL_AUDIO_NUM] = 0x05f5e100;
530
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
222
+ s->analog[ANALOG_PLL_AUDIO_DENOM] = 0x2964619c;
531
+
223
+ s->analog[ANALOG_PLL_VIDEO] = 0x0008201b;
532
+Direction:
224
+ s->analog[ANALOG_PLL_VIDEO_SS] = 0x00000000;
533
+ server -> client
225
+ s->analog[ANALOG_PLL_VIDEO_NUM] = 0x0000f699;
534
+Parameters:
226
+ s->analog[ANALOG_PLL_VIDEO_DENOM] = 0x000f4240;
535
+ None
227
+ s->analog[ANALOG_PLL_MISC0] = 0x00000000;
536
+Description:
228
+
537
+ Keep connection alive. Sent by the server periodically to verify
229
+ /* all PLLs need to be locked */
538
+ that connections are still up and running. clients must reply in
230
+ s->analog[ANALOG_PLL_ARM] |= ANALOG_PLL_LOCK;
539
+ kind on receipt. if the server gets an error sending the message or
231
+ s->analog[ANALOG_PLL_DDR] |= ANALOG_PLL_LOCK;
540
+ does not receive a reply within a reasonable time then the server
232
+ s->analog[ANALOG_PLL_480] |= ANALOG_PLL_LOCK;
541
+ disconnects the client. if the client doesn't receive these (or any
233
+ s->analog[ANALOG_PLL_480A] |= ANALOG_PLL_LOCK;
542
+ message) periodically then it should disconnect from the server. the
234
+ s->analog[ANALOG_PLL_480B] |= ANALOG_PLL_LOCK;
543
+ appropriate interval is defined by an option.
235
+ s->analog[ANALOG_PLL_ENET] |= ANALOG_PLL_LOCK;
544
+
236
+ s->analog[ANALOG_PLL_AUDIO] |= ANALOG_PLL_LOCK;
545
+barrierCmdDKeyDown "DKDN"
237
+ s->analog[ANALOG_PLL_VIDEO] |= ANALOG_PLL_LOCK;
546
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
238
+ s->analog[ANALOG_PLL_MISC0] |= ANALOG_PLL_LOCK;
547
+
239
+
548
+Direction:
240
+ /*
549
+ server -> client
241
+ * Since I couldn't find any info about this in the reference
550
+Parameters:
242
+ * manual the value of this register is based strictly on matching
551
+ ``{ int16_t keyid, int16_t modifier [,int16_t button] }``
243
+ * what Linux kernel expects it to be.
552
+Description:
244
+ */
553
+ Key pressed.
245
+ s->analog[ANALOG_DIGPROG] = 0x720000;
554
+
246
+ /*
555
+ ``keyid`` = X11 key id
247
+ * Set revision to be 1.0 (Arbitrary choice, no particular
556
+
248
+ * reason).
557
+ ``modified`` = modified mask
249
+ */
558
+
250
+ s->analog[ANALOG_DIGPROG] |= 0x000010;
559
+ ``button`` = X11 Xkb keycode (optional)
251
+}
560
+
252
+
561
+barrierCmdDKeyRepeat "DKRP"
253
+static void imx7_ccm_reset(DeviceState *dev)
562
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
254
+{
563
+
255
+ IMX7CCMState *s = IMX7_CCM(dev);
564
+Direction:
256
+
565
+ server -> client
257
+ memset(s->ccm, 0, sizeof(s->ccm));
566
+Parameters:
258
+}
567
+ ``{ int16_t keyid, int16_t modifier, int16_t repeat [,int16_t button] }``
259
+
568
+Description:
260
+#define CCM_INDEX(offset) (((offset) & ~(hwaddr)0xF) / sizeof(uint32_t))
569
+ Key auto-repeat.
261
+#define CCM_BITOP(offset) ((offset) & (hwaddr)0xF)
570
+
262
+
571
+ ``keyid`` = X11 key id
263
+enum {
572
+
264
+ CCM_BITOP_NONE = 0x00,
573
+ ``modified`` = modified mask
265
+ CCM_BITOP_SET = 0x04,
574
+
266
+ CCM_BITOP_CLR = 0x08,
575
+ ``repeat`` = number of repeats
267
+ CCM_BITOP_TOG = 0x0C,
576
+
268
+};
577
+ ``button`` = X11 Xkb keycode (optional)
269
+
578
+
270
+static uint64_t imx7_set_clr_tog_read(void *opaque, hwaddr offset,
579
+barrierCmdDKeyUp "DKUP"
271
+ unsigned size)
580
+^^^^^^^^^^^^^^^^^^^^^^^
272
+{
581
+
273
+ const uint32_t *mmio = opaque;
582
+Direction:
274
+
583
+ server -> client
275
+ return mmio[CCM_INDEX(offset)];
584
+Parameters:
276
+}
585
+ ``{ int16_t keyid, int16_t modifier [,int16_t button] }``
277
+
586
+Description:
278
+static void imx7_set_clr_tog_write(void *opaque, hwaddr offset,
587
+ Key released.
279
+ uint64_t value, unsigned size)
588
+
280
+{
589
+ ``keyid`` = X11 key id
281
+ const uint8_t bitop = CCM_BITOP(offset);
590
+
282
+ const uint32_t index = CCM_INDEX(offset);
591
+ ``modified`` = modified mask
283
+ uint32_t *mmio = opaque;
592
+
284
+
593
+ ``button`` = X11 Xkb keycode (optional)
285
+ switch (bitop) {
594
+
286
+ case CCM_BITOP_NONE:
595
+barrierCmdDMouseDown "DMDN"
287
+ mmio[index] = value;
596
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
288
+ break;
597
+
289
+ case CCM_BITOP_SET:
598
+Direction:
290
+ mmio[index] |= value;
599
+ server -> client
291
+ break;
600
+Parameters:
292
+ case CCM_BITOP_CLR:
601
+ ``{ int8_t button }``
293
+ mmio[index] &= ~value;
602
+Description:
294
+ break;
603
+ Mouse button pressed.
295
+ case CCM_BITOP_TOG:
604
+
296
+ mmio[index] ^= value;
605
+ ``button`` = button id
297
+ break;
606
+
298
+ };
607
+barrierCmdDMouseUp "DMUP"
299
+}
608
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
300
+
609
+
301
+static const struct MemoryRegionOps imx7_set_clr_tog_ops = {
610
+Direction:
302
+ .read = imx7_set_clr_tog_read,
611
+ server -> client
303
+ .write = imx7_set_clr_tog_write,
612
+Parameters:
304
+ .endianness = DEVICE_NATIVE_ENDIAN,
613
+ ``{ int8_t button }``
305
+ .impl = {
614
+Description:
306
+ /*
615
+ Mouse button release.
307
+ * Our device would not work correctly if the guest was doing
616
+
308
+ * unaligned access. This might not be a limitation on the real
617
+ ``button`` = button id
309
+ * device but in practice there is no reason for a guest to access
618
+
310
+ * this device unaligned.
619
+barrierCmdDMouseMove "DMMV"
311
+ */
620
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
312
+ .min_access_size = 4,
621
+
313
+ .max_access_size = 4,
622
+Direction:
314
+ .unaligned = false,
623
+ server -> client
315
+ },
624
+Parameters:
316
+};
625
+ ``{ int16_t x, int16_t y }``
317
+
626
+Description:
318
+static const struct MemoryRegionOps imx7_digprog_ops = {
627
+ Absolute mouse moved.
319
+ .read = imx7_set_clr_tog_read,
628
+
320
+ .endianness = DEVICE_NATIVE_ENDIAN,
629
+ ``x``, ``y`` = absolute screen coordinates
321
+ .impl = {
630
+
322
+ .min_access_size = 4,
631
+barrierCmdDMouseRelMove "DMRM"
323
+ .max_access_size = 4,
632
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
324
+ .unaligned = false,
633
+
325
+ },
634
+Direction:
326
+};
635
+ server -> client
327
+
636
+Parameters:
328
+static void imx7_ccm_init(Object *obj)
637
+ ``{ int16_t x, int16_t y }``
329
+{
638
+Description:
330
+ SysBusDevice *sd = SYS_BUS_DEVICE(obj);
639
+ Relative mouse moved.
331
+ IMX7CCMState *s = IMX7_CCM(obj);
640
+
332
+
641
+ ``x``, ``y`` = r relative screen coordinates
333
+ memory_region_init_io(&s->iomem,
642
+
334
+ obj,
643
+barrierCmdDMouseWheel "DMWM"
335
+ &imx7_set_clr_tog_ops,
644
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
336
+ s->ccm,
645
+
337
+ TYPE_IMX7_CCM ".ccm",
646
+Direction:
338
+ sizeof(s->ccm));
647
+ server -> client
339
+
648
+Parameters:
340
+ sysbus_init_mmio(sd, &s->iomem);
649
+ ``{ int16_t x , int16_t y }`` or ``{ int16_t y }``
341
+}
650
+Description:
342
+
651
+ Mouse scroll. The delta should be +120 for one tick forward (away
343
+static void imx7_analog_init(Object *obj)
652
+ from the user) or right and -120 for one tick backward (toward the
344
+{
653
+ user) or left.
345
+ SysBusDevice *sd = SYS_BUS_DEVICE(obj);
654
+
346
+ IMX7AnalogState *s = IMX7_ANALOG(obj);
655
+ ``x`` = x delta
347
+
656
+
348
+ memory_region_init(&s->mmio.container, obj, TYPE_IMX7_ANALOG,
657
+ ``y`` = y delta
349
+ 0x10000);
658
+
350
+
659
+barrierCmdDClipboard "DCLP"
351
+ memory_region_init_io(&s->mmio.analog,
660
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
352
+ obj,
661
+
353
+ &imx7_set_clr_tog_ops,
662
+Direction:
354
+ s->analog,
663
+ server -> client
355
+ TYPE_IMX7_ANALOG,
664
+Parameters:
356
+ sizeof(s->analog));
665
+ ``{ int8_t id, int32_t seq, int8_t mark, char *data }``
357
+
666
+Description:
358
+ memory_region_add_subregion(&s->mmio.container,
667
+ Clipboard data.
359
+ 0x60, &s->mmio.analog);
668
+
360
+
669
+ ``id`` = clipboard id
361
+ memory_region_init_io(&s->mmio.pmu,
670
+
362
+ obj,
671
+ ``seq`` = sequence number. The sequence number is 0 when sent by the
363
+ &imx7_set_clr_tog_ops,
672
+ server. Client screens should use the/ sequence number from
364
+ s->pmu,
673
+ the most recent barrierCmdCEnter.
365
+ TYPE_IMX7_ANALOG ".pmu",
674
+
366
+ sizeof(s->pmu));
675
+barrierCmdDSetOptions "DSOP"
367
+
676
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
368
+ memory_region_add_subregion(&s->mmio.container,
677
+
369
+ 0x200, &s->mmio.pmu);
678
+Direction:
370
+
679
+ server -> client
371
+ memory_region_init_io(&s->mmio.digprog,
680
+Parameters:
372
+ obj,
681
+ ``{ int32 t nb, { int32_t id, int32_t val }[] }``
373
+ &imx7_digprog_ops,
682
+Description:
374
+ &s->analog[ANALOG_DIGPROG],
683
+ Set options. Client should set the given option/value pairs.
375
+ TYPE_IMX7_ANALOG ".digprog",
684
+
376
+ sizeof(uint32_t));
685
+ ``nb`` = numbers of ``{ id, val }`` entries
377
+
686
+
378
+ memory_region_add_subregion_overlap(&s->mmio.container,
687
+ ``id`` = option id
379
+ 0x800, &s->mmio.digprog, 10);
688
+
380
+
689
+ ``val`` = option new value
381
+
690
+
382
+ sysbus_init_mmio(sd, &s->mmio.container);
691
+barrierCmdDFileTransfer "DFTR"
383
+}
692
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
384
+
693
+
385
+static const VMStateDescription vmstate_imx7_ccm = {
694
+Direction:
386
+ .name = TYPE_IMX7_CCM,
695
+ server -> client
387
+ .version_id = 1,
696
+Parameters:
388
+ .minimum_version_id = 1,
697
+ ``{ int8_t mark, char *content }``
389
+ .fields = (VMStateField[]) {
698
+Description:
390
+ VMSTATE_UINT32_ARRAY(ccm, IMX7CCMState, CCM_MAX),
699
+ Transfer file data.
391
+ VMSTATE_END_OF_LIST()
700
+
392
+ },
701
+ * ``mark`` = 0 means the content followed is the file size
393
+};
702
+ * 1 means the content followed is the chunk data
394
+
703
+ * 2 means the file transfer is finished
395
+static uint32_t imx7_ccm_get_clock_frequency(IMXCCMState *dev, IMXClk clock)
704
+
396
+{
705
+barrierCmdDDragInfo "DDRG"
397
+ /*
706
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
398
+ * This function is "consumed" by GPT emulation code, however on
707
+
399
+ * i.MX7 each GPT block can have their own clock root. This means
708
+Direction:
400
+ * that this functions needs somehow to know requester's identity
709
+ server -> client
401
+ * and the way to pass it: be it via additional IMXClk constants
710
+Parameters:
402
+ * or by adding another argument to this method needs to be
711
+ ``{ int16_t nb, char *content }``
403
+ * figured out
712
+Description:
404
+ */
713
+ Drag information.
405
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Not implemented\n",
714
+
406
+ TYPE_IMX7_CCM, __func__);
715
+ ``nb`` = number of dragging objects
407
+ return 0;
716
+
408
+}
717
+ ``content`` = object's directory
409
+
718
+
410
+static void imx7_ccm_class_init(ObjectClass *klass, void *data)
719
+barrierCmdQInfo "QINF"
411
+{
720
+^^^^^^^^^^^^^^^^^^^^^^^
412
+ DeviceClass *dc = DEVICE_CLASS(klass);
721
+
413
+ IMXCCMClass *ccm = IMX_CCM_CLASS(klass);
722
+Direction:
414
+
723
+ server -> client
415
+ dc->reset = imx7_ccm_reset;
724
+Parameters:
416
+ dc->vmsd = &vmstate_imx7_ccm;
725
+ None
417
+ dc->desc = "i.MX7 Clock Control Module";
726
+Description:
418
+
727
+ Query screen info
419
+ ccm->get_clock_frequency = imx7_ccm_get_clock_frequency;
728
+
420
+}
729
+ Client should reply with a barrierCmdDInfo
421
+
730
+
422
+static const TypeInfo imx7_ccm_info = {
731
+barrierCmdEIncompatible "EICV"
423
+ .name = TYPE_IMX7_CCM,
732
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
424
+ .parent = TYPE_IMX_CCM,
733
+
425
+ .instance_size = sizeof(IMX7CCMState),
734
+Direction:
426
+ .instance_init = imx7_ccm_init,
735
+ server -> client
427
+ .class_init = imx7_ccm_class_init,
736
+Parameters:
428
+};
737
+ ``{ int16_t nb, major *minor }``
429
+
738
+Description:
430
+static const VMStateDescription vmstate_imx7_analog = {
739
+ Incompatible version.
431
+ .name = TYPE_IMX7_ANALOG,
740
+
432
+ .version_id = 1,
741
+ ``major`` = major version
433
+ .minimum_version_id = 1,
742
+
434
+ .fields = (VMStateField[]) {
743
+ ``minor`` = minor version
435
+ VMSTATE_UINT32_ARRAY(analog, IMX7AnalogState, ANALOG_MAX),
744
+
436
+ VMSTATE_UINT32_ARRAY(pmu, IMX7AnalogState, PMU_MAX),
745
+barrierCmdEBusy "EBSY"
437
+ VMSTATE_END_OF_LIST()
746
+^^^^^^^^^^^^^^^^^^^^^^^
438
+ },
747
+
439
+};
748
+Direction:
440
+
749
+ server -> client
441
+static void imx7_analog_class_init(ObjectClass *klass, void *data)
750
+Parameters:
442
+{
751
+ None
443
+ DeviceClass *dc = DEVICE_CLASS(klass);
752
+Description:
444
+
753
+ Name provided when connecting is already in use.
445
+ dc->reset = imx7_analog_reset;
754
+
446
+ dc->vmsd = &vmstate_imx7_analog;
755
+barrierCmdEUnknown "EUNK"
447
+ dc->desc = "i.MX7 Analog Module";
756
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
448
+}
757
+
449
+
758
+Direction:
450
+static const TypeInfo imx7_analog_info = {
759
+ server -> client
451
+ .name = TYPE_IMX7_ANALOG,
760
+Parameters:
452
+ .parent = TYPE_SYS_BUS_DEVICE,
761
+ None
453
+ .instance_size = sizeof(IMX7AnalogState),
762
+Description:
454
+ .instance_init = imx7_analog_init,
763
+ Unknown client. Name provided when connecting is not in primary's
455
+ .class_init = imx7_analog_class_init,
764
+ screen configuration map.
456
+};
765
+
457
+
766
+barrierCmdEBad "EBAD"
458
+static void imx7_ccm_register_type(void)
767
+^^^^^^^^^^^^^^^^^^^^^^^
459
+{
768
+
460
+ type_register_static(&imx7_ccm_info);
769
+Direction:
461
+ type_register_static(&imx7_analog_info);
770
+ server -> client
462
+}
771
+Parameters:
463
+type_init(imx7_ccm_register_type)
772
+ None
773
+Description:
774
+ Protocol violation. Server should disconnect after sending this
775
+ message.
776
+
777
diff --git a/docs/interop/index.rst b/docs/interop/index.rst
778
index XXXXXXX..XXXXXXX 100644
779
--- a/docs/interop/index.rst
780
+++ b/docs/interop/index.rst
781
@@ -XXX,XX +XXX,XX @@ are useful for making QEMU interoperate with other software.
782
.. toctree::
783
:maxdepth: 2
784
785
+ barrier
786
bitmaps
787
dbus
788
dbus-vmstate
464
--
789
--
465
2.16.1
790
2.20.1
466
791
467
792
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
docs/barrier.txt has a couple of TODO notes about things to be
2
implemented in this device; move them into a comment in the
3
source code.
2
4
3
IP block found on several generations of i.MX family does not use
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
vanilla SDHCI implementation and it comes with a number of quirks.
6
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
7
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20210727204112.12579-3-peter.maydell@linaro.org
10
---
11
docs/barrier.txt | 4 ----
12
ui/input-barrier.c | 5 +++++
13
2 files changed, 5 insertions(+), 4 deletions(-)
5
14
6
Introduce i.MX SDHCI subtype of SDHCI block to add code necessary to
15
diff --git a/docs/barrier.txt b/docs/barrier.txt
7
support unmodified Linux guest driver.
8
9
Cc: Peter Maydell <peter.maydell@linaro.org>
10
Cc: Jason Wang <jasowang@redhat.com>
11
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
13
Cc: Michael S. Tsirkin <mst@redhat.com>
14
Cc: qemu-devel@nongnu.org
15
Cc: qemu-arm@nongnu.org
16
Cc: yurovsky@gmail.com
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
19
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
[PMM: define and use ESDHC_UNDOCUMENTED_REG27]
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
23
hw/sd/sdhci-internal.h | 23 +++++
24
include/hw/sd/sdhci.h | 13 +++
25
hw/sd/sdhci.c | 230 ++++++++++++++++++++++++++++++++++++++++++++++++-
26
3 files changed, 265 insertions(+), 1 deletion(-)
27
28
diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
29
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/sd/sdhci-internal.h
17
--- a/docs/barrier.txt
31
+++ b/hw/sd/sdhci-internal.h
18
+++ b/docs/barrier.txt
32
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
33
20
34
/* R/W Host control Register 0x0 */
21
(qemu) object_del barrier0
35
#define SDHC_HOSTCTL 0x28
22
(qemu) object_add input-barrier,id=barrier0,name=VM-1
36
+#define SDHC_CTRL_LED 0x01
23
-* TO DO
37
#define SDHC_CTRL_DMA_CHECK_MASK 0x18
24
-
38
#define SDHC_CTRL_SDMA 0x00
25
- - Enable SSL
39
#define SDHC_CTRL_ADMA1_32 0x08
26
- - Manage SetOptions/ResetOptions commands
40
#define SDHC_CTRL_ADMA2_32 0x10
27
41
#define SDHC_CTRL_ADMA2_64 0x18
28
diff --git a/ui/input-barrier.c b/ui/input-barrier.c
42
#define SDHC_DMA_TYPE(x) ((x) & SDHC_CTRL_DMA_CHECK_MASK)
43
+#define SDHC_CTRL_4BITBUS 0x02
44
+#define SDHC_CTRL_8BITBUS 0x20
45
+#define SDHC_CTRL_CDTEST_INS 0x40
46
+#define SDHC_CTRL_CDTEST_EN 0x80
47
+
48
49
/* R/W Power Control Register 0x0 */
50
#define SDHC_PWRCON 0x29
51
@@ -XXX,XX +XXX,XX @@ enum {
52
sdhc_gap_write = 2 /* SDHC stopped at block gap during write operation */
53
};
54
55
+extern const VMStateDescription sdhci_vmstate;
56
+
57
+
58
+#define ESDHC_MIX_CTRL 0x48
59
+#define ESDHC_VENDOR_SPEC 0xc0
60
+#define ESDHC_DLL_CTRL 0x60
61
+
62
+#define ESDHC_TUNING_CTRL 0xcc
63
+#define ESDHC_TUNE_CTRL_STATUS 0x68
64
+#define ESDHC_WTMK_LVL 0x44
65
+
66
+/* Undocumented register used by guests working around erratum ERR004536 */
67
+#define ESDHC_UNDOCUMENTED_REG27 0x6c
68
+
69
+#define ESDHC_CTRL_4BITBUS (0x1 << 1)
70
+#define ESDHC_CTRL_8BITBUS (0x2 << 1)
71
+
72
#endif
73
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
74
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
75
--- a/include/hw/sd/sdhci.h
30
--- a/ui/input-barrier.c
76
+++ b/include/hw/sd/sdhci.h
31
+++ b/ui/input-barrier.c
77
@@ -XXX,XX +XXX,XX @@ typedef struct SDHCIState {
32
@@ -XXX,XX +XXX,XX @@
78
AddressSpace sysbus_dma_as;
33
*
79
AddressSpace *dma_as;
34
* This work is licensed under the terms of the GNU GPL, version 2 or later.
80
MemoryRegion *dma_mr;
35
* See the COPYING file in the top-level directory.
81
+ const MemoryRegionOps *io_ops;
82
83
QEMUTimer *insert_timer; /* timer for 'changing' sd card. */
84
QEMUTimer *transfer_timer;
85
@@ -XXX,XX +XXX,XX @@ typedef struct SDHCIState {
86
87
/* Configurable properties */
88
bool pending_insert_quirk; /* Quirk for Raspberry Pi card insert int */
89
+ uint32_t quirks;
90
} SDHCIState;
91
92
+/*
93
+ * Controller does not provide transfer-complete interrupt when not
94
+ * busy.
95
+ *
36
+ *
96
+ * NOTE: This definition is taken out of Linux kernel and so the
37
+ * TODO:
97
+ * original bit number is preserved
38
+ *
98
+ */
39
+ * - Enable SSL
99
+#define SDHCI_QUIRK_NO_BUSY_IRQ BIT(14)
40
+ * - Manage SetOptions/ResetOptions commands
100
+
41
*/
101
#define TYPE_PCI_SDHCI "sdhci-pci"
42
102
#define PCI_SDHCI(obj) OBJECT_CHECK(SDHCIState, (obj), TYPE_PCI_SDHCI)
43
#include "qemu/osdep.h"
103
104
@@ -XXX,XX +XXX,XX @@ typedef struct SDHCIState {
105
#define SYSBUS_SDHCI(obj) \
106
OBJECT_CHECK(SDHCIState, (obj), TYPE_SYSBUS_SDHCI)
107
108
+#define TYPE_IMX_USDHC "imx-usdhc"
109
+
110
#endif /* SDHCI_H */
111
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
112
index XXXXXXX..XXXXXXX 100644
113
--- a/hw/sd/sdhci.c
114
+++ b/hw/sd/sdhci.c
115
@@ -XXX,XX +XXX,XX @@ static void sdhci_send_command(SDHCIState *s)
116
}
117
}
118
119
- if ((s->norintstsen & SDHC_NISEN_TRSCMP) &&
120
+ if (!(s->quirks & SDHCI_QUIRK_NO_BUSY_IRQ) &&
121
+ (s->norintstsen & SDHC_NISEN_TRSCMP) &&
122
(s->cmdreg & SDHC_CMD_RESPONSE) == SDHC_CMD_RSP_WITH_BUSY) {
123
s->norintsts |= SDHC_NIS_TRSCMP;
124
}
125
@@ -XXX,XX +XXX,XX @@ static void sdhci_initfn(SDHCIState *s)
126
127
s->insert_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_raise_insertion_irq, s);
128
s->transfer_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_data_transfer, s);
129
+
130
+ s->io_ops = &sdhci_mmio_ops;
131
}
132
133
static void sdhci_uninitfn(SDHCIState *s)
134
@@ -XXX,XX +XXX,XX @@ static void sdhci_sysbus_realize(DeviceState *dev, Error ** errp)
135
}
136
137
sysbus_init_irq(sbd, &s->irq);
138
+
139
+ memory_region_init_io(&s->iomem, OBJECT(s), s->io_ops, s, "sdhci",
140
+ SDHC_REGISTERS_MAP_SIZE);
141
+
142
sysbus_init_mmio(sbd, &s->iomem);
143
}
144
145
@@ -XXX,XX +XXX,XX @@ static const TypeInfo sdhci_bus_info = {
146
.class_init = sdhci_bus_class_init,
147
};
148
149
+static uint64_t usdhc_read(void *opaque, hwaddr offset, unsigned size)
150
+{
151
+ SDHCIState *s = SYSBUS_SDHCI(opaque);
152
+ uint32_t ret;
153
+ uint16_t hostctl;
154
+
155
+ switch (offset) {
156
+ default:
157
+ return sdhci_read(opaque, offset, size);
158
+
159
+ case SDHC_HOSTCTL:
160
+ /*
161
+ * For a detailed explanation on the following bit
162
+ * manipulation code see comments in a similar part of
163
+ * usdhc_write()
164
+ */
165
+ hostctl = SDHC_DMA_TYPE(s->hostctl) << (8 - 3);
166
+
167
+ if (s->hostctl & SDHC_CTRL_8BITBUS) {
168
+ hostctl |= ESDHC_CTRL_8BITBUS;
169
+ }
170
+
171
+ if (s->hostctl & SDHC_CTRL_4BITBUS) {
172
+ hostctl |= ESDHC_CTRL_4BITBUS;
173
+ }
174
+
175
+ ret = hostctl;
176
+ ret |= (uint32_t)s->blkgap << 16;
177
+ ret |= (uint32_t)s->wakcon << 24;
178
+
179
+ break;
180
+
181
+ case ESDHC_DLL_CTRL:
182
+ case ESDHC_TUNE_CTRL_STATUS:
183
+ case ESDHC_UNDOCUMENTED_REG27:
184
+ case ESDHC_TUNING_CTRL:
185
+ case ESDHC_VENDOR_SPEC:
186
+ case ESDHC_MIX_CTRL:
187
+ case ESDHC_WTMK_LVL:
188
+ ret = 0;
189
+ break;
190
+ }
191
+
192
+ return ret;
193
+}
194
+
195
+static void
196
+usdhc_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
197
+{
198
+ SDHCIState *s = SYSBUS_SDHCI(opaque);
199
+ uint8_t hostctl;
200
+ uint32_t value = (uint32_t)val;
201
+
202
+ switch (offset) {
203
+ case ESDHC_DLL_CTRL:
204
+ case ESDHC_TUNE_CTRL_STATUS:
205
+ case ESDHC_UNDOCUMENTED_REG27:
206
+ case ESDHC_TUNING_CTRL:
207
+ case ESDHC_WTMK_LVL:
208
+ case ESDHC_VENDOR_SPEC:
209
+ break;
210
+
211
+ case SDHC_HOSTCTL:
212
+ /*
213
+ * Here's What ESDHCI has at offset 0x28 (SDHC_HOSTCTL)
214
+ *
215
+ * 7 6 5 4 3 2 1 0
216
+ * |-----------+--------+--------+-----------+----------+---------|
217
+ * | Card | Card | Endian | DATA3 | Data | Led |
218
+ * | Detect | Detect | Mode | as Card | Transfer | Control |
219
+ * | Signal | Test | | Detection | Width | |
220
+ * | Selection | Level | | Pin | | |
221
+ * |-----------+--------+--------+-----------+----------+---------|
222
+ *
223
+ * and 0x29
224
+ *
225
+ * 15 10 9 8
226
+ * |----------+------|
227
+ * | Reserved | DMA |
228
+ * | | Sel. |
229
+ * | | |
230
+ * |----------+------|
231
+ *
232
+ * and here's what SDCHI spec expects those offsets to be:
233
+ *
234
+ * 0x28 (Host Control Register)
235
+ *
236
+ * 7 6 5 4 3 2 1 0
237
+ * |--------+--------+----------+------+--------+----------+---------|
238
+ * | Card | Card | Extended | DMA | High | Data | LED |
239
+ * | Detect | Detect | Data | Sel. | Speed | Transfer | Control |
240
+ * | Signal | Test | Transfer | | Enable | Width | |
241
+ * | Sel. | Level | Width | | | | |
242
+ * |--------+--------+----------+------+--------+----------+---------|
243
+ *
244
+ * and 0x29 (Power Control Register)
245
+ *
246
+ * |----------------------------------|
247
+ * | Power Control Register |
248
+ * | |
249
+ * | Description omitted, |
250
+ * | since it has no analog in ESDHCI |
251
+ * | |
252
+ * |----------------------------------|
253
+ *
254
+ * Since offsets 0x2A and 0x2B should be compatible between
255
+ * both IP specs we only need to reconcile least 16-bit of the
256
+ * word we've been given.
257
+ */
258
+
259
+ /*
260
+ * First, save bits 7 6 and 0 since they are identical
261
+ */
262
+ hostctl = value & (SDHC_CTRL_LED |
263
+ SDHC_CTRL_CDTEST_INS |
264
+ SDHC_CTRL_CDTEST_EN);
265
+ /*
266
+ * Second, split "Data Transfer Width" from bits 2 and 1 in to
267
+ * bits 5 and 1
268
+ */
269
+ if (value & ESDHC_CTRL_8BITBUS) {
270
+ hostctl |= SDHC_CTRL_8BITBUS;
271
+ }
272
+
273
+ if (value & ESDHC_CTRL_4BITBUS) {
274
+ hostctl |= ESDHC_CTRL_4BITBUS;
275
+ }
276
+
277
+ /*
278
+ * Third, move DMA select from bits 9 and 8 to bits 4 and 3
279
+ */
280
+ hostctl |= SDHC_DMA_TYPE(value >> (8 - 3));
281
+
282
+ /*
283
+ * Now place the corrected value into low 16-bit of the value
284
+ * we are going to give standard SDHCI write function
285
+ *
286
+ * NOTE: This transformation should be the inverse of what can
287
+ * be found in drivers/mmc/host/sdhci-esdhc-imx.c in Linux
288
+ * kernel
289
+ */
290
+ value &= ~UINT16_MAX;
291
+ value |= hostctl;
292
+ value |= (uint16_t)s->pwrcon << 8;
293
+
294
+ sdhci_write(opaque, offset, value, size);
295
+ break;
296
+
297
+ case ESDHC_MIX_CTRL:
298
+ /*
299
+ * So, when SD/MMC stack in Linux tries to write to "Transfer
300
+ * Mode Register", ESDHC i.MX quirk code will translate it
301
+ * into a write to ESDHC_MIX_CTRL, so we do the opposite in
302
+ * order to get where we started
303
+ *
304
+ * Note that Auto CMD23 Enable bit is located in a wrong place
305
+ * on i.MX, but since it is not used by QEMU we do not care.
306
+ *
307
+ * We don't want to call sdhci_write(.., SDHC_TRNMOD, ...)
308
+ * here becuase it will result in a call to
309
+ * sdhci_send_command(s) which we don't want.
310
+ *
311
+ */
312
+ s->trnmod = value & UINT16_MAX;
313
+ break;
314
+ case SDHC_TRNMOD:
315
+ /*
316
+ * Similar to above, but this time a write to "Command
317
+ * Register" will be translated into a 4-byte write to
318
+ * "Transfer Mode register" where lower 16-bit of value would
319
+ * be set to zero. So what we do is fill those bits with
320
+ * cached value from s->trnmod and let the SDHCI
321
+ * infrastructure handle the rest
322
+ */
323
+ sdhci_write(opaque, offset, val | s->trnmod, size);
324
+ break;
325
+ case SDHC_BLKSIZE:
326
+ /*
327
+ * ESDHCI does not implement "Host SDMA Buffer Boundary", and
328
+ * Linux driver will try to zero this field out which will
329
+ * break the rest of SDHCI emulation.
330
+ *
331
+ * Linux defaults to maximum possible setting (512K boundary)
332
+ * and it seems to be the only option that i.MX IP implements,
333
+ * so we artificially set it to that value.
334
+ */
335
+ val |= 0x7 << 12;
336
+ /* FALLTHROUGH */
337
+ default:
338
+ sdhci_write(opaque, offset, val, size);
339
+ break;
340
+ }
341
+}
342
+
343
+
344
+static const MemoryRegionOps usdhc_mmio_ops = {
345
+ .read = usdhc_read,
346
+ .write = usdhc_write,
347
+ .valid = {
348
+ .min_access_size = 1,
349
+ .max_access_size = 4,
350
+ .unaligned = false
351
+ },
352
+ .endianness = DEVICE_LITTLE_ENDIAN,
353
+};
354
+
355
+static void imx_usdhc_init(Object *obj)
356
+{
357
+ SDHCIState *s = SYSBUS_SDHCI(obj);
358
+
359
+ s->io_ops = &usdhc_mmio_ops;
360
+ s->quirks = SDHCI_QUIRK_NO_BUSY_IRQ;
361
+}
362
+
363
+static const TypeInfo imx_usdhc_info = {
364
+ .name = TYPE_IMX_USDHC,
365
+ .parent = TYPE_SYSBUS_SDHCI,
366
+ .instance_init = imx_usdhc_init,
367
+};
368
+
369
static void sdhci_register_types(void)
370
{
371
type_register_static(&sdhci_pci_info);
372
type_register_static(&sdhci_sysbus_info);
373
type_register_static(&sdhci_bus_info);
374
+ type_register_static(&imx_usdhc_info);
375
}
376
377
type_init(sdhci_register_types)
378
--
44
--
379
2.16.1
45
2.20.1
380
46
381
47
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
The remaining text in docs/barrier.txt is user-facing description
2
of what the device is and how to use it. Move this into the
3
system manual and rstify it.
2
4
3
Add code to emulate SNVS IP-block. Currently only the bits needed to
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
be able to emulate machine shutdown are implemented.
6
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
7
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20210727204112.12579-4-peter.maydell@linaro.org
10
---
11
docs/barrier.txt | 48 -----------------------------------------
12
docs/system/barrier.rst | 44 +++++++++++++++++++++++++++++++++++++
13
docs/system/index.rst | 1 +
14
3 files changed, 45 insertions(+), 48 deletions(-)
15
delete mode 100644 docs/barrier.txt
16
create mode 100644 docs/system/barrier.rst
5
17
6
Cc: Peter Maydell <peter.maydell@linaro.org>
18
diff --git a/docs/barrier.txt b/docs/barrier.txt
7
Cc: Jason Wang <jasowang@redhat.com>
19
deleted file mode 100644
8
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
index XXXXXXX..XXXXXXX
9
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
21
--- a/docs/barrier.txt
10
Cc: Michael S. Tsirkin <mst@redhat.com>
22
+++ /dev/null
11
Cc: qemu-devel@nongnu.org
23
@@ -XXX,XX +XXX,XX @@
12
Cc: qemu-arm@nongnu.org
24
- QEMU Barrier Client
13
Cc: yurovsky@gmail.com
25
-
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
26
-
15
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
27
-* About
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
-
17
---
29
- Barrier is a KVM (Keyboard-Video-Mouse) software forked from Symless's
18
hw/misc/Makefile.objs | 1 +
30
- synergy 1.9 codebase.
19
include/hw/misc/imx7_snvs.h | 35 +++++++++++++++++++
31
-
20
hw/misc/imx7_snvs.c | 83 +++++++++++++++++++++++++++++++++++++++++++++
32
- See https://github.com/debauchee/barrier
21
3 files changed, 119 insertions(+)
33
-
22
create mode 100644 include/hw/misc/imx7_snvs.h
34
-* QEMU usage
23
create mode 100644 hw/misc/imx7_snvs.c
35
-
24
36
- Generally, mouse and keyboard are grabbed through the QEMU video
25
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
37
- interface emulation.
26
index XXXXXXX..XXXXXXX 100644
38
-
27
--- a/hw/misc/Makefile.objs
39
- But when we want to use a video graphic adapter via a PCI passthrough
28
+++ b/hw/misc/Makefile.objs
40
- there is no way to provide the keyboard and mouse inputs to the VM
29
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_IMX) += imx6_ccm.o
41
- except by plugging a second set of mouse and keyboard to the host
30
obj-$(CONFIG_IMX) += imx6_src.o
42
- or by installing a KVM software in the guest OS.
31
obj-$(CONFIG_IMX) += imx7_ccm.o
43
-
32
obj-$(CONFIG_IMX) += imx2_wdt.o
44
- The QEMU Barrier client avoids this by implementing directly the Barrier
33
+obj-$(CONFIG_IMX) += imx7_snvs.o
45
- protocol into QEMU.
34
obj-$(CONFIG_MILKYMIST) += milkymist-hpdmc.o
46
-
35
obj-$(CONFIG_MILKYMIST) += milkymist-pfpu.o
47
- This protocol is enabled by adding an input-barrier object to QEMU.
36
obj-$(CONFIG_MAINSTONE) += mst_fpga.o
48
-
37
diff --git a/include/hw/misc/imx7_snvs.h b/include/hw/misc/imx7_snvs.h
49
- Syntax: input-barrier,id=<object-id>,name=<guest display name>
50
- [,server=<barrier server address>][,port=<barrier server port>]
51
- [,x-origin=<x-origin>][,y-origin=<y-origin>]
52
- [,width=<width>][,height=<height>]
53
-
54
- The object can be added on the QEMU command line, for instance with:
55
-
56
- ... -object input-barrier,id=barrier0,name=VM-1 ...
57
-
58
- where VM-1 is the name the display configured int the Barrier server
59
- on the host providing the mouse and the keyboard events.
60
-
61
- by default <barrier server address> is "localhost", port is 24800,
62
- <x-origin> and <y-origin> are set to 0, <width> and <height> to
63
- 1920 and 1080.
64
-
65
- If Barrier server is stopped QEMU needs to be reconnected manually,
66
- by removing and re-adding the input-barrier object, for instance
67
- with the help of the HMP monitor:
68
-
69
- (qemu) object_del barrier0
70
- (qemu) object_add input-barrier,id=barrier0,name=VM-1
71
-
72
diff --git a/docs/system/barrier.rst b/docs/system/barrier.rst
38
new file mode 100644
73
new file mode 100644
39
index XXXXXXX..XXXXXXX
74
index XXXXXXX..XXXXXXX
40
--- /dev/null
75
--- /dev/null
41
+++ b/include/hw/misc/imx7_snvs.h
76
+++ b/docs/system/barrier.rst
42
@@ -XXX,XX +XXX,XX @@
77
@@ -XXX,XX +XXX,XX @@
43
+/*
78
+QEMU Barrier Client
44
+ * Copyright (c) 2017, Impinj, Inc.
79
+===================
45
+ *
46
+ * i.MX7 SNVS block emulation code
47
+ *
48
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
49
+ *
50
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
51
+ * See the COPYING file in the top-level directory.
52
+ */
53
+
80
+
54
+#ifndef IMX7_SNVS_H
81
+Generally, mouse and keyboard are grabbed through the QEMU video
55
+#define IMX7_SNVS_H
82
+interface emulation.
56
+
83
+
57
+#include "qemu/bitops.h"
84
+But when we want to use a video graphic adapter via a PCI passthrough
58
+#include "hw/sysbus.h"
85
+there is no way to provide the keyboard and mouse inputs to the VM
86
+except by plugging a second set of mouse and keyboard to the host
87
+or by installing a KVM software in the guest OS.
59
+
88
+
89
+The QEMU Barrier client avoids this by implementing directly the Barrier
90
+protocol into QEMU.
60
+
91
+
61
+enum IMX7SNVSRegisters {
92
+`Barrier <https://github.com/debauchee/barrier>`__
62
+ SNVS_LPCR = 0x38,
93
+is a KVM (Keyboard-Video-Mouse) software forked from Symless's
63
+ SNVS_LPCR_TOP = BIT(6),
94
+synergy 1.9 codebase.
64
+ SNVS_LPCR_DP_EN = BIT(5)
65
+};
66
+
95
+
67
+#define TYPE_IMX7_SNVS "imx7.snvs"
96
+This protocol is enabled by adding an input-barrier object to QEMU.
68
+#define IMX7_SNVS(obj) OBJECT_CHECK(IMX7SNVSState, (obj), TYPE_IMX7_SNVS)
69
+
97
+
70
+typedef struct IMX7SNVSState {
98
+Syntax::
71
+ /* <private> */
72
+ SysBusDevice parent_obj;
73
+
99
+
74
+ MemoryRegion mmio;
100
+ input-barrier,id=<object-id>,name=<guest display name>
75
+} IMX7SNVSState;
101
+ [,server=<barrier server address>][,port=<barrier server port>]
102
+ [,x-origin=<x-origin>][,y-origin=<y-origin>]
103
+ [,width=<width>][,height=<height>]
76
+
104
+
77
+#endif /* IMX7_SNVS_H */
105
+The object can be added on the QEMU command line, for instance with::
78
diff --git a/hw/misc/imx7_snvs.c b/hw/misc/imx7_snvs.c
79
new file mode 100644
80
index XXXXXXX..XXXXXXX
81
--- /dev/null
82
+++ b/hw/misc/imx7_snvs.c
83
@@ -XXX,XX +XXX,XX @@
84
+/*
85
+ * IMX7 Secure Non-Volatile Storage
86
+ *
87
+ * Copyright (c) 2018, Impinj, Inc.
88
+ *
89
+ * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
90
+ *
91
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
92
+ * See the COPYING file in the top-level directory.
93
+ *
94
+ * Bare minimum emulation code needed to support being able to shut
95
+ * down linux guest gracefully.
96
+ */
97
+
106
+
98
+#include "qemu/osdep.h"
107
+ -object input-barrier,id=barrier0,name=VM-1
99
+#include "hw/misc/imx7_snvs.h"
100
+#include "qemu/log.h"
101
+#include "sysemu/sysemu.h"
102
+
108
+
103
+static uint64_t imx7_snvs_read(void *opaque, hwaddr offset, unsigned size)
109
+where VM-1 is the name the display configured in the Barrier server
104
+{
110
+on the host providing the mouse and the keyboard events.
105
+ return 0;
106
+}
107
+
111
+
108
+static void imx7_snvs_write(void *opaque, hwaddr offset,
112
+by default ``<barrier server address>`` is ``localhost``,
109
+ uint64_t v, unsigned size)
113
+``<port>`` is ``24800``, ``<x-origin>`` and ``<y-origin>`` are set to ``0``,
110
+{
114
+``<width>`` and ``<height>`` to ``1920`` and ``1080``.
111
+ const uint32_t value = v;
112
+ const uint32_t mask = SNVS_LPCR_TOP | SNVS_LPCR_DP_EN;
113
+
115
+
114
+ if (offset == SNVS_LPCR && ((value & mask) == mask)) {
116
+If the Barrier server is stopped QEMU needs to be reconnected manually,
115
+ qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
117
+by removing and re-adding the input-barrier object, for instance
116
+ }
118
+with the help of the HMP monitor::
117
+}
118
+
119
+
119
+static const struct MemoryRegionOps imx7_snvs_ops = {
120
+ (qemu) object_del barrier0
120
+ .read = imx7_snvs_read,
121
+ (qemu) object_add input-barrier,id=barrier0,name=VM-1
121
+ .write = imx7_snvs_write,
122
diff --git a/docs/system/index.rst b/docs/system/index.rst
122
+ .endianness = DEVICE_NATIVE_ENDIAN,
123
index XXXXXXX..XXXXXXX 100644
123
+ .impl = {
124
--- a/docs/system/index.rst
124
+ /*
125
+++ b/docs/system/index.rst
125
+ * Our device would not work correctly if the guest was doing
126
@@ -XXX,XX +XXX,XX @@ or Hypervisor.Framework.
126
+ * unaligned access. This might not be a limitation on the real
127
linuxboot
127
+ * device but in practice there is no reason for a guest to access
128
generic-loader
128
+ * this device unaligned.
129
guest-loader
129
+ */
130
+ barrier
130
+ .min_access_size = 4,
131
vnc-security
131
+ .max_access_size = 4,
132
tls
132
+ .unaligned = false,
133
secrets
133
+ },
134
+};
135
+
136
+static void imx7_snvs_init(Object *obj)
137
+{
138
+ SysBusDevice *sd = SYS_BUS_DEVICE(obj);
139
+ IMX7SNVSState *s = IMX7_SNVS(obj);
140
+
141
+ memory_region_init_io(&s->mmio, obj, &imx7_snvs_ops, s,
142
+ TYPE_IMX7_SNVS, 0x1000);
143
+
144
+ sysbus_init_mmio(sd, &s->mmio);
145
+}
146
+
147
+static void imx7_snvs_class_init(ObjectClass *klass, void *data)
148
+{
149
+ DeviceClass *dc = DEVICE_CLASS(klass);
150
+
151
+ dc->desc = "i.MX7 Secure Non-Volatile Storage Module";
152
+}
153
+
154
+static const TypeInfo imx7_snvs_info = {
155
+ .name = TYPE_IMX7_SNVS,
156
+ .parent = TYPE_SYS_BUS_DEVICE,
157
+ .instance_size = sizeof(IMX7SNVSState),
158
+ .instance_init = imx7_snvs_init,
159
+ .class_init = imx7_snvs_class_init,
160
+};
161
+
162
+static void imx7_snvs_register_type(void)
163
+{
164
+ type_register_static(&imx7_snvs_info);
165
+}
166
+type_init(imx7_snvs_register_type)
167
--
134
--
168
2.16.1
135
2.20.1
169
136
170
137
diff view generated by jsdifflib
Deleted patch
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
2
1
3
Add minimal code needed to allow upstream Linux guest to boot.
4
5
Cc: Peter Maydell <peter.maydell@linaro.org>
6
Cc: Jason Wang <jasowang@redhat.com>
7
Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Cc: Marcel Apfelbaum <marcel.apfelbaum@zoho.com>
9
Cc: Michael S. Tsirkin <mst@redhat.com>
10
Cc: qemu-devel@nongnu.org
11
Cc: qemu-arm@nongnu.org
12
Cc: yurovsky@gmail.com
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
include/hw/timer/imx_gpt.h | 1 +
19
hw/timer/imx_gpt.c | 25 +++++++++++++++++++++++++
20
2 files changed, 26 insertions(+)
21
22
diff --git a/include/hw/timer/imx_gpt.h b/include/hw/timer/imx_gpt.h
23
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/timer/imx_gpt.h
25
+++ b/include/hw/timer/imx_gpt.h
26
@@ -XXX,XX +XXX,XX @@
27
#define TYPE_IMX25_GPT "imx25.gpt"
28
#define TYPE_IMX31_GPT "imx31.gpt"
29
#define TYPE_IMX6_GPT "imx6.gpt"
30
+#define TYPE_IMX7_GPT "imx7.gpt"
31
32
#define TYPE_IMX_GPT TYPE_IMX25_GPT
33
34
diff --git a/hw/timer/imx_gpt.c b/hw/timer/imx_gpt.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/timer/imx_gpt.c
37
+++ b/hw/timer/imx_gpt.c
38
@@ -XXX,XX +XXX,XX @@ static const IMXClk imx6_gpt_clocks[] = {
39
CLK_HIGH, /* 111 reference clock */
40
};
41
42
+static const IMXClk imx7_gpt_clocks[] = {
43
+ CLK_NONE, /* 000 No clock source */
44
+ CLK_IPG, /* 001 ipg_clk, 532MHz*/
45
+ CLK_IPG_HIGH, /* 010 ipg_clk_highfreq */
46
+ CLK_EXT, /* 011 External clock */
47
+ CLK_32k, /* 100 ipg_clk_32k */
48
+ CLK_HIGH, /* 101 reference clock */
49
+ CLK_NONE, /* 110 not defined */
50
+ CLK_NONE, /* 111 not defined */
51
+};
52
+
53
static void imx_gpt_set_freq(IMXGPTState *s)
54
{
55
uint32_t clksrc = extract32(s->cr, GPT_CR_CLKSRC_SHIFT, 3);
56
@@ -XXX,XX +XXX,XX @@ static void imx6_gpt_init(Object *obj)
57
s->clocks = imx6_gpt_clocks;
58
}
59
60
+static void imx7_gpt_init(Object *obj)
61
+{
62
+ IMXGPTState *s = IMX_GPT(obj);
63
+
64
+ s->clocks = imx7_gpt_clocks;
65
+}
66
+
67
static const TypeInfo imx25_gpt_info = {
68
.name = TYPE_IMX25_GPT,
69
.parent = TYPE_SYS_BUS_DEVICE,
70
@@ -XXX,XX +XXX,XX @@ static const TypeInfo imx6_gpt_info = {
71
.instance_init = imx6_gpt_init,
72
};
73
74
+static const TypeInfo imx7_gpt_info = {
75
+ .name = TYPE_IMX7_GPT,
76
+ .parent = TYPE_IMX25_GPT,
77
+ .instance_init = imx7_gpt_init,
78
+};
79
+
80
static void imx_gpt_register_types(void)
81
{
82
type_register_static(&imx25_gpt_info);
83
type_register_static(&imx31_gpt_info);
84
type_register_static(&imx6_gpt_info);
85
+ type_register_static(&imx7_gpt_info);
86
}
87
88
type_init(imx_gpt_register_types)
89
--
90
2.16.1
91
92
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Change vfp.regs as a uint64_t to vfp.zregs as an ARMVectorReg.
4
The previous patches have made the change in representation
5
relatively painless.
6
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Message-id: 20180123035349.24538-2-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/cpu.h | 59 +++++++++++++++++++++++++++++++---------------
14
target/arm/machine.c | 35 ++++++++++++++++++++++++++-
15
target/arm/translate-a64.c | 8 +++----
16
target/arm/translate.c | 7 +++---
17
4 files changed, 81 insertions(+), 28 deletions(-)
18
19
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/cpu.h
22
+++ b/target/arm/cpu.h
23
@@ -XXX,XX +XXX,XX @@ typedef struct {
24
uint32_t base_mask;
25
} TCR;
26
27
+/* Define a maximum sized vector register.
28
+ * For 32-bit, this is a 128-bit NEON/AdvSIMD register.
29
+ * For 64-bit, this is a 2048-bit SVE register.
30
+ *
31
+ * Note that the mapping between S, D, and Q views of the register bank
32
+ * differs between AArch64 and AArch32.
33
+ * In AArch32:
34
+ * Qn = regs[n].d[1]:regs[n].d[0]
35
+ * Dn = regs[n / 2].d[n & 1]
36
+ * Sn = regs[n / 4].d[n % 4 / 2],
37
+ * bits 31..0 for even n, and bits 63..32 for odd n
38
+ * (and regs[16] to regs[31] are inaccessible)
39
+ * In AArch64:
40
+ * Zn = regs[n].d[*]
41
+ * Qn = regs[n].d[1]:regs[n].d[0]
42
+ * Dn = regs[n].d[0]
43
+ * Sn = regs[n].d[0] bits 31..0
44
+ *
45
+ * This corresponds to the architecturally defined mapping between
46
+ * the two execution states, and means we do not need to explicitly
47
+ * map these registers when changing states.
48
+ *
49
+ * Align the data for use with TCG host vector operations.
50
+ */
51
+
52
+#ifdef TARGET_AARCH64
53
+# define ARM_MAX_VQ 16
54
+#else
55
+# define ARM_MAX_VQ 1
56
+#endif
57
+
58
+typedef struct ARMVectorReg {
59
+ uint64_t d[2 * ARM_MAX_VQ] QEMU_ALIGNED(16);
60
+} ARMVectorReg;
61
+
62
+
63
typedef struct CPUARMState {
64
/* Regs for current mode. */
65
uint32_t regs[16];
66
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
67
68
/* VFP coprocessor state. */
69
struct {
70
- /* VFP/Neon register state. Note that the mapping between S, D and Q
71
- * views of the register bank differs between AArch64 and AArch32:
72
- * In AArch32:
73
- * Qn = regs[2n+1]:regs[2n]
74
- * Dn = regs[n]
75
- * Sn = regs[n/2] bits 31..0 for even n, and bits 63..32 for odd n
76
- * (and regs[32] to regs[63] are inaccessible)
77
- * In AArch64:
78
- * Qn = regs[2n+1]:regs[2n]
79
- * Dn = regs[2n]
80
- * Sn = regs[2n] bits 31..0
81
- * This corresponds to the architecturally defined mapping between
82
- * the two execution states, and means we do not need to explicitly
83
- * map these registers when changing states.
84
- */
85
- uint64_t regs[64] QEMU_ALIGNED(16);
86
+ ARMVectorReg zregs[32];
87
88
uint32_t xregs[16];
89
/* We store these fpcsr fields separately for convenience. */
90
@@ -XXX,XX +XXX,XX @@ static inline void *arm_get_el_change_hook_opaque(ARMCPU *cpu)
91
*/
92
static inline uint64_t *aa32_vfp_dreg(CPUARMState *env, unsigned regno)
93
{
94
- return &env->vfp.regs[regno];
95
+ return &env->vfp.zregs[regno >> 1].d[regno & 1];
96
}
97
98
/**
99
@@ -XXX,XX +XXX,XX @@ static inline uint64_t *aa32_vfp_dreg(CPUARMState *env, unsigned regno)
100
*/
101
static inline uint64_t *aa32_vfp_qreg(CPUARMState *env, unsigned regno)
102
{
103
- return &env->vfp.regs[2 * regno];
104
+ return &env->vfp.zregs[regno].d[0];
105
}
106
107
/**
108
@@ -XXX,XX +XXX,XX @@ static inline uint64_t *aa32_vfp_qreg(CPUARMState *env, unsigned regno)
109
*/
110
static inline uint64_t *aa64_vfp_qreg(CPUARMState *env, unsigned regno)
111
{
112
- return &env->vfp.regs[2 * regno];
113
+ return &env->vfp.zregs[regno].d[0];
114
}
115
116
#endif
117
diff --git a/target/arm/machine.c b/target/arm/machine.c
118
index XXXXXXX..XXXXXXX 100644
119
--- a/target/arm/machine.c
120
+++ b/target/arm/machine.c
121
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_vfp = {
122
.minimum_version_id = 3,
123
.needed = vfp_needed,
124
.fields = (VMStateField[]) {
125
- VMSTATE_UINT64_ARRAY(env.vfp.regs, ARMCPU, 64),
126
+ /* For compatibility, store Qn out of Zn here. */
127
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[0].d, ARMCPU, 0, 2),
128
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[1].d, ARMCPU, 0, 2),
129
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[2].d, ARMCPU, 0, 2),
130
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[3].d, ARMCPU, 0, 2),
131
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[4].d, ARMCPU, 0, 2),
132
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[5].d, ARMCPU, 0, 2),
133
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[6].d, ARMCPU, 0, 2),
134
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[7].d, ARMCPU, 0, 2),
135
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[8].d, ARMCPU, 0, 2),
136
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[9].d, ARMCPU, 0, 2),
137
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[10].d, ARMCPU, 0, 2),
138
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[11].d, ARMCPU, 0, 2),
139
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[12].d, ARMCPU, 0, 2),
140
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[13].d, ARMCPU, 0, 2),
141
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[14].d, ARMCPU, 0, 2),
142
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[15].d, ARMCPU, 0, 2),
143
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[16].d, ARMCPU, 0, 2),
144
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[17].d, ARMCPU, 0, 2),
145
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[18].d, ARMCPU, 0, 2),
146
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[19].d, ARMCPU, 0, 2),
147
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[20].d, ARMCPU, 0, 2),
148
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[21].d, ARMCPU, 0, 2),
149
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[22].d, ARMCPU, 0, 2),
150
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[23].d, ARMCPU, 0, 2),
151
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[24].d, ARMCPU, 0, 2),
152
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[25].d, ARMCPU, 0, 2),
153
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[26].d, ARMCPU, 0, 2),
154
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[27].d, ARMCPU, 0, 2),
155
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[28].d, ARMCPU, 0, 2),
156
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[29].d, ARMCPU, 0, 2),
157
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[30].d, ARMCPU, 0, 2),
158
+ VMSTATE_UINT64_SUB_ARRAY(env.vfp.zregs[31].d, ARMCPU, 0, 2),
159
+
160
/* The xregs array is a little awkward because element 1 (FPSCR)
161
* requires a specific accessor, so we have to split it up in
162
* the vmstate:
163
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
164
index XXXXXXX..XXXXXXX 100644
165
--- a/target/arm/translate-a64.c
166
+++ b/target/arm/translate-a64.c
167
@@ -XXX,XX +XXX,XX @@ static inline int vec_reg_offset(DisasContext *s, int regno,
168
{
169
int offs = 0;
170
#ifdef HOST_WORDS_BIGENDIAN
171
- /* This is complicated slightly because vfp.regs[2n] is
172
- * still the low half and vfp.regs[2n+1] the high half
173
+ /* This is complicated slightly because vfp.zregs[n].d[0] is
174
+ * still the low half and vfp.zregs[n].d[1] the high half
175
* of the 128 bit vector, even on big endian systems.
176
* Calculate the offset assuming a fully bigendian 128 bits,
177
* then XOR to account for the order of the two 64 bit halves.
178
@@ -XXX,XX +XXX,XX @@ static inline int vec_reg_offset(DisasContext *s, int regno,
179
#else
180
offs += element * (1 << size);
181
#endif
182
- offs += offsetof(CPUARMState, vfp.regs[regno * 2]);
183
+ offs += offsetof(CPUARMState, vfp.zregs[regno]);
184
assert_fp_access_checked(s);
185
return offs;
186
}
187
@@ -XXX,XX +XXX,XX @@ static inline int vec_reg_offset(DisasContext *s, int regno,
188
static inline int vec_full_reg_offset(DisasContext *s, int regno)
189
{
190
assert_fp_access_checked(s);
191
- return offsetof(CPUARMState, vfp.regs[regno * 2]);
192
+ return offsetof(CPUARMState, vfp.zregs[regno]);
193
}
194
195
/* Return a newly allocated pointer to the vector register. */
196
diff --git a/target/arm/translate.c b/target/arm/translate.c
197
index XXXXXXX..XXXXXXX 100644
198
--- a/target/arm/translate.c
199
+++ b/target/arm/translate.c
200
@@ -XXX,XX +XXX,XX @@ static inline void gen_vfp_st(DisasContext *s, int dp, TCGv_i32 addr)
201
}
202
}
203
204
-static inline long
205
-vfp_reg_offset (int dp, int reg)
206
+static inline long vfp_reg_offset(bool dp, unsigned reg)
207
{
208
if (dp) {
209
- return offsetof(CPUARMState, vfp.regs[reg]);
210
+ return offsetof(CPUARMState, vfp.zregs[reg >> 1].d[reg & 1]);
211
} else {
212
- long ofs = offsetof(CPUARMState, vfp.regs[reg >> 1]);
213
+ long ofs = offsetof(CPUARMState, vfp.zregs[reg >> 2].d[(reg >> 1) & 1]);
214
if (reg & 1) {
215
ofs += offsetof(CPU_DoubleU, l.upper);
216
} else {
217
--
218
2.16.1
219
220
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Message-id: 20180123035349.24538-3-richard.henderson@linaro.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
target/arm/cpu.h | 12 ++++++++++++
10
1 file changed, 12 insertions(+)
11
12
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/cpu.h
15
+++ b/target/arm/cpu.h
16
@@ -XXX,XX +XXX,XX @@ typedef struct ARMVectorReg {
17
uint64_t d[2 * ARM_MAX_VQ] QEMU_ALIGNED(16);
18
} ARMVectorReg;
19
20
+/* In AArch32 mode, predicate registers do not exist at all. */
21
+#ifdef TARGET_AARCH64
22
+typedef struct ARMPredicateReg {
23
+ uint64_t p[2 * ARM_MAX_VQ / 8] QEMU_ALIGNED(16);
24
+} ARMPredicateReg;
25
+#endif
26
+
27
28
typedef struct CPUARMState {
29
/* Regs for current mode. */
30
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
31
struct {
32
ARMVectorReg zregs[32];
33
34
+#ifdef TARGET_AARCH64
35
+ /* Store FFR as pregs[16] to make it easier to treat as any other. */
36
+ ARMPredicateReg pregs[17];
37
+#endif
38
+
39
uint32_t xregs[16];
40
/* We store these fpcsr fields separately for convenience. */
41
int vec_len;
42
--
43
2.16.1
44
45
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Save the high parts of the Zregs and all of the Pregs.
4
The ZCR_ELx registers are migrated via the CP mechanism.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20180123035349.24538-4-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/machine.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++
13
1 file changed, 53 insertions(+)
14
15
diff --git a/target/arm/machine.c b/target/arm/machine.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/machine.c
18
+++ b/target/arm/machine.c
19
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_iwmmxt = {
20
}
21
};
22
23
+#ifdef TARGET_AARCH64
24
+/* The expression ARM_MAX_VQ - 2 is 0 for pure AArch32 build,
25
+ * and ARMPredicateReg is actively empty. This triggers errors
26
+ * in the expansion of the VMSTATE macros.
27
+ */
28
+
29
+static bool sve_needed(void *opaque)
30
+{
31
+ ARMCPU *cpu = opaque;
32
+ CPUARMState *env = &cpu->env;
33
+
34
+ return arm_feature(env, ARM_FEATURE_SVE);
35
+}
36
+
37
+/* The first two words of each Zreg is stored in VFP state. */
38
+static const VMStateDescription vmstate_zreg_hi_reg = {
39
+ .name = "cpu/sve/zreg_hi",
40
+ .version_id = 1,
41
+ .minimum_version_id = 1,
42
+ .fields = (VMStateField[]) {
43
+ VMSTATE_UINT64_SUB_ARRAY(d, ARMVectorReg, 2, ARM_MAX_VQ - 2),
44
+ VMSTATE_END_OF_LIST()
45
+ }
46
+};
47
+
48
+static const VMStateDescription vmstate_preg_reg = {
49
+ .name = "cpu/sve/preg",
50
+ .version_id = 1,
51
+ .minimum_version_id = 1,
52
+ .fields = (VMStateField[]) {
53
+ VMSTATE_UINT64_ARRAY(p, ARMPredicateReg, 2 * ARM_MAX_VQ / 8),
54
+ VMSTATE_END_OF_LIST()
55
+ }
56
+};
57
+
58
+static const VMStateDescription vmstate_sve = {
59
+ .name = "cpu/sve",
60
+ .version_id = 1,
61
+ .minimum_version_id = 1,
62
+ .needed = sve_needed,
63
+ .fields = (VMStateField[]) {
64
+ VMSTATE_STRUCT_ARRAY(env.vfp.zregs, ARMCPU, 32, 0,
65
+ vmstate_zreg_hi_reg, ARMVectorReg),
66
+ VMSTATE_STRUCT_ARRAY(env.vfp.pregs, ARMCPU, 17, 0,
67
+ vmstate_preg_reg, ARMPredicateReg),
68
+ VMSTATE_END_OF_LIST()
69
+ }
70
+};
71
+#endif /* AARCH64 */
72
+
73
static bool m_needed(void *opaque)
74
{
75
ARMCPU *cpu = opaque;
76
@@ -XXX,XX +XXX,XX @@ const VMStateDescription vmstate_arm_cpu = {
77
&vmstate_pmsav7,
78
&vmstate_pmsav8,
79
&vmstate_m_security,
80
+#ifdef TARGET_AARCH64
81
+ &vmstate_sve,
82
+#endif
83
NULL
84
}
85
};
86
--
87
2.16.1
88
89
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Define ZCR_EL[1-3].
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20180123035349.24538-5-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/cpu.h | 5 ++
11
target/arm/helper.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++
12
2 files changed, 136 insertions(+)
13
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.h
17
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
19
*/
20
float_status fp_status;
21
float_status standard_fp_status;
22
+
23
+ /* ZCR_EL[1-3] */
24
+ uint64_t zcr_el[4];
25
} vfp;
26
uint64_t exclusive_addr;
27
uint64_t exclusive_val;
28
@@ -XXX,XX +XXX,XX @@ void pmccntr_sync(CPUARMState *env);
29
#define CPTR_TCPAC (1U << 31)
30
#define CPTR_TTA (1U << 20)
31
#define CPTR_TFP (1U << 10)
32
+#define CPTR_TZ (1U << 8) /* CPTR_EL2 */
33
+#define CPTR_EZ (1U << 8) /* CPTR_EL3 */
34
35
#define MDCR_EPMAD (1U << 21)
36
#define MDCR_EDAD (1U << 20)
37
diff --git a/target/arm/helper.c b/target/arm/helper.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/helper.c
40
+++ b/target/arm/helper.c
41
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo debug_lpae_cp_reginfo[] = {
42
REGINFO_SENTINEL
43
};
44
45
+/* Return the exception level to which SVE-disabled exceptions should
46
+ * be taken, or 0 if SVE is enabled.
47
+ */
48
+static int sve_exception_el(CPUARMState *env)
49
+{
50
+#ifndef CONFIG_USER_ONLY
51
+ unsigned current_el = arm_current_el(env);
52
+
53
+ /* The CPACR.ZEN controls traps to EL1:
54
+ * 0, 2 : trap EL0 and EL1 accesses
55
+ * 1 : trap only EL0 accesses
56
+ * 3 : trap no accesses
57
+ */
58
+ switch (extract32(env->cp15.cpacr_el1, 16, 2)) {
59
+ default:
60
+ if (current_el <= 1) {
61
+ /* Trap to PL1, which might be EL1 or EL3 */
62
+ if (arm_is_secure(env) && !arm_el_is_aa64(env, 3)) {
63
+ return 3;
64
+ }
65
+ return 1;
66
+ }
67
+ break;
68
+ case 1:
69
+ if (current_el == 0) {
70
+ return 1;
71
+ }
72
+ break;
73
+ case 3:
74
+ break;
75
+ }
76
+
77
+ /* Similarly for CPACR.FPEN, after having checked ZEN. */
78
+ switch (extract32(env->cp15.cpacr_el1, 20, 2)) {
79
+ default:
80
+ if (current_el <= 1) {
81
+ if (arm_is_secure(env) && !arm_el_is_aa64(env, 3)) {
82
+ return 3;
83
+ }
84
+ return 1;
85
+ }
86
+ break;
87
+ case 1:
88
+ if (current_el == 0) {
89
+ return 1;
90
+ }
91
+ break;
92
+ case 3:
93
+ break;
94
+ }
95
+
96
+ /* CPTR_EL2. Check both TZ and TFP. */
97
+ if (current_el <= 2
98
+ && (env->cp15.cptr_el[2] & (CPTR_TFP | CPTR_TZ))
99
+ && !arm_is_secure_below_el3(env)) {
100
+ return 2;
101
+ }
102
+
103
+ /* CPTR_EL3. Check both EZ and TFP. */
104
+ if (!(env->cp15.cptr_el[3] & CPTR_EZ)
105
+ || (env->cp15.cptr_el[3] & CPTR_TFP)) {
106
+ return 3;
107
+ }
108
+#endif
109
+ return 0;
110
+}
111
+
112
+static CPAccessResult zcr_access(CPUARMState *env, const ARMCPRegInfo *ri,
113
+ bool isread)
114
+{
115
+ switch (sve_exception_el(env)) {
116
+ case 3:
117
+ return CP_ACCESS_TRAP_EL3;
118
+ case 2:
119
+ return CP_ACCESS_TRAP_EL2;
120
+ case 1:
121
+ return CP_ACCESS_TRAP;
122
+ }
123
+ return CP_ACCESS_OK;
124
+}
125
+
126
+static void zcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
127
+ uint64_t value)
128
+{
129
+ /* Bits other than [3:0] are RAZ/WI. */
130
+ raw_write(env, ri, value & 0xf);
131
+}
132
+
133
+static const ARMCPRegInfo zcr_el1_reginfo = {
134
+ .name = "ZCR_EL1", .state = ARM_CP_STATE_AA64,
135
+ .opc0 = 3, .opc1 = 0, .crn = 1, .crm = 2, .opc2 = 0,
136
+ .access = PL1_RW, .accessfn = zcr_access, .type = ARM_CP_64BIT,
137
+ .fieldoffset = offsetof(CPUARMState, vfp.zcr_el[1]),
138
+ .writefn = zcr_write, .raw_writefn = raw_write
139
+};
140
+
141
+static const ARMCPRegInfo zcr_el2_reginfo = {
142
+ .name = "ZCR_EL2", .state = ARM_CP_STATE_AA64,
143
+ .opc0 = 3, .opc1 = 4, .crn = 1, .crm = 2, .opc2 = 0,
144
+ .access = PL2_RW, .accessfn = zcr_access, .type = ARM_CP_64BIT,
145
+ .fieldoffset = offsetof(CPUARMState, vfp.zcr_el[2]),
146
+ .writefn = zcr_write, .raw_writefn = raw_write
147
+};
148
+
149
+static const ARMCPRegInfo zcr_no_el2_reginfo = {
150
+ .name = "ZCR_EL2", .state = ARM_CP_STATE_AA64,
151
+ .opc0 = 3, .opc1 = 4, .crn = 1, .crm = 2, .opc2 = 0,
152
+ .access = PL2_RW, .type = ARM_CP_64BIT,
153
+ .readfn = arm_cp_read_zero, .writefn = arm_cp_write_ignore
154
+};
155
+
156
+static const ARMCPRegInfo zcr_el3_reginfo = {
157
+ .name = "ZCR_EL3", .state = ARM_CP_STATE_AA64,
158
+ .opc0 = 3, .opc1 = 6, .crn = 1, .crm = 2, .opc2 = 0,
159
+ .access = PL3_RW, .accessfn = zcr_access, .type = ARM_CP_64BIT,
160
+ .fieldoffset = offsetof(CPUARMState, vfp.zcr_el[3]),
161
+ .writefn = zcr_write, .raw_writefn = raw_write
162
+};
163
+
164
void hw_watchpoint_update(ARMCPU *cpu, int n)
165
{
166
CPUARMState *env = &cpu->env;
167
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
168
}
169
define_one_arm_cp_reg(cpu, &sctlr);
170
}
171
+
172
+ if (arm_feature(env, ARM_FEATURE_SVE)) {
173
+ define_one_arm_cp_reg(cpu, &zcr_el1_reginfo);
174
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
175
+ define_one_arm_cp_reg(cpu, &zcr_el2_reginfo);
176
+ } else {
177
+ define_one_arm_cp_reg(cpu, &zcr_no_el2_reginfo);
178
+ }
179
+ if (arm_feature(env, ARM_FEATURE_EL3)) {
180
+ define_one_arm_cp_reg(cpu, &zcr_el3_reginfo);
181
+ }
182
+ }
183
}
184
185
void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
186
--
187
2.16.1
188
189
diff view generated by jsdifflib