1
A random mix of items here, nothing very major.
1
Big pullreq this week, since it's got RTH's PAN/UAO/ATS1E1
2
implementation in it, and also Philippe's raspi board model
3
cleanup patchset, as well as a scattering of smaller stuff.
2
4
3
thanks
4
-- PMM
5
-- PMM
5
6
6
7
7
The following changes since commit d0dff238a87fa81393ed72754d4dc8b09e50b08b:
8
The following changes since commit 7ce9ce89930ce260af839fb3e3e5f9101f5c69a0:
8
9
9
Merge remote-tracking branch 'remotes/juanquintela/tags/migration/20170206' into staging (2017-02-07 15:29:26 +0000)
10
Merge remote-tracking branch 'remotes/kraxel/tags/ui-20200212-pull-request' into staging (2020-02-13 11:06:32 +0000)
10
11
11
are available in the git repository at:
12
are available in the Git repository at:
12
13
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20170207
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200213
14
15
15
for you to fetch changes up to 7727b832886fafbdec7299eb7773dc9071bf4cdd:
16
for you to fetch changes up to dc7a88d0810ad272bdcd2e0869359af78fdd9114:
16
17
17
stellaris: Use the 'unimplemented' device for parts we don't implement (2017-02-07 18:30:00 +0000)
18
target/arm: Implement ARMv8.1-VMID16 extension (2020-02-13 14:30:51 +0000)
18
19
19
----------------------------------------------------------------
20
----------------------------------------------------------------
20
target-arm:
21
target-arm queue:
21
* new "unimplemented" device for stubbing out devices in a
22
* i.MX: Fix inverted sense of register bits in watchdog timer
22
system model so accesses can be logged
23
* i.MX: Add support for WDT on i.MX6
23
* stellaris: document the SoC memory map
24
* arm/virt: cleanups to ACPI tables
24
* arm: create instruction syndromes for AArch32 data aborts
25
* Implement ARMv8.1-VMID16 extension
25
* arm: Correctly handle watchpoints for BE32 CPUs
26
* Implement ARMv8.1-PAN
26
* Fix Thumb-1 BE32 execution and disassembly
27
* Implement ARMv8.2-UAO
27
* arm: Add cfgend parameter for ARM CPU selection
28
* Implement ARMv8.2-ATS1E1
28
* sd: sdhci: check data length during dma_memory_read
29
* ast2400/2500/2600: Wire up EHCI controllers
29
* aspeed: add a watchdog controller
30
* hw/char/exynos4210_uart: Fix memleaks in exynos4210_uart_init
30
* integratorcp: adding vmstate for save/restore
31
* hw/arm/raspi: Clean up the board code
31
32
32
----------------------------------------------------------------
33
----------------------------------------------------------------
33
Cédric Le Goater (2):
34
Chen Qun (1):
34
wdt: Add Aspeed watchdog device model
35
hw/char/exynos4210_uart: Fix memleaks in exynos4210_uart_init
35
aspeed: add a watchdog controller
36
36
37
Julian Brown (4):
37
Guenter Roeck (2):
38
hw/arm/integratorcp: Support specifying features via -cpu
38
hw/arm: ast2400/ast2500: Wire up EHCI controllers
39
target/arm: Add cfgend parameter for ARM CPU selection.
39
hw/arm: ast2600: Wire up EHCI controllers
40
Fix Thumb-1 BE32 execution and disassembly.
41
arm: Correctly handle watchpoints for BE32 CPUs
42
40
43
Pavel Dovgalyuk (1):
41
Heyi Guo (7):
44
integratorcp: adding vmstate for save/restore
42
bios-tables-test: prepare to change ARM virt ACPI DSDT
43
arm/virt/acpi: remove meaningless sub device "RP0" from PCI0
44
arm/virt/acpi: remove _ADR from devices identified by _HID
45
arm/acpi: fix PCI _PRT definition
46
arm/acpi: fix duplicated _UID of PCI interrupt link devices
47
arm/acpi: simplify the description of PCI _CRS
48
virt/acpi: update golden masters for DSDT update
45
49
46
Peter Maydell (5):
50
Peter Maydell (1):
47
target/arm: Abstract out pbit/wbit tests in ARM ldr/str decode
51
target/arm: Implement ARMv8.1-VMID16 extension
48
target/arm: A32, T32: Create Instruction Syndromes for Data Aborts
49
stellaris: Document memory map and which SoC devices are unimplemented
50
hw/misc: New "unimplemented" sysbus device
51
stellaris: Use the 'unimplemented' device for parts we don't implement
52
52
53
Prasad J Pandit (1):
53
Philippe Mathieu-Daudé (13):
54
sd: sdhci: check data length during dma_memory_read
54
hw/arm/raspi: Use BCM2708 machine type with pre Device Tree kernels
55
hw/arm/raspi: Correct the board descriptions
56
hw/arm/raspi: Extract the version from the board revision
57
hw/arm/raspi: Extract the RAM size from the board revision
58
hw/arm/raspi: Extract the processor type from the board revision
59
hw/arm/raspi: Trivial code movement
60
hw/arm/raspi: Make machines children of abstract RaspiMachineClass
61
hw/arm/raspi: Make board_rev a field of RaspiMachineClass
62
hw/arm/raspi: Let class_init() directly call raspi_machine_init()
63
hw/arm/raspi: Set default RAM size to size encoded in board revision
64
hw/arm/raspi: Extract the board model from the board revision
65
hw/arm/raspi: Use a unique raspi_machine_class_init() method
66
hw/arm/raspi: Extract the cores count from the board revision
55
67
56
hw/misc/Makefile.objs | 2 +
68
Richard Henderson (20):
57
hw/watchdog/Makefile.objs | 1 +
69
target/arm: Add arm_mmu_idx_is_stage1_of_2
58
include/disas/bfd.h | 7 ++
70
target/arm: Add mmu_idx for EL1 and EL2 w/ PAN enabled
59
include/hw/arm/aspeed_soc.h | 2 +
71
target/arm: Add isar_feature tests for PAN + ATS1E1
60
include/hw/misc/unimp.h | 39 +++++++
72
target/arm: Move LOR regdefs to file scope
61
include/hw/watchdog/wdt_aspeed.h | 32 ++++++
73
target/arm: Split out aarch32_cpsr_valid_mask
62
include/qom/cpu.h | 3 +
74
target/arm: Mask CPSR_J when Jazelle is not enabled
63
target/arm/arm_ldst.h | 10 +-
75
target/arm: Replace CPSR_ERET_MASK with aarch32_cpsr_valid_mask
64
target/arm/cpu.h | 7 ++
76
target/arm: Use aarch32_cpsr_valid_mask in helper_exception_return
65
target/arm/internals.h | 5 +
77
target/arm: Remove CPSR_RESERVED
66
target/arm/translate.h | 14 +++
78
target/arm: Introduce aarch64_pstate_valid_mask
67
disas.c | 1 +
79
target/arm: Update MSR access for PAN
68
exec.c | 1 +
80
target/arm: Update arm_mmu_idx_el for PAN
69
hw/arm/aspeed_soc.c | 13 +++
81
target/arm: Enforce PAN semantics in get_S1prot
70
hw/arm/integratorcp.c | 78 +++++++++++++-
82
target/arm: Set PAN bit as required on exception entry
71
hw/arm/stellaris.c | 48 +++++++++
83
target/arm: Implement ATS1E1 system registers
72
hw/misc/unimp.c | 107 +++++++++++++++++++
84
target/arm: Enable ARMv8.2-ATS1E1 in -cpu max
73
hw/sd/sdhci.c | 2 +-
85
target/arm: Add ID_AA64MMFR2_EL1
74
hw/watchdog/wdt_aspeed.c | 225 +++++++++++++++++++++++++++++++++++++++
86
target/arm: Update MSR access to UAO
75
qom/cpu.c | 6 ++
87
target/arm: Implement UAO semantics
76
target/arm/cpu.c | 39 +++++++
88
target/arm: Enable ARMv8.2-UAO in -cpu max
77
target/arm/op_helper.c | 22 ++++
78
target/arm/translate-a64.c | 14 ---
79
target/arm/translate.c | 193 ++++++++++++++++++++++++---------
80
24 files changed, 801 insertions(+), 70 deletions(-)
81
create mode 100644 include/hw/misc/unimp.h
82
create mode 100644 include/hw/watchdog/wdt_aspeed.h
83
create mode 100644 hw/misc/unimp.c
84
create mode 100644 hw/watchdog/wdt_aspeed.c
85
89
90
Roman Kapl (2):
91
i.MX: Fix inverted register bits in wdt code.
92
i.MX: Add support for WDT on i.MX6
93
94
include/hw/arm/aspeed_soc.h | 6 +
95
include/hw/arm/fsl-imx6.h | 3 +
96
target/arm/cpu-param.h | 2 +-
97
target/arm/cpu.h | 95 ++++++++---
98
target/arm/internals.h | 85 ++++++++++
99
hw/arm/aspeed_ast2600.c | 23 +++
100
hw/arm/aspeed_soc.c | 25 +++
101
hw/arm/fsl-imx6.c | 21 +++
102
hw/arm/raspi.c | 190 ++++++++++++++++------
103
hw/arm/virt-acpi-build.c | 25 +--
104
hw/char/exynos4210_uart.c | 5 +-
105
hw/misc/imx2_wdt.c | 2 +-
106
target/arm/cpu.c | 4 +
107
target/arm/cpu64.c | 10 ++
108
target/arm/helper-a64.c | 6 +-
109
target/arm/helper.c | 327 +++++++++++++++++++++++++++++---------
110
target/arm/kvm64.c | 2 +
111
target/arm/op_helper.c | 14 +-
112
target/arm/translate-a64.c | 31 ++++
113
target/arm/translate.c | 42 +++--
114
tests/data/acpi/virt/DSDT | Bin 18462 -> 5307 bytes
115
tests/data/acpi/virt/DSDT.memhp | Bin 19799 -> 6644 bytes
116
tests/data/acpi/virt/DSDT.numamem | Bin 18462 -> 5307 bytes
117
23 files changed, 731 insertions(+), 187 deletions(-)
118
diff view generated by jsdifflib
New patch
1
From: Roman Kapl <rka@sysgo.com>
1
2
3
Documentation says for WDA '0: Assert WDOG output.' and for SRS
4
'0: Assert system reset signal.'.
5
6
Signed-off-by: Roman Kapl <rka@sysgo.com>
7
Message-id: 20200207095409.11227-1-rka@sysgo.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/misc/imx2_wdt.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/hw/misc/imx2_wdt.c b/hw/misc/imx2_wdt.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/misc/imx2_wdt.c
17
+++ b/hw/misc/imx2_wdt.c
18
@@ -XXX,XX +XXX,XX @@ static void imx2_wdt_write(void *opaque, hwaddr addr,
19
uint64_t value, unsigned int size)
20
{
21
if (addr == IMX2_WDT_WCR &&
22
- (value & (IMX2_WDT_WCR_WDA | IMX2_WDT_WCR_SRS))) {
23
+ (~value & (IMX2_WDT_WCR_WDA | IMX2_WDT_WCR_SRS))) {
24
watchdog_perform_action();
25
}
26
}
27
--
28
2.20.1
29
30
diff view generated by jsdifflib
New patch
1
From: Roman Kapl <rka@sysgo.com>
1
2
3
Uses the i.MX2 rudimentary watchdog driver.
4
5
Signed-off-by: Roman Kapl <rka@sysgo.com>
6
Message-id: 20200207095529.11309-1-rka@sysgo.com
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
[PMM: removed accidental duplicate #include line]
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/arm/fsl-imx6.h | 3 +++
12
hw/arm/fsl-imx6.c | 21 +++++++++++++++++++++
13
2 files changed, 24 insertions(+)
14
15
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/fsl-imx6.h
18
+++ b/include/hw/arm/fsl-imx6.h
19
@@ -XXX,XX +XXX,XX @@
20
#include "hw/cpu/a9mpcore.h"
21
#include "hw/misc/imx6_ccm.h"
22
#include "hw/misc/imx6_src.h"
23
+#include "hw/misc/imx2_wdt.h"
24
#include "hw/char/imx_serial.h"
25
#include "hw/timer/imx_gpt.h"
26
#include "hw/timer/imx_epit.h"
27
@@ -XXX,XX +XXX,XX @@
28
#define FSL_IMX6_NUM_GPIOS 7
29
#define FSL_IMX6_NUM_ESDHCS 4
30
#define FSL_IMX6_NUM_ECSPIS 5
31
+#define FSL_IMX6_NUM_WDTS 2
32
33
typedef struct FslIMX6State {
34
/*< private >*/
35
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
36
IMXGPIOState gpio[FSL_IMX6_NUM_GPIOS];
37
SDHCIState esdhc[FSL_IMX6_NUM_ESDHCS];
38
IMXSPIState spi[FSL_IMX6_NUM_ECSPIS];
39
+ IMX2WdtState wdt[FSL_IMX6_NUM_WDTS];
40
IMXFECState eth;
41
MemoryRegion rom;
42
MemoryRegion caam;
43
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/arm/fsl-imx6.c
46
+++ b/hw/arm/fsl-imx6.c
47
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_init(Object *obj)
48
sysbus_init_child_obj(obj, name, &s->spi[i], sizeof(s->spi[i]),
49
TYPE_IMX_SPI);
50
}
51
+ for (i = 0; i < FSL_IMX6_NUM_WDTS; i++) {
52
+ snprintf(name, NAME_SIZE, "wdt%d", i);
53
+ sysbus_init_child_obj(obj, name, &s->wdt[i], sizeof(s->wdt[i]),
54
+ TYPE_IMX2_WDT);
55
+ }
56
+
57
58
sysbus_init_child_obj(obj, "eth", &s->eth, sizeof(s->eth), TYPE_IMX_ENET);
59
}
60
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
61
qdev_get_gpio_in(DEVICE(&s->a9mpcore),
62
FSL_IMX6_ENET_MAC_1588_IRQ));
63
64
+ /*
65
+ * Watchdog
66
+ */
67
+ for (i = 0; i < FSL_IMX6_NUM_WDTS; i++) {
68
+ static const hwaddr FSL_IMX6_WDOGn_ADDR[FSL_IMX6_NUM_WDTS] = {
69
+ FSL_IMX6_WDOG1_ADDR,
70
+ FSL_IMX6_WDOG2_ADDR,
71
+ };
72
+
73
+ object_property_set_bool(OBJECT(&s->wdt[i]), true, "realized",
74
+ &error_abort);
75
+
76
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, FSL_IMX6_WDOGn_ADDR[i]);
77
+ }
78
+
79
/* ROM memory */
80
memory_region_init_rom(&s->rom, NULL, "imx6.rom",
81
FSL_IMX6_ROM_SIZE, &err);
82
--
83
2.20.1
84
85
diff view generated by jsdifflib
New patch
1
From: Heyi Guo <guoheyi@huawei.com>
1
2
3
We are going to change ARM virt ACPI DSDT table, which will cause make
4
check to fail, so temporarily add related golden masters to ignore
5
list.
6
7
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
8
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
9
Message-id: 20200204014325.16279-2-guoheyi@huawei.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
13
1 file changed, 3 insertions(+)
14
15
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/qtest/bios-tables-test-allowed-diff.h
18
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
19
@@ -1 +1,4 @@
20
/* List of comma-separated changed AML files to ignore */
21
+"tests/data/acpi/virt/DSDT",
22
+"tests/data/acpi/virt/DSDT.memhp",
23
+"tests/data/acpi/virt/DSDT.numamem",
24
--
25
2.20.1
26
27
diff view generated by jsdifflib
New patch
1
From: Heyi Guo <guoheyi@huawei.com>
1
2
3
The sub device "RP0" under PCI0 in ACPI/DSDT does not contain any
4
method or property other than "_ADR", so it is safe to remove it.
5
6
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
7
Acked-by: "Michael S. Tsirkin" <mst@redhat.com>
8
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
9
Message-id: 20200204014325.16279-3-guoheyi@huawei.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/virt-acpi-build.c | 4 ----
13
1 file changed, 4 deletions(-)
14
15
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/virt-acpi-build.c
18
+++ b/hw/arm/virt-acpi-build.c
19
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
20
aml_append(method, aml_return(buf));
21
aml_append(dev, method);
22
23
- Aml *dev_rp0 = aml_device("%s", "RP0");
24
- aml_append(dev_rp0, aml_name_decl("_ADR", aml_int(0)));
25
- aml_append(dev, dev_rp0);
26
-
27
Aml *dev_res0 = aml_device("%s", "RES0");
28
aml_append(dev_res0, aml_name_decl("_HID", aml_string("PNP0C02")));
29
crs = aml_resource_template();
30
--
31
2.20.1
32
33
diff view generated by jsdifflib
New patch
1
From: Heyi Guo <guoheyi@huawei.com>
1
2
3
According to ACPI spec, _ADR should be used for device on a bus that
4
has a standard enumeration algorithm, but not for device which is on
5
system bus and must be enumerated by OSPM. And it is not recommended
6
to contain both _HID and _ADR in a single device.
7
8
See ACPI 6.3, section 6.1, top of page 343:
9
10
A device object must contain either an _HID object or an _ADR object,
11
but should not contain both.
12
13
(https://uefi.org/sites/default/files/resources/ACPI_6_3_May16.pdf)
14
15
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
16
Acked-by: Igor Mammedov <imammedo@redhat.com>
17
Acked-by: Michael S. Tsirkin <mst@redhat.com>
18
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
19
Message-id: 20200204014325.16279-4-guoheyi@huawei.com
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
22
hw/arm/virt-acpi-build.c | 8 --------
23
1 file changed, 8 deletions(-)
24
25
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/arm/virt-acpi-build.c
28
+++ b/hw/arm/virt-acpi-build.c
29
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_uart(Aml *scope, const MemMapEntry *uart_memmap,
30
AML_EXCLUSIVE, &uart_irq, 1));
31
aml_append(dev, aml_name_decl("_CRS", crs));
32
33
- /* The _ADR entry is used to link this device to the UART described
34
- * in the SPCR table, i.e. SPCR.base_address.address == _ADR.
35
- */
36
- aml_append(dev, aml_name_decl("_ADR", aml_int(uart_memmap->base)));
37
-
38
aml_append(scope, dev);
39
}
40
41
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
42
aml_append(dev, aml_name_decl("_CID", aml_string("PNP0A03")));
43
aml_append(dev, aml_name_decl("_SEG", aml_int(0)));
44
aml_append(dev, aml_name_decl("_BBN", aml_int(0)));
45
- aml_append(dev, aml_name_decl("_ADR", aml_int(0)));
46
aml_append(dev, aml_name_decl("_UID", aml_string("PCI0")));
47
aml_append(dev, aml_name_decl("_STR", aml_unicode("PCIe 0 Device")));
48
aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
49
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_gpio(Aml *scope, const MemMapEntry *gpio_memmap,
50
{
51
Aml *dev = aml_device("GPO0");
52
aml_append(dev, aml_name_decl("_HID", aml_string("ARMH0061")));
53
- aml_append(dev, aml_name_decl("_ADR", aml_int(0)));
54
aml_append(dev, aml_name_decl("_UID", aml_int(0)));
55
56
Aml *crs = aml_resource_template();
57
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_power_button(Aml *scope)
58
{
59
Aml *dev = aml_device(ACPI_POWER_BUTTON_DEVICE);
60
aml_append(dev, aml_name_decl("_HID", aml_string("PNP0C0C")));
61
- aml_append(dev, aml_name_decl("_ADR", aml_int(0)));
62
aml_append(dev, aml_name_decl("_UID", aml_int(0)));
63
aml_append(scope, dev);
64
}
65
--
66
2.20.1
67
68
diff view generated by jsdifflib
New patch
1
From: Heyi Guo <guoheyi@huawei.com>
1
2
3
The address field in each _PRT mapping package should be constructed
4
with high word for device# and low word for function#, so it is wrong
5
to use bus_no as the high word. The existing code adds a bunch useless
6
entries with device #s above 31. Enumerate all possible slots
7
(i.e. PCI_SLOT_MAX) instead.
8
9
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
10
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
11
Message-id: 20200204014325.16279-5-guoheyi@huawei.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/virt-acpi-build.c | 10 +++++-----
15
1 file changed, 5 insertions(+), 5 deletions(-)
16
17
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/virt-acpi-build.c
20
+++ b/hw/arm/virt-acpi-build.c
21
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
22
{
23
int ecam_id = VIRT_ECAM_ID(highmem_ecam);
24
Aml *method, *crs, *ifctx, *UUID, *ifctx1, *elsectx, *buf;
25
- int i, bus_no;
26
+ int i, slot_no;
27
hwaddr base_mmio = memmap[VIRT_PCIE_MMIO].base;
28
hwaddr size_mmio = memmap[VIRT_PCIE_MMIO].size;
29
hwaddr base_pio = memmap[VIRT_PCIE_PIO].base;
30
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
31
aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
32
33
/* Declare the PCI Routing Table. */
34
- Aml *rt_pkg = aml_varpackage(nr_pcie_buses * PCI_NUM_PINS);
35
- for (bus_no = 0; bus_no < nr_pcie_buses; bus_no++) {
36
+ Aml *rt_pkg = aml_varpackage(PCI_SLOT_MAX * PCI_NUM_PINS);
37
+ for (slot_no = 0; slot_no < PCI_SLOT_MAX; slot_no++) {
38
for (i = 0; i < PCI_NUM_PINS; i++) {
39
- int gsi = (i + bus_no) % PCI_NUM_PINS;
40
+ int gsi = (i + slot_no) % PCI_NUM_PINS;
41
Aml *pkg = aml_package(4);
42
- aml_append(pkg, aml_int((bus_no << 16) | 0xFFFF));
43
+ aml_append(pkg, aml_int((slot_no << 16) | 0xFFFF));
44
aml_append(pkg, aml_int(i));
45
aml_append(pkg, aml_name("GSI%d", gsi));
46
aml_append(pkg, aml_int(0));
47
--
48
2.20.1
49
50
diff view generated by jsdifflib
1
From: Prasad J Pandit <pjp@fedoraproject.org>
1
From: Heyi Guo <guoheyi@huawei.com>
2
2
3
While doing multi block SDMA transfer in routine
3
Using _UID of 0 for all PCI interrupt link devices absolutely violates
4
'sdhci_sdma_transfer_multi_blocks', the 's->fifo_buffer' starting
4
the spec. Simply increase one by one.
5
index 'begin' and data length 's->data_count' could end up to be same.
6
This could lead to an OOB access issue. Correct transfer data length
7
to avoid it.
8
5
9
Cc: qemu-stable@nongnu.org
6
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
10
Reported-by: Jiang Xin <jiangxin1@huawei.com>
7
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
11
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
8
Message-id: 20200204014325.16279-6-guoheyi@huawei.com
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Message-id: 20170130064736.9236-1-ppandit@redhat.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
10
---
16
hw/sd/sdhci.c | 2 +-
11
hw/arm/virt-acpi-build.c | 2 +-
17
1 file changed, 1 insertion(+), 1 deletion(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
18
13
19
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
14
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/sd/sdhci.c
16
--- a/hw/arm/virt-acpi-build.c
22
+++ b/hw/sd/sdhci.c
17
+++ b/hw/arm/virt-acpi-build.c
23
@@ -XXX,XX +XXX,XX @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
18
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
24
boundary_count -= block_size - begin;
19
uint32_t irqs = irq + i;
25
}
20
Aml *dev_gsi = aml_device("GSI%d", i);
26
dma_memory_read(&address_space_memory, s->sdmasysad,
21
aml_append(dev_gsi, aml_name_decl("_HID", aml_string("PNP0C0F")));
27
- &s->fifo_buffer[begin], s->data_count);
22
- aml_append(dev_gsi, aml_name_decl("_UID", aml_int(0)));
28
+ &s->fifo_buffer[begin], s->data_count - begin);
23
+ aml_append(dev_gsi, aml_name_decl("_UID", aml_int(i)));
29
s->sdmasysad += s->data_count - begin;
24
crs = aml_resource_template();
30
if (s->data_count == block_size) {
25
aml_append(crs,
31
for (n = 0; n < block_size; n++) {
26
aml_interrupt(AML_CONSUMER, AML_LEVEL, AML_ACTIVE_HIGH,
32
--
27
--
33
2.7.4
28
2.20.1
34
29
35
30
diff view generated by jsdifflib
New patch
1
From: Heyi Guo <guoheyi@huawei.com>
1
2
3
The original code defines a named object for the resource template but
4
then returns the resource template object itself; the resulted output
5
is like below:
6
7
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
8
{
9
Name (RBUF, ResourceTemplate ()
10
{
11
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
12
0x0000, // Granularity
13
0x0000, // Range Minimum
14
0x00FF, // Range Maximum
15
0x0000, // Translation Offset
16
0x0100, // Length
17
,, )
18
......
19
})
20
Return (ResourceTemplate ()
21
{
22
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
23
0x0000, // Granularity
24
0x0000, // Range Minimum
25
0x00FF, // Range Maximum
26
0x0000, // Translation Offset
27
0x0100, // Length
28
,, )
29
......
30
})
31
}
32
33
So the named object "RBUF" is actually useless. The more natural way
34
is to return RBUF instead, or simply drop RBUF definition.
35
36
Choose the latter one to simplify the code.
37
38
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
39
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
40
Message-id: 20200204014325.16279-7-guoheyi@huawei.com
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
42
---
43
hw/arm/virt-acpi-build.c | 1 -
44
1 file changed, 1 deletion(-)
45
46
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/virt-acpi-build.c
49
+++ b/hw/arm/virt-acpi-build.c
50
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
51
size_mmio_high));
52
}
53
54
- aml_append(method, aml_name_decl("RBUF", rbuf));
55
aml_append(method, aml_return(rbuf));
56
aml_append(dev, method);
57
58
--
59
2.20.1
60
61
diff view generated by jsdifflib
New patch
1
1
From: Heyi Guo <guoheyi@huawei.com>
2
3
Differences between disassembled ASL files:
4
5
@@ -XXX,XX +XXX,XX @@
6
*
7
* Disassembling to symbolic ASL+ operators
8
*
9
- * Disassembly of DSDT, Thu Jan 23 16:00:04 2020
10
+ * Disassembly of DSDT.new, Thu Jan 23 16:47:12 2020
11
*
12
* Original Table Header:
13
* Signature "DSDT"
14
- * Length 0x0000481E (18462)
15
+ * Length 0x000014BB (5307)
16
* Revision 0x02
17
- * Checksum 0x60
18
+ * Checksum 0xD1
19
* OEM ID "BOCHS "
20
* OEM Table ID "BXPCDSDT"
21
* OEM Revision 0x00000001 (1)
22
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
23
0x00000021,
24
}
25
})
26
- Name (_ADR, 0x09000000) // _ADR: Address
27
}
28
29
Device (FLS0)
30
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
31
Name (_CID, "PNP0A03" /* PCI Bus */) // _CID: Compatible ID
32
Name (_SEG, Zero) // _SEG: PCI Segment
33
Name (_BBN, Zero) // _BBN: BIOS Bus Number
34
- Name (_ADR, Zero) // _ADR: Address
35
Name (_UID, "PCI0") // _UID: Unique ID
36
Name (_STR, Unicode ("PCIe 0 Device")) // _STR: Description String
37
Name (_CCA, One) // _CCA: Cache Coherency Attribute
38
- Name (_PRT, Package (0x0400) // _PRT: PCI Routing Table
39
+ Name (_PRT, Package (0x80) // _PRT: PCI Routing Table
40
{
41
Package (0x04)
42
{
43
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
44
0x03,
45
GSI2,
46
Zero
47
- },
48
-
49
- Package (0x04)
50
- {
51
- 0x0020FFFF,
52
- Zero,
53
- GSI0,
54
- Zero
55
- },
56
-
57
- *Omit the other (4 * (256 - 32) - 2) packages*
58
-
59
- Package (0x04)
60
- {
61
- 0x00FFFFFF,
62
- 0x03,
63
- GSI2,
64
- Zero
65
}
66
})
67
Device (GSI0)
68
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
69
Device (GSI1)
70
{
71
Name (_HID, "PNP0C0F" /* PCI Interrupt Link Device */) // _HID: Hardware ID
72
- Name (_UID, Zero) // _UID: Unique ID
73
+ Name (_UID, One) // _UID: Unique ID
74
Name (_PRS, ResourceTemplate () // _PRS: Possible Resource Settings
75
{
76
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, )
77
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
78
Device (GSI2)
79
{
80
Name (_HID, "PNP0C0F" /* PCI Interrupt Link Device */) // _HID: Hardware ID
81
- Name (_UID, Zero) // _UID: Unique ID
82
+ Name (_UID, 0x02) // _UID: Unique ID
83
Name (_PRS, ResourceTemplate () // _PRS: Possible Resource Settings
84
{
85
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, )
86
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
87
Device (GSI3)
88
{
89
Name (_HID, "PNP0C0F" /* PCI Interrupt Link Device */) // _HID: Hardware ID
90
- Name (_UID, Zero) // _UID: Unique ID
91
+ Name (_UID, 0x03) // _UID: Unique ID
92
Name (_PRS, ResourceTemplate () // _PRS: Possible Resource Settings
93
{
94
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, )
95
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
96
97
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
98
{
99
- Name (RBUF, ResourceTemplate ()
100
- {
101
- WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
102
- 0x0000, // Granularity
103
- 0x0000, // Range Minimum
104
- 0x00FF, // Range Maximum
105
- 0x0000, // Translation Offset
106
- 0x0100, // Length
107
- ,, )
108
- DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
109
- 0x00000000, // Granularity
110
- 0x10000000, // Range Minimum
111
- 0x3EFEFFFF, // Range Maximum
112
- 0x00000000, // Translation Offset
113
- 0x2EFF0000, // Length
114
- ,, , AddressRangeMemory, TypeStatic)
115
- DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
116
- 0x00000000, // Granularity
117
- 0x00000000, // Range Minimum
118
- 0x0000FFFF, // Range Maximum
119
- 0x3EFF0000, // Translation Offset
120
- 0x00010000, // Length
121
- ,, , TypeStatic, DenseTranslation)
122
- QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
123
- 0x0000000000000000, // Granularity
124
- 0x0000008000000000, // Range Minimum
125
- 0x000000FFFFFFFFFF, // Range Maximum
126
- 0x0000000000000000, // Translation Offset
127
- 0x0000008000000000, // Length
128
- ,, , AddressRangeMemory, TypeStatic)
129
- })
130
Return (ResourceTemplate ()
131
{
132
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
133
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
134
})
135
}
136
137
- Device (RP0)
138
- {
139
- Name (_ADR, Zero) // _ADR: Address
140
- }
141
-
142
Device (RES0)
143
{
144
Name (_HID, "PNP0C02" /* PNP Motherboard Resources */) // _HID: Hardware ID
145
@@ -XXX,XX +XXX,XX @@ DefinitionBlock ("", "DSDT", 2, "BOCHS ", "BXPCDSDT", 0x00000001)
146
Device (PWRB)
147
{
148
Name (_HID, "PNP0C0C" /* Power Button Device */) // _HID: Hardware ID
149
- Name (_ADR, Zero) // _ADR: Address
150
Name (_UID, Zero) // _UID: Unique ID
151
}
152
}
153
154
The differences between the two versions of DSDT.memhp are almost the
155
same as the above, except for total length and checksum.
156
157
DSDT.numamem binary is just the same with DSDT on virt machine, so we
158
don't show the differences again.
159
160
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
161
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
162
Message-id: 20200204014325.16279-8-guoheyi@huawei.com
163
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
164
---
165
tests/qtest/bios-tables-test-allowed-diff.h | 3 ---
166
tests/data/acpi/virt/DSDT | Bin 18462 -> 5307 bytes
167
tests/data/acpi/virt/DSDT.memhp | Bin 19799 -> 6644 bytes
168
tests/data/acpi/virt/DSDT.numamem | Bin 18462 -> 5307 bytes
169
4 files changed, 3 deletions(-)
170
171
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
172
index XXXXXXX..XXXXXXX 100644
173
--- a/tests/qtest/bios-tables-test-allowed-diff.h
174
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
175
@@ -1,4 +1 @@
176
/* List of comma-separated changed AML files to ignore */
177
-"tests/data/acpi/virt/DSDT",
178
-"tests/data/acpi/virt/DSDT.memhp",
179
-"tests/data/acpi/virt/DSDT.numamem",
180
diff --git a/tests/data/acpi/virt/DSDT b/tests/data/acpi/virt/DSDT
181
index XXXXXXX..XXXXXXX 100644
182
GIT binary patch
183
delta 156
184
zcmbO?fpNDcmrJlq$Zin^2BwP>xulufJQ*iyC^K43^tIeLL4lLWeZ}O>oO+X=b6T<Z
185
z6mvCfR_C%{pDgc^#>hCi&BajKi^V<I(}*M9!_$Q~z%RhS*}#o~BR<sAg^OwOMVP!X
186
lHhJdBGOmtnjvVpMLBX3Jy81CrwsAkqC^^YPgaxRb0RT`TDiQzy
187
188
literal 18462
189
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
265
A00000
266
267
diff --git a/tests/data/acpi/virt/DSDT.memhp b/tests/data/acpi/virt/DSDT.memhp
268
index XXXXXXX..XXXXXXX 100644
269
GIT binary patch
270
delta 173
271
zcmcaUi}8ywmrJlq$QMZl2ByY|T++<_a~LOTC^K43^tIeLL4lLWeZ}O>oO+X=b6T<Z
272
z6mvCfR_C%{pDgc^#>hCi&BajKi^V<I(}*M9!_$Q~z%RhS*}#o~BR<sAg^OwOMVP!X
273
pHhJdBGOmtnjvVpMLBX3Jy81D0wsHT%Dk&Kd9^{0q-Wg&Z0|3#tFC_o~
274
275
literal 19799
276
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
365
DDbP3`
366
367
diff --git a/tests/data/acpi/virt/DSDT.numamem b/tests/data/acpi/virt/DSDT.numamem
368
index XXXXXXX..XXXXXXX 100644
369
GIT binary patch
370
delta 156
371
zcmbO?fpNDcmrJlq$Zin^2BwP>xulufJQ*iyC^K43^tIeLL4lLWeZ}O>oO+X=b6T<Z
372
z6mvCfR_C%{pDgc^#>hCi&BajKi^V<I(}*M9!_$Q~z%RhS*}#o~BR<sAg^OwOMVP!X
373
lHhJdBGOmtnjvVpMLBX3Jy81CrwsAkqC^^YPgaxRb0RT`TDiQzy
374
375
literal 18462
376
zcmc)ScXSkm8iw%+36N|;NFdS#0*VC-rifrC*(4Ap5OxEoL4yrNET~uz6^x349TdAp
377
z#ol{Y6npQeh`smTHTRwDuD;K8uK!-nakJ0v%s2Z>CNML{-I`=g)4(x7&}nM*`1qLQ
378
zpz7@!<28CLD+q${e)zR$!Q7lFEy?PZ=GK1kva+(=mNE4;-Kye^^@<TeZp*~_nxMJ0
379
zHYYy5A@gLSVN6+Bd3pND+?IGES==wydwyOJPRt96f?z?HAS-LIYPOcDs!0@tPc*ld
380
z*Nsi4r;Ht!7_TYAF{L<Gn4Y5LgPhsga=1!)>Q!--tkj18UL_~9%E-FO@w(J16KWeK
381
z3R0o1B%7*Y`C2Dl_1|lD%Il+5!;MwtOiE<F2dS-<*$ez@&A+j+pi>%K<|FWeGb6&y
382
z{$oU^;O`OT=@Hf8tEg~uW<;!0)QlXPQQ<QxBWGks&FEq?Dt*Srku!3lX5`w8jeW-O
383
z$QhlZX2fj9aG$YB<cuy+GYV|RCO%_C<czLSGYW0S2%j-Baz<{{j3S#c(r0WMIU_G>
384
zMh}~@sm&<IuhC!oM=WYaiOtx|XGHF%{3Xfk>b-2n<~}2OKP`xQ9er%Z7Cs|-KkXJZ
385
zqo2*#(q}~Pr-e~7`rC}Hd`9$s+C6H<K%23(&xqbni=t)>vKga%M)ZDK95rJNn^EO6
386
zqW9AtQ8R|vjB1||y`T1snz6Rch}(>c=>4=LYR0-YqsC`M@29Ip%~;Q7)cTC*{j^uq
387
zj16o?ozIBgPkTqr7-lm@`;6%Qv`^HGGMk})#ykFn3jb}Wh~7{8M$M?O8TCFRdOz(K
388
zHDhC&v5n7&-cMJLnz4z^*w$x6@2CBvW{k8MV|_;SemWp(#%4C7!DduO@23N!W^7?I
389
z#`%os{j@Y{##T0Ce0s)$RoRX4`t%EF9M@P@RW?!wE^!@@rK&PKjHw;1+v@6Zy48V|
390
zZgqs#EnF{rvMEtq8tdN}#Dn@^_h3*^rvGYm@8Dp1u&cfXS}1i8(wJ!KdGdwX`9V&P
391
z{G9yu_F!~UBU1OXbiX|4Q4l^J>!hg2M7E+b=+P~wpuIgS2-nea=?d4<f`zH)I@Z&o
392
znGDy|{ElUH%#>O-UE!LUMRh<FZc&SNtf>sw%xopQW6jJf$PU6aGmB=Y*3_aMYbwJv
393
z^@=*SqNBsqvgt}2I~LUeR9cxycXo!ebH_F_&d#YdGcR80&Mt83kXWxEv#1WZ+^KYD
394
zS2(-E*_BSEJ9FX8?N~GOEztp*JC*LtgHs3dsqbFLw<M2Fr8{GA#^BTeojaB8%!e}{
395
z&U`wR?$jBD{X7fc)B&J7mG0~YXE!*z(W!K2A)JM9>VVOmN_TdLvpbyK=~TK?CsXDu
396
zf>Q^W?o_(77|voii|JIlvj?0#;M4)BJC*M231?3@d(x?NX9=7oaOwcool1AE2Ip#U
397
zu12TQoxR}f1*Z;p-KlhEZ#a9y*_%$KJ9VmQKhHjJ>HyiDN_X~!voD-|=~TM2ADsQ*
398
z)B&|SmF`>}&eh>uold1Y`@`8EP91=|Q|ZnDa1MZT0G&#A4uo?coH}54r_!CJaF)VZ
399
zN~hADgWwzlrw;JlsdVRHI0wTym`<fT*MM^kICVncPNh57gmX<e*Q8VF&LMCPfm0_C
400
z?o_&SEjZVLb1gcR?pzzrwc*qWhdY(-TnEl|;9Q4Jr90P!b6q%fg5pl4JBPwK6waY^
401
zD&4sroa@1<6B>6a-MK!T>%+M|ol19Z0Otm9>IBH0N_TDu=Z0`@NT<@B!{8hSr%ssM
402
zsdVQ?aBc+WMszCOsq1p~_iY)RI>B<M(w({-r!_N2p5<_s)2Vc)F2ZTe%#mjWoH`+M
403
zr_!Ce^rkg4$G4SmR??|-r!Kgeb7MGl0_RSpJ9U}OoWtQ9PN&kHy0~V}P2kiCpF5TA
404
z)Fm}@j(~Fnol1A=LYg^8!l@HPcPibf%V*}?6wXcQRJv0a&CIzOoI0U&r_!CeRA$c2
405
z;oO`~r8{+j%$!@msS{9lD&48eV&>cu&MoOwx>Fa!%()euI$?FE(w({lX3nkQ+?r0M
406
zJ4eAe3eHh<D&1KHXBC`PbSmAci(KZchO?SZr8{+L%bamI<8&(BsS8?KGjj%917{7L
407
zN_Xlqme$PtJyZ*4EuBht>f)6->)@=TQ|V4!vNGprI7ic|bf+#<nR5)BW9U@6Q<taA
408
zSr2DDol1A=qLewefpZ%=mG0D~D06NL=eBez-Kh&u<{S&>SUQ#N)MY1gHo)0Hr_!Ce
409
z*ksOeaE_x>=}ui@GUs?W$J42FXCs`Aa5mDZbms&(C%`#@PNh2&a3<hP(5ZB163!%?
410
zNjjD8Y=W~1&L%pQ?wkncL^vnXsdVQgI48k5iB6?EC&M`z&dGEt-MJl{+rhaVol19Z
411
z59ju9ZcnGuojbs}1Dre1sdQ&EoXv1H)2Vdl6ga2AIfYK8J9mV0M>uz+Q|Zo~;M@t$
412
zo#<4$vjxr;I9upcx^pU=Q{kLSr_!A}!?`n@JJYFj=Pq#W0_QGtD&4s&oV&ugE1gPr
413
z?gr;>aPCH@(w(~MZGYeH4(IN4D&08^&S`K?qf_b5J>c8}&OPW<x^quB_k?p#I+gC6
414
z4(D_@r_-r)=U#B`1?OILD&08)&KYpdpi}A2z2V#&&b{eWx^o{m_knXCI+gC+7tVd*
415
z+?P(JJNJWgKREZJQ|Zo`aL$BtCY?%m?hohwaPCj1(wzsuc>tUT(5ZCifp8uO=Ye!8
416
z-8l=+S#ZvxQ|Zow;5-P<gXmPc^I$j+hVx)LmF_$Q&O_ilgifV94~6qkI1i;$>CV}3
417
z&W3X~ol18e2IpaL9!96qopa!v1Lqt%mF_$o&coq6oKB@XkAU+CIFF!H>CPkJJQB_$
418
z=~TLNE}V1WoJ*(Do%7(F2j@IGmF_$W&ZFQwicY0FTj6Ylvz1PzJCBC*XgH6iQ|ZoQ
419
z;5-J-W9U@6^H?~Kh4WZCmF}Dm=X^Nl)2Vdlac~|7=W%o@-FZBm$HRF%ol18ufO7$y
420
z3+Pn3b0M4y;ao_k(w!&3c><g#(5ZCiiEy3>=ZSPG-FXt6C&76Vol19}4Cl#ko=m6G
421
zou|Ng3Y@3VsdVS5aGnb1sdOscc^aIj!Fd{;N_Q@Ta}k`2=v2CMF`SFxTui6Zou|Wj
422
zI-IA|sdVQVaGn9@8FVV$xdhH7a4w-!>CQ9ZJQL0{=~TM&EI7}C^DH`*?mQdLv*A3O
423
zPNh4~f%6<V&!JQ4&U4{B7tV9(RJ!v#IM0LgJUW%`JRi>U;XI#Cr8_Tx^8z?8pi}A2
424
z3*o#F&I{>Oy0Z<=HaOepRJ!vbI4^?pB081syco`l;k=kmr8_Ty^Ab2Op;PJ3rEo5V
425
zb19ulcU}tTrEp$Kr_!C5!Fd^+m(i(o=jCu-4(H``D&2VnoL9hk1)WNFUJ2)wa9&BL
426
z(w$eqc@>;j(W!Lj)o@-7=hbv7-FXe1*T8uVol19J3+J_PUQ4Iao!7y69h}$EsdVS{
427
za9$7R^>ixTc>|m`z<C3mN_XA}=Z$dQNT<@BH^F%moHx;_bmz@*-VEo>bSm9>3!JyW
428
zc?+FNcisx;t#IB-r_!Cb!Fd~;x6!F|=k0Lb4(IK3D&2VpoOi%^2c1fH-U;WOaNbF$
429
z(w%p~c^8~_(W!Lj-EiIw=iPKF-FXk3_rQ4%ol1A!3+KIX-b<&_o%g|cADs8msdVT4
430
zaNZB+{d6kbxeU%_a4w@$>COk>d;rb|=v2D%K{y|T^Fcb5?pzM%ayXaMsdVQ<a6Sa*
431
zLv$+L`7oRh!}&0sN_Rd2=Ob`FLZ{N5kHYyVoR89}bmwDmJ_hGwbSmBXIGm5e`8b_Q
432
zcRm5<6L3C3r_!BI!uceePtvJ$=TmS#1?N+AD&6@soKM5~G@VL!J_F}7a6Ut)(w)!3
433
z`7E5z(y4Ukb8tQf=W}!_-T6G6&%^mVol1AU0Ot#EzCfqaoiD=qBAhSMsdVQ{aJ~fR
434
zOLQvT`7)d@!}&6uN_V~j=PPi&LZ{N5E8tuK=L$NN?tB%_SK)k>PNh3vgYz{wU!zm$
435
z&e!359nRP3RJwB|oGam6NvG1CZ@~EmoNv&nbmuBKSHZc8PNh5Fg!4@}-=tIN&bQ!v
436
z3(mLbRJ!wRINyfzZ90|id<V{V;CzQpr90n+^IbUKrBmt7_uzaF&iCk4y7PTF--q*k
437
zI+gDH0L~BK{D4lSJ3oZ;LpVRAQ|Zo+;QR>AkLXmo^J6$ahVx@OmG1lm&QIX{gifV9
438
zKZWyCI6tLR>CVsK{0z>|=v2D%b2vYT^K&|t?)(DIFW~%wPNh4)g!4-{zob*?&adG7
439
z3eK<SRJ!wPIKPJTYdV$g{07c%;QWS8r8~cc^IJH-rBmt7@8J9n&hO|{y7PNDzlZaC
440
zI+gDH0nQ)b{DDrTJAZ`pM>v0^Q|Zp1;QR^BpXgM&^Jh4JhVy4SmG1ln&R^jCg-)eA
441
ze}(f`IDe&6>CWHa{0+|E=v2D%cQ}8C^LILx?)(GJKj8d>PNh5lg!4~0|D;pt&UQH4
442
z;cTZ<nQ}I_*5~MdjIsBd#>?tb?<du5qdwH5FqYr(K^|)csSol9Kj?#xm2_!ICX!j{
443
zQR(-;hHqB=U!#UZj7mMmQR%m9|J$gwB1WYi<EZqzw*PI^+7Y8tkEKVI6t%>wtAeG4
444
zTCix8Zc4^?4?p)L$W2sFtScVVH8$(`Zb7F4Jre}_VFW?ealM0}AS=A9KSk~Be{Pk!
445
z+dfRsWEEtmN=tVv-mYh}f`#kbIvoql(`|eBC$o6^Yxwx=VCnyD%el#kjg3KWyeTm@
446
zD5=Y98J~>jESwR<YbKYsjp@30&*Gl3qUMH`l|PmCAGKuitg2;Ou9&uPMl44QROoB2
447
zzE;i*Bb*c7sSHQW32$Ph;cZ*dqQ%p*j?gpZ9ZQ$D^;)zzvs~)oqVUO?;lknLOJ`hE
448
zn0h?iNcqwkB^$QXBpY(t2B%)lb0Z%AAUXW7hSPd~+R%4-yrC^`@m~4{W@lxEH~R3G
449
z{6u3}OX^M4&8-bNiQ3FZ)ui^E@H1q>Ux3P3**|_v9lL~nNTs9FKc4iLqVQ|@!7|ld
450
zrwj`}WoLA4jW+T3N9>e`Z|M%-z^y0J^HaZI*;zwVtIn%U=pEnMv2ycbIn77qhZ(O;
451
z){Y%iGN7e)Qd8c{Fs8N@EuJ$q)=9tW^BX58s$=t-TT8<`sg0!sac$wRw~Pn>0Sn~0
452
A00000
453
454
--
455
2.20.1
456
457
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Use a common predicate for querying stage1-ness.
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200208125816.14954-2-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/internals.h | 18 ++++++++++++++++++
12
target/arm/helper.c | 8 +++-----
13
2 files changed, 21 insertions(+), 5 deletions(-)
14
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/internals.h
18
+++ b/target/arm/internals.h
19
@@ -XXX,XX +XXX,XX @@ static inline ARMMMUIdx arm_stage1_mmu_idx(CPUARMState *env)
20
ARMMMUIdx arm_stage1_mmu_idx(CPUARMState *env);
21
#endif
22
23
+/**
24
+ * arm_mmu_idx_is_stage1_of_2:
25
+ * @mmu_idx: The ARMMMUIdx to test
26
+ *
27
+ * Return true if @mmu_idx is a NOTLB mmu_idx that is the
28
+ * first stage of a two stage regime.
29
+ */
30
+static inline bool arm_mmu_idx_is_stage1_of_2(ARMMMUIdx mmu_idx)
31
+{
32
+ switch (mmu_idx) {
33
+ case ARMMMUIdx_Stage1_E0:
34
+ case ARMMMUIdx_Stage1_E1:
35
+ return true;
36
+ default:
37
+ return false;
38
+ }
39
+}
40
+
41
/*
42
* Parameters of a given virtual address, as extracted from the
43
* translation control register (TCR) for a given regime.
44
diff --git a/target/arm/helper.c b/target/arm/helper.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/helper.c
47
+++ b/target/arm/helper.c
48
@@ -XXX,XX +XXX,XX @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
49
bool take_exc = false;
50
51
if (fi.s1ptw && current_el == 1 && !arm_is_secure(env)
52
- && (mmu_idx == ARMMMUIdx_Stage1_E1 ||
53
- mmu_idx == ARMMMUIdx_Stage1_E0)) {
54
+ && arm_mmu_idx_is_stage1_of_2(mmu_idx)) {
55
/*
56
* Synchronous stage 2 fault on an access made as part of the
57
* translation table walk for AT S1E0* or AT S1E1* insn
58
@@ -XXX,XX +XXX,XX @@ static inline bool regime_translation_disabled(CPUARMState *env,
59
}
60
}
61
62
- if ((env->cp15.hcr_el2 & HCR_DC) &&
63
- (mmu_idx == ARMMMUIdx_Stage1_E0 || mmu_idx == ARMMMUIdx_Stage1_E1)) {
64
+ if ((env->cp15.hcr_el2 & HCR_DC) && arm_mmu_idx_is_stage1_of_2(mmu_idx)) {
65
/* HCR.DC means SCTLR_EL1.M behaves as 0 */
66
return true;
67
}
68
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
69
hwaddr addr, MemTxAttrs txattrs,
70
ARMMMUFaultInfo *fi)
71
{
72
- if ((mmu_idx == ARMMMUIdx_Stage1_E0 || mmu_idx == ARMMMUIdx_Stage1_E1) &&
73
+ if (arm_mmu_idx_is_stage1_of_2(mmu_idx) &&
74
!regime_translation_disabled(env, ARMMMUIdx_Stage2)) {
75
target_ulong s2size;
76
hwaddr s2pa;
77
--
78
2.20.1
79
80
diff view generated by jsdifflib
New patch
1
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
To implement PAN, we will want to swap, for short periods
4
of time, to a different privileged mmu_idx. In addition,
5
we cannot do this with flushing alone, because the AT*
6
instructions have both PAN and PAN-less versions.
7
8
Add the ARMMMUIdx*_PAN constants where necessary next to
9
the corresponding ARMMMUIdx* constant.
10
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20200208125816.14954-3-richard.henderson@linaro.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
target/arm/cpu-param.h | 2 +-
18
target/arm/cpu.h | 33 ++++++++++++++-------
19
target/arm/internals.h | 9 ++++++
20
target/arm/helper.c | 60 +++++++++++++++++++++++++++++++-------
21
target/arm/translate-a64.c | 3 ++
22
target/arm/translate.c | 2 ++
23
6 files changed, 87 insertions(+), 22 deletions(-)
24
25
diff --git a/target/arm/cpu-param.h b/target/arm/cpu-param.h
26
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/cpu-param.h
28
+++ b/target/arm/cpu-param.h
29
@@ -XXX,XX +XXX,XX @@
30
# define TARGET_PAGE_BITS_MIN 10
31
#endif
32
33
-#define NB_MMU_MODES 9
34
+#define NB_MMU_MODES 12
35
36
#endif
37
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
38
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/cpu.h
40
+++ b/target/arm/cpu.h
41
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
42
* 5. we want to be able to use the TLB for accesses done as part of a
43
* stage1 page table walk, rather than having to walk the stage2 page
44
* table over and over.
45
+ * 6. we need separate EL1/EL2 mmu_idx for handling the Privileged Access
46
+ * Never (PAN) bit within PSTATE.
47
*
48
* This gives us the following list of cases:
49
*
50
* NS EL0 EL1&0 stage 1+2 (aka NS PL0)
51
* NS EL1 EL1&0 stage 1+2 (aka NS PL1)
52
+ * NS EL1 EL1&0 stage 1+2 +PAN
53
* NS EL0 EL2&0
54
- * NS EL2 EL2&0
55
+ * NS EL2 EL2&0 +PAN
56
* NS EL2 (aka NS PL2)
57
* S EL0 EL1&0 (aka S PL0)
58
* S EL1 EL1&0 (not used if EL3 is 32 bit)
59
+ * S EL1 EL1&0 +PAN
60
* S EL3 (aka S PL1)
61
* NS EL1&0 stage 2
62
*
63
- * for a total of 9 different mmu_idx.
64
+ * for a total of 12 different mmu_idx.
65
*
66
* R profile CPUs have an MPU, but can use the same set of MMU indexes
67
* as A profile. They only need to distinguish NS EL0 and NS EL1 (and
68
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
69
/*
70
* A-profile.
71
*/
72
- ARMMMUIdx_E10_0 = 0 | ARM_MMU_IDX_A,
73
- ARMMMUIdx_E20_0 = 1 | ARM_MMU_IDX_A,
74
+ ARMMMUIdx_E10_0 = 0 | ARM_MMU_IDX_A,
75
+ ARMMMUIdx_E20_0 = 1 | ARM_MMU_IDX_A,
76
77
- ARMMMUIdx_E10_1 = 2 | ARM_MMU_IDX_A,
78
+ ARMMMUIdx_E10_1 = 2 | ARM_MMU_IDX_A,
79
+ ARMMMUIdx_E10_1_PAN = 3 | ARM_MMU_IDX_A,
80
81
- ARMMMUIdx_E2 = 3 | ARM_MMU_IDX_A,
82
- ARMMMUIdx_E20_2 = 4 | ARM_MMU_IDX_A,
83
+ ARMMMUIdx_E2 = 4 | ARM_MMU_IDX_A,
84
+ ARMMMUIdx_E20_2 = 5 | ARM_MMU_IDX_A,
85
+ ARMMMUIdx_E20_2_PAN = 6 | ARM_MMU_IDX_A,
86
87
- ARMMMUIdx_SE10_0 = 5 | ARM_MMU_IDX_A,
88
- ARMMMUIdx_SE10_1 = 6 | ARM_MMU_IDX_A,
89
- ARMMMUIdx_SE3 = 7 | ARM_MMU_IDX_A,
90
+ ARMMMUIdx_SE10_0 = 7 | ARM_MMU_IDX_A,
91
+ ARMMMUIdx_SE10_1 = 8 | ARM_MMU_IDX_A,
92
+ ARMMMUIdx_SE10_1_PAN = 9 | ARM_MMU_IDX_A,
93
+ ARMMMUIdx_SE3 = 10 | ARM_MMU_IDX_A,
94
95
- ARMMMUIdx_Stage2 = 8 | ARM_MMU_IDX_A,
96
+ ARMMMUIdx_Stage2 = 11 | ARM_MMU_IDX_A,
97
98
/*
99
* These are not allocated TLBs and are used only for AT system
100
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
101
*/
102
ARMMMUIdx_Stage1_E0 = 0 | ARM_MMU_IDX_NOTLB,
103
ARMMMUIdx_Stage1_E1 = 1 | ARM_MMU_IDX_NOTLB,
104
+ ARMMMUIdx_Stage1_E1_PAN = 2 | ARM_MMU_IDX_NOTLB,
105
106
/*
107
* M-profile.
108
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdxBit {
109
TO_CORE_BIT(E10_0),
110
TO_CORE_BIT(E20_0),
111
TO_CORE_BIT(E10_1),
112
+ TO_CORE_BIT(E10_1_PAN),
113
TO_CORE_BIT(E2),
114
TO_CORE_BIT(E20_2),
115
+ TO_CORE_BIT(E20_2_PAN),
116
TO_CORE_BIT(SE10_0),
117
TO_CORE_BIT(SE10_1),
118
+ TO_CORE_BIT(SE10_1_PAN),
119
TO_CORE_BIT(SE3),
120
TO_CORE_BIT(Stage2),
121
122
diff --git a/target/arm/internals.h b/target/arm/internals.h
123
index XXXXXXX..XXXXXXX 100644
124
--- a/target/arm/internals.h
125
+++ b/target/arm/internals.h
126
@@ -XXX,XX +XXX,XX @@ static inline bool regime_has_2_ranges(ARMMMUIdx mmu_idx)
127
switch (mmu_idx) {
128
case ARMMMUIdx_Stage1_E0:
129
case ARMMMUIdx_Stage1_E1:
130
+ case ARMMMUIdx_Stage1_E1_PAN:
131
case ARMMMUIdx_E10_0:
132
case ARMMMUIdx_E10_1:
133
+ case ARMMMUIdx_E10_1_PAN:
134
case ARMMMUIdx_E20_0:
135
case ARMMMUIdx_E20_2:
136
+ case ARMMMUIdx_E20_2_PAN:
137
case ARMMMUIdx_SE10_0:
138
case ARMMMUIdx_SE10_1:
139
+ case ARMMMUIdx_SE10_1_PAN:
140
return true;
141
default:
142
return false;
143
@@ -XXX,XX +XXX,XX @@ static inline bool regime_is_secure(CPUARMState *env, ARMMMUIdx mmu_idx)
144
switch (mmu_idx) {
145
case ARMMMUIdx_E10_0:
146
case ARMMMUIdx_E10_1:
147
+ case ARMMMUIdx_E10_1_PAN:
148
case ARMMMUIdx_E20_0:
149
case ARMMMUIdx_E20_2:
150
+ case ARMMMUIdx_E20_2_PAN:
151
case ARMMMUIdx_Stage1_E0:
152
case ARMMMUIdx_Stage1_E1:
153
+ case ARMMMUIdx_Stage1_E1_PAN:
154
case ARMMMUIdx_E2:
155
case ARMMMUIdx_Stage2:
156
case ARMMMUIdx_MPrivNegPri:
157
@@ -XXX,XX +XXX,XX @@ static inline bool regime_is_secure(CPUARMState *env, ARMMMUIdx mmu_idx)
158
case ARMMMUIdx_SE3:
159
case ARMMMUIdx_SE10_0:
160
case ARMMMUIdx_SE10_1:
161
+ case ARMMMUIdx_SE10_1_PAN:
162
case ARMMMUIdx_MSPrivNegPri:
163
case ARMMMUIdx_MSUserNegPri:
164
case ARMMMUIdx_MSPriv:
165
@@ -XXX,XX +XXX,XX @@ static inline bool arm_mmu_idx_is_stage1_of_2(ARMMMUIdx mmu_idx)
166
switch (mmu_idx) {
167
case ARMMMUIdx_Stage1_E0:
168
case ARMMMUIdx_Stage1_E1:
169
+ case ARMMMUIdx_Stage1_E1_PAN:
170
return true;
171
default:
172
return false;
173
diff --git a/target/arm/helper.c b/target/arm/helper.c
174
index XXXXXXX..XXXXXXX 100644
175
--- a/target/arm/helper.c
176
+++ b/target/arm/helper.c
177
@@ -XXX,XX +XXX,XX @@ static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
178
179
tlb_flush_by_mmuidx(cs,
180
ARMMMUIdxBit_E10_1 |
181
+ ARMMMUIdxBit_E10_1_PAN |
182
ARMMMUIdxBit_E10_0 |
183
ARMMMUIdxBit_Stage2);
184
}
185
@@ -XXX,XX +XXX,XX @@ static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
186
187
tlb_flush_by_mmuidx_all_cpus_synced(cs,
188
ARMMMUIdxBit_E10_1 |
189
+ ARMMMUIdxBit_E10_1_PAN |
190
ARMMMUIdxBit_E10_0 |
191
ARMMMUIdxBit_Stage2);
192
}
193
@@ -XXX,XX +XXX,XX @@ static int gt_phys_redir_timeridx(CPUARMState *env)
194
switch (arm_mmu_idx(env)) {
195
case ARMMMUIdx_E20_0:
196
case ARMMMUIdx_E20_2:
197
+ case ARMMMUIdx_E20_2_PAN:
198
return GTIMER_HYP;
199
default:
200
return GTIMER_PHYS;
201
@@ -XXX,XX +XXX,XX @@ static int gt_virt_redir_timeridx(CPUARMState *env)
202
switch (arm_mmu_idx(env)) {
203
case ARMMMUIdx_E20_0:
204
case ARMMMUIdx_E20_2:
205
+ case ARMMMUIdx_E20_2_PAN:
206
return GTIMER_HYPVIRT;
207
default:
208
return GTIMER_VIRT;
209
@@ -XXX,XX +XXX,XX @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
210
format64 = arm_s1_regime_using_lpae_format(env, mmu_idx);
211
212
if (arm_feature(env, ARM_FEATURE_EL2)) {
213
- if (mmu_idx == ARMMMUIdx_E10_0 || mmu_idx == ARMMMUIdx_E10_1) {
214
+ if (mmu_idx == ARMMMUIdx_E10_0 ||
215
+ mmu_idx == ARMMMUIdx_E10_1 ||
216
+ mmu_idx == ARMMMUIdx_E10_1_PAN) {
217
format64 |= env->cp15.hcr_el2 & (HCR_VM | HCR_DC);
218
} else {
219
format64 |= arm_current_el(env) == 2;
220
@@ -XXX,XX +XXX,XX @@ static void vmsa_tcr_ttbr_el2_write(CPUARMState *env, const ARMCPRegInfo *ri,
221
if (extract64(raw_read(env, ri) ^ value, 48, 16) &&
222
(arm_hcr_el2_eff(env) & HCR_E2H)) {
223
tlb_flush_by_mmuidx(env_cpu(env),
224
- ARMMMUIdxBit_E20_2 | ARMMMUIdxBit_E20_0);
225
+ ARMMMUIdxBit_E20_2 |
226
+ ARMMMUIdxBit_E20_2_PAN |
227
+ ARMMMUIdxBit_E20_0);
228
}
229
raw_write(env, ri, value);
230
}
231
@@ -XXX,XX +XXX,XX @@ static void vttbr_write(CPUARMState *env, const ARMCPRegInfo *ri,
232
if (raw_read(env, ri) != value) {
233
tlb_flush_by_mmuidx(cs,
234
ARMMMUIdxBit_E10_1 |
235
+ ARMMMUIdxBit_E10_1_PAN |
236
ARMMMUIdxBit_E10_0 |
237
ARMMMUIdxBit_Stage2);
238
raw_write(env, ri, value);
239
@@ -XXX,XX +XXX,XX @@ static int vae1_tlbmask(CPUARMState *env)
240
{
241
/* Since we exclude secure first, we may read HCR_EL2 directly. */
242
if (arm_is_secure_below_el3(env)) {
243
- return ARMMMUIdxBit_SE10_1 | ARMMMUIdxBit_SE10_0;
244
+ return ARMMMUIdxBit_SE10_1 |
245
+ ARMMMUIdxBit_SE10_1_PAN |
246
+ ARMMMUIdxBit_SE10_0;
247
} else if ((env->cp15.hcr_el2 & (HCR_E2H | HCR_TGE))
248
== (HCR_E2H | HCR_TGE)) {
249
- return ARMMMUIdxBit_E20_2 | ARMMMUIdxBit_E20_0;
250
+ return ARMMMUIdxBit_E20_2 |
251
+ ARMMMUIdxBit_E20_2_PAN |
252
+ ARMMMUIdxBit_E20_0;
253
} else {
254
- return ARMMMUIdxBit_E10_1 | ARMMMUIdxBit_E10_0;
255
+ return ARMMMUIdxBit_E10_1 |
256
+ ARMMMUIdxBit_E10_1_PAN |
257
+ ARMMMUIdxBit_E10_0;
258
}
259
}
260
261
@@ -XXX,XX +XXX,XX @@ static int alle1_tlbmask(CPUARMState *env)
262
* stage 1 translations.
263
*/
264
if (arm_is_secure_below_el3(env)) {
265
- return ARMMMUIdxBit_SE10_1 | ARMMMUIdxBit_SE10_0;
266
+ return ARMMMUIdxBit_SE10_1 |
267
+ ARMMMUIdxBit_SE10_1_PAN |
268
+ ARMMMUIdxBit_SE10_0;
269
} else if (arm_feature(env, ARM_FEATURE_EL2)) {
270
- return ARMMMUIdxBit_E10_1 | ARMMMUIdxBit_E10_0 | ARMMMUIdxBit_Stage2;
271
+ return ARMMMUIdxBit_E10_1 |
272
+ ARMMMUIdxBit_E10_1_PAN |
273
+ ARMMMUIdxBit_E10_0 |
274
+ ARMMMUIdxBit_Stage2;
275
} else {
276
- return ARMMMUIdxBit_E10_1 | ARMMMUIdxBit_E10_0;
277
+ return ARMMMUIdxBit_E10_1 |
278
+ ARMMMUIdxBit_E10_1_PAN |
279
+ ARMMMUIdxBit_E10_0;
280
}
281
}
282
283
static int e2_tlbmask(CPUARMState *env)
284
{
285
/* TODO: ARMv8.4-SecEL2 */
286
- return ARMMMUIdxBit_E20_0 | ARMMMUIdxBit_E20_2 | ARMMMUIdxBit_E2;
287
+ return ARMMMUIdxBit_E20_0 |
288
+ ARMMMUIdxBit_E20_2 |
289
+ ARMMMUIdxBit_E20_2_PAN |
290
+ ARMMMUIdxBit_E2;
291
}
292
293
static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
294
@@ -XXX,XX +XXX,XX @@ static uint32_t regime_el(CPUARMState *env, ARMMMUIdx mmu_idx)
295
switch (mmu_idx) {
296
case ARMMMUIdx_E20_0:
297
case ARMMMUIdx_E20_2:
298
+ case ARMMMUIdx_E20_2_PAN:
299
case ARMMMUIdx_Stage2:
300
case ARMMMUIdx_E2:
301
return 2;
302
@@ -XXX,XX +XXX,XX @@ static uint32_t regime_el(CPUARMState *env, ARMMMUIdx mmu_idx)
303
case ARMMMUIdx_SE10_0:
304
return arm_el_is_aa64(env, 3) ? 1 : 3;
305
case ARMMMUIdx_SE10_1:
306
+ case ARMMMUIdx_SE10_1_PAN:
307
case ARMMMUIdx_Stage1_E0:
308
case ARMMMUIdx_Stage1_E1:
309
+ case ARMMMUIdx_Stage1_E1_PAN:
310
case ARMMMUIdx_E10_0:
311
case ARMMMUIdx_E10_1:
312
+ case ARMMMUIdx_E10_1_PAN:
313
case ARMMMUIdx_MPrivNegPri:
314
case ARMMMUIdx_MUserNegPri:
315
case ARMMMUIdx_MPriv:
316
@@ -XXX,XX +XXX,XX @@ static inline ARMMMUIdx stage_1_mmu_idx(ARMMMUIdx mmu_idx)
317
return ARMMMUIdx_Stage1_E0;
318
case ARMMMUIdx_E10_1:
319
return ARMMMUIdx_Stage1_E1;
320
+ case ARMMMUIdx_E10_1_PAN:
321
+ return ARMMMUIdx_Stage1_E1_PAN;
322
default:
323
return mmu_idx;
324
}
325
@@ -XXX,XX +XXX,XX @@ static inline bool regime_is_user(CPUARMState *env, ARMMMUIdx mmu_idx)
326
return false;
327
case ARMMMUIdx_E10_0:
328
case ARMMMUIdx_E10_1:
329
+ case ARMMMUIdx_E10_1_PAN:
330
g_assert_not_reached();
331
}
332
}
333
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
334
target_ulong *page_size,
335
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
336
{
337
- if (mmu_idx == ARMMMUIdx_E10_0 || mmu_idx == ARMMMUIdx_E10_1) {
338
+ if (mmu_idx == ARMMMUIdx_E10_0 ||
339
+ mmu_idx == ARMMMUIdx_E10_1 ||
340
+ mmu_idx == ARMMMUIdx_E10_1_PAN) {
341
/* Call ourselves recursively to do the stage 1 and then stage 2
342
* translations.
343
*/
344
@@ -XXX,XX +XXX,XX @@ int arm_mmu_idx_to_el(ARMMMUIdx mmu_idx)
345
case ARMMMUIdx_SE10_0:
346
return 0;
347
case ARMMMUIdx_E10_1:
348
+ case ARMMMUIdx_E10_1_PAN:
349
case ARMMMUIdx_SE10_1:
350
+ case ARMMMUIdx_SE10_1_PAN:
351
return 1;
352
case ARMMMUIdx_E2:
353
case ARMMMUIdx_E20_2:
354
+ case ARMMMUIdx_E20_2_PAN:
355
return 2;
356
case ARMMMUIdx_SE3:
357
return 3;
358
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
359
/* TODO: ARMv8.2-UAO */
360
switch (mmu_idx) {
361
case ARMMMUIdx_E10_1:
362
+ case ARMMMUIdx_E10_1_PAN:
363
case ARMMMUIdx_SE10_1:
364
+ case ARMMMUIdx_SE10_1_PAN:
365
/* TODO: ARMv8.3-NV */
366
flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
367
break;
368
case ARMMMUIdx_E20_2:
369
+ case ARMMMUIdx_E20_2_PAN:
370
/* TODO: ARMv8.4-SecEL2 */
371
/*
372
* Note that E20_2 is gated by HCR_EL2.E2H == 1, but E20_0 is
373
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
374
index XXXXXXX..XXXXXXX 100644
375
--- a/target/arm/translate-a64.c
376
+++ b/target/arm/translate-a64.c
377
@@ -XXX,XX +XXX,XX @@ static int get_a64_user_mem_index(DisasContext *s)
378
*/
379
switch (useridx) {
380
case ARMMMUIdx_E10_1:
381
+ case ARMMMUIdx_E10_1_PAN:
382
useridx = ARMMMUIdx_E10_0;
383
break;
384
case ARMMMUIdx_E20_2:
385
+ case ARMMMUIdx_E20_2_PAN:
386
useridx = ARMMMUIdx_E20_0;
387
break;
388
case ARMMMUIdx_SE10_1:
389
+ case ARMMMUIdx_SE10_1_PAN:
390
useridx = ARMMMUIdx_SE10_0;
391
break;
392
default:
393
diff --git a/target/arm/translate.c b/target/arm/translate.c
394
index XXXXXXX..XXXXXXX 100644
395
--- a/target/arm/translate.c
396
+++ b/target/arm/translate.c
397
@@ -XXX,XX +XXX,XX @@ static inline int get_a32_user_mem_index(DisasContext *s)
398
case ARMMMUIdx_E2: /* this one is UNPREDICTABLE */
399
case ARMMMUIdx_E10_0:
400
case ARMMMUIdx_E10_1:
401
+ case ARMMMUIdx_E10_1_PAN:
402
return arm_to_core_mmu_idx(ARMMMUIdx_E10_0);
403
case ARMMMUIdx_SE3:
404
case ARMMMUIdx_SE10_0:
405
case ARMMMUIdx_SE10_1:
406
+ case ARMMMUIdx_SE10_1_PAN:
407
return arm_to_core_mmu_idx(ARMMMUIdx_SE10_0);
408
case ARMMMUIdx_MUser:
409
case ARMMMUIdx_MPriv:
410
--
411
2.20.1
412
413
diff view generated by jsdifflib
1
Create a new "unimplemented" sysbus device, which simply accepts
1
From: Richard Henderson <richard.henderson@linaro.org>
2
all read and write accesses, and implements them as read-as-zero,
3
write-ignored, with logging of the access as LOG_UNIMP.
4
2
5
This is useful for stubbing out bits of an SoC or board model
3
Include definitions for all of the bits in ID_MMFR3.
6
which haven't been written yet.
4
We already have a definition for ID_AA64MMFR1.PAN.
7
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-4-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Message-id: 1484247815-15279-3-git-send-email-peter.maydell@linaro.org
11
---
11
---
12
hw/misc/Makefile.objs | 2 +
12
target/arm/cpu.h | 29 +++++++++++++++++++++++++++++
13
include/hw/misc/unimp.h | 39 ++++++++++++++++++
13
1 file changed, 29 insertions(+)
14
hw/misc/unimp.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++
15
3 files changed, 148 insertions(+)
16
create mode 100644 include/hw/misc/unimp.h
17
create mode 100644 hw/misc/unimp.c
18
14
19
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
20
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/misc/Makefile.objs
17
--- a/target/arm/cpu.h
22
+++ b/hw/misc/Makefile.objs
18
+++ b/target/arm/cpu.h
23
@@ -XXX,XX +XXX,XX @@ common-obj-$(CONFIG_SGA) += sga.o
19
@@ -XXX,XX +XXX,XX @@ FIELD(ID_ISAR6, FHM, 8, 4)
24
common-obj-$(CONFIG_ISA_TESTDEV) += pc-testdev.o
20
FIELD(ID_ISAR6, SB, 12, 4)
25
common-obj-$(CONFIG_PCI_TESTDEV) += pci-testdev.o
21
FIELD(ID_ISAR6, SPECRES, 16, 4)
26
22
27
+common-obj-y += unimp.o
23
+FIELD(ID_MMFR3, CMAINTVA, 0, 4)
24
+FIELD(ID_MMFR3, CMAINTSW, 4, 4)
25
+FIELD(ID_MMFR3, BPMAINT, 8, 4)
26
+FIELD(ID_MMFR3, MAINTBCST, 12, 4)
27
+FIELD(ID_MMFR3, PAN, 16, 4)
28
+FIELD(ID_MMFR3, COHWALK, 20, 4)
29
+FIELD(ID_MMFR3, CMEMSZ, 24, 4)
30
+FIELD(ID_MMFR3, SUPERSEC, 28, 4)
28
+
31
+
29
obj-$(CONFIG_VMPORT) += vmport.o
32
FIELD(ID_MMFR4, SPECSEI, 0, 4)
30
33
FIELD(ID_MMFR4, AC2, 4, 4)
31
# ARM devices
34
FIELD(ID_MMFR4, XNX, 8, 4)
32
diff --git a/include/hw/misc/unimp.h b/include/hw/misc/unimp.h
35
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_vminmaxnm(const ARMISARegisters *id)
33
new file mode 100644
36
return FIELD_EX64(id->mvfr2, MVFR2, FPMISC) >= 4;
34
index XXXXXXX..XXXXXXX
37
}
35
--- /dev/null
38
36
+++ b/include/hw/misc/unimp.h
39
+static inline bool isar_feature_aa32_pan(const ARMISARegisters *id)
37
@@ -XXX,XX +XXX,XX @@
38
+/*
39
+ * "Unimplemented" device
40
+ *
41
+ * Copyright Linaro Limited, 2017
42
+ * Written by Peter Maydell
43
+ */
44
+
45
+#ifndef HW_MISC_UNIMP_H
46
+#define HW_MISC_UNIMP_H
47
+
48
+#define TYPE_UNIMPLEMENTED_DEVICE "unimplemented-device"
49
+
50
+/**
51
+ * create_unimplemented_device: create and map a dummy device
52
+ * @name: name of the device for debug logging
53
+ * @base: base address of the device's MMIO region
54
+ * @size: size of the device's MMIO region
55
+ *
56
+ * This utility function creates and maps an instance of unimplemented-device,
57
+ * which is a dummy device which simply logs all guest accesses to
58
+ * it via the qemu_log LOG_UNIMP debug log.
59
+ * The device is mapped at priority -1000, which means that you can
60
+ * use it to cover a large region and then map other devices on top of it
61
+ * if necessary.
62
+ */
63
+static inline void create_unimplemented_device(const char *name,
64
+ hwaddr base,
65
+ hwaddr size)
66
+{
40
+{
67
+ DeviceState *dev = qdev_create(NULL, TYPE_UNIMPLEMENTED_DEVICE);
41
+ return FIELD_EX64(id->mvfr0, ID_MMFR3, PAN) != 0;
68
+
69
+ qdev_prop_set_string(dev, "name", name);
70
+ qdev_prop_set_uint64(dev, "size", size);
71
+ qdev_init_nofail(dev);
72
+
73
+ sysbus_mmio_map_overlap(SYS_BUS_DEVICE(dev), 0, base, -1000);
74
+}
42
+}
75
+
43
+
76
+#endif
44
+static inline bool isar_feature_aa32_ats1e1(const ARMISARegisters *id)
77
diff --git a/hw/misc/unimp.c b/hw/misc/unimp.c
78
new file mode 100644
79
index XXXXXXX..XXXXXXX
80
--- /dev/null
81
+++ b/hw/misc/unimp.c
82
@@ -XXX,XX +XXX,XX @@
83
+/* "Unimplemented" device
84
+ *
85
+ * This is a dummy device which accepts and logs all accesses.
86
+ * It's useful for stubbing out regions of an SoC or board
87
+ * map which correspond to devices that have not yet been
88
+ * implemented. This is often sufficient to placate initial
89
+ * guest device driver probing such that the system will
90
+ * come up.
91
+ *
92
+ * Copyright Linaro Limited, 2017
93
+ * Written by Peter Maydell
94
+ */
95
+
96
+#include "qemu/osdep.h"
97
+#include "hw/hw.h"
98
+#include "hw/sysbus.h"
99
+#include "hw/misc/unimp.h"
100
+#include "qemu/log.h"
101
+#include "qapi/error.h"
102
+
103
+#define UNIMPLEMENTED_DEVICE(obj) \
104
+ OBJECT_CHECK(UnimplementedDeviceState, (obj), TYPE_UNIMPLEMENTED_DEVICE)
105
+
106
+typedef struct {
107
+ SysBusDevice parent_obj;
108
+ MemoryRegion iomem;
109
+ char *name;
110
+ uint64_t size;
111
+} UnimplementedDeviceState;
112
+
113
+static uint64_t unimp_read(void *opaque, hwaddr offset, unsigned size)
114
+{
45
+{
115
+ UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(opaque);
46
+ return FIELD_EX64(id->mvfr0, ID_MMFR3, PAN) >= 2;
116
+
117
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read "
118
+ "(size %d, offset 0x%" HWADDR_PRIx ")\n",
119
+ s->name, size, offset);
120
+ return 0;
121
+}
47
+}
122
+
48
+
123
+static void unimp_write(void *opaque, hwaddr offset,
49
/*
124
+ uint64_t value, unsigned size)
50
* 64-bit feature tests via id registers.
51
*/
52
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_lor(const ARMISARegisters *id)
53
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, LO) != 0;
54
}
55
56
+static inline bool isar_feature_aa64_pan(const ARMISARegisters *id)
125
+{
57
+{
126
+ UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(opaque);
58
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) != 0;
127
+
128
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write "
129
+ "(size %d, value 0x%" PRIx64
130
+ ", offset 0x%" HWADDR_PRIx ")\n",
131
+ s->name, size, value, offset);
132
+}
59
+}
133
+
60
+
134
+static const MemoryRegionOps unimp_ops = {
61
+static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id)
135
+ .read = unimp_read,
136
+ .write = unimp_write,
137
+ .impl.min_access_size = 1,
138
+ .impl.max_access_size = 8,
139
+ .valid.min_access_size = 1,
140
+ .valid.max_access_size = 8,
141
+ .endianness = DEVICE_NATIVE_ENDIAN,
142
+};
143
+
144
+static void unimp_realize(DeviceState *dev, Error **errp)
145
+{
62
+{
146
+ UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(dev);
63
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2;
147
+
148
+ if (s->size == 0) {
149
+ error_setg(errp, "property 'size' not specified or zero");
150
+ return;
151
+ }
152
+
153
+ if (s->name == NULL) {
154
+ error_setg(errp, "property 'name' not specified");
155
+ return;
156
+ }
157
+
158
+ memory_region_init_io(&s->iomem, OBJECT(s), &unimp_ops, s,
159
+ s->name, s->size);
160
+ sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem);
161
+}
64
+}
162
+
65
+
163
+static Property unimp_properties[] = {
66
static inline bool isar_feature_aa64_bti(const ARMISARegisters *id)
164
+ DEFINE_PROP_UINT64("size", UnimplementedDeviceState, size, 0),
67
{
165
+ DEFINE_PROP_STRING("name", UnimplementedDeviceState, name),
68
return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0;
166
+ DEFINE_PROP_END_OF_LIST(),
167
+};
168
+
169
+static void unimp_class_init(ObjectClass *klass, void *data)
170
+{
171
+ DeviceClass *dc = DEVICE_CLASS(klass);
172
+
173
+ dc->realize = unimp_realize;
174
+ dc->props = unimp_properties;
175
+}
176
+
177
+static const TypeInfo unimp_info = {
178
+ .name = TYPE_UNIMPLEMENTED_DEVICE,
179
+ .parent = TYPE_SYS_BUS_DEVICE,
180
+ .instance_size = sizeof(UnimplementedDeviceState),
181
+ .class_init = unimp_class_init,
182
+};
183
+
184
+static void unimp_register_types(void)
185
+{
186
+ type_register_static(&unimp_info);
187
+}
188
+
189
+type_init(unimp_register_types)
190
--
69
--
191
2.7.4
70
2.20.1
192
71
193
72
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
For static const regdefs, file scope is preferred.
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20200208125816.14954-5-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/helper.c | 57 +++++++++++++++++++++++----------------------
11
1 file changed, 29 insertions(+), 28 deletions(-)
12
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
16
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_lor_other(CPUARMState *env,
18
return access_lor_ns(env);
19
}
20
21
+/*
22
+ * A trivial implementation of ARMv8.1-LOR leaves all of these
23
+ * registers fixed at 0, which indicates that there are zero
24
+ * supported Limited Ordering regions.
25
+ */
26
+static const ARMCPRegInfo lor_reginfo[] = {
27
+ { .name = "LORSA_EL1", .state = ARM_CP_STATE_AA64,
28
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 0,
29
+ .access = PL1_RW, .accessfn = access_lor_other,
30
+ .type = ARM_CP_CONST, .resetvalue = 0 },
31
+ { .name = "LOREA_EL1", .state = ARM_CP_STATE_AA64,
32
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 1,
33
+ .access = PL1_RW, .accessfn = access_lor_other,
34
+ .type = ARM_CP_CONST, .resetvalue = 0 },
35
+ { .name = "LORN_EL1", .state = ARM_CP_STATE_AA64,
36
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 2,
37
+ .access = PL1_RW, .accessfn = access_lor_other,
38
+ .type = ARM_CP_CONST, .resetvalue = 0 },
39
+ { .name = "LORC_EL1", .state = ARM_CP_STATE_AA64,
40
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 3,
41
+ .access = PL1_RW, .accessfn = access_lor_other,
42
+ .type = ARM_CP_CONST, .resetvalue = 0 },
43
+ { .name = "LORID_EL1", .state = ARM_CP_STATE_AA64,
44
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 7,
45
+ .access = PL1_R, .accessfn = access_lorid,
46
+ .type = ARM_CP_CONST, .resetvalue = 0 },
47
+ REGINFO_SENTINEL
48
+};
49
+
50
#ifdef TARGET_AARCH64
51
static CPAccessResult access_pauth(CPUARMState *env, const ARMCPRegInfo *ri,
52
bool isread)
53
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
54
}
55
56
if (cpu_isar_feature(aa64_lor, cpu)) {
57
- /*
58
- * A trivial implementation of ARMv8.1-LOR leaves all of these
59
- * registers fixed at 0, which indicates that there are zero
60
- * supported Limited Ordering regions.
61
- */
62
- static const ARMCPRegInfo lor_reginfo[] = {
63
- { .name = "LORSA_EL1", .state = ARM_CP_STATE_AA64,
64
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 0,
65
- .access = PL1_RW, .accessfn = access_lor_other,
66
- .type = ARM_CP_CONST, .resetvalue = 0 },
67
- { .name = "LOREA_EL1", .state = ARM_CP_STATE_AA64,
68
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 1,
69
- .access = PL1_RW, .accessfn = access_lor_other,
70
- .type = ARM_CP_CONST, .resetvalue = 0 },
71
- { .name = "LORN_EL1", .state = ARM_CP_STATE_AA64,
72
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 2,
73
- .access = PL1_RW, .accessfn = access_lor_other,
74
- .type = ARM_CP_CONST, .resetvalue = 0 },
75
- { .name = "LORC_EL1", .state = ARM_CP_STATE_AA64,
76
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 3,
77
- .access = PL1_RW, .accessfn = access_lor_other,
78
- .type = ARM_CP_CONST, .resetvalue = 0 },
79
- { .name = "LORID_EL1", .state = ARM_CP_STATE_AA64,
80
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 7,
81
- .access = PL1_R, .accessfn = access_lorid,
82
- .type = ARM_CP_CONST, .resetvalue = 0 },
83
- REGINFO_SENTINEL
84
- };
85
define_arm_cp_regs(cpu, lor_reginfo);
86
}
87
88
--
89
2.20.1
90
91
diff view generated by jsdifflib
1
In the ARM ldr/str decode path, rather than directly testing
1
From: Richard Henderson <richard.henderson@linaro.org>
2
"insn & (1 << 21)" and "insn & (1 << 24)", abstract these
3
bits out into wbit and pbit local flags. (We will want to
4
do more tests against them to determine whether we need to
5
provide syndrome information.)
6
2
3
Split this helper out of msr_mask in translate.c. At the same time,
4
transform the negative reductive logic to positive accumulative logic.
5
It will be usable along the exception paths.
6
7
While touching msr_mask, fix up formatting.
8
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20200208125816.14954-6-richard.henderson@linaro.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
---
13
---
10
target/arm/translate.c | 9 ++++++---
14
target/arm/internals.h | 21 +++++++++++++++++++++
11
1 file changed, 6 insertions(+), 3 deletions(-)
15
target/arm/translate.c | 40 +++++++++++++++++-----------------------
16
2 files changed, 38 insertions(+), 23 deletions(-)
12
17
18
diff --git a/target/arm/internals.h b/target/arm/internals.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/internals.h
21
+++ b/target/arm/internals.h
22
@@ -XXX,XX +XXX,XX @@ static inline bool arm_mmu_idx_is_stage1_of_2(ARMMMUIdx mmu_idx)
23
}
24
}
25
26
+static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
27
+ const ARMISARegisters *id)
28
+{
29
+ uint32_t valid = CPSR_M | CPSR_AIF | CPSR_IL | CPSR_NZCV | CPSR_J;
30
+
31
+ if ((features >> ARM_FEATURE_V4T) & 1) {
32
+ valid |= CPSR_T;
33
+ }
34
+ if ((features >> ARM_FEATURE_V5) & 1) {
35
+ valid |= CPSR_Q; /* V5TE in reality*/
36
+ }
37
+ if ((features >> ARM_FEATURE_V6) & 1) {
38
+ valid |= CPSR_E | CPSR_GE;
39
+ }
40
+ if ((features >> ARM_FEATURE_THUMB2) & 1) {
41
+ valid |= CPSR_IT;
42
+ }
43
+
44
+ return valid;
45
+}
46
+
47
/*
48
* Parameters of a given virtual address, as extracted from the
49
* translation control register (TCR) for a given regime.
13
diff --git a/target/arm/translate.c b/target/arm/translate.c
50
diff --git a/target/arm/translate.c b/target/arm/translate.c
14
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.c
52
--- a/target/arm/translate.c
16
+++ b/target/arm/translate.c
53
+++ b/target/arm/translate.c
17
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
54
@@ -XXX,XX +XXX,XX @@ static inline void gen_mulxy(TCGv_i32 t0, TCGv_i32 t1, int x, int y)
18
} else {
55
/* Return the mask of PSR bits set by a MSR instruction. */
19
int address_offset;
56
static uint32_t msr_mask(DisasContext *s, int flags, int spsr)
20
bool load = insn & (1 << 20);
57
{
21
+ bool wbit = insn & (1 << 21);
58
- uint32_t mask;
22
+ bool pbit = insn & (1 << 24);
59
+ uint32_t mask = 0;
23
bool doubleword = false;
60
24
/* Misc load/store */
61
- mask = 0;
25
rn = (insn >> 16) & 0xf;
62
- if (flags & (1 << 0))
26
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
63
+ if (flags & (1 << 0)) {
27
}
64
mask |= 0xff;
28
65
- if (flags & (1 << 1))
29
addr = load_reg(s, rn);
66
+ }
30
- if (insn & (1 << 24))
67
+ if (flags & (1 << 1)) {
31
+ if (pbit) {
68
mask |= 0xff00;
32
gen_add_datah_offset(s, insn, 0, addr);
69
- if (flags & (1 << 2))
33
+ }
70
+ }
34
address_offset = 0;
71
+ if (flags & (1 << 2)) {
35
72
mask |= 0xff0000;
36
if (doubleword) {
73
- if (flags & (1 << 3))
37
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
74
+ }
38
ensure correct behavior with overlapping index registers.
75
+ if (flags & (1 << 3)) {
39
ldrd with base writeback is undefined if the
76
mask |= 0xff000000;
40
destination and index registers overlap. */
77
+ }
41
- if (!(insn & (1 << 24))) {
78
42
+ if (!pbit) {
79
- /* Mask out undefined bits. */
43
gen_add_datah_offset(s, insn, address_offset, addr);
80
- mask &= ~CPSR_RESERVED;
44
store_reg(s, rn, addr);
81
- if (!arm_dc_feature(s, ARM_FEATURE_V4T)) {
45
- } else if (insn & (1 << 21)) {
82
- mask &= ~CPSR_T;
46
+ } else if (wbit) {
83
- }
47
if (address_offset)
84
- if (!arm_dc_feature(s, ARM_FEATURE_V5)) {
48
tcg_gen_addi_i32(addr, addr, address_offset);
85
- mask &= ~CPSR_Q; /* V5TE in reality*/
49
store_reg(s, rn, addr);
86
- }
87
- if (!arm_dc_feature(s, ARM_FEATURE_V6)) {
88
- mask &= ~(CPSR_E | CPSR_GE);
89
- }
90
- if (!arm_dc_feature(s, ARM_FEATURE_THUMB2)) {
91
- mask &= ~CPSR_IT;
92
- }
93
- /* Mask out execution state and reserved bits. */
94
+ /* Mask out undefined and reserved bits. */
95
+ mask &= aarch32_cpsr_valid_mask(s->features, s->isar);
96
+
97
+ /* Mask out execution state. */
98
if (!spsr) {
99
- mask &= ~(CPSR_EXEC | CPSR_RESERVED);
100
+ mask &= ~CPSR_EXEC;
101
}
102
+
103
/* Mask out privileged bits. */
104
- if (IS_USER(s))
105
+ if (IS_USER(s)) {
106
mask &= CPSR_USER;
107
+ }
108
return mask;
109
}
110
50
--
111
--
51
2.7.4
112
2.20.1
52
113
53
114
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
The J bit signals Jazelle mode, and so of course is RES0
4
when the feature is not enabled.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20200208125816.14954-7-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/internals.h | 5 ++++-
12
1 file changed, 4 insertions(+), 1 deletion(-)
13
14
diff --git a/target/arm/internals.h b/target/arm/internals.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/internals.h
17
+++ b/target/arm/internals.h
18
@@ -XXX,XX +XXX,XX @@ static inline bool arm_mmu_idx_is_stage1_of_2(ARMMMUIdx mmu_idx)
19
static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
20
const ARMISARegisters *id)
21
{
22
- uint32_t valid = CPSR_M | CPSR_AIF | CPSR_IL | CPSR_NZCV | CPSR_J;
23
+ uint32_t valid = CPSR_M | CPSR_AIF | CPSR_IL | CPSR_NZCV;
24
25
if ((features >> ARM_FEATURE_V4T) & 1) {
26
valid |= CPSR_T;
27
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
28
if ((features >> ARM_FEATURE_THUMB2) & 1) {
29
valid |= CPSR_IT;
30
}
31
+ if (isar_feature_jazelle(id)) {
32
+ valid |= CPSR_J;
33
+ }
34
35
return valid;
36
}
37
--
38
2.20.1
39
40
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
CPSR_ERET_MASK was a useless renaming of CPSR_RESERVED.
4
The function also takes into account bits that the cpu
5
does not support.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-8-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 2 --
13
target/arm/op_helper.c | 5 ++++-
14
2 files changed, 4 insertions(+), 3 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 @@ void pmu_init(ARMCPU *cpu);
21
#define CPSR_USER (CPSR_NZCV | CPSR_Q | CPSR_GE)
22
/* Execution state bits. MRS read as zero, MSR writes ignored. */
23
#define CPSR_EXEC (CPSR_T | CPSR_IT | CPSR_J | CPSR_IL)
24
-/* Mask of bits which may be set by exception return copying them from SPSR */
25
-#define CPSR_ERET_MASK (~CPSR_RESERVED)
26
27
/* Bit definitions for M profile XPSR. Most are the same as CPSR. */
28
#define XPSR_EXCP 0x1ffU
29
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/op_helper.c
32
+++ b/target/arm/op_helper.c
33
@@ -XXX,XX +XXX,XX @@ void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask)
34
/* Write the CPSR for a 32-bit exception return */
35
void HELPER(cpsr_write_eret)(CPUARMState *env, uint32_t val)
36
{
37
+ uint32_t mask;
38
+
39
qemu_mutex_lock_iothread();
40
arm_call_pre_el_change_hook(env_archcpu(env));
41
qemu_mutex_unlock_iothread();
42
43
- cpsr_write(env, val, CPSR_ERET_MASK, CPSRWriteExceptionReturn);
44
+ mask = aarch32_cpsr_valid_mask(env->features, &env_archcpu(env)->isar);
45
+ cpsr_write(env, val, mask, CPSRWriteExceptionReturn);
46
47
/* Generated code has already stored the new PC value, but
48
* without masking out its low bits, because which bits need
49
--
50
2.20.1
51
52
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Using ~0 as the mask on the aarch64->aarch32 exception return
4
was not even as correct as the CPSR_ERET_MASK that we had used
5
on the aarch32->aarch32 exception return.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-9-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/helper-a64.c | 5 +++--
13
1 file changed, 3 insertions(+), 2 deletions(-)
14
15
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.c
18
+++ b/target/arm/helper-a64.c
19
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
20
{
21
int cur_el = arm_current_el(env);
22
unsigned int spsr_idx = aarch64_banked_spsr_index(cur_el);
23
- uint32_t spsr = env->banked_spsr[spsr_idx];
24
+ uint32_t mask, spsr = env->banked_spsr[spsr_idx];
25
int new_el;
26
bool return_to_aa64 = (spsr & PSTATE_nRW) == 0;
27
28
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
29
* will sort the register banks out for us, and we've already
30
* caught all the bad-mode cases in el_from_spsr().
31
*/
32
- cpsr_write(env, spsr, ~0, CPSRWriteRaw);
33
+ mask = aarch32_cpsr_valid_mask(env->features, &env_archcpu(env)->isar);
34
+ cpsr_write(env, spsr, mask, CPSRWriteRaw);
35
if (!arm_singlestep_active(env)) {
36
env->uncached_cpsr &= ~PSTATE_SS;
37
}
38
--
39
2.20.1
40
41
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
The only remaining use was in op_helper.c. Use PSTATE_SS
4
directly, and move the commentary so that it is more obvious
5
what is going on.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20200208125816.14954-10-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 6 ------
13
target/arm/op_helper.c | 9 ++++++++-
14
2 files changed, 8 insertions(+), 7 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 @@ void pmu_init(ARMCPU *cpu);
21
#define CPSR_IT_2_7 (0xfc00U)
22
#define CPSR_GE (0xfU << 16)
23
#define CPSR_IL (1U << 20)
24
-/* Note that the RESERVED bits include bit 21, which is PSTATE_SS in
25
- * an AArch64 SPSR but RES0 in AArch32 SPSR and CPSR. In QEMU we use
26
- * env->uncached_cpsr bit 21 to store PSTATE.SS when executing in AArch32,
27
- * where it is live state but not accessible to the AArch32 code.
28
- */
29
-#define CPSR_RESERVED (0x7U << 21)
30
#define CPSR_J (1U << 24)
31
#define CPSR_IT_0_1 (3U << 25)
32
#define CPSR_Q (1U << 27)
33
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/op_helper.c
36
+++ b/target/arm/op_helper.c
37
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_bkpt_insn)(CPUARMState *env, uint32_t syndrome)
38
39
uint32_t HELPER(cpsr_read)(CPUARMState *env)
40
{
41
- return cpsr_read(env) & ~(CPSR_EXEC | CPSR_RESERVED);
42
+ /*
43
+ * We store the ARMv8 PSTATE.SS bit in env->uncached_cpsr.
44
+ * This is convenient for populating SPSR_ELx, but must be
45
+ * hidden from aarch32 mode, where it is not visible.
46
+ *
47
+ * TODO: ARMv8.4-DIT -- need to move SS somewhere else.
48
+ */
49
+ return cpsr_read(env) & ~(CPSR_EXEC | PSTATE_SS);
50
}
51
52
void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask)
53
--
54
2.20.1
55
56
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Use this along the exception return path, where we previously
4
accepted any values.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200208125816.14954-11-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/internals.h | 12 ++++++++++++
12
target/arm/helper-a64.c | 1 +
13
2 files changed, 13 insertions(+)
14
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/internals.h
18
+++ b/target/arm/internals.h
19
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
20
return valid;
21
}
22
23
+static inline uint32_t aarch64_pstate_valid_mask(const ARMISARegisters *id)
24
+{
25
+ uint32_t valid;
26
+
27
+ valid = PSTATE_M | PSTATE_DAIF | PSTATE_IL | PSTATE_SS | PSTATE_NZCV;
28
+ if (isar_feature_aa64_bti(id)) {
29
+ valid |= PSTATE_BTYPE;
30
+ }
31
+
32
+ return valid;
33
+}
34
+
35
/*
36
* Parameters of a given virtual address, as extracted from the
37
* translation control register (TCR) for a given regime.
38
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/helper-a64.c
41
+++ b/target/arm/helper-a64.c
42
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
43
cur_el, new_el, env->regs[15]);
44
} else {
45
env->aarch64 = 1;
46
+ spsr &= aarch64_pstate_valid_mask(&env_archcpu(env)->isar);
47
pstate_write(env, spsr);
48
if (!arm_singlestep_active(env)) {
49
env->pstate &= ~PSTATE_SS;
50
--
51
2.20.1
52
53
diff view generated by jsdifflib
1
From: Julian Brown <julian@codesourcery.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
In BE32 mode, sub-word size watchpoints can fail to trigger because the
3
For aarch64, there's a dedicated msr (imm, reg) insn.
4
address of the access is adjusted in the opcode helpers before being
4
For aarch32, this is done via msr to cpsr. Writes from el0
5
compared with the watchpoint registers. This patch reverses the address
5
are ignored, which is already handled by the CPSR_USER mask.
6
adjustment before performing the comparison with the help of a new CPUClass
7
hook.
8
6
9
This version of the patch augments and tidies up comments a little.
10
11
Signed-off-by: Julian Brown <julian@codesourcery.com>
12
Message-id: caaf64ffc72f6ae183015337b7afdbd4b8989cb6.1484929304.git.julian@codesourcery.com
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-12-richard.henderson@linaro.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
11
---
16
include/qom/cpu.h | 3 +++
12
target/arm/cpu.h | 2 ++
17
target/arm/internals.h | 5 +++++
13
target/arm/internals.h | 6 ++++++
18
exec.c | 1 +
14
target/arm/helper.c | 21 +++++++++++++++++++++
19
qom/cpu.c | 6 ++++++
15
target/arm/translate-a64.c | 14 ++++++++++++++
20
target/arm/cpu.c | 3 +++
16
4 files changed, 43 insertions(+)
21
target/arm/op_helper.c | 22 ++++++++++++++++++++++
22
6 files changed, 40 insertions(+)
23
17
24
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
25
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
26
--- a/include/qom/cpu.h
20
--- a/target/arm/cpu.h
27
+++ b/include/qom/cpu.h
21
+++ b/target/arm/cpu.h
28
@@ -XXX,XX +XXX,XX @@ struct TranslationBlock;
22
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
29
* @cpu_exec_exit: Callback for cpu_exec cleanup.
23
#define CPSR_IT_2_7 (0xfc00U)
30
* @cpu_exec_interrupt: Callback for processing interrupts in cpu_exec.
24
#define CPSR_GE (0xfU << 16)
31
* @disas_set_info: Setup architecture specific components of disassembly info
25
#define CPSR_IL (1U << 20)
32
+ * @adjust_watchpoint_address: Perform a target-specific adjustment to an
26
+#define CPSR_PAN (1U << 22)
33
+ * address before attempting to match it against watchpoints.
27
#define CPSR_J (1U << 24)
34
*
28
#define CPSR_IT_0_1 (3U << 25)
35
* Represents a CPU family or model.
29
#define CPSR_Q (1U << 27)
36
*/
30
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
37
@@ -XXX,XX +XXX,XX @@ typedef struct CPUClass {
31
#define PSTATE_BTYPE (3U << 10)
38
bool (*cpu_exec_interrupt)(CPUState *cpu, int interrupt_request);
32
#define PSTATE_IL (1U << 20)
39
33
#define PSTATE_SS (1U << 21)
40
void (*disas_set_info)(CPUState *cpu, disassemble_info *info);
34
+#define PSTATE_PAN (1U << 22)
41
+ vaddr (*adjust_watchpoint_address)(CPUState *cpu, vaddr addr, int len);
35
#define PSTATE_V (1U << 28)
42
} CPUClass;
36
#define PSTATE_C (1U << 29)
43
37
#define PSTATE_Z (1U << 30)
44
#ifdef HOST_WORDS_BIGENDIAN
45
diff --git a/target/arm/internals.h b/target/arm/internals.h
38
diff --git a/target/arm/internals.h b/target/arm/internals.h
46
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
47
--- a/target/arm/internals.h
40
--- a/target/arm/internals.h
48
+++ b/target/arm/internals.h
41
+++ b/target/arm/internals.h
49
@@ -XXX,XX +XXX,XX @@ void hw_breakpoint_update_all(ARMCPU *cpu);
42
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch32_cpsr_valid_mask(uint64_t features,
50
/* Callback function for checking if a watchpoint should trigger. */
43
if (isar_feature_jazelle(id)) {
51
bool arm_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp);
44
valid |= CPSR_J;
52
45
}
53
+/* Adjust addresses (in BE32 mode) before testing against watchpoint
46
+ if (isar_feature_aa32_pan(id)) {
54
+ * addresses.
47
+ valid |= CPSR_PAN;
55
+ */
48
+ }
56
+vaddr arm_adjust_watchpoint_address(CPUState *cs, vaddr addr, int len);
49
57
+
50
return valid;
58
/* Callback function for when a watchpoint or breakpoint triggers. */
51
}
59
void arm_debug_excp_handler(CPUState *cs);
52
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch64_pstate_valid_mask(const ARMISARegisters *id)
60
53
if (isar_feature_aa64_bti(id)) {
61
diff --git a/exec.c b/exec.c
54
valid |= PSTATE_BTYPE;
55
}
56
+ if (isar_feature_aa64_pan(id)) {
57
+ valid |= PSTATE_PAN;
58
+ }
59
60
return valid;
61
}
62
diff --git a/target/arm/helper.c b/target/arm/helper.c
62
index XXXXXXX..XXXXXXX 100644
63
index XXXXXXX..XXXXXXX 100644
63
--- a/exec.c
64
--- a/target/arm/helper.c
64
+++ b/exec.c
65
+++ b/target/arm/helper.c
65
@@ -XXX,XX +XXX,XX @@ static void check_watchpoint(int offset, int len, MemTxAttrs attrs, int flags)
66
@@ -XXX,XX +XXX,XX @@ static void aa64_daif_write(CPUARMState *env, const ARMCPRegInfo *ri,
66
return;
67
env->daif = value & PSTATE_DAIF;
67
}
68
vaddr = (cpu->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
69
+ vaddr = cc->adjust_watchpoint_address(cpu, vaddr, len);
70
QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
71
if (cpu_watchpoint_address_matches(wp, vaddr, len)
72
&& (wp->flags & flags)) {
73
diff --git a/qom/cpu.c b/qom/cpu.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/qom/cpu.c
76
+++ b/qom/cpu.c
77
@@ -XXX,XX +XXX,XX @@ static int64_t cpu_common_get_arch_id(CPUState *cpu)
78
return cpu->cpu_index;
79
}
68
}
80
69
81
+static vaddr cpu_adjust_watchpoint_address(CPUState *cpu, vaddr addr, int len)
70
+static uint64_t aa64_pan_read(CPUARMState *env, const ARMCPRegInfo *ri)
82
+{
71
+{
83
+ return addr;
72
+ return env->pstate & PSTATE_PAN;
84
+}
73
+}
85
+
74
+
86
static void cpu_class_init(ObjectClass *klass, void *data)
75
+static void aa64_pan_write(CPUARMState *env, const ARMCPRegInfo *ri,
87
{
76
+ uint64_t value)
88
DeviceClass *dc = DEVICE_CLASS(klass);
89
@@ -XXX,XX +XXX,XX @@ static void cpu_class_init(ObjectClass *klass, void *data)
90
k->cpu_exec_enter = cpu_common_noop;
91
k->cpu_exec_exit = cpu_common_noop;
92
k->cpu_exec_interrupt = cpu_common_exec_interrupt;
93
+ k->adjust_watchpoint_address = cpu_adjust_watchpoint_address;
94
set_bit(DEVICE_CATEGORY_CPU, dc->categories);
95
dc->realize = cpu_common_realizefn;
96
dc->unrealize = cpu_common_unrealizefn;
97
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
98
index XXXXXXX..XXXXXXX 100644
99
--- a/target/arm/cpu.c
100
+++ b/target/arm/cpu.c
101
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
102
cc->gdb_stop_before_watchpoint = true;
103
cc->debug_excp_handler = arm_debug_excp_handler;
104
cc->debug_check_watchpoint = arm_debug_check_watchpoint;
105
+#if !defined(CONFIG_USER_ONLY)
106
+ cc->adjust_watchpoint_address = arm_adjust_watchpoint_address;
107
+#endif
108
109
cc->disas_set_info = arm_disas_set_info;
110
}
111
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
112
index XXXXXXX..XXXXXXX 100644
113
--- a/target/arm/op_helper.c
114
+++ b/target/arm/op_helper.c
115
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp)
116
return check_watchpoints(cpu);
117
}
118
119
+vaddr arm_adjust_watchpoint_address(CPUState *cs, vaddr addr, int len)
120
+{
77
+{
121
+ ARMCPU *cpu = ARM_CPU(cs);
78
+ env->pstate = (env->pstate & ~PSTATE_PAN) | (value & PSTATE_PAN);
122
+ CPUARMState *env = &cpu->env;
123
+
124
+ /* In BE32 system mode, target memory is stored byteswapped (on a
125
+ * little-endian host system), and by the time we reach here (via an
126
+ * opcode helper) the addresses of subword accesses have been adjusted
127
+ * to account for that, which means that watchpoints will not match.
128
+ * Undo the adjustment here.
129
+ */
130
+ if (arm_sctlr_b(env)) {
131
+ if (len == 1) {
132
+ addr ^= 3;
133
+ } else if (len == 2) {
134
+ addr ^= 2;
135
+ }
136
+ }
137
+
138
+ return addr;
139
+}
79
+}
140
+
80
+
141
void arm_debug_excp_handler(CPUState *cs)
81
+static const ARMCPRegInfo pan_reginfo = {
142
{
82
+ .name = "PAN", .state = ARM_CP_STATE_AA64,
143
/* Called by core code when a watchpoint or breakpoint fires;
83
+ .opc0 = 3, .opc1 = 0, .crn = 4, .crm = 2, .opc2 = 3,
84
+ .type = ARM_CP_NO_RAW, .access = PL1_RW,
85
+ .readfn = aa64_pan_read, .writefn = aa64_pan_write
86
+};
87
+
88
static CPAccessResult aa64_cacheop_access(CPUARMState *env,
89
const ARMCPRegInfo *ri,
90
bool isread)
91
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
92
if (cpu_isar_feature(aa64_lor, cpu)) {
93
define_arm_cp_regs(cpu, lor_reginfo);
94
}
95
+ if (cpu_isar_feature(aa64_pan, cpu)) {
96
+ define_one_arm_cp_reg(cpu, &pan_reginfo);
97
+ }
98
99
if (arm_feature(env, ARM_FEATURE_EL2) && cpu_isar_feature(aa64_vh, cpu)) {
100
define_arm_cp_regs(cpu, vhe_reginfo);
101
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
102
index XXXXXXX..XXXXXXX 100644
103
--- a/target/arm/translate-a64.c
104
+++ b/target/arm/translate-a64.c
105
@@ -XXX,XX +XXX,XX @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
106
s->base.is_jmp = DISAS_NEXT;
107
break;
108
109
+ case 0x04: /* PAN */
110
+ if (!dc_isar_feature(aa64_pan, s) || s->current_el == 0) {
111
+ goto do_unallocated;
112
+ }
113
+ if (crm & 1) {
114
+ set_pstate_bits(PSTATE_PAN);
115
+ } else {
116
+ clear_pstate_bits(PSTATE_PAN);
117
+ }
118
+ t1 = tcg_const_i32(s->current_el);
119
+ gen_helper_rebuild_hflags_a64(cpu_env, t1);
120
+ tcg_temp_free_i32(t1);
121
+ break;
122
+
123
case 0x05: /* SPSel */
124
if (s->current_el == 0) {
125
goto do_unallocated;
144
--
126
--
145
2.7.4
127
2.20.1
146
128
147
129
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Examine the PAN bit for EL1, EL2, and Secure EL1 to
4
determine if it applies.
5
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-13-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/helper.c | 9 +++++++++
13
1 file changed, 9 insertions(+)
14
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
18
+++ b/target/arm/helper.c
19
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_mmu_idx_el(CPUARMState *env, int el)
20
return ARMMMUIdx_E10_0;
21
case 1:
22
if (arm_is_secure_below_el3(env)) {
23
+ if (env->pstate & PSTATE_PAN) {
24
+ return ARMMMUIdx_SE10_1_PAN;
25
+ }
26
return ARMMMUIdx_SE10_1;
27
}
28
+ if (env->pstate & PSTATE_PAN) {
29
+ return ARMMMUIdx_E10_1_PAN;
30
+ }
31
return ARMMMUIdx_E10_1;
32
case 2:
33
/* TODO: ARMv8.4-SecEL2 */
34
/* Note that TGE does not apply at EL2. */
35
if ((env->cp15.hcr_el2 & HCR_E2H) && arm_el_is_aa64(env, 2)) {
36
+ if (env->pstate & PSTATE_PAN) {
37
+ return ARMMMUIdx_E20_2_PAN;
38
+ }
39
return ARMMMUIdx_E20_2;
40
}
41
return ARMMMUIdx_E2;
42
--
43
2.20.1
44
45
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
If we have a PAN-enforcing mmu_idx, set prot == 0 if user_rw != 0.
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200208125816.14954-14-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/internals.h | 13 +++++++++++++
12
target/arm/helper.c | 3 +++
13
2 files changed, 16 insertions(+)
14
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/internals.h
18
+++ b/target/arm/internals.h
19
@@ -XXX,XX +XXX,XX @@ static inline bool regime_is_secure(CPUARMState *env, ARMMMUIdx mmu_idx)
20
}
21
}
22
23
+static inline bool regime_is_pan(CPUARMState *env, ARMMMUIdx mmu_idx)
24
+{
25
+ switch (mmu_idx) {
26
+ case ARMMMUIdx_Stage1_E1_PAN:
27
+ case ARMMMUIdx_E10_1_PAN:
28
+ case ARMMMUIdx_E20_2_PAN:
29
+ case ARMMMUIdx_SE10_1_PAN:
30
+ return true;
31
+ default:
32
+ return false;
33
+ }
34
+}
35
+
36
/* Return the FSR value for a debug exception (watchpoint, hardware
37
* breakpoint or BKPT insn) targeting the specified exception level.
38
*/
39
diff --git a/target/arm/helper.c b/target/arm/helper.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/helper.c
42
+++ b/target/arm/helper.c
43
@@ -XXX,XX +XXX,XX @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
44
if (is_user) {
45
prot_rw = user_rw;
46
} else {
47
+ if (user_rw && regime_is_pan(env, mmu_idx)) {
48
+ return 0;
49
+ }
50
prot_rw = simple_ap_to_rw_prot_is_user(ap, false);
51
}
52
53
--
54
2.20.1
55
56
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
The PAN bit is preserved, or set as per SCTLR_ELx.SPAN,
4
plus several other conditions listed in the ARM ARM.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20200208125816.14954-15-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.c | 53 ++++++++++++++++++++++++++++++++++++++++++---
12
1 file changed, 50 insertions(+), 3 deletions(-)
13
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ static void take_aarch32_exception(CPUARMState *env, int new_mode,
19
uint32_t mask, uint32_t offset,
20
uint32_t newpc)
21
{
22
+ int new_el;
23
+
24
/* Change the CPU state so as to actually take the exception. */
25
switch_mode(env, new_mode);
26
+ new_el = arm_current_el(env);
27
+
28
/*
29
* For exceptions taken to AArch32 we must clear the SS bit in both
30
* PSTATE and in the old-state value we save to SPSR_<mode>, so zero it now.
31
@@ -XXX,XX +XXX,XX @@ static void take_aarch32_exception(CPUARMState *env, int new_mode,
32
env->uncached_cpsr = (env->uncached_cpsr & ~CPSR_M) | new_mode;
33
/* Set new mode endianness */
34
env->uncached_cpsr &= ~CPSR_E;
35
- if (env->cp15.sctlr_el[arm_current_el(env)] & SCTLR_EE) {
36
+ if (env->cp15.sctlr_el[new_el] & SCTLR_EE) {
37
env->uncached_cpsr |= CPSR_E;
38
}
39
/* J and IL must always be cleared for exception entry */
40
@@ -XXX,XX +XXX,XX @@ static void take_aarch32_exception(CPUARMState *env, int new_mode,
41
env->thumb = (env->cp15.sctlr_el[2] & SCTLR_TE) != 0;
42
env->elr_el[2] = env->regs[15];
43
} else {
44
+ /* CPSR.PAN is normally preserved preserved unless... */
45
+ if (cpu_isar_feature(aa64_pan, env_archcpu(env))) {
46
+ switch (new_el) {
47
+ case 3:
48
+ if (!arm_is_secure_below_el3(env)) {
49
+ /* ... the target is EL3, from non-secure state. */
50
+ env->uncached_cpsr &= ~CPSR_PAN;
51
+ break;
52
+ }
53
+ /* ... the target is EL3, from secure state ... */
54
+ /* fall through */
55
+ case 1:
56
+ /* ... the target is EL1 and SCTLR.SPAN is 0. */
57
+ if (!(env->cp15.sctlr_el[new_el] & SCTLR_SPAN)) {
58
+ env->uncached_cpsr |= CPSR_PAN;
59
+ }
60
+ break;
61
+ }
62
+ }
63
/*
64
* this is a lie, as there was no c1_sys on V4T/V5, but who cares
65
* and we should just guard the thumb mode on V4
66
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
67
unsigned int new_el = env->exception.target_el;
68
target_ulong addr = env->cp15.vbar_el[new_el];
69
unsigned int new_mode = aarch64_pstate_mode(new_el, true);
70
+ unsigned int old_mode;
71
unsigned int cur_el = arm_current_el(env);
72
73
/*
74
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
75
}
76
77
if (is_a64(env)) {
78
- env->banked_spsr[aarch64_banked_spsr_index(new_el)] = pstate_read(env);
79
+ old_mode = pstate_read(env);
80
aarch64_save_sp(env, arm_current_el(env));
81
env->elr_el[new_el] = env->pc;
82
} else {
83
- env->banked_spsr[aarch64_banked_spsr_index(new_el)] = cpsr_read(env);
84
+ old_mode = cpsr_read(env);
85
env->elr_el[new_el] = env->regs[15];
86
87
aarch64_sync_32_to_64(env);
88
89
env->condexec_bits = 0;
90
}
91
+ env->banked_spsr[aarch64_banked_spsr_index(new_el)] = old_mode;
92
+
93
qemu_log_mask(CPU_LOG_INT, "...with ELR 0x%" PRIx64 "\n",
94
env->elr_el[new_el]);
95
96
+ if (cpu_isar_feature(aa64_pan, cpu)) {
97
+ /* The value of PSTATE.PAN is normally preserved, except when ... */
98
+ new_mode |= old_mode & PSTATE_PAN;
99
+ switch (new_el) {
100
+ case 2:
101
+ /* ... the target is EL2 with HCR_EL2.{E2H,TGE} == '11' ... */
102
+ if ((arm_hcr_el2_eff(env) & (HCR_E2H | HCR_TGE))
103
+ != (HCR_E2H | HCR_TGE)) {
104
+ break;
105
+ }
106
+ /* fall through */
107
+ case 1:
108
+ /* ... the target is EL1 ... */
109
+ /* ... and SCTLR_ELx.SPAN == 0, then set to 1. */
110
+ if ((env->cp15.sctlr_el[new_el] & SCTLR_SPAN) == 0) {
111
+ new_mode |= PSTATE_PAN;
112
+ }
113
+ break;
114
+ }
115
+ }
116
+
117
pstate_write(env, PSTATE_DAIF | new_mode);
118
env->aarch64 = 1;
119
aarch64_restore_sp(env, new_el);
120
--
121
2.20.1
122
123
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
This is a minor enhancement over ARMv8.1-PAN.
4
The *_PAN mmu_idx are used with the existing do_ats_write.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200208125816.14954-16-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.c | 56 ++++++++++++++++++++++++++++++++++++++++-----
12
1 file changed, 50 insertions(+), 6 deletions(-)
13
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
19
20
switch (ri->opc2 & 6) {
21
case 0:
22
- /* stage 1 current state PL1: ATS1CPR, ATS1CPW */
23
+ /* stage 1 current state PL1: ATS1CPR, ATS1CPW, ATS1CPRP, ATS1CPWP */
24
switch (el) {
25
case 3:
26
mmu_idx = ARMMMUIdx_SE3;
27
break;
28
case 2:
29
- mmu_idx = ARMMMUIdx_Stage1_E1;
30
- break;
31
+ g_assert(!secure); /* TODO: ARMv8.4-SecEL2 */
32
+ /* fall through */
33
case 1:
34
- mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
35
+ if (ri->crm == 9 && (env->uncached_cpsr & CPSR_PAN)) {
36
+ mmu_idx = (secure ? ARMMMUIdx_SE10_1_PAN
37
+ : ARMMMUIdx_Stage1_E1_PAN);
38
+ } else {
39
+ mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
40
+ }
41
break;
42
default:
43
g_assert_not_reached();
44
@@ -XXX,XX +XXX,XX @@ static void ats_write64(CPUARMState *env, const ARMCPRegInfo *ri,
45
switch (ri->opc2 & 6) {
46
case 0:
47
switch (ri->opc1) {
48
- case 0: /* AT S1E1R, AT S1E1W */
49
- mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
50
+ case 0: /* AT S1E1R, AT S1E1W, AT S1E1RP, AT S1E1WP */
51
+ if (ri->crm == 9 && (env->pstate & PSTATE_PAN)) {
52
+ mmu_idx = (secure ? ARMMMUIdx_SE10_1_PAN
53
+ : ARMMMUIdx_Stage1_E1_PAN);
54
+ } else {
55
+ mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
56
+ }
57
break;
58
case 4: /* AT S1E2R, AT S1E2W */
59
mmu_idx = ARMMMUIdx_E2;
60
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vhe_reginfo[] = {
61
REGINFO_SENTINEL
62
};
63
64
+#ifndef CONFIG_USER_ONLY
65
+static const ARMCPRegInfo ats1e1_reginfo[] = {
66
+ { .name = "AT_S1E1R", .state = ARM_CP_STATE_AA64,
67
+ .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 9, .opc2 = 0,
68
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
69
+ .writefn = ats_write64 },
70
+ { .name = "AT_S1E1W", .state = ARM_CP_STATE_AA64,
71
+ .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 9, .opc2 = 1,
72
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
73
+ .writefn = ats_write64 },
74
+ REGINFO_SENTINEL
75
+};
76
+
77
+static const ARMCPRegInfo ats1cp_reginfo[] = {
78
+ { .name = "ATS1CPRP",
79
+ .cp = 15, .opc1 = 0, .crn = 7, .crm = 9, .opc2 = 0,
80
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
81
+ .writefn = ats_write },
82
+ { .name = "ATS1CPWP",
83
+ .cp = 15, .opc1 = 0, .crn = 7, .crm = 9, .opc2 = 1,
84
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
85
+ .writefn = ats_write },
86
+ REGINFO_SENTINEL
87
+};
88
+#endif
89
+
90
void register_cp_regs_for_features(ARMCPU *cpu)
91
{
92
/* Register all the coprocessor registers based on feature bits */
93
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
94
if (cpu_isar_feature(aa64_pan, cpu)) {
95
define_one_arm_cp_reg(cpu, &pan_reginfo);
96
}
97
+#ifndef CONFIG_USER_ONLY
98
+ if (cpu_isar_feature(aa64_ats1e1, cpu)) {
99
+ define_arm_cp_regs(cpu, ats1e1_reginfo);
100
+ }
101
+ if (cpu_isar_feature(aa32_ats1e1, cpu)) {
102
+ define_arm_cp_regs(cpu, ats1cp_reginfo);
103
+ }
104
+#endif
105
106
if (arm_feature(env, ARM_FEATURE_EL2) && cpu_isar_feature(aa64_vh, cpu)) {
107
define_arm_cp_regs(cpu, vhe_reginfo);
108
--
109
2.20.1
110
111
diff view generated by jsdifflib
1
From: Julian Brown <julian@codesourcery.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Thumb-1 code has some issues in BE32 mode (as currently implemented). In
3
This includes enablement of ARMv8.1-PAN.
4
short, since bytes are swapped within words at load time for BE32
5
executables, this also swaps pairs of adjacent Thumb-1 instructions.
6
4
7
This patch un-swaps those pairs of instructions again, both for execution,
8
and for disassembly. (The previous version of the patch always read four
9
bytes in arm_read_memory_func and then extracted the proper two bytes,
10
in a probably misguided attempt to match the behaviour of actual hardware
11
as described by e.g. the ARM9TDMI TRM, section 3.3 "Endian effects for
12
instruction fetches". It's less complicated to just read the correct
13
two bytes though.)
14
15
Signed-off-by: Julian Brown <julian@codesourcery.com>
16
Message-id: ca20462a044848000370318a8bd41dd0a4ed273f.1484929304.git.julian@codesourcery.com
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20200208125816.14954-17-richard.henderson@linaro.org
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
9
---
20
include/disas/bfd.h | 7 +++++++
10
target/arm/cpu.c | 4 ++++
21
target/arm/arm_ldst.h | 10 +++++++++-
11
target/arm/cpu64.c | 5 +++++
22
disas.c | 1 +
12
2 files changed, 9 insertions(+)
23
target/arm/cpu.c | 23 +++++++++++++++++++++++
24
4 files changed, 40 insertions(+), 1 deletion(-)
25
13
26
diff --git a/include/disas/bfd.h b/include/disas/bfd.h
27
index XXXXXXX..XXXXXXX 100644
28
--- a/include/disas/bfd.h
29
+++ b/include/disas/bfd.h
30
@@ -XXX,XX +XXX,XX @@ typedef struct disassemble_info {
31
The bottom 16 bits are for the internal use of the disassembler. */
32
unsigned long flags;
33
#define INSN_HAS_RELOC    0x80000000
34
+#define INSN_ARM_BE32    0x00010000
35
PTR private_data;
36
37
/* Function used to get bytes to disassemble. MEMADDR is the
38
@@ -XXX,XX +XXX,XX @@ typedef struct disassemble_info {
39
(bfd_vma memaddr, bfd_byte *myaddr, int length,
40
     struct disassemble_info *info);
41
42
+ /* A place to stash the real read_memory_func if read_memory_func wants to
43
+ do some funky address arithmetic or similar (e.g. for ARM BE32 mode). */
44
+ int (*read_memory_inner_func)
45
+ (bfd_vma memaddr, bfd_byte *myaddr, int length,
46
+ struct disassemble_info *info);
47
+
48
/* Function which should be called if we get an error that we can't
49
recover from. STATUS is the errno value from read_memory_func and
50
MEMADDR is the address that we were trying to read. INFO is a
51
diff --git a/target/arm/arm_ldst.h b/target/arm/arm_ldst.h
52
index XXXXXXX..XXXXXXX 100644
53
--- a/target/arm/arm_ldst.h
54
+++ b/target/arm/arm_ldst.h
55
@@ -XXX,XX +XXX,XX @@ static inline uint32_t arm_ldl_code(CPUARMState *env, target_ulong addr,
56
static inline uint16_t arm_lduw_code(CPUARMState *env, target_ulong addr,
57
bool sctlr_b)
58
{
59
- uint16_t insn = cpu_lduw_code(env, addr);
60
+ uint16_t insn;
61
+#ifndef CONFIG_USER_ONLY
62
+ /* In big-endian (BE32) mode, adjacent Thumb instructions have been swapped
63
+ within each word. Undo that now. */
64
+ if (sctlr_b) {
65
+ addr ^= 2;
66
+ }
67
+#endif
68
+ insn = cpu_lduw_code(env, addr);
69
if (bswap_code(sctlr_b)) {
70
return bswap16(insn);
71
}
72
diff --git a/disas.c b/disas.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/disas.c
75
+++ b/disas.c
76
@@ -XXX,XX +XXX,XX @@ void target_disas(FILE *out, CPUState *cpu, target_ulong code,
77
78
s.cpu = cpu;
79
s.info.read_memory_func = target_read_memory;
80
+ s.info.read_memory_inner_func = NULL;
81
s.info.buffer_vma = code;
82
s.info.buffer_length = size;
83
s.info.print_address_func = generic_print_address;
84
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
14
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
85
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
86
--- a/target/arm/cpu.c
16
--- a/target/arm/cpu.c
87
+++ b/target/arm/cpu.c
17
+++ b/target/arm/cpu.c
88
@@ -XXX,XX +XXX,XX @@ print_insn_thumb1(bfd_vma pc, disassemble_info *info)
18
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
89
return print_insn_arm(pc | 1, info);
19
t = FIELD_DP32(t, MVFR2, FPMISC, 4); /* FP MaxNum */
90
}
20
cpu->isar.mvfr2 = t;
91
21
92
+static int arm_read_memory_func(bfd_vma memaddr, bfd_byte *b,
22
+ t = cpu->id_mmfr3;
93
+ int length, struct disassemble_info *info)
23
+ t = FIELD_DP32(t, ID_MMFR3, PAN, 2); /* ATS1E1 */
94
+{
24
+ cpu->id_mmfr3 = t;
95
+ assert(info->read_memory_inner_func);
96
+ assert((info->flags & INSN_ARM_BE32) == 0 || length == 2 || length == 4);
97
+
25
+
98
+ if ((info->flags & INSN_ARM_BE32) != 0 && length == 2) {
26
t = cpu->id_mmfr4;
99
+ assert(info->endian == BFD_ENDIAN_LITTLE);
27
t = FIELD_DP32(t, ID_MMFR4, HPDS, 1); /* AA32HPD */
100
+ return info->read_memory_inner_func(memaddr ^ 2, (bfd_byte *)b, 2,
28
cpu->id_mmfr4 = t;
101
+ info);
29
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
102
+ } else {
30
index XXXXXXX..XXXXXXX 100644
103
+ return info->read_memory_inner_func(memaddr, b, length, info);
31
--- a/target/arm/cpu64.c
104
+ }
32
+++ b/target/arm/cpu64.c
105
+}
33
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
34
t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* HPD */
35
t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
36
t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1);
37
+ t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
38
cpu->isar.id_aa64mmfr1 = t;
39
40
/* Replicate the same data to the 32-bit id registers. */
41
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
42
u = FIELD_DP32(u, ID_ISAR6, SPECRES, 1);
43
cpu->isar.id_isar6 = u;
44
45
+ u = cpu->id_mmfr3;
46
+ u = FIELD_DP32(u, ID_MMFR3, PAN, 2); /* ATS1E1 */
47
+ cpu->id_mmfr3 = u;
106
+
48
+
107
static void arm_disas_set_info(CPUState *cpu, disassemble_info *info)
49
/*
108
{
50
* FIXME: We do not yet support ARMv8.2-fp16 for AArch32 yet,
109
ARMCPU *ac = ARM_CPU(cpu);
51
* so do not set MVFR1.FPHP. Strictly speaking this is not legal,
110
@@ -XXX,XX +XXX,XX @@ static void arm_disas_set_info(CPUState *cpu, disassemble_info *info)
111
info->endian = BFD_ENDIAN_BIG;
112
#endif
113
}
114
+ if (info->read_memory_inner_func == NULL) {
115
+ info->read_memory_inner_func = info->read_memory_func;
116
+ info->read_memory_func = arm_read_memory_func;
117
+ }
118
+ info->flags &= ~INSN_ARM_BE32;
119
+ if (arm_sctlr_b(env)) {
120
+ info->flags |= INSN_ARM_BE32;
121
+ }
122
}
123
124
static void arm_cpu_initfn(Object *obj)
125
--
52
--
126
2.7.4
53
2.20.1
127
54
128
55
diff view generated by jsdifflib
1
From: Julian Brown <julian@codesourcery.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Add a new "cfgend" property which selects whether the CPU resets into
3
Add definitions for all of the fields, up to ARMv8.5.
4
big-endian mode or not. This setting affects whether we reset with
4
Convert the existing RESERVED register to a full register.
5
SCTLR_B (ARMv6 and earlier) or SCTLR_EE (ARMv7 and later) set.
5
Query KVM for the value of the register for the host.
6
6
7
Signed-off-by: Julian Brown <julian@codesourcery.com>
8
Message-id: 11420d1c49636c1790e60578ee996e51f0f0b835.1484929304.git.julian@codesourcery.com
9
[PMM: use error_report_err() rather than error_report();
10
move the integratorcp changes to their own patch;
11
drop an unnecessary extra #include;
12
rephrase commit message accordingly;
13
move setting of reset_sctlr above registration of cpregs
14
so it actually has an effect]
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200208125816.14954-18-richard.henderson@linaro.org
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
11
---
18
target/arm/cpu.h | 7 +++++++
12
target/arm/cpu.h | 17 +++++++++++++++++
19
target/arm/cpu.c | 13 +++++++++++++
13
target/arm/helper.c | 4 ++--
20
2 files changed, 20 insertions(+)
14
target/arm/kvm64.c | 2 ++
15
3 files changed, 21 insertions(+), 2 deletions(-)
21
16
22
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
23
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
24
--- a/target/arm/cpu.h
19
--- a/target/arm/cpu.h
25
+++ b/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
26
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
21
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
27
int gic_vpribits; /* number of virtual priority bits */
22
uint64_t id_aa64pfr1;
28
int gic_vprebits; /* number of virtual preemption bits */
23
uint64_t id_aa64mmfr0;
29
24
uint64_t id_aa64mmfr1;
30
+ /* Whether the cfgend input is high (i.e. this CPU should reset into
25
+ uint64_t id_aa64mmfr2;
31
+ * big-endian mode). This setting isn't used directly: instead it modifies
26
} isar;
32
+ * the reset_sctlr value to have SCTLR_B or SCTLR_EE set, depending on the
27
uint32_t midr;
33
+ * architecture version.
28
uint32_t revidr;
34
+ */
29
@@ -XXX,XX +XXX,XX @@ FIELD(ID_AA64MMFR1, PAN, 20, 4)
35
+ bool cfgend;
30
FIELD(ID_AA64MMFR1, SPECSEI, 24, 4)
31
FIELD(ID_AA64MMFR1, XNX, 28, 4)
32
33
+FIELD(ID_AA64MMFR2, CNP, 0, 4)
34
+FIELD(ID_AA64MMFR2, UAO, 4, 4)
35
+FIELD(ID_AA64MMFR2, LSM, 8, 4)
36
+FIELD(ID_AA64MMFR2, IESB, 12, 4)
37
+FIELD(ID_AA64MMFR2, VARANGE, 16, 4)
38
+FIELD(ID_AA64MMFR2, CCIDX, 20, 4)
39
+FIELD(ID_AA64MMFR2, NV, 24, 4)
40
+FIELD(ID_AA64MMFR2, ST, 28, 4)
41
+FIELD(ID_AA64MMFR2, AT, 32, 4)
42
+FIELD(ID_AA64MMFR2, IDS, 36, 4)
43
+FIELD(ID_AA64MMFR2, FWB, 40, 4)
44
+FIELD(ID_AA64MMFR2, TTL, 48, 4)
45
+FIELD(ID_AA64MMFR2, BBM, 52, 4)
46
+FIELD(ID_AA64MMFR2, EVT, 56, 4)
47
+FIELD(ID_AA64MMFR2, E0PD, 60, 4)
36
+
48
+
37
ARMELChangeHook *el_change_hook;
49
FIELD(ID_DFR0, COPDBG, 0, 4)
38
void *el_change_hook_opaque;
50
FIELD(ID_DFR0, COPSDBG, 4, 4)
39
};
51
FIELD(ID_DFR0, MMAPDBG, 8, 4)
40
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
52
diff --git a/target/arm/helper.c b/target/arm/helper.c
41
index XXXXXXX..XXXXXXX 100644
53
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/cpu.c
54
--- a/target/arm/helper.c
43
+++ b/target/arm/cpu.c
55
+++ b/target/arm/helper.c
44
@@ -XXX,XX +XXX,XX @@ static Property arm_cpu_has_el2_property =
56
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
45
static Property arm_cpu_has_el3_property =
57
.access = PL1_R, .type = ARM_CP_CONST,
46
DEFINE_PROP_BOOL("has_el3", ARMCPU, has_el3, true);
58
.accessfn = access_aa64_tid3,
47
59
.resetvalue = cpu->isar.id_aa64mmfr1 },
48
+static Property arm_cpu_cfgend_property =
60
- { .name = "ID_AA64MMFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
49
+ DEFINE_PROP_BOOL("cfgend", ARMCPU, cfgend, false);
61
+ { .name = "ID_AA64MMFR2_EL1", .state = ARM_CP_STATE_AA64,
50
+
62
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 2,
51
/* use property name "pmu" to match other archs and virt tools */
63
.access = PL1_R, .type = ARM_CP_CONST,
52
static Property arm_cpu_has_pmu_property =
64
.accessfn = access_aa64_tid3,
53
DEFINE_PROP_BOOL("pmu", ARMCPU, has_pmu, true);
65
- .resetvalue = 0 },
54
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_post_init(Object *obj)
66
+ .resetvalue = cpu->isar.id_aa64mmfr2 },
55
}
67
{ .name = "ID_AA64MMFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
56
}
68
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 3,
57
69
.access = PL1_R, .type = ARM_CP_CONST,
58
+ qdev_property_add_static(DEVICE(obj), &arm_cpu_cfgend_property,
70
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
59
+ &error_abort);
71
index XXXXXXX..XXXXXXX 100644
60
}
72
--- a/target/arm/kvm64.c
61
73
+++ b/target/arm/kvm64.c
62
static void arm_cpu_finalizefn(Object *obj)
74
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
63
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
75
ARM64_SYS_REG(3, 0, 0, 7, 0));
64
cpu->reset_sctlr |= (1 << 13);
76
err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr1,
65
}
77
ARM64_SYS_REG(3, 0, 0, 7, 1));
66
78
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr2,
67
+ if (cpu->cfgend) {
79
+ ARM64_SYS_REG(3, 0, 0, 7, 2));
68
+ if (arm_feature(&cpu->env, ARM_FEATURE_V7)) {
80
69
+ cpu->reset_sctlr |= SCTLR_EE;
81
/*
70
+ } else {
82
* Note that if AArch32 support is not present in the host,
71
+ cpu->reset_sctlr |= SCTLR_B;
72
+ }
73
+ }
74
+
75
if (!cpu->has_el3) {
76
/* If the has_el3 CPU property is disabled then we need to disable the
77
* feature.
78
--
83
--
79
2.7.4
84
2.20.1
80
85
81
86
diff view generated by jsdifflib
1
Add support for generating the ISS (Instruction Specific Syndrome)
1
From: Richard Henderson <richard.henderson@linaro.org>
2
for Data Abort exceptions taken from AArch32. These syndromes are
3
used by hypervisors for example to trap and emulate memory accesses.
4
2
5
This is the equivalent for AArch32 guests of the work done for AArch64
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
guests in commit aaa1f954d4cab243.
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20200208125816.14954-19-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/cpu.h | 6 ++++++
9
target/arm/internals.h | 3 +++
10
target/arm/helper.c | 21 +++++++++++++++++++++
11
target/arm/translate-a64.c | 14 ++++++++++++++
12
4 files changed, 44 insertions(+)
7
13
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
9
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
10
---
11
target/arm/translate.h | 14 ++++
12
target/arm/translate-a64.c | 14 ----
13
target/arm/translate.c | 184 +++++++++++++++++++++++++++++++++------------
14
3 files changed, 149 insertions(+), 63 deletions(-)
15
16
diff --git a/target/arm/translate.h b/target/arm/translate.h
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate.h
16
--- a/target/arm/cpu.h
19
+++ b/target/arm/translate.h
17
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ static inline int default_exception_el(DisasContext *s)
18
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
21
? 3 : MAX(1, s->current_el);
19
#define PSTATE_IL (1U << 20)
20
#define PSTATE_SS (1U << 21)
21
#define PSTATE_PAN (1U << 22)
22
+#define PSTATE_UAO (1U << 23)
23
#define PSTATE_V (1U << 28)
24
#define PSTATE_C (1U << 29)
25
#define PSTATE_Z (1U << 30)
26
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id)
27
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2;
22
}
28
}
23
29
24
+static void disas_set_insn_syndrome(DisasContext *s, uint32_t syn)
30
+static inline bool isar_feature_aa64_uao(const ARMISARegisters *id)
25
+{
31
+{
26
+ /* We don't need to save all of the syndrome so we mask and shift
32
+ return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, UAO) != 0;
27
+ * out unneeded bits to help the sleb128 encoder do a better job.
28
+ */
29
+ syn &= ARM_INSN_START_WORD2_MASK;
30
+ syn >>= ARM_INSN_START_WORD2_SHIFT;
31
+
32
+ /* We check and clear insn_start_idx to catch multiple updates. */
33
+ assert(s->insn_start_idx != 0);
34
+ tcg_set_insn_param(s->insn_start_idx, 2, syn);
35
+ s->insn_start_idx = 0;
36
+}
33
+}
37
+
34
+
38
/* target-specific extra values for is_jmp */
35
static inline bool isar_feature_aa64_bti(const ARMISARegisters *id)
39
/* These instructions trap after executing, so the A32/T32 decoder must
36
{
40
* defer them until after the conditional execution state has been updated.
37
return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0;
38
diff --git a/target/arm/internals.h b/target/arm/internals.h
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/internals.h
41
+++ b/target/arm/internals.h
42
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch64_pstate_valid_mask(const ARMISARegisters *id)
43
if (isar_feature_aa64_pan(id)) {
44
valid |= PSTATE_PAN;
45
}
46
+ if (isar_feature_aa64_uao(id)) {
47
+ valid |= PSTATE_UAO;
48
+ }
49
50
return valid;
51
}
52
diff --git a/target/arm/helper.c b/target/arm/helper.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/target/arm/helper.c
55
+++ b/target/arm/helper.c
56
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo pan_reginfo = {
57
.readfn = aa64_pan_read, .writefn = aa64_pan_write
58
};
59
60
+static uint64_t aa64_uao_read(CPUARMState *env, const ARMCPRegInfo *ri)
61
+{
62
+ return env->pstate & PSTATE_UAO;
63
+}
64
+
65
+static void aa64_uao_write(CPUARMState *env, const ARMCPRegInfo *ri,
66
+ uint64_t value)
67
+{
68
+ env->pstate = (env->pstate & ~PSTATE_UAO) | (value & PSTATE_UAO);
69
+}
70
+
71
+static const ARMCPRegInfo uao_reginfo = {
72
+ .name = "UAO", .state = ARM_CP_STATE_AA64,
73
+ .opc0 = 3, .opc1 = 0, .crn = 4, .crm = 2, .opc2 = 4,
74
+ .type = ARM_CP_NO_RAW, .access = PL1_RW,
75
+ .readfn = aa64_uao_read, .writefn = aa64_uao_write
76
+};
77
+
78
static CPAccessResult aa64_cacheop_access(CPUARMState *env,
79
const ARMCPRegInfo *ri,
80
bool isread)
81
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
82
define_arm_cp_regs(cpu, ats1cp_reginfo);
83
}
84
#endif
85
+ if (cpu_isar_feature(aa64_uao, cpu)) {
86
+ define_one_arm_cp_reg(cpu, &uao_reginfo);
87
+ }
88
89
if (arm_feature(env, ARM_FEATURE_EL2) && cpu_isar_feature(aa64_vh, cpu)) {
90
define_arm_cp_regs(cpu, vhe_reginfo);
41
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
91
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
42
index XXXXXXX..XXXXXXX 100644
92
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/translate-a64.c
93
--- a/target/arm/translate-a64.c
44
+++ b/target/arm/translate-a64.c
94
+++ b/target/arm/translate-a64.c
45
@@ -XXX,XX +XXX,XX @@ static inline void gen_goto_tb(DisasContext *s, int n, uint64_t dest)
95
@@ -XXX,XX +XXX,XX @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
46
}
96
s->base.is_jmp = DISAS_NEXT;
47
}
97
break;
48
98
49
-static void disas_set_insn_syndrome(DisasContext *s, uint32_t syn)
99
+ case 0x03: /* UAO */
50
-{
100
+ if (!dc_isar_feature(aa64_uao, s) || s->current_el == 0) {
51
- /* We don't need to save all of the syndrome so we mask and shift
101
+ goto do_unallocated;
52
- * out uneeded bits to help the sleb128 encoder do a better job.
102
+ }
53
- */
103
+ if (crm & 1) {
54
- syn &= ARM_INSN_START_WORD2_MASK;
104
+ set_pstate_bits(PSTATE_UAO);
55
- syn >>= ARM_INSN_START_WORD2_SHIFT;
105
+ } else {
56
-
106
+ clear_pstate_bits(PSTATE_UAO);
57
- /* We check and clear insn_start_idx to catch multiple updates. */
107
+ }
58
- assert(s->insn_start_idx != 0);
108
+ t1 = tcg_const_i32(s->current_el);
59
- tcg_set_insn_param(s->insn_start_idx, 2, syn);
109
+ gen_helper_rebuild_hflags_a64(cpu_env, t1);
60
- s->insn_start_idx = 0;
110
+ tcg_temp_free_i32(t1);
61
-}
111
+ break;
62
-
63
static void unallocated_encoding(DisasContext *s)
64
{
65
/* Unallocated and reserved encodings are uncategorized */
66
diff --git a/target/arm/translate.c b/target/arm/translate.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/arm/translate.c
69
+++ b/target/arm/translate.c
70
@@ -XXX,XX +XXX,XX @@ void arm_translate_init(void)
71
a64_translate_init();
72
}
73
74
+/* Flags for the disas_set_da_iss info argument:
75
+ * lower bits hold the Rt register number, higher bits are flags.
76
+ */
77
+typedef enum ISSInfo {
78
+ ISSNone = 0,
79
+ ISSRegMask = 0x1f,
80
+ ISSInvalid = (1 << 5),
81
+ ISSIsAcqRel = (1 << 6),
82
+ ISSIsWrite = (1 << 7),
83
+ ISSIs16Bit = (1 << 8),
84
+} ISSInfo;
85
+
112
+
86
+/* Save the syndrome information for a Data Abort */
113
case 0x04: /* PAN */
87
+static void disas_set_da_iss(DisasContext *s, TCGMemOp memop, ISSInfo issinfo)
114
if (!dc_isar_feature(aa64_pan, s) || s->current_el == 0) {
88
+{
115
goto do_unallocated;
89
+ uint32_t syn;
90
+ int sas = memop & MO_SIZE;
91
+ bool sse = memop & MO_SIGN;
92
+ bool is_acqrel = issinfo & ISSIsAcqRel;
93
+ bool is_write = issinfo & ISSIsWrite;
94
+ bool is_16bit = issinfo & ISSIs16Bit;
95
+ int srt = issinfo & ISSRegMask;
96
+
97
+ if (issinfo & ISSInvalid) {
98
+ /* Some callsites want to conditionally provide ISS info,
99
+ * eg "only if this was not a writeback"
100
+ */
101
+ return;
102
+ }
103
+
104
+ if (srt == 15) {
105
+ /* For AArch32, insns where the src/dest is R15 never generate
106
+ * ISS information. Catching that here saves checking at all
107
+ * the call sites.
108
+ */
109
+ return;
110
+ }
111
+
112
+ syn = syn_data_abort_with_iss(0, sas, sse, srt, 0, is_acqrel,
113
+ 0, 0, 0, is_write, 0, is_16bit);
114
+ disas_set_insn_syndrome(s, syn);
115
+}
116
+
117
static inline ARMMMUIdx get_a32_user_mem_index(DisasContext *s)
118
{
119
/* Return the mmu_idx to use for A32/T32 "unprivileged load/store"
120
@@ -XXX,XX +XXX,XX @@ static inline void gen_aa32_ld##SUFF(DisasContext *s, TCGv_i32 val, \
121
TCGv_i32 a32, int index) \
122
{ \
123
gen_aa32_ld_i32(s, val, a32, index, OPC | s->be_data); \
124
+} \
125
+static inline void gen_aa32_ld##SUFF##_iss(DisasContext *s, \
126
+ TCGv_i32 val, \
127
+ TCGv_i32 a32, int index, \
128
+ ISSInfo issinfo) \
129
+{ \
130
+ gen_aa32_ld_i32(s, val, a32, index, OPC | s->be_data); \
131
+ disas_set_da_iss(s, OPC, issinfo); \
132
}
133
134
#define DO_GEN_ST(SUFF, OPC) \
135
@@ -XXX,XX +XXX,XX @@ static inline void gen_aa32_st##SUFF(DisasContext *s, TCGv_i32 val, \
136
TCGv_i32 a32, int index) \
137
{ \
138
gen_aa32_st_i32(s, val, a32, index, OPC | s->be_data); \
139
+} \
140
+static inline void gen_aa32_st##SUFF##_iss(DisasContext *s, \
141
+ TCGv_i32 val, \
142
+ TCGv_i32 a32, int index, \
143
+ ISSInfo issinfo) \
144
+{ \
145
+ gen_aa32_st_i32(s, val, a32, index, OPC | s->be_data); \
146
+ disas_set_da_iss(s, OPC, issinfo | ISSIsWrite); \
147
}
148
149
static inline void gen_aa32_frob64(DisasContext *s, TCGv_i64 val)
150
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
151
tmp = tcg_temp_new_i32();
152
switch (op1) {
153
case 0: /* lda */
154
- gen_aa32_ld32u(s, tmp, addr,
155
- get_mem_index(s));
156
+ gen_aa32_ld32u_iss(s, tmp, addr,
157
+ get_mem_index(s),
158
+ rd | ISSIsAcqRel);
159
break;
160
case 2: /* ldab */
161
- gen_aa32_ld8u(s, tmp, addr,
162
- get_mem_index(s));
163
+ gen_aa32_ld8u_iss(s, tmp, addr,
164
+ get_mem_index(s),
165
+ rd | ISSIsAcqRel);
166
break;
167
case 3: /* ldah */
168
- gen_aa32_ld16u(s, tmp, addr,
169
- get_mem_index(s));
170
+ gen_aa32_ld16u_iss(s, tmp, addr,
171
+ get_mem_index(s),
172
+ rd | ISSIsAcqRel);
173
break;
174
default:
175
abort();
176
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
177
tmp = load_reg(s, rm);
178
switch (op1) {
179
case 0: /* stl */
180
- gen_aa32_st32(s, tmp, addr,
181
- get_mem_index(s));
182
+ gen_aa32_st32_iss(s, tmp, addr,
183
+ get_mem_index(s),
184
+ rm | ISSIsAcqRel);
185
break;
186
case 2: /* stlb */
187
- gen_aa32_st8(s, tmp, addr,
188
- get_mem_index(s));
189
+ gen_aa32_st8_iss(s, tmp, addr,
190
+ get_mem_index(s),
191
+ rm | ISSIsAcqRel);
192
break;
193
case 3: /* stlh */
194
- gen_aa32_st16(s, tmp, addr,
195
- get_mem_index(s));
196
+ gen_aa32_st16_iss(s, tmp, addr,
197
+ get_mem_index(s),
198
+ rm | ISSIsAcqRel);
199
break;
200
default:
201
abort();
202
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
203
bool wbit = insn & (1 << 21);
204
bool pbit = insn & (1 << 24);
205
bool doubleword = false;
206
+ ISSInfo issinfo;
207
+
208
/* Misc load/store */
209
rn = (insn >> 16) & 0xf;
210
rd = (insn >> 12) & 0xf;
211
212
+ /* ISS not valid if writeback */
213
+ issinfo = (pbit & !wbit) ? rd : ISSInvalid;
214
+
215
if (!load && (sh & 2)) {
216
/* doubleword */
217
ARCH(5TE);
218
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
219
tmp = tcg_temp_new_i32();
220
switch (sh) {
221
case 1:
222
- gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
223
+ gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s),
224
+ issinfo);
225
break;
226
case 2:
227
- gen_aa32_ld8s(s, tmp, addr, get_mem_index(s));
228
+ gen_aa32_ld8s_iss(s, tmp, addr, get_mem_index(s),
229
+ issinfo);
230
break;
231
default:
232
case 3:
233
- gen_aa32_ld16s(s, tmp, addr, get_mem_index(s));
234
+ gen_aa32_ld16s_iss(s, tmp, addr, get_mem_index(s),
235
+ issinfo);
236
break;
237
}
238
} else {
239
/* store */
240
tmp = load_reg(s, rd);
241
- gen_aa32_st16(s, tmp, addr, get_mem_index(s));
242
+ gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s), issinfo);
243
tcg_temp_free_i32(tmp);
244
}
245
/* Perform base writeback before the loaded value to
246
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
247
/* load */
248
tmp = tcg_temp_new_i32();
249
if (insn & (1 << 22)) {
250
- gen_aa32_ld8u(s, tmp, tmp2, i);
251
+ gen_aa32_ld8u_iss(s, tmp, tmp2, i, rd);
252
} else {
253
- gen_aa32_ld32u(s, tmp, tmp2, i);
254
+ gen_aa32_ld32u_iss(s, tmp, tmp2, i, rd);
255
}
256
} else {
257
/* store */
258
tmp = load_reg(s, rd);
259
if (insn & (1 << 22)) {
260
- gen_aa32_st8(s, tmp, tmp2, i);
261
+ gen_aa32_st8_iss(s, tmp, tmp2, i, rd);
262
} else {
263
- gen_aa32_st32(s, tmp, tmp2, i);
264
+ gen_aa32_st32_iss(s, tmp, tmp2, i, rd);
265
}
266
tcg_temp_free_i32(tmp);
267
}
268
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
269
tmp = tcg_temp_new_i32();
270
switch (op) {
271
case 0: /* ldab */
272
- gen_aa32_ld8u(s, tmp, addr, get_mem_index(s));
273
+ gen_aa32_ld8u_iss(s, tmp, addr, get_mem_index(s),
274
+ rs | ISSIsAcqRel);
275
break;
276
case 1: /* ldah */
277
- gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
278
+ gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s),
279
+ rs | ISSIsAcqRel);
280
break;
281
case 2: /* lda */
282
- gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
283
+ gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s),
284
+ rs | ISSIsAcqRel);
285
break;
286
default:
287
abort();
288
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
289
tmp = load_reg(s, rs);
290
switch (op) {
291
case 0: /* stlb */
292
- gen_aa32_st8(s, tmp, addr, get_mem_index(s));
293
+ gen_aa32_st8_iss(s, tmp, addr, get_mem_index(s),
294
+ rs | ISSIsAcqRel);
295
break;
296
case 1: /* stlh */
297
- gen_aa32_st16(s, tmp, addr, get_mem_index(s));
298
+ gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s),
299
+ rs | ISSIsAcqRel);
300
break;
301
case 2: /* stl */
302
- gen_aa32_st32(s, tmp, addr, get_mem_index(s));
303
+ gen_aa32_st32_iss(s, tmp, addr, get_mem_index(s),
304
+ rs | ISSIsAcqRel);
305
break;
306
default:
307
abort();
308
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
309
int postinc = 0;
310
int writeback = 0;
311
int memidx;
312
+ ISSInfo issinfo;
313
+
314
if ((insn & 0x01100000) == 0x01000000) {
315
if (disas_neon_ls_insn(s, insn)) {
316
goto illegal_op;
317
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
318
}
319
}
320
}
321
+
322
+ issinfo = writeback ? ISSInvalid : rs;
323
+
324
if (insn & (1 << 20)) {
325
/* Load. */
326
tmp = tcg_temp_new_i32();
327
switch (op) {
328
case 0:
329
- gen_aa32_ld8u(s, tmp, addr, memidx);
330
+ gen_aa32_ld8u_iss(s, tmp, addr, memidx, issinfo);
331
break;
332
case 4:
333
- gen_aa32_ld8s(s, tmp, addr, memidx);
334
+ gen_aa32_ld8s_iss(s, tmp, addr, memidx, issinfo);
335
break;
336
case 1:
337
- gen_aa32_ld16u(s, tmp, addr, memidx);
338
+ gen_aa32_ld16u_iss(s, tmp, addr, memidx, issinfo);
339
break;
340
case 5:
341
- gen_aa32_ld16s(s, tmp, addr, memidx);
342
+ gen_aa32_ld16s_iss(s, tmp, addr, memidx, issinfo);
343
break;
344
case 2:
345
- gen_aa32_ld32u(s, tmp, addr, memidx);
346
+ gen_aa32_ld32u_iss(s, tmp, addr, memidx, issinfo);
347
break;
348
default:
349
tcg_temp_free_i32(tmp);
350
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
351
tmp = load_reg(s, rs);
352
switch (op) {
353
case 0:
354
- gen_aa32_st8(s, tmp, addr, memidx);
355
+ gen_aa32_st8_iss(s, tmp, addr, memidx, issinfo);
356
break;
357
case 1:
358
- gen_aa32_st16(s, tmp, addr, memidx);
359
+ gen_aa32_st16_iss(s, tmp, addr, memidx, issinfo);
360
break;
361
case 2:
362
- gen_aa32_st32(s, tmp, addr, memidx);
363
+ gen_aa32_st32_iss(s, tmp, addr, memidx, issinfo);
364
break;
365
default:
366
tcg_temp_free_i32(tmp);
367
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
368
addr = tcg_temp_new_i32();
369
tcg_gen_movi_i32(addr, val);
370
tmp = tcg_temp_new_i32();
371
- gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
372
+ gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s),
373
+ rd | ISSIs16Bit);
374
tcg_temp_free_i32(addr);
375
store_reg(s, rd, tmp);
376
break;
377
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
378
379
switch (op) {
380
case 0: /* str */
381
- gen_aa32_st32(s, tmp, addr, get_mem_index(s));
382
+ gen_aa32_st32_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
383
break;
384
case 1: /* strh */
385
- gen_aa32_st16(s, tmp, addr, get_mem_index(s));
386
+ gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
387
break;
388
case 2: /* strb */
389
- gen_aa32_st8(s, tmp, addr, get_mem_index(s));
390
+ gen_aa32_st8_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
391
break;
392
case 3: /* ldrsb */
393
- gen_aa32_ld8s(s, tmp, addr, get_mem_index(s));
394
+ gen_aa32_ld8s_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
395
break;
396
case 4: /* ldr */
397
- gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
398
+ gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
399
break;
400
case 5: /* ldrh */
401
- gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
402
+ gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
403
break;
404
case 6: /* ldrb */
405
- gen_aa32_ld8u(s, tmp, addr, get_mem_index(s));
406
+ gen_aa32_ld8u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
407
break;
408
case 7: /* ldrsh */
409
- gen_aa32_ld16s(s, tmp, addr, get_mem_index(s));
410
+ gen_aa32_ld16s_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
411
break;
412
}
413
if (op >= 3) { /* load */
414
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
415
if (insn & (1 << 11)) {
416
/* load */
417
tmp = tcg_temp_new_i32();
418
- gen_aa32_ld8u(s, tmp, addr, get_mem_index(s));
419
+ gen_aa32_ld8u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
420
store_reg(s, rd, tmp);
421
} else {
422
/* store */
423
tmp = load_reg(s, rd);
424
- gen_aa32_st8(s, tmp, addr, get_mem_index(s));
425
+ gen_aa32_st8_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
426
tcg_temp_free_i32(tmp);
427
}
428
tcg_temp_free_i32(addr);
429
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
430
if (insn & (1 << 11)) {
431
/* load */
432
tmp = tcg_temp_new_i32();
433
- gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
434
+ gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
435
store_reg(s, rd, tmp);
436
} else {
437
/* store */
438
tmp = load_reg(s, rd);
439
- gen_aa32_st16(s, tmp, addr, get_mem_index(s));
440
+ gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
441
tcg_temp_free_i32(tmp);
442
}
443
tcg_temp_free_i32(addr);
444
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
445
if (insn & (1 << 11)) {
446
/* load */
447
tmp = tcg_temp_new_i32();
448
- gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
449
+ gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
450
store_reg(s, rd, tmp);
451
} else {
452
/* store */
453
tmp = load_reg(s, rd);
454
- gen_aa32_st32(s, tmp, addr, get_mem_index(s));
455
+ gen_aa32_st32_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
456
tcg_temp_free_i32(tmp);
457
}
458
tcg_temp_free_i32(addr);
459
@@ -XXX,XX +XXX,XX @@ void gen_intermediate_code(CPUARMState *env, TranslationBlock *tb)
460
store_cpu_field(tmp, condexec_bits);
461
}
462
do {
463
+ dc->insn_start_idx = tcg_op_buf_count();
464
tcg_gen_insn_start(dc->pc,
465
(dc->condexec_cond << 4) | (dc->condexec_mask >> 1),
466
0);
467
--
116
--
468
2.7.4
117
2.20.1
469
118
470
119
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
We need only override the current condition under which
4
TBFLAG_A64.UNPRIV is set.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200208125816.14954-20-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/helper.c | 41 +++++++++++++++++++++--------------------
12
1 file changed, 21 insertions(+), 20 deletions(-)
13
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
19
}
20
21
/* Compute the condition for using AccType_UNPRIV for LDTR et al. */
22
- /* TODO: ARMv8.2-UAO */
23
- switch (mmu_idx) {
24
- case ARMMMUIdx_E10_1:
25
- case ARMMMUIdx_E10_1_PAN:
26
- case ARMMMUIdx_SE10_1:
27
- case ARMMMUIdx_SE10_1_PAN:
28
- /* TODO: ARMv8.3-NV */
29
- flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
30
- break;
31
- case ARMMMUIdx_E20_2:
32
- case ARMMMUIdx_E20_2_PAN:
33
- /* TODO: ARMv8.4-SecEL2 */
34
- /*
35
- * Note that E20_2 is gated by HCR_EL2.E2H == 1, but E20_0 is
36
- * gated by HCR_EL2.<E2H,TGE> == '11', and so is LDTR.
37
- */
38
- if (env->cp15.hcr_el2 & HCR_TGE) {
39
+ if (!(env->pstate & PSTATE_UAO)) {
40
+ switch (mmu_idx) {
41
+ case ARMMMUIdx_E10_1:
42
+ case ARMMMUIdx_E10_1_PAN:
43
+ case ARMMMUIdx_SE10_1:
44
+ case ARMMMUIdx_SE10_1_PAN:
45
+ /* TODO: ARMv8.3-NV */
46
flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
47
+ break;
48
+ case ARMMMUIdx_E20_2:
49
+ case ARMMMUIdx_E20_2_PAN:
50
+ /* TODO: ARMv8.4-SecEL2 */
51
+ /*
52
+ * Note that EL20_2 is gated by HCR_EL2.E2H == 1, but EL20_0 is
53
+ * gated by HCR_EL2.<E2H,TGE> == '11', and so is LDTR.
54
+ */
55
+ if (env->cp15.hcr_el2 & HCR_TGE) {
56
+ flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
57
+ }
58
+ break;
59
+ default:
60
+ break;
61
}
62
- break;
63
- default:
64
- break;
65
}
66
67
return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
68
--
69
2.20.1
70
71
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20200208125816.14954-21-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/cpu64.c | 4 ++++
9
1 file changed, 4 insertions(+)
10
11
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/cpu64.c
14
+++ b/target/arm/cpu64.c
15
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
16
t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
17
cpu->isar.id_aa64mmfr1 = t;
18
19
+ t = cpu->isar.id_aa64mmfr2;
20
+ t = FIELD_DP64(t, ID_AA64MMFR2, UAO, 1);
21
+ cpu->isar.id_aa64mmfr2 = t;
22
+
23
/* Replicate the same data to the 32-bit id registers. */
24
u = cpu->isar.id_isar5;
25
u = FIELD_DP32(u, ID_ISAR5, AES, 2); /* AES + PMULL */
26
--
27
2.20.1
28
29
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Guenter Roeck <linux@roeck-us.net>
2
2
3
This enables reboot of a guest from U-Boot and Linux.
3
Initialize EHCI controllers on AST2400 and AST2500 using the existing
4
TYPE_PLATFORM_EHCI. After this change, booting ast2500-evb into Linux
5
successfully instantiates a USB interface.
4
6
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
ehci-platform 1e6a3000.usb: EHCI Host Controller
8
ehci-platform 1e6a3000.usb: new USB bus registered, assigned bus number 1
9
ehci-platform 1e6a3000.usb: irq 21, io mem 0x1e6a3000
10
ehci-platform 1e6a3000.usb: USB 2.0 started, EHCI 1.00
11
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.05
12
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
13
usb usb1: Product: EHCI Host Controller
14
15
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
16
Reviewed-by: Cédric Le Goater <clg@kaod.org>
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
17
Reviewed-by: Joel Stanley <joel@jms.id.au>
7
Message-id: 1485452251-1593-3-git-send-email-clg@kaod.org
18
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
19
Message-id: 20200206183437.3979-1-linux@roeck-us.net
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
21
---
10
include/hw/arm/aspeed_soc.h | 2 ++
22
include/hw/arm/aspeed_soc.h | 6 ++++++
11
hw/arm/aspeed_soc.c | 13 +++++++++++++
23
hw/arm/aspeed_soc.c | 25 +++++++++++++++++++++++++
12
2 files changed, 15 insertions(+)
24
2 files changed, 31 insertions(+)
13
25
14
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
26
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
15
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
16
--- a/include/hw/arm/aspeed_soc.h
28
--- a/include/hw/arm/aspeed_soc.h
17
+++ b/include/hw/arm/aspeed_soc.h
29
+++ b/include/hw/arm/aspeed_soc.h
18
@@ -XXX,XX +XXX,XX @@
30
@@ -XXX,XX +XXX,XX @@
19
#include "hw/timer/aspeed_timer.h"
31
#include "target/arm/cpu.h"
20
#include "hw/i2c/aspeed_i2c.h"
32
#include "hw/gpio/aspeed_gpio.h"
21
#include "hw/ssi/aspeed_smc.h"
33
#include "hw/sd/aspeed_sdhci.h"
22
+#include "hw/watchdog/wdt_aspeed.h"
34
+#include "hw/usb/hcd-ehci.h"
23
35
24
#define ASPEED_SPIS_NUM 2
36
#define ASPEED_SPIS_NUM 2
25
37
+#define ASPEED_EHCIS_NUM 2
38
#define ASPEED_WDTS_NUM 4
39
#define ASPEED_CPUS_NUM 2
40
#define ASPEED_MACS_NUM 4
26
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCState {
41
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCState {
42
AspeedXDMAState xdma;
27
AspeedSMCState fmc;
43
AspeedSMCState fmc;
28
AspeedSMCState spi[ASPEED_SPIS_NUM];
44
AspeedSMCState spi[ASPEED_SPIS_NUM];
45
+ EHCISysBusState ehci[ASPEED_EHCIS_NUM];
29
AspeedSDMCState sdmc;
46
AspeedSDMCState sdmc;
30
+ AspeedWDTState wdt;
47
AspeedWDTState wdt[ASPEED_WDTS_NUM];
31
} AspeedSoCState;
48
FTGMAC100State ftgmac100[ASPEED_MACS_NUM];
32
49
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCClass {
33
#define TYPE_ASPEED_SOC "aspeed-soc"
50
uint32_t silicon_rev;
51
uint64_t sram_size;
52
int spis_num;
53
+ int ehcis_num;
54
int wdts_num;
55
int macs_num;
56
const int *irqmap;
57
@@ -XXX,XX +XXX,XX @@ enum {
58
ASPEED_FMC,
59
ASPEED_SPI1,
60
ASPEED_SPI2,
61
+ ASPEED_EHCI1,
62
+ ASPEED_EHCI2,
63
ASPEED_VIC,
64
ASPEED_SDMC,
65
ASPEED_SCU,
34
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
66
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
35
index XXXXXXX..XXXXXXX 100644
67
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/arm/aspeed_soc.c
68
--- a/hw/arm/aspeed_soc.c
37
+++ b/hw/arm/aspeed_soc.c
69
+++ b/hw/arm/aspeed_soc.c
38
@@ -XXX,XX +XXX,XX @@
70
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2400_memmap[] = {
39
#define ASPEED_SOC_SCU_BASE 0x1E6E2000
71
[ASPEED_IOMEM] = 0x1E600000,
40
#define ASPEED_SOC_SRAM_BASE 0x1E720000
72
[ASPEED_FMC] = 0x1E620000,
41
#define ASPEED_SOC_TIMER_BASE 0x1E782000
73
[ASPEED_SPI1] = 0x1E630000,
42
+#define ASPEED_SOC_WDT_BASE 0x1E785000
74
+ [ASPEED_EHCI1] = 0x1E6A1000,
43
#define ASPEED_SOC_I2C_BASE 0x1E78A000
75
[ASPEED_VIC] = 0x1E6C0000,
44
76
[ASPEED_SDMC] = 0x1E6E0000,
45
static const int uart_irqs[] = { 9, 32, 33, 34, 10 };
77
[ASPEED_SCU] = 0x1E6E2000,
78
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2500_memmap[] = {
79
[ASPEED_FMC] = 0x1E620000,
80
[ASPEED_SPI1] = 0x1E630000,
81
[ASPEED_SPI2] = 0x1E631000,
82
+ [ASPEED_EHCI1] = 0x1E6A1000,
83
+ [ASPEED_EHCI2] = 0x1E6A3000,
84
[ASPEED_VIC] = 0x1E6C0000,
85
[ASPEED_SDMC] = 0x1E6E0000,
86
[ASPEED_SCU] = 0x1E6E2000,
87
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2400_irqmap[] = {
88
[ASPEED_UART5] = 10,
89
[ASPEED_VUART] = 8,
90
[ASPEED_FMC] = 19,
91
+ [ASPEED_EHCI1] = 5,
92
+ [ASPEED_EHCI2] = 13,
93
[ASPEED_SDMC] = 0,
94
[ASPEED_SCU] = 21,
95
[ASPEED_ADC] = 31,
46
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
96
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
47
sc->info->silicon_rev);
97
sizeof(s->spi[i]), typename);
48
object_property_add_alias(obj, "ram-size", OBJECT(&s->sdmc),
98
}
49
"ram-size", &error_abort);
99
100
+ for (i = 0; i < sc->ehcis_num; i++) {
101
+ sysbus_init_child_obj(obj, "ehci[*]", OBJECT(&s->ehci[i]),
102
+ sizeof(s->ehci[i]), TYPE_PLATFORM_EHCI);
103
+ }
50
+
104
+
51
+ object_initialize(&s->wdt, sizeof(s->wdt), TYPE_ASPEED_WDT);
105
snprintf(typename, sizeof(typename), "aspeed.sdmc-%s", socname);
52
+ object_property_add_child(obj, "wdt", OBJECT(&s->wdt), NULL);
106
sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc),
53
+ qdev_set_parent_bus(DEVICE(&s->wdt), sysbus_get_default());
107
typename);
54
}
55
56
static void aspeed_soc_realize(DeviceState *dev, Error **errp)
57
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
108
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
58
return;
109
s->spi[i].ctrl->flash_window_base);
59
}
110
}
60
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, ASPEED_SOC_SDMC_BASE);
111
112
+ /* EHCI */
113
+ for (i = 0; i < sc->ehcis_num; i++) {
114
+ object_property_set_bool(OBJECT(&s->ehci[i]), true, "realized", &err);
115
+ if (err) {
116
+ error_propagate(errp, err);
117
+ return;
118
+ }
119
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
120
+ sc->memmap[ASPEED_EHCI1 + i]);
121
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci[i]), 0,
122
+ aspeed_soc_get_irq(s, ASPEED_EHCI1 + i));
123
+ }
61
+
124
+
62
+ /* Watch dog */
125
/* SDMC - SDRAM Memory Controller */
63
+ object_property_set_bool(OBJECT(&s->wdt), true, "realized", &err);
126
object_property_set_bool(OBJECT(&s->sdmc), true, "realized", &err);
64
+ if (err) {
127
if (err) {
65
+ error_propagate(errp, err);
128
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
66
+ return;
129
sc->silicon_rev = AST2400_A1_SILICON_REV;
67
+ }
130
sc->sram_size = 0x8000;
68
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt), 0, ASPEED_SOC_WDT_BASE);
131
sc->spis_num = 1;
69
}
132
+ sc->ehcis_num = 1;
70
133
sc->wdts_num = 2;
71
static void aspeed_soc_class_init(ObjectClass *oc, void *data)
134
sc->macs_num = 2;
135
sc->irqmap = aspeed_soc_ast2400_irqmap;
136
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
137
sc->silicon_rev = AST2500_A1_SILICON_REV;
138
sc->sram_size = 0x9000;
139
sc->spis_num = 2;
140
+ sc->ehcis_num = 2;
141
sc->wdts_num = 3;
142
sc->macs_num = 2;
143
sc->irqmap = aspeed_soc_ast2500_irqmap;
72
--
144
--
73
2.7.4
145
2.20.1
74
146
75
147
diff view generated by jsdifflib
New patch
1
From: Guenter Roeck <linux@roeck-us.net>
1
2
3
Initialize EHCI controllers on AST2600 using the existing
4
TYPE_PLATFORM_EHCI. After this change, booting ast2600-evb
5
into Linux successfully instantiates a USB interface after
6
the necessary changes are made to its devicetree files.
7
8
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
9
ehci-platform: EHCI generic platform driver
10
ehci-platform 1e6a3000.usb: EHCI Host Controller
11
ehci-platform 1e6a3000.usb: new USB bus registered, assigned bus number 1
12
ehci-platform 1e6a3000.usb: irq 25, io mem 0x1e6a3000
13
ehci-platform 1e6a3000.usb: USB 2.0 started, EHCI 1.00
14
usb usb1: Manufacturer: Linux 5.5.0-09825-ga0802f2d0ef5-dirty ehci_hcd
15
usb 1-1: new high-speed USB device number 2 using ehci-platform
16
17
Reviewed-by: Cédric Le Goater <clg@kaod.org>
18
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
19
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
20
Message-id: 20200207174548.9087-1-linux@roeck-us.net
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
23
hw/arm/aspeed_ast2600.c | 23 +++++++++++++++++++++++
24
1 file changed, 23 insertions(+)
25
26
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/arm/aspeed_ast2600.c
29
+++ b/hw/arm/aspeed_ast2600.c
30
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2600_memmap[] = {
31
[ASPEED_FMC] = 0x1E620000,
32
[ASPEED_SPI1] = 0x1E630000,
33
[ASPEED_SPI2] = 0x1E641000,
34
+ [ASPEED_EHCI1] = 0x1E6A1000,
35
+ [ASPEED_EHCI2] = 0x1E6A3000,
36
[ASPEED_MII1] = 0x1E650000,
37
[ASPEED_MII2] = 0x1E650008,
38
[ASPEED_MII3] = 0x1E650010,
39
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2600_irqmap[] = {
40
[ASPEED_ADC] = 78,
41
[ASPEED_XDMA] = 6,
42
[ASPEED_SDHCI] = 43,
43
+ [ASPEED_EHCI1] = 5,
44
+ [ASPEED_EHCI2] = 9,
45
[ASPEED_EMMC] = 15,
46
[ASPEED_GPIO] = 40,
47
[ASPEED_GPIO_1_8V] = 11,
48
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
49
sizeof(s->spi[i]), typename);
50
}
51
52
+ for (i = 0; i < sc->ehcis_num; i++) {
53
+ sysbus_init_child_obj(obj, "ehci[*]", OBJECT(&s->ehci[i]),
54
+ sizeof(s->ehci[i]), TYPE_PLATFORM_EHCI);
55
+ }
56
+
57
snprintf(typename, sizeof(typename), "aspeed.sdmc-%s", socname);
58
sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc),
59
typename);
60
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
61
s->spi[i].ctrl->flash_window_base);
62
}
63
64
+ /* EHCI */
65
+ for (i = 0; i < sc->ehcis_num; i++) {
66
+ object_property_set_bool(OBJECT(&s->ehci[i]), true, "realized", &err);
67
+ if (err) {
68
+ error_propagate(errp, err);
69
+ return;
70
+ }
71
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
72
+ sc->memmap[ASPEED_EHCI1 + i]);
73
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci[i]), 0,
74
+ aspeed_soc_get_irq(s, ASPEED_EHCI1 + i));
75
+ }
76
+
77
/* SDMC - SDRAM Memory Controller */
78
object_property_set_bool(OBJECT(&s->sdmc), true, "realized", &err);
79
if (err) {
80
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
81
sc->silicon_rev = AST2600_A0_SILICON_REV;
82
sc->sram_size = 0x10000;
83
sc->spis_num = 2;
84
+ sc->ehcis_num = 2;
85
sc->wdts_num = 4;
86
sc->macs_num = 4;
87
sc->irqmap = aspeed_soc_ast2600_irqmap;
88
--
89
2.20.1
90
91
diff view generated by jsdifflib
New patch
1
From: Chen Qun <kuhn.chenqun@huawei.com>
1
2
3
It's easy to reproduce as follow:
4
virsh qemu-monitor-command vm1 --pretty '{"execute": "device-list-properties",
5
"arguments":{"typename":"exynos4210.uart"}}'
6
7
ASAN shows memory leak stack:
8
#1 0xfffd896d71cb in g_malloc0 (/lib64/libglib-2.0.so.0+0x571cb)
9
#2 0xaaad270beee3 in timer_new_full /qemu/include/qemu/timer.h:530
10
#3 0xaaad270beee3 in timer_new /qemu/include/qemu/timer.h:551
11
#4 0xaaad270beee3 in timer_new_ns /qemu/include/qemu/timer.h:569
12
#5 0xaaad270beee3 in exynos4210_uart_init /qemu/hw/char/exynos4210_uart.c:677
13
#6 0xaaad275c8f4f in object_initialize_with_type /qemu/qom/object.c:516
14
#7 0xaaad275c91bb in object_new_with_type /qemu/qom/object.c:684
15
#8 0xaaad2755df2f in qmp_device_list_properties /qemu/qom/qom-qmp-cmds.c:152
16
17
Reported-by: Euler Robot <euler.robot@huawei.com>
18
Signed-off-by: Chen Qun <kuhn.chenqun@huawei.com>
19
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
20
Message-id: 20200213025603.149432-1-kuhn.chenqun@huawei.com
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
23
hw/char/exynos4210_uart.c | 5 +++--
24
1 file changed, 3 insertions(+), 2 deletions(-)
25
26
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/char/exynos4210_uart.c
29
+++ b/hw/char/exynos4210_uart.c
30
@@ -XXX,XX +XXX,XX @@ static void exynos4210_uart_init(Object *obj)
31
SysBusDevice *dev = SYS_BUS_DEVICE(obj);
32
Exynos4210UartState *s = EXYNOS4210_UART(dev);
33
34
- s->fifo_timeout_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
35
- exynos4210_uart_timeout_int, s);
36
s->wordtime = NANOSECONDS_PER_SECOND * 10 / 9600;
37
38
/* memory mapping */
39
@@ -XXX,XX +XXX,XX @@ static void exynos4210_uart_realize(DeviceState *dev, Error **errp)
40
{
41
Exynos4210UartState *s = EXYNOS4210_UART(dev);
42
43
+ s->fifo_timeout_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
44
+ exynos4210_uart_timeout_int, s);
45
+
46
qemu_chr_fe_set_handlers(&s->chr, exynos4210_uart_can_receive,
47
exynos4210_uart_receive, exynos4210_uart_event,
48
NULL, s, NULL, true);
49
--
50
2.20.1
51
52
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
When booting without device tree, the Linux kernels uses the $R1
4
register to determine the machine type. The list of values is
5
registered at [1].
6
7
There are two entries for the Raspberry Pi:
8
9
- https://www.arm.linux.org.uk/developer/machines/list.php?mid=3138
10
name: MACH_TYPE_BCM2708
11
value: 0xc42 (3138)
12
status: Active, not mainlined
13
date: 15 Oct 2010
14
15
- https://www.arm.linux.org.uk/developer/machines/list.php?mid=4828
16
name: MACH_TYPE_BCM2835
17
value: 4828
18
status: Active, mainlined
19
date: 6 Dec 2013
20
21
QEMU always used the non-mainlined type MACH_TYPE_BCM2708.
22
The value 0xc43 is registered to 'MX51_GGC' (processor i.MX51), and
23
0xc44 to 'Western Digital Sharespace NAS' (processor Marvell 88F5182).
24
25
The Raspberry Pi foundation bootloader only sets the BCM2708 machine
26
type, see [2] or [3]:
27
28
133 9:
29
134 mov r0, #0
30
135 ldr r1, =3138 @ BCM2708 machine id
31
136 ldr r2, atags @ ATAGS
32
137 bx r4
33
34
U-Boot only uses MACH_TYPE_BCM2708 (see [4]):
35
36
25 /*
37
26 * 2835 is a SKU in a series for which the 2708 is the first or primary SoC,
38
27 * so 2708 has historically been used rather than a dedicated 2835 ID.
39
28 *
40
29 * We don't define a machine type for bcm2709/bcm2836 since the RPi Foundation
41
30 * chose to use someone else's previously registered machine ID (3139, MX51_GGC)
42
31 * rather than obtaining a valid ID:-/
43
32 *
44
33 * For the bcm2837, hopefully a machine type is not needed, since everything
45
34 * is DT.
46
35 */
47
48
While the definition MACH_BCM2709 with value 0xc43 was introduced in
49
a commit described "Add 2709 platform for Raspberry Pi 2" out of the
50
mainline Linux kernel, it does not seem used, and the platform is
51
introduced with Device Tree support anyway (see [5] and [6]).
52
53
Remove the unused values (0xc43 introduced in commit 1df7d1f9303aef
54
"raspi: add raspberry pi 2 machine" and 0xc44 in commit bade58166f4
55
"raspi: Raspberry Pi 3 support"), keeping only MACH_TYPE_BCM2708.
56
57
[1] https://www.arm.linux.org.uk/developer/machines/
58
[2] https://github.com/raspberrypi/tools/blob/920c7ed2e/armstubs/armstub7.S#L135
59
[3] https://github.com/raspberrypi/tools/blob/49719d554/armstubs/armstub7.S#L64
60
[4] https://gitlab.denx.de/u-boot/u-boot/blob/v2015.04/include/configs/rpi-common.h#L18
61
[5] https://github.com/raspberrypi/linux/commit/d9fac63adac#diff-6722037d79570df5b392a49e0e006573R526
62
[6] http://lists.infradead.org/pipermail/linux-rpi-kernel/2015-February/001268.html
63
64
Cc: Zoltán Baldaszti <bztemail@gmail.com>
65
Cc: Pekka Enberg <penberg@iki.fi>
66
Cc: Stephen Warren <swarren@nvidia.com>
67
Cc: Kshitij Soni <kshitij.soni@broadcom.com>
68
Cc: Michael Chan <michael.chan@broadcom.com>
69
Cc: Andrew Baumann <Andrew.Baumann@microsoft.com>
70
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
71
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
72
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
73
Message-id: 20200208165645.15657-2-f4bug@amsat.org
74
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
75
---
76
hw/arm/raspi.c | 6 +++---
77
1 file changed, 3 insertions(+), 3 deletions(-)
78
79
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
80
index XXXXXXX..XXXXXXX 100644
81
--- a/hw/arm/raspi.c
82
+++ b/hw/arm/raspi.c
83
@@ -XXX,XX +XXX,XX @@
84
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
85
#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
86
87
-/* Table of Linux board IDs for different Pi versions */
88
-static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
89
+/* Registered machine type (matches RPi Foundation bootloader and U-Boot) */
90
+#define MACH_TYPE_BCM2708 3138
91
92
typedef struct RasPiState {
93
BCM283XState soc;
94
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
95
static struct arm_boot_info binfo;
96
int r;
97
98
- binfo.board_id = raspi_boardid[version];
99
+ binfo.board_id = MACH_TYPE_BCM2708;
100
binfo.ram_size = ram_size;
101
binfo.nb_cpus = machine->smp.cpus;
102
103
--
104
2.20.1
105
106
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
We hardcode the board revision as 0xa21041 for the raspi2, and
4
0xa02082 for the raspi3:
5
6
166 static void raspi_init(MachineState *machine, int version)
7
167 {
8
...
9
194 int board_rev = version == 3 ? 0xa02082 : 0xa21041;
10
11
These revision codes are for the 2B and 3B models, see:
12
https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
13
14
Correct the board description.
15
16
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20200208165645.15657-3-f4bug@amsat.org
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
21
hw/arm/raspi.c | 4 ++--
22
1 file changed, 2 insertions(+), 2 deletions(-)
23
24
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/raspi.c
27
+++ b/hw/arm/raspi.c
28
@@ -XXX,XX +XXX,XX @@ static void raspi2_init(MachineState *machine)
29
30
static void raspi2_machine_init(MachineClass *mc)
31
{
32
- mc->desc = "Raspberry Pi 2";
33
+ mc->desc = "Raspberry Pi 2B";
34
mc->init = raspi2_init;
35
mc->block_default_type = IF_SD;
36
mc->no_parallel = 1;
37
@@ -XXX,XX +XXX,XX @@ static void raspi3_init(MachineState *machine)
38
39
static void raspi3_machine_init(MachineClass *mc)
40
{
41
- mc->desc = "Raspberry Pi 3";
42
+ mc->desc = "Raspberry Pi 3B";
43
mc->init = raspi3_init;
44
mc->block_default_type = IF_SD;
45
mc->no_parallel = 1;
46
--
47
2.20.1
48
49
diff view generated by jsdifflib
1
From: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
VMState added by this patch preserves correct
3
The board revision encode the board version. Add a helper
4
loading of the integratorcp device state.
4
to extract the version, and use it.
5
5
6
Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20170131114310.6768.79416.stgit@PASHA-ISP
7
Message-id: 20200208165645.15657-4-f4bug@amsat.org
8
[PMM: removed unnecessary minimum_version_id_old lines]
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
hw/arm/integratorcp.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++
11
hw/arm/raspi.c | 31 +++++++++++++++++++++++++++----
13
1 file changed, 59 insertions(+)
12
1 file changed, 27 insertions(+), 4 deletions(-)
14
13
15
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/integratorcp.c
16
--- a/hw/arm/raspi.c
18
+++ b/hw/arm/integratorcp.c
17
+++ b/hw/arm/raspi.c
19
@@ -XXX,XX +XXX,XX @@ static uint8_t integrator_spd[128] = {
18
@@ -XXX,XX +XXX,XX @@
20
0xe, 4, 0x1c, 1, 2, 0x20, 0xc0, 0, 0, 0, 0, 0x30, 0x28, 0x30, 0x28, 0x40
19
#include "qapi/error.h"
21
};
20
#include "cpu.h"
22
21
#include "hw/arm/bcm2836.h"
23
+static const VMStateDescription vmstate_integratorcm = {
22
+#include "hw/registerfields.h"
24
+ .name = "integratorcm",
23
#include "qemu/error-report.h"
25
+ .version_id = 1,
24
#include "hw/boards.h"
26
+ .minimum_version_id = 1,
25
#include "hw/loader.h"
27
+ .fields = (VMStateField[]) {
26
@@ -XXX,XX +XXX,XX @@ typedef struct RasPiState {
28
+ VMSTATE_UINT32(cm_osc, IntegratorCMState),
27
MemoryRegion ram;
29
+ VMSTATE_UINT32(cm_ctrl, IntegratorCMState),
28
} RasPiState;
30
+ VMSTATE_UINT32(cm_lock, IntegratorCMState),
29
31
+ VMSTATE_UINT32(cm_auxosc, IntegratorCMState),
30
+/*
32
+ VMSTATE_UINT32(cm_sdram, IntegratorCMState),
31
+ * Board revision codes:
33
+ VMSTATE_UINT32(cm_init, IntegratorCMState),
32
+ * www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/
34
+ VMSTATE_UINT32(cm_flags, IntegratorCMState),
33
+ */
35
+ VMSTATE_UINT32(cm_nvflags, IntegratorCMState),
34
+FIELD(REV_CODE, REVISION, 0, 4);
36
+ VMSTATE_UINT32(int_level, IntegratorCMState),
35
+FIELD(REV_CODE, TYPE, 4, 8);
37
+ VMSTATE_UINT32(irq_enabled, IntegratorCMState),
36
+FIELD(REV_CODE, PROCESSOR, 12, 4);
38
+ VMSTATE_UINT32(fiq_enabled, IntegratorCMState),
37
+FIELD(REV_CODE, MANUFACTURER, 16, 4);
39
+ VMSTATE_END_OF_LIST()
38
+FIELD(REV_CODE, MEMORY_SIZE, 20, 3);
40
+ }
39
+FIELD(REV_CODE, STYLE, 23, 1);
41
+};
42
+
40
+
43
static uint64_t integratorcm_read(void *opaque, hwaddr offset,
41
+static int board_processor_id(uint32_t board_rev)
44
unsigned size)
42
+{
45
{
43
+ assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
46
@@ -XXX,XX +XXX,XX @@ typedef struct icp_pic_state {
44
+ return FIELD_EX32(board_rev, REV_CODE, PROCESSOR);
47
qemu_irq parent_fiq;
48
} icp_pic_state;
49
50
+static const VMStateDescription vmstate_icp_pic = {
51
+ .name = "icp_pic",
52
+ .version_id = 1,
53
+ .minimum_version_id = 1,
54
+ .fields = (VMStateField[]) {
55
+ VMSTATE_UINT32(level, icp_pic_state),
56
+ VMSTATE_UINT32(irq_enabled, icp_pic_state),
57
+ VMSTATE_UINT32(fiq_enabled, icp_pic_state),
58
+ VMSTATE_END_OF_LIST()
59
+ }
60
+};
61
+
62
static void icp_pic_update(icp_pic_state *s)
63
{
64
uint32_t flags;
65
@@ -XXX,XX +XXX,XX @@ typedef struct ICPCtrlRegsState {
66
#define ICP_INTREG_WPROT (1 << 0)
67
#define ICP_INTREG_CARDIN (1 << 3)
68
69
+static const VMStateDescription vmstate_icp_control = {
70
+ .name = "icp_control",
71
+ .version_id = 1,
72
+ .minimum_version_id = 1,
73
+ .fields = (VMStateField[]) {
74
+ VMSTATE_UINT32(intreg_state, ICPCtrlRegsState),
75
+ VMSTATE_END_OF_LIST()
76
+ }
77
+};
78
+
79
static uint64_t icp_control_read(void *opaque, hwaddr offset,
80
unsigned size)
81
{
82
@@ -XXX,XX +XXX,XX @@ static void core_class_init(ObjectClass *klass, void *data)
83
84
dc->props = core_properties;
85
dc->realize = integratorcm_realize;
86
+ dc->vmsd = &vmstate_integratorcm;
87
+}
45
+}
88
+
46
+
89
+static void icp_pic_class_init(ObjectClass *klass, void *data)
47
+static int board_version(uint32_t board_rev)
90
+{
48
+{
91
+ DeviceClass *dc = DEVICE_CLASS(klass);
49
+ return board_processor_id(board_rev) + 1;
92
+
93
+ dc->vmsd = &vmstate_icp_pic;
94
+}
50
+}
95
+
51
+
96
+static void icp_control_class_init(ObjectClass *klass, void *data)
52
static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
97
+{
53
{
98
+ DeviceClass *dc = DEVICE_CLASS(klass);
54
static const uint32_t smpboot[] = {
99
+
55
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
100
+ dc->vmsd = &vmstate_icp_control;
56
arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
101
}
57
}
102
58
103
static const TypeInfo core_info = {
59
-static void raspi_init(MachineState *machine, int version)
104
@@ -XXX,XX +XXX,XX @@ static const TypeInfo icp_pic_info = {
60
+static void raspi_init(MachineState *machine, uint32_t board_rev)
105
.parent = TYPE_SYS_BUS_DEVICE,
61
{
106
.instance_size = sizeof(icp_pic_state),
62
RasPiState *s = g_new0(RasPiState, 1);
107
.instance_init = icp_pic_init,
63
+ int version = board_version(board_rev);
108
+ .class_init = icp_pic_class_init,
64
uint32_t vcram_size;
109
};
65
DriveInfo *di;
110
66
BlockBackend *blk;
111
static const TypeInfo icp_ctrl_regs_info = {
67
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
112
@@ -XXX,XX +XXX,XX @@ static const TypeInfo icp_ctrl_regs_info = {
68
/* Setup the SOC */
113
.parent = TYPE_SYS_BUS_DEVICE,
69
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
114
.instance_size = sizeof(ICPCtrlRegsState),
70
&error_abort);
115
.instance_init = icp_control_init,
71
- int board_rev = version == 3 ? 0xa02082 : 0xa21041;
116
+ .class_init = icp_control_class_init,
72
object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
117
};
73
&error_abort);
118
74
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_abort);
119
static void integratorcp_register_types(void)
75
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
76
77
static void raspi2_init(MachineState *machine)
78
{
79
- raspi_init(machine, 2);
80
+ raspi_init(machine, 0xa21041);
81
}
82
83
static void raspi2_machine_init(MachineClass *mc)
84
@@ -XXX,XX +XXX,XX @@ DEFINE_MACHINE("raspi2", raspi2_machine_init)
85
#ifdef TARGET_AARCH64
86
static void raspi3_init(MachineState *machine)
87
{
88
- raspi_init(machine, 3);
89
+ raspi_init(machine, 0xa02082);
90
}
91
92
static void raspi3_machine_init(MachineClass *mc)
120
--
93
--
121
2.7.4
94
2.20.1
122
95
123
96
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
The board revision encode the amount of RAM. Add a helper
4
to extract the RAM size, and use it.
5
Since the amount of RAM is fixed (it is impossible to physically
6
modify to have more or less RAM), do not allow sizes different
7
than the one anounced by the manufacturer.
8
9
Acked-by: Igor Mammedov <imammedo@redhat.com>
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200208165645.15657-5-f4bug@amsat.org
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/arm/raspi.c | 15 ++++++++++++---
16
1 file changed, 12 insertions(+), 3 deletions(-)
17
18
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/raspi.c
21
+++ b/hw/arm/raspi.c
22
@@ -XXX,XX +XXX,XX @@
23
24
#include "qemu/osdep.h"
25
#include "qemu/units.h"
26
+#include "qemu/cutils.h"
27
#include "qapi/error.h"
28
#include "cpu.h"
29
#include "hw/arm/bcm2836.h"
30
@@ -XXX,XX +XXX,XX @@ FIELD(REV_CODE, MANUFACTURER, 16, 4);
31
FIELD(REV_CODE, MEMORY_SIZE, 20, 3);
32
FIELD(REV_CODE, STYLE, 23, 1);
33
34
+static uint64_t board_ram_size(uint32_t board_rev)
35
+{
36
+ assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
37
+ return 256 * MiB << FIELD_EX32(board_rev, REV_CODE, MEMORY_SIZE);
38
+}
39
+
40
static int board_processor_id(uint32_t board_rev)
41
{
42
assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
43
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
44
{
45
RasPiState *s = g_new0(RasPiState, 1);
46
int version = board_version(board_rev);
47
+ uint64_t ram_size = board_ram_size(board_rev);
48
uint32_t vcram_size;
49
DriveInfo *di;
50
BlockBackend *blk;
51
BusState *bus;
52
DeviceState *carddev;
53
54
- if (machine->ram_size > 1 * GiB) {
55
- error_report("Requested ram size is too large for this machine: "
56
- "maximum is 1GB");
57
+ if (machine->ram_size != ram_size) {
58
+ char *size_str = size_to_str(ram_size);
59
+ error_report("Invalid RAM size, should be %s", size_str);
60
+ g_free(size_str);
61
exit(1);
62
}
63
64
--
65
2.20.1
66
67
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
The board revision encode the processor type. Add a helper
4
to extract the type, and use it.
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20200208165645.15657-6-f4bug@amsat.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/raspi.c | 18 ++++++++++++++++--
12
1 file changed, 16 insertions(+), 2 deletions(-)
13
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
17
+++ b/hw/arm/raspi.c
18
@@ -XXX,XX +XXX,XX @@ static int board_version(uint32_t board_rev)
19
return board_processor_id(board_rev) + 1;
20
}
21
22
+static const char *board_soc_type(uint32_t board_rev)
23
+{
24
+ static const char *soc_types[] = {
25
+ NULL, TYPE_BCM2836, TYPE_BCM2837,
26
+ };
27
+ int proc_id = board_processor_id(board_rev);
28
+
29
+ if (proc_id >= ARRAY_SIZE(soc_types) || !soc_types[proc_id]) {
30
+ error_report("Unsupported processor id '%d' (board revision: 0x%x)",
31
+ proc_id, board_rev);
32
+ exit(1);
33
+ }
34
+ return soc_types[proc_id];
35
+}
36
+
37
static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
38
{
39
static const uint32_t smpboot[] = {
40
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
41
}
42
43
object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
44
- version == 3 ? TYPE_BCM2837 : TYPE_BCM2836,
45
- &error_abort, NULL);
46
+ board_soc_type(board_rev), &error_abort, NULL);
47
48
/* Allocate and map RAM */
49
memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
50
--
51
2.20.1
52
53
diff view generated by jsdifflib
1
From: Julian Brown <julian@codesourcery.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Since the integratorcp board creates the CPU object directly
3
There is no point in creating the SoC object before allocating the RAM.
4
rather than via cpu_arm_init(), we have to call the CPU
4
Move the call to keep all the SoC-related calls together.
5
class parse_features() method ourselves if we want to
6
support the user passing features via the -cpu command
7
line argument as well as just the cpu name. Do so.
8
5
9
Signed-off-by: Julian Brown <julian@codesourcery.com>
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
[PMM: split out into its own patch]
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
8
Message-id: 20200208165645.15657-7-f4bug@amsat.org
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
11
---
14
hw/arm/integratorcp.c | 19 +++++++++++++++++--
12
hw/arm/raspi.c | 5 ++---
15
1 file changed, 17 insertions(+), 2 deletions(-)
13
1 file changed, 2 insertions(+), 3 deletions(-)
16
14
17
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/integratorcp.c
17
--- a/hw/arm/raspi.c
20
+++ b/hw/arm/integratorcp.c
18
+++ b/hw/arm/raspi.c
21
@@ -XXX,XX +XXX,XX @@ static void integratorcp_init(MachineState *machine)
19
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
22
const char *kernel_filename = machine->kernel_filename;
23
const char *kernel_cmdline = machine->kernel_cmdline;
24
const char *initrd_filename = machine->initrd_filename;
25
+ char **cpustr;
26
ObjectClass *cpu_oc;
27
+ CPUClass *cc;
28
Object *cpuobj;
29
ARMCPU *cpu;
30
+ const char *typename;
31
MemoryRegion *address_space_mem = get_system_memory();
32
MemoryRegion *ram = g_new(MemoryRegion, 1);
33
MemoryRegion *ram_alias = g_new(MemoryRegion, 1);
34
qemu_irq pic[32];
35
DeviceState *dev, *sic, *icp;
36
int i;
37
+ Error *err = NULL;
38
39
if (!cpu_model) {
40
cpu_model = "arm926";
41
}
42
43
- cpu_oc = cpu_class_by_name(TYPE_ARM_CPU, cpu_model);
44
+ cpustr = g_strsplit(cpu_model, ",", 2);
45
+
46
+ cpu_oc = cpu_class_by_name(TYPE_ARM_CPU, cpustr[0]);
47
if (!cpu_oc) {
48
fprintf(stderr, "Unable to find CPU definition\n");
49
exit(1);
20
exit(1);
50
}
21
}
51
+ typename = object_class_get_name(cpu_oc);
22
52
+
23
- object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
53
+ cc = CPU_CLASS(cpu_oc);
24
- board_soc_type(board_rev), &error_abort, NULL);
54
+ cc->parse_features(typename, cpustr[1], &err);
25
-
55
+ g_strfreev(cpustr);
26
/* Allocate and map RAM */
56
+ if (err) {
27
memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
57
+ error_report_err(err);
28
machine->ram_size);
58
+ exit(1);
29
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
59
+ }
30
memory_region_add_subregion_overlap(get_system_memory(), 0, &s->ram, 0);
60
31
61
- cpuobj = object_new(object_class_get_name(cpu_oc));
32
/* Setup the SOC */
62
+ cpuobj = object_new(typename);
33
+ object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
63
34
+ board_soc_type(board_rev), &error_abort, NULL);
64
/* By default ARM1176 CPUs have EL3 enabled. This board does not
35
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
65
* currently support EL3 so the CPU EL3 property is disabled before
36
&error_abort);
37
object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
66
--
38
--
67
2.7.4
39
2.20.1
68
40
69
41
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
The Aspeed SoC includes a set of watchdog timers using 32-bit
3
QOM'ify RaspiMachineState. Now machines inherit of RaspiMachineClass.
4
decrement counters, which can be based either on the APB clock or
5
a 1 MHz clock.
6
4
7
The watchdog timer is designed to prevent system deadlock and, in
5
Cc: Igor Mammedov <imammedo@redhat.com>
8
general, it should be restarted before timeout. When a timeout occurs,
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
different types of signals can be generated, ARM reset, SOC reset,
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
10
System reset, CPU Interrupt, external signal or boot from alternate
8
Message-id: 20200208165645.15657-8-f4bug@amsat.org
11
block. The current model only performs the system reset function as
12
this is used by U-Boot and Linux.
13
14
Signed-off-by: Joel Stanley <joel@jms.id.au>
15
Message-id: 1485452251-1593-2-git-send-email-clg@kaod.org
16
[clg: - fixed compile breakage
17
- fixed io region size
18
- added watchdog_perform_action() on timer expiry
19
- wrote a commit log
20
- merged fixes from Andrew Jeffery to scale the reload value ]
21
Signed-off-by: Cédric Le Goater <clg@kaod.org>
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
11
---
25
hw/watchdog/Makefile.objs | 1 +
12
hw/arm/raspi.c | 56 +++++++++++++++++++++++++++++++++++++++++++-------
26
include/hw/watchdog/wdt_aspeed.h | 32 ++++++
13
1 file changed, 49 insertions(+), 7 deletions(-)
27
hw/watchdog/wdt_aspeed.c | 225 +++++++++++++++++++++++++++++++++++++++
28
3 files changed, 258 insertions(+)
29
create mode 100644 include/hw/watchdog/wdt_aspeed.h
30
create mode 100644 hw/watchdog/wdt_aspeed.c
31
14
32
diff --git a/hw/watchdog/Makefile.objs b/hw/watchdog/Makefile.objs
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
33
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/watchdog/Makefile.objs
17
--- a/hw/arm/raspi.c
35
+++ b/hw/watchdog/Makefile.objs
18
+++ b/hw/arm/raspi.c
36
@@ -XXX,XX +XXX,XX @@ common-obj-y += watchdog.o
37
common-obj-$(CONFIG_WDT_IB6300ESB) += wdt_i6300esb.o
38
common-obj-$(CONFIG_WDT_IB700) += wdt_ib700.o
39
common-obj-$(CONFIG_WDT_DIAG288) += wdt_diag288.o
40
+common-obj-$(CONFIG_ASPEED_SOC) += wdt_aspeed.o
41
diff --git a/include/hw/watchdog/wdt_aspeed.h b/include/hw/watchdog/wdt_aspeed.h
42
new file mode 100644
43
index XXXXXXX..XXXXXXX
44
--- /dev/null
45
+++ b/include/hw/watchdog/wdt_aspeed.h
46
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
47
+/*
20
/* Registered machine type (matches RPi Foundation bootloader and U-Boot) */
48
+ * ASPEED Watchdog Controller
21
#define MACH_TYPE_BCM2708 3138
49
+ *
22
50
+ * Copyright (C) 2016-2017 IBM Corp.
23
-typedef struct RasPiState {
51
+ *
24
+typedef struct RaspiMachineState {
52
+ * This code is licensed under the GPL version 2 or later. See the
25
+ /*< private >*/
53
+ * COPYING file in the top-level directory.
26
+ MachineState parent_obj;
54
+ */
27
+ /*< public >*/
55
+#ifndef ASPEED_WDT_H
28
BCM283XState soc;
56
+#define ASPEED_WDT_H
29
MemoryRegion ram;
30
-} RasPiState;
31
+} RaspiMachineState;
57
+
32
+
58
+#include "hw/sysbus.h"
33
+typedef struct RaspiMachineClass {
34
+ /*< private >*/
35
+ MachineClass parent_obj;
36
+ /*< public >*/
37
+} RaspiMachineClass;
59
+
38
+
60
+#define TYPE_ASPEED_WDT "aspeed.wdt"
39
+#define TYPE_RASPI_MACHINE MACHINE_TYPE_NAME("raspi-common")
61
+#define ASPEED_WDT(obj) \
40
+#define RASPI_MACHINE(obj) \
62
+ OBJECT_CHECK(AspeedWDTState, (obj), TYPE_ASPEED_WDT)
41
+ OBJECT_CHECK(RaspiMachineState, (obj), TYPE_RASPI_MACHINE)
63
+
42
+
64
+#define ASPEED_WDT_REGS_MAX (0x20 / 4)
43
+#define RASPI_MACHINE_CLASS(klass) \
44
+ OBJECT_CLASS_CHECK(RaspiMachineClass, (klass), TYPE_RASPI_MACHINE)
45
+#define RASPI_MACHINE_GET_CLASS(obj) \
46
+ OBJECT_GET_CLASS(RaspiMachineClass, (obj), TYPE_RASPI_MACHINE)
47
48
/*
49
* Board revision codes:
50
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
51
52
static void raspi_init(MachineState *machine, uint32_t board_rev)
53
{
54
- RasPiState *s = g_new0(RasPiState, 1);
55
+ RaspiMachineState *s = RASPI_MACHINE(machine);
56
int version = board_version(board_rev);
57
uint64_t ram_size = board_ram_size(board_rev);
58
uint32_t vcram_size;
59
@@ -XXX,XX +XXX,XX @@ static void raspi2_init(MachineState *machine)
60
raspi_init(machine, 0xa21041);
61
}
62
63
-static void raspi2_machine_init(MachineClass *mc)
64
+static void raspi2_machine_class_init(ObjectClass *oc, void *data)
65
{
66
+ MachineClass *mc = MACHINE_CLASS(oc);
65
+
67
+
66
+typedef struct AspeedWDTState {
68
mc->desc = "Raspberry Pi 2B";
67
+ /*< private >*/
69
mc->init = raspi2_init;
68
+ SysBusDevice parent_obj;
70
mc->block_default_type = IF_SD;
69
+ QEMUTimer *timer;
71
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
72
mc->default_ram_size = 1 * GiB;
73
mc->ignore_memory_transaction_failures = true;
74
};
75
-DEFINE_MACHINE("raspi2", raspi2_machine_init)
76
77
#ifdef TARGET_AARCH64
78
static void raspi3_init(MachineState *machine)
79
@@ -XXX,XX +XXX,XX @@ static void raspi3_init(MachineState *machine)
80
raspi_init(machine, 0xa02082);
81
}
82
83
-static void raspi3_machine_init(MachineClass *mc)
84
+static void raspi3_machine_class_init(ObjectClass *oc, void *data)
85
{
86
+ MachineClass *mc = MACHINE_CLASS(oc);
70
+
87
+
71
+ /*< public >*/
88
mc->desc = "Raspberry Pi 3B";
72
+ MemoryRegion iomem;
89
mc->init = raspi3_init;
73
+ uint32_t regs[ASPEED_WDT_REGS_MAX];
90
mc->block_default_type = IF_SD;
91
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_init(MachineClass *mc)
92
mc->default_cpus = BCM283X_NCPUS;
93
mc->default_ram_size = 1 * GiB;
94
}
95
-DEFINE_MACHINE("raspi3", raspi3_machine_init)
96
#endif
74
+
97
+
75
+ uint32_t pclk_freq;
98
+static const TypeInfo raspi_machine_types[] = {
76
+} AspeedWDTState;
99
+ {
77
+
100
+ .name = MACHINE_TYPE_NAME("raspi2"),
78
+#endif /* ASPEED_WDT_H */
101
+ .parent = TYPE_RASPI_MACHINE,
79
diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c
102
+ .class_init = raspi2_machine_class_init,
80
new file mode 100644
103
+#ifdef TARGET_AARCH64
81
index XXXXXXX..XXXXXXX
104
+ }, {
82
--- /dev/null
105
+ .name = MACHINE_TYPE_NAME("raspi3"),
83
+++ b/hw/watchdog/wdt_aspeed.c
106
+ .parent = TYPE_RASPI_MACHINE,
84
@@ -XXX,XX +XXX,XX @@
107
+ .class_init = raspi3_machine_class_init,
85
+/*
108
+#endif
86
+ * ASPEED Watchdog Controller
109
+ }, {
87
+ *
110
+ .name = TYPE_RASPI_MACHINE,
88
+ * Copyright (C) 2016-2017 IBM Corp.
111
+ .parent = TYPE_MACHINE,
89
+ *
112
+ .instance_size = sizeof(RaspiMachineState),
90
+ * This code is licensed under the GPL version 2 or later. See the
113
+ .class_size = sizeof(RaspiMachineClass),
91
+ * COPYING file in the top-level directory.
114
+ .abstract = true,
92
+ */
93
+
94
+#include "qemu/osdep.h"
95
+#include "qemu/log.h"
96
+#include "sysemu/watchdog.h"
97
+#include "hw/sysbus.h"
98
+#include "qemu/timer.h"
99
+#include "hw/watchdog/wdt_aspeed.h"
100
+
101
+#define WDT_STATUS (0x00 / 4)
102
+#define WDT_RELOAD_VALUE (0x04 / 4)
103
+#define WDT_RESTART (0x08 / 4)
104
+#define WDT_CTRL (0x0C / 4)
105
+#define WDT_CTRL_RESET_MODE_SOC (0x00 << 5)
106
+#define WDT_CTRL_RESET_MODE_FULL_CHIP (0x01 << 5)
107
+#define WDT_CTRL_1MHZ_CLK BIT(4)
108
+#define WDT_CTRL_WDT_EXT BIT(3)
109
+#define WDT_CTRL_WDT_INTR BIT(2)
110
+#define WDT_CTRL_RESET_SYSTEM BIT(1)
111
+#define WDT_CTRL_ENABLE BIT(0)
112
+
113
+#define WDT_TIMEOUT_STATUS (0x10 / 4)
114
+#define WDT_TIMEOUT_CLEAR (0x14 / 4)
115
+#define WDT_RESET_WDITH (0x18 / 4)
116
+
117
+#define WDT_RESTART_MAGIC 0x4755
118
+
119
+static bool aspeed_wdt_is_enabled(const AspeedWDTState *s)
120
+{
121
+ return s->regs[WDT_CTRL] & WDT_CTRL_ENABLE;
122
+}
123
+
124
+static uint64_t aspeed_wdt_read(void *opaque, hwaddr offset, unsigned size)
125
+{
126
+ AspeedWDTState *s = ASPEED_WDT(opaque);
127
+
128
+ offset >>= 2;
129
+
130
+ switch (offset) {
131
+ case WDT_STATUS:
132
+ return s->regs[WDT_STATUS];
133
+ case WDT_RELOAD_VALUE:
134
+ return s->regs[WDT_RELOAD_VALUE];
135
+ case WDT_RESTART:
136
+ qemu_log_mask(LOG_GUEST_ERROR,
137
+ "%s: read from write-only reg at offset 0x%"
138
+ HWADDR_PRIx "\n", __func__, offset);
139
+ return 0;
140
+ case WDT_CTRL:
141
+ return s->regs[WDT_CTRL];
142
+ case WDT_TIMEOUT_STATUS:
143
+ case WDT_TIMEOUT_CLEAR:
144
+ case WDT_RESET_WDITH:
145
+ qemu_log_mask(LOG_UNIMP,
146
+ "%s: uninmplemented read at offset 0x%" HWADDR_PRIx "\n",
147
+ __func__, offset);
148
+ return 0;
149
+ default:
150
+ qemu_log_mask(LOG_GUEST_ERROR,
151
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
152
+ __func__, offset);
153
+ return 0;
154
+ }
155
+
156
+}
157
+
158
+static void aspeed_wdt_reload(AspeedWDTState *s, bool pclk)
159
+{
160
+ uint32_t reload;
161
+
162
+ if (pclk) {
163
+ reload = muldiv64(s->regs[WDT_RELOAD_VALUE], NANOSECONDS_PER_SECOND,
164
+ s->pclk_freq);
165
+ } else {
166
+ reload = s->regs[WDT_RELOAD_VALUE] * 1000;
167
+ }
168
+
169
+ if (aspeed_wdt_is_enabled(s)) {
170
+ timer_mod(s->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + reload);
171
+ }
172
+}
173
+
174
+static void aspeed_wdt_write(void *opaque, hwaddr offset, uint64_t data,
175
+ unsigned size)
176
+{
177
+ AspeedWDTState *s = ASPEED_WDT(opaque);
178
+ bool enable = data & WDT_CTRL_ENABLE;
179
+
180
+ offset >>= 2;
181
+
182
+ switch (offset) {
183
+ case WDT_STATUS:
184
+ qemu_log_mask(LOG_GUEST_ERROR,
185
+ "%s: write to read-only reg at offset 0x%"
186
+ HWADDR_PRIx "\n", __func__, offset);
187
+ break;
188
+ case WDT_RELOAD_VALUE:
189
+ s->regs[WDT_RELOAD_VALUE] = data;
190
+ break;
191
+ case WDT_RESTART:
192
+ if ((data & 0xFFFF) == WDT_RESTART_MAGIC) {
193
+ s->regs[WDT_STATUS] = s->regs[WDT_RELOAD_VALUE];
194
+ aspeed_wdt_reload(s, !(data & WDT_CTRL_1MHZ_CLK));
195
+ }
196
+ break;
197
+ case WDT_CTRL:
198
+ if (enable && !aspeed_wdt_is_enabled(s)) {
199
+ s->regs[WDT_CTRL] = data;
200
+ aspeed_wdt_reload(s, !(data & WDT_CTRL_1MHZ_CLK));
201
+ } else if (!enable && aspeed_wdt_is_enabled(s)) {
202
+ s->regs[WDT_CTRL] = data;
203
+ timer_del(s->timer);
204
+ }
205
+ break;
206
+ case WDT_TIMEOUT_STATUS:
207
+ case WDT_TIMEOUT_CLEAR:
208
+ case WDT_RESET_WDITH:
209
+ qemu_log_mask(LOG_UNIMP,
210
+ "%s: uninmplemented write at offset 0x%" HWADDR_PRIx "\n",
211
+ __func__, offset);
212
+ break;
213
+ default:
214
+ qemu_log_mask(LOG_GUEST_ERROR,
215
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
216
+ __func__, offset);
217
+ }
218
+ return;
219
+}
220
+
221
+static WatchdogTimerModel model = {
222
+ .wdt_name = TYPE_ASPEED_WDT,
223
+ .wdt_description = "Aspeed watchdog device",
224
+};
225
+
226
+static const VMStateDescription vmstate_aspeed_wdt = {
227
+ .name = "vmstate_aspeed_wdt",
228
+ .version_id = 0,
229
+ .minimum_version_id = 0,
230
+ .fields = (VMStateField[]) {
231
+ VMSTATE_TIMER_PTR(timer, AspeedWDTState),
232
+ VMSTATE_UINT32_ARRAY(regs, AspeedWDTState, ASPEED_WDT_REGS_MAX),
233
+ VMSTATE_END_OF_LIST()
234
+ }
115
+ }
235
+};
116
+};
236
+
117
+
237
+static const MemoryRegionOps aspeed_wdt_ops = {
118
+DEFINE_TYPES(raspi_machine_types)
238
+ .read = aspeed_wdt_read,
239
+ .write = aspeed_wdt_write,
240
+ .endianness = DEVICE_LITTLE_ENDIAN,
241
+ .valid.min_access_size = 4,
242
+ .valid.max_access_size = 4,
243
+ .valid.unaligned = false,
244
+};
245
+
246
+static void aspeed_wdt_reset(DeviceState *dev)
247
+{
248
+ AspeedWDTState *s = ASPEED_WDT(dev);
249
+
250
+ s->regs[WDT_STATUS] = 0x3EF1480;
251
+ s->regs[WDT_RELOAD_VALUE] = 0x03EF1480;
252
+ s->regs[WDT_RESTART] = 0;
253
+ s->regs[WDT_CTRL] = 0;
254
+
255
+ timer_del(s->timer);
256
+}
257
+
258
+static void aspeed_wdt_timer_expired(void *dev)
259
+{
260
+ AspeedWDTState *s = ASPEED_WDT(dev);
261
+
262
+ qemu_log_mask(CPU_LOG_RESET, "Watchdog timer expired.\n");
263
+ watchdog_perform_action();
264
+ timer_del(s->timer);
265
+}
266
+
267
+#define PCLK_HZ 24000000
268
+
269
+static void aspeed_wdt_realize(DeviceState *dev, Error **errp)
270
+{
271
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
272
+ AspeedWDTState *s = ASPEED_WDT(dev);
273
+
274
+ s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, aspeed_wdt_timer_expired, dev);
275
+
276
+ /* FIXME: This setting should be derived from the SCU hw strapping
277
+ * register SCU70
278
+ */
279
+ s->pclk_freq = PCLK_HZ;
280
+
281
+ memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_wdt_ops, s,
282
+ TYPE_ASPEED_WDT, ASPEED_WDT_REGS_MAX * 4);
283
+ sysbus_init_mmio(sbd, &s->iomem);
284
+}
285
+
286
+static void aspeed_wdt_class_init(ObjectClass *klass, void *data)
287
+{
288
+ DeviceClass *dc = DEVICE_CLASS(klass);
289
+
290
+ dc->realize = aspeed_wdt_realize;
291
+ dc->reset = aspeed_wdt_reset;
292
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
293
+ dc->vmsd = &vmstate_aspeed_wdt;
294
+}
295
+
296
+static const TypeInfo aspeed_wdt_info = {
297
+ .parent = TYPE_SYS_BUS_DEVICE,
298
+ .name = TYPE_ASPEED_WDT,
299
+ .instance_size = sizeof(AspeedWDTState),
300
+ .class_init = aspeed_wdt_class_init,
301
+};
302
+
303
+static void wdt_aspeed_register_types(void)
304
+{
305
+ watchdog_add_model(&model);
306
+ type_register_static(&aspeed_wdt_info);
307
+}
308
+
309
+type_init(wdt_aspeed_register_types)
310
--
119
--
311
2.7.4
120
2.20.1
312
121
313
122
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
We want to have a common class_init(). The only value that
4
matters (and changes) is the board revision.
5
Pass the board_rev as class_data to class_init().
6
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20200208165645.15657-9-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/raspi.c | 17 ++++++++++++++---
13
1 file changed, 14 insertions(+), 3 deletions(-)
14
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/raspi.c
18
+++ b/hw/arm/raspi.c
19
@@ -XXX,XX +XXX,XX @@ typedef struct RaspiMachineClass {
20
/*< private >*/
21
MachineClass parent_obj;
22
/*< public >*/
23
+ uint32_t board_rev;
24
} RaspiMachineClass;
25
26
#define TYPE_RASPI_MACHINE MACHINE_TYPE_NAME("raspi-common")
27
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
28
arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
29
}
30
31
-static void raspi_init(MachineState *machine, uint32_t board_rev)
32
+static void raspi_init(MachineState *machine)
33
{
34
+ RaspiMachineClass *mc = RASPI_MACHINE_GET_CLASS(machine);
35
RaspiMachineState *s = RASPI_MACHINE(machine);
36
+ uint32_t board_rev = mc->board_rev;
37
int version = board_version(board_rev);
38
uint64_t ram_size = board_ram_size(board_rev);
39
uint32_t vcram_size;
40
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
41
42
static void raspi2_init(MachineState *machine)
43
{
44
- raspi_init(machine, 0xa21041);
45
+ raspi_init(machine);
46
}
47
48
static void raspi2_machine_class_init(ObjectClass *oc, void *data)
49
{
50
MachineClass *mc = MACHINE_CLASS(oc);
51
+ RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
52
+ uint32_t board_rev = (uint32_t)(uintptr_t)data;
53
54
+ rmc->board_rev = board_rev;
55
mc->desc = "Raspberry Pi 2B";
56
mc->init = raspi2_init;
57
mc->block_default_type = IF_SD;
58
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
59
#ifdef TARGET_AARCH64
60
static void raspi3_init(MachineState *machine)
61
{
62
- raspi_init(machine, 0xa02082);
63
+ raspi_init(machine);
64
}
65
66
static void raspi3_machine_class_init(ObjectClass *oc, void *data)
67
{
68
MachineClass *mc = MACHINE_CLASS(oc);
69
+ RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
70
+ uint32_t board_rev = (uint32_t)(uintptr_t)data;
71
72
+ rmc->board_rev = board_rev;
73
mc->desc = "Raspberry Pi 3B";
74
mc->init = raspi3_init;
75
mc->block_default_type = IF_SD;
76
@@ -XXX,XX +XXX,XX @@ static const TypeInfo raspi_machine_types[] = {
77
.name = MACHINE_TYPE_NAME("raspi2"),
78
.parent = TYPE_RASPI_MACHINE,
79
.class_init = raspi2_machine_class_init,
80
+ .class_data = (void *)0xa21041,
81
#ifdef TARGET_AARCH64
82
}, {
83
.name = MACHINE_TYPE_NAME("raspi3"),
84
.parent = TYPE_RASPI_MACHINE,
85
.class_init = raspi3_machine_class_init,
86
+ .class_data = (void *)0xa02082,
87
#endif
88
}, {
89
.name = TYPE_RASPI_MACHINE,
90
--
91
2.20.1
92
93
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
raspi_machine_init() access to board_rev via RaspiMachineClass.
4
raspi2_init() and raspi3_init() do nothing. Call raspi_machine_init
5
directly.
6
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
9
Message-id: 20200208165645.15657-10-f4bug@amsat.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/raspi.c | 16 +++-------------
13
1 file changed, 3 insertions(+), 13 deletions(-)
14
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/raspi.c
18
+++ b/hw/arm/raspi.c
19
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
20
arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
21
}
22
23
-static void raspi_init(MachineState *machine)
24
+static void raspi_machine_init(MachineState *machine)
25
{
26
RaspiMachineClass *mc = RASPI_MACHINE_GET_CLASS(machine);
27
RaspiMachineState *s = RASPI_MACHINE(machine);
28
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine)
29
setup_boot(machine, version, machine->ram_size - vcram_size);
30
}
31
32
-static void raspi2_init(MachineState *machine)
33
-{
34
- raspi_init(machine);
35
-}
36
-
37
static void raspi2_machine_class_init(ObjectClass *oc, void *data)
38
{
39
MachineClass *mc = MACHINE_CLASS(oc);
40
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
41
42
rmc->board_rev = board_rev;
43
mc->desc = "Raspberry Pi 2B";
44
- mc->init = raspi2_init;
45
+ mc->init = raspi_machine_init;
46
mc->block_default_type = IF_SD;
47
mc->no_parallel = 1;
48
mc->no_floppy = 1;
49
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
50
};
51
52
#ifdef TARGET_AARCH64
53
-static void raspi3_init(MachineState *machine)
54
-{
55
- raspi_init(machine);
56
-}
57
-
58
static void raspi3_machine_class_init(ObjectClass *oc, void *data)
59
{
60
MachineClass *mc = MACHINE_CLASS(oc);
61
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_class_init(ObjectClass *oc, void *data)
62
63
rmc->board_rev = board_rev;
64
mc->desc = "Raspberry Pi 3B";
65
- mc->init = raspi3_init;
66
+ mc->init = raspi_machine_init;
67
mc->block_default_type = IF_SD;
68
mc->no_parallel = 1;
69
mc->no_floppy = 1;
70
--
71
2.20.1
72
73
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
We added a helper to extract the RAM size from the board
4
revision, and made board_rev a field of RaspiMachineClass.
5
The class_init() can now use the helper to extract from the
6
board revision the board-specific amount of RAM.
7
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20200208165645.15657-11-f4bug@amsat.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/arm/raspi.c | 4 ++--
14
1 file changed, 2 insertions(+), 2 deletions(-)
15
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
19
+++ b/hw/arm/raspi.c
20
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
21
mc->max_cpus = BCM283X_NCPUS;
22
mc->min_cpus = BCM283X_NCPUS;
23
mc->default_cpus = BCM283X_NCPUS;
24
- mc->default_ram_size = 1 * GiB;
25
+ mc->default_ram_size = board_ram_size(board_rev);
26
mc->ignore_memory_transaction_failures = true;
27
};
28
29
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_class_init(ObjectClass *oc, void *data)
30
mc->max_cpus = BCM283X_NCPUS;
31
mc->min_cpus = BCM283X_NCPUS;
32
mc->default_cpus = BCM283X_NCPUS;
33
- mc->default_ram_size = 1 * GiB;
34
+ mc->default_ram_size = board_ram_size(board_rev);
35
}
36
#endif
37
38
--
39
2.20.1
40
41
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
The board revision encode the model type. Add a helper
4
to extract the model, and use it.
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20200208165645.15657-12-f4bug@amsat.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/raspi.c | 18 ++++++++++++++++--
12
1 file changed, 16 insertions(+), 2 deletions(-)
13
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
17
+++ b/hw/arm/raspi.c
18
@@ -XXX,XX +XXX,XX @@ static const char *board_soc_type(uint32_t board_rev)
19
return soc_types[proc_id];
20
}
21
22
+static const char *board_type(uint32_t board_rev)
23
+{
24
+ static const char *types[] = {
25
+ "A", "B", "A+", "B+", "2B", "Alpha", "CM1", NULL, "3B", "Zero",
26
+ "CM3", NULL, "Zero W", "3B+", "3A+", NULL, "CM3+", "4B",
27
+ };
28
+ assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
29
+ int bt = FIELD_EX32(board_rev, REV_CODE, TYPE);
30
+ if (bt >= ARRAY_SIZE(types) || !types[bt]) {
31
+ return "Unknown";
32
+ }
33
+ return types[bt];
34
+}
35
+
36
static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
37
{
38
static const uint32_t smpboot[] = {
39
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
40
uint32_t board_rev = (uint32_t)(uintptr_t)data;
41
42
rmc->board_rev = board_rev;
43
- mc->desc = "Raspberry Pi 2B";
44
+ mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev));
45
mc->init = raspi_machine_init;
46
mc->block_default_type = IF_SD;
47
mc->no_parallel = 1;
48
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_class_init(ObjectClass *oc, void *data)
49
uint32_t board_rev = (uint32_t)(uintptr_t)data;
50
51
rmc->board_rev = board_rev;
52
- mc->desc = "Raspberry Pi 3B";
53
+ mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev));
54
mc->init = raspi_machine_init;
55
mc->block_default_type = IF_SD;
56
mc->no_parallel = 1;
57
--
58
2.20.1
59
60
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
With the exception of the ignore_memory_transaction_failures
4
flag set for the raspi2, both machine_class_init() methods
5
are now identical. Merge them to keep a unique method.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
9
Message-id: 20200208165645.15657-13-f4bug@amsat.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/raspi.c | 31 ++++++-------------------------
13
1 file changed, 6 insertions(+), 25 deletions(-)
14
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/raspi.c
18
+++ b/hw/arm/raspi.c
19
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_init(MachineState *machine)
20
setup_boot(machine, version, machine->ram_size - vcram_size);
21
}
22
23
-static void raspi2_machine_class_init(ObjectClass *oc, void *data)
24
+static void raspi_machine_class_init(ObjectClass *oc, void *data)
25
{
26
MachineClass *mc = MACHINE_CLASS(oc);
27
RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
28
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
29
mc->min_cpus = BCM283X_NCPUS;
30
mc->default_cpus = BCM283X_NCPUS;
31
mc->default_ram_size = board_ram_size(board_rev);
32
- mc->ignore_memory_transaction_failures = true;
33
+ if (board_version(board_rev) == 2) {
34
+ mc->ignore_memory_transaction_failures = true;
35
+ }
36
};
37
38
-#ifdef TARGET_AARCH64
39
-static void raspi3_machine_class_init(ObjectClass *oc, void *data)
40
-{
41
- MachineClass *mc = MACHINE_CLASS(oc);
42
- RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
43
- uint32_t board_rev = (uint32_t)(uintptr_t)data;
44
-
45
- rmc->board_rev = board_rev;
46
- mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev));
47
- mc->init = raspi_machine_init;
48
- mc->block_default_type = IF_SD;
49
- mc->no_parallel = 1;
50
- mc->no_floppy = 1;
51
- mc->no_cdrom = 1;
52
- mc->max_cpus = BCM283X_NCPUS;
53
- mc->min_cpus = BCM283X_NCPUS;
54
- mc->default_cpus = BCM283X_NCPUS;
55
- mc->default_ram_size = board_ram_size(board_rev);
56
-}
57
-#endif
58
-
59
static const TypeInfo raspi_machine_types[] = {
60
{
61
.name = MACHINE_TYPE_NAME("raspi2"),
62
.parent = TYPE_RASPI_MACHINE,
63
- .class_init = raspi2_machine_class_init,
64
+ .class_init = raspi_machine_class_init,
65
.class_data = (void *)0xa21041,
66
#ifdef TARGET_AARCH64
67
}, {
68
.name = MACHINE_TYPE_NAME("raspi3"),
69
.parent = TYPE_RASPI_MACHINE,
70
- .class_init = raspi3_machine_class_init,
71
+ .class_init = raspi_machine_class_init,
72
.class_data = (void *)0xa02082,
73
#endif
74
}, {
75
--
76
2.20.1
77
78
diff view generated by jsdifflib
1
Add a comment documenting the memory map of the SoC devices and which
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
are not implemented.
3
2
3
The count of ARM cores is encoded in the board revision. Add a
4
helper to extract the number of cores, and use it. This will be
5
helpful when we add the Raspi0/1 that have a single core.
6
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20200208165645.15657-14-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
[PMM: tweaked commit message as suggested by Igor]
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 1484247815-15279-2-git-send-email-peter.maydell@linaro.org
6
---
12
---
7
hw/arm/stellaris.c | 34 ++++++++++++++++++++++++++++++++++
13
hw/arm/raspi.c | 19 ++++++++++++++++---
8
1 file changed, 34 insertions(+)
14
1 file changed, 16 insertions(+), 3 deletions(-)
9
15
10
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
11
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/arm/stellaris.c
18
--- a/hw/arm/raspi.c
13
+++ b/hw/arm/stellaris.c
19
+++ b/hw/arm/raspi.c
14
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
20
@@ -XXX,XX +XXX,XX @@ static const char *board_soc_type(uint32_t board_rev)
15
0x40024000, 0x40025000, 0x40026000};
21
return soc_types[proc_id];
16
static const int gpio_irq[7] = {0, 1, 2, 3, 4, 30, 31};
22
}
17
23
18
+ /* Memory map of SoC devices, from
24
+static int cores_count(uint32_t board_rev)
19
+ * Stellaris LM3S6965 Microcontroller Data Sheet (rev I)
25
+{
20
+ * http://www.ti.com/lit/ds/symlink/lm3s6965.pdf
26
+ static const int soc_cores_count[] = {
21
+ *
27
+ 0, BCM283X_NCPUS, BCM283X_NCPUS,
22
+ * 40000000 wdtimer (unimplemented)
28
+ };
23
+ * 40002000 i2c (unimplemented)
29
+ int proc_id = board_processor_id(board_rev);
24
+ * 40004000 GPIO
25
+ * 40005000 GPIO
26
+ * 40006000 GPIO
27
+ * 40007000 GPIO
28
+ * 40008000 SSI
29
+ * 4000c000 UART
30
+ * 4000d000 UART
31
+ * 4000e000 UART
32
+ * 40020000 i2c
33
+ * 40021000 i2c (unimplemented)
34
+ * 40024000 GPIO
35
+ * 40025000 GPIO
36
+ * 40026000 GPIO
37
+ * 40028000 PWM (unimplemented)
38
+ * 4002c000 QEI (unimplemented)
39
+ * 4002d000 QEI (unimplemented)
40
+ * 40030000 gptimer
41
+ * 40031000 gptimer
42
+ * 40032000 gptimer
43
+ * 40033000 gptimer
44
+ * 40038000 ADC
45
+ * 4003c000 analogue comparator (unimplemented)
46
+ * 40048000 ethernet
47
+ * 400fc000 hibernation module (unimplemented)
48
+ * 400fd000 flash memory control (unimplemented)
49
+ * 400fe000 system control
50
+ */
51
+
30
+
52
DeviceState *gpio_dev[7], *nvic;
31
+ if (proc_id >= ARRAY_SIZE(soc_cores_count) || !soc_cores_count[proc_id]) {
53
qemu_irq gpio_in[7][8];
32
+ error_report("Unsupported processor id '%d' (board revision: 0x%x)",
54
qemu_irq gpio_out[7][8];
33
+ proc_id, board_rev);
34
+ exit(1);
35
+ }
36
+ return soc_cores_count[proc_id];
37
+}
38
+
39
static const char *board_type(uint32_t board_rev)
40
{
41
static const char *types[] = {
42
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_class_init(ObjectClass *oc, void *data)
43
mc->no_parallel = 1;
44
mc->no_floppy = 1;
45
mc->no_cdrom = 1;
46
- mc->max_cpus = BCM283X_NCPUS;
47
- mc->min_cpus = BCM283X_NCPUS;
48
- mc->default_cpus = BCM283X_NCPUS;
49
+ mc->default_cpus = mc->min_cpus = mc->max_cpus = cores_count(board_rev);
50
mc->default_ram_size = board_ram_size(board_rev);
51
if (board_version(board_rev) == 2) {
52
mc->ignore_memory_transaction_failures = true;
55
--
53
--
56
2.7.4
54
2.20.1
57
55
58
56
diff view generated by jsdifflib
1
Use the 'unimplemented' dummy device to cover regions of the
1
The ARMv8.1-VMID16 extension extends the VMID from 8 bits to 16 bits:
2
SoC device memory map which we don't have proper device
2
3
implementations for yet.
3
* the ID_AA64MMFR1_EL1.VMIDBits field specifies whether the VMID is
4
8 or 16 bits
5
* the VMID field in VTTBR_EL2 is extended to 16 bits
6
* VTCR_EL2.VS lets the guest specify whether to use the full 16 bits,
7
or use the backwards-compatible 8 bits
8
9
For QEMU implementing this is trivial:
10
* we do not track VMIDs in TLB entries, so we never use the VMID field
11
* we treat any write to VTTBR_EL2, not just a change to the VMID field
12
bits, as a "possible VMID change" that causes us to throw away TLB
13
entries, so that code doesn't need changing
14
* we allow the guest to read/write the VTCR_EL2.VS bit already
15
16
So all that's missing is the ID register part: report that we support
17
VMID16 in our 'max' CPU.
4
18
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
20
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 1484247815-15279-4-git-send-email-peter.maydell@linaro.org
21
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
22
Message-id: 20200210120146.17631-1-peter.maydell@linaro.org
8
---
23
---
9
hw/arm/stellaris.c | 14 ++++++++++++++
24
target/arm/cpu64.c | 1 +
10
1 file changed, 14 insertions(+)
25
1 file changed, 1 insertion(+)
11
26
12
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
27
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
13
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/arm/stellaris.c
29
--- a/target/arm/cpu64.c
15
+++ b/hw/arm/stellaris.c
30
+++ b/target/arm/cpu64.c
16
@@ -XXX,XX +XXX,XX @@
31
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
17
#include "exec/address-spaces.h"
32
t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
18
#include "sysemu/sysemu.h"
33
t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1);
19
#include "hw/char/pl011.h"
34
t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
20
+#include "hw/misc/unimp.h"
35
+ t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2); /* VMID16 */
21
36
cpu->isar.id_aa64mmfr1 = t;
22
#define GPIO_A 0
37
23
#define GPIO_B 1
38
t = cpu->isar.id_aa64mmfr2;
24
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
25
}
26
}
27
}
28
+
29
+ /* Add dummy regions for the devices we don't implement yet,
30
+ * so guest accesses don't cause unlogged crashes.
31
+ */
32
+ create_unimplemented_device("wdtimer", 0x40000000, 0x1000);
33
+ create_unimplemented_device("i2c-0", 0x40002000, 0x1000);
34
+ create_unimplemented_device("i2c-2", 0x40021000, 0x1000);
35
+ create_unimplemented_device("PWM", 0x40028000, 0x1000);
36
+ create_unimplemented_device("QEI-0", 0x4002c000, 0x1000);
37
+ create_unimplemented_device("QEI-1", 0x4002d000, 0x1000);
38
+ create_unimplemented_device("analogue-comparator", 0x4003c000, 0x1000);
39
+ create_unimplemented_device("hibernation", 0x400fc000, 0x1000);
40
+ create_unimplemented_device("flash-control", 0x400fd000, 0x1000);
41
}
42
43
/* FIXME: Figure out how to generate these from stellaris_boards. */
44
--
39
--
45
2.7.4
40
2.20.1
46
41
47
42
diff view generated by jsdifflib