target-arm queue:
* aspeed: minor fixes * virt: declare fwcfg and virtio-mmio as DMA coherent in DT & ACPI * arm: enable basic TCG emulation of PMU for AArch64 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJYngEmAAoJEDwlJe0UNgze9ZEQAJiymhFa5okHbjEAkffJTPv1 GmbTanjYw0fe7YV6ZrnVxyiPBBUsObmn1NgnhhZWhDCzDLfPxzNP+xFiVKS+gjfH BlQJaL2qCdweTztwyVMUMQ8S5X3jqVoHE1XqSnutJS2IOF3VkGgZLoBoPCIcw2kq Duxw77y5+w8WDk3FiqbqluwIoXjoZbj0CU20KcAWiGNiXI5HL5Vh8qDzcaOcwP1u xpJdpDvrM0crK9zHuu7AOCDz3YuZ0QtZ4xhwFFWdfpZMztrqiXALVmSKyFeGvlET cd2uHpP2XZJGT84levyPJOp+pFTVIVwNAxEpa4RcSQxDNC/bY9wUFmNStAUVuEyf IhSXqvNkmYvBrXlu8H6qgpdCFpDfsk9b8Ieapl109Y/kWBsaWOzH3P9Sh7xGcYkz qvQ4N88a7kVGwT5ys5RaCLnptTMbF541t17aAWOz0m6WTR8m5gMnUmLm5P9dND84 D7Qq5L7BHSCOonI1h5dSVWg2qdObhOehfs7fDWuERaj2PWot4N/cTcLBjjheOC9s rQMV0jtTx0p1/EvTEFtXb9J2CE7rUG9eSTwLkY1IBE5NthLobsGGJi5etrAigiyy qon+fXsm8tLeDVX8KErx/EoEg+8Z0/+h9BorVcuj1MF0c4MSCBbu4mSz4veHa7Bv 6jpFmKX6LhZ26Xq5uLG9 =v+QL -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20170210' into staging target-arm queue: * aspeed: minor fixes * virt: declare fwcfg and virtio-mmio as DMA coherent in DT & ACPI * arm: enable basic TCG emulation of PMU for AArch64 # gpg: Signature made Fri 10 Feb 2017 18:06:30 GMT # gpg: using RSA key 0x3C2525ED14360CDE # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" # gpg: aka "Peter Maydell <pmaydell@gmail.com>" # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * remotes/pmaydell/tags/pull-target-arm-20170210: aspeed/smc: use a modulo to check segment limits aspeed/smc: handle dummies only in fast read mode aspeed: remove useless comment on controller segment size aspeed: check for negative values returned by blk_getlength() hw/arm/virt: Declare fwcfg as dma cache coherent in dt hw/arm/virt: Declare fwcfg as dma cache coherent in ACPI hw/arm/virt: Declare virtio-mmio as dma cache coherent in ACPI target-arm: Declare virtio-mmio as dma-coherent in dt target-arm: Enable vPMU support under TCG mode target-arm: Add support for PMU register PMINTENSET_EL1 target-arm: Add support for AArch64 PMU register PMXEVTYPER_EL0 target-arm: Add support for PMU register PMSELR_EL0 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
6311b19b5c
|
@ -113,9 +113,19 @@ static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
|
||||||
{
|
{
|
||||||
BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
|
BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
|
||||||
uint8_t *storage;
|
uint8_t *storage;
|
||||||
|
int64_t size;
|
||||||
|
|
||||||
if (rom_size > blk_getlength(blk)) {
|
/* The block backend size should have already been 'validated' by
|
||||||
rom_size = blk_getlength(blk);
|
* the creation of the m25p80 object.
|
||||||
|
*/
|
||||||
|
size = blk_getlength(blk);
|
||||||
|
if (size <= 0) {
|
||||||
|
error_setg(errp, "failed to get flash size");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rom_size > size) {
|
||||||
|
rom_size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
storage = g_new0(uint8_t, rom_size);
|
storage = g_new0(uint8_t, rom_size);
|
||||||
|
@ -138,10 +148,6 @@ static void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
|
||||||
DriveInfo *dinfo = drive_get_next(IF_MTD);
|
DriveInfo *dinfo = drive_get_next(IF_MTD);
|
||||||
qemu_irq cs_line;
|
qemu_irq cs_line;
|
||||||
|
|
||||||
/*
|
|
||||||
* FIXME: check that we are not using a flash module exceeding
|
|
||||||
* the controller segment size
|
|
||||||
*/
|
|
||||||
fl->flash = ssi_create_slave_no_init(s->spi, flashtype);
|
fl->flash = ssi_create_slave_no_init(s->spi, flashtype);
|
||||||
if (dinfo) {
|
if (dinfo) {
|
||||||
qdev_prop_set_drive(fl->flash, "drive", blk_by_legacy_dinfo(dinfo),
|
qdev_prop_set_drive(fl->flash, "drive", blk_by_legacy_dinfo(dinfo),
|
||||||
|
@ -200,7 +206,9 @@ static void aspeed_board_init(MachineState *machine,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* create a ROM region using the default mapping window size of
|
* create a ROM region using the default mapping window size of
|
||||||
* the flash module.
|
* the flash module. The window size is 64MB for the AST2400
|
||||||
|
* SoC and 128MB for the AST2500 SoC, which is twice as big as
|
||||||
|
* needed by the flash modules of the Aspeed machines.
|
||||||
*/
|
*/
|
||||||
memory_region_init_rom(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
|
memory_region_init_rom(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
|
||||||
fl->size, &error_abort);
|
fl->size, &error_abort);
|
||||||
|
|
|
@ -452,6 +452,7 @@ static int add_virtio_mmio_node(void *fdt, uint32_t acells, uint32_t scells,
|
||||||
acells, addr, scells, size);
|
acells, addr, scells, size);
|
||||||
qemu_fdt_setprop_cells(fdt, nodename, "interrupt-parent", intc);
|
qemu_fdt_setprop_cells(fdt, nodename, "interrupt-parent", intc);
|
||||||
qemu_fdt_setprop_cells(fdt, nodename, "interrupts", 0, irq, 1);
|
qemu_fdt_setprop_cells(fdt, nodename, "interrupts", 0, irq, 1);
|
||||||
|
qemu_fdt_setprop(fdt, nodename, "dma-coherent", NULL, 0);
|
||||||
g_free(nodename);
|
g_free(nodename);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -90,6 +90,7 @@ static void acpi_dsdt_add_fw_cfg(Aml *scope, const MemMapEntry *fw_cfg_memmap)
|
||||||
aml_append(dev, aml_name_decl("_HID", aml_string("QEMU0002")));
|
aml_append(dev, aml_name_decl("_HID", aml_string("QEMU0002")));
|
||||||
/* device present, functioning, decoding, not shown in UI */
|
/* device present, functioning, decoding, not shown in UI */
|
||||||
aml_append(dev, aml_name_decl("_STA", aml_int(0xB)));
|
aml_append(dev, aml_name_decl("_STA", aml_int(0xB)));
|
||||||
|
aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
|
||||||
|
|
||||||
Aml *crs = aml_resource_template();
|
Aml *crs = aml_resource_template();
|
||||||
aml_append(crs, aml_memory32_fixed(fw_cfg_memmap->base,
|
aml_append(crs, aml_memory32_fixed(fw_cfg_memmap->base,
|
||||||
|
@ -135,6 +136,7 @@ static void acpi_dsdt_add_virtio(Aml *scope,
|
||||||
Aml *dev = aml_device("VR%02u", i);
|
Aml *dev = aml_device("VR%02u", i);
|
||||||
aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0005")));
|
aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0005")));
|
||||||
aml_append(dev, aml_name_decl("_UID", aml_int(i)));
|
aml_append(dev, aml_name_decl("_UID", aml_int(i)));
|
||||||
|
aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
|
||||||
|
|
||||||
Aml *crs = aml_resource_template();
|
Aml *crs = aml_resource_template();
|
||||||
aml_append(crs, aml_memory32_fixed(base, size, AML_READ_WRITE));
|
aml_append(crs, aml_memory32_fixed(base, size, AML_READ_WRITE));
|
||||||
|
|
|
@ -471,7 +471,7 @@ static void fdt_add_pmu_nodes(const VirtMachineState *vms)
|
||||||
CPU_FOREACH(cpu) {
|
CPU_FOREACH(cpu) {
|
||||||
armcpu = ARM_CPU(cpu);
|
armcpu = ARM_CPU(cpu);
|
||||||
if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU) ||
|
if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU) ||
|
||||||
!kvm_arm_pmu_create(cpu, PPI(VIRTUAL_PMU_IRQ))) {
|
(kvm_enabled() && !kvm_arm_pmu_create(cpu, PPI(VIRTUAL_PMU_IRQ)))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -797,6 +797,7 @@ static void create_virtio_devices(const VirtMachineState *vms, qemu_irq *pic)
|
||||||
qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
|
qemu_fdt_setprop_cells(vms->fdt, nodename, "interrupts",
|
||||||
GIC_FDT_IRQ_TYPE_SPI, irq,
|
GIC_FDT_IRQ_TYPE_SPI, irq,
|
||||||
GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
|
GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
|
||||||
|
qemu_fdt_setprop(vms->fdt, nodename, "dma-coherent", NULL, 0);
|
||||||
g_free(nodename);
|
g_free(nodename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -928,6 +929,7 @@ static FWCfgState *create_fw_cfg(const VirtMachineState *vms, AddressSpace *as)
|
||||||
"compatible", "qemu,fw-cfg-mmio");
|
"compatible", "qemu,fw-cfg-mmio");
|
||||||
qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
|
qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
|
||||||
2, base, 2, size);
|
2, base, 2, size);
|
||||||
|
qemu_fdt_setprop(vms->fdt, nodename, "dma-coherent", NULL, 0);
|
||||||
g_free(nodename);
|
g_free(nodename);
|
||||||
return fw_cfg;
|
return fw_cfg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -475,15 +475,15 @@ static uint32_t aspeed_smc_check_segment_addr(const AspeedSMCFlash *fl,
|
||||||
AspeedSegments seg;
|
AspeedSegments seg;
|
||||||
|
|
||||||
aspeed_smc_reg_to_segment(s->regs[R_SEG_ADDR0 + fl->id], &seg);
|
aspeed_smc_reg_to_segment(s->regs[R_SEG_ADDR0 + fl->id], &seg);
|
||||||
if ((addr & (seg.size - 1)) != addr) {
|
if ((addr % seg.size) != addr) {
|
||||||
qemu_log_mask(LOG_GUEST_ERROR,
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
"%s: invalid address 0x%08x for CS%d segment : "
|
"%s: invalid address 0x%08x for CS%d segment : "
|
||||||
"[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]\n",
|
"[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]\n",
|
||||||
s->ctrl->name, addr, fl->id, seg.addr,
|
s->ctrl->name, addr, fl->id, seg.addr,
|
||||||
seg.addr + seg.size);
|
seg.addr + seg.size);
|
||||||
|
addr %= seg.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr &= seg.size - 1;
|
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,10 +536,13 @@ static uint64_t aspeed_smc_flash_read(void *opaque, hwaddr addr, unsigned size)
|
||||||
/*
|
/*
|
||||||
* Use fake transfers to model dummy bytes. The value should
|
* Use fake transfers to model dummy bytes. The value should
|
||||||
* be configured to some non-zero value in fast read mode and
|
* be configured to some non-zero value in fast read mode and
|
||||||
* zero in read mode.
|
* zero in read mode. But, as the HW allows inconsistent
|
||||||
|
* settings, let's check for fast read mode.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < aspeed_smc_flash_dummies(fl); i++) {
|
if (aspeed_smc_flash_mode(fl) == CTRL_FREADMODE) {
|
||||||
ssi_transfer(fl->controller->spi, 0xFF);
|
for (i = 0; i < aspeed_smc_flash_dummies(fl); i++) {
|
||||||
|
ssi_transfer(fl->controller->spi, 0xFF);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
|
|
|
@ -781,7 +781,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||||
unset_feature(env, ARM_FEATURE_EL2);
|
unset_feature(env, ARM_FEATURE_EL2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cpu->has_pmu || !kvm_enabled()) {
|
if (!cpu->has_pmu) {
|
||||||
cpu->has_pmu = false;
|
cpu->has_pmu = false;
|
||||||
unset_feature(env, ARM_FEATURE_PMU);
|
unset_feature(env, ARM_FEATURE_PMU);
|
||||||
}
|
}
|
||||||
|
|
|
@ -307,9 +307,9 @@ typedef struct CPUARMState {
|
||||||
uint64_t c9_pmcr; /* performance monitor control register */
|
uint64_t c9_pmcr; /* performance monitor control register */
|
||||||
uint64_t c9_pmcnten; /* perf monitor counter enables */
|
uint64_t c9_pmcnten; /* perf monitor counter enables */
|
||||||
uint32_t c9_pmovsr; /* perf monitor overflow status */
|
uint32_t c9_pmovsr; /* perf monitor overflow status */
|
||||||
uint32_t c9_pmxevtyper; /* perf monitor event type */
|
|
||||||
uint32_t c9_pmuserenr; /* perf monitor user enable */
|
uint32_t c9_pmuserenr; /* perf monitor user enable */
|
||||||
uint32_t c9_pminten; /* perf monitor interrupt enables */
|
uint64_t c9_pmselr; /* perf monitor counter selection register */
|
||||||
|
uint64_t c9_pminten; /* perf monitor interrupt enables */
|
||||||
union { /* Memory attribute redirection */
|
union { /* Memory attribute redirection */
|
||||||
struct {
|
struct {
|
||||||
#ifdef HOST_WORDS_BIGENDIAN
|
#ifdef HOST_WORDS_BIGENDIAN
|
||||||
|
|
|
@ -975,6 +975,17 @@ static uint64_t pmccntr_read(CPUARMState *env, const ARMCPRegInfo *ri)
|
||||||
return total_ticks - env->cp15.c15_ccnt;
|
return total_ticks - env->cp15.c15_ccnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pmselr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
uint64_t value)
|
||||||
|
{
|
||||||
|
/* The value of PMSELR.SEL affects the behavior of PMXEVTYPER and
|
||||||
|
* PMXEVCNTR. We allow [0..31] to be written to PMSELR here; in the
|
||||||
|
* meanwhile, we check PMSELR.SEL when PMXEVTYPER and PMXEVCNTR are
|
||||||
|
* accessed.
|
||||||
|
*/
|
||||||
|
env->cp15.c9_pmselr = value & 0x1f;
|
||||||
|
}
|
||||||
|
|
||||||
static void pmccntr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
static void pmccntr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
|
@ -1043,7 +1054,25 @@ static void pmovsr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
static void pmxevtyper_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
static void pmxevtyper_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
env->cp15.c9_pmxevtyper = value & 0xff;
|
/* Attempts to access PMXEVTYPER are CONSTRAINED UNPREDICTABLE when
|
||||||
|
* PMSELR value is equal to or greater than the number of implemented
|
||||||
|
* counters, but not equal to 0x1f. We opt to behave as a RAZ/WI.
|
||||||
|
*/
|
||||||
|
if (env->cp15.c9_pmselr == 0x1f) {
|
||||||
|
pmccfiltr_write(env, ri, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint64_t pmxevtyper_read(CPUARMState *env, const ARMCPRegInfo *ri)
|
||||||
|
{
|
||||||
|
/* We opt to behave as a RAZ/WI when attempts to access PMXEVTYPER
|
||||||
|
* are CONSTRAINED UNPREDICTABLE. See comments in pmxevtyper_write().
|
||||||
|
*/
|
||||||
|
if (env->cp15.c9_pmselr == 0x1f) {
|
||||||
|
return env->cp15.pmccfiltr_el0;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pmuserenr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
static void pmuserenr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
@ -1194,13 +1223,17 @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
|
||||||
/* Unimplemented so WI. */
|
/* Unimplemented so WI. */
|
||||||
{ .name = "PMSWINC", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 4,
|
{ .name = "PMSWINC", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 4,
|
||||||
.access = PL0_W, .accessfn = pmreg_access, .type = ARM_CP_NOP },
|
.access = PL0_W, .accessfn = pmreg_access, .type = ARM_CP_NOP },
|
||||||
/* Since we don't implement any events, writing to PMSELR is UNPREDICTABLE.
|
|
||||||
* We choose to RAZ/WI.
|
|
||||||
*/
|
|
||||||
{ .name = "PMSELR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 5,
|
|
||||||
.access = PL0_RW, .type = ARM_CP_CONST, .resetvalue = 0,
|
|
||||||
.accessfn = pmreg_access },
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
{ .name = "PMSELR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 5,
|
||||||
|
.access = PL0_RW, .type = ARM_CP_ALIAS,
|
||||||
|
.fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pmselr),
|
||||||
|
.accessfn = pmreg_access, .writefn = pmselr_write,
|
||||||
|
.raw_writefn = raw_write},
|
||||||
|
{ .name = "PMSELR_EL0", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 3, .opc1 = 3, .crn = 9, .crm = 12, .opc2 = 5,
|
||||||
|
.access = PL0_RW, .accessfn = pmreg_access,
|
||||||
|
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmselr),
|
||||||
|
.writefn = pmselr_write, .raw_writefn = raw_write, },
|
||||||
{ .name = "PMCCNTR", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 0,
|
{ .name = "PMCCNTR", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 0,
|
||||||
.access = PL0_RW, .resetvalue = 0, .type = ARM_CP_IO,
|
.access = PL0_RW, .resetvalue = 0, .type = ARM_CP_IO,
|
||||||
.readfn = pmccntr_read, .writefn = pmccntr_write32,
|
.readfn = pmccntr_read, .writefn = pmccntr_write32,
|
||||||
|
@ -1219,10 +1252,12 @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
|
||||||
.fieldoffset = offsetof(CPUARMState, cp15.pmccfiltr_el0),
|
.fieldoffset = offsetof(CPUARMState, cp15.pmccfiltr_el0),
|
||||||
.resetvalue = 0, },
|
.resetvalue = 0, },
|
||||||
{ .name = "PMXEVTYPER", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 1,
|
{ .name = "PMXEVTYPER", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 1,
|
||||||
.access = PL0_RW,
|
.access = PL0_RW, .type = ARM_CP_NO_RAW, .accessfn = pmreg_access,
|
||||||
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmxevtyper),
|
.writefn = pmxevtyper_write, .readfn = pmxevtyper_read },
|
||||||
.accessfn = pmreg_access, .writefn = pmxevtyper_write,
|
{ .name = "PMXEVTYPER_EL0", .state = ARM_CP_STATE_AA64,
|
||||||
.raw_writefn = raw_write },
|
.opc0 = 3, .opc1 = 3, .crn = 9, .crm = 13, .opc2 = 1,
|
||||||
|
.access = PL0_RW, .type = ARM_CP_NO_RAW, .accessfn = pmreg_access,
|
||||||
|
.writefn = pmxevtyper_write, .readfn = pmxevtyper_read },
|
||||||
/* Unimplemented, RAZ/WI. */
|
/* Unimplemented, RAZ/WI. */
|
||||||
{ .name = "PMXEVCNTR", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 2,
|
{ .name = "PMXEVCNTR", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 2,
|
||||||
.access = PL0_RW, .type = ARM_CP_CONST, .resetvalue = 0,
|
.access = PL0_RW, .type = ARM_CP_CONST, .resetvalue = 0,
|
||||||
|
@ -1240,9 +1275,17 @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
|
||||||
.writefn = pmuserenr_write, .raw_writefn = raw_write },
|
.writefn = pmuserenr_write, .raw_writefn = raw_write },
|
||||||
{ .name = "PMINTENSET", .cp = 15, .crn = 9, .crm = 14, .opc1 = 0, .opc2 = 1,
|
{ .name = "PMINTENSET", .cp = 15, .crn = 9, .crm = 14, .opc1 = 0, .opc2 = 1,
|
||||||
.access = PL1_RW, .accessfn = access_tpm,
|
.access = PL1_RW, .accessfn = access_tpm,
|
||||||
.fieldoffset = offsetof(CPUARMState, cp15.c9_pminten),
|
.type = ARM_CP_ALIAS,
|
||||||
|
.fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pminten),
|
||||||
.resetvalue = 0,
|
.resetvalue = 0,
|
||||||
.writefn = pmintenset_write, .raw_writefn = raw_write },
|
.writefn = pmintenset_write, .raw_writefn = raw_write },
|
||||||
|
{ .name = "PMINTENSET_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
|
.opc0 = 3, .opc1 = 0, .crn = 9, .crm = 14, .opc2 = 1,
|
||||||
|
.access = PL1_RW, .accessfn = access_tpm,
|
||||||
|
.type = ARM_CP_IO,
|
||||||
|
.fieldoffset = offsetof(CPUARMState, cp15.c9_pminten),
|
||||||
|
.writefn = pmintenset_write, .raw_writefn = raw_write,
|
||||||
|
.resetvalue = 0x0 },
|
||||||
{ .name = "PMINTENCLR", .cp = 15, .crn = 9, .crm = 14, .opc1 = 0, .opc2 = 2,
|
{ .name = "PMINTENCLR", .cp = 15, .crn = 9, .crm = 14, .opc1 = 0, .opc2 = 2,
|
||||||
.access = PL1_RW, .accessfn = access_tpm, .type = ARM_CP_ALIAS,
|
.access = PL1_RW, .accessfn = access_tpm, .type = ARM_CP_ALIAS,
|
||||||
.fieldoffset = offsetof(CPUARMState, cp15.c9_pminten),
|
.fieldoffset = offsetof(CPUARMState, cp15.c9_pminten),
|
||||||
|
@ -4590,12 +4633,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
||||||
{ .name = "ID_AA64DFR0_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64DFR0_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 0,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 0,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
/* We mask out the PMUVer field, because we don't currently
|
.resetvalue = cpu->id_aa64dfr0 },
|
||||||
* implement the PMU. Not advertising it prevents the guest
|
|
||||||
* from trying to use it and getting UNDEFs on registers we
|
|
||||||
* don't implement.
|
|
||||||
*/
|
|
||||||
.resetvalue = cpu->id_aa64dfr0 & ~0xf00 },
|
|
||||||
{ .name = "ID_AA64DFR1_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64DFR1_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 1,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 1,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
|
Loading…
Reference in New Issue