mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-31 14:02:05 -06:00
target-arm queue:
* Fix reset GPIO handling for spitz, tosa boards * virt: add 'pmu' property for configuring whether to expose the vPMU to the guest * char: cadence: correct reset value for baud rate registers * versatilepb: do not run if user asks for more than 256MB RAM * pxa2xx: Set value default values for CCCR and CKEN on PXA255 * arm: cubieboard: Add support for initrd * i.MX: Fix GPIO ISR register write -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJYE2c4AAoJEDwlJe0UNgzeyRkP/j2RLTDx2TBB7IDP0KNdzAaF SJNGVewR3wSI4hok/brSsLSOGA2E7mkvebwp6WQMduhukQcD0OnBBfFh7uckqDwS 2IEZq8V1mMgQkbuOEADYxOh+tKzQZZp8SfbMhfFg8Du2q//91Dzxr/DtpIFIKX1m mG3pKFgs3AD36GIMs1sp+gAtHLykDvQ4iQGpnuyCwBOrU03AA85fRK27IUrSCJ98 OQyT4v5yEQ+hnO/cTlIrDes/nrnMfFD4kB9X5pXqfKxGD1/8WN7UvJM0DqJFFdCz ZjAksBfEAlnH2XldsrUbA9/jwqtGJfNP4L1FbNlJSe9KGchnSC8GGvLo+qdAomeB bu1Zy0wtSZgcYAE/DWIiLCOZYm4wSrF/6nrFgNjWtk4XQ0VQNSM1NVyS9syrTia/ CDTF/KZfeh1LuDxPC0bqmi+nE9VXajKNJ/fhNJocKKuMJ314N65pe+pNuWQvzkOz bfTQ3nLap2aYvkyp1SRKTmbIcQP8YwEOMI5zSt2ek2hFyXoOoocDB7xPdW2Q5foI CLmehMcc0xWNxvNwkP/OHJxpG+ctGdiP7mTR8s0OpsqJh/KRTe7Jap7cHyqnMrvB 3ggrr3zD6Cxb3NXKx/5t6YFaVICP8kFRa1sc9COfU8AP/lMj7m8G7wDf777kqlrS LsdXlSiLQ6lN35AejZWb =IcQM -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20161028' into staging target-arm queue: * Fix reset GPIO handling for spitz, tosa boards * virt: add 'pmu' property for configuring whether to expose the vPMU to the guest * char: cadence: correct reset value for baud rate registers * versatilepb: do not run if user asks for more than 256MB RAM * pxa2xx: Set value default values for CCCR and CKEN on PXA255 * arm: cubieboard: Add support for initrd * i.MX: Fix GPIO ISR register write # gpg: Signature made Fri 28 Oct 2016 15:56:56 BST # 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-20161028: hw/arm/tosa: Fix reset handling hw/arm/spitz: Fix reset handling arm: virt: add PMU property to mach-virt machine type arm: Add an option to turn on/off vPMU support char: cadence: correct reset value for baud rate registers versatilepb: do not run if user asks for more than 256MB RAM hw/arm/pxa2xx: Set value default values for CCCR and CKEN on PXA255 arm: cubieboard: Add support for initrd i.MX: Fix GPIO ISR register write Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
4178c782f8
13 changed files with 80 additions and 10 deletions
|
@ -74,6 +74,7 @@ static void cubieboard_init(MachineState *machine)
|
||||||
cubieboard_binfo.ram_size = machine->ram_size;
|
cubieboard_binfo.ram_size = machine->ram_size;
|
||||||
cubieboard_binfo.kernel_filename = machine->kernel_filename;
|
cubieboard_binfo.kernel_filename = machine->kernel_filename;
|
||||||
cubieboard_binfo.kernel_cmdline = machine->kernel_cmdline;
|
cubieboard_binfo.kernel_cmdline = machine->kernel_cmdline;
|
||||||
|
cubieboard_binfo.initrd_filename = machine->initrd_filename;
|
||||||
arm_load_kernel(&s->a10->cpu, &cubieboard_binfo);
|
arm_load_kernel(&s->a10->cpu, &cubieboard_binfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2267,7 +2267,9 @@ PXA2xxState *pxa255_init(MemoryRegion *address_space, unsigned int sdram_size)
|
||||||
qdev_get_gpio_in(s->pic, PXA2XX_PIC_LCD));
|
qdev_get_gpio_in(s->pic, PXA2XX_PIC_LCD));
|
||||||
|
|
||||||
s->cm_base = 0x41300000;
|
s->cm_base = 0x41300000;
|
||||||
s->cm_regs[CCCR >> 2] = 0x02000210; /* 416.0 MHz */
|
s->cm_regs[CCCR >> 2] = 0x00000121; /* from datasheet */
|
||||||
|
s->cm_regs[CKEN >> 2] = 0x00017def; /* from datasheet */
|
||||||
|
|
||||||
s->clkcfg = 0x00000009; /* Turbo mode active */
|
s->clkcfg = 0x00000009; /* Turbo mode active */
|
||||||
memory_region_init_io(&s->cm_iomem, NULL, &pxa2xx_cm_ops, s, "pxa2xx-cm", 0x1000);
|
memory_region_init_io(&s->cm_iomem, NULL, &pxa2xx_cm_ops, s, "pxa2xx-cm", 0x1000);
|
||||||
memory_region_add_subregion(address_space, s->cm_base, &s->cm_iomem);
|
memory_region_add_subregion(address_space, s->cm_base, &s->cm_iomem);
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
#include "sysemu/sysemu.h"
|
||||||
|
|
||||||
#undef REG_FMT
|
#undef REG_FMT
|
||||||
#define REG_FMT "0x%02lx"
|
#define REG_FMT "0x%02lx"
|
||||||
|
@ -844,9 +845,18 @@ static void spitz_lcd_hsync_handler(void *opaque, int line, int level)
|
||||||
spitz_hsync ^= 1;
|
spitz_hsync ^= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void spitz_reset(void *opaque, int line, int level)
|
||||||
|
{
|
||||||
|
if (level) {
|
||||||
|
qemu_system_reset_request();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
|
static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
|
||||||
{
|
{
|
||||||
qemu_irq lcd_hsync;
|
qemu_irq lcd_hsync;
|
||||||
|
qemu_irq reset;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bad hack: We toggle the LCD hsync GPIO on every GPIO status
|
* Bad hack: We toggle the LCD hsync GPIO on every GPIO status
|
||||||
* read to satisfy broken guests that poll-wait for hsync.
|
* read to satisfy broken guests that poll-wait for hsync.
|
||||||
|
@ -867,7 +877,8 @@ static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
|
||||||
qemu_irq_raise(qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_BAT_COVER));
|
qemu_irq_raise(qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_BAT_COVER));
|
||||||
|
|
||||||
/* Handle reset */
|
/* Handle reset */
|
||||||
qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_ON_RESET, cpu->reset);
|
reset = qemu_allocate_irq(spitz_reset, cpu, 0);
|
||||||
|
qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_ON_RESET, reset);
|
||||||
|
|
||||||
/* PCMCIA signals: card's IRQ and Card-Detect */
|
/* PCMCIA signals: card's IRQ and Card-Detect */
|
||||||
if (slots >= 1)
|
if (slots >= 1)
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
#include "sysemu/sysemu.h"
|
||||||
|
|
||||||
#define TOSA_RAM 0x04000000
|
#define TOSA_RAM 0x04000000
|
||||||
#define TOSA_ROM 0x00800000
|
#define TOSA_ROM 0x00800000
|
||||||
|
@ -86,6 +87,12 @@ static void tosa_out_switch(void *opaque, int line, int level)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tosa_reset(void *opaque, int line, int level)
|
||||||
|
{
|
||||||
|
if (level) {
|
||||||
|
qemu_system_reset_request();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void tosa_gpio_setup(PXA2xxState *cpu,
|
static void tosa_gpio_setup(PXA2xxState *cpu,
|
||||||
DeviceState *scp0,
|
DeviceState *scp0,
|
||||||
|
@ -93,13 +100,16 @@ static void tosa_gpio_setup(PXA2xxState *cpu,
|
||||||
TC6393xbState *tmio)
|
TC6393xbState *tmio)
|
||||||
{
|
{
|
||||||
qemu_irq *outsignals = qemu_allocate_irqs(tosa_out_switch, cpu, 4);
|
qemu_irq *outsignals = qemu_allocate_irqs(tosa_out_switch, cpu, 4);
|
||||||
|
qemu_irq reset;
|
||||||
|
|
||||||
/* MMC/SD host */
|
/* MMC/SD host */
|
||||||
pxa2xx_mmci_handlers(cpu->mmc,
|
pxa2xx_mmci_handlers(cpu->mmc,
|
||||||
qdev_get_gpio_in(scp0, TOSA_GPIO_SD_WP),
|
qdev_get_gpio_in(scp0, TOSA_GPIO_SD_WP),
|
||||||
qemu_irq_invert(qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_nSD_DETECT)));
|
qemu_irq_invert(qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_nSD_DETECT)));
|
||||||
|
|
||||||
/* Handle reset */
|
/* Handle reset */
|
||||||
qdev_connect_gpio_out(cpu->gpio, TOSA_GPIO_ON_RESET, cpu->reset);
|
reset = qemu_allocate_irq(tosa_reset, cpu, 0);
|
||||||
|
qdev_connect_gpio_out(cpu->gpio, TOSA_GPIO_ON_RESET, reset);
|
||||||
|
|
||||||
/* PCMCIA signals: card's IRQ and Card-Detect */
|
/* PCMCIA signals: card's IRQ and Card-Detect */
|
||||||
pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[0],
|
pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[0],
|
||||||
|
|
|
@ -198,6 +198,15 @@ static void versatile_init(MachineState *machine, int board_id)
|
||||||
int done_smc = 0;
|
int done_smc = 0;
|
||||||
DriveInfo *dinfo;
|
DriveInfo *dinfo;
|
||||||
|
|
||||||
|
if (machine->ram_size > 0x10000000) {
|
||||||
|
/* Device starting at address 0x10000000,
|
||||||
|
* and memory cannot overlap with devices.
|
||||||
|
* Refuse to run rather than behaving very confusingly.
|
||||||
|
*/
|
||||||
|
error_report("versatilepb: memory size must not exceed 256MB");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (!machine->cpu_model) {
|
if (!machine->cpu_model) {
|
||||||
machine->cpu_model = "arm926";
|
machine->cpu_model = "arm926";
|
||||||
}
|
}
|
||||||
|
|
|
@ -594,7 +594,7 @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtGuestInfo *guest_info)
|
||||||
gicc->uid = i;
|
gicc->uid = i;
|
||||||
gicc->flags = cpu_to_le32(ACPI_GICC_ENABLED);
|
gicc->flags = cpu_to_le32(ACPI_GICC_ENABLED);
|
||||||
|
|
||||||
if (armcpu->has_pmu) {
|
if (arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
|
||||||
gicc->performance_interrupt = cpu_to_le32(PPI(VIRTUAL_PMU_IRQ));
|
gicc->performance_interrupt = cpu_to_le32(PPI(VIRTUAL_PMU_IRQ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,7 @@ typedef struct {
|
||||||
VirtBoardInfo *daughterboard;
|
VirtBoardInfo *daughterboard;
|
||||||
bool disallow_affinity_adjustment;
|
bool disallow_affinity_adjustment;
|
||||||
bool no_its;
|
bool no_its;
|
||||||
|
bool no_pmu;
|
||||||
} VirtMachineClass;
|
} VirtMachineClass;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -490,7 +491,7 @@ static void fdt_add_pmu_nodes(const VirtBoardInfo *vbi, int gictype)
|
||||||
|
|
||||||
CPU_FOREACH(cpu) {
|
CPU_FOREACH(cpu) {
|
||||||
armcpu = ARM_CPU(cpu);
|
armcpu = ARM_CPU(cpu);
|
||||||
if (!armcpu->has_pmu ||
|
if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU) ||
|
||||||
!kvm_arm_pmu_create(cpu, PPI(VIRTUAL_PMU_IRQ))) {
|
!kvm_arm_pmu_create(cpu, PPI(VIRTUAL_PMU_IRQ))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1353,6 +1354,10 @@ static void machvirt_init(MachineState *machine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (vmc->no_pmu && object_property_find(cpuobj, "pmu", NULL)) {
|
||||||
|
object_property_set_bool(cpuobj, false, "pmu", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (object_property_find(cpuobj, "reset-cbar", NULL)) {
|
if (object_property_find(cpuobj, "reset-cbar", NULL)) {
|
||||||
object_property_set_int(cpuobj, vbi->memmap[VIRT_CPUPERIPHS].base,
|
object_property_set_int(cpuobj, vbi->memmap[VIRT_CPUPERIPHS].base,
|
||||||
"reset-cbar", &error_abort);
|
"reset-cbar", &error_abort);
|
||||||
|
@ -1592,5 +1597,7 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
||||||
virt_machine_2_7_options(mc);
|
virt_machine_2_7_options(mc);
|
||||||
SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_6);
|
SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_6);
|
||||||
vmc->disallow_affinity_adjustment = true;
|
vmc->disallow_affinity_adjustment = true;
|
||||||
|
/* Disable PMU for 2.6 as PMU support was first introduced in 2.7 */
|
||||||
|
vmc->no_pmu = true;
|
||||||
}
|
}
|
||||||
DEFINE_VIRT_MACHINE(2, 6)
|
DEFINE_VIRT_MACHINE(2, 6)
|
||||||
|
|
|
@ -450,7 +450,8 @@ static void cadence_uart_reset(DeviceState *dev)
|
||||||
s->r[R_IMR] = 0;
|
s->r[R_IMR] = 0;
|
||||||
s->r[R_CISR] = 0;
|
s->r[R_CISR] = 0;
|
||||||
s->r[R_RTRIG] = 0x00000020;
|
s->r[R_RTRIG] = 0x00000020;
|
||||||
s->r[R_BRGR] = 0x0000000F;
|
s->r[R_BRGR] = 0x0000028B;
|
||||||
|
s->r[R_BDIV] = 0x0000000F;
|
||||||
s->r[R_TTRIG] = 0x00000020;
|
s->r[R_TTRIG] = 0x00000020;
|
||||||
|
|
||||||
uart_rx_reset(s);
|
uart_rx_reset(s);
|
||||||
|
|
|
@ -237,7 +237,7 @@ static void imx_gpio_write(void *opaque, hwaddr offset, uint64_t value,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ISR_ADDR:
|
case ISR_ADDR:
|
||||||
s->isr |= ~value;
|
s->isr &= ~value;
|
||||||
imx_gpio_set_all_int_lines(s);
|
imx_gpio_set_all_int_lines(s);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/error-report.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
|
@ -496,6 +497,10 @@ static Property arm_cpu_rvbar_property =
|
||||||
static Property arm_cpu_has_el3_property =
|
static Property arm_cpu_has_el3_property =
|
||||||
DEFINE_PROP_BOOL("has_el3", ARMCPU, has_el3, true);
|
DEFINE_PROP_BOOL("has_el3", ARMCPU, has_el3, true);
|
||||||
|
|
||||||
|
/* use property name "pmu" to match other archs and virt tools */
|
||||||
|
static Property arm_cpu_has_pmu_property =
|
||||||
|
DEFINE_PROP_BOOL("pmu", ARMCPU, has_pmu, true);
|
||||||
|
|
||||||
static Property arm_cpu_has_mpu_property =
|
static Property arm_cpu_has_mpu_property =
|
||||||
DEFINE_PROP_BOOL("has-mpu", ARMCPU, has_mpu, true);
|
DEFINE_PROP_BOOL("has-mpu", ARMCPU, has_mpu, true);
|
||||||
|
|
||||||
|
@ -539,6 +544,11 @@ static void arm_cpu_post_init(Object *obj)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arm_feature(&cpu->env, ARM_FEATURE_PMU)) {
|
||||||
|
qdev_property_add_static(DEVICE(obj), &arm_cpu_has_pmu_property,
|
||||||
|
&error_abort);
|
||||||
|
}
|
||||||
|
|
||||||
if (arm_feature(&cpu->env, ARM_FEATURE_MPU)) {
|
if (arm_feature(&cpu->env, ARM_FEATURE_MPU)) {
|
||||||
qdev_property_add_static(DEVICE(obj), &arm_cpu_has_mpu_property,
|
qdev_property_add_static(DEVICE(obj), &arm_cpu_has_mpu_property,
|
||||||
&error_abort);
|
&error_abort);
|
||||||
|
@ -677,6 +687,11 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||||
cpu->id_aa64pfr0 &= ~0xf000;
|
cpu->id_aa64pfr0 &= ~0xf000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!cpu->has_pmu || !kvm_enabled()) {
|
||||||
|
cpu->has_pmu = false;
|
||||||
|
unset_feature(env, ARM_FEATURE_PMU);
|
||||||
|
}
|
||||||
|
|
||||||
if (!arm_feature(env, ARM_FEATURE_EL2)) {
|
if (!arm_feature(env, ARM_FEATURE_EL2)) {
|
||||||
/* Disable the hypervisor feature bits in the processor feature
|
/* Disable the hypervisor feature bits in the processor feature
|
||||||
* registers if we don't have EL2. These are id_pfr1[15:12] and
|
* registers if we don't have EL2. These are id_pfr1[15:12] and
|
||||||
|
|
|
@ -1124,6 +1124,7 @@ enum arm_features {
|
||||||
ARM_FEATURE_V8_SHA256, /* implements SHA256 part of v8 Crypto Extensions */
|
ARM_FEATURE_V8_SHA256, /* implements SHA256 part of v8 Crypto Extensions */
|
||||||
ARM_FEATURE_V8_PMULL, /* implements PMULL part of v8 Crypto Extensions */
|
ARM_FEATURE_V8_PMULL, /* implements PMULL part of v8 Crypto Extensions */
|
||||||
ARM_FEATURE_THUMB_DSP, /* DSP insns supported in the Thumb encodings */
|
ARM_FEATURE_THUMB_DSP, /* DSP insns supported in the Thumb encodings */
|
||||||
|
ARM_FEATURE_PMU, /* has PMU support */
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline int arm_feature(CPUARMState *env, int feature)
|
static inline int arm_feature(CPUARMState *env, int feature)
|
||||||
|
|
|
@ -111,6 +111,7 @@ static void aarch64_a57_initfn(Object *obj)
|
||||||
set_feature(&cpu->env, ARM_FEATURE_V8_PMULL);
|
set_feature(&cpu->env, ARM_FEATURE_V8_PMULL);
|
||||||
set_feature(&cpu->env, ARM_FEATURE_CRC);
|
set_feature(&cpu->env, ARM_FEATURE_CRC);
|
||||||
set_feature(&cpu->env, ARM_FEATURE_EL3);
|
set_feature(&cpu->env, ARM_FEATURE_EL3);
|
||||||
|
set_feature(&cpu->env, ARM_FEATURE_PMU);
|
||||||
cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A57;
|
cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A57;
|
||||||
cpu->midr = 0x411fd070;
|
cpu->midr = 0x411fd070;
|
||||||
cpu->revidr = 0x00000000;
|
cpu->revidr = 0x00000000;
|
||||||
|
@ -166,6 +167,7 @@ static void aarch64_a53_initfn(Object *obj)
|
||||||
set_feature(&cpu->env, ARM_FEATURE_V8_PMULL);
|
set_feature(&cpu->env, ARM_FEATURE_V8_PMULL);
|
||||||
set_feature(&cpu->env, ARM_FEATURE_CRC);
|
set_feature(&cpu->env, ARM_FEATURE_CRC);
|
||||||
set_feature(&cpu->env, ARM_FEATURE_EL3);
|
set_feature(&cpu->env, ARM_FEATURE_EL3);
|
||||||
|
set_feature(&cpu->env, ARM_FEATURE_PMU);
|
||||||
cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A53;
|
cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A53;
|
||||||
cpu->midr = 0x410fd034;
|
cpu->midr = 0x410fd034;
|
||||||
cpu->revidr = 0x00000000;
|
cpu->revidr = 0x00000000;
|
||||||
|
|
|
@ -428,6 +428,11 @@ static inline void set_feature(uint64_t *features, int feature)
|
||||||
*features |= 1ULL << feature;
|
*features |= 1ULL << feature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void unset_feature(uint64_t *features, int feature)
|
||||||
|
{
|
||||||
|
*features &= ~(1ULL << feature);
|
||||||
|
}
|
||||||
|
|
||||||
bool kvm_arm_get_host_cpu_features(ARMHostCPUClass *ahcc)
|
bool kvm_arm_get_host_cpu_features(ARMHostCPUClass *ahcc)
|
||||||
{
|
{
|
||||||
/* Identify the feature bits corresponding to the host CPU, and
|
/* Identify the feature bits corresponding to the host CPU, and
|
||||||
|
@ -469,6 +474,7 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUClass *ahcc)
|
||||||
set_feature(&features, ARM_FEATURE_VFP4);
|
set_feature(&features, ARM_FEATURE_VFP4);
|
||||||
set_feature(&features, ARM_FEATURE_NEON);
|
set_feature(&features, ARM_FEATURE_NEON);
|
||||||
set_feature(&features, ARM_FEATURE_AARCH64);
|
set_feature(&features, ARM_FEATURE_AARCH64);
|
||||||
|
set_feature(&features, ARM_FEATURE_PMU);
|
||||||
|
|
||||||
ahcc->features = features;
|
ahcc->features = features;
|
||||||
|
|
||||||
|
@ -482,6 +488,7 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||||
int ret;
|
int ret;
|
||||||
uint64_t mpidr;
|
uint64_t mpidr;
|
||||||
ARMCPU *cpu = ARM_CPU(cs);
|
ARMCPU *cpu = ARM_CPU(cs);
|
||||||
|
CPUARMState *env = &cpu->env;
|
||||||
|
|
||||||
if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE ||
|
if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE ||
|
||||||
!object_dynamic_cast(OBJECT(cpu), TYPE_AARCH64_CPU)) {
|
!object_dynamic_cast(OBJECT(cpu), TYPE_AARCH64_CPU)) {
|
||||||
|
@ -501,10 +508,14 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||||
if (!arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
|
if (!arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
|
||||||
cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_EL1_32BIT;
|
cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_EL1_32BIT;
|
||||||
}
|
}
|
||||||
if (kvm_irqchip_in_kernel() &&
|
if (!kvm_irqchip_in_kernel() ||
|
||||||
kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PMU_V3)) {
|
!kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PMU_V3)) {
|
||||||
cpu->has_pmu = true;
|
cpu->has_pmu = false;
|
||||||
|
}
|
||||||
|
if (cpu->has_pmu) {
|
||||||
cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_PMU_V3;
|
cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_PMU_V3;
|
||||||
|
} else {
|
||||||
|
unset_feature(&env->features, ARM_FEATURE_PMU);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do KVM_ARM_VCPU_INIT ioctl */
|
/* Do KVM_ARM_VCPU_INIT ioctl */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue