mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'dgibson/tags/ppc-for-2.10-20170511' into staging
ppc patch queue for 2017-05-11 This pull request supersedes the one from yesterday (20170510), fixing an important style bug in one patch, and adding an extra couple of simple patches. Highlights of this set: * Some fixes for POWER9 * TCG support for POWER9 radix MMU * VGA rom for Mac machine types * Fixes for the XICS interrupt controller * MTTCG support for ppc targets As suggested by Paolo, I've tried to add the Docker tests to my standard pre-pull-request tests. I haven't wholly suceeded; this has been tested with some of the Docker images, but others I haven't managed due to problems that as best I can tell are not due to problems in this patch series. I'll continue working on this for future pull requests. Specifically, 'travis', 'fedora', and 'centos6' seem to work. 'min-glib' jammed while gtesting moxie, which seems very unlikely to be caused by this series. 'ubuntu', 'debian' and 'debian-bootstrap' hit build errors almost immediately that look like problems with the container configuration, and 'debian-*-cross' hit build errors later on which also look like missing dependencies from the container. # gpg: Signature made Thu 11 May 2017 05:13:46 AM BST # gpg: using RSA key 0x6C38CACA20D9B392 # gpg: Good signature from "David Gibson <david@gibson.dropbear.id.au>" # gpg: aka "David Gibson (kernel.org) <dwg@kernel.org>" # gpg: aka "David Gibson (Red Hat) <dgibson@redhat.com>" # gpg: aka "David Gibson (ozlabs.org) <dgibson@ozlabs.org>" # Primary key fingerprint: 75F4 6586 AE61 A66C C44E 87DC 6C38 CACA 20D9 B392 * dgibson/tags/ppc-for-2.10-20170511: (23 commits) target/ppc: Avoid printing wrong aliases in CPU help text pnv: Fix build failures on some host platforms target/ppc: Allow workarounds for POWER9 DD1 spapr: Don't accidentally advertise HTM support on POWER9 ppc: xics: fix compilation with CentOS 6 target/ppc: Enable RADIX mmu mode for pseries TCG guest target/ppc: Implement ISA V3.00 radix page fault handler target/ppc: Change tlbie invalid fields for POWER9 support target/ppc: Update tlbie to check privilege level based on GTSE target/ppc: Set UPRT and GTSE on all cpus in H_REGISTER_PROCESS_TABLE ppc: add qemu_vga.ndrv ROM to fw_cfg interface for NewWorld Macs ppc: add qemu_vga.ndrv ROM to fw_cfg interface for OldWorld Macs Add QemuMacDrivers qemu_vga.ndrv revision d4e7d7a built as submodule Add QemuMacDrivers as submodule ppc/xics: preserve P and Q bits for KVM IRQs ppc/xics: Fix stale irq->status bits after get target/ppc: do not reset reserve_addr in exec_enter tcg: enable MTTCG by default for PPC64 on x86 cpus: Fix CPU unplug for MTTCG target/ppc: Generate fence operations ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
@@ -34,3 +34,6 @@
|
||||
[submodule "roms/skiboot"]
|
||||
path = roms/skiboot
|
||||
url = git://git.qemu.org/skiboot.git
|
||||
[submodule "roms/QemuMacDrivers"]
|
||||
path = roms/QemuMacDrivers
|
||||
url = git://git.qemu.org/QemuMacDrivers.git
|
||||
|
||||
@@ -552,7 +552,8 @@ multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \
|
||||
s390-ccw.img \
|
||||
spapr-rtas.bin slof.bin skiboot.lid \
|
||||
palcode-clipper \
|
||||
u-boot.e500
|
||||
u-boot.e500 \
|
||||
qemu_vga.ndrv
|
||||
else
|
||||
BLOBS=
|
||||
endif
|
||||
|
||||
@@ -6101,12 +6101,14 @@ case "$target_name" in
|
||||
ppc64)
|
||||
TARGET_BASE_ARCH=ppc
|
||||
TARGET_ABI_DIR=ppc
|
||||
mttcg=yes
|
||||
gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
|
||||
;;
|
||||
ppc64le)
|
||||
TARGET_ARCH=ppc64
|
||||
TARGET_BASE_ARCH=ppc
|
||||
TARGET_ABI_DIR=ppc
|
||||
mttcg=yes
|
||||
gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
|
||||
;;
|
||||
ppc64abi32)
|
||||
|
||||
@@ -1483,6 +1483,12 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
|
||||
/* Ignore everything else? */
|
||||
break;
|
||||
}
|
||||
} else if (cpu->unplug) {
|
||||
qemu_tcg_destroy_vcpu(cpu);
|
||||
cpu->created = false;
|
||||
qemu_cond_signal(&qemu_cpu_cond);
|
||||
qemu_mutex_unlock_iothread();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
atomic_mb_set(&cpu->exit_request, 0);
|
||||
|
||||
@@ -930,7 +930,13 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
|
||||
tlb_addr = tlbe->addr_write;
|
||||
}
|
||||
|
||||
/* Notice an IO access, or a notdirty page. */
|
||||
/* Check notdirty */
|
||||
if (unlikely(tlb_addr & TLB_NOTDIRTY)) {
|
||||
tlb_set_dirty(ENV_GET_CPU(env), addr);
|
||||
tlb_addr = tlb_addr & ~TLB_NOTDIRTY;
|
||||
}
|
||||
|
||||
/* Notice an IO access */
|
||||
if (unlikely(tlb_addr & ~TARGET_PAGE_MASK)) {
|
||||
/* There's really nothing that can be done to
|
||||
support this apart from stop-the-world. */
|
||||
|
||||
@@ -213,6 +213,7 @@ static void ics_get_kvm_state(ICSState *ics)
|
||||
irq->priority = irq->saved_priority;
|
||||
}
|
||||
|
||||
irq->status = 0;
|
||||
if (state & KVM_XICS_PENDING) {
|
||||
if (state & KVM_XICS_LEVEL_SENSITIVE) {
|
||||
irq->status |= XICS_STATUS_ASSERTED;
|
||||
@@ -228,6 +229,12 @@ static void ics_get_kvm_state(ICSState *ics)
|
||||
| XICS_STATUS_REJECTED;
|
||||
}
|
||||
}
|
||||
if (state & KVM_XICS_PRESENTED) {
|
||||
irq->status |= XICS_STATUS_PRESENTED;
|
||||
}
|
||||
if (state & KVM_XICS_QUEUED) {
|
||||
irq->status |= XICS_STATUS_QUEUED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,6 +272,12 @@ static int ics_set_kvm_state(ICSState *ics, int version_id)
|
||||
state |= KVM_XICS_PENDING;
|
||||
}
|
||||
}
|
||||
if (irq->status & XICS_STATUS_PRESENTED) {
|
||||
state |= KVM_XICS_PRESENTED;
|
||||
}
|
||||
if (irq->status & XICS_STATUS_QUEUED) {
|
||||
state |= KVM_XICS_QUEUED;
|
||||
}
|
||||
|
||||
ret = ioctl(kernel_xics_fd, KVM_SET_DEVICE_ATTR, &attr);
|
||||
if (ret != 0) {
|
||||
|
||||
+17
-1
@@ -80,6 +80,8 @@
|
||||
#define CLOCKFREQ (266UL * 1000UL * 1000UL)
|
||||
#define BUSFREQ (100UL * 1000UL * 1000UL)
|
||||
|
||||
#define NDRV_VGA_FILENAME "qemu_vga.ndrv"
|
||||
|
||||
/* UniN device */
|
||||
static void unin_write(void *opaque, hwaddr addr, uint64_t value,
|
||||
unsigned size)
|
||||
@@ -160,7 +162,8 @@ static void ppc_core99_init(MachineState *machine)
|
||||
MACIOIDEState *macio_ide;
|
||||
BusState *adb_bus;
|
||||
MacIONVRAMState *nvr;
|
||||
int bios_size;
|
||||
int bios_size, ndrv_size;
|
||||
uint8_t *ndrv_file;
|
||||
MemoryRegion *pic_mem, *escc_mem;
|
||||
MemoryRegion *escc_bar = g_new(MemoryRegion, 1);
|
||||
int ppc_boot_device;
|
||||
@@ -494,6 +497,19 @@ static void ppc_core99_init(MachineState *machine)
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_PPC_BUSFREQ, BUSFREQ);
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_PPC_NVRAM_ADDR, nvram_addr);
|
||||
|
||||
/* MacOS NDRV VGA driver */
|
||||
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, NDRV_VGA_FILENAME);
|
||||
if (filename) {
|
||||
ndrv_size = get_image_size(filename);
|
||||
if (ndrv_size != -1) {
|
||||
ndrv_file = g_malloc(ndrv_size);
|
||||
ndrv_size = load_image(filename, ndrv_file);
|
||||
|
||||
fw_cfg_add_file(fw_cfg, "ndrv/qemu_vga.ndrv", ndrv_file, ndrv_size);
|
||||
}
|
||||
g_free(filename);
|
||||
}
|
||||
|
||||
qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
|
||||
}
|
||||
|
||||
|
||||
+17
-1
@@ -53,6 +53,8 @@
|
||||
#define CLOCKFREQ 266000000UL
|
||||
#define BUSFREQ 66000000UL
|
||||
|
||||
#define NDRV_VGA_FILENAME "qemu_vga.ndrv"
|
||||
|
||||
static void fw_cfg_boot_set(void *opaque, const char *boot_device,
|
||||
Error **errp)
|
||||
{
|
||||
@@ -99,7 +101,8 @@ static void ppc_heathrow_init(MachineState *machine)
|
||||
MACIOIDEState *macio_ide;
|
||||
DeviceState *dev;
|
||||
BusState *adb_bus;
|
||||
int bios_size;
|
||||
int bios_size, ndrv_size;
|
||||
uint8_t *ndrv_file;
|
||||
MemoryRegion *pic_mem;
|
||||
MemoryRegion *escc_mem, *escc_bar = g_new(MemoryRegion, 1);
|
||||
uint16_t ppc_boot_device;
|
||||
@@ -355,6 +358,19 @@ static void ppc_heathrow_init(MachineState *machine)
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_PPC_CLOCKFREQ, CLOCKFREQ);
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_PPC_BUSFREQ, BUSFREQ);
|
||||
|
||||
/* MacOS NDRV VGA driver */
|
||||
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, NDRV_VGA_FILENAME);
|
||||
if (filename) {
|
||||
ndrv_size = get_image_size(filename);
|
||||
if (ndrv_size != -1) {
|
||||
ndrv_file = g_malloc(ndrv_size);
|
||||
ndrv_size = load_image(filename, ndrv_file);
|
||||
|
||||
fw_cfg_add_file(fw_cfg, "ndrv/qemu_vga.ndrv", ndrv_file, ndrv_size);
|
||||
}
|
||||
g_free(filename);
|
||||
}
|
||||
|
||||
qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -511,7 +511,7 @@ static void ppc_powernv_reset(void)
|
||||
* This is the internal simulator but it could also be an external
|
||||
* BMC.
|
||||
*/
|
||||
obj = object_resolve_path_type("", TYPE_IPMI_BMC, NULL);
|
||||
obj = object_resolve_path_type("", "ipmi-bmc-sim", NULL);
|
||||
if (obj) {
|
||||
pnv->bmc = IPMI_BMC(obj);
|
||||
}
|
||||
|
||||
+12
-5
@@ -219,7 +219,7 @@ static void spapr_populate_pa_features(CPUPPCState *env, void *fdt, int offset,
|
||||
/* 16: Vector */
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, /* 12 - 17 */
|
||||
/* 18: Vec. Scalar, 20: Vec. XOR, 22: HTM */
|
||||
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 18 - 23 */
|
||||
0x80, 0x00, 0x80, 0x00, 0x00, 0x00, /* 18 - 23 */
|
||||
/* 24: Ext. Dec, 26: 64 bit ftrs, 28: PM ftrs */
|
||||
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 24 - 29 */
|
||||
/* 30: MMR, 32: LE atomic, 34: EBB + ext EBB */
|
||||
@@ -855,6 +855,8 @@ static void spapr_dt_rtas(sPAPRMachineState *spapr, void *fdt)
|
||||
* option vector 5: */
|
||||
static void spapr_dt_ov5_platform_support(void *fdt, int chosen)
|
||||
{
|
||||
PowerPCCPU *first_ppc_cpu = POWERPC_CPU(first_cpu);
|
||||
|
||||
char val[2 * 3] = {
|
||||
24, 0x00, /* Hash/Radix, filled in below. */
|
||||
25, 0x00, /* Hash options: Segment Tables == no, GTSE == no. */
|
||||
@@ -870,8 +872,13 @@ static void spapr_dt_ov5_platform_support(void *fdt, int chosen)
|
||||
val[1] = 0x00; /* Hash */
|
||||
}
|
||||
} else {
|
||||
/* TODO: TCG case, hash */
|
||||
val[1] = 0x00;
|
||||
if (first_ppc_cpu->env.mmu_model & POWERPC_MMU_V3) {
|
||||
/* V3 MMU supports both hash and radix (with dynamic switching) */
|
||||
val[1] = 0xC0;
|
||||
} else {
|
||||
/* Otherwise we can only do hash */
|
||||
val[1] = 0x00;
|
||||
}
|
||||
}
|
||||
_FDT(fdt_setprop(fdt, chosen, "ibm,arch-vec-5-platform-support",
|
||||
val, sizeof(val)));
|
||||
@@ -2101,8 +2108,8 @@ static void ppc_spapr_init(MachineState *machine)
|
||||
}
|
||||
|
||||
spapr_ovec_set(spapr->ov5, OV5_FORM1_AFFINITY);
|
||||
if (kvmppc_has_cap_mmu_radix()) {
|
||||
/* KVM always allows GTSE with radix... */
|
||||
if (!kvm_enabled() || kvmppc_has_cap_mmu_radix()) {
|
||||
/* KVM and TCG always allow GTSE with radix... */
|
||||
spapr_ovec_set(spapr->ov5, OV5_MMU_RADIX_GTSE);
|
||||
}
|
||||
/* ... but not with hash (currently). */
|
||||
|
||||
+7
-11
@@ -936,7 +936,7 @@ static target_ulong h_register_process_table(PowerPCCPU *cpu,
|
||||
target_ulong opcode,
|
||||
target_ulong *args)
|
||||
{
|
||||
CPUPPCState *env = &cpu->env;
|
||||
CPUState *cs;
|
||||
target_ulong flags = args[0];
|
||||
target_ulong proc_tbl = args[1];
|
||||
target_ulong page_size = args[2];
|
||||
@@ -992,16 +992,12 @@ static target_ulong h_register_process_table(PowerPCCPU *cpu,
|
||||
spapr_check_setup_free_hpt(spapr, spapr->patb_entry, cproc);
|
||||
|
||||
spapr->patb_entry = cproc; /* Save new process table */
|
||||
if ((flags & FLAG_RADIX) || (flags & FLAG_HASH_PROC_TBL)) {
|
||||
/* Use Process TBL */
|
||||
env->spr[SPR_LPCR] |= LPCR_UPRT;
|
||||
} else {
|
||||
env->spr[SPR_LPCR] &= ~LPCR_UPRT;
|
||||
}
|
||||
if (flags & FLAG_GTSE) { /* Partition Uses Guest Translation Shootdwn */
|
||||
env->spr[SPR_LPCR] |= LPCR_GTSE;
|
||||
} else {
|
||||
env->spr[SPR_LPCR] &= ~LPCR_GTSE;
|
||||
|
||||
/* Update the UPRT and GTSE bits in the LPCR for all cpus */
|
||||
CPU_FOREACH(cs) {
|
||||
set_spr(cs, SPR_LPCR, LPCR_UPRT | LPCR_GTSE,
|
||||
((flags & (FLAG_RADIX | FLAG_HASH_PROC_TBL)) ? LPCR_UPRT : 0) |
|
||||
((flags & FLAG_GTSE) ? LPCR_GTSE : 0));
|
||||
}
|
||||
|
||||
if (kvm_enabled()) {
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include "hw/boards.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/ipmi/ipmi.h"
|
||||
#include "hw/ppc/pnv_lpc.h"
|
||||
#include "hw/ppc/pnv_psi.h"
|
||||
#include "hw/ppc/pnv_occ.h"
|
||||
@@ -118,8 +119,6 @@ typedef struct PnvChipClass {
|
||||
#define POWERNV_MACHINE(obj) \
|
||||
OBJECT_CHECK(PnvMachineState, (obj), TYPE_POWERNV_MACHINE)
|
||||
|
||||
typedef struct IPMIBmc IPMIBmc;
|
||||
|
||||
typedef struct PnvMachineState {
|
||||
/*< private >*/
|
||||
MachineState parent_obj;
|
||||
|
||||
@@ -19,12 +19,12 @@
|
||||
#ifndef _PPC_PNV_LPC_H
|
||||
#define _PPC_PNV_LPC_H
|
||||
|
||||
#include "hw/ppc/pnv_psi.h"
|
||||
|
||||
#define TYPE_PNV_LPC "pnv-lpc"
|
||||
#define PNV_LPC(obj) \
|
||||
OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV_LPC)
|
||||
|
||||
typedef struct PnvPsi PnvPsi;
|
||||
|
||||
typedef struct PnvLpcController {
|
||||
DeviceState parent;
|
||||
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
#ifndef _PPC_PNV_OCC_H
|
||||
#define _PPC_PNV_OCC_H
|
||||
|
||||
#include "hw/ppc/pnv_psi.h"
|
||||
|
||||
#define TYPE_PNV_OCC "pnv-occ"
|
||||
#define PNV_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV_OCC)
|
||||
|
||||
typedef struct PnvPsi PnvPsi;
|
||||
|
||||
typedef struct PnvOCC {
|
||||
DeviceState xd;
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#define XICS_H
|
||||
|
||||
#include "hw/qdev.h"
|
||||
#include "target/ppc/cpu-qom.h"
|
||||
|
||||
#define XICS_IPI 0x2
|
||||
#define XICS_BUID 0x1
|
||||
@@ -46,7 +47,6 @@ typedef struct ICSStateClass ICSStateClass;
|
||||
typedef struct ICSState ICSState;
|
||||
typedef struct ICSIRQState ICSIRQState;
|
||||
typedef struct XICSFabric XICSFabric;
|
||||
typedef struct PowerPCCPU PowerPCCPU;
|
||||
|
||||
#define TYPE_ICP "icp"
|
||||
#define ICP(obj) OBJECT_CHECK(ICPState, (obj), TYPE_ICP)
|
||||
@@ -144,6 +144,8 @@ struct ICSIRQState {
|
||||
#define XICS_STATUS_SENT 0x2
|
||||
#define XICS_STATUS_REJECTED 0x4
|
||||
#define XICS_STATUS_MASKED_PENDING 0x8
|
||||
#define XICS_STATUS_PRESENTED 0x10
|
||||
#define XICS_STATUS_QUEUED 0x20
|
||||
uint8_t status;
|
||||
/* (flags & XICS_FLAGS_IRQ_MASK) == 0 means the interrupt is not allocated */
|
||||
#define XICS_FLAGS_IRQ_LSI 0x1
|
||||
|
||||
@@ -47,3 +47,6 @@
|
||||
(OpenPower Abstraction Layer) firmware for OpenPOWER systems. It can
|
||||
run an hypervisor OS or simply a host OS on the "baremetal"
|
||||
platform, also known as the PowerNV (Non-Virtualized) platform.
|
||||
|
||||
- QemuMacDrivers (https://github.com/ozbenh/QemuMacDrivers) is a project to
|
||||
provide virtualised drivers for PPC MacOS guests.
|
||||
|
||||
Binary file not shown.
Submodule
+1
Submodule roms/QemuMacDrivers added at d4e7d7ac66
@@ -4,6 +4,7 @@ obj-y += translate.o
|
||||
ifeq ($(CONFIG_SOFTMMU),y)
|
||||
obj-y += machine.o mmu_helper.o mmu-hash32.o monitor.o arch_dump.o
|
||||
obj-$(TARGET_PPC64) += mmu-hash64.o mmu-book3s-v3.o compat.o
|
||||
obj-$(TARGET_PPC64) += mmu-radix64.o
|
||||
endif
|
||||
obj-$(CONFIG_KVM) += kvm.o
|
||||
obj-$(call lnot,$(CONFIG_KVM)) += kvm-stub.o
|
||||
|
||||
@@ -561,6 +561,7 @@ enum {
|
||||
CPU_POWERPC_POWER8NVL_BASE = 0x004C0000,
|
||||
CPU_POWERPC_POWER8NVL_v10 = 0x004C0100,
|
||||
CPU_POWERPC_POWER9_BASE = 0x004E0000,
|
||||
CPU_POWERPC_POWER9_DD1 = 0x004E0100,
|
||||
CPU_POWERPC_970_v22 = 0x00390202,
|
||||
CPU_POWERPC_970FX_v10 = 0x00391100,
|
||||
CPU_POWERPC_970FX_v20 = 0x003C0200,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user