mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 16:53:55 -06:00
* Linux header upgrade (Peter)
* firmware.json definition (Laszlo) * IPMI migration fix (Corey) * QOM improvements (Alexey, Philippe, me) * Memory API cleanups (Jay, me, Tristan, Peter) * WHPX fixes and improvements (Lucian) * Chardev fixes (Marc-André) * IOMMU documentation improvements (Peter) * Coverity fixes (Peter, Philippe) * Include cleanup (Philippe) * -clock deprecation (Thomas) * Disable -sandbox unless CONFIG_SECCOMP (Yi Min Zhao) * Configurability improvements (me) -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAlsRd2UUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroPG8Qf+M85E8xAQ/bhs90tAymuXkUUsTIFF uI76K8eM0K3b2B+vGckxh1gyN5O3GQaMEDL7vITfqbX+EOH5U2lv8V9JRzf2YvbG Zahjd4pOCYzR0b9JENA1r5U/J8RntNrBNXlKmGTaXOaw9VCXlZyvgVd9CE3z/e2M 0jSXMBdF4LB3UzECI24Va8ejJxdSiJcqXA2j3J+pJFxI698i+Z5eBBKnRdo5TVe5 jl0TYEsbS6CLwhmbLXmt3Qhq+ocZn7YH9X3HjkHEdqDUeYWyT9jwUpa7OHFrIEKC ikWm9er4YDzG/vOC0dqwKbShFzuTpTJuMz5Mj4v8JjM/iQQFrp4afjcW2g== =RS/B -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging * Linux header upgrade (Peter) * firmware.json definition (Laszlo) * IPMI migration fix (Corey) * QOM improvements (Alexey, Philippe, me) * Memory API cleanups (Jay, me, Tristan, Peter) * WHPX fixes and improvements (Lucian) * Chardev fixes (Marc-André) * IOMMU documentation improvements (Peter) * Coverity fixes (Peter, Philippe) * Include cleanup (Philippe) * -clock deprecation (Thomas) * Disable -sandbox unless CONFIG_SECCOMP (Yi Min Zhao) * Configurability improvements (me) # gpg: Signature made Fri 01 Jun 2018 17:42:13 BST # gpg: using RSA key BFFBD25F78C7AE83 # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * remotes/bonzini/tags/for-upstream: (56 commits) hw: make virtio devices configurable via default-configs/ hw: allow compiling out SCSI memory: Make operations using MemoryRegionIoeventfd struct pass by pointer. char: Remove unwanted crlf conversion qdev: Remove DeviceClass::init() and ::exit() qdev: Simplify the SysBusDeviceClass::init path hw/i2c: Use DeviceClass::realize instead of I2CSlaveClass::init hw/i2c/smbus: Use DeviceClass::realize instead of SMBusDeviceClass::init target/i386/kvm.c: Remove compatibility shim for KVM_HINTS_REALTIME Update Linux headers to 4.17-rc6 target/i386/kvm.c: Handle renaming of KVM_HINTS_DEDICATED scripts/update-linux-headers: Handle kernel license no longer being one file scripts/update-linux-headers: Handle __aligned_u64 virtio-gpu-3d: Define VIRTIO_GPU_CAPSET_VIRGL2 elsewhere gdbstub: Prevent fd leakage docs/interop: add "firmware.json" ipmi: Use proper struct reference for KCS vmstate vmstate: Add a VSTRUCT type tcg: remove softfloat from --disable-tcg builds qemu-options: Mark the non-functional -clock option as deprecated ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
afd76ffba9
215 changed files with 1713 additions and 901 deletions
|
@ -15,7 +15,6 @@
|
|||
#include "arm-powerctl.h"
|
||||
#include "qemu/log.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
#ifndef DEBUG_ARM_POWERCTL
|
||||
#define DEBUG_ARM_POWERCTL 0
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#ifndef ARM_LDST_H
|
||||
#define ARM_LDST_H
|
||||
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/cpu_ldst.h"
|
||||
#include "qemu/bswap.h"
|
||||
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include "qemu/osdep.h"
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "crypto/aes.h"
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include "qemu/osdep.h"
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/helper-proto.h"
|
||||
|
||||
/* iwMMXt macros extracted from GNU gdb. */
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
#include "qemu/osdep.h"
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "fpu/softfloat.h"
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include "sysemu/sysemu.h"
|
||||
#include "internals.h"
|
||||
#include "arm-powerctl.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
bool arm_is_psci_call(ARMCPU *cpu, int excp_type)
|
||||
{
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "tcg/tcg-gvec-desc.h"
|
||||
#include "fpu/softfloat.h"
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include "cpu.h"
|
||||
#include "qemu-common.h"
|
||||
#include "mmu.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
|
||||
static void cris_cpu_set_pc(CPUState *cs, vaddr value)
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include "qemu/osdep.h"
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "fpu/softfloat.h"
|
||||
#include "exec/helper-proto.h"
|
||||
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/log.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "qom/cpu.h"
|
||||
|
||||
|
|
|
@ -26,8 +26,6 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/ioport.h"
|
||||
|
||||
#include "qemu-common.h"
|
||||
#include "hax-i386.h"
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "qemu/error-report.h"
|
||||
|
||||
#include "target/i386/hax-i386.h"
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "hax-i386.h"
|
||||
|
||||
/*
|
||||
|
|
|
@ -65,8 +65,6 @@
|
|||
#include <Hypervisor/hv_vmx.h>
|
||||
|
||||
#include "exec/address-spaces.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/ioport.h"
|
||||
#include "hw/i386/apic_internal.h"
|
||||
#include "hw/boards.h"
|
||||
#include "qemu/main-loop.h"
|
||||
|
|
|
@ -26,9 +26,6 @@
|
|||
#include <Hypervisor/hv.h>
|
||||
#include <Hypervisor/hv_vmx.h>
|
||||
|
||||
#include "exec/address-spaces.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/ioport.h"
|
||||
#include "hw/i386/apic_internal.h"
|
||||
#include "hw/boards.h"
|
||||
#include "qemu/main-loop.h"
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#include "hw/i386/intel_iommu.h"
|
||||
#include "hw/i386/x86-iommu.h"
|
||||
|
||||
#include "exec/ioport.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/msi.h"
|
||||
#include "hw/pci/msix.h"
|
||||
|
@ -387,7 +386,7 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
|
|||
ret &= ~(1U << KVM_FEATURE_PV_UNHALT);
|
||||
}
|
||||
} else if (function == KVM_CPUID_FEATURES && reg == R_EDX) {
|
||||
ret |= 1U << KVM_HINTS_DEDICATED;
|
||||
ret |= 1U << KVM_HINTS_REALTIME;
|
||||
found = 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/ioport.h"
|
||||
#include "qemu-common.h"
|
||||
#include "strings.h"
|
||||
|
@ -25,6 +24,7 @@
|
|||
#include "qemu/queue.h"
|
||||
#include "qapi/error.h"
|
||||
#include "migration/blocker.h"
|
||||
#include "whp-dispatch.h"
|
||||
|
||||
#include <WinHvPlatform.h>
|
||||
#include <WinHvEmulation.h>
|
||||
|
@ -160,8 +160,11 @@ struct whpx_vcpu {
|
|||
};
|
||||
|
||||
static bool whpx_allowed;
|
||||
static bool whp_dispatch_initialized;
|
||||
static HMODULE hWinHvPlatform, hWinHvEmulation;
|
||||
|
||||
struct whpx_state whpx_global;
|
||||
struct WHPDispatch whp_dispatch;
|
||||
|
||||
|
||||
/*
|
||||
|
@ -220,24 +223,31 @@ static void whpx_set_registers(CPUState *cpu)
|
|||
struct whpx_vcpu *vcpu = get_whpx_vcpu(cpu);
|
||||
struct CPUX86State *env = (CPUArchState *)(cpu->env_ptr);
|
||||
X86CPU *x86_cpu = X86_CPU(cpu);
|
||||
struct whpx_register_set vcxt = {0};
|
||||
struct whpx_register_set vcxt;
|
||||
HRESULT hr;
|
||||
int idx = 0;
|
||||
int idx;
|
||||
int idx_next;
|
||||
int i;
|
||||
int v86, r86;
|
||||
|
||||
assert(cpu_is_stopped(cpu) || qemu_cpu_is_self(cpu));
|
||||
|
||||
memset(&vcxt, 0, sizeof(struct whpx_register_set));
|
||||
|
||||
v86 = (env->eflags & VM_MASK);
|
||||
r86 = !(env->cr[0] & CR0_PE_MASK);
|
||||
|
||||
vcpu->tpr = cpu_get_apic_tpr(x86_cpu->apic_state);
|
||||
vcpu->apic_base = cpu_get_apic_base(x86_cpu->apic_state);
|
||||
|
||||
idx = 0;
|
||||
|
||||
/* Indexes for first 16 registers match between HV and QEMU definitions */
|
||||
for (idx = 0; idx < CPU_NB_REGS64; idx += 1) {
|
||||
vcxt.values[idx].Reg64 = env->regs[idx];
|
||||
idx_next = 16;
|
||||
for (idx = 0; idx < CPU_NB_REGS; idx += 1) {
|
||||
vcxt.values[idx].Reg64 = (uint64_t)env->regs[idx];
|
||||
}
|
||||
idx = idx_next;
|
||||
|
||||
/* Same goes for RIP and RFLAGS */
|
||||
assert(whpx_register_names[idx] == WHvX64RegisterRip);
|
||||
|
@ -284,10 +294,12 @@ static void whpx_set_registers(CPUState *cpu)
|
|||
|
||||
/* 16 XMM registers */
|
||||
assert(whpx_register_names[idx] == WHvX64RegisterXmm0);
|
||||
for (i = 0; i < 16; i += 1, idx += 1) {
|
||||
idx_next = idx + 16;
|
||||
for (i = 0; i < sizeof(env->xmm_regs) / sizeof(ZMMReg); i += 1, idx += 1) {
|
||||
vcxt.values[idx].Reg128.Low64 = env->xmm_regs[i].ZMM_Q(0);
|
||||
vcxt.values[idx].Reg128.High64 = env->xmm_regs[i].ZMM_Q(1);
|
||||
}
|
||||
idx = idx_next;
|
||||
|
||||
/* 8 FP registers */
|
||||
assert(whpx_register_names[idx] == WHvX64RegisterFpMmx0);
|
||||
|
@ -355,10 +367,11 @@ static void whpx_set_registers(CPUState *cpu)
|
|||
|
||||
assert(idx == RTL_NUMBER_OF(whpx_register_names));
|
||||
|
||||
hr = WHvSetVirtualProcessorRegisters(whpx->partition, cpu->cpu_index,
|
||||
whpx_register_names,
|
||||
RTL_NUMBER_OF(whpx_register_names),
|
||||
&vcxt.values[0]);
|
||||
hr = whp_dispatch.WHvSetVirtualProcessorRegisters(
|
||||
whpx->partition, cpu->cpu_index,
|
||||
whpx_register_names,
|
||||
RTL_NUMBER_OF(whpx_register_names),
|
||||
&vcxt.values[0]);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to set virtual processor context, hr=%08lx",
|
||||
|
@ -377,24 +390,30 @@ static void whpx_get_registers(CPUState *cpu)
|
|||
struct whpx_register_set vcxt;
|
||||
uint64_t tpr, apic_base;
|
||||
HRESULT hr;
|
||||
int idx = 0;
|
||||
int idx;
|
||||
int idx_next;
|
||||
int i;
|
||||
|
||||
assert(cpu_is_stopped(cpu) || qemu_cpu_is_self(cpu));
|
||||
|
||||
hr = WHvGetVirtualProcessorRegisters(whpx->partition, cpu->cpu_index,
|
||||
whpx_register_names,
|
||||
RTL_NUMBER_OF(whpx_register_names),
|
||||
&vcxt.values[0]);
|
||||
hr = whp_dispatch.WHvGetVirtualProcessorRegisters(
|
||||
whpx->partition, cpu->cpu_index,
|
||||
whpx_register_names,
|
||||
RTL_NUMBER_OF(whpx_register_names),
|
||||
&vcxt.values[0]);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to get virtual processor context, hr=%08lx",
|
||||
hr);
|
||||
}
|
||||
|
||||
idx = 0;
|
||||
|
||||
/* Indexes for first 16 registers match between HV and QEMU definitions */
|
||||
for (idx = 0; idx < CPU_NB_REGS64; idx += 1) {
|
||||
idx_next = 16;
|
||||
for (idx = 0; idx < CPU_NB_REGS; idx += 1) {
|
||||
env->regs[idx] = vcxt.values[idx].Reg64;
|
||||
}
|
||||
idx = idx_next;
|
||||
|
||||
/* Same goes for RIP and RFLAGS */
|
||||
assert(whpx_register_names[idx] == WHvX64RegisterRip);
|
||||
|
@ -441,10 +460,12 @@ static void whpx_get_registers(CPUState *cpu)
|
|||
|
||||
/* 16 XMM registers */
|
||||
assert(whpx_register_names[idx] == WHvX64RegisterXmm0);
|
||||
for (i = 0; i < 16; i += 1, idx += 1) {
|
||||
idx_next = idx + 16;
|
||||
for (i = 0; i < sizeof(env->xmm_regs) / sizeof(ZMMReg); i += 1, idx += 1) {
|
||||
env->xmm_regs[i].ZMM_Q(0) = vcxt.values[idx].Reg128.Low64;
|
||||
env->xmm_regs[i].ZMM_Q(1) = vcxt.values[idx].Reg128.High64;
|
||||
}
|
||||
idx = idx_next;
|
||||
|
||||
/* 8 FP registers */
|
||||
assert(whpx_register_names[idx] == WHvX64RegisterFpMmx0);
|
||||
|
@ -545,9 +566,10 @@ static HRESULT CALLBACK whpx_emu_getreg_callback(
|
|||
struct whpx_state *whpx = &whpx_global;
|
||||
CPUState *cpu = (CPUState *)ctx;
|
||||
|
||||
hr = WHvGetVirtualProcessorRegisters(whpx->partition, cpu->cpu_index,
|
||||
RegisterNames, RegisterCount,
|
||||
RegisterValues);
|
||||
hr = whp_dispatch.WHvGetVirtualProcessorRegisters(
|
||||
whpx->partition, cpu->cpu_index,
|
||||
RegisterNames, RegisterCount,
|
||||
RegisterValues);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to get virtual processor registers,"
|
||||
" hr=%08lx", hr);
|
||||
|
@ -566,9 +588,10 @@ static HRESULT CALLBACK whpx_emu_setreg_callback(
|
|||
struct whpx_state *whpx = &whpx_global;
|
||||
CPUState *cpu = (CPUState *)ctx;
|
||||
|
||||
hr = WHvSetVirtualProcessorRegisters(whpx->partition, cpu->cpu_index,
|
||||
RegisterNames, RegisterCount,
|
||||
RegisterValues);
|
||||
hr = whp_dispatch.WHvSetVirtualProcessorRegisters(
|
||||
whpx->partition, cpu->cpu_index,
|
||||
RegisterNames, RegisterCount,
|
||||
RegisterValues);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to set virtual processor registers,"
|
||||
" hr=%08lx", hr);
|
||||
|
@ -595,8 +618,8 @@ static HRESULT CALLBACK whpx_emu_translate_callback(
|
|||
CPUState *cpu = (CPUState *)ctx;
|
||||
WHV_TRANSLATE_GVA_RESULT res;
|
||||
|
||||
hr = WHvTranslateGva(whpx->partition, cpu->cpu_index,
|
||||
Gva, TranslateFlags, &res, Gpa);
|
||||
hr = whp_dispatch.WHvTranslateGva(whpx->partition, cpu->cpu_index,
|
||||
Gva, TranslateFlags, &res, Gpa);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to translate GVA, hr=%08lx", hr);
|
||||
} else {
|
||||
|
@ -621,16 +644,18 @@ static int whpx_handle_mmio(CPUState *cpu, WHV_MEMORY_ACCESS_CONTEXT *ctx)
|
|||
struct whpx_vcpu *vcpu = get_whpx_vcpu(cpu);
|
||||
WHV_EMULATOR_STATUS emu_status;
|
||||
|
||||
hr = WHvEmulatorTryMmioEmulation(vcpu->emulator, cpu,
|
||||
&vcpu->exit_ctx.VpContext, ctx,
|
||||
&emu_status);
|
||||
hr = whp_dispatch.WHvEmulatorTryMmioEmulation(
|
||||
vcpu->emulator, cpu,
|
||||
&vcpu->exit_ctx.VpContext, ctx,
|
||||
&emu_status);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to parse MMIO access, hr=%08lx", hr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!emu_status.EmulationSuccessful) {
|
||||
error_report("WHPX: Failed to emulate MMIO access");
|
||||
error_report("WHPX: Failed to emulate MMIO access with"
|
||||
" EmulatorReturnStatus: %u", emu_status.AsUINT32);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -644,16 +669,18 @@ static int whpx_handle_portio(CPUState *cpu,
|
|||
struct whpx_vcpu *vcpu = get_whpx_vcpu(cpu);
|
||||
WHV_EMULATOR_STATUS emu_status;
|
||||
|
||||
hr = WHvEmulatorTryIoEmulation(vcpu->emulator, cpu,
|
||||
&vcpu->exit_ctx.VpContext, ctx,
|
||||
&emu_status);
|
||||
hr = whp_dispatch.WHvEmulatorTryIoEmulation(
|
||||
vcpu->emulator, cpu,
|
||||
&vcpu->exit_ctx.VpContext, ctx,
|
||||
&emu_status);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to parse PortIO access, hr=%08lx", hr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!emu_status.EmulationSuccessful) {
|
||||
error_report("WHPX: Failed to emulate PortMMIO access");
|
||||
error_report("WHPX: Failed to emulate PortIO access with"
|
||||
" EmulatorReturnStatus: %u", emu_status.AsUINT32);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -687,11 +714,14 @@ static void whpx_vcpu_pre_run(CPUState *cpu)
|
|||
X86CPU *x86_cpu = X86_CPU(cpu);
|
||||
int irq;
|
||||
uint8_t tpr;
|
||||
WHV_X64_PENDING_INTERRUPTION_REGISTER new_int = {0};
|
||||
WHV_X64_PENDING_INTERRUPTION_REGISTER new_int;
|
||||
UINT32 reg_count = 0;
|
||||
WHV_REGISTER_VALUE reg_values[3] = {0};
|
||||
WHV_REGISTER_VALUE reg_values[3];
|
||||
WHV_REGISTER_NAME reg_names[3];
|
||||
|
||||
memset(&new_int, 0, sizeof(new_int));
|
||||
memset(reg_values, 0, sizeof(reg_values));
|
||||
|
||||
qemu_mutex_lock_iothread();
|
||||
|
||||
/* Inject NMI */
|
||||
|
@ -768,8 +798,9 @@ static void whpx_vcpu_pre_run(CPUState *cpu)
|
|||
qemu_mutex_unlock_iothread();
|
||||
|
||||
if (reg_count) {
|
||||
hr = WHvSetVirtualProcessorRegisters(whpx->partition, cpu->cpu_index,
|
||||
reg_names, reg_count, reg_values);
|
||||
hr = whp_dispatch.WHvSetVirtualProcessorRegisters(
|
||||
whpx->partition, cpu->cpu_index,
|
||||
reg_names, reg_count, reg_values);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to set interrupt state registers,"
|
||||
" hr=%08lx", hr);
|
||||
|
@ -877,8 +908,9 @@ static int whpx_vcpu_run(CPUState *cpu)
|
|||
whpx_vcpu_kick(cpu);
|
||||
}
|
||||
|
||||
hr = WHvRunVirtualProcessor(whpx->partition, cpu->cpu_index,
|
||||
&vcpu->exit_ctx, sizeof(vcpu->exit_ctx));
|
||||
hr = whp_dispatch.WHvRunVirtualProcessor(
|
||||
whpx->partition, cpu->cpu_index,
|
||||
&vcpu->exit_ctx, sizeof(vcpu->exit_ctx));
|
||||
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to exec a virtual processor,"
|
||||
|
@ -912,11 +944,13 @@ static int whpx_vcpu_run(CPUState *cpu)
|
|||
break;
|
||||
|
||||
case WHvRunVpExitReasonX64Cpuid: {
|
||||
WHV_REGISTER_VALUE reg_values[5] = {0};
|
||||
WHV_REGISTER_VALUE reg_values[5];
|
||||
WHV_REGISTER_NAME reg_names[5];
|
||||
UINT32 reg_count = 5;
|
||||
UINT64 rip, rax, rcx, rdx, rbx;
|
||||
|
||||
memset(reg_values, 0, sizeof(reg_values));
|
||||
|
||||
rip = vcpu->exit_ctx.VpContext.Rip +
|
||||
vcpu->exit_ctx.VpContext.InstructionLength;
|
||||
switch (vcpu->exit_ctx.CpuidAccess.Rax) {
|
||||
|
@ -949,11 +983,11 @@ static int whpx_vcpu_run(CPUState *cpu)
|
|||
reg_values[3].Reg64 = rdx;
|
||||
reg_values[4].Reg64 = rbx;
|
||||
|
||||
hr = WHvSetVirtualProcessorRegisters(whpx->partition,
|
||||
cpu->cpu_index,
|
||||
reg_names,
|
||||
reg_count,
|
||||
reg_values);
|
||||
hr = whp_dispatch.WHvSetVirtualProcessorRegisters(
|
||||
whpx->partition, cpu->cpu_index,
|
||||
reg_names,
|
||||
reg_count,
|
||||
reg_values);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to set CpuidAccess state registers,"
|
||||
|
@ -1065,8 +1099,8 @@ int whpx_init_vcpu(CPUState *cpu)
|
|||
(void)migrate_add_blocker(whpx_migration_blocker, &local_error);
|
||||
if (local_error) {
|
||||
error_report_err(local_error);
|
||||
error_free(whpx_migration_blocker);
|
||||
migrate_del_blocker(whpx_migration_blocker);
|
||||
error_free(whpx_migration_blocker);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
@ -1078,7 +1112,9 @@ int whpx_init_vcpu(CPUState *cpu)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hr = WHvEmulatorCreateEmulator(&whpx_emu_callbacks, &vcpu->emulator);
|
||||
hr = whp_dispatch.WHvEmulatorCreateEmulator(
|
||||
&whpx_emu_callbacks,
|
||||
&vcpu->emulator);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to setup instruction completion support,"
|
||||
" hr=%08lx", hr);
|
||||
|
@ -1086,11 +1122,12 @@ int whpx_init_vcpu(CPUState *cpu)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
hr = WHvCreateVirtualProcessor(whpx->partition, cpu->cpu_index, 0);
|
||||
hr = whp_dispatch.WHvCreateVirtualProcessor(
|
||||
whpx->partition, cpu->cpu_index, 0);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to create a virtual processor,"
|
||||
" hr=%08lx", hr);
|
||||
WHvEmulatorDestroyEmulator(vcpu->emulator);
|
||||
whp_dispatch.WHvEmulatorDestroyEmulator(vcpu->emulator);
|
||||
g_free(vcpu);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -1131,8 +1168,8 @@ void whpx_destroy_vcpu(CPUState *cpu)
|
|||
struct whpx_state *whpx = &whpx_global;
|
||||
struct whpx_vcpu *vcpu = get_whpx_vcpu(cpu);
|
||||
|
||||
WHvDeleteVirtualProcessor(whpx->partition, cpu->cpu_index);
|
||||
WHvEmulatorDestroyEmulator(vcpu->emulator);
|
||||
whp_dispatch.WHvDeleteVirtualProcessor(whpx->partition, cpu->cpu_index);
|
||||
whp_dispatch.WHvEmulatorDestroyEmulator(vcpu->emulator);
|
||||
g_free(cpu->hax_vcpu);
|
||||
return;
|
||||
}
|
||||
|
@ -1140,7 +1177,8 @@ void whpx_destroy_vcpu(CPUState *cpu)
|
|||
void whpx_vcpu_kick(CPUState *cpu)
|
||||
{
|
||||
struct whpx_state *whpx = &whpx_global;
|
||||
WHvCancelRunVirtualProcessor(whpx->partition, cpu->cpu_index, 0);
|
||||
whp_dispatch.WHvCancelRunVirtualProcessor(
|
||||
whpx->partition, cpu->cpu_index, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1166,24 +1204,24 @@ static void whpx_update_mapping(hwaddr start_pa, ram_addr_t size,
|
|||
*/
|
||||
|
||||
if (add) {
|
||||
hr = WHvMapGpaRange(whpx->partition,
|
||||
host_va,
|
||||
start_pa,
|
||||
size,
|
||||
(WHvMapGpaRangeFlagRead |
|
||||
WHvMapGpaRangeFlagExecute |
|
||||
(rom ? 0 : WHvMapGpaRangeFlagWrite)));
|
||||
hr = whp_dispatch.WHvMapGpaRange(whpx->partition,
|
||||
host_va,
|
||||
start_pa,
|
||||
size,
|
||||
(WHvMapGpaRangeFlagRead |
|
||||
WHvMapGpaRangeFlagExecute |
|
||||
(rom ? 0 : WHvMapGpaRangeFlagWrite)));
|
||||
} else {
|
||||
hr = WHvUnmapGpaRange(whpx->partition,
|
||||
start_pa,
|
||||
size);
|
||||
hr = whp_dispatch.WHvUnmapGpaRange(whpx->partition,
|
||||
start_pa,
|
||||
size);
|
||||
}
|
||||
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to %s GPA range '%s' PA:%p, Size:%p bytes,"
|
||||
" Host:%p, hr=%08lx",
|
||||
(add ? "MAP" : "UNMAP"), name,
|
||||
(void *)start_pa, (void *)size, host_va, hr);
|
||||
(void *)(uintptr_t)start_pa, (void *)size, host_va, hr);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1214,8 +1252,8 @@ static void whpx_process_section(MemoryRegionSection *section, int add)
|
|||
host_va = (uintptr_t)memory_region_get_ram_ptr(mr)
|
||||
+ section->offset_within_region + delta;
|
||||
|
||||
whpx_update_mapping(start_pa, size, (void *)host_va, add,
|
||||
memory_region_is_rom(mr), mr->name);
|
||||
whpx_update_mapping(start_pa, size, (void *)(uintptr_t)host_va, add,
|
||||
memory_region_is_rom(mr), mr->name);
|
||||
}
|
||||
|
||||
static void whpx_region_add(MemoryListener *listener,
|
||||
|
@ -1290,18 +1328,24 @@ static int whpx_accel_init(MachineState *ms)
|
|||
|
||||
whpx = &whpx_global;
|
||||
|
||||
if (!init_whp_dispatch()) {
|
||||
ret = -ENOSYS;
|
||||
goto error;
|
||||
}
|
||||
|
||||
memset(whpx, 0, sizeof(struct whpx_state));
|
||||
whpx->mem_quota = ms->ram_size;
|
||||
|
||||
hr = WHvGetCapability(WHvCapabilityCodeHypervisorPresent, &whpx_cap,
|
||||
sizeof(whpx_cap), &whpx_cap_size);
|
||||
hr = whp_dispatch.WHvGetCapability(
|
||||
WHvCapabilityCodeHypervisorPresent, &whpx_cap,
|
||||
sizeof(whpx_cap), &whpx_cap_size);
|
||||
if (FAILED(hr) || !whpx_cap.HypervisorPresent) {
|
||||
error_report("WHPX: No accelerator found, hr=%08lx", hr);
|
||||
ret = -ENOSPC;
|
||||
goto error;
|
||||
}
|
||||
|
||||
hr = WHvCreatePartition(&whpx->partition);
|
||||
hr = whp_dispatch.WHvCreatePartition(&whpx->partition);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to create partition, hr=%08lx", hr);
|
||||
ret = -EINVAL;
|
||||
|
@ -1310,10 +1354,11 @@ static int whpx_accel_init(MachineState *ms)
|
|||
|
||||
memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY));
|
||||
prop.ProcessorCount = smp_cpus;
|
||||
hr = WHvSetPartitionProperty(whpx->partition,
|
||||
WHvPartitionPropertyCodeProcessorCount,
|
||||
&prop,
|
||||
sizeof(WHV_PARTITION_PROPERTY));
|
||||
hr = whp_dispatch.WHvSetPartitionProperty(
|
||||
whpx->partition,
|
||||
WHvPartitionPropertyCodeProcessorCount,
|
||||
&prop,
|
||||
sizeof(WHV_PARTITION_PROPERTY));
|
||||
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to set partition core count to %d,"
|
||||
|
@ -1324,10 +1369,11 @@ static int whpx_accel_init(MachineState *ms)
|
|||
|
||||
memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY));
|
||||
prop.ExtendedVmExits.X64CpuidExit = 1;
|
||||
hr = WHvSetPartitionProperty(whpx->partition,
|
||||
WHvPartitionPropertyCodeExtendedVmExits,
|
||||
&prop,
|
||||
sizeof(WHV_PARTITION_PROPERTY));
|
||||
hr = whp_dispatch.WHvSetPartitionProperty(
|
||||
whpx->partition,
|
||||
WHvPartitionPropertyCodeExtendedVmExits,
|
||||
&prop,
|
||||
sizeof(WHV_PARTITION_PROPERTY));
|
||||
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to enable partition extended X64CpuidExit"
|
||||
|
@ -1337,11 +1383,11 @@ static int whpx_accel_init(MachineState *ms)
|
|||
}
|
||||
|
||||
UINT32 cpuidExitList[] = {1};
|
||||
hr = WHvSetPartitionProperty(whpx->partition,
|
||||
WHvPartitionPropertyCodeCpuidExitList,
|
||||
cpuidExitList,
|
||||
RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32));
|
||||
|
||||
hr = whp_dispatch.WHvSetPartitionProperty(
|
||||
whpx->partition,
|
||||
WHvPartitionPropertyCodeCpuidExitList,
|
||||
cpuidExitList,
|
||||
RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32));
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to set partition CpuidExitList hr=%08lx",
|
||||
hr);
|
||||
|
@ -1349,7 +1395,7 @@ static int whpx_accel_init(MachineState *ms)
|
|||
goto error;
|
||||
}
|
||||
|
||||
hr = WHvSetupPartition(whpx->partition);
|
||||
hr = whp_dispatch.WHvSetupPartition(whpx->partition);
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to setup partition, hr=%08lx", hr);
|
||||
ret = -EINVAL;
|
||||
|
@ -1366,7 +1412,7 @@ static int whpx_accel_init(MachineState *ms)
|
|||
error:
|
||||
|
||||
if (NULL != whpx->partition) {
|
||||
WHvDeletePartition(whpx->partition);
|
||||
whp_dispatch.WHvDeletePartition(whpx->partition);
|
||||
whpx->partition = NULL;
|
||||
}
|
||||
|
||||
|
@ -1398,4 +1444,54 @@ static void whpx_type_init(void)
|
|||
type_register_static(&whpx_accel_type);
|
||||
}
|
||||
|
||||
bool init_whp_dispatch(void)
|
||||
{
|
||||
const char *lib_name;
|
||||
HMODULE hLib;
|
||||
|
||||
if (whp_dispatch_initialized) {
|
||||
return true;
|
||||
}
|
||||
|
||||
#define WHP_LOAD_FIELD(return_type, function_name, signature) \
|
||||
whp_dispatch.function_name = \
|
||||
(function_name ## _t)GetProcAddress(hLib, #function_name); \
|
||||
if (!whp_dispatch.function_name) { \
|
||||
error_report("Could not load function %s from library %s.", \
|
||||
#function_name, lib_name); \
|
||||
goto error; \
|
||||
} \
|
||||
|
||||
lib_name = "WinHvPlatform.dll";
|
||||
hWinHvPlatform = LoadLibrary(lib_name);
|
||||
if (!hWinHvPlatform) {
|
||||
error_report("Could not load library %s.", lib_name);
|
||||
goto error;
|
||||
}
|
||||
hLib = hWinHvPlatform;
|
||||
LIST_WINHVPLATFORM_FUNCTIONS(WHP_LOAD_FIELD)
|
||||
|
||||
lib_name = "WinHvEmulation.dll";
|
||||
hWinHvEmulation = LoadLibrary(lib_name);
|
||||
if (!hWinHvEmulation) {
|
||||
error_report("Could not load library %s.", lib_name);
|
||||
goto error;
|
||||
}
|
||||
hLib = hWinHvEmulation;
|
||||
LIST_WINHVEMULATION_FUNCTIONS(WHP_LOAD_FIELD)
|
||||
|
||||
whp_dispatch_initialized = true;
|
||||
return true;
|
||||
|
||||
error:
|
||||
|
||||
if (hWinHvPlatform) {
|
||||
FreeLibrary(hWinHvPlatform);
|
||||
}
|
||||
if (hWinHvEmulation) {
|
||||
FreeLibrary(hWinHvEmulation);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
type_init(whpx_type_init);
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include "qapi/error.h"
|
||||
#include "cpu.h"
|
||||
#include "qemu-common.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
|
||||
static void lm32_cpu_set_pc(CPUState *cs, vaddr value)
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include "cpu.h"
|
||||
#include "qemu-common.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "fpu/softfloat.h"
|
||||
|
||||
static void m68k_cpu_set_pc(CPUState *cs, vaddr value)
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include "qemu-common.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "machine.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
static void moxie_cpu_set_pc(CPUState *cs, vaddr value)
|
||||
{
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
|
||||
#include "cpu.h"
|
||||
#include "mmu.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
int moxie_mmu_translate(MoxieMMUResult *res,
|
||||
CPUMoxieState *env, uint32_t vaddr,
|
||||
|
|
|
@ -260,7 +260,6 @@ static inline int cpu_interrupts_enabled(CPUNios2State *env)
|
|||
}
|
||||
|
||||
#include "exec/cpu-all.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
static inline void cpu_get_tb_cpu_state(CPUNios2State *env, target_ulong *pc,
|
||||
target_ulong *cs_base, uint32_t *flags)
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include "cpu.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "exec/cpu_ldst.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "qemu/main-loop.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "qapi/error.h"
|
||||
#include "cpu.h"
|
||||
#include "qemu-common.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
static void openrisc_cpu_set_pc(CPUState *cs, vaddr value)
|
||||
{
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#define HELPER_REGS_H
|
||||
|
||||
#include "qemu/main-loop.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
/* Swap temporary saved registers with GPRs */
|
||||
static inline void hreg_swap_gpr_tgpr(CPUPPCState *env)
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "internal.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "qemu/host-utils.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "crypto/aes.h"
|
||||
|
|
|
@ -38,7 +38,6 @@
|
|||
#include "qapi/qapi-visit-misc.h"
|
||||
#include "qapi/qapi-visit-run-state.h"
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
#include "hw/hw.h"
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include "cpu.h"
|
||||
#include "internal.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "hw/watchdog/wdt_diag288.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "hw/s390x/ipl.h"
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include "internal.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "hw/s390x/ioinst.h"
|
||||
#include "sysemu/hw_accel.h"
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
#include "hw/hw.h"
|
||||
#include "sysemu/device_tree.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "trace.h"
|
||||
#include "hw/s390x/s390-pci-inst.h"
|
||||
#include "hw/s390x/s390-pci-bus.h"
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "internal.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/cpu_ldst.h"
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include "qemu/host-utils.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/cpu_ldst.h"
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "trace.h"
|
||||
#include "exec/address-spaces.h"
|
||||
|
||||
/* Sparc MMU emulation */
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include "qemu-common.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "linux-user/syscall_defs.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
static void tilegx_cpu_dump_state(CPUState *cs, FILE *f,
|
||||
fprintf_function cpu_fprintf, int flags)
|
||||
|
|
|
@ -27,9 +27,9 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "qemu/host-utils.h"
|
||||
#include "qemu/timer.h"
|
||||
|
||||
#include "core-dc232b/core-isa.h"
|
||||
#include "overlay_tool.h"
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/host-utils.h"
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/host-utils.h"
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/host-utils.h"
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/host-utils.h"
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
#include "cpu.h"
|
||||
#include "qemu-common.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "exec/exec-all.h"
|
||||
|
||||
|
||||
static void xtensa_cpu_set_pc(CPUState *cs, vaddr value)
|
||||
|
|
|
@ -39,7 +39,6 @@ tar -xf "$OVERLAY" -O binutils/xtensa-modules.c | \
|
|||
cat <<EOF > "${TARGET}.c"
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/host-utils.h"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue