target-arm queue:
* Fix breakage of icount mode when guest touches MDCR_EL3, MDCR_EL2,
    PMCNTENSET_EL0 or PMCNTENCLR_EL0
  * Make writes to MDCR_EL3 use PMU start/finish calls
  * Let AArch32 write to SDCR.SCCD
  * Rearrange cpu64.c so all the CPU initfns are together
  * hw/arm/xlnx-zynqmp: Connect ZynqMP's USB controllers
  * hw/arm/virt: fix some minor issues with generated device tree
  * Fix regression where EL3 could not write to SP_EL1 if there is no EL2
 -----BEGIN PGP SIGNATURE-----
 
 iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmM28EYZHHBldGVyLm1h
 eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3mw9D/44e72KHZdfr3F/Cmd0Jku2
 g5NQ4ooKV90rY4Y4+/VR9Z2k7a72lWFgFl7/54AKXSZsZSmNomeh2WxWJAs1lA2W
 4rmGPlLwxZYMQumYcMOArYxJQgRK5exVtE6ECKM/JERjhKSbnL1lyLWGUyLtFJfq
 SjxoTWEigPHu+0fX/nk04rFzrA6Bo1qKQqZZTuN9zcT6JXyQMjZNF89Fxy9OlV4s
 dlOXsZILV8oREnGdDFPYLgwSTMn+1rrD8xfjK/DTQrlUVX/9zhlIeKg5O4JadxCy
 8ThIFCyODUanlRvyjHiwvcvStHn8wwyCp4uJrxmZGyyp4t4u3etG0hpsZaPtiN9O
 NKtad4Aoc6lSmIDhYYZA1LIIdSIeyUPD/LyWTd+qKK7A7mxH6ORr0uyjhb01jWs3
 ceyne1i0n66oRLbHxPyjQEkLqwLl2CsqWr41BNM5RVoYjCU8HYSvEwlh7t+EZCL5
 IRkfAWJkA9bdXL30ZmYSzJ7hfvVkWhDsHD+eOzAcsxoApgzI5Mfi7gCIZ+LNY20P
 W0akGbA6l0InsmIcBpyXEztPOi6tOD/J55qeOCrzHjgfhoJWCoa/mS8bVqN0mKIA
 yJ7QbiK/JY6+G1v2oM8aARLn8/C7oLnMYiKntXNBMj67Ry5GwjDt+A37MUHgQbZb
 yUzUjr3O2N1qJRKi+Dd7eA==
 =edYy
 -----END PGP SIGNATURE-----
Merge tag 'pull-target-arm-20220930' of https://git.linaro.org/people/pmaydell/qemu-arm into staging
target-arm queue:
 * Fix breakage of icount mode when guest touches MDCR_EL3, MDCR_EL2,
   PMCNTENSET_EL0 or PMCNTENCLR_EL0
 * Make writes to MDCR_EL3 use PMU start/finish calls
 * Let AArch32 write to SDCR.SCCD
 * Rearrange cpu64.c so all the CPU initfns are together
 * hw/arm/xlnx-zynqmp: Connect ZynqMP's USB controllers
 * hw/arm/virt: fix some minor issues with generated device tree
 * Fix regression where EL3 could not write to SP_EL1 if there is no EL2
# -----BEGIN PGP SIGNATURE-----
#
# iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmM28EYZHHBldGVyLm1h
# eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3mw9D/44e72KHZdfr3F/Cmd0Jku2
# g5NQ4ooKV90rY4Y4+/VR9Z2k7a72lWFgFl7/54AKXSZsZSmNomeh2WxWJAs1lA2W
# 4rmGPlLwxZYMQumYcMOArYxJQgRK5exVtE6ECKM/JERjhKSbnL1lyLWGUyLtFJfq
# SjxoTWEigPHu+0fX/nk04rFzrA6Bo1qKQqZZTuN9zcT6JXyQMjZNF89Fxy9OlV4s
# dlOXsZILV8oREnGdDFPYLgwSTMn+1rrD8xfjK/DTQrlUVX/9zhlIeKg5O4JadxCy
# 8ThIFCyODUanlRvyjHiwvcvStHn8wwyCp4uJrxmZGyyp4t4u3etG0hpsZaPtiN9O
# NKtad4Aoc6lSmIDhYYZA1LIIdSIeyUPD/LyWTd+qKK7A7mxH6ORr0uyjhb01jWs3
# ceyne1i0n66oRLbHxPyjQEkLqwLl2CsqWr41BNM5RVoYjCU8HYSvEwlh7t+EZCL5
# IRkfAWJkA9bdXL30ZmYSzJ7hfvVkWhDsHD+eOzAcsxoApgzI5Mfi7gCIZ+LNY20P
# W0akGbA6l0InsmIcBpyXEztPOi6tOD/J55qeOCrzHjgfhoJWCoa/mS8bVqN0mKIA
# yJ7QbiK/JY6+G1v2oM8aARLn8/C7oLnMYiKntXNBMj67Ry5GwjDt+A37MUHgQbZb
# yUzUjr3O2N1qJRKi+Dd7eA==
# =edYy
# -----END PGP SIGNATURE-----
# gpg: Signature made Fri 30 Sep 2022 09:33:58 EDT
# gpg:                using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE
# gpg:                issuer "peter.maydell@linaro.org"
# gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [full]
# gpg:                 aka "Peter Maydell <pmaydell@gmail.com>" [full]
# gpg:                 aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [full]
# gpg:                 aka "Peter Maydell <peter@archaic.org.uk>" [unknown]
# Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83  15CF 3C25 25ED 1436 0CDE
* tag 'pull-target-arm-20220930' of https://git.linaro.org/people/pmaydell/qemu-arm:
  target/arm: mark SP_EL1 with ARM_CP_EL3_NO_EL2_KEEP
  hw/arm/virt: Fix devicetree warning about the SMMU node
  hw/arm/virt: Use "msi-map" devicetree property for PCI
  hw/arm/virt: Fix devicetree warning about the GIC node
  hw/arm/virt: Fix devicetree warning about the root node
  hw/arm/xlnx-zynqmp: Connect ZynqMP's USB controllers
  target/arm: Rearrange cpu64.c so all the CPU initfns are together
  target/arm: Update SDCR_VALID_MASK to include SCCD
  target/arm: Make writes to MDCR_EL3 use PMU start/finish calls
  target/arm: Mark registers which call pmu_op_start() as ARM_CP_IO
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
			
			
This commit is contained in:
		
						commit
						81f12b8cdf
					
				@ -253,6 +253,7 @@ static void create_fdt(VirtMachineState *vms)
 | 
				
			|||||||
    qemu_fdt_setprop_string(fdt, "/", "compatible", "linux,dummy-virt");
 | 
					    qemu_fdt_setprop_string(fdt, "/", "compatible", "linux,dummy-virt");
 | 
				
			||||||
    qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2);
 | 
					    qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2);
 | 
				
			||||||
    qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2);
 | 
					    qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2);
 | 
				
			||||||
 | 
					    qemu_fdt_setprop_string(fdt, "/", "model", "linux,dummy-virt");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* /chosen must exist for load_dtb to fill in necessary properties later */
 | 
					    /* /chosen must exist for load_dtb to fill in necessary properties later */
 | 
				
			||||||
    qemu_fdt_add_subnode(fdt, "/chosen");
 | 
					    qemu_fdt_add_subnode(fdt, "/chosen");
 | 
				
			||||||
@ -487,6 +488,7 @@ static void fdt_add_its_gic_node(VirtMachineState *vms)
 | 
				
			|||||||
    qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
 | 
					    qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
 | 
				
			||||||
                            "arm,gic-v3-its");
 | 
					                            "arm,gic-v3-its");
 | 
				
			||||||
    qemu_fdt_setprop(ms->fdt, nodename, "msi-controller", NULL, 0);
 | 
					    qemu_fdt_setprop(ms->fdt, nodename, "msi-controller", NULL, 0);
 | 
				
			||||||
 | 
					    qemu_fdt_setprop_cell(ms->fdt, nodename, "#msi-cells", 1);
 | 
				
			||||||
    qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
 | 
					    qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
 | 
				
			||||||
                                 2, vms->memmap[VIRT_GIC_ITS].base,
 | 
					                                 2, vms->memmap[VIRT_GIC_ITS].base,
 | 
				
			||||||
                                 2, vms->memmap[VIRT_GIC_ITS].size);
 | 
					                                 2, vms->memmap[VIRT_GIC_ITS].size);
 | 
				
			||||||
@ -1359,8 +1361,6 @@ static void create_smmu(const VirtMachineState *vms,
 | 
				
			|||||||
    qemu_fdt_setprop(ms->fdt, node, "interrupt-names", irq_names,
 | 
					    qemu_fdt_setprop(ms->fdt, node, "interrupt-names", irq_names,
 | 
				
			||||||
                     sizeof(irq_names));
 | 
					                     sizeof(irq_names));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qemu_fdt_setprop_cell(ms->fdt, node, "clocks", vms->clock_phandle);
 | 
					 | 
				
			||||||
    qemu_fdt_setprop_string(ms->fdt, node, "clock-names", "apb_pclk");
 | 
					 | 
				
			||||||
    qemu_fdt_setprop(ms->fdt, node, "dma-coherent", NULL, 0);
 | 
					    qemu_fdt_setprop(ms->fdt, node, "dma-coherent", NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qemu_fdt_setprop_cell(ms->fdt, node, "#iommu-cells", 1);
 | 
					    qemu_fdt_setprop_cell(ms->fdt, node, "#iommu-cells", 1);
 | 
				
			||||||
@ -1488,8 +1488,8 @@ static void create_pcie(VirtMachineState *vms)
 | 
				
			|||||||
    qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
 | 
					    qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (vms->msi_phandle) {
 | 
					    if (vms->msi_phandle) {
 | 
				
			||||||
        qemu_fdt_setprop_cells(ms->fdt, nodename, "msi-parent",
 | 
					        qemu_fdt_setprop_cells(ms->fdt, nodename, "msi-map",
 | 
				
			||||||
                               vms->msi_phandle);
 | 
					                               0, vms->msi_phandle, 0, 0x10000);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
 | 
					    qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
 | 
				
			||||||
 | 
				
			|||||||
@ -143,6 +143,14 @@ static const int adma_ch_intr[XLNX_ZYNQMP_NUM_ADMA_CH] = {
 | 
				
			|||||||
    77, 78, 79, 80, 81, 82, 83, 84
 | 
					    77, 78, 79, 80, 81, 82, 83, 84
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint64_t usb_addr[XLNX_ZYNQMP_NUM_USB] = {
 | 
				
			||||||
 | 
					    0xFE200000, 0xFE300000
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const int usb_intr[XLNX_ZYNQMP_NUM_USB] = {
 | 
				
			||||||
 | 
					    65, 70
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct XlnxZynqMPGICRegion {
 | 
					typedef struct XlnxZynqMPGICRegion {
 | 
				
			||||||
    int region_index;
 | 
					    int region_index;
 | 
				
			||||||
    uint32_t address;
 | 
					    uint32_t address;
 | 
				
			||||||
@ -428,6 +436,10 @@ static void xlnx_zynqmp_init(Object *obj)
 | 
				
			|||||||
    object_initialize_child(obj, "qspi-dma", &s->qspi_dma, TYPE_XLNX_CSU_DMA);
 | 
					    object_initialize_child(obj, "qspi-dma", &s->qspi_dma, TYPE_XLNX_CSU_DMA);
 | 
				
			||||||
    object_initialize_child(obj, "qspi-irq-orgate",
 | 
					    object_initialize_child(obj, "qspi-irq-orgate",
 | 
				
			||||||
                            &s->qspi_irq_orgate, TYPE_OR_IRQ);
 | 
					                            &s->qspi_irq_orgate, TYPE_OR_IRQ);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < XLNX_ZYNQMP_NUM_USB; i++) {
 | 
				
			||||||
 | 
					        object_initialize_child(obj, "usb[*]", &s->usb[i], TYPE_USB_DWC3);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
 | 
					static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
 | 
				
			||||||
@ -814,6 +826,30 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
 | 
				
			|||||||
        object_property_add_alias(OBJECT(s), bus_name,
 | 
					        object_property_add_alias(OBJECT(s), bus_name,
 | 
				
			||||||
                                  OBJECT(&s->qspi), target_bus);
 | 
					                                  OBJECT(&s->qspi), target_bus);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < XLNX_ZYNQMP_NUM_USB; i++) {
 | 
				
			||||||
 | 
					        if (!object_property_set_link(OBJECT(&s->usb[i].sysbus_xhci), "dma",
 | 
				
			||||||
 | 
					                                      OBJECT(system_memory), errp)) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        qdev_prop_set_uint32(DEVICE(&s->usb[i].sysbus_xhci), "intrs", 4);
 | 
				
			||||||
 | 
					        qdev_prop_set_uint32(DEVICE(&s->usb[i].sysbus_xhci), "slots", 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!sysbus_realize(SYS_BUS_DEVICE(&s->usb[i]), errp)) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sysbus_mmio_map(SYS_BUS_DEVICE(&s->usb[i]), 0, usb_addr[i]);
 | 
				
			||||||
 | 
					        sysbus_connect_irq(SYS_BUS_DEVICE(&s->usb[i].sysbus_xhci), 0,
 | 
				
			||||||
 | 
					                           gic_spi[usb_intr[i]]);
 | 
				
			||||||
 | 
					        sysbus_connect_irq(SYS_BUS_DEVICE(&s->usb[i].sysbus_xhci), 1,
 | 
				
			||||||
 | 
					                           gic_spi[usb_intr[i] + 1]);
 | 
				
			||||||
 | 
					        sysbus_connect_irq(SYS_BUS_DEVICE(&s->usb[i].sysbus_xhci), 2,
 | 
				
			||||||
 | 
					                           gic_spi[usb_intr[i] + 2]);
 | 
				
			||||||
 | 
					        sysbus_connect_irq(SYS_BUS_DEVICE(&s->usb[i].sysbus_xhci), 3,
 | 
				
			||||||
 | 
					                           gic_spi[usb_intr[i] + 3]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Property xlnx_zynqmp_props[] = {
 | 
					static Property xlnx_zynqmp_props[] = {
 | 
				
			||||||
 | 
				
			|||||||
@ -42,6 +42,7 @@
 | 
				
			|||||||
#include "hw/misc/xlnx-zynqmp-apu-ctrl.h"
 | 
					#include "hw/misc/xlnx-zynqmp-apu-ctrl.h"
 | 
				
			||||||
#include "hw/misc/xlnx-zynqmp-crf.h"
 | 
					#include "hw/misc/xlnx-zynqmp-crf.h"
 | 
				
			||||||
#include "hw/timer/cadence_ttc.h"
 | 
					#include "hw/timer/cadence_ttc.h"
 | 
				
			||||||
 | 
					#include "hw/usb/hcd-dwc3.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
 | 
					#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
 | 
				
			||||||
OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
 | 
					OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
 | 
				
			||||||
@ -56,6 +57,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
 | 
				
			|||||||
#define XLNX_ZYNQMP_NUM_SPIS 2
 | 
					#define XLNX_ZYNQMP_NUM_SPIS 2
 | 
				
			||||||
#define XLNX_ZYNQMP_NUM_GDMA_CH 8
 | 
					#define XLNX_ZYNQMP_NUM_GDMA_CH 8
 | 
				
			||||||
#define XLNX_ZYNQMP_NUM_ADMA_CH 8
 | 
					#define XLNX_ZYNQMP_NUM_ADMA_CH 8
 | 
				
			||||||
 | 
					#define XLNX_ZYNQMP_NUM_USB 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define XLNX_ZYNQMP_NUM_QSPI_BUS 2
 | 
					#define XLNX_ZYNQMP_NUM_QSPI_BUS 2
 | 
				
			||||||
#define XLNX_ZYNQMP_NUM_QSPI_BUS_CS 2
 | 
					#define XLNX_ZYNQMP_NUM_QSPI_BUS_CS 2
 | 
				
			||||||
@ -132,6 +134,7 @@ struct XlnxZynqMPState {
 | 
				
			|||||||
    XlnxZynqMPAPUCtrl apu_ctrl;
 | 
					    XlnxZynqMPAPUCtrl apu_ctrl;
 | 
				
			||||||
    XlnxZynqMPCRF crf;
 | 
					    XlnxZynqMPCRF crf;
 | 
				
			||||||
    CadenceTTCState ttc[XLNX_ZYNQMP_NUM_TTC];
 | 
					    CadenceTTCState ttc[XLNX_ZYNQMP_NUM_TTC];
 | 
				
			||||||
 | 
					    USBDWC3 usb[XLNX_ZYNQMP_NUM_USB];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char *boot_cpu;
 | 
					    char *boot_cpu;
 | 
				
			||||||
    ARMCPU *boot_cpu_ptr;
 | 
					    ARMCPU *boot_cpu_ptr;
 | 
				
			||||||
 | 
				
			|||||||
@ -1334,11 +1334,15 @@ FIELD(CPTR_EL3, TTA, 20, 1)
 | 
				
			|||||||
FIELD(CPTR_EL3, TAM, 30, 1)
 | 
					FIELD(CPTR_EL3, TAM, 30, 1)
 | 
				
			||||||
FIELD(CPTR_EL3, TCPAC, 31, 1)
 | 
					FIELD(CPTR_EL3, TCPAC, 31, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MDCR_MTPME    (1U << 28)
 | 
				
			||||||
 | 
					#define MDCR_TDCC     (1U << 27)
 | 
				
			||||||
#define MDCR_HLP      (1U << 26)  /* MDCR_EL2 */
 | 
					#define MDCR_HLP      (1U << 26)  /* MDCR_EL2 */
 | 
				
			||||||
#define MDCR_SCCD     (1U << 23)  /* MDCR_EL3 */
 | 
					#define MDCR_SCCD     (1U << 23)  /* MDCR_EL3 */
 | 
				
			||||||
#define MDCR_HCCD     (1U << 23)  /* MDCR_EL2 */
 | 
					#define MDCR_HCCD     (1U << 23)  /* MDCR_EL2 */
 | 
				
			||||||
#define MDCR_EPMAD    (1U << 21)
 | 
					#define MDCR_EPMAD    (1U << 21)
 | 
				
			||||||
#define MDCR_EDAD     (1U << 20)
 | 
					#define MDCR_EDAD     (1U << 20)
 | 
				
			||||||
 | 
					#define MDCR_TTRF     (1U << 19)
 | 
				
			||||||
 | 
					#define MDCR_STE      (1U << 18)  /* MDCR_EL3 */
 | 
				
			||||||
#define MDCR_SPME     (1U << 17)  /* MDCR_EL3 */
 | 
					#define MDCR_SPME     (1U << 17)  /* MDCR_EL3 */
 | 
				
			||||||
#define MDCR_HPMD     (1U << 17)  /* MDCR_EL2 */
 | 
					#define MDCR_HPMD     (1U << 17)  /* MDCR_EL2 */
 | 
				
			||||||
#define MDCR_SDD      (1U << 16)
 | 
					#define MDCR_SDD      (1U << 16)
 | 
				
			||||||
@ -1353,7 +1357,9 @@ FIELD(CPTR_EL3, TCPAC, 31, 1)
 | 
				
			|||||||
#define MDCR_HPMN     (0x1fU)
 | 
					#define MDCR_HPMN     (0x1fU)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Not all of the MDCR_EL3 bits are present in the 32-bit SDCR */
 | 
					/* Not all of the MDCR_EL3 bits are present in the 32-bit SDCR */
 | 
				
			||||||
#define SDCR_VALID_MASK (MDCR_EPMAD | MDCR_EDAD | MDCR_SPME | MDCR_SPD)
 | 
					#define SDCR_VALID_MASK (MDCR_MTPME | MDCR_TDCC | MDCR_SCCD | \
 | 
				
			||||||
 | 
					                         MDCR_EPMAD | MDCR_EDAD | MDCR_TTRF | \
 | 
				
			||||||
 | 
					                         MDCR_STE | MDCR_SPME | MDCR_SPD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CPSR_M (0x1fU)
 | 
					#define CPSR_M (0x1fU)
 | 
				
			||||||
#define CPSR_T (1U << 5)
 | 
					#define CPSR_T (1U << 5)
 | 
				
			||||||
 | 
				
			|||||||
@ -116,313 +116,6 @@ static void aarch64_a35_initfn(Object *obj)
 | 
				
			|||||||
    define_cortex_a72_a57_a53_cp_reginfo(cpu);
 | 
					    define_cortex_a72_a57_a53_cp_reginfo(cpu);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void aarch64_a57_initfn(Object *obj)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ARMCPU *cpu = ARM_CPU(obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cpu->dtb_compatible = "arm,cortex-a57";
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
					 | 
				
			||||||
    cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A57;
 | 
					 | 
				
			||||||
    cpu->midr = 0x411fd070;
 | 
					 | 
				
			||||||
    cpu->revidr = 0x00000000;
 | 
					 | 
				
			||||||
    cpu->reset_fpsid = 0x41034070;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr0 = 0x10110222;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr1 = 0x12111111;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr2 = 0x00000043;
 | 
					 | 
				
			||||||
    cpu->ctr = 0x8444c004;
 | 
					 | 
				
			||||||
    cpu->reset_sctlr = 0x00c50838;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr0 = 0x00000131;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr1 = 0x00011011;
 | 
					 | 
				
			||||||
    cpu->isar.id_dfr0 = 0x03010066;
 | 
					 | 
				
			||||||
    cpu->id_afr0 = 0x00000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr0 = 0x10101105;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr1 = 0x40000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr2 = 0x01260000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr3 = 0x02102211;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar0 = 0x02101110;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar1 = 0x13112111;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar2 = 0x21232042;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar3 = 0x01112131;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar4 = 0x00011142;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar5 = 0x00011121;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar6 = 0;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64pfr0 = 0x00002222;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64dfr0 = 0x10305106;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64isar0 = 0x00011120;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr0 = 0x00001124;
 | 
					 | 
				
			||||||
    cpu->isar.dbgdidr = 0x3516d000;
 | 
					 | 
				
			||||||
    cpu->isar.dbgdevid = 0x01110f13;
 | 
					 | 
				
			||||||
    cpu->isar.dbgdevid1 = 0x2;
 | 
					 | 
				
			||||||
    cpu->isar.reset_pmcr_el0 = 0x41013000;
 | 
					 | 
				
			||||||
    cpu->clidr = 0x0a200023;
 | 
					 | 
				
			||||||
    cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[1] = 0x201fe012; /* 48KB L1 icache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[2] = 0x70ffe07a; /* 2048KB L2 cache */
 | 
					 | 
				
			||||||
    cpu->dcz_blocksize = 4; /* 64 bytes */
 | 
					 | 
				
			||||||
    cpu->gic_num_lrs = 4;
 | 
					 | 
				
			||||||
    cpu->gic_vpribits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_vprebits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_pribits = 5;
 | 
					 | 
				
			||||||
    define_cortex_a72_a57_a53_cp_reginfo(cpu);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void aarch64_a53_initfn(Object *obj)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ARMCPU *cpu = ARM_CPU(obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cpu->dtb_compatible = "arm,cortex-a53";
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
					 | 
				
			||||||
    cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A53;
 | 
					 | 
				
			||||||
    cpu->midr = 0x410fd034;
 | 
					 | 
				
			||||||
    cpu->revidr = 0x00000000;
 | 
					 | 
				
			||||||
    cpu->reset_fpsid = 0x41034070;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr0 = 0x10110222;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr1 = 0x12111111;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr2 = 0x00000043;
 | 
					 | 
				
			||||||
    cpu->ctr = 0x84448004; /* L1Ip = VIPT */
 | 
					 | 
				
			||||||
    cpu->reset_sctlr = 0x00c50838;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr0 = 0x00000131;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr1 = 0x00011011;
 | 
					 | 
				
			||||||
    cpu->isar.id_dfr0 = 0x03010066;
 | 
					 | 
				
			||||||
    cpu->id_afr0 = 0x00000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr0 = 0x10101105;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr1 = 0x40000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr2 = 0x01260000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr3 = 0x02102211;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar0 = 0x02101110;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar1 = 0x13112111;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar2 = 0x21232042;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar3 = 0x01112131;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar4 = 0x00011142;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar5 = 0x00011121;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar6 = 0;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64pfr0 = 0x00002222;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64dfr0 = 0x10305106;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64isar0 = 0x00011120;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr0 = 0x00001122; /* 40 bit physical addr */
 | 
					 | 
				
			||||||
    cpu->isar.dbgdidr = 0x3516d000;
 | 
					 | 
				
			||||||
    cpu->isar.dbgdevid = 0x00110f13;
 | 
					 | 
				
			||||||
    cpu->isar.dbgdevid1 = 0x1;
 | 
					 | 
				
			||||||
    cpu->isar.reset_pmcr_el0 = 0x41033000;
 | 
					 | 
				
			||||||
    cpu->clidr = 0x0a200023;
 | 
					 | 
				
			||||||
    cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[1] = 0x201fe00a; /* 32KB L1 icache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[2] = 0x707fe07a; /* 1024KB L2 cache */
 | 
					 | 
				
			||||||
    cpu->dcz_blocksize = 4; /* 64 bytes */
 | 
					 | 
				
			||||||
    cpu->gic_num_lrs = 4;
 | 
					 | 
				
			||||||
    cpu->gic_vpribits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_vprebits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_pribits = 5;
 | 
					 | 
				
			||||||
    define_cortex_a72_a57_a53_cp_reginfo(cpu);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void aarch64_a72_initfn(Object *obj)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ARMCPU *cpu = ARM_CPU(obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cpu->dtb_compatible = "arm,cortex-a72";
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
					 | 
				
			||||||
    cpu->midr = 0x410fd083;
 | 
					 | 
				
			||||||
    cpu->revidr = 0x00000000;
 | 
					 | 
				
			||||||
    cpu->reset_fpsid = 0x41034080;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr0 = 0x10110222;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr1 = 0x12111111;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr2 = 0x00000043;
 | 
					 | 
				
			||||||
    cpu->ctr = 0x8444c004;
 | 
					 | 
				
			||||||
    cpu->reset_sctlr = 0x00c50838;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr0 = 0x00000131;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr1 = 0x00011011;
 | 
					 | 
				
			||||||
    cpu->isar.id_dfr0 = 0x03010066;
 | 
					 | 
				
			||||||
    cpu->id_afr0 = 0x00000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr0 = 0x10201105;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr1 = 0x40000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr2 = 0x01260000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr3 = 0x02102211;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar0 = 0x02101110;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar1 = 0x13112111;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar2 = 0x21232042;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar3 = 0x01112131;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar4 = 0x00011142;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar5 = 0x00011121;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64pfr0 = 0x00002222;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64dfr0 = 0x10305106;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64isar0 = 0x00011120;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr0 = 0x00001124;
 | 
					 | 
				
			||||||
    cpu->isar.dbgdidr = 0x3516d000;
 | 
					 | 
				
			||||||
    cpu->isar.dbgdevid = 0x01110f13;
 | 
					 | 
				
			||||||
    cpu->isar.dbgdevid1 = 0x2;
 | 
					 | 
				
			||||||
    cpu->isar.reset_pmcr_el0 = 0x41023000;
 | 
					 | 
				
			||||||
    cpu->clidr = 0x0a200023;
 | 
					 | 
				
			||||||
    cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[1] = 0x201fe012; /* 48KB L1 icache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[2] = 0x707fe07a; /* 1MB L2 cache */
 | 
					 | 
				
			||||||
    cpu->dcz_blocksize = 4; /* 64 bytes */
 | 
					 | 
				
			||||||
    cpu->gic_num_lrs = 4;
 | 
					 | 
				
			||||||
    cpu->gic_vpribits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_vprebits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_pribits = 5;
 | 
					 | 
				
			||||||
    define_cortex_a72_a57_a53_cp_reginfo(cpu);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void aarch64_a76_initfn(Object *obj)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ARMCPU *cpu = ARM_CPU(obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cpu->dtb_compatible = "arm,cortex-a76";
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Ordered by B2.4 AArch64 registers by functional group */
 | 
					 | 
				
			||||||
    cpu->clidr = 0x82000023;
 | 
					 | 
				
			||||||
    cpu->ctr = 0x8444C004;
 | 
					 | 
				
			||||||
    cpu->dcz_blocksize = 4;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64dfr0  = 0x0000000010305408ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64pfr0  = 0x1100000010111112ull; /* GIC filled in later */
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64pfr1  = 0x0000000000000010ull;
 | 
					 | 
				
			||||||
    cpu->id_afr0       = 0x00000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_dfr0  = 0x04010088;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar0 = 0x02101110;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar1 = 0x13112111;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar2 = 0x21232042;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar3 = 0x01112131;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar4 = 0x00010142;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar5 = 0x01011121;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar6 = 0x00000010;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr0 = 0x10201105;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr1 = 0x40000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr2 = 0x01260000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr3 = 0x02122211;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr4 = 0x00021110;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr0  = 0x10010131;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr1  = 0x00010000; /* GIC filled in later */
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr2  = 0x00000011;
 | 
					 | 
				
			||||||
    cpu->midr = 0x414fd0b1;          /* r4p1 */
 | 
					 | 
				
			||||||
    cpu->revidr = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From B2.18 CCSIDR_EL1 */
 | 
					 | 
				
			||||||
    cpu->ccsidr[0] = 0x701fe01a; /* 64KB L1 dcache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[1] = 0x201fe01a; /* 64KB L1 icache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[2] = 0x707fe03a; /* 512KB L2 cache */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From B2.93 SCTLR_EL3 */
 | 
					 | 
				
			||||||
    cpu->reset_sctlr = 0x30c50838;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From B4.23 ICH_VTR_EL2 */
 | 
					 | 
				
			||||||
    cpu->gic_num_lrs = 4;
 | 
					 | 
				
			||||||
    cpu->gic_vpribits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_vprebits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_pribits = 5;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From B5.1 AdvSIMD AArch64 register summary */
 | 
					 | 
				
			||||||
    cpu->isar.mvfr0 = 0x10110222;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr1 = 0x13211111;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr2 = 0x00000043;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From D5.1 AArch64 PMU register summary */
 | 
					 | 
				
			||||||
    cpu->isar.reset_pmcr_el0 = 0x410b3000;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void aarch64_neoverse_n1_initfn(Object *obj)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ARMCPU *cpu = ARM_CPU(obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cpu->dtb_compatible = "arm,neoverse-n1";
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Ordered by B2.4 AArch64 registers by functional group */
 | 
					 | 
				
			||||||
    cpu->clidr = 0x82000023;
 | 
					 | 
				
			||||||
    cpu->ctr = 0x8444c004;
 | 
					 | 
				
			||||||
    cpu->dcz_blocksize = 4;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64dfr0  = 0x0000000110305408ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64pfr0  = 0x1100000010111112ull; /* GIC filled in later */
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64pfr1  = 0x0000000000000020ull;
 | 
					 | 
				
			||||||
    cpu->id_afr0       = 0x00000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_dfr0  = 0x04010088;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar0 = 0x02101110;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar1 = 0x13112111;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar2 = 0x21232042;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar3 = 0x01112131;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar4 = 0x00010142;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar5 = 0x01011121;
 | 
					 | 
				
			||||||
    cpu->isar.id_isar6 = 0x00000010;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr0 = 0x10201105;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr1 = 0x40000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr2 = 0x01260000;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr3 = 0x02122211;
 | 
					 | 
				
			||||||
    cpu->isar.id_mmfr4 = 0x00021110;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr0  = 0x10010131;
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr1  = 0x00010000; /* GIC filled in later */
 | 
					 | 
				
			||||||
    cpu->isar.id_pfr2  = 0x00000011;
 | 
					 | 
				
			||||||
    cpu->midr = 0x414fd0c1;          /* r4p1 */
 | 
					 | 
				
			||||||
    cpu->revidr = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From B2.23 CCSIDR_EL1 */
 | 
					 | 
				
			||||||
    cpu->ccsidr[0] = 0x701fe01a; /* 64KB L1 dcache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[1] = 0x201fe01a; /* 64KB L1 icache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[2] = 0x70ffe03a; /* 1MB L2 cache */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From B2.98 SCTLR_EL3 */
 | 
					 | 
				
			||||||
    cpu->reset_sctlr = 0x30c50838;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From B4.23 ICH_VTR_EL2 */
 | 
					 | 
				
			||||||
    cpu->gic_num_lrs = 4;
 | 
					 | 
				
			||||||
    cpu->gic_vpribits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_vprebits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_pribits = 5;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From B5.1 AdvSIMD AArch64 register summary */
 | 
					 | 
				
			||||||
    cpu->isar.mvfr0 = 0x10110222;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr1 = 0x13211111;
 | 
					 | 
				
			||||||
    cpu->isar.mvfr2 = 0x00000043;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* From D5.1 AArch64 PMU register summary */
 | 
					 | 
				
			||||||
    cpu->isar.reset_pmcr_el0 = 0x410c3000;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
 | 
					void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
@ -985,6 +678,362 @@ void arm_cpu_lpa2_finalize(ARMCPU *cpu, Error **errp)
 | 
				
			|||||||
    cpu->isar.id_aa64mmfr0 = t;
 | 
					    cpu->isar.id_aa64mmfr0 = t;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void aarch64_a57_initfn(Object *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ARMCPU *cpu = ARM_CPU(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cpu->dtb_compatible = "arm,cortex-a57";
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
				
			||||||
 | 
					    cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A57;
 | 
				
			||||||
 | 
					    cpu->midr = 0x411fd070;
 | 
				
			||||||
 | 
					    cpu->revidr = 0x00000000;
 | 
				
			||||||
 | 
					    cpu->reset_fpsid = 0x41034070;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr0 = 0x10110222;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr1 = 0x12111111;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr2 = 0x00000043;
 | 
				
			||||||
 | 
					    cpu->ctr = 0x8444c004;
 | 
				
			||||||
 | 
					    cpu->reset_sctlr = 0x00c50838;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr0 = 0x00000131;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr1 = 0x00011011;
 | 
				
			||||||
 | 
					    cpu->isar.id_dfr0 = 0x03010066;
 | 
				
			||||||
 | 
					    cpu->id_afr0 = 0x00000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr0 = 0x10101105;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr1 = 0x40000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr2 = 0x01260000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr3 = 0x02102211;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar0 = 0x02101110;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar1 = 0x13112111;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar2 = 0x21232042;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar3 = 0x01112131;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar4 = 0x00011142;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar5 = 0x00011121;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar6 = 0;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64pfr0 = 0x00002222;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64dfr0 = 0x10305106;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64isar0 = 0x00011120;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr0 = 0x00001124;
 | 
				
			||||||
 | 
					    cpu->isar.dbgdidr = 0x3516d000;
 | 
				
			||||||
 | 
					    cpu->isar.dbgdevid = 0x01110f13;
 | 
				
			||||||
 | 
					    cpu->isar.dbgdevid1 = 0x2;
 | 
				
			||||||
 | 
					    cpu->isar.reset_pmcr_el0 = 0x41013000;
 | 
				
			||||||
 | 
					    cpu->clidr = 0x0a200023;
 | 
				
			||||||
 | 
					    cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[1] = 0x201fe012; /* 48KB L1 icache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[2] = 0x70ffe07a; /* 2048KB L2 cache */
 | 
				
			||||||
 | 
					    cpu->dcz_blocksize = 4; /* 64 bytes */
 | 
				
			||||||
 | 
					    cpu->gic_num_lrs = 4;
 | 
				
			||||||
 | 
					    cpu->gic_vpribits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_vprebits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_pribits = 5;
 | 
				
			||||||
 | 
					    define_cortex_a72_a57_a53_cp_reginfo(cpu);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void aarch64_a53_initfn(Object *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ARMCPU *cpu = ARM_CPU(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cpu->dtb_compatible = "arm,cortex-a53";
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
				
			||||||
 | 
					    cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A53;
 | 
				
			||||||
 | 
					    cpu->midr = 0x410fd034;
 | 
				
			||||||
 | 
					    cpu->revidr = 0x00000000;
 | 
				
			||||||
 | 
					    cpu->reset_fpsid = 0x41034070;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr0 = 0x10110222;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr1 = 0x12111111;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr2 = 0x00000043;
 | 
				
			||||||
 | 
					    cpu->ctr = 0x84448004; /* L1Ip = VIPT */
 | 
				
			||||||
 | 
					    cpu->reset_sctlr = 0x00c50838;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr0 = 0x00000131;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr1 = 0x00011011;
 | 
				
			||||||
 | 
					    cpu->isar.id_dfr0 = 0x03010066;
 | 
				
			||||||
 | 
					    cpu->id_afr0 = 0x00000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr0 = 0x10101105;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr1 = 0x40000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr2 = 0x01260000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr3 = 0x02102211;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar0 = 0x02101110;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar1 = 0x13112111;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar2 = 0x21232042;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar3 = 0x01112131;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar4 = 0x00011142;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar5 = 0x00011121;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar6 = 0;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64pfr0 = 0x00002222;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64dfr0 = 0x10305106;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64isar0 = 0x00011120;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr0 = 0x00001122; /* 40 bit physical addr */
 | 
				
			||||||
 | 
					    cpu->isar.dbgdidr = 0x3516d000;
 | 
				
			||||||
 | 
					    cpu->isar.dbgdevid = 0x00110f13;
 | 
				
			||||||
 | 
					    cpu->isar.dbgdevid1 = 0x1;
 | 
				
			||||||
 | 
					    cpu->isar.reset_pmcr_el0 = 0x41033000;
 | 
				
			||||||
 | 
					    cpu->clidr = 0x0a200023;
 | 
				
			||||||
 | 
					    cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[1] = 0x201fe00a; /* 32KB L1 icache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[2] = 0x707fe07a; /* 1024KB L2 cache */
 | 
				
			||||||
 | 
					    cpu->dcz_blocksize = 4; /* 64 bytes */
 | 
				
			||||||
 | 
					    cpu->gic_num_lrs = 4;
 | 
				
			||||||
 | 
					    cpu->gic_vpribits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_vprebits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_pribits = 5;
 | 
				
			||||||
 | 
					    define_cortex_a72_a57_a53_cp_reginfo(cpu);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void aarch64_a72_initfn(Object *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ARMCPU *cpu = ARM_CPU(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cpu->dtb_compatible = "arm,cortex-a72";
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
				
			||||||
 | 
					    cpu->midr = 0x410fd083;
 | 
				
			||||||
 | 
					    cpu->revidr = 0x00000000;
 | 
				
			||||||
 | 
					    cpu->reset_fpsid = 0x41034080;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr0 = 0x10110222;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr1 = 0x12111111;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr2 = 0x00000043;
 | 
				
			||||||
 | 
					    cpu->ctr = 0x8444c004;
 | 
				
			||||||
 | 
					    cpu->reset_sctlr = 0x00c50838;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr0 = 0x00000131;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr1 = 0x00011011;
 | 
				
			||||||
 | 
					    cpu->isar.id_dfr0 = 0x03010066;
 | 
				
			||||||
 | 
					    cpu->id_afr0 = 0x00000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr0 = 0x10201105;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr1 = 0x40000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr2 = 0x01260000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr3 = 0x02102211;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar0 = 0x02101110;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar1 = 0x13112111;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar2 = 0x21232042;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar3 = 0x01112131;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar4 = 0x00011142;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar5 = 0x00011121;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64pfr0 = 0x00002222;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64dfr0 = 0x10305106;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64isar0 = 0x00011120;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr0 = 0x00001124;
 | 
				
			||||||
 | 
					    cpu->isar.dbgdidr = 0x3516d000;
 | 
				
			||||||
 | 
					    cpu->isar.dbgdevid = 0x01110f13;
 | 
				
			||||||
 | 
					    cpu->isar.dbgdevid1 = 0x2;
 | 
				
			||||||
 | 
					    cpu->isar.reset_pmcr_el0 = 0x41023000;
 | 
				
			||||||
 | 
					    cpu->clidr = 0x0a200023;
 | 
				
			||||||
 | 
					    cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[1] = 0x201fe012; /* 48KB L1 icache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[2] = 0x707fe07a; /* 1MB L2 cache */
 | 
				
			||||||
 | 
					    cpu->dcz_blocksize = 4; /* 64 bytes */
 | 
				
			||||||
 | 
					    cpu->gic_num_lrs = 4;
 | 
				
			||||||
 | 
					    cpu->gic_vpribits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_vprebits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_pribits = 5;
 | 
				
			||||||
 | 
					    define_cortex_a72_a57_a53_cp_reginfo(cpu);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void aarch64_a76_initfn(Object *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ARMCPU *cpu = ARM_CPU(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cpu->dtb_compatible = "arm,cortex-a76";
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Ordered by B2.4 AArch64 registers by functional group */
 | 
				
			||||||
 | 
					    cpu->clidr = 0x82000023;
 | 
				
			||||||
 | 
					    cpu->ctr = 0x8444C004;
 | 
				
			||||||
 | 
					    cpu->dcz_blocksize = 4;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64dfr0  = 0x0000000010305408ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64pfr0  = 0x1100000010111112ull; /* GIC filled in later */
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64pfr1  = 0x0000000000000010ull;
 | 
				
			||||||
 | 
					    cpu->id_afr0       = 0x00000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_dfr0  = 0x04010088;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar0 = 0x02101110;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar1 = 0x13112111;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar2 = 0x21232042;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar3 = 0x01112131;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar4 = 0x00010142;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar5 = 0x01011121;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar6 = 0x00000010;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr0 = 0x10201105;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr1 = 0x40000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr2 = 0x01260000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr3 = 0x02122211;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr4 = 0x00021110;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr0  = 0x10010131;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr1  = 0x00010000; /* GIC filled in later */
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr2  = 0x00000011;
 | 
				
			||||||
 | 
					    cpu->midr = 0x414fd0b1;          /* r4p1 */
 | 
				
			||||||
 | 
					    cpu->revidr = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From B2.18 CCSIDR_EL1 */
 | 
				
			||||||
 | 
					    cpu->ccsidr[0] = 0x701fe01a; /* 64KB L1 dcache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[1] = 0x201fe01a; /* 64KB L1 icache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[2] = 0x707fe03a; /* 512KB L2 cache */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From B2.93 SCTLR_EL3 */
 | 
				
			||||||
 | 
					    cpu->reset_sctlr = 0x30c50838;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From B4.23 ICH_VTR_EL2 */
 | 
				
			||||||
 | 
					    cpu->gic_num_lrs = 4;
 | 
				
			||||||
 | 
					    cpu->gic_vpribits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_vprebits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_pribits = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From B5.1 AdvSIMD AArch64 register summary */
 | 
				
			||||||
 | 
					    cpu->isar.mvfr0 = 0x10110222;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr1 = 0x13211111;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr2 = 0x00000043;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From D5.1 AArch64 PMU register summary */
 | 
				
			||||||
 | 
					    cpu->isar.reset_pmcr_el0 = 0x410b3000;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void aarch64_a64fx_initfn(Object *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ARMCPU *cpu = ARM_CPU(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cpu->dtb_compatible = "arm,a64fx";
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
				
			||||||
 | 
					    cpu->midr = 0x461f0010;
 | 
				
			||||||
 | 
					    cpu->revidr = 0x00000000;
 | 
				
			||||||
 | 
					    cpu->ctr = 0x86668006;
 | 
				
			||||||
 | 
					    cpu->reset_sctlr = 0x30000180;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64pfr0 =   0x0000000101111111; /* No RAS Extensions */
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64pfr1 = 0x0000000000000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64dfr0 = 0x0000000010305408;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64dfr1 = 0x0000000000000000;
 | 
				
			||||||
 | 
					    cpu->id_aa64afr0 = 0x0000000000000000;
 | 
				
			||||||
 | 
					    cpu->id_aa64afr1 = 0x0000000000000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr0 = 0x0000000000001122;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr1 = 0x0000000011212100;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr2 = 0x0000000000001011;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64isar0 = 0x0000000010211120;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64isar1 = 0x0000000000010001;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64zfr0 = 0x0000000000000000;
 | 
				
			||||||
 | 
					    cpu->clidr = 0x0000000080000023;
 | 
				
			||||||
 | 
					    cpu->ccsidr[0] = 0x7007e01c; /* 64KB L1 dcache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[1] = 0x2007e01c; /* 64KB L1 icache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[2] = 0x70ffe07c; /* 8MB L2 cache */
 | 
				
			||||||
 | 
					    cpu->dcz_blocksize = 6; /* 256 bytes */
 | 
				
			||||||
 | 
					    cpu->gic_num_lrs = 4;
 | 
				
			||||||
 | 
					    cpu->gic_vpribits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_vprebits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_pribits = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* The A64FX supports only 128, 256 and 512 bit vector lengths */
 | 
				
			||||||
 | 
					    aarch64_add_sve_properties(obj);
 | 
				
			||||||
 | 
					    cpu->sve_vq.supported = (1 << 0)  /* 128bit */
 | 
				
			||||||
 | 
					                          | (1 << 1)  /* 256bit */
 | 
				
			||||||
 | 
					                          | (1 << 3); /* 512bit */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cpu->isar.reset_pmcr_el0 = 0x46014040;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* TODO:  Add A64FX specific HPC extension registers */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void aarch64_neoverse_n1_initfn(Object *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ARMCPU *cpu = ARM_CPU(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cpu->dtb_compatible = "arm,neoverse-n1";
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
				
			||||||
 | 
					    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Ordered by B2.4 AArch64 registers by functional group */
 | 
				
			||||||
 | 
					    cpu->clidr = 0x82000023;
 | 
				
			||||||
 | 
					    cpu->ctr = 0x8444c004;
 | 
				
			||||||
 | 
					    cpu->dcz_blocksize = 4;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64dfr0  = 0x0000000110305408ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64pfr0  = 0x1100000010111112ull; /* GIC filled in later */
 | 
				
			||||||
 | 
					    cpu->isar.id_aa64pfr1  = 0x0000000000000020ull;
 | 
				
			||||||
 | 
					    cpu->id_afr0       = 0x00000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_dfr0  = 0x04010088;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar0 = 0x02101110;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar1 = 0x13112111;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar2 = 0x21232042;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar3 = 0x01112131;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar4 = 0x00010142;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar5 = 0x01011121;
 | 
				
			||||||
 | 
					    cpu->isar.id_isar6 = 0x00000010;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr0 = 0x10201105;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr1 = 0x40000000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr2 = 0x01260000;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr3 = 0x02122211;
 | 
				
			||||||
 | 
					    cpu->isar.id_mmfr4 = 0x00021110;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr0  = 0x10010131;
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr1  = 0x00010000; /* GIC filled in later */
 | 
				
			||||||
 | 
					    cpu->isar.id_pfr2  = 0x00000011;
 | 
				
			||||||
 | 
					    cpu->midr = 0x414fd0c1;          /* r4p1 */
 | 
				
			||||||
 | 
					    cpu->revidr = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From B2.23 CCSIDR_EL1 */
 | 
				
			||||||
 | 
					    cpu->ccsidr[0] = 0x701fe01a; /* 64KB L1 dcache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[1] = 0x201fe01a; /* 64KB L1 icache */
 | 
				
			||||||
 | 
					    cpu->ccsidr[2] = 0x70ffe03a; /* 1MB L2 cache */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From B2.98 SCTLR_EL3 */
 | 
				
			||||||
 | 
					    cpu->reset_sctlr = 0x30c50838;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From B4.23 ICH_VTR_EL2 */
 | 
				
			||||||
 | 
					    cpu->gic_num_lrs = 4;
 | 
				
			||||||
 | 
					    cpu->gic_vpribits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_vprebits = 5;
 | 
				
			||||||
 | 
					    cpu->gic_pribits = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From B5.1 AdvSIMD AArch64 register summary */
 | 
				
			||||||
 | 
					    cpu->isar.mvfr0 = 0x10110222;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr1 = 0x13211111;
 | 
				
			||||||
 | 
					    cpu->isar.mvfr2 = 0x00000043;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* From D5.1 AArch64 PMU register summary */
 | 
				
			||||||
 | 
					    cpu->isar.reset_pmcr_el0 = 0x410c3000;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void aarch64_host_initfn(Object *obj)
 | 
					static void aarch64_host_initfn(Object *obj)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(CONFIG_KVM)
 | 
					#if defined(CONFIG_KVM)
 | 
				
			||||||
@ -1188,55 +1237,6 @@ static void aarch64_max_initfn(Object *obj)
 | 
				
			|||||||
    qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property);
 | 
					    qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void aarch64_a64fx_initfn(Object *obj)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ARMCPU *cpu = ARM_CPU(obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cpu->dtb_compatible = "arm,a64fx";
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_V8);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_NEON);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL2);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_EL3);
 | 
					 | 
				
			||||||
    set_feature(&cpu->env, ARM_FEATURE_PMU);
 | 
					 | 
				
			||||||
    cpu->midr = 0x461f0010;
 | 
					 | 
				
			||||||
    cpu->revidr = 0x00000000;
 | 
					 | 
				
			||||||
    cpu->ctr = 0x86668006;
 | 
					 | 
				
			||||||
    cpu->reset_sctlr = 0x30000180;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64pfr0 =   0x0000000101111111; /* No RAS Extensions */
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64pfr1 = 0x0000000000000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64dfr0 = 0x0000000010305408;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64dfr1 = 0x0000000000000000;
 | 
					 | 
				
			||||||
    cpu->id_aa64afr0 = 0x0000000000000000;
 | 
					 | 
				
			||||||
    cpu->id_aa64afr1 = 0x0000000000000000;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr0 = 0x0000000000001122;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr1 = 0x0000000011212100;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64mmfr2 = 0x0000000000001011;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64isar0 = 0x0000000010211120;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64isar1 = 0x0000000000010001;
 | 
					 | 
				
			||||||
    cpu->isar.id_aa64zfr0 = 0x0000000000000000;
 | 
					 | 
				
			||||||
    cpu->clidr = 0x0000000080000023;
 | 
					 | 
				
			||||||
    cpu->ccsidr[0] = 0x7007e01c; /* 64KB L1 dcache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[1] = 0x2007e01c; /* 64KB L1 icache */
 | 
					 | 
				
			||||||
    cpu->ccsidr[2] = 0x70ffe07c; /* 8MB L2 cache */
 | 
					 | 
				
			||||||
    cpu->dcz_blocksize = 6; /* 256 bytes */
 | 
					 | 
				
			||||||
    cpu->gic_num_lrs = 4;
 | 
					 | 
				
			||||||
    cpu->gic_vpribits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_vprebits = 5;
 | 
					 | 
				
			||||||
    cpu->gic_pribits = 5;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* The A64FX supports only 128, 256 and 512 bit vector lengths */
 | 
					 | 
				
			||||||
    aarch64_add_sve_properties(obj);
 | 
					 | 
				
			||||||
    cpu->sve_vq.supported = (1 << 0)  /* 128bit */
 | 
					 | 
				
			||||||
                          | (1 << 1)  /* 256bit */
 | 
					 | 
				
			||||||
                          | (1 << 3); /* 512bit */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cpu->isar.reset_pmcr_el0 = 0x46014040;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* TODO:  Add A64FX specific HPC extension registers */
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const ARMCPUInfo aarch64_cpus[] = {
 | 
					static const ARMCPUInfo aarch64_cpus[] = {
 | 
				
			||||||
    { .name = "cortex-a35",         .initfn = aarch64_a35_initfn },
 | 
					    { .name = "cortex-a35",         .initfn = aarch64_a35_initfn },
 | 
				
			||||||
    { .name = "cortex-a57",         .initfn = aarch64_a57_initfn },
 | 
					    { .name = "cortex-a57",         .initfn = aarch64_a57_initfn },
 | 
				
			||||||
 | 
				
			|||||||
@ -1927,12 +1927,12 @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
 | 
				
			|||||||
     * or PL0_RO as appropriate and then check PMUSERENR in the helper fn.
 | 
					     * or PL0_RO as appropriate and then check PMUSERENR in the helper fn.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    { .name = "PMCNTENSET", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 1,
 | 
					    { .name = "PMCNTENSET", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 1,
 | 
				
			||||||
      .access = PL0_RW, .type = ARM_CP_ALIAS,
 | 
					      .access = PL0_RW, .type = ARM_CP_ALIAS | ARM_CP_IO,
 | 
				
			||||||
      .fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pmcnten),
 | 
					      .fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pmcnten),
 | 
				
			||||||
      .writefn = pmcntenset_write,
 | 
					      .writefn = pmcntenset_write,
 | 
				
			||||||
      .accessfn = pmreg_access,
 | 
					      .accessfn = pmreg_access,
 | 
				
			||||||
      .raw_writefn = raw_write },
 | 
					      .raw_writefn = raw_write },
 | 
				
			||||||
    { .name = "PMCNTENSET_EL0", .state = ARM_CP_STATE_AA64,
 | 
					    { .name = "PMCNTENSET_EL0", .state = ARM_CP_STATE_AA64, .type = ARM_CP_IO,
 | 
				
			||||||
      .opc0 = 3, .opc1 = 3, .crn = 9, .crm = 12, .opc2 = 1,
 | 
					      .opc0 = 3, .opc1 = 3, .crn = 9, .crm = 12, .opc2 = 1,
 | 
				
			||||||
      .access = PL0_RW, .accessfn = pmreg_access,
 | 
					      .access = PL0_RW, .accessfn = pmreg_access,
 | 
				
			||||||
      .fieldoffset = offsetof(CPUARMState, cp15.c9_pmcnten), .resetvalue = 0,
 | 
					      .fieldoffset = offsetof(CPUARMState, cp15.c9_pmcnten), .resetvalue = 0,
 | 
				
			||||||
@ -1942,11 +1942,11 @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
 | 
				
			|||||||
      .fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pmcnten),
 | 
					      .fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pmcnten),
 | 
				
			||||||
      .accessfn = pmreg_access,
 | 
					      .accessfn = pmreg_access,
 | 
				
			||||||
      .writefn = pmcntenclr_write,
 | 
					      .writefn = pmcntenclr_write,
 | 
				
			||||||
      .type = ARM_CP_ALIAS },
 | 
					      .type = ARM_CP_ALIAS | ARM_CP_IO },
 | 
				
			||||||
    { .name = "PMCNTENCLR_EL0", .state = ARM_CP_STATE_AA64,
 | 
					    { .name = "PMCNTENCLR_EL0", .state = ARM_CP_STATE_AA64,
 | 
				
			||||||
      .opc0 = 3, .opc1 = 3, .crn = 9, .crm = 12, .opc2 = 2,
 | 
					      .opc0 = 3, .opc1 = 3, .crn = 9, .crm = 12, .opc2 = 2,
 | 
				
			||||||
      .access = PL0_RW, .accessfn = pmreg_access,
 | 
					      .access = PL0_RW, .accessfn = pmreg_access,
 | 
				
			||||||
      .type = ARM_CP_ALIAS,
 | 
					      .type = ARM_CP_ALIAS | ARM_CP_IO,
 | 
				
			||||||
      .fieldoffset = offsetof(CPUARMState, cp15.c9_pmcnten),
 | 
					      .fieldoffset = offsetof(CPUARMState, cp15.c9_pmcnten),
 | 
				
			||||||
      .writefn = pmcntenclr_write },
 | 
					      .writefn = pmcntenclr_write },
 | 
				
			||||||
    { .name = "PMOVSR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 3,
 | 
					    { .name = "PMOVSR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 3,
 | 
				
			||||||
@ -4756,8 +4756,8 @@ static void sctlr_write(CPUARMState *env, const ARMCPRegInfo *ri,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sdcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
 | 
					static void mdcr_el3_write(CPUARMState *env, const ARMCPRegInfo *ri,
 | 
				
			||||||
                       uint64_t value)
 | 
					                           uint64_t value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
     * Some MDCR_EL3 bits affect whether PMU counters are running:
 | 
					     * Some MDCR_EL3 bits affect whether PMU counters are running:
 | 
				
			||||||
@ -4769,12 +4769,19 @@ static void sdcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
 | 
				
			|||||||
    if (pmu_op) {
 | 
					    if (pmu_op) {
 | 
				
			||||||
        pmu_op_start(env);
 | 
					        pmu_op_start(env);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    env->cp15.mdcr_el3 = value & SDCR_VALID_MASK;
 | 
					    env->cp15.mdcr_el3 = value;
 | 
				
			||||||
    if (pmu_op) {
 | 
					    if (pmu_op) {
 | 
				
			||||||
        pmu_op_finish(env);
 | 
					        pmu_op_finish(env);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void sdcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
 | 
				
			||||||
 | 
					                       uint64_t value)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Not all bits defined for MDCR_EL3 exist in the AArch32 SDCR */
 | 
				
			||||||
 | 
					    mdcr_el3_write(env, ri, value & SDCR_VALID_MASK);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void mdcr_el2_write(CPUARMState *env, const ARMCPRegInfo *ri,
 | 
					static void mdcr_el2_write(CPUARMState *env, const ARMCPRegInfo *ri,
 | 
				
			||||||
                           uint64_t value)
 | 
					                           uint64_t value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -5081,7 +5088,7 @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
 | 
				
			|||||||
      .fieldoffset = offsetof(CPUARMState, sp_el[0]) },
 | 
					      .fieldoffset = offsetof(CPUARMState, sp_el[0]) },
 | 
				
			||||||
    { .name = "SP_EL1", .state = ARM_CP_STATE_AA64,
 | 
					    { .name = "SP_EL1", .state = ARM_CP_STATE_AA64,
 | 
				
			||||||
      .opc0 = 3, .opc1 = 4, .crn = 4, .crm = 1, .opc2 = 0,
 | 
					      .opc0 = 3, .opc1 = 4, .crn = 4, .crm = 1, .opc2 = 0,
 | 
				
			||||||
      .access = PL2_RW, .type = ARM_CP_ALIAS,
 | 
					      .access = PL2_RW, .type = ARM_CP_ALIAS | ARM_CP_EL3_NO_EL2_KEEP,
 | 
				
			||||||
      .fieldoffset = offsetof(CPUARMState, sp_el[1]) },
 | 
					      .fieldoffset = offsetof(CPUARMState, sp_el[1]) },
 | 
				
			||||||
    { .name = "SPSel", .state = ARM_CP_STATE_AA64,
 | 
					    { .name = "SPSel", .state = ARM_CP_STATE_AA64,
 | 
				
			||||||
      .opc0 = 3, .opc1 = 0, .crn = 4, .crm = 2, .opc2 = 0,
 | 
					      .opc0 = 3, .opc1 = 0, .crn = 4, .crm = 2, .opc2 = 0,
 | 
				
			||||||
@ -5122,10 +5129,13 @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
 | 
				
			|||||||
      .access = PL2_RW,
 | 
					      .access = PL2_RW,
 | 
				
			||||||
      .fieldoffset = offsetof(CPUARMState, banked_spsr[BANK_FIQ]) },
 | 
					      .fieldoffset = offsetof(CPUARMState, banked_spsr[BANK_FIQ]) },
 | 
				
			||||||
    { .name = "MDCR_EL3", .state = ARM_CP_STATE_AA64,
 | 
					    { .name = "MDCR_EL3", .state = ARM_CP_STATE_AA64,
 | 
				
			||||||
 | 
					      .type = ARM_CP_IO,
 | 
				
			||||||
      .opc0 = 3, .opc1 = 6, .crn = 1, .crm = 3, .opc2 = 1,
 | 
					      .opc0 = 3, .opc1 = 6, .crn = 1, .crm = 3, .opc2 = 1,
 | 
				
			||||||
      .resetvalue = 0,
 | 
					      .resetvalue = 0,
 | 
				
			||||||
      .access = PL3_RW, .fieldoffset = offsetof(CPUARMState, cp15.mdcr_el3) },
 | 
					      .access = PL3_RW,
 | 
				
			||||||
    { .name = "SDCR", .type = ARM_CP_ALIAS,
 | 
					      .writefn = mdcr_el3_write,
 | 
				
			||||||
 | 
					      .fieldoffset = offsetof(CPUARMState, cp15.mdcr_el3) },
 | 
				
			||||||
 | 
					    { .name = "SDCR", .type = ARM_CP_ALIAS | ARM_CP_IO,
 | 
				
			||||||
      .cp = 15, .opc1 = 0, .crn = 1, .crm = 3, .opc2 = 1,
 | 
					      .cp = 15, .opc1 = 0, .crn = 1, .crm = 3, .opc2 = 1,
 | 
				
			||||||
      .access = PL1_RW, .accessfn = access_trap_aa32s_el1,
 | 
					      .access = PL1_RW, .accessfn = access_trap_aa32s_el1,
 | 
				
			||||||
      .writefn = sdcr_write,
 | 
					      .writefn = sdcr_write,
 | 
				
			||||||
@ -7832,7 +7842,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
 | 
				
			|||||||
         * value is MDCR_EL2.HPMN which should reset to the value of PMCR_EL0.N.
 | 
					         * value is MDCR_EL2.HPMN which should reset to the value of PMCR_EL0.N.
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        ARMCPRegInfo mdcr_el2 = {
 | 
					        ARMCPRegInfo mdcr_el2 = {
 | 
				
			||||||
            .name = "MDCR_EL2", .state = ARM_CP_STATE_BOTH,
 | 
					            .name = "MDCR_EL2", .state = ARM_CP_STATE_BOTH, .type = ARM_CP_IO,
 | 
				
			||||||
            .opc0 = 3, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 1,
 | 
					            .opc0 = 3, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 1,
 | 
				
			||||||
            .writefn = mdcr_el2_write,
 | 
					            .writefn = mdcr_el2_write,
 | 
				
			||||||
            .access = PL2_RW, .resetvalue = pmu_num_counters(env),
 | 
					            .access = PL2_RW, .resetvalue = pmu_num_counters(env),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user