1
ARM queue for 2.10: all M profile bugfixes...
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
The following changes since commit 25dd0e77898c3e10796d4cbeb35e8af5ba6ce975:
7
7
8
Merge remote-tracking branch 'remotes/mjt/tags/trivial-patches-fetch' into staging (2017-07-31 11:27:43 +0100)
8
The following changes since commit 7ce9ce89930ce260af839fb3e3e5f9101f5c69a0:
9
9
10
are available in the git repository at:
10
Merge remote-tracking branch 'remotes/kraxel/tags/ui-20200212-pull-request' into staging (2020-02-13 11:06:32 +0000)
11
11
12
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20170731
12
are available in the Git repository at:
13
13
14
for you to fetch changes up to 89cbc3778a3d61761e2231e740269218c9a8a41d:
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200213
15
15
16
hw/mps2_scc: fix incorrect properties (2017-07-31 13:11:56 +0100)
16
for you to fetch changes up to dc7a88d0810ad272bdcd2e0869359af78fdd9114:
17
18
target/arm: Implement ARMv8.1-VMID16 extension (2020-02-13 14:30:51 +0000)
17
19
18
----------------------------------------------------------------
20
----------------------------------------------------------------
19
target-arm queue:
21
target-arm queue:
20
* fix broken properties on MPS2 SCC device
22
* i.MX: Fix inverted sense of register bits in watchdog timer
21
* fix MPU trace handling of write vs exec
23
* i.MX: Add support for WDT on i.MX6
22
* fix MPU M profile bugs:
24
* arm/virt: cleanups to ACPI tables
23
- not handling system space or PPB region correctly
25
* Implement ARMv8.1-VMID16 extension
24
- not resetting state
26
* Implement ARMv8.1-PAN
25
- not migrating MPU_RNR
27
* Implement ARMv8.2-UAO
28
* Implement ARMv8.2-ATS1E1
29
* ast2400/2500/2600: Wire up EHCI controllers
30
* hw/char/exynos4210_uart: Fix memleaks in exynos4210_uart_init
31
* hw/arm/raspi: Clean up the board code
26
32
27
----------------------------------------------------------------
33
----------------------------------------------------------------
28
Peter Maydell (6):
34
Chen Qun (1):
29
target/arm: Correct MPU trace handling of write vs execute
35
hw/char/exynos4210_uart: Fix memleaks in exynos4210_uart_init
30
target/arm: Don't do MPU lookups for addresses in M profile PPB region
31
target/arm: Don't allow guest to make System space executable for M profile
32
target/arm: Rename cp15.c6_rgnr to pmsav7.rnr
33
target/arm: Move PMSAv7 reset into arm_cpu_reset() so M profile MPUs get reset
34
target/arm: Migrate MPU_RNR register state for M profile cores
35
36
36
Philippe Mathieu-Daudé (1):
37
Guenter Roeck (2):
37
hw/mps2_scc: fix incorrect properties
38
hw/arm: ast2400/ast2500: Wire up EHCI controllers
39
hw/arm: ast2600: Wire up EHCI controllers
38
40
39
target/arm/cpu.h | 3 +--
41
Heyi Guo (7):
40
hw/intc/armv7m_nvic.c | 14 +++++-----
42
bios-tables-test: prepare to change ARM virt ACPI DSDT
41
hw/misc/mps2-scc.c | 4 +--
43
arm/virt/acpi: remove meaningless sub device "RP0" from PCI0
42
target/arm/cpu.c | 14 ++++++++++
44
arm/virt/acpi: remove _ADR from devices identified by _HID
43
target/arm/helper.c | 71 ++++++++++++++++++++++++++++++++++-----------------
45
arm/acpi: fix PCI _PRT definition
44
target/arm/machine.c | 30 +++++++++++++++++++++-
46
arm/acpi: fix duplicated _UID of PCI interrupt link devices
45
6 files changed, 101 insertions(+), 35 deletions(-)
47
arm/acpi: simplify the description of PCI _CRS
48
virt/acpi: update golden masters for DSDT update
46
49
50
Peter Maydell (1):
51
target/arm: Implement ARMv8.1-VMID16 extension
52
53
Philippe Mathieu-Daudé (13):
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
67
68
Richard Henderson (20):
69
target/arm: Add arm_mmu_idx_is_stage1_of_2
70
target/arm: Add mmu_idx for EL1 and EL2 w/ PAN enabled
71
target/arm: Add isar_feature tests for PAN + ATS1E1
72
target/arm: Move LOR regdefs to file scope
73
target/arm: Split out aarch32_cpsr_valid_mask
74
target/arm: Mask CPSR_J when Jazelle is not enabled
75
target/arm: Replace CPSR_ERET_MASK with aarch32_cpsr_valid_mask
76
target/arm: Use aarch32_cpsr_valid_mask in helper_exception_return
77
target/arm: Remove CPSR_RESERVED
78
target/arm: Introduce aarch64_pstate_valid_mask
79
target/arm: Update MSR access for PAN
80
target/arm: Update arm_mmu_idx_el for PAN
81
target/arm: Enforce PAN semantics in get_S1prot
82
target/arm: Set PAN bit as required on exception entry
83
target/arm: Implement ATS1E1 system registers
84
target/arm: Enable ARMv8.2-ATS1E1 in -cpu max
85
target/arm: Add ID_AA64MMFR2_EL1
86
target/arm: Update MSR access to UAO
87
target/arm: Implement UAO semantics
88
target/arm: Enable ARMv8.2-UAO in -cpu max
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
New patch
1
From: Heyi Guo <guoheyi@huawei.com>
1
2
3
Using _UID of 0 for all PCI interrupt link devices absolutely violates
4
the spec. Simply increase one by one.
5
6
Signed-off-by: Heyi Guo <guoheyi@huawei.com>
7
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
8
Message-id: 20200204014325.16279-6-guoheyi@huawei.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/virt-acpi-build.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/virt-acpi-build.c
17
+++ b/hw/arm/virt-acpi-build.c
18
@@ -XXX,XX +XXX,XX @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
19
uint32_t irqs = irq + i;
20
Aml *dev_gsi = aml_device("GSI%d", i);
21
aml_append(dev_gsi, aml_name_decl("_HID", aml_string("PNP0C0F")));
22
- aml_append(dev_gsi, aml_name_decl("_UID", aml_int(0)));
23
+ aml_append(dev_gsi, aml_name_decl("_UID", aml_int(i)));
24
crs = aml_resource_template();
25
aml_append(crs,
26
aml_interrupt(AML_CONSUMER, AML_LEVEL, AML_ACTIVE_HIGH,
27
--
28
2.20.1
29
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
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
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
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Include definitions for all of the bits in ID_MMFR3.
4
We already have a definition for ID_AA64MMFR1.PAN.
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
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 29 +++++++++++++++++++++++++++++
13
1 file changed, 29 insertions(+)
14
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/cpu.h
18
+++ b/target/arm/cpu.h
19
@@ -XXX,XX +XXX,XX @@ FIELD(ID_ISAR6, FHM, 8, 4)
20
FIELD(ID_ISAR6, SB, 12, 4)
21
FIELD(ID_ISAR6, SPECRES, 16, 4)
22
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)
31
+
32
FIELD(ID_MMFR4, SPECSEI, 0, 4)
33
FIELD(ID_MMFR4, AC2, 4, 4)
34
FIELD(ID_MMFR4, XNX, 8, 4)
35
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_vminmaxnm(const ARMISARegisters *id)
36
return FIELD_EX64(id->mvfr2, MVFR2, FPMISC) >= 4;
37
}
38
39
+static inline bool isar_feature_aa32_pan(const ARMISARegisters *id)
40
+{
41
+ return FIELD_EX64(id->mvfr0, ID_MMFR3, PAN) != 0;
42
+}
43
+
44
+static inline bool isar_feature_aa32_ats1e1(const ARMISARegisters *id)
45
+{
46
+ return FIELD_EX64(id->mvfr0, ID_MMFR3, PAN) >= 2;
47
+}
48
+
49
/*
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)
57
+{
58
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) != 0;
59
+}
60
+
61
+static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id)
62
+{
63
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2;
64
+}
65
+
66
static inline bool isar_feature_aa64_bti(const ARMISARegisters *id)
67
{
68
return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0;
69
--
70
2.20.1
71
72
diff view generated by jsdifflib
1
For an M profile v7PMSA, the system space (0xe0000000 - 0xffffffff) can
1
From: Richard Henderson <richard.henderson@linaro.org>
2
never be executable, even if the guest tries to set the MPU registers
3
up that way. Enforce this restriction.
4
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
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 1501153150-19984-3-git-send-email-peter.maydell@linaro.org
8
---
9
---
9
target/arm/helper.c | 16 +++++++++++++++-
10
target/arm/helper.c | 57 +++++++++++++++++++++++----------------------
10
1 file changed, 15 insertions(+), 1 deletion(-)
11
1 file changed, 29 insertions(+), 28 deletions(-)
11
12
12
diff --git a/target/arm/helper.c b/target/arm/helper.c
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/helper.c
15
--- a/target/arm/helper.c
15
+++ b/target/arm/helper.c
16
+++ b/target/arm/helper.c
16
@@ -XXX,XX +XXX,XX @@ static inline bool m_is_ppb_region(CPUARMState *env, uint32_t address)
17
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_lor_other(CPUARMState *env,
17
extract32(address, 20, 12) == 0xe00;
18
return access_lor_ns(env);
18
}
19
}
19
20
20
+static inline bool m_is_system_region(CPUARMState *env, uint32_t address)
21
+/*
21
+{
22
+ * A trivial implementation of ARMv8.1-LOR leaves all of these
22
+ /* True if address is in the M profile system region
23
+ * registers fixed at 0, which indicates that there are zero
23
+ * 0xe0000000 - 0xffffffff
24
+ * supported Limited Ordering regions.
24
+ */
25
+ */
25
+ return arm_feature(env, ARM_FEATURE_M) && extract32(address, 29, 3) == 0x7;
26
+static const ARMCPRegInfo lor_reginfo[] = {
26
+}
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
+};
27
+
49
+
28
static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
50
#ifdef TARGET_AARCH64
29
int access_type, ARMMMUIdx mmu_idx,
51
static CPAccessResult access_pauth(CPUARMState *env, const ARMCPRegInfo *ri,
30
hwaddr *phys_ptr, int *prot, uint32_t *fsr)
52
bool isread)
31
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
53
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
32
get_phys_addr_pmsav7_default(env, mmu_idx, address, prot);
54
}
33
} else { /* a MPU hit! */
55
34
uint32_t ap = extract32(env->pmsav7.dracr[n], 8, 3);
56
if (cpu_isar_feature(aa64_lor, cpu)) {
35
+ uint32_t xn = extract32(env->pmsav7.dracr[n], 12, 1);
57
- /*
36
+
58
- * A trivial implementation of ARMv8.1-LOR leaves all of these
37
+ if (m_is_system_region(env, address)) {
59
- * registers fixed at 0, which indicates that there are zero
38
+ /* System space is always execute never */
60
- * supported Limited Ordering regions.
39
+ xn = 1;
61
- */
40
+ }
62
- static const ARMCPRegInfo lor_reginfo[] = {
41
63
- { .name = "LORSA_EL1", .state = ARM_CP_STATE_AA64,
42
if (is_user) { /* User mode AP bit decoding */
64
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 0,
43
switch (ap) {
65
- .access = PL1_RW, .accessfn = access_lor_other,
44
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
66
- .type = ARM_CP_CONST, .resetvalue = 0 },
45
}
67
- { .name = "LOREA_EL1", .state = ARM_CP_STATE_AA64,
46
68
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 1,
47
/* execute never */
69
- .access = PL1_RW, .accessfn = access_lor_other,
48
- if (env->pmsav7.dracr[n] & (1 << 12)) {
70
- .type = ARM_CP_CONST, .resetvalue = 0 },
49
+ if (xn) {
71
- { .name = "LORN_EL1", .state = ARM_CP_STATE_AA64,
50
*prot &= ~PAGE_EXEC;
72
- .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 2,
51
}
73
- .access = PL1_RW, .accessfn = access_lor_other,
52
}
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
53
--
88
--
54
2.7.4
89
2.20.1
55
90
56
91
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
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
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
target/arm/internals.h | 21 +++++++++++++++++++++
15
target/arm/translate.c | 40 +++++++++++++++++-----------------------
16
2 files changed, 38 insertions(+), 23 deletions(-)
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.
50
diff --git a/target/arm/translate.c b/target/arm/translate.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/arm/translate.c
53
+++ b/target/arm/translate.c
54
@@ -XXX,XX +XXX,XX @@ static inline void gen_mulxy(TCGv_i32 t0, TCGv_i32 t1, int x, int y)
55
/* Return the mask of PSR bits set by a MSR instruction. */
56
static uint32_t msr_mask(DisasContext *s, int flags, int spsr)
57
{
58
- uint32_t mask;
59
+ uint32_t mask = 0;
60
61
- mask = 0;
62
- if (flags & (1 << 0))
63
+ if (flags & (1 << 0)) {
64
mask |= 0xff;
65
- if (flags & (1 << 1))
66
+ }
67
+ if (flags & (1 << 1)) {
68
mask |= 0xff00;
69
- if (flags & (1 << 2))
70
+ }
71
+ if (flags & (1 << 2)) {
72
mask |= 0xff0000;
73
- if (flags & (1 << 3))
74
+ }
75
+ if (flags & (1 << 3)) {
76
mask |= 0xff000000;
77
+ }
78
79
- /* Mask out undefined bits. */
80
- mask &= ~CPSR_RESERVED;
81
- if (!arm_dc_feature(s, ARM_FEATURE_V4T)) {
82
- mask &= ~CPSR_T;
83
- }
84
- if (!arm_dc_feature(s, ARM_FEATURE_V5)) {
85
- mask &= ~CPSR_Q; /* V5TE in reality*/
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
111
--
112
2.20.1
113
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
The M profile PMSAv7 specification says that if the address being looked
1
From: Richard Henderson <richard.henderson@linaro.org>
2
up is in the PPB region (0xe0000000 - 0xe00fffff) then we do not use
3
the MPU regions but always use the default memory map. Implement this
4
(we were previously behaving like an R profile PMSAv7, which does not
5
special case this).
6
2
3
For aarch64, there's a dedicated msr (imm, reg) insn.
4
For aarch32, this is done via msr to cpsr. Writes from el0
5
are ignored, which is already handled by the CPSR_USER mask.
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-12-richard.henderson@linaro.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 1501153150-19984-2-git-send-email-peter.maydell@linaro.org
10
---
11
---
11
target/arm/helper.c | 17 ++++++++++++++++-
12
target/arm/cpu.h | 2 ++
12
1 file changed, 16 insertions(+), 1 deletion(-)
13
target/arm/internals.h | 6 ++++++
14
target/arm/helper.c | 21 +++++++++++++++++++++
15
target/arm/translate-a64.c | 14 ++++++++++++++
16
4 files changed, 43 insertions(+)
13
17
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.h
21
+++ b/target/arm/cpu.h
22
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
23
#define CPSR_IT_2_7 (0xfc00U)
24
#define CPSR_GE (0xfU << 16)
25
#define CPSR_IL (1U << 20)
26
+#define CPSR_PAN (1U << 22)
27
#define CPSR_J (1U << 24)
28
#define CPSR_IT_0_1 (3U << 25)
29
#define CPSR_Q (1U << 27)
30
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
31
#define PSTATE_BTYPE (3U << 10)
32
#define PSTATE_IL (1U << 20)
33
#define PSTATE_SS (1U << 21)
34
+#define PSTATE_PAN (1U << 22)
35
#define PSTATE_V (1U << 28)
36
#define PSTATE_C (1U << 29)
37
#define PSTATE_Z (1U << 30)
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 aarch32_cpsr_valid_mask(uint64_t features,
43
if (isar_feature_jazelle(id)) {
44
valid |= CPSR_J;
45
}
46
+ if (isar_feature_aa32_pan(id)) {
47
+ valid |= CPSR_PAN;
48
+ }
49
50
return valid;
51
}
52
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch64_pstate_valid_mask(const ARMISARegisters *id)
53
if (isar_feature_aa64_bti(id)) {
54
valid |= PSTATE_BTYPE;
55
}
56
+ if (isar_feature_aa64_pan(id)) {
57
+ valid |= PSTATE_PAN;
58
+ }
59
60
return valid;
61
}
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
62
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
63
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
64
--- a/target/arm/helper.c
17
+++ b/target/arm/helper.c
65
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ static bool pmsav7_use_background_region(ARMCPU *cpu,
66
@@ -XXX,XX +XXX,XX @@ static void aa64_daif_write(CPUARMState *env, const ARMCPRegInfo *ri,
19
}
67
env->daif = value & PSTATE_DAIF;
20
}
68
}
21
69
22
+static inline bool m_is_ppb_region(CPUARMState *env, uint32_t address)
70
+static uint64_t aa64_pan_read(CPUARMState *env, const ARMCPRegInfo *ri)
23
+{
71
+{
24
+ /* True if address is in the M profile PPB region 0xe0000000 - 0xe00fffff */
72
+ return env->pstate & PSTATE_PAN;
25
+ return arm_feature(env, ARM_FEATURE_M) &&
26
+ extract32(address, 20, 12) == 0xe00;
27
+}
73
+}
28
+
74
+
29
static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
75
+static void aa64_pan_write(CPUARMState *env, const ARMCPRegInfo *ri,
30
int access_type, ARMMMUIdx mmu_idx,
76
+ uint64_t value)
31
hwaddr *phys_ptr, int *prot, uint32_t *fsr)
77
+{
32
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
78
+ env->pstate = (env->pstate & ~PSTATE_PAN) | (value & PSTATE_PAN);
33
*phys_ptr = address;
79
+}
34
*prot = 0;
80
+
35
81
+static const ARMCPRegInfo pan_reginfo = {
36
- if (regime_translation_disabled(env, mmu_idx)) { /* MPU disabled */
82
+ .name = "PAN", .state = ARM_CP_STATE_AA64,
37
+ if (regime_translation_disabled(env, mmu_idx) ||
83
+ .opc0 = 3, .opc1 = 0, .crn = 4, .crm = 2, .opc2 = 3,
38
+ m_is_ppb_region(env, address)) {
84
+ .type = ARM_CP_NO_RAW, .access = PL1_RW,
39
+ /* MPU disabled or M profile PPB access: use default memory map.
85
+ .readfn = aa64_pan_read, .writefn = aa64_pan_write
40
+ * The other case which uses the default memory map in the
86
+};
41
+ * v7M ARM ARM pseudocode is exception vector reads from the vector
87
+
42
+ * table. In QEMU those accesses are done in arm_v7m_load_vector(),
88
static CPAccessResult aa64_cacheop_access(CPUARMState *env,
43
+ * which always does a direct read using address_space_ldl(), rather
89
const ARMCPRegInfo *ri,
44
+ * than going via this function, so we don't need to check that here.
90
bool isread)
45
+ */
91
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
46
get_phys_addr_pmsav7_default(env, mmu_idx, address, prot);
92
if (cpu_isar_feature(aa64_lor, cpu)) {
47
} else { /* MPU enabled */
93
define_arm_cp_regs(cpu, lor_reginfo);
48
for (n = (int)cpu->pmsav7_dregion - 1; n >= 0; n--) {
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;
49
--
126
--
50
2.7.4
127
2.20.1
51
128
52
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
1
When the PMSAv7 implementation was originally added it was for R profile
1
From: Richard Henderson <richard.henderson@linaro.org>
2
CPUs only, and reset was handled using the cpreg .resetfn hooks.
3
Unfortunately for M profile cores this doesn't work, because they do
4
not register any cpregs. Move the reset handling into arm_cpu_reset(),
5
where it will work for both R profile and M profile cores.
6
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
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 1501153150-19984-5-git-send-email-peter.maydell@linaro.org
10
---
10
---
11
target/arm/cpu.c | 14 ++++++++++++++
11
target/arm/helper.c | 56 ++++++++++++++++++++++++++++++++++++++++-----
12
target/arm/helper.c | 28 ++++++++++++----------------
12
1 file changed, 50 insertions(+), 6 deletions(-)
13
2 files changed, 26 insertions(+), 16 deletions(-)
14
13
15
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/cpu.c
18
+++ b/target/arm/cpu.c
19
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
20
21
env->vfp.xregs[ARM_VFP_FPEXC] = 0;
22
#endif
23
+
24
+ if (arm_feature(env, ARM_FEATURE_PMSA) &&
25
+ arm_feature(env, ARM_FEATURE_V7)) {
26
+ if (cpu->pmsav7_dregion > 0) {
27
+ memset(env->pmsav7.drbar, 0,
28
+ sizeof(*env->pmsav7.drbar) * cpu->pmsav7_dregion);
29
+ memset(env->pmsav7.drsr, 0,
30
+ sizeof(*env->pmsav7.drsr) * cpu->pmsav7_dregion);
31
+ memset(env->pmsav7.dracr, 0,
32
+ sizeof(*env->pmsav7.dracr) * cpu->pmsav7_dregion);
33
+ }
34
+ env->pmsav7.rnr = 0;
35
+ }
36
+
37
set_flush_to_zero(1, &env->vfp.standard_fp_status);
38
set_flush_inputs_to_zero(1, &env->vfp.standard_fp_status);
39
set_default_nan_mode(1, &env->vfp.standard_fp_status);
40
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
41
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/helper.c
16
--- a/target/arm/helper.c
43
+++ b/target/arm/helper.c
17
+++ b/target/arm/helper.c
44
@@ -XXX,XX +XXX,XX @@ static void pmsav7_write(CPUARMState *env, const ARMCPRegInfo *ri,
18
@@ -XXX,XX +XXX,XX @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
45
*u32p = value;
19
46
}
20
switch (ri->opc2 & 6) {
47
21
case 0:
48
-static void pmsav7_reset(CPUARMState *env, const ARMCPRegInfo *ri)
22
- /* stage 1 current state PL1: ATS1CPR, ATS1CPW */
49
-{
23
+ /* stage 1 current state PL1: ATS1CPR, ATS1CPW, ATS1CPRP, ATS1CPWP */
50
- ARMCPU *cpu = arm_env_get_cpu(env);
24
switch (el) {
51
- uint32_t *u32p = *(uint32_t **)raw_ptr(env, ri);
25
case 3:
52
-
26
mmu_idx = ARMMMUIdx_SE3;
53
- if (!u32p) {
27
break;
54
- return;
28
case 2:
55
- }
29
- mmu_idx = ARMMMUIdx_Stage1_E1;
56
-
30
- break;
57
- memset(u32p, 0, sizeof(*u32p) * cpu->pmsav7_dregion);
31
+ g_assert(!secure); /* TODO: ARMv8.4-SecEL2 */
58
-}
32
+ /* fall through */
59
-
33
case 1:
60
static void pmsav7_rgnr_write(CPUARMState *env, const ARMCPRegInfo *ri,
34
- mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
61
uint64_t value)
35
+ if (ri->crm == 9 && (env->uncached_cpsr & CPSR_PAN)) {
62
{
36
+ mmu_idx = (secure ? ARMMMUIdx_SE10_1_PAN
63
@@ -XXX,XX +XXX,XX @@ static void pmsav7_rgnr_write(CPUARMState *env, const ARMCPRegInfo *ri,
37
+ : ARMMMUIdx_Stage1_E1_PAN);
64
}
38
+ } else {
65
39
+ mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
66
static const ARMCPRegInfo pmsav7_cp_reginfo[] = {
40
+ }
67
+ /* Reset for all these registers is handled in arm_cpu_reset(),
41
break;
68
+ * because the PMSAv7 is also used by M-profile CPUs, which do
42
default:
69
+ * not register cpregs but still need the state to be reset.
43
g_assert_not_reached();
70
+ */
44
@@ -XXX,XX +XXX,XX @@ static void ats_write64(CPUARMState *env, const ARMCPRegInfo *ri,
71
{ .name = "DRBAR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 1, .opc2 = 0,
45
switch (ri->opc2 & 6) {
72
.access = PL1_RW, .type = ARM_CP_NO_RAW,
46
case 0:
73
.fieldoffset = offsetof(CPUARMState, pmsav7.drbar),
47
switch (ri->opc1) {
74
- .readfn = pmsav7_read, .writefn = pmsav7_write, .resetfn = pmsav7_reset },
48
- case 0: /* AT S1E1R, AT S1E1W */
75
+ .readfn = pmsav7_read, .writefn = pmsav7_write,
49
- mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
76
+ .resetfn = arm_cp_reset_ignore },
50
+ case 0: /* AT S1E1R, AT S1E1W, AT S1E1RP, AT S1E1WP */
77
{ .name = "DRSR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 1, .opc2 = 2,
51
+ if (ri->crm == 9 && (env->pstate & PSTATE_PAN)) {
78
.access = PL1_RW, .type = ARM_CP_NO_RAW,
52
+ mmu_idx = (secure ? ARMMMUIdx_SE10_1_PAN
79
.fieldoffset = offsetof(CPUARMState, pmsav7.drsr),
53
+ : ARMMMUIdx_Stage1_E1_PAN);
80
- .readfn = pmsav7_read, .writefn = pmsav7_write, .resetfn = pmsav7_reset },
54
+ } else {
81
+ .readfn = pmsav7_read, .writefn = pmsav7_write,
55
+ mmu_idx = secure ? ARMMMUIdx_SE10_1 : ARMMMUIdx_Stage1_E1;
82
+ .resetfn = arm_cp_reset_ignore },
56
+ }
83
{ .name = "DRACR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 1, .opc2 = 4,
57
break;
84
.access = PL1_RW, .type = ARM_CP_NO_RAW,
58
case 4: /* AT S1E2R, AT S1E2W */
85
.fieldoffset = offsetof(CPUARMState, pmsav7.dracr),
59
mmu_idx = ARMMMUIdx_E2;
86
- .readfn = pmsav7_read, .writefn = pmsav7_write, .resetfn = pmsav7_reset },
60
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vhe_reginfo[] = {
87
+ .readfn = pmsav7_read, .writefn = pmsav7_write,
88
+ .resetfn = arm_cp_reset_ignore },
89
{ .name = "RGNR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 2, .opc2 = 0,
90
.access = PL1_RW,
91
.fieldoffset = offsetof(CPUARMState, pmsav7.rnr),
92
- .writefn = pmsav7_rgnr_write },
93
+ .writefn = pmsav7_rgnr_write,
94
+ .resetfn = arm_cp_reset_ignore },
95
REGINFO_SENTINEL
61
REGINFO_SENTINEL
96
};
62
};
97
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);
98
--
108
--
99
2.7.4
109
2.20.1
100
110
101
111
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
This includes enablement of ARMv8.1-PAN.
4
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
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/cpu.c | 4 ++++
11
target/arm/cpu64.c | 5 +++++
12
2 files changed, 9 insertions(+)
13
14
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.c
17
+++ b/target/arm/cpu.c
18
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
19
t = FIELD_DP32(t, MVFR2, FPMISC, 4); /* FP MaxNum */
20
cpu->isar.mvfr2 = t;
21
22
+ t = cpu->id_mmfr3;
23
+ t = FIELD_DP32(t, ID_MMFR3, PAN, 2); /* ATS1E1 */
24
+ cpu->id_mmfr3 = t;
25
+
26
t = cpu->id_mmfr4;
27
t = FIELD_DP32(t, ID_MMFR4, HPDS, 1); /* AA32HPD */
28
cpu->id_mmfr4 = t;
29
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/cpu64.c
32
+++ b/target/arm/cpu64.c
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;
48
+
49
/*
50
* FIXME: We do not yet support ARMv8.2-fp16 for AArch32 yet,
51
* so do not set MVFR1.FPHP. Strictly speaking this is not legal,
52
--
53
2.20.1
54
55
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Add definitions for all of the fields, up to ARMv8.5.
4
Convert the existing RESERVED register to a full register.
5
Query KVM for the value of the register for the host.
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-18-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 17 +++++++++++++++++
13
target/arm/helper.c | 4 ++--
14
target/arm/kvm64.c | 2 ++
15
3 files changed, 21 insertions(+), 2 deletions(-)
16
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
22
uint64_t id_aa64pfr1;
23
uint64_t id_aa64mmfr0;
24
uint64_t id_aa64mmfr1;
25
+ uint64_t id_aa64mmfr2;
26
} isar;
27
uint32_t midr;
28
uint32_t revidr;
29
@@ -XXX,XX +XXX,XX @@ FIELD(ID_AA64MMFR1, PAN, 20, 4)
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)
48
+
49
FIELD(ID_DFR0, COPDBG, 0, 4)
50
FIELD(ID_DFR0, COPSDBG, 4, 4)
51
FIELD(ID_DFR0, MMAPDBG, 8, 4)
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 @@ void register_cp_regs_for_features(ARMCPU *cpu)
57
.access = PL1_R, .type = ARM_CP_CONST,
58
.accessfn = access_aa64_tid3,
59
.resetvalue = cpu->isar.id_aa64mmfr1 },
60
- { .name = "ID_AA64MMFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
61
+ { .name = "ID_AA64MMFR2_EL1", .state = ARM_CP_STATE_AA64,
62
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 2,
63
.access = PL1_R, .type = ARM_CP_CONST,
64
.accessfn = access_aa64_tid3,
65
- .resetvalue = 0 },
66
+ .resetvalue = cpu->isar.id_aa64mmfr2 },
67
{ .name = "ID_AA64MMFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
68
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 3,
69
.access = PL1_R, .type = ARM_CP_CONST,
70
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
71
index XXXXXXX..XXXXXXX 100644
72
--- a/target/arm/kvm64.c
73
+++ b/target/arm/kvm64.c
74
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
75
ARM64_SYS_REG(3, 0, 0, 7, 0));
76
err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr1,
77
ARM64_SYS_REG(3, 0, 0, 7, 1));
78
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr2,
79
+ ARM64_SYS_REG(3, 0, 0, 7, 2));
80
81
/*
82
* Note that if AArch32 support is not present in the host,
83
--
84
2.20.1
85
86
diff view generated by jsdifflib
1
Almost all of the PMSAv7 state is in the pmsav7 substruct of
1
From: Richard Henderson <richard.henderson@linaro.org>
2
the ARM CPU state structure. The exception is the region
3
number register, which is in cp15.c6_rgnr. This exception
4
is a bit odd for M profile, which otherwise generally does
5
not store state in the cp15 substruct.
6
2
7
Rename cp15.c6_rgnr to pmsav7.rnr accordingly.
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20200208125816.14954-19-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 1501153150-19984-4-git-send-email-peter.maydell@linaro.org
12
---
7
---
13
target/arm/cpu.h | 3 +--
8
target/arm/cpu.h | 6 ++++++
14
hw/intc/armv7m_nvic.c | 14 +++++++-------
9
target/arm/internals.h | 3 +++
15
target/arm/helper.c | 6 +++---
10
target/arm/helper.c | 21 +++++++++++++++++++++
16
target/arm/machine.c | 2 +-
11
target/arm/translate-a64.c | 14 ++++++++++++++
17
4 files changed, 12 insertions(+), 13 deletions(-)
12
4 files changed, 44 insertions(+)
18
13
19
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/cpu.h
16
--- a/target/arm/cpu.h
22
+++ b/target/arm/cpu.h
17
+++ b/target/arm/cpu.h
23
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
18
@@ -XXX,XX +XXX,XX @@ void pmu_init(ARMCPU *cpu);
24
uint64_t par_el[4];
19
#define PSTATE_IL (1U << 20)
25
};
20
#define PSTATE_SS (1U << 21)
26
21
#define PSTATE_PAN (1U << 22)
27
- uint32_t c6_rgnr;
22
+#define PSTATE_UAO (1U << 23)
28
-
23
#define PSTATE_V (1U << 28)
29
uint32_t c9_insn; /* Cache lockdown registers. */
24
#define PSTATE_C (1U << 29)
30
uint32_t c9_data;
25
#define PSTATE_Z (1U << 30)
31
uint64_t c9_pmcr; /* performance monitor control register */
26
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id)
32
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
27
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2;
33
uint32_t *drbar;
28
}
34
uint32_t *drsr;
29
35
uint32_t *dracr;
30
+static inline bool isar_feature_aa64_uao(const ARMISARegisters *id)
36
+ uint32_t rnr;
31
+{
37
} pmsav7;
32
+ return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, UAO) != 0;
38
33
+}
39
void *nvic;
34
+
40
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
35
static inline bool isar_feature_aa64_bti(const ARMISARegisters *id)
36
{
37
return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0;
38
diff --git a/target/arm/internals.h b/target/arm/internals.h
41
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/intc/armv7m_nvic.c
40
--- a/target/arm/internals.h
43
+++ b/hw/intc/armv7m_nvic.c
41
+++ b/target/arm/internals.h
44
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset)
42
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aarch64_pstate_valid_mask(const ARMISARegisters *id)
45
case 0xd94: /* MPU_CTRL */
43
if (isar_feature_aa64_pan(id)) {
46
return cpu->env.v7m.mpu_ctrl;
44
valid |= PSTATE_PAN;
47
case 0xd98: /* MPU_RNR */
45
}
48
- return cpu->env.cp15.c6_rgnr;
46
+ if (isar_feature_aa64_uao(id)) {
49
+ return cpu->env.pmsav7.rnr;
47
+ valid |= PSTATE_UAO;
50
case 0xd9c: /* MPU_RBAR */
48
+ }
51
case 0xda4: /* MPU_RBAR_A1 */
49
52
case 0xdac: /* MPU_RBAR_A2 */
50
return valid;
53
case 0xdb4: /* MPU_RBAR_A3 */
51
}
54
{
55
- int region = cpu->env.cp15.c6_rgnr;
56
+ int region = cpu->env.pmsav7.rnr;
57
58
if (region >= cpu->pmsav7_dregion) {
59
return 0;
60
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset)
61
case 0xdb0: /* MPU_RASR_A2 */
62
case 0xdb8: /* MPU_RASR_A3 */
63
{
64
- int region = cpu->env.cp15.c6_rgnr;
65
+ int region = cpu->env.pmsav7.rnr;
66
67
if (region >= cpu->pmsav7_dregion) {
68
return 0;
69
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value)
70
PRIu32 "/%" PRIu32 "\n",
71
value, cpu->pmsav7_dregion);
72
} else {
73
- cpu->env.cp15.c6_rgnr = value;
74
+ cpu->env.pmsav7.rnr = value;
75
}
76
break;
77
case 0xd9c: /* MPU_RBAR */
78
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value)
79
region, cpu->pmsav7_dregion);
80
return;
81
}
82
- cpu->env.cp15.c6_rgnr = region;
83
+ cpu->env.pmsav7.rnr = region;
84
} else {
85
- region = cpu->env.cp15.c6_rgnr;
86
+ region = cpu->env.pmsav7.rnr;
87
}
88
89
if (region >= cpu->pmsav7_dregion) {
90
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value)
91
case 0xdb0: /* MPU_RASR_A2 */
92
case 0xdb8: /* MPU_RASR_A3 */
93
{
94
- int region = cpu->env.cp15.c6_rgnr;
95
+ int region = cpu->env.pmsav7.rnr;
96
97
if (region >= cpu->pmsav7_dregion) {
98
return;
99
diff --git a/target/arm/helper.c b/target/arm/helper.c
52
diff --git a/target/arm/helper.c b/target/arm/helper.c
100
index XXXXXXX..XXXXXXX 100644
53
index XXXXXXX..XXXXXXX 100644
101
--- a/target/arm/helper.c
54
--- a/target/arm/helper.c
102
+++ b/target/arm/helper.c
55
+++ b/target/arm/helper.c
103
@@ -XXX,XX +XXX,XX @@ static uint64_t pmsav7_read(CPUARMState *env, const ARMCPRegInfo *ri)
56
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo pan_reginfo = {
104
return 0;
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);
105
}
83
}
106
84
#endif
107
- u32p += env->cp15.c6_rgnr;
85
+ if (cpu_isar_feature(aa64_uao, cpu)) {
108
+ u32p += env->pmsav7.rnr;
86
+ define_one_arm_cp_reg(cpu, &uao_reginfo);
109
return *u32p;
87
+ }
110
}
88
111
89
if (arm_feature(env, ARM_FEATURE_EL2) && cpu_isar_feature(aa64_vh, cpu)) {
112
@@ -XXX,XX +XXX,XX @@ static void pmsav7_write(CPUARMState *env, const ARMCPRegInfo *ri,
90
define_arm_cp_regs(cpu, vhe_reginfo);
113
return;
91
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
114
}
115
116
- u32p += env->cp15.c6_rgnr;
117
+ u32p += env->pmsav7.rnr;
118
tlb_flush(CPU(cpu)); /* Mappings may have changed - purge! */
119
*u32p = value;
120
}
121
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo pmsav7_cp_reginfo[] = {
122
.readfn = pmsav7_read, .writefn = pmsav7_write, .resetfn = pmsav7_reset },
123
{ .name = "RGNR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 2, .opc2 = 0,
124
.access = PL1_RW,
125
- .fieldoffset = offsetof(CPUARMState, cp15.c6_rgnr),
126
+ .fieldoffset = offsetof(CPUARMState, pmsav7.rnr),
127
.writefn = pmsav7_rgnr_write },
128
REGINFO_SENTINEL
129
};
130
diff --git a/target/arm/machine.c b/target/arm/machine.c
131
index XXXXXXX..XXXXXXX 100644
92
index XXXXXXX..XXXXXXX 100644
132
--- a/target/arm/machine.c
93
--- a/target/arm/translate-a64.c
133
+++ b/target/arm/machine.c
94
+++ b/target/arm/translate-a64.c
134
@@ -XXX,XX +XXX,XX @@ static bool pmsav7_rgnr_vmstate_validate(void *opaque, int version_id)
95
@@ -XXX,XX +XXX,XX @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
135
{
96
s->base.is_jmp = DISAS_NEXT;
136
ARMCPU *cpu = opaque;
97
break;
137
98
138
- return cpu->env.cp15.c6_rgnr < cpu->pmsav7_dregion;
99
+ case 0x03: /* UAO */
139
+ return cpu->env.pmsav7.rnr < cpu->pmsav7_dregion;
100
+ if (!dc_isar_feature(aa64_uao, s) || s->current_el == 0) {
140
}
101
+ goto do_unallocated;
141
102
+ }
142
static const VMStateDescription vmstate_pmsav7 = {
103
+ if (crm & 1) {
104
+ set_pstate_bits(PSTATE_UAO);
105
+ } else {
106
+ clear_pstate_bits(PSTATE_UAO);
107
+ }
108
+ t1 = tcg_const_i32(s->current_el);
109
+ gen_helper_rebuild_hflags_a64(cpu_env, t1);
110
+ tcg_temp_free_i32(t1);
111
+ break;
112
+
113
case 0x04: /* PAN */
114
if (!dc_isar_feature(aa64_pan, s) || s->current_el == 0) {
115
goto do_unallocated;
143
--
116
--
144
2.7.4
117
2.20.1
145
118
146
119
diff view generated by jsdifflib
1
Correct off-by-one bug in the PSMAv7 MPU tracing where it would print
1
From: Richard Henderson <richard.henderson@linaro.org>
2
a write access as "reading", an insn fetch as "writing", and a read
3
access as "execute".
4
2
5
Since we have an MMUAccessType enum now, we can make the code clearer
3
We need only override the current condition under which
6
in the process by using that rather than the raw 0/1/2 values.
4
TBFLAG_A64.UNPRIV is set.
7
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
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <rth@twiddle.net>
10
Message-id: 1500906792-18010-1-git-send-email-peter.maydell@linaro.org
11
---
10
---
12
target/arm/helper.c | 4 ++--
11
target/arm/helper.c | 41 +++++++++++++++++++++--------------------
13
1 file changed, 2 insertions(+), 2 deletions(-)
12
1 file changed, 21 insertions(+), 20 deletions(-)
14
13
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
16
--- a/target/arm/helper.c
18
+++ b/target/arm/helper.c
17
+++ b/target/arm/helper.c
19
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr(CPUARMState *env, target_ulong address,
18
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
20
phys_ptr, prot, fsr);
19
}
21
qemu_log_mask(CPU_LOG_MMU, "PMSAv7 MPU lookup for %s at 0x%08" PRIx32
20
22
" mmu_idx %u -> %s (prot %c%c%c)\n",
21
/* Compute the condition for using AccType_UNPRIV for LDTR et al. */
23
- access_type == 1 ? "reading" :
22
- /* TODO: ARMv8.2-UAO */
24
- (access_type == 2 ? "writing" : "execute"),
23
- switch (mmu_idx) {
25
+ access_type == MMU_DATA_LOAD ? "reading" :
24
- case ARMMMUIdx_E10_1:
26
+ (access_type == MMU_DATA_STORE ? "writing" : "execute"),
25
- case ARMMMUIdx_E10_1_PAN:
27
(uint32_t)address, mmu_idx,
26
- case ARMMMUIdx_SE10_1:
28
ret ? "Miss" : "Hit",
27
- case ARMMMUIdx_SE10_1_PAN:
29
*prot & PAGE_READ ? 'r' : '-',
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);
30
--
68
--
31
2.7.4
69
2.20.1
32
70
33
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
New patch
1
From: Guenter Roeck <linux@roeck-us.net>
1
2
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.
6
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>
17
Reviewed-by: Joel Stanley <joel@jms.id.au>
18
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
19
Message-id: 20200206183437.3979-1-linux@roeck-us.net
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
22
include/hw/arm/aspeed_soc.h | 6 ++++++
23
hw/arm/aspeed_soc.c | 25 +++++++++++++++++++++++++
24
2 files changed, 31 insertions(+)
25
26
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
27
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/aspeed_soc.h
29
+++ b/include/hw/arm/aspeed_soc.h
30
@@ -XXX,XX +XXX,XX @@
31
#include "target/arm/cpu.h"
32
#include "hw/gpio/aspeed_gpio.h"
33
#include "hw/sd/aspeed_sdhci.h"
34
+#include "hw/usb/hcd-ehci.h"
35
36
#define ASPEED_SPIS_NUM 2
37
+#define ASPEED_EHCIS_NUM 2
38
#define ASPEED_WDTS_NUM 4
39
#define ASPEED_CPUS_NUM 2
40
#define ASPEED_MACS_NUM 4
41
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCState {
42
AspeedXDMAState xdma;
43
AspeedSMCState fmc;
44
AspeedSMCState spi[ASPEED_SPIS_NUM];
45
+ EHCISysBusState ehci[ASPEED_EHCIS_NUM];
46
AspeedSDMCState sdmc;
47
AspeedWDTState wdt[ASPEED_WDTS_NUM];
48
FTGMAC100State ftgmac100[ASPEED_MACS_NUM];
49
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCClass {
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,
66
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/arm/aspeed_soc.c
69
+++ b/hw/arm/aspeed_soc.c
70
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2400_memmap[] = {
71
[ASPEED_IOMEM] = 0x1E600000,
72
[ASPEED_FMC] = 0x1E620000,
73
[ASPEED_SPI1] = 0x1E630000,
74
+ [ASPEED_EHCI1] = 0x1E6A1000,
75
[ASPEED_VIC] = 0x1E6C0000,
76
[ASPEED_SDMC] = 0x1E6E0000,
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,
96
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
97
sizeof(s->spi[i]), typename);
98
}
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
+ }
104
+
105
snprintf(typename, sizeof(typename), "aspeed.sdmc-%s", socname);
106
sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc),
107
typename);
108
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
109
s->spi[i].ctrl->flash_window_base);
110
}
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
+ }
124
+
125
/* SDMC - SDRAM Memory Controller */
126
object_property_set_bool(OBJECT(&s->sdmc), true, "realized", &err);
127
if (err) {
128
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
129
sc->silicon_rev = AST2400_A1_SILICON_REV;
130
sc->sram_size = 0x8000;
131
sc->spis_num = 1;
132
+ sc->ehcis_num = 1;
133
sc->wdts_num = 2;
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;
144
--
145
2.20.1
146
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
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
The board revision encode the board version. Add a helper
4
to extract the version, and use it.
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20200208165645.15657-4-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 | 31 +++++++++++++++++++++++++++----
12
1 file changed, 27 insertions(+), 4 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 @@
19
#include "qapi/error.h"
20
#include "cpu.h"
21
#include "hw/arm/bcm2836.h"
22
+#include "hw/registerfields.h"
23
#include "qemu/error-report.h"
24
#include "hw/boards.h"
25
#include "hw/loader.h"
26
@@ -XXX,XX +XXX,XX @@ typedef struct RasPiState {
27
MemoryRegion ram;
28
} RasPiState;
29
30
+/*
31
+ * Board revision codes:
32
+ * www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/
33
+ */
34
+FIELD(REV_CODE, REVISION, 0, 4);
35
+FIELD(REV_CODE, TYPE, 4, 8);
36
+FIELD(REV_CODE, PROCESSOR, 12, 4);
37
+FIELD(REV_CODE, MANUFACTURER, 16, 4);
38
+FIELD(REV_CODE, MEMORY_SIZE, 20, 3);
39
+FIELD(REV_CODE, STYLE, 23, 1);
40
+
41
+static int board_processor_id(uint32_t board_rev)
42
+{
43
+ assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
44
+ return FIELD_EX32(board_rev, REV_CODE, PROCESSOR);
45
+}
46
+
47
+static int board_version(uint32_t board_rev)
48
+{
49
+ return board_processor_id(board_rev) + 1;
50
+}
51
+
52
static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
53
{
54
static const uint32_t smpboot[] = {
55
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
56
arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
57
}
58
59
-static void raspi_init(MachineState *machine, int version)
60
+static void raspi_init(MachineState *machine, uint32_t board_rev)
61
{
62
RasPiState *s = g_new0(RasPiState, 1);
63
+ int version = board_version(board_rev);
64
uint32_t vcram_size;
65
DriveInfo *di;
66
BlockBackend *blk;
67
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
68
/* Setup the SOC */
69
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
70
&error_abort);
71
- int board_rev = version == 3 ? 0xa02082 : 0xa21041;
72
object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
73
&error_abort);
74
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_abort);
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)
93
--
94
2.20.1
95
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
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
There is no point in creating the SoC object before allocating the RAM.
4
Move the call to keep all the SoC-related calls together.
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
8
Message-id: 20200208165645.15657-7-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 | 5 ++---
13
1 file changed, 2 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 @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
20
exit(1);
21
}
22
23
- object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
24
- board_soc_type(board_rev), &error_abort, NULL);
25
-
26
/* Allocate and map RAM */
27
memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
28
machine->ram_size);
29
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
30
memory_region_add_subregion_overlap(get_system_memory(), 0, &s->ram, 0);
31
32
/* Setup the SOC */
33
+ object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
34
+ board_soc_type(board_rev), &error_abort, NULL);
35
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
36
&error_abort);
37
object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
38
--
39
2.20.1
40
41
diff view generated by jsdifflib
1
The PMSAv7 region number register is migrated for R profile
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
cores using the cpreg scheme, but M profile doesn't use
3
cpregs, and so we weren't migrating the MPU_RNR register state
4
at all. Fix that by adding a migration subsection for the
5
M profile case.
6
2
3
QOM'ify RaspiMachineState. Now machines inherit of RaspiMachineClass.
4
5
Cc: Igor Mammedov <imammedo@redhat.com>
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
8
Message-id: 20200208165645.15657-8-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 1501153150-19984-6-git-send-email-peter.maydell@linaro.org
10
---
11
---
11
target/arm/machine.c | 28 ++++++++++++++++++++++++++++
12
hw/arm/raspi.c | 56 +++++++++++++++++++++++++++++++++++++++++++-------
12
1 file changed, 28 insertions(+)
13
1 file changed, 49 insertions(+), 7 deletions(-)
13
14
14
diff --git a/target/arm/machine.c b/target/arm/machine.c
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/machine.c
17
--- a/hw/arm/raspi.c
17
+++ b/target/arm/machine.c
18
+++ b/hw/arm/raspi.c
18
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pmsav7 = {
19
@@ -XXX,XX +XXX,XX @@
19
}
20
/* Registered machine type (matches RPi Foundation bootloader and U-Boot) */
21
#define MACH_TYPE_BCM2708 3138
22
23
-typedef struct RasPiState {
24
+typedef struct RaspiMachineState {
25
+ /*< private >*/
26
+ MachineState parent_obj;
27
+ /*< public >*/
28
BCM283XState soc;
29
MemoryRegion ram;
30
-} RasPiState;
31
+} RaspiMachineState;
32
+
33
+typedef struct RaspiMachineClass {
34
+ /*< private >*/
35
+ MachineClass parent_obj;
36
+ /*< public >*/
37
+} RaspiMachineClass;
38
+
39
+#define TYPE_RASPI_MACHINE MACHINE_TYPE_NAME("raspi-common")
40
+#define RASPI_MACHINE(obj) \
41
+ OBJECT_CHECK(RaspiMachineState, (obj), TYPE_RASPI_MACHINE)
42
+
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);
67
+
68
mc->desc = "Raspberry Pi 2B";
69
mc->init = raspi2_init;
70
mc->block_default_type = IF_SD;
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;
20
};
74
};
21
75
-DEFINE_MACHINE("raspi2", raspi2_machine_init)
22
+static bool pmsav7_rnr_needed(void *opaque)
76
23
+{
77
#ifdef TARGET_AARCH64
24
+ ARMCPU *cpu = opaque;
78
static void raspi3_init(MachineState *machine)
25
+ CPUARMState *env = &cpu->env;
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);
26
+
87
+
27
+ /* For R profile cores pmsav7.rnr is migrated via the cpreg
88
mc->desc = "Raspberry Pi 3B";
28
+ * "RGNR" definition in helper.h. For M profile we have to
89
mc->init = raspi3_init;
29
+ * migrate it separately.
90
mc->block_default_type = IF_SD;
30
+ */
91
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_init(MachineClass *mc)
31
+ return arm_feature(env, ARM_FEATURE_M);
92
mc->default_cpus = BCM283X_NCPUS;
32
+}
93
mc->default_ram_size = 1 * GiB;
94
}
95
-DEFINE_MACHINE("raspi3", raspi3_machine_init)
96
#endif
33
+
97
+
34
+static const VMStateDescription vmstate_pmsav7_rnr = {
98
+static const TypeInfo raspi_machine_types[] = {
35
+ .name = "cpu/pmsav7-rnr",
99
+ {
36
+ .version_id = 1,
100
+ .name = MACHINE_TYPE_NAME("raspi2"),
37
+ .minimum_version_id = 1,
101
+ .parent = TYPE_RASPI_MACHINE,
38
+ .needed = pmsav7_rnr_needed,
102
+ .class_init = raspi2_machine_class_init,
39
+ .fields = (VMStateField[]) {
103
+#ifdef TARGET_AARCH64
40
+ VMSTATE_UINT32(env.pmsav7.rnr, ARMCPU),
104
+ }, {
41
+ VMSTATE_END_OF_LIST()
105
+ .name = MACHINE_TYPE_NAME("raspi3"),
106
+ .parent = TYPE_RASPI_MACHINE,
107
+ .class_init = raspi3_machine_class_init,
108
+#endif
109
+ }, {
110
+ .name = TYPE_RASPI_MACHINE,
111
+ .parent = TYPE_MACHINE,
112
+ .instance_size = sizeof(RaspiMachineState),
113
+ .class_size = sizeof(RaspiMachineClass),
114
+ .abstract = true,
42
+ }
115
+ }
43
+};
116
+};
44
+
117
+
45
static int get_cpsr(QEMUFile *f, void *opaque, size_t size,
118
+DEFINE_TYPES(raspi_machine_types)
46
VMStateField *field)
47
{
48
@@ -XXX,XX +XXX,XX @@ const VMStateDescription vmstate_arm_cpu = {
49
&vmstate_iwmmxt,
50
&vmstate_m,
51
&vmstate_thumb2ee,
52
+ /* pmsav7_rnr must come before pmsav7 so that we have the
53
+ * region number before we test it in the VMSTATE_VALIDATE
54
+ * in vmstate_pmsav7.
55
+ */
56
+ &vmstate_pmsav7_rnr,
57
&vmstate_pmsav7,
58
NULL
59
}
60
--
119
--
61
2.7.4
120
2.20.1
62
121
63
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
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
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
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Message-id: 20170729234930.725-1-f4bug@amsat.org
9
Message-id: 20200208165645.15657-11-f4bug@amsat.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
hw/misc/mps2-scc.c | 4 ++--
13
hw/arm/raspi.c | 4 ++--
9
1 file changed, 2 insertions(+), 2 deletions(-)
14
1 file changed, 2 insertions(+), 2 deletions(-)
10
15
11
diff --git a/hw/misc/mps2-scc.c b/hw/misc/mps2-scc.c
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/misc/mps2-scc.c
18
--- a/hw/arm/raspi.c
14
+++ b/hw/misc/mps2-scc.c
19
+++ b/hw/arm/raspi.c
15
@@ -XXX,XX +XXX,XX @@ static Property mps2_scc_properties[] = {
20
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_class_init(ObjectClass *oc, void *data)
16
/* Values for various read-only ID registers (which are specific
21
mc->max_cpus = BCM283X_NCPUS;
17
* to the board model or FPGA image)
22
mc->min_cpus = BCM283X_NCPUS;
18
*/
23
mc->default_cpus = BCM283X_NCPUS;
19
- DEFINE_PROP_UINT32("scc-cfg4", MPS2SCC, aid, 0),
24
- mc->default_ram_size = 1 * GiB;
20
+ DEFINE_PROP_UINT32("scc-cfg4", MPS2SCC, cfg4, 0),
25
+ mc->default_ram_size = board_ram_size(board_rev);
21
DEFINE_PROP_UINT32("scc-aid", MPS2SCC, aid, 0),
26
mc->ignore_memory_transaction_failures = true;
22
- DEFINE_PROP_UINT32("scc-id", MPS2SCC, aid, 0),
27
};
23
+ DEFINE_PROP_UINT32("scc-id", MPS2SCC, id, 0),
28
24
/* These are the initial settings for the source clocks on the board.
29
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_class_init(ObjectClass *oc, void *data)
25
* In hardware they can be configured via a config file read by the
30
mc->max_cpus = BCM283X_NCPUS;
26
* motherboard configuration controller to suit the FPGA image.
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
27
--
38
--
28
2.7.4
39
2.20.1
29
40
30
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
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
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]
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/arm/raspi.c | 19 ++++++++++++++++---
14
1 file changed, 16 insertions(+), 3 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 const char *board_soc_type(uint32_t board_rev)
21
return soc_types[proc_id];
22
}
23
24
+static int cores_count(uint32_t board_rev)
25
+{
26
+ static const int soc_cores_count[] = {
27
+ 0, BCM283X_NCPUS, BCM283X_NCPUS,
28
+ };
29
+ int proc_id = board_processor_id(board_rev);
30
+
31
+ if (proc_id >= ARRAY_SIZE(soc_cores_count) || !soc_cores_count[proc_id]) {
32
+ error_report("Unsupported processor id '%d' (board revision: 0x%x)",
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;
53
--
54
2.20.1
55
56
diff view generated by jsdifflib
New patch
1
The ARMv8.1-VMID16 extension extends the VMID from 8 bits to 16 bits:
1
2
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.
18
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
21
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
22
Message-id: 20200210120146.17631-1-peter.maydell@linaro.org
23
---
24
target/arm/cpu64.c | 1 +
25
1 file changed, 1 insertion(+)
26
27
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/cpu64.c
30
+++ b/target/arm/cpu64.c
31
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
32
t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
33
t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1);
34
t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
35
+ t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2); /* VMID16 */
36
cpu->isar.id_aa64mmfr1 = t;
37
38
t = cpu->isar.id_aa64mmfr2;
39
--
40
2.20.1
41
42
diff view generated by jsdifflib