mirror of https://github.com/xemu-project/xemu.git
* pc: Add a description for the i8042 property
* kvm: support for nested FRED * tests/unit: fix warning when compiling test-nested-aio-poll with LTO * kvm: refactoring of VM creation * target/i386: expose IBPB-BRTYPE and SBPB CPUID bits to the guest * hw/char: clean up serial * remove virtfs-proxy-helper * target/i386/kvm: Report which action failed in kvm_arch_put/get_registers * qom: improvements to object_resolve_path*() -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmb++MsUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroPVnwf/cdvfxvDm22tEdlh8vHlV17HtVdcC Hw334M/3PDvbTmGzPBg26lzo4nFS6SLrZ8ETCeqvuJrtKzqVk9bI8ssZW5KA4ijM nkxguRPHO8E6U33ZSucc+Hn56+bAx4I2X80dLKXJ87OsbMffIeJ6aHGSEI1+fKVh pK7q53+Y3lQWuRBGhDIyKNuzqU4g+irpQwXOhux63bV3ADadmsqzExP6Gmtl8OKM DylPu1oK7EPZumlSiJa7Gy1xBqL4Rc4wGPNYx2RVRjp+i7W2/Y1uehm3wSBw+SXC a6b7SvLoYfWYS14/qCF4cBL3sJH/0f/4g8ZAhDDxi2i5kBr0/5oioDyE/A== =/zo4 -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging * pc: Add a description for the i8042 property * kvm: support for nested FRED * tests/unit: fix warning when compiling test-nested-aio-poll with LTO * kvm: refactoring of VM creation * target/i386: expose IBPB-BRTYPE and SBPB CPUID bits to the guest * hw/char: clean up serial * remove virtfs-proxy-helper * target/i386/kvm: Report which action failed in kvm_arch_put/get_registers * qom: improvements to object_resolve_path*() # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmb++MsUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroPVnwf/cdvfxvDm22tEdlh8vHlV17HtVdcC # Hw334M/3PDvbTmGzPBg26lzo4nFS6SLrZ8ETCeqvuJrtKzqVk9bI8ssZW5KA4ijM # nkxguRPHO8E6U33ZSucc+Hn56+bAx4I2X80dLKXJ87OsbMffIeJ6aHGSEI1+fKVh # pK7q53+Y3lQWuRBGhDIyKNuzqU4g+irpQwXOhux63bV3ADadmsqzExP6Gmtl8OKM # DylPu1oK7EPZumlSiJa7Gy1xBqL4Rc4wGPNYx2RVRjp+i7W2/Y1uehm3wSBw+SXC # a6b7SvLoYfWYS14/qCF4cBL3sJH/0f/4g8ZAhDDxi2i5kBr0/5oioDyE/A== # =/zo4 # -----END PGP SIGNATURE----- # gpg: Signature made Thu 03 Oct 2024 21:04:27 BST # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] # 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 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: (23 commits) qom: update object_resolve_path*() documentation qom: set *ambiguous on all paths qom: rename object_resolve_path_type() "ambiguousp" target/i386/kvm: Report which action failed in kvm_arch_put/get_registers kvm: Allow kvm_arch_get/put_registers to accept Error** accel/kvm: refactor dirty ring setup minikconf: print error entirely on stderr 9p: remove 'proxy' filesystem backend driver hw/char: Extract serial-mm hw/char/serial.h: Extract serial-isa.h hw: Remove unused inclusion of hw/char/serial.h target/i386: Expose IBPB-BRTYPE and SBPB CPUID bits to the guest kvm: refactor core virtual machine creation into its own function kvm/i386: replace identity_base variable with a constant kvm/i386: refactor kvm_arch_init and split it into smaller functions kvm: replace fprintf with error_report()/printf() in kvm_init() kvm/i386: fix return values of is_host_cpu_intel() kvm/i386: make kvm_filter_msr() and related definitions private to kvm module hw/i386/pc: Add a description for the i8042 property tests/unit: remove block layer code from test-nested-aio-poll ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org> # Conflicts: # hw/arm/Kconfig # hw/arm/pxa2xx.c
This commit is contained in:
commit
b5ab62b3c0
|
@ -2207,20 +2207,12 @@ S: Maintained
|
|||
W: https://wiki.qemu.org/Documentation/9p
|
||||
F: hw/9pfs/
|
||||
X: hw/9pfs/xen-9p*
|
||||
X: hw/9pfs/9p-proxy*
|
||||
F: fsdev/
|
||||
X: fsdev/virtfs-proxy-helper.c
|
||||
F: tests/qtest/virtio-9p-test.c
|
||||
F: tests/qtest/libqos/virtio-9p*
|
||||
T: git https://gitlab.com/gkurz/qemu.git 9p-next
|
||||
T: git https://github.com/cschoenebeck/qemu.git 9p.next
|
||||
|
||||
virtio-9p-proxy
|
||||
F: hw/9pfs/9p-proxy*
|
||||
F: fsdev/virtfs-proxy-helper.c
|
||||
F: docs/tools/virtfs-proxy-helper.rst
|
||||
S: Obsolete
|
||||
|
||||
virtio-blk
|
||||
M: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
L: qemu-block@nongnu.org
|
||||
|
|
|
@ -2381,171 +2381,64 @@ uint32_t kvm_dirty_ring_size(void)
|
|||
return kvm_state->kvm_dirty_ring_size;
|
||||
}
|
||||
|
||||
static int kvm_init(MachineState *ms)
|
||||
static int do_kvm_create_vm(MachineState *ms, int type)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
static const char upgrade_note[] =
|
||||
"Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
|
||||
"(see http://sourceforge.net/projects/kvm).\n";
|
||||
const struct {
|
||||
const char *name;
|
||||
int num;
|
||||
} num_cpus[] = {
|
||||
{ "SMP", ms->smp.cpus },
|
||||
{ "hotpluggable", ms->smp.max_cpus },
|
||||
{ /* end of list */ }
|
||||
}, *nc = num_cpus;
|
||||
int soft_vcpus_limit, hard_vcpus_limit;
|
||||
KVMState *s;
|
||||
const KVMCapabilityInfo *missing_cap;
|
||||
int ret;
|
||||
int type;
|
||||
uint64_t dirty_log_manual_caps;
|
||||
|
||||
qemu_mutex_init(&kml_slots_lock);
|
||||
|
||||
s = KVM_STATE(ms->accelerator);
|
||||
|
||||
/*
|
||||
* On systems where the kernel can support different base page
|
||||
* sizes, host page size may be different from TARGET_PAGE_SIZE,
|
||||
* even with KVM. TARGET_PAGE_SIZE is assumed to be the minimum
|
||||
* page size for the system though.
|
||||
*/
|
||||
assert(TARGET_PAGE_SIZE <= qemu_real_host_page_size());
|
||||
|
||||
s->sigmask_len = 8;
|
||||
accel_blocker_init();
|
||||
|
||||
#ifdef TARGET_KVM_HAVE_GUEST_DEBUG
|
||||
QTAILQ_INIT(&s->kvm_sw_breakpoints);
|
||||
#endif
|
||||
QLIST_INIT(&s->kvm_parked_vcpus);
|
||||
s->fd = qemu_open_old(s->device ?: "/dev/kvm", O_RDWR);
|
||||
if (s->fd == -1) {
|
||||
fprintf(stderr, "Could not access KVM kernel module: %m\n");
|
||||
ret = -errno;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
|
||||
if (ret < KVM_API_VERSION) {
|
||||
if (ret >= 0) {
|
||||
ret = -EINVAL;
|
||||
}
|
||||
fprintf(stderr, "kvm version too old\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (ret > KVM_API_VERSION) {
|
||||
ret = -EINVAL;
|
||||
fprintf(stderr, "kvm version not supported\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
kvm_supported_memory_attributes = kvm_check_extension(s, KVM_CAP_MEMORY_ATTRIBUTES);
|
||||
kvm_guest_memfd_supported =
|
||||
kvm_check_extension(s, KVM_CAP_GUEST_MEMFD) &&
|
||||
kvm_check_extension(s, KVM_CAP_USER_MEMORY2) &&
|
||||
(kvm_supported_memory_attributes & KVM_MEMORY_ATTRIBUTE_PRIVATE);
|
||||
|
||||
kvm_immediate_exit = kvm_check_extension(s, KVM_CAP_IMMEDIATE_EXIT);
|
||||
s->nr_slots = kvm_check_extension(s, KVM_CAP_NR_MEMSLOTS);
|
||||
|
||||
/* If unspecified, use the default value */
|
||||
if (!s->nr_slots) {
|
||||
s->nr_slots = 32;
|
||||
}
|
||||
|
||||
s->nr_as = kvm_check_extension(s, KVM_CAP_MULTI_ADDRESS_SPACE);
|
||||
if (s->nr_as <= 1) {
|
||||
s->nr_as = 1;
|
||||
}
|
||||
s->as = g_new0(struct KVMAs, s->nr_as);
|
||||
|
||||
if (object_property_find(OBJECT(current_machine), "kvm-type")) {
|
||||
g_autofree char *kvm_type = object_property_get_str(OBJECT(current_machine),
|
||||
"kvm-type",
|
||||
&error_abort);
|
||||
type = mc->kvm_type(ms, kvm_type);
|
||||
} else if (mc->kvm_type) {
|
||||
type = mc->kvm_type(ms, NULL);
|
||||
} else {
|
||||
type = kvm_arch_get_default_type(ms);
|
||||
}
|
||||
|
||||
if (type < 0) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
do {
|
||||
ret = kvm_ioctl(s, KVM_CREATE_VM, type);
|
||||
} while (ret == -EINTR);
|
||||
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "ioctl(KVM_CREATE_VM) failed: %d %s\n", -ret,
|
||||
strerror(-ret));
|
||||
error_report("ioctl(KVM_CREATE_VM) failed: %s", strerror(-ret));
|
||||
|
||||
#ifdef TARGET_S390X
|
||||
if (ret == -EINVAL) {
|
||||
fprintf(stderr,
|
||||
"Host kernel setup problem detected. Please verify:\n");
|
||||
fprintf(stderr, "- for kernels supporting the switch_amode or"
|
||||
" user_mode parameters, whether\n");
|
||||
fprintf(stderr,
|
||||
" user space is running in primary address space\n");
|
||||
fprintf(stderr,
|
||||
"- for kernels supporting the vm.allocate_pgste sysctl, "
|
||||
"whether it is enabled\n");
|
||||
error_printf("Host kernel setup problem detected."
|
||||
" Please verify:\n");
|
||||
error_printf("- for kernels supporting the"
|
||||
" switch_amode or user_mode parameters, whether");
|
||||
error_printf(" user space is running in primary address space\n");
|
||||
error_printf("- for kernels supporting the vm.allocate_pgste"
|
||||
" sysctl, whether it is enabled\n");
|
||||
}
|
||||
#elif defined(TARGET_PPC)
|
||||
if (ret == -EINVAL) {
|
||||
fprintf(stderr,
|
||||
"PPC KVM module is not loaded. Try modprobe kvm_%s.\n",
|
||||
(type == 2) ? "pr" : "hv");
|
||||
error_printf("PPC KVM module is not loaded. Try modprobe kvm_%s.\n",
|
||||
(type == 2) ? "pr" : "hv");
|
||||
}
|
||||
#endif
|
||||
goto err;
|
||||
}
|
||||
|
||||
s->vmfd = ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* check the vcpu limits */
|
||||
soft_vcpus_limit = kvm_recommended_vcpus(s);
|
||||
hard_vcpus_limit = kvm_max_vcpus(s);
|
||||
static int find_kvm_machine_type(MachineState *ms)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
int type;
|
||||
|
||||
while (nc->name) {
|
||||
if (nc->num > soft_vcpus_limit) {
|
||||
warn_report("Number of %s cpus requested (%d) exceeds "
|
||||
"the recommended cpus supported by KVM (%d)",
|
||||
nc->name, nc->num, soft_vcpus_limit);
|
||||
|
||||
if (nc->num > hard_vcpus_limit) {
|
||||
fprintf(stderr, "Number of %s cpus requested (%d) exceeds "
|
||||
"the maximum cpus supported by KVM (%d)\n",
|
||||
nc->name, nc->num, hard_vcpus_limit);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
nc++;
|
||||
if (object_property_find(OBJECT(current_machine), "kvm-type")) {
|
||||
g_autofree char *kvm_type;
|
||||
kvm_type = object_property_get_str(OBJECT(current_machine),
|
||||
"kvm-type",
|
||||
&error_abort);
|
||||
type = mc->kvm_type(ms, kvm_type);
|
||||
} else if (mc->kvm_type) {
|
||||
type = mc->kvm_type(ms, NULL);
|
||||
} else {
|
||||
type = kvm_arch_get_default_type(ms);
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
missing_cap = kvm_check_extension_list(s, kvm_required_capabilites);
|
||||
if (!missing_cap) {
|
||||
missing_cap =
|
||||
kvm_check_extension_list(s, kvm_arch_required_capabilities);
|
||||
}
|
||||
if (missing_cap) {
|
||||
ret = -EINVAL;
|
||||
fprintf(stderr, "kvm does not support %s\n%s",
|
||||
missing_cap->name, upgrade_note);
|
||||
goto err;
|
||||
}
|
||||
|
||||
s->coalesced_mmio = kvm_check_extension(s, KVM_CAP_COALESCED_MMIO);
|
||||
s->coalesced_pio = s->coalesced_mmio &&
|
||||
kvm_check_extension(s, KVM_CAP_COALESCED_PIO);
|
||||
static int kvm_setup_dirty_ring(KVMState *s)
|
||||
{
|
||||
uint64_t dirty_log_manual_caps;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Enable KVM dirty ring if supported, otherwise fall back to
|
||||
|
@ -2553,7 +2446,7 @@ static int kvm_init(MachineState *ms)
|
|||
*/
|
||||
ret = kvm_dirty_ring_init(s);
|
||||
if (ret < 0) {
|
||||
goto err;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2588,6 +2481,144 @@ static int kvm_init(MachineState *ms)
|
|||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kvm_init(MachineState *ms)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
static const char upgrade_note[] =
|
||||
"Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
|
||||
"(see http://sourceforge.net/projects/kvm).\n";
|
||||
const struct {
|
||||
const char *name;
|
||||
int num;
|
||||
} num_cpus[] = {
|
||||
{ "SMP", ms->smp.cpus },
|
||||
{ "hotpluggable", ms->smp.max_cpus },
|
||||
{ /* end of list */ }
|
||||
}, *nc = num_cpus;
|
||||
int soft_vcpus_limit, hard_vcpus_limit;
|
||||
KVMState *s;
|
||||
const KVMCapabilityInfo *missing_cap;
|
||||
int ret;
|
||||
int type;
|
||||
|
||||
qemu_mutex_init(&kml_slots_lock);
|
||||
|
||||
s = KVM_STATE(ms->accelerator);
|
||||
|
||||
/*
|
||||
* On systems where the kernel can support different base page
|
||||
* sizes, host page size may be different from TARGET_PAGE_SIZE,
|
||||
* even with KVM. TARGET_PAGE_SIZE is assumed to be the minimum
|
||||
* page size for the system though.
|
||||
*/
|
||||
assert(TARGET_PAGE_SIZE <= qemu_real_host_page_size());
|
||||
|
||||
s->sigmask_len = 8;
|
||||
accel_blocker_init();
|
||||
|
||||
#ifdef TARGET_KVM_HAVE_GUEST_DEBUG
|
||||
QTAILQ_INIT(&s->kvm_sw_breakpoints);
|
||||
#endif
|
||||
QLIST_INIT(&s->kvm_parked_vcpus);
|
||||
s->fd = qemu_open_old(s->device ?: "/dev/kvm", O_RDWR);
|
||||
if (s->fd == -1) {
|
||||
error_report("Could not access KVM kernel module: %m");
|
||||
ret = -errno;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
|
||||
if (ret < KVM_API_VERSION) {
|
||||
if (ret >= 0) {
|
||||
ret = -EINVAL;
|
||||
}
|
||||
error_report("kvm version too old");
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (ret > KVM_API_VERSION) {
|
||||
ret = -EINVAL;
|
||||
error_report("kvm version not supported");
|
||||
goto err;
|
||||
}
|
||||
|
||||
kvm_supported_memory_attributes = kvm_check_extension(s, KVM_CAP_MEMORY_ATTRIBUTES);
|
||||
kvm_guest_memfd_supported =
|
||||
kvm_check_extension(s, KVM_CAP_GUEST_MEMFD) &&
|
||||
kvm_check_extension(s, KVM_CAP_USER_MEMORY2) &&
|
||||
(kvm_supported_memory_attributes & KVM_MEMORY_ATTRIBUTE_PRIVATE);
|
||||
|
||||
kvm_immediate_exit = kvm_check_extension(s, KVM_CAP_IMMEDIATE_EXIT);
|
||||
s->nr_slots = kvm_check_extension(s, KVM_CAP_NR_MEMSLOTS);
|
||||
|
||||
/* If unspecified, use the default value */
|
||||
if (!s->nr_slots) {
|
||||
s->nr_slots = 32;
|
||||
}
|
||||
|
||||
s->nr_as = kvm_check_extension(s, KVM_CAP_MULTI_ADDRESS_SPACE);
|
||||
if (s->nr_as <= 1) {
|
||||
s->nr_as = 1;
|
||||
}
|
||||
s->as = g_new0(struct KVMAs, s->nr_as);
|
||||
|
||||
type = find_kvm_machine_type(ms);
|
||||
if (type < 0) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = do_kvm_create_vm(ms, type);
|
||||
if (ret < 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
s->vmfd = ret;
|
||||
|
||||
/* check the vcpu limits */
|
||||
soft_vcpus_limit = kvm_recommended_vcpus(s);
|
||||
hard_vcpus_limit = kvm_max_vcpus(s);
|
||||
|
||||
while (nc->name) {
|
||||
if (nc->num > soft_vcpus_limit) {
|
||||
warn_report("Number of %s cpus requested (%d) exceeds "
|
||||
"the recommended cpus supported by KVM (%d)",
|
||||
nc->name, nc->num, soft_vcpus_limit);
|
||||
|
||||
if (nc->num > hard_vcpus_limit) {
|
||||
error_report("Number of %s cpus requested (%d) exceeds "
|
||||
"the maximum cpus supported by KVM (%d)",
|
||||
nc->name, nc->num, hard_vcpus_limit);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
nc++;
|
||||
}
|
||||
|
||||
missing_cap = kvm_check_extension_list(s, kvm_required_capabilites);
|
||||
if (!missing_cap) {
|
||||
missing_cap =
|
||||
kvm_check_extension_list(s, kvm_arch_required_capabilities);
|
||||
}
|
||||
if (missing_cap) {
|
||||
ret = -EINVAL;
|
||||
error_report("kvm does not support %s", missing_cap->name);
|
||||
error_printf("%s", upgrade_note);
|
||||
goto err;
|
||||
}
|
||||
|
||||
s->coalesced_mmio = kvm_check_extension(s, KVM_CAP_COALESCED_MMIO);
|
||||
s->coalesced_pio = s->coalesced_mmio &&
|
||||
kvm_check_extension(s, KVM_CAP_COALESCED_PIO);
|
||||
|
||||
ret = kvm_setup_dirty_ring(s);
|
||||
if (ret < 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
#ifdef KVM_CAP_VCPU_EVENTS
|
||||
s->vcpu_events = kvm_check_extension(s, KVM_CAP_VCPU_EVENTS);
|
||||
#endif
|
||||
|
@ -2762,9 +2793,15 @@ void kvm_flush_coalesced_mmio_buffer(void)
|
|||
static void do_kvm_cpu_synchronize_state(CPUState *cpu, run_on_cpu_data arg)
|
||||
{
|
||||
if (!cpu->vcpu_dirty && !kvm_state->guest_state_protected) {
|
||||
int ret = kvm_arch_get_registers(cpu);
|
||||
Error *err = NULL;
|
||||
int ret = kvm_arch_get_registers(cpu, &err);
|
||||
if (ret) {
|
||||
error_report("Failed to get registers: %s", strerror(-ret));
|
||||
if (err) {
|
||||
error_reportf_err(err, "Failed to synchronize CPU state: ");
|
||||
} else {
|
||||
error_report("Failed to get registers: %s", strerror(-ret));
|
||||
}
|
||||
|
||||
cpu_dump_state(cpu, stderr, CPU_DUMP_CODE);
|
||||
vm_stop(RUN_STATE_INTERNAL_ERROR);
|
||||
}
|
||||
|
@ -2782,9 +2819,15 @@ void kvm_cpu_synchronize_state(CPUState *cpu)
|
|||
|
||||
static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg)
|
||||
{
|
||||
int ret = kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE);
|
||||
Error *err = NULL;
|
||||
int ret = kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE, &err);
|
||||
if (ret) {
|
||||
error_report("Failed to put registers after reset: %s", strerror(-ret));
|
||||
if (err) {
|
||||
error_reportf_err(err, "Restoring resisters after reset: ");
|
||||
} else {
|
||||
error_report("Failed to put registers after reset: %s",
|
||||
strerror(-ret));
|
||||
}
|
||||
cpu_dump_state(cpu, stderr, CPU_DUMP_CODE);
|
||||
vm_stop(RUN_STATE_INTERNAL_ERROR);
|
||||
}
|
||||
|
@ -2799,9 +2842,15 @@ void kvm_cpu_synchronize_post_reset(CPUState *cpu)
|
|||
|
||||
static void do_kvm_cpu_synchronize_post_init(CPUState *cpu, run_on_cpu_data arg)
|
||||
{
|
||||
int ret = kvm_arch_put_registers(cpu, KVM_PUT_FULL_STATE);
|
||||
Error *err = NULL;
|
||||
int ret = kvm_arch_put_registers(cpu, KVM_PUT_FULL_STATE, &err);
|
||||
if (ret) {
|
||||
error_report("Failed to put registers after init: %s", strerror(-ret));
|
||||
if (err) {
|
||||
error_reportf_err(err, "Putting registers after init: ");
|
||||
} else {
|
||||
error_report("Failed to put registers after init: %s",
|
||||
strerror(-ret));
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
@ -2991,10 +3040,15 @@ int kvm_cpu_exec(CPUState *cpu)
|
|||
MemTxAttrs attrs;
|
||||
|
||||
if (cpu->vcpu_dirty) {
|
||||
ret = kvm_arch_put_registers(cpu, KVM_PUT_RUNTIME_STATE);
|
||||
Error *err = NULL;
|
||||
ret = kvm_arch_put_registers(cpu, KVM_PUT_RUNTIME_STATE, &err);
|
||||
if (ret) {
|
||||
error_report("Failed to put registers after init: %s",
|
||||
strerror(-ret));
|
||||
if (err) {
|
||||
error_reportf_err(err, "Putting registers after init: ");
|
||||
} else {
|
||||
error_report("Failed to put registers after init: %s",
|
||||
strerror(-ret));
|
||||
}
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -314,28 +314,6 @@ the addition of volatile memory support, it is now necessary to distinguish
|
|||
between persistent and volatile memory backends. As such, memdev is deprecated
|
||||
in favor of persistent-memdev.
|
||||
|
||||
``-fsdev proxy`` and ``-virtfs proxy`` (since 8.1)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The 9p ``proxy`` filesystem backend driver has been deprecated and will be
|
||||
removed (along with its proxy helper daemon) in a future version of QEMU. Please
|
||||
use ``-fsdev local`` or ``-virtfs local`` for using the 9p ``local`` filesystem
|
||||
backend, or alternatively consider deploying virtiofsd instead.
|
||||
|
||||
The 9p ``proxy`` backend was originally developed as an alternative to the 9p
|
||||
``local`` backend. The idea was to enhance security by dispatching actual low
|
||||
level filesystem operations from 9p server (QEMU process) over to a separate
|
||||
process (the virtfs-proxy-helper binary). However this alternative never gained
|
||||
momentum. The proxy backend is much slower than the local backend, hasn't seen
|
||||
any development in years, and showed to be less secure, especially due to the
|
||||
fact that its helper daemon must be run as root, whereas with the local backend
|
||||
QEMU is typically run as unprivileged user and allows to tighten behaviour by
|
||||
mapping permissions et al by using its 'mapped' security model option.
|
||||
|
||||
Nowadays it would make sense to reimplement the ``proxy`` backend by using
|
||||
QEMU's ``vhost`` feature, which would eliminate the high latency costs under
|
||||
which the 9p ``proxy`` backend currently suffers. However as of to date nobody
|
||||
has indicated plans for such kind of reimplementation unfortunately.
|
||||
|
||||
RISC-V CPU properties which start with capital 'Z' (since 8.2)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
@ -517,6 +517,20 @@ The virtio-blk SCSI passthrough feature is a legacy VIRTIO feature. VIRTIO 1.0
|
|||
and later do not support it because the virtio-scsi device was introduced for
|
||||
full SCSI support. Use virtio-scsi instead when SCSI passthrough is required.
|
||||
|
||||
``-fsdev proxy`` and ``-virtfs proxy`` (since 9.2)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The 9p ``proxy`` filesystem backend driver was originally developed to
|
||||
enhance security by dispatching low level filesystem operations from 9p
|
||||
server (QEMU process) over to a separate process (the virtfs-proxy-helper
|
||||
binary). However the proxy backend was much slower than the local backend,
|
||||
didn't see any development in years, and showed to be less secure,
|
||||
especially due to the fact that its helper daemon must be run as root.
|
||||
|
||||
Use ``local``, possibly mapping permissions et al by using its 'mapped'
|
||||
security model option, or switch to ``virtiofs``. The virtiofs daemon
|
||||
``virtiofsd`` uses vhost to eliminate the high latency costs of the 9p
|
||||
``proxy`` backend.
|
||||
|
||||
User-mode emulator command line arguments
|
||||
-----------------------------------------
|
||||
|
|
|
@ -275,9 +275,6 @@ man_pages = [
|
|||
('tools/qemu-trace-stap', 'qemu-trace-stap',
|
||||
'QEMU SystemTap trace tool',
|
||||
[], 1),
|
||||
('tools/virtfs-proxy-helper', 'virtfs-proxy-helper',
|
||||
'QEMU 9p virtfs proxy filesystem helper',
|
||||
['M. Mohan Kumar'], 1),
|
||||
]
|
||||
man_make_section_directory = False
|
||||
|
||||
|
|
|
@ -54,7 +54,6 @@ if build_docs
|
|||
'qemu-pr-helper.8': (have_tools ? 'man8' : ''),
|
||||
'qemu-storage-daemon.1': (have_tools ? 'man1' : ''),
|
||||
'qemu-trace-stap.1': (stap.found() ? 'man1' : ''),
|
||||
'virtfs-proxy-helper.1': (have_virtfs_proxy_helper ? 'man1' : ''),
|
||||
'qemu.1': 'man1',
|
||||
'qemu-block-drivers.7': 'man7',
|
||||
'qemu-cpu-models.7': 'man7'
|
||||
|
|
|
@ -15,5 +15,4 @@ command line utilities and other standalone programs.
|
|||
qemu-nbd
|
||||
qemu-pr-helper
|
||||
qemu-trace-stap
|
||||
virtfs-proxy-helper
|
||||
qemu-vmsr-helper
|
||||
|
|
|
@ -1,75 +0,0 @@
|
|||
QEMU 9p virtfs proxy filesystem helper
|
||||
======================================
|
||||
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
**virtfs-proxy-helper** [*OPTIONS*]
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
NOTE: The 9p 'proxy' backend is deprecated (since QEMU 8.1) and will be
|
||||
removed, along with this daemon, in a future version of QEMU!
|
||||
|
||||
Pass-through security model in QEMU 9p server needs root privilege to do
|
||||
few file operations (like chown, chmod to any mode/uid:gid). There are two
|
||||
issues in pass-through security model:
|
||||
|
||||
- TOCTTOU vulnerability: Following symbolic links in the server could
|
||||
provide access to files beyond 9p export path.
|
||||
|
||||
- Running QEMU with root privilege could be a security issue.
|
||||
|
||||
To overcome above issues, following approach is used: A new filesystem
|
||||
type 'proxy' is introduced. Proxy FS uses chroot + socket combination
|
||||
for securing the vulnerability known with following symbolic links.
|
||||
Intention of adding a new filesystem type is to allow qemu to run
|
||||
in non-root mode, but doing privileged operations using socket IO.
|
||||
|
||||
Proxy helper (a stand alone binary part of qemu) is invoked with
|
||||
root privileges. Proxy helper chroots into 9p export path and creates
|
||||
a socket pair or a named socket based on the command line parameter.
|
||||
QEMU and proxy helper communicate using this socket. QEMU proxy fs
|
||||
driver sends filesystem request to proxy helper and receives the
|
||||
response from it.
|
||||
|
||||
The proxy helper is designed so that it can drop root privileges except
|
||||
for the capabilities needed for doing filesystem operations.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
The following options are supported:
|
||||
|
||||
.. program:: virtfs-proxy-helper
|
||||
|
||||
.. option:: -h
|
||||
|
||||
Display help and exit
|
||||
|
||||
.. option:: -p, --path PATH
|
||||
|
||||
Path to export for proxy filesystem driver
|
||||
|
||||
.. option:: -f, --fd SOCKET_ID
|
||||
|
||||
Use given file descriptor as socket descriptor for communicating with
|
||||
qemu proxy fs drier. Usually a helper like libvirt will create
|
||||
socketpair and pass one of the fds as parameter to this option.
|
||||
|
||||
.. option:: -s, --socket SOCKET_FILE
|
||||
|
||||
Creates named socket file for communicating with qemu proxy fs driver
|
||||
|
||||
.. option:: -u, --uid UID
|
||||
|
||||
uid to give access to named socket file; used in combination with -g.
|
||||
|
||||
.. option:: -g, --gid GID
|
||||
|
||||
gid to give access to named socket file; used in combination with -u.
|
||||
|
||||
.. option:: -n, --nodaemon
|
||||
|
||||
Run as a normal program. By default program will run in daemon mode
|
|
@ -8,11 +8,3 @@ fsdev_ss.add(when: ['CONFIG_FSDEV_9P'], if_true: files(
|
|||
if host_os in ['linux', 'darwin']
|
||||
system_ss.add_all(fsdev_ss)
|
||||
endif
|
||||
|
||||
if have_virtfs_proxy_helper
|
||||
executable('virtfs-proxy-helper',
|
||||
files('virtfs-proxy-helper.c', '9p-marshal.c', '9p-iov-marshal.c'),
|
||||
dependencies: [qemuutil, libattr, libcap_ng],
|
||||
install: true,
|
||||
install_dir: get_option('libexecdir'))
|
||||
endif
|
||||
|
|
|
@ -89,17 +89,6 @@ static FsDriverTable FsDrivers[] = {
|
|||
NULL
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "proxy",
|
||||
.ops = &proxy_ops,
|
||||
.opts = (const char * []) {
|
||||
COMMON_FS_DRIVER_OPTIONS,
|
||||
"socket",
|
||||
"sock_fd",
|
||||
"writeout",
|
||||
NULL
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static int validate_opt(void *opaque, const char *name, const char *value,
|
||||
|
@ -133,14 +122,6 @@ int qemu_fsdev_add(QemuOpts *opts, Error **errp)
|
|||
}
|
||||
|
||||
if (fsdriver) {
|
||||
if (strncmp(fsdriver, "proxy", 5) == 0) {
|
||||
warn_report(
|
||||
"'-fsdev proxy' and '-virtfs proxy' are deprecated, use "
|
||||
"'local' instead of 'proxy, or consider deploying virtiofsd "
|
||||
"as alternative to 9p"
|
||||
);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(FsDrivers); i++) {
|
||||
if (strcmp(FsDrivers[i].name, fsdriver) == 0) {
|
||||
break;
|
||||
|
|
|
@ -18,5 +18,4 @@ int qemu_fsdev_add(QemuOpts *opts, Error **errp);
|
|||
FsDriverEntry *get_fsdev_fsentry(char *id);
|
||||
extern FileOperations local_ops;
|
||||
extern FileOperations synth_ops;
|
||||
extern FileOperations proxy_ops;
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load Diff
1279
hw/9pfs/9p-proxy.c
1279
hw/9pfs/9p-proxy.c
File diff suppressed because it is too large
Load Diff
|
@ -1,101 +0,0 @@
|
|||
/*
|
||||
* 9p Proxy callback
|
||||
*
|
||||
* Copyright IBM, Corp. 2011
|
||||
*
|
||||
* Authors:
|
||||
* M. Mohan Kumar <mohan@in.ibm.com>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2. See
|
||||
* the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
/*
|
||||
* NOTE: The 9p 'proxy' backend is deprecated (since QEMU 8.1) and will be
|
||||
* removed in a future version of QEMU!
|
||||
*/
|
||||
|
||||
#ifndef QEMU_9P_PROXY_H
|
||||
#define QEMU_9P_PROXY_H
|
||||
|
||||
#define PROXY_MAX_IO_SZ (64 * 1024)
|
||||
#define V9FS_FD_VALID INT_MAX
|
||||
|
||||
/*
|
||||
* proxy iovec only support one element and
|
||||
* marsha/unmarshal doesn't do little endian conversion.
|
||||
*/
|
||||
#define proxy_unmarshal(in_sg, offset, fmt, args...) \
|
||||
v9fs_iov_unmarshal(in_sg, 1, offset, 0, fmt, ##args)
|
||||
#define proxy_marshal(out_sg, offset, fmt, args...) \
|
||||
v9fs_iov_marshal(out_sg, 1, offset, 0, fmt, ##args)
|
||||
|
||||
union MsgControl {
|
||||
struct cmsghdr cmsg;
|
||||
char control[CMSG_SPACE(sizeof(int))];
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint32_t type;
|
||||
uint32_t size;
|
||||
} ProxyHeader;
|
||||
|
||||
#define PROXY_HDR_SZ (sizeof(ProxyHeader))
|
||||
|
||||
enum {
|
||||
T_SUCCESS = 0,
|
||||
T_ERROR,
|
||||
T_OPEN,
|
||||
T_CREATE,
|
||||
T_MKNOD,
|
||||
T_MKDIR,
|
||||
T_SYMLINK,
|
||||
T_LINK,
|
||||
T_LSTAT,
|
||||
T_READLINK,
|
||||
T_STATFS,
|
||||
T_CHMOD,
|
||||
T_CHOWN,
|
||||
T_TRUNCATE,
|
||||
T_UTIME,
|
||||
T_RENAME,
|
||||
T_REMOVE,
|
||||
T_LGETXATTR,
|
||||
T_LLISTXATTR,
|
||||
T_LSETXATTR,
|
||||
T_LREMOVEXATTR,
|
||||
T_GETVERSION,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint64_t st_dev;
|
||||
uint64_t st_ino;
|
||||
uint64_t st_nlink;
|
||||
uint32_t st_mode;
|
||||
uint32_t st_uid;
|
||||
uint32_t st_gid;
|
||||
uint64_t st_rdev;
|
||||
uint64_t st_size;
|
||||
uint64_t st_blksize;
|
||||
uint64_t st_blocks;
|
||||
uint64_t st_atim_sec;
|
||||
uint64_t st_atim_nsec;
|
||||
uint64_t st_mtim_sec;
|
||||
uint64_t st_mtim_nsec;
|
||||
uint64_t st_ctim_sec;
|
||||
uint64_t st_ctim_nsec;
|
||||
} ProxyStat;
|
||||
|
||||
typedef struct {
|
||||
uint64_t f_type;
|
||||
uint64_t f_bsize;
|
||||
uint64_t f_blocks;
|
||||
uint64_t f_bfree;
|
||||
uint64_t f_bavail;
|
||||
uint64_t f_files;
|
||||
uint64_t f_ffree;
|
||||
uint64_t f_fsid[2];
|
||||
uint64_t f_namelen;
|
||||
uint64_t f_frsize;
|
||||
} ProxyStatFS;
|
||||
#endif
|
|
@ -2,7 +2,6 @@ fs_ss = ss.source_set()
|
|||
fs_ss.add(files(
|
||||
'9p-local.c',
|
||||
'9p-posix-acl.c',
|
||||
'9p-proxy.c',
|
||||
'9p-synth.c',
|
||||
'9p-xattr-user.c',
|
||||
'9p-xattr.c',
|
||||
|
|
|
@ -121,7 +121,7 @@ config MUSICPAL
|
|||
select MARVELL_88W8618
|
||||
select PTIMER
|
||||
select PFLASH_CFI02
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select WM8750
|
||||
|
||||
config NETDUINO2
|
||||
|
@ -150,7 +150,7 @@ config OMAP
|
|||
select NAND
|
||||
select PFLASH_CFI01
|
||||
select SD
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
|
||||
config REALVIEW
|
||||
bool
|
||||
|
@ -321,7 +321,7 @@ config ALLWINNER_A10
|
|||
select ALLWINNER_EMAC
|
||||
select ALLWINNER_I2C
|
||||
select AXP2XX_PMU
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select UNIMP
|
||||
select USB_OHCI_SYSBUS
|
||||
|
||||
|
@ -333,7 +333,7 @@ config ALLWINNER_H3
|
|||
select ALLWINNER_SUN8I_EMAC
|
||||
select ALLWINNER_I2C
|
||||
select ALLWINNER_WDT
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select ARM_TIMER
|
||||
select ARM_GIC
|
||||
select UNIMP
|
||||
|
@ -349,7 +349,7 @@ config ALLWINNER_R40
|
|||
select ALLWINNER_A10_PIT
|
||||
select ALLWINNER_WDT
|
||||
select AXP2XX_PMU
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select ARM_TIMER
|
||||
select ARM_GIC
|
||||
select UNIMP
|
||||
|
@ -464,7 +464,7 @@ config NPCM7XX
|
|||
select ISL_PMBUS_VR
|
||||
select PL310 # cache controller
|
||||
select PMBUS
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select SSI
|
||||
select UNIMP
|
||||
select PCA954X
|
||||
|
@ -486,7 +486,7 @@ config FSL_IMX31
|
|||
default y
|
||||
depends on TCG && ARM
|
||||
imply I2C_DEVICES
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select IMX
|
||||
select IMX_I2C
|
||||
select WDT_IMX2
|
||||
|
@ -515,7 +515,7 @@ config ASPEED_SOC
|
|||
select I2C
|
||||
select DPS310
|
||||
select PCA9552
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select SMBUS_EEPROM
|
||||
select PCA954X
|
||||
select SSI
|
||||
|
@ -603,7 +603,7 @@ config MSF2
|
|||
bool
|
||||
select ARM_V7M
|
||||
select PTIMER
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select SSI
|
||||
select UNIMP
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/module.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/arm/allwinner-a10.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include "qemu/units.h"
|
||||
#include "hw/qdev-core.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
#include "hw/usb/hcd-ehci.h"
|
||||
#include "hw/loader.h"
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include "hw/boards.h"
|
||||
#include "hw/qdev-core.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
#include "hw/usb/hcd-ehci.h"
|
||||
#include "hw/loader.h"
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include "qapi/error.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
#include "hw/arm/aspeed_soc.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "hw/i2c/aspeed_i2c.h"
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include "hw/qdev-properties.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
#include "hw/arm/aspeed_soc.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
|
||||
|
||||
const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include "exec/address-spaces.h"
|
||||
#include "net/net.h"
|
||||
#include "hw/net/lan9118.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "sysemu/qtest.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "qemu/cutils.h"
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include "qemu/units.h"
|
||||
#include "qapi/error.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/arm/msf2-soc.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
#include "hw/qdev-clock.h"
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "net/net.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "hw/ptimer.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include "hw/arm/boot.h"
|
||||
#include "hw/arm/npcm7xx.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/loader.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
#include "hw/qdev-clock.h"
|
||||
|
|
|
@ -21,6 +21,10 @@ config SERIAL_ISA
|
|||
depends on ISA_BUS
|
||||
select SERIAL
|
||||
|
||||
config SERIAL_MM
|
||||
bool
|
||||
select SERIAL
|
||||
|
||||
config SERIAL_PCI
|
||||
bool
|
||||
default y if PCI_DEVICES
|
||||
|
|
|
@ -13,6 +13,7 @@ system_ss.add(when: 'CONFIG_PL011', if_true: files('pl011.c'))
|
|||
system_ss.add(when: 'CONFIG_SCLPCONSOLE', if_true: files('sclpconsole.c', 'sclpconsole-lm.c'))
|
||||
system_ss.add(when: 'CONFIG_SERIAL', if_true: files('serial.c'))
|
||||
system_ss.add(when: 'CONFIG_SERIAL_ISA', if_true: files('serial-isa.c'))
|
||||
system_ss.add(when: 'CONFIG_SERIAL_MM', if_true: files('serial-mm.c'))
|
||||
system_ss.add(when: 'CONFIG_SERIAL_PCI', if_true: files('serial-pci.c'))
|
||||
system_ss.add(when: 'CONFIG_SERIAL_PCI_MULTI', if_true: files('serial-pci-multi.c'))
|
||||
system_ss.add(when: 'CONFIG_SHAKTI_UART', if_true: files('shakti_uart.c'))
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "chardev/char.h"
|
||||
#include "hw/arm/omap.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "exec/address-spaces.h"
|
||||
|
||||
/* UARTs */
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include "qapi/error.h"
|
||||
#include "qemu/log.h"
|
||||
#include "hw/char/riscv_htif.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "chardev/char.h"
|
||||
#include "chardev/char-fe.h"
|
||||
#include "qemu/timer.h"
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "sysemu/sysemu.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-isa.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "migration/vmstate.h"
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
* QEMU 16550A UART emulation
|
||||
*
|
||||
* Copyright (c) 2003-2004 Fabrice Bellard
|
||||
* Copyright (c) 2008 Citrix Systems, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "exec/cpu-common.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
|
||||
static uint64_t serial_mm_read(void *opaque, hwaddr addr, unsigned size)
|
||||
{
|
||||
SerialMM *s = SERIAL_MM(opaque);
|
||||
return serial_io_ops.read(&s->serial, addr >> s->regshift, 1);
|
||||
}
|
||||
|
||||
static void serial_mm_write(void *opaque, hwaddr addr,
|
||||
uint64_t value, unsigned size)
|
||||
{
|
||||
SerialMM *s = SERIAL_MM(opaque);
|
||||
value &= 255;
|
||||
serial_io_ops.write(&s->serial, addr >> s->regshift, value, 1);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps serial_mm_ops[3] = {
|
||||
[DEVICE_NATIVE_ENDIAN] = {
|
||||
.read = serial_mm_read,
|
||||
.write = serial_mm_write,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.valid.max_access_size = 8,
|
||||
.impl.max_access_size = 8,
|
||||
},
|
||||
[DEVICE_LITTLE_ENDIAN] = {
|
||||
.read = serial_mm_read,
|
||||
.write = serial_mm_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
.valid.max_access_size = 8,
|
||||
.impl.max_access_size = 8,
|
||||
},
|
||||
[DEVICE_BIG_ENDIAN] = {
|
||||
.read = serial_mm_read,
|
||||
.write = serial_mm_write,
|
||||
.endianness = DEVICE_BIG_ENDIAN,
|
||||
.valid.max_access_size = 8,
|
||||
.impl.max_access_size = 8,
|
||||
},
|
||||
};
|
||||
|
||||
static void serial_mm_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
SerialMM *smm = SERIAL_MM(dev);
|
||||
SerialState *s = &smm->serial;
|
||||
|
||||
if (!qdev_realize(DEVICE(s), NULL, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
memory_region_init_io(&s->io, OBJECT(dev),
|
||||
&serial_mm_ops[smm->endianness], smm, "serial",
|
||||
8 << smm->regshift);
|
||||
sysbus_init_mmio(SYS_BUS_DEVICE(smm), &s->io);
|
||||
sysbus_init_irq(SYS_BUS_DEVICE(smm), &smm->serial.irq);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_serial_mm = {
|
||||
.name = "serial",
|
||||
.version_id = 3,
|
||||
.minimum_version_id = 2,
|
||||
.fields = (const VMStateField[]) {
|
||||
VMSTATE_STRUCT(serial, SerialMM, 0, vmstate_serial, SerialState),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
SerialMM *serial_mm_init(MemoryRegion *address_space,
|
||||
hwaddr base, int regshift,
|
||||
qemu_irq irq, int baudbase,
|
||||
Chardev *chr, enum device_endian end)
|
||||
{
|
||||
SerialMM *smm = SERIAL_MM(qdev_new(TYPE_SERIAL_MM));
|
||||
MemoryRegion *mr;
|
||||
|
||||
qdev_prop_set_uint8(DEVICE(smm), "regshift", regshift);
|
||||
qdev_prop_set_uint32(DEVICE(smm), "baudbase", baudbase);
|
||||
qdev_prop_set_chr(DEVICE(smm), "chardev", chr);
|
||||
qdev_set_legacy_instance_id(DEVICE(smm), base, 2);
|
||||
qdev_prop_set_uint8(DEVICE(smm), "endianness", end);
|
||||
sysbus_realize_and_unref(SYS_BUS_DEVICE(smm), &error_fatal);
|
||||
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(smm), 0, irq);
|
||||
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(smm), 0);
|
||||
memory_region_add_subregion(address_space, base, mr);
|
||||
|
||||
return smm;
|
||||
}
|
||||
|
||||
static void serial_mm_instance_init(Object *o)
|
||||
{
|
||||
SerialMM *smm = SERIAL_MM(o);
|
||||
|
||||
object_initialize_child(o, "serial", &smm->serial, TYPE_SERIAL);
|
||||
|
||||
qdev_alias_all_properties(DEVICE(&smm->serial), o);
|
||||
}
|
||||
|
||||
static Property serial_mm_properties[] = {
|
||||
/*
|
||||
* Set the spacing between adjacent memory-mapped UART registers.
|
||||
* Each register will be at (1 << regshift) bytes after the previous one.
|
||||
*/
|
||||
DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
|
||||
DEFINE_PROP_UINT8("endianness", SerialMM, endianness, DEVICE_NATIVE_ENDIAN),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static void serial_mm_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
|
||||
device_class_set_props(dc, serial_mm_properties);
|
||||
dc->realize = serial_mm_realize;
|
||||
dc->vmsd = &vmstate_serial_mm;
|
||||
}
|
||||
|
||||
static const TypeInfo types[] = {
|
||||
{
|
||||
.name = TYPE_SERIAL_MM,
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.class_init = serial_mm_class_init,
|
||||
.instance_init = serial_mm_instance_init,
|
||||
.instance_size = sizeof(SerialMM),
|
||||
},
|
||||
};
|
||||
|
||||
DEFINE_TYPES(types)
|
126
hw/char/serial.c
126
hw/char/serial.c
|
@ -989,135 +989,9 @@ static const TypeInfo serial_info = {
|
|||
.class_init = serial_class_init,
|
||||
};
|
||||
|
||||
/* Memory mapped interface */
|
||||
static uint64_t serial_mm_read(void *opaque, hwaddr addr,
|
||||
unsigned size)
|
||||
{
|
||||
SerialMM *s = SERIAL_MM(opaque);
|
||||
return serial_ioport_read(&s->serial, addr >> s->regshift, 1);
|
||||
}
|
||||
|
||||
static void serial_mm_write(void *opaque, hwaddr addr,
|
||||
uint64_t value, unsigned size)
|
||||
{
|
||||
SerialMM *s = SERIAL_MM(opaque);
|
||||
value &= 255;
|
||||
serial_ioport_write(&s->serial, addr >> s->regshift, value, 1);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps serial_mm_ops[3] = {
|
||||
[DEVICE_NATIVE_ENDIAN] = {
|
||||
.read = serial_mm_read,
|
||||
.write = serial_mm_write,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.valid.max_access_size = 8,
|
||||
.impl.max_access_size = 8,
|
||||
},
|
||||
[DEVICE_LITTLE_ENDIAN] = {
|
||||
.read = serial_mm_read,
|
||||
.write = serial_mm_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
.valid.max_access_size = 8,
|
||||
.impl.max_access_size = 8,
|
||||
},
|
||||
[DEVICE_BIG_ENDIAN] = {
|
||||
.read = serial_mm_read,
|
||||
.write = serial_mm_write,
|
||||
.endianness = DEVICE_BIG_ENDIAN,
|
||||
.valid.max_access_size = 8,
|
||||
.impl.max_access_size = 8,
|
||||
},
|
||||
};
|
||||
|
||||
static void serial_mm_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
SerialMM *smm = SERIAL_MM(dev);
|
||||
SerialState *s = &smm->serial;
|
||||
|
||||
if (!qdev_realize(DEVICE(s), NULL, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
memory_region_init_io(&s->io, OBJECT(dev),
|
||||
&serial_mm_ops[smm->endianness], smm, "serial",
|
||||
8 << smm->regshift);
|
||||
sysbus_init_mmio(SYS_BUS_DEVICE(smm), &s->io);
|
||||
sysbus_init_irq(SYS_BUS_DEVICE(smm), &smm->serial.irq);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_serial_mm = {
|
||||
.name = "serial",
|
||||
.version_id = 3,
|
||||
.minimum_version_id = 2,
|
||||
.fields = (const VMStateField[]) {
|
||||
VMSTATE_STRUCT(serial, SerialMM, 0, vmstate_serial, SerialState),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
SerialMM *serial_mm_init(MemoryRegion *address_space,
|
||||
hwaddr base, int regshift,
|
||||
qemu_irq irq, int baudbase,
|
||||
Chardev *chr, enum device_endian end)
|
||||
{
|
||||
SerialMM *smm = SERIAL_MM(qdev_new(TYPE_SERIAL_MM));
|
||||
MemoryRegion *mr;
|
||||
|
||||
qdev_prop_set_uint8(DEVICE(smm), "regshift", regshift);
|
||||
qdev_prop_set_uint32(DEVICE(smm), "baudbase", baudbase);
|
||||
qdev_prop_set_chr(DEVICE(smm), "chardev", chr);
|
||||
qdev_set_legacy_instance_id(DEVICE(smm), base, 2);
|
||||
qdev_prop_set_uint8(DEVICE(smm), "endianness", end);
|
||||
sysbus_realize_and_unref(SYS_BUS_DEVICE(smm), &error_fatal);
|
||||
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(smm), 0, irq);
|
||||
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(smm), 0);
|
||||
memory_region_add_subregion(address_space, base, mr);
|
||||
|
||||
return smm;
|
||||
}
|
||||
|
||||
static void serial_mm_instance_init(Object *o)
|
||||
{
|
||||
SerialMM *smm = SERIAL_MM(o);
|
||||
|
||||
object_initialize_child(o, "serial", &smm->serial, TYPE_SERIAL);
|
||||
|
||||
qdev_alias_all_properties(DEVICE(&smm->serial), o);
|
||||
}
|
||||
|
||||
static Property serial_mm_properties[] = {
|
||||
/*
|
||||
* Set the spacing between adjacent memory-mapped UART registers.
|
||||
* Each register will be at (1 << regshift) bytes after the
|
||||
* previous one.
|
||||
*/
|
||||
DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
|
||||
DEFINE_PROP_UINT8("endianness", SerialMM, endianness, DEVICE_NATIVE_ENDIAN),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static void serial_mm_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
|
||||
device_class_set_props(dc, serial_mm_properties);
|
||||
dc->realize = serial_mm_realize;
|
||||
dc->vmsd = &vmstate_serial_mm;
|
||||
}
|
||||
|
||||
static const TypeInfo serial_mm_info = {
|
||||
.name = TYPE_SERIAL_MM,
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.class_init = serial_mm_class_init,
|
||||
.instance_init = serial_mm_instance_init,
|
||||
.instance_size = sizeof(SerialMM),
|
||||
};
|
||||
|
||||
static void serial_register_types(void)
|
||||
{
|
||||
type_register_static(&serial_info);
|
||||
type_register_static(&serial_mm_info);
|
||||
}
|
||||
|
||||
type_init(serial_register_types)
|
||||
|
|
|
@ -73,7 +73,7 @@ config SM501
|
|||
bool
|
||||
select I2C
|
||||
select DDC
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select USB_OHCI_SYSBUS
|
||||
|
||||
config TCX
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include "qemu/log.h"
|
||||
#include "qemu/module.h"
|
||||
#include "hw/usb/hcd-ohci.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "ui/console.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "migration/vmstate.h"
|
||||
|
|
|
@ -9,7 +9,7 @@ config HPPA_B160L
|
|||
select ASTRO
|
||||
select DINO
|
||||
select LASI
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select SERIAL_PCI
|
||||
select ISA_BUS
|
||||
select I8259
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include "sysemu/runstate.h"
|
||||
#include "hw/rtc/mc146818rtc.h"
|
||||
#include "hw/timer/i8254.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/char/parallel.h"
|
||||
#include "hw/intc/i8259.h"
|
||||
#include "hw/input/lasips2.h"
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include "qemu/cutils.h"
|
||||
#include "qapi/error.h"
|
||||
#include "sysemu/device_tree.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-isa.h"
|
||||
#include "hw/i386/fw_cfg.h"
|
||||
#include "hw/rtc/mc146818rtc.h"
|
||||
#include "hw/sysbus.h"
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include "hw/intc/i8259.h"
|
||||
#include "hw/timer/i8254.h"
|
||||
#include "hw/rtc/mc146818rtc.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-isa.h"
|
||||
#include "hw/display/ramfb.h"
|
||||
#include "hw/i386/topology.h"
|
||||
#include "hw/i386/e820_memory_layout.h"
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "qemu/units.h"
|
||||
#include "hw/i386/pc.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-isa.h"
|
||||
#include "hw/char/parallel.h"
|
||||
#include "hw/hyperv/hv-balloon.h"
|
||||
#include "hw/i386/fw_cfg.h"
|
||||
|
@ -1823,6 +1823,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
|||
|
||||
object_class_property_add_bool(oc, PC_MACHINE_I8042,
|
||||
pc_machine_get_i8042, pc_machine_set_i8042);
|
||||
object_class_property_set_description(oc, PC_MACHINE_I8042,
|
||||
"Enable/disable Intel 8042 PS/2 controller emulation");
|
||||
|
||||
object_class_property_add_bool(oc, "default-bus-bypass-iommu",
|
||||
pc_machine_get_default_bus_bypass_iommu,
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include "hw/qdev-properties.h"
|
||||
#include "hw/input/i8042.h"
|
||||
#include "hw/char/parallel-isa.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-isa.h"
|
||||
#include "trace.h"
|
||||
|
||||
static void isa_superio_realize(DeviceState *dev, Error **errp)
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include "hw/isa/vt82c686.h"
|
||||
#include "hw/block/fdc.h"
|
||||
#include "hw/char/parallel-isa.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-isa.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/ide/pci.h"
|
||||
|
|
|
@ -8,7 +8,7 @@ config LOONGARCH_VIRT
|
|||
imply PCI_DEVICES
|
||||
imply NVDIMM
|
||||
imply TPM_TIS_SYSBUS
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select VIRTIO_PCI
|
||||
select PLATFORM_BUS
|
||||
select LOONGARCH_IPI
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include "qemu/datadir.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "sysemu/tcg.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
|
|
|
@ -13,7 +13,7 @@ config PETALOGIX_ML605
|
|||
default y
|
||||
depends on MICROBLAZE
|
||||
select PFLASH_CFI01
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select SSI_M25P80
|
||||
select XILINX
|
||||
select XILINX_AXI
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include "hw/block/flash.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "hw/ssi/ssi.h"
|
||||
|
|
|
@ -10,14 +10,14 @@ config MALTA
|
|||
select MIPS_CPS
|
||||
select PIIX
|
||||
select PFLASH_CFI01
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select SMBUS_EEPROM
|
||||
|
||||
config MIPSSIM
|
||||
bool
|
||||
default y
|
||||
depends on MIPS
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select MIPSNET
|
||||
|
||||
config JAZZ
|
||||
|
@ -37,7 +37,7 @@ config JAZZ
|
|||
select FDC_SYSBUS
|
||||
select MC146818RTC
|
||||
select PCKBD
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select PARALLEL
|
||||
select DS1225Y
|
||||
select JAZZ_LED
|
||||
|
@ -65,7 +65,7 @@ config LOONGSON3V
|
|||
imply VIRTIO_VGA
|
||||
imply QXL if SPICE
|
||||
imply USB_OHCI_PCI
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select GOLDFISH_RTC
|
||||
select LOONGSON_IPI
|
||||
select LOONGSON_LIOINTC
|
||||
|
@ -89,7 +89,7 @@ config MIPS_BOSTON
|
|||
select MIPS_CPS
|
||||
select PCI_EXPRESS_XILINX
|
||||
select AHCI_ICH9
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
|
||||
config FW_CFG_MIPS
|
||||
bool
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
#include "elf.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/ide/pci.h"
|
||||
#include "hw/ide/ahci-pci.h"
|
||||
#include "hw/loader.h"
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include "hw/mips/mips.h"
|
||||
#include "hw/intc/i8259.h"
|
||||
#include "hw/dma/i8257.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/char/parallel.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/block/fdc.h"
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include "qemu/datadir.h"
|
||||
#include "qapi/error.h"
|
||||
#include "elf.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/intc/loongson_liointc.h"
|
||||
#include "hw/mips/mips.h"
|
||||
#include "hw/mips/fw_cfg.h"
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#include "hw/clock.h"
|
||||
#include "hw/southbridge/piix.h"
|
||||
#include "hw/isa/superio.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "net/net.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/i2c/smbus_eeprom.h"
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#include "exec/address-spaces.h"
|
||||
#include "hw/clock.h"
|
||||
#include "hw/mips/mips.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "net/net.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "hw/boards.h"
|
||||
|
|
|
@ -3,7 +3,7 @@ config OR1K_SIM
|
|||
default y
|
||||
depends on OPENRISC
|
||||
select DEVICE_TREE
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select OPENCORES_ETH
|
||||
select OMPIC
|
||||
select SPLIT_IRQ
|
||||
|
@ -19,6 +19,6 @@ config OR1K_VIRT
|
|||
select PCI
|
||||
select PCI_EXPRESS_GENERIC_BRIDGE
|
||||
select GOLDFISH_RTC
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select SIFIVE_TEST
|
||||
select VIRTIO_MMIO
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include "cpu.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "net/net.h"
|
||||
#include "hw/openrisc/boot.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#include "exec/address-spaces.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/core/split-irq.h"
|
||||
#include "hw/openrisc/boot.h"
|
||||
#include "hw/misc/sifive_test.h"
|
||||
|
|
|
@ -51,7 +51,7 @@ config PPC405
|
|||
select M48T59
|
||||
select PFLASH_CFI02
|
||||
select PPC4XX
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
|
||||
config PPC440
|
||||
bool
|
||||
|
@ -63,7 +63,7 @@ config PPC440
|
|||
select PCI_EXPRESS
|
||||
select PPC440_PCIX
|
||||
select PPC4XX
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select FDT_PPC
|
||||
|
||||
config PPC4XX
|
||||
|
@ -80,7 +80,7 @@ config SAM460EX
|
|||
select IDE_SII3112
|
||||
select M41T80
|
||||
select PPC440
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select SM501
|
||||
select SMBUS_EEPROM
|
||||
select USB_EHCI_SYSBUS
|
||||
|
@ -163,7 +163,7 @@ config E500
|
|||
select PLATFORM_BUS
|
||||
select PPCE500_PCI
|
||||
select SDHCI
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select MPC_I2C
|
||||
select FDT_PPC
|
||||
select DS1338
|
||||
|
@ -187,7 +187,7 @@ config VIRTEX
|
|||
depends on PPC && FDT
|
||||
select PPC4XX
|
||||
select PFLASH_CFI01
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select XILINX
|
||||
select XILINX_ETHLITE
|
||||
select FDT_PPC
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include "net/net.h"
|
||||
#include "qemu/config-file.h"
|
||||
#include "hw/block/flash.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "sysemu/block-backend-io.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
#include "hw/ppc/pnv_pnor.h"
|
||||
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-isa.h"
|
||||
#include "hw/rtc/mc146818rtc.h"
|
||||
|
||||
#include <libfdt.h>
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include "hw/irq.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "ppc405.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include "sysemu/device_tree.h"
|
||||
#include "hw/loader.h"
|
||||
#include "elf.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/ppc/ppc.h"
|
||||
#include "hw/pci-host/ppc4xx.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/rtc/m48t59.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/block/fdc.h"
|
||||
#include "net/net.h"
|
||||
#include "hw/isa/isa.h"
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/i2c/ppc4xx_i2c.h"
|
||||
#include "hw/i2c/smbus_eeprom.h"
|
||||
#include "hw/ide/pci.h"
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include "exec/page-protection.h"
|
||||
#include "cpu.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/block/flash.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/reset.h"
|
||||
|
|
|
@ -44,7 +44,7 @@ config RISCV_VIRT
|
|||
select PCI
|
||||
select PCI_EXPRESS_GENERIC_BRIDGE
|
||||
select PFLASH_CFI01
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
select RISCV_ACLINT
|
||||
select RISCV_APLIC
|
||||
select RISCV_IMSIC
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include "hw/boards.h"
|
||||
#include "hw/loader.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
#include "target/riscv/cpu.h"
|
||||
#include "hw/riscv/riscv_hart.h"
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
#include "hw/irq.h"
|
||||
#include "hw/loader.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/cpu/cluster.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
#include "hw/sd/sd.h"
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include "hw/loader.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "target/riscv/cpu.h"
|
||||
#include "hw/core/sysbus-fdt.h"
|
||||
#include "target/riscv/pmu.h"
|
||||
|
|
|
@ -10,6 +10,7 @@ config SUN4U
|
|||
select ISA_BUS
|
||||
select FDC_ISA
|
||||
select SERIAL_ISA
|
||||
select SERIAL_MM
|
||||
select PCI_SABRE
|
||||
select IDE_CMD646
|
||||
select PCKBD
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include "qemu/units.h"
|
||||
#include "cpu.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
#include "hw/loader.h"
|
||||
#include "hw/sparc/sparc64.h"
|
||||
|
|
|
@ -34,7 +34,8 @@
|
|||
#include "hw/pci/pci_host.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/pci-host/sabre.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-isa.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/char/parallel-isa.h"
|
||||
#include "hw/rtc/m48t59.h"
|
||||
#include "migration/vmstate.h"
|
||||
|
|
|
@ -18,4 +18,4 @@ config XTENSA_XTFPGA
|
|||
select DEVICE_TREE
|
||||
select OPENCORES_ETH
|
||||
select PFLASH_CFI01
|
||||
select SERIAL
|
||||
select SERIAL_MM
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include "hw/qdev-properties.h"
|
||||
#include "elf.h"
|
||||
#include "exec/memory.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "net/net.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/block/flash.h"
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include "hw/misc/unimp.h"
|
||||
#include "hw/misc/aspeed_peci.h"
|
||||
#include "hw/fsi/aspeed_apb2opb.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
#include "hw/intc/arm_gicv3.h"
|
||||
|
||||
#define ASPEED_SPIS_NUM 2
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#define HW_MCHP_PFSOC_MMUART_H
|
||||
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/char/serial-mm.h"
|
||||
|
||||
#define MCHP_PFSOC_MMUART_REG_COUNT 13
|
||||
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* QEMU ISA 16550A UART emulation
|
||||
*
|
||||
* Copyright (c) 2003-2004 Fabrice Bellard
|
||||
* Copyright (c) 2008 Citrix Systems, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef HW_SERIAL_ISA_H
|
||||
#define HW_SERIAL_ISA_H
|
||||
|
||||
#include "hw/isa/isa.h"
|
||||
|
||||
#define MAX_ISA_SERIAL_PORTS 4
|
||||
|
||||
#define TYPE_ISA_SERIAL "isa-serial"
|
||||
void serial_hds_isa_init(ISABus *bus, int from, int to);
|
||||
void isa_serial_set_iobase(ISADevice *serial, hwaddr iobase);
|
||||
void isa_serial_set_enabled(ISADevice *serial, bool enabled);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* QEMU 16550A UART emulation
|
||||
*
|
||||
* Copyright (c) 2003-2004 Fabrice Bellard
|
||||
* Copyright (c) 2008 Citrix Systems, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef HW_SERIAL_MM_H
|
||||
#define HW_SERIAL_MM_H
|
||||
|
||||
#include "hw/char/serial.h"
|
||||
#include "exec/memory.h"
|
||||
#include "chardev/char.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define TYPE_SERIAL_MM "serial-mm"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(SerialMM, SERIAL_MM)
|
||||
|
||||
struct SerialMM {
|
||||
SysBusDevice parent;
|
||||
|
||||
SerialState serial;
|
||||
|
||||
uint8_t regshift;
|
||||
uint8_t endianness;
|
||||
};
|
||||
|
||||
SerialMM *serial_mm_init(MemoryRegion *address_space,
|
||||
hwaddr base, int regshift,
|
||||
qemu_irq irq, int baudbase,
|
||||
Chardev *chr, enum device_endian end);
|
||||
|
||||
#endif
|
|
@ -29,8 +29,6 @@
|
|||
#include "chardev/char-fe.h"
|
||||
#include "exec/memory.h"
|
||||
#include "qemu/fifo8.h"
|
||||
#include "chardev/char.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define UART_FIFO_LENGTH 16 /* 16550A Fifo Length */
|
||||
|
@ -81,36 +79,10 @@ struct SerialState {
|
|||
};
|
||||
typedef struct SerialState SerialState;
|
||||
|
||||
struct SerialMM {
|
||||
SysBusDevice parent;
|
||||
|
||||
SerialState serial;
|
||||
|
||||
uint8_t regshift;
|
||||
uint8_t endianness;
|
||||
};
|
||||
|
||||
extern const VMStateDescription vmstate_serial;
|
||||
extern const MemoryRegionOps serial_io_ops;
|
||||
|
||||
#define TYPE_SERIAL "serial"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(SerialState, SERIAL)
|
||||
|
||||
#define TYPE_SERIAL_MM "serial-mm"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(SerialMM, SERIAL_MM)
|
||||
|
||||
SerialMM *serial_mm_init(MemoryRegion *address_space,
|
||||
hwaddr base, int regshift,
|
||||
qemu_irq irq, int baudbase,
|
||||
Chardev *chr, enum device_endian end);
|
||||
|
||||
/* serial-isa.c */
|
||||
|
||||
#define MAX_ISA_SERIAL_PORTS 4
|
||||
|
||||
#define TYPE_ISA_SERIAL "isa-serial"
|
||||
void serial_hds_isa_init(ISABus *bus, int from, int to);
|
||||
void isa_serial_set_iobase(ISADevice *serial, hwaddr iobase);
|
||||
void isa_serial_set_enabled(ISADevice *serial, bool enabled);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1569,8 +1569,8 @@ char *object_get_canonical_path(const Object *obj);
|
|||
/**
|
||||
* object_resolve_path:
|
||||
* @path: the path to resolve
|
||||
* @ambiguous: returns true if the path resolution failed because of an
|
||||
* ambiguous match
|
||||
* @ambiguous: (out) (optional): location to store whether the lookup failed
|
||||
* because it was ambiguous, or %NULL. Set to %false on success.
|
||||
*
|
||||
* There are two types of supported paths--absolute paths and partial paths.
|
||||
*
|
||||
|
@ -1587,7 +1587,7 @@ char *object_get_canonical_path(const Object *obj);
|
|||
* only one match is found. If more than one match is found, a flag is
|
||||
* returned to indicate that the match was ambiguous.
|
||||
*
|
||||
* Returns: The matched object or NULL on path lookup failure.
|
||||
* Returns: The matched object or %NULL on path lookup failure.
|
||||
*/
|
||||
Object *object_resolve_path(const char *path, bool *ambiguous);
|
||||
|
||||
|
@ -1595,10 +1595,10 @@ Object *object_resolve_path(const char *path, bool *ambiguous);
|
|||
* object_resolve_path_type:
|
||||
* @path: the path to resolve
|
||||
* @typename: the type to look for.
|
||||
* @ambiguous: returns true if the path resolution failed because of an
|
||||
* ambiguous match
|
||||
* @ambiguous: (out) (optional): location to store whether the lookup failed
|
||||
* because it was ambiguous, or %NULL. Set to %false on success.
|
||||
*
|
||||
* This is similar to object_resolve_path. However, when looking for a
|
||||
* This is similar to object_resolve_path(). However, when looking for a
|
||||
* partial path only matches that implement the given type are considered.
|
||||
* This restricts the search and avoids spuriously flagging matches as
|
||||
* ambiguous.
|
||||
|
|
|
@ -359,7 +359,7 @@ int kvm_arch_handle_exit(CPUState *cpu, struct kvm_run *run);
|
|||
|
||||
int kvm_arch_process_async_events(CPUState *cpu);
|
||||
|
||||
int kvm_arch_get_registers(CPUState *cpu);
|
||||
int kvm_arch_get_registers(CPUState *cpu, Error **errp);
|
||||
|
||||
/* state subset only touched by the VCPU itself during runtime */
|
||||
#define KVM_PUT_RUNTIME_STATE 1
|
||||
|
@ -368,7 +368,7 @@ int kvm_arch_get_registers(CPUState *cpu);
|
|||
/* full state set, modified during initialization or on vmload */
|
||||
#define KVM_PUT_FULL_STATE 3
|
||||
|
||||
int kvm_arch_put_registers(CPUState *cpu, int level);
|
||||
int kvm_arch_put_registers(CPUState *cpu, int level, Error **errp);
|
||||
|
||||
int kvm_arch_get_default_type(MachineState *ms);
|
||||
|
||||
|
|
|
@ -2219,13 +2219,6 @@ have_virtfs = get_option('virtfs') \
|
|||
.disable_auto_if(not have_tools and not have_system) \
|
||||
.allowed()
|
||||
|
||||
have_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \
|
||||
.require(host_os != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \
|
||||
.require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \
|
||||
.disable_auto_if(not have_tools) \
|
||||
.require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \
|
||||
.allowed()
|
||||
|
||||
qga_fsfreeze = false
|
||||
qga_fstrim = false
|
||||
if host_os == 'linux'
|
||||
|
@ -4420,7 +4413,6 @@ if have_block
|
|||
summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
|
||||
summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
|
||||
summary_info += {'VirtFS (9P) support': have_virtfs}
|
||||
summary_info += {'VirtFS (9P) Proxy Helper support (deprecated)': have_virtfs_proxy_helper}
|
||||
summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
|
||||
summary_info += {'bochs support': get_option('bochs').allowed()}
|
||||
summary_info += {'cloop support': get_option('cloop').allowed()}
|
||||
|
|
|
@ -305,8 +305,6 @@ option('vhost_user_blk_server', type: 'feature', value: 'auto',
|
|||
description: 'build vhost-user-blk server')
|
||||
option('virtfs', type: 'feature', value: 'auto',
|
||||
description: 'virtio-9p support')
|
||||
option('virtfs_proxy_helper', type: 'feature', value: 'auto',
|
||||
description: 'virtio-9p proxy helper support')
|
||||
option('libvduse', type: 'feature', value: 'auto',
|
||||
description: 'build VDUSE Library')
|
||||
option('vduse_blk_export', type: 'feature', value: 'auto',
|
||||
|
|
|
@ -1766,29 +1766,18 @@ DEF("fsdev", HAS_ARG, QEMU_OPTION_fsdev,
|
|||
" [[,throttling.bps-total-max=bm]|[[,throttling.bps-read-max=rm][,throttling.bps-write-max=wm]]]\n"
|
||||
" [[,throttling.iops-total-max=im]|[[,throttling.iops-read-max=irm][,throttling.iops-write-max=iwm]]]\n"
|
||||
" [[,throttling.iops-size=is]]\n"
|
||||
"-fsdev proxy,id=id,socket=socket[,writeout=immediate][,readonly=on]\n"
|
||||
"-fsdev proxy,id=id,sock_fd=sock_fd[,writeout=immediate][,readonly=on]\n"
|
||||
"-fsdev synth,id=id\n",
|
||||
QEMU_ARCH_ALL)
|
||||
|
||||
SRST
|
||||
``-fsdev local,id=id,path=path,security_model=security_model [,writeout=writeout][,readonly=on][,fmode=fmode][,dmode=dmode] [,throttling.option=value[,throttling.option=value[,...]]]``
|
||||
\
|
||||
``-fsdev proxy,id=id,socket=socket[,writeout=writeout][,readonly=on]``
|
||||
\
|
||||
``-fsdev proxy,id=id,sock_fd=sock_fd[,writeout=writeout][,readonly=on]``
|
||||
\
|
||||
``-fsdev synth,id=id[,readonly=on]``
|
||||
Define a new file system device. Valid options are:
|
||||
|
||||
``local``
|
||||
Accesses to the filesystem are done by QEMU.
|
||||
|
||||
``proxy``
|
||||
Accesses to the filesystem are done by virtfs-proxy-helper(1). This
|
||||
option is deprecated (since QEMU 8.1) and will be removed in a future
|
||||
version of QEMU. Use ``local`` instead.
|
||||
|
||||
``synth``
|
||||
Synthetic filesystem, only used by QTests.
|
||||
|
||||
|
@ -1813,8 +1802,6 @@ SRST
|
|||
security model is same as passthrough except the sever won't
|
||||
report failures if it fails to set file attributes like
|
||||
ownership. Security model is mandatory only for local fsdriver.
|
||||
Other fsdrivers (like proxy) don't take security model as a
|
||||
parameter.
|
||||
|
||||
``writeout=writeout``
|
||||
This is an optional argument. The only supported value is
|
||||
|
@ -1827,16 +1814,6 @@ SRST
|
|||
Enables exporting 9p share as a readonly mount for guests. By
|
||||
default read-write access is given.
|
||||
|
||||
``socket=socket``
|
||||
Enables proxy filesystem driver to use passed socket file for
|
||||
communicating with virtfs-proxy-helper(1).
|
||||
|
||||
``sock_fd=sock_fd``
|
||||
Enables proxy filesystem driver to use passed socket descriptor
|
||||
for communicating with virtfs-proxy-helper(1). Usually a helper
|
||||
like libvirt will create socketpair and pass one of the fds as
|
||||
sock\_fd.
|
||||
|
||||
``fmode=fmode``
|
||||
Specifies the default mode for newly created files on the host.
|
||||
Works only with security models "mapped-xattr" and
|
||||
|
@ -1889,18 +1866,12 @@ ERST
|
|||
DEF("virtfs", HAS_ARG, QEMU_OPTION_virtfs,
|
||||
"-virtfs local,path=path,mount_tag=tag,security_model=mapped-xattr|mapped-file|passthrough|none\n"
|
||||
" [,id=id][,writeout=immediate][,readonly=on][,fmode=fmode][,dmode=dmode][,multidevs=remap|forbid|warn]\n"
|
||||
"-virtfs proxy,mount_tag=tag,socket=socket[,id=id][,writeout=immediate][,readonly=on]\n"
|
||||
"-virtfs proxy,mount_tag=tag,sock_fd=sock_fd[,id=id][,writeout=immediate][,readonly=on]\n"
|
||||
"-virtfs synth,mount_tag=tag[,id=id][,readonly=on]\n",
|
||||
QEMU_ARCH_ALL)
|
||||
|
||||
SRST
|
||||
``-virtfs local,path=path,mount_tag=mount_tag ,security_model=security_model[,writeout=writeout][,readonly=on] [,fmode=fmode][,dmode=dmode][,multidevs=multidevs]``
|
||||
\
|
||||
``-virtfs proxy,socket=socket,mount_tag=mount_tag [,writeout=writeout][,readonly=on]``
|
||||
\
|
||||
``-virtfs proxy,sock_fd=sock_fd,mount_tag=mount_tag [,writeout=writeout][,readonly=on]``
|
||||
\
|
||||
``-virtfs synth,mount_tag=mount_tag``
|
||||
Define a new virtual filesystem device and expose it to the guest using
|
||||
a virtio-9p-device (a.k.a. 9pfs), which essentially means that a certain
|
||||
|
@ -1917,11 +1888,6 @@ SRST
|
|||
``local``
|
||||
Accesses to the filesystem are done by QEMU.
|
||||
|
||||
``proxy``
|
||||
Accesses to the filesystem are done by virtfs-proxy-helper(1).
|
||||
This option is deprecated (since QEMU 8.1) and will be removed in a
|
||||
future version of QEMU. Use ``local`` instead.
|
||||
|
||||
``synth``
|
||||
Synthetic filesystem, only used by QTests.
|
||||
|
||||
|
@ -1946,8 +1912,6 @@ SRST
|
|||
security model is same as passthrough except the sever won't
|
||||
report failures if it fails to set file attributes like
|
||||
ownership. Security model is mandatory only for local fsdriver.
|
||||
Other fsdrivers (like proxy) don't take security model as a
|
||||
parameter.
|
||||
|
||||
``writeout=writeout``
|
||||
This is an optional argument. The only supported value is
|
||||
|
@ -1960,16 +1924,6 @@ SRST
|
|||
Enables exporting 9p share as a readonly mount for guests. By
|
||||
default read-write access is given.
|
||||
|
||||
``socket=socket``
|
||||
Enables proxy filesystem driver to use passed socket file for
|
||||
communicating with virtfs-proxy-helper(1). Usually a helper like
|
||||
libvirt will create socketpair and pass one of the fds as
|
||||
sock\_fd.
|
||||
|
||||
``sock_fd``
|
||||
Enables proxy filesystem driver to use passed 'sock\_fd' as the
|
||||
socket descriptor for interfacing with virtfs-proxy-helper(1).
|
||||
|
||||
``fmode=fmode``
|
||||
Specifies the default mode for newly created files on the host.
|
||||
Works only with security models "mapped-xattr" and
|
||||
|
|
13
qom/object.c
13
qom/object.c
|
@ -2184,7 +2184,7 @@ static Object *object_resolve_partial_path(Object *parent,
|
|||
}
|
||||
|
||||
Object *object_resolve_path_type(const char *path, const char *typename,
|
||||
bool *ambiguousp)
|
||||
bool *ambiguous)
|
||||
{
|
||||
Object *obj;
|
||||
char **parts;
|
||||
|
@ -2193,14 +2193,17 @@ Object *object_resolve_path_type(const char *path, const char *typename,
|
|||
assert(parts);
|
||||
|
||||
if (parts[0] == NULL || strcmp(parts[0], "") != 0) {
|
||||
bool ambiguous = false;
|
||||
bool ambig = false;
|
||||
obj = object_resolve_partial_path(object_get_root(), parts,
|
||||
typename, &ambiguous);
|
||||
if (ambiguousp) {
|
||||
*ambiguousp = ambiguous;
|
||||
typename, &ambig);
|
||||
if (ambiguous) {
|
||||
*ambiguous = ambig;
|
||||
}
|
||||
} else {
|
||||
obj = object_resolve_abs_path(object_get_root(), parts + 1, typename);
|
||||
if (ambiguous) {
|
||||
*ambiguous = false;
|
||||
}
|
||||
}
|
||||
|
||||
g_strfreev(parts);
|
||||
|
|
|
@ -208,8 +208,6 @@ meson_options_help() {
|
|||
printf "%s\n" ' vhost-vdpa vhost-vdpa kernel backend support'
|
||||
printf "%s\n" ' virglrenderer virgl rendering support'
|
||||
printf "%s\n" ' virtfs virtio-9p support'
|
||||
printf "%s\n" ' virtfs-proxy-helper'
|
||||
printf "%s\n" ' virtio-9p proxy helper support'
|
||||
printf "%s\n" ' vmdk vmdk image format support'
|
||||
printf "%s\n" ' vmnet vmnet.framework network backend support'
|
||||
printf "%s\n" ' vnc VNC server'
|
||||
|
@ -539,8 +537,6 @@ _meson_option_parse() {
|
|||
--disable-virglrenderer) printf "%s" -Dvirglrenderer=disabled ;;
|
||||
--enable-virtfs) printf "%s" -Dvirtfs=enabled ;;
|
||||
--disable-virtfs) printf "%s" -Dvirtfs=disabled ;;
|
||||
--enable-virtfs-proxy-helper) printf "%s" -Dvirtfs_proxy_helper=enabled ;;
|
||||
--disable-virtfs-proxy-helper) printf "%s" -Dvirtfs_proxy_helper=disabled ;;
|
||||
--enable-vmdk) printf "%s" -Dvmdk=enabled ;;
|
||||
--disable-vmdk) printf "%s" -Dvmdk=disabled ;;
|
||||
--enable-vmnet) printf "%s" -Dvmnet=enabled ;;
|
||||
|
|
|
@ -112,7 +112,7 @@ class KconfigData:
|
|||
def set_value(self, val, clause):
|
||||
self.clauses_for_var.append(clause)
|
||||
if self.has_value() and self.value != val:
|
||||
print("The following clauses were found for " + self.name)
|
||||
print("The following clauses were found for " + self.name, file=sys.stderr)
|
||||
for i in self.clauses_for_var:
|
||||
print(" " + str(i), file=sys.stderr)
|
||||
raise KconfigDataError('contradiction between clauses when setting %s' % self)
|
||||
|
|
|
@ -2042,7 +2042,7 @@ static int kvm_arch_put_sve(CPUState *cs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int kvm_arch_put_registers(CPUState *cs, int level)
|
||||
int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
|
||||
{
|
||||
uint64_t val;
|
||||
uint32_t fpr;
|
||||
|
@ -2226,7 +2226,7 @@ static int kvm_arch_get_sve(CPUState *cs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int kvm_arch_get_registers(CPUState *cs)
|
||||
int kvm_arch_get_registers(CPUState *cs, Error **errp)
|
||||
{
|
||||
uint64_t val;
|
||||
unsigned int el;
|
||||
|
|
|
@ -1221,8 +1221,8 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
|||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, "sbpb",
|
||||
"ibpb-brtype", NULL, NULL, NULL,
|
||||
},
|
||||
.cpuid = { .eax = 0x80000021, .reg = R_EAX, },
|
||||
.tcg_features = 0,
|
||||
|
@ -1435,7 +1435,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
|||
"vmx-exit-save-efer", "vmx-exit-load-efer",
|
||||
"vmx-exit-save-preemption-timer", "vmx-exit-clear-bndcfgs",
|
||||
NULL, "vmx-exit-clear-rtit-ctl", NULL, NULL,
|
||||
NULL, "vmx-exit-load-pkrs", NULL, NULL,
|
||||
NULL, "vmx-exit-load-pkrs", NULL, "vmx-exit-secondary-ctls",
|
||||
},
|
||||
.msr = {
|
||||
.index = MSR_IA32_VMX_TRUE_EXIT_CTLS,
|
||||
|
@ -1450,7 +1450,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
|||
NULL, "vmx-entry-ia32e-mode", NULL, NULL,
|
||||
NULL, "vmx-entry-load-perf-global-ctrl", "vmx-entry-load-pat", "vmx-entry-load-efer",
|
||||
"vmx-entry-load-bndcfgs", NULL, "vmx-entry-load-rtit-ctl", NULL,
|
||||
NULL, NULL, "vmx-entry-load-pkrs", NULL,
|
||||
NULL, NULL, "vmx-entry-load-pkrs", "vmx-entry-load-fred",
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
},
|
||||
|
|
|
@ -267,12 +267,6 @@ typedef enum X86Seg {
|
|||
#define CR4_FRED_MASK 0
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_X86_64
|
||||
#define CR4_FRED_MASK (1ULL << 32)
|
||||
#else
|
||||
#define CR4_FRED_MASK 0
|
||||
#endif
|
||||
|
||||
#define CR4_RESERVED_MASK \
|
||||
(~(target_ulong)(CR4_VME_MASK | CR4_PVI_MASK | CR4_TSD_MASK \
|
||||
| CR4_DE_MASK | CR4_PSE_MASK | CR4_PAE_MASK \
|
||||
|
@ -1192,6 +1186,7 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w);
|
|||
#define VMX_VM_EXIT_PT_CONCEAL_PIP 0x01000000
|
||||
#define VMX_VM_EXIT_CLEAR_IA32_RTIT_CTL 0x02000000
|
||||
#define VMX_VM_EXIT_LOAD_IA32_PKRS 0x20000000
|
||||
#define VMX_VM_EXIT_ACTIVATE_SECONDARY_CONTROLS 0x80000000
|
||||
|
||||
#define VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS 0x00000004
|
||||
#define VMX_VM_ENTRY_IA32E_MODE 0x00000200
|
||||
|
|
|
@ -81,6 +81,16 @@
|
|||
do { } while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* On older Intel CPUs, KVM uses vm86 mode to emulate 16-bit code directly.
|
||||
* In order to use vm86 mode, an EPT identity map and a TSS are needed.
|
||||
* Since these must be part of guest physical memory, we need to allocate
|
||||
* them, both by setting their start addresses in the kernel and by
|
||||
* creating a corresponding e820 entry. We need 4 pages before the BIOS,
|
||||
* so this value allows up to 16M BIOSes.
|
||||
*/
|
||||
#define KVM_IDENTITY_BASE 0xfeffc000
|
||||
|
||||
/* From arch/x86/kvm/lapic.h */
|
||||
#define KVM_APIC_BUS_CYCLE_NS 1
|
||||
#define KVM_APIC_BUS_FREQUENCY (1000000000ULL / KVM_APIC_BUS_CYCLE_NS)
|
||||
|
@ -92,7 +102,17 @@
|
|||
* 255 kvm_msr_entry structs */
|
||||
#define MSR_BUF_SIZE 4096
|
||||
|
||||
typedef bool QEMURDMSRHandler(X86CPU *cpu, uint32_t msr, uint64_t *val);
|
||||
typedef bool QEMUWRMSRHandler(X86CPU *cpu, uint32_t msr, uint64_t val);
|
||||
typedef struct {
|
||||
uint32_t msr;
|
||||
QEMURDMSRHandler *rdmsr;
|
||||
QEMUWRMSRHandler *wrmsr;
|
||||
} KVMMSRHandlers;
|
||||
|
||||
static void kvm_init_msrs(X86CPU *cpu);
|
||||
static bool kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
|
||||
QEMUWRMSRHandler *wrmsr);
|
||||
|
||||
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
|
||||
KVM_CAP_INFO(SET_TSS_ADDR),
|
||||
|
@ -2896,9 +2916,9 @@ static int kvm_msr_energy_thread_init(KVMState *s, MachineState *ms)
|
|||
* 1. Host cpu must be Intel cpu
|
||||
* 2. RAPL must be enabled on the Host
|
||||
*/
|
||||
if (is_host_cpu_intel()) {
|
||||
error_report("The RAPL feature can only be enabled on hosts\
|
||||
with Intel CPU models");
|
||||
if (!is_host_cpu_intel()) {
|
||||
error_report("The RAPL feature can only be enabled on hosts "
|
||||
"with Intel CPU models");
|
||||
ret = 1;
|
||||
goto out;
|
||||
}
|
||||
|
@ -2995,10 +3015,174 @@ int kvm_arch_get_default_type(MachineState *ms)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int kvm_vm_enable_exception_payload(KVMState *s)
|
||||
{
|
||||
int ret = 0;
|
||||
has_exception_payload = kvm_check_extension(s, KVM_CAP_EXCEPTION_PAYLOAD);
|
||||
if (has_exception_payload) {
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_EXCEPTION_PAYLOAD, 0, true);
|
||||
if (ret < 0) {
|
||||
error_report("kvm: Failed to enable exception payload cap: %s",
|
||||
strerror(-ret));
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int kvm_vm_enable_triple_fault_event(KVMState *s)
|
||||
{
|
||||
int ret = 0;
|
||||
has_triple_fault_event = \
|
||||
kvm_check_extension(s,
|
||||
KVM_CAP_X86_TRIPLE_FAULT_EVENT);
|
||||
if (has_triple_fault_event) {
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_X86_TRIPLE_FAULT_EVENT, 0, true);
|
||||
if (ret < 0) {
|
||||
error_report("kvm: Failed to enable triple fault event cap: %s",
|
||||
strerror(-ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int kvm_vm_set_identity_map_addr(KVMState *s, uint64_t identity_base)
|
||||
{
|
||||
return kvm_vm_ioctl(s, KVM_SET_IDENTITY_MAP_ADDR, &identity_base);
|
||||
}
|
||||
|
||||
static int kvm_vm_set_nr_mmu_pages(KVMState *s)
|
||||
{
|
||||
uint64_t shadow_mem;
|
||||
int ret = 0;
|
||||
shadow_mem = object_property_get_int(OBJECT(s),
|
||||
"kvm-shadow-mem",
|
||||
&error_abort);
|
||||
if (shadow_mem != -1) {
|
||||
shadow_mem /= 4096;
|
||||
ret = kvm_vm_ioctl(s, KVM_SET_NR_MMU_PAGES, shadow_mem);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int kvm_vm_set_tss_addr(KVMState *s, uint64_t tss_base)
|
||||
{
|
||||
return kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, tss_base);
|
||||
}
|
||||
|
||||
static int kvm_vm_enable_disable_exits(KVMState *s)
|
||||
{
|
||||
int disable_exits = kvm_check_extension(s, KVM_CAP_X86_DISABLE_EXITS);
|
||||
/* Work around for kernel header with a typo. TODO: fix header and drop. */
|
||||
#if defined(KVM_X86_DISABLE_EXITS_HTL) && !defined(KVM_X86_DISABLE_EXITS_HLT)
|
||||
#define KVM_X86_DISABLE_EXITS_HLT KVM_X86_DISABLE_EXITS_HTL
|
||||
#endif
|
||||
if (disable_exits) {
|
||||
disable_exits &= (KVM_X86_DISABLE_EXITS_MWAIT |
|
||||
KVM_X86_DISABLE_EXITS_HLT |
|
||||
KVM_X86_DISABLE_EXITS_PAUSE |
|
||||
KVM_X86_DISABLE_EXITS_CSTATE);
|
||||
}
|
||||
|
||||
return kvm_vm_enable_cap(s, KVM_CAP_X86_DISABLE_EXITS, 0,
|
||||
disable_exits);
|
||||
}
|
||||
|
||||
static int kvm_vm_enable_bus_lock_exit(KVMState *s)
|
||||
{
|
||||
int ret = 0;
|
||||
ret = kvm_check_extension(s, KVM_CAP_X86_BUS_LOCK_EXIT);
|
||||
if (!(ret & KVM_BUS_LOCK_DETECTION_EXIT)) {
|
||||
error_report("kvm: bus lock detection unsupported");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_X86_BUS_LOCK_EXIT, 0,
|
||||
KVM_BUS_LOCK_DETECTION_EXIT);
|
||||
if (ret < 0) {
|
||||
error_report("kvm: Failed to enable bus lock detection cap: %s",
|
||||
strerror(-ret));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int kvm_vm_enable_notify_vmexit(KVMState *s)
|
||||
{
|
||||
int ret = 0;
|
||||
if (s->notify_vmexit != NOTIFY_VMEXIT_OPTION_DISABLE) {
|
||||
uint64_t notify_window_flags =
|
||||
((uint64_t)s->notify_window << 32) |
|
||||
KVM_X86_NOTIFY_VMEXIT_ENABLED |
|
||||
KVM_X86_NOTIFY_VMEXIT_USER;
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_X86_NOTIFY_VMEXIT, 0,
|
||||
notify_window_flags);
|
||||
if (ret < 0) {
|
||||
error_report("kvm: Failed to enable notify vmexit cap: %s",
|
||||
strerror(-ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int kvm_vm_enable_userspace_msr(KVMState *s)
|
||||
{
|
||||
int ret = kvm_vm_enable_cap(s, KVM_CAP_X86_USER_SPACE_MSR, 0,
|
||||
KVM_MSR_EXIT_REASON_FILTER);
|
||||
if (ret < 0) {
|
||||
error_report("Could not enable user space MSRs: %s",
|
||||
strerror(-ret));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!kvm_filter_msr(s, MSR_CORE_THREAD_COUNT,
|
||||
kvm_rdmsr_core_thread_count, NULL)) {
|
||||
error_report("Could not install MSR_CORE_THREAD_COUNT handler!");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void kvm_vm_enable_energy_msrs(KVMState *s)
|
||||
{
|
||||
bool r;
|
||||
if (s->msr_energy.enable == true) {
|
||||
r = kvm_filter_msr(s, MSR_RAPL_POWER_UNIT,
|
||||
kvm_rdmsr_rapl_power_unit, NULL);
|
||||
if (!r) {
|
||||
error_report("Could not install MSR_RAPL_POWER_UNIT \
|
||||
handler");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
r = kvm_filter_msr(s, MSR_PKG_POWER_LIMIT,
|
||||
kvm_rdmsr_pkg_power_limit, NULL);
|
||||
if (!r) {
|
||||
error_report("Could not install MSR_PKG_POWER_LIMIT \
|
||||
handler");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
r = kvm_filter_msr(s, MSR_PKG_POWER_INFO,
|
||||
kvm_rdmsr_pkg_power_info, NULL);
|
||||
if (!r) {
|
||||
error_report("Could not install MSR_PKG_POWER_INFO \
|
||||
handler");
|
||||
exit(1);
|
||||
}
|
||||
r = kvm_filter_msr(s, MSR_PKG_ENERGY_STATUS,
|
||||
kvm_rdmsr_pkg_energy_status, NULL);
|
||||
if (!r) {
|
||||
error_report("Could not install MSR_PKG_ENERGY_STATUS \
|
||||
handler");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||
{
|
||||
uint64_t identity_base = 0xfffbc000;
|
||||
uint64_t shadow_mem;
|
||||
int ret;
|
||||
struct utsname utsname;
|
||||
Error *local_err = NULL;
|
||||
|
@ -3028,24 +3212,14 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
|||
|
||||
hv_vpindex_settable = kvm_check_extension(s, KVM_CAP_HYPERV_VP_INDEX);
|
||||
|
||||
has_exception_payload = kvm_check_extension(s, KVM_CAP_EXCEPTION_PAYLOAD);
|
||||
if (has_exception_payload) {
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_EXCEPTION_PAYLOAD, 0, true);
|
||||
if (ret < 0) {
|
||||
error_report("kvm: Failed to enable exception payload cap: %s",
|
||||
strerror(-ret));
|
||||
return ret;
|
||||
}
|
||||
ret = kvm_vm_enable_exception_payload(s);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
has_triple_fault_event = kvm_check_extension(s, KVM_CAP_X86_TRIPLE_FAULT_EVENT);
|
||||
if (has_triple_fault_event) {
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_X86_TRIPLE_FAULT_EVENT, 0, true);
|
||||
if (ret < 0) {
|
||||
error_report("kvm: Failed to enable triple fault event cap: %s",
|
||||
strerror(-ret));
|
||||
return ret;
|
||||
}
|
||||
ret = kvm_vm_enable_triple_fault_event(s);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (s->xen_version) {
|
||||
|
@ -3076,36 +3250,23 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
|||
uname(&utsname);
|
||||
lm_capable_kernel = strcmp(utsname.machine, "x86_64") == 0;
|
||||
|
||||
/*
|
||||
* On older Intel CPUs, KVM uses vm86 mode to emulate 16-bit code directly.
|
||||
* In order to use vm86 mode, an EPT identity map and a TSS are needed.
|
||||
* Since these must be part of guest physical memory, we need to allocate
|
||||
* them, both by setting their start addresses in the kernel and by
|
||||
* creating a corresponding e820 entry. We need 4 pages before the BIOS,
|
||||
* so this value allows up to 16M BIOSes.
|
||||
*/
|
||||
identity_base = 0xfeffc000;
|
||||
ret = kvm_vm_ioctl(s, KVM_SET_IDENTITY_MAP_ADDR, &identity_base);
|
||||
ret = kvm_vm_set_identity_map_addr(s, KVM_IDENTITY_BASE);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Set TSS base one page after EPT identity map. */
|
||||
ret = kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, identity_base + 0x1000);
|
||||
ret = kvm_vm_set_tss_addr(s, KVM_IDENTITY_BASE + 0x1000);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Tell fw_cfg to notify the BIOS to reserve the range. */
|
||||
e820_add_entry(identity_base, 0x4000, E820_RESERVED);
|
||||
e820_add_entry(KVM_IDENTITY_BASE, 0x4000, E820_RESERVED);
|
||||
|
||||
shadow_mem = object_property_get_int(OBJECT(s), "kvm-shadow-mem", &error_abort);
|
||||
if (shadow_mem != -1) {
|
||||
shadow_mem /= 4096;
|
||||
ret = kvm_vm_ioctl(s, KVM_SET_NR_MMU_PAGES, shadow_mem);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
ret = kvm_vm_set_nr_mmu_pages(s);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (kvm_check_extension(s, KVM_CAP_X86_SMM) &&
|
||||
|
@ -3116,20 +3277,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
|||
}
|
||||
|
||||
if (enable_cpu_pm) {
|
||||
int disable_exits = kvm_check_extension(s, KVM_CAP_X86_DISABLE_EXITS);
|
||||
/* Work around for kernel header with a typo. TODO: fix header and drop. */
|
||||
#if defined(KVM_X86_DISABLE_EXITS_HTL) && !defined(KVM_X86_DISABLE_EXITS_HLT)
|
||||
#define KVM_X86_DISABLE_EXITS_HLT KVM_X86_DISABLE_EXITS_HTL
|
||||
#endif
|
||||
if (disable_exits) {
|
||||
disable_exits &= (KVM_X86_DISABLE_EXITS_MWAIT |
|
||||
KVM_X86_DISABLE_EXITS_HLT |
|
||||
KVM_X86_DISABLE_EXITS_PAUSE |
|
||||
KVM_X86_DISABLE_EXITS_CSTATE);
|
||||
}
|
||||
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_X86_DISABLE_EXITS, 0,
|
||||
disable_exits);
|
||||
ret = kvm_vm_enable_disable_exits(s);
|
||||
if (ret < 0) {
|
||||
error_report("kvm: guest stopping CPU not supported: %s",
|
||||
strerror(-ret));
|
||||
|
@ -3140,16 +3288,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
|||
X86MachineState *x86ms = X86_MACHINE(ms);
|
||||
|
||||
if (x86ms->bus_lock_ratelimit > 0) {
|
||||
ret = kvm_check_extension(s, KVM_CAP_X86_BUS_LOCK_EXIT);
|
||||
if (!(ret & KVM_BUS_LOCK_DETECTION_EXIT)) {
|
||||
error_report("kvm: bus lock detection unsupported");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_X86_BUS_LOCK_EXIT, 0,
|
||||
KVM_BUS_LOCK_DETECTION_EXIT);
|
||||
ret = kvm_vm_enable_bus_lock_exit(s);
|
||||
if (ret < 0) {
|
||||
error_report("kvm: Failed to enable bus lock detection cap: %s",
|
||||
strerror(-ret));
|
||||
return ret;
|
||||
}
|
||||
ratelimit_init(&bus_lock_ratelimit_ctrl);
|
||||
|
@ -3158,80 +3298,25 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
|||
}
|
||||
}
|
||||
|
||||
if (s->notify_vmexit != NOTIFY_VMEXIT_OPTION_DISABLE &&
|
||||
kvm_check_extension(s, KVM_CAP_X86_NOTIFY_VMEXIT)) {
|
||||
uint64_t notify_window_flags =
|
||||
((uint64_t)s->notify_window << 32) |
|
||||
KVM_X86_NOTIFY_VMEXIT_ENABLED |
|
||||
KVM_X86_NOTIFY_VMEXIT_USER;
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_X86_NOTIFY_VMEXIT, 0,
|
||||
notify_window_flags);
|
||||
if (ret < 0) {
|
||||
error_report("kvm: Failed to enable notify vmexit cap: %s",
|
||||
strerror(-ret));
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
if (kvm_vm_check_extension(s, KVM_CAP_X86_USER_SPACE_MSR)) {
|
||||
bool r;
|
||||
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_X86_USER_SPACE_MSR, 0,
|
||||
KVM_MSR_EXIT_REASON_FILTER);
|
||||
if (ret) {
|
||||
error_report("Could not enable user space MSRs: %s",
|
||||
strerror(-ret));
|
||||
exit(1);
|
||||
if (kvm_check_extension(s, KVM_CAP_X86_NOTIFY_VMEXIT)) {
|
||||
ret = kvm_vm_enable_notify_vmexit(s);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
r = kvm_filter_msr(s, MSR_CORE_THREAD_COUNT,
|
||||
kvm_rdmsr_core_thread_count, NULL);
|
||||
if (!r) {
|
||||
error_report("Could not install MSR_CORE_THREAD_COUNT handler: %s",
|
||||
strerror(-ret));
|
||||
exit(1);
|
||||
if (kvm_vm_check_extension(s, KVM_CAP_X86_USER_SPACE_MSR)) {
|
||||
ret = kvm_vm_enable_userspace_msr(s);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (s->msr_energy.enable == true) {
|
||||
r = kvm_filter_msr(s, MSR_RAPL_POWER_UNIT,
|
||||
kvm_rdmsr_rapl_power_unit, NULL);
|
||||
if (!r) {
|
||||
error_report("Could not install MSR_RAPL_POWER_UNIT \
|
||||
handler: %s",
|
||||
strerror(-ret));
|
||||
kvm_vm_enable_energy_msrs(s);
|
||||
if (kvm_msr_energy_thread_init(s, ms)) {
|
||||
error_report("kvm : error RAPL feature requirement not met");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
r = kvm_filter_msr(s, MSR_PKG_POWER_LIMIT,
|
||||
kvm_rdmsr_pkg_power_limit, NULL);
|
||||
if (!r) {
|
||||
error_report("Could not install MSR_PKG_POWER_LIMIT \
|
||||
handler: %s",
|
||||
strerror(-ret));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
r = kvm_filter_msr(s, MSR_PKG_POWER_INFO,
|
||||
kvm_rdmsr_pkg_power_info, NULL);
|
||||
if (!r) {
|
||||
error_report("Could not install MSR_PKG_POWER_INFO \
|
||||
handler: %s",
|
||||
strerror(-ret));
|
||||
exit(1);
|
||||
}
|
||||
r = kvm_filter_msr(s, MSR_PKG_ENERGY_STATUS,
|
||||
kvm_rdmsr_pkg_energy_status, NULL);
|
||||
if (!r) {
|
||||
error_report("Could not install MSR_PKG_ENERGY_STATUS \
|
||||
handler: %s",
|
||||
strerror(-ret));
|
||||
exit(1);
|
||||
}
|
||||
r = kvm_msr_energy_thread_init(s, ms);
|
||||
if (r) {
|
||||
error_report("kvm : error RAPL feature requirement not meet");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3694,7 +3779,14 @@ static void kvm_msr_entry_add_vmx(X86CPU *cpu, FeatureWordArray f)
|
|||
kvm_msr_entry_add(cpu, MSR_IA32_VMX_CR4_FIXED0,
|
||||
CR4_VMXE_MASK);
|
||||
|
||||
if (f[FEAT_VMX_SECONDARY_CTLS] & VMX_SECONDARY_EXEC_TSC_SCALING) {
|
||||
if (f[FEAT_7_1_EAX] & CPUID_7_1_EAX_FRED) {
|
||||
/* FRED injected-event data (0x2052). */
|
||||
kvm_msr_entry_add(cpu, MSR_IA32_VMX_VMCS_ENUM, 0x52);
|
||||
} else if (f[FEAT_VMX_EXIT_CTLS] &
|
||||
VMX_VM_EXIT_ACTIVATE_SECONDARY_CONTROLS) {
|
||||
/* Secondary VM-exit controls (0x2044). */
|
||||
kvm_msr_entry_add(cpu, MSR_IA32_VMX_VMCS_ENUM, 0x44);
|
||||
} else if (f[FEAT_VMX_SECONDARY_CTLS] & VMX_SECONDARY_EXEC_TSC_SCALING) {
|
||||
/* TSC multiplier (0x2032). */
|
||||
kvm_msr_entry_add(cpu, MSR_IA32_VMX_VMCS_ENUM, 0x32);
|
||||
} else {
|
||||
|
@ -5118,7 +5210,7 @@ static int kvm_get_nested_state(X86CPU *cpu)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int kvm_arch_put_registers(CPUState *cpu, int level)
|
||||
int kvm_arch_put_registers(CPUState *cpu, int level, Error **errp)
|
||||
{
|
||||
X86CPU *x86_cpu = X86_CPU(cpu);
|
||||
int ret;
|
||||
|
@ -5133,6 +5225,7 @@ int kvm_arch_put_registers(CPUState *cpu, int level)
|
|||
if (level >= KVM_PUT_RESET_STATE) {
|
||||
ret = kvm_put_msr_feature_control(x86_cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set feature control MSR");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
@ -5140,12 +5233,14 @@ int kvm_arch_put_registers(CPUState *cpu, int level)
|
|||
/* must be before kvm_put_nested_state so that EFER.SVME is set */
|
||||
ret = has_sregs2 ? kvm_put_sregs2(x86_cpu) : kvm_put_sregs(x86_cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set special registers");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (level >= KVM_PUT_RESET_STATE) {
|
||||
ret = kvm_put_nested_state(x86_cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set nested state");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
@ -5163,6 +5258,7 @@ int kvm_arch_put_registers(CPUState *cpu, int level)
|
|||
if (xen_mode == XEN_EMULATE && level == KVM_PUT_FULL_STATE) {
|
||||
ret = kvm_put_xen_state(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set Xen state");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
@ -5170,43 +5266,51 @@ int kvm_arch_put_registers(CPUState *cpu, int level)
|
|||
|
||||
ret = kvm_getput_regs(x86_cpu, 1);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set general purpose registers");
|
||||
return ret;
|
||||
}
|
||||
ret = kvm_put_xsave(x86_cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set XSAVE");
|
||||
return ret;
|
||||
}
|
||||
ret = kvm_put_xcrs(x86_cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set XCRs");
|
||||
return ret;
|
||||
}
|
||||
ret = kvm_put_msrs(x86_cpu, level);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set MSRs");
|
||||
return ret;
|
||||
}
|
||||
ret = kvm_put_vcpu_events(x86_cpu, level);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set vCPU events");
|
||||
return ret;
|
||||
}
|
||||
if (level >= KVM_PUT_RESET_STATE) {
|
||||
ret = kvm_put_mp_state(x86_cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set MP state");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = kvm_put_tscdeadline_msr(x86_cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set TSC deadline MSR");
|
||||
return ret;
|
||||
}
|
||||
ret = kvm_put_debugregs(x86_cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to set debug registers");
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kvm_arch_get_registers(CPUState *cs)
|
||||
int kvm_arch_get_registers(CPUState *cs, Error **errp)
|
||||
{
|
||||
X86CPU *cpu = X86_CPU(cs);
|
||||
int ret;
|
||||
|
@ -5215,6 +5319,7 @@ int kvm_arch_get_registers(CPUState *cs)
|
|||
|
||||
ret = kvm_get_vcpu_events(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get vCPU events");
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
|
@ -5223,44 +5328,54 @@ int kvm_arch_get_registers(CPUState *cs)
|
|||
*/
|
||||
ret = kvm_get_mp_state(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get MP state");
|
||||
goto out;
|
||||
}
|
||||
ret = kvm_getput_regs(cpu, 0);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get general purpose registers");
|
||||
goto out;
|
||||
}
|
||||
ret = kvm_get_xsave(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get XSAVE");
|
||||
goto out;
|
||||
}
|
||||
ret = kvm_get_xcrs(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get XCRs");
|
||||
goto out;
|
||||
}
|
||||
ret = has_sregs2 ? kvm_get_sregs2(cpu) : kvm_get_sregs(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get special registers");
|
||||
goto out;
|
||||
}
|
||||
ret = kvm_get_msrs(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get MSRs");
|
||||
goto out;
|
||||
}
|
||||
ret = kvm_get_apic(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get APIC");
|
||||
goto out;
|
||||
}
|
||||
ret = kvm_get_debugregs(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get debug registers");
|
||||
goto out;
|
||||
}
|
||||
ret = kvm_get_nested_state(cpu);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get nested state");
|
||||
goto out;
|
||||
}
|
||||
#ifdef CONFIG_XEN_EMU
|
||||
if (xen_mode == XEN_EMULATE) {
|
||||
ret = kvm_get_xen_state(cs);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Failed to get Xen state");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
@ -5729,7 +5844,7 @@ static bool kvm_install_msr_filters(KVMState *s)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
|
||||
static bool kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
|
||||
QEMUWRMSRHandler *wrmsr)
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -66,17 +66,6 @@ uint64_t kvm_swizzle_msi_ext_dest_id(uint64_t address);
|
|||
void kvm_update_msi_routes_all(void *private, bool global,
|
||||
uint32_t index, uint32_t mask);
|
||||
|
||||
typedef bool QEMURDMSRHandler(X86CPU *cpu, uint32_t msr, uint64_t *val);
|
||||
typedef bool QEMUWRMSRHandler(X86CPU *cpu, uint32_t msr, uint64_t val);
|
||||
typedef struct kvm_msr_handlers {
|
||||
uint32_t msr;
|
||||
QEMURDMSRHandler *rdmsr;
|
||||
QEMUWRMSRHandler *wrmsr;
|
||||
} KVMMSRHandlers;
|
||||
|
||||
bool kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
|
||||
QEMUWRMSRHandler *wrmsr);
|
||||
|
||||
#endif /* CONFIG_KVM */
|
||||
|
||||
void kvm_pc_setup_irq_routing(bool pci_enabled);
|
||||
|
|
|
@ -34,7 +34,7 @@ bool is_host_cpu_intel(void)
|
|||
|
||||
host_cpu_vendor_fms(vendor, &family, &model, &stepping);
|
||||
|
||||
return strcmp(vendor, CPUID_VENDOR_INTEL);
|
||||
return g_str_equal(vendor, CPUID_VENDOR_INTEL);
|
||||
}
|
||||
|
||||
int is_rapl_enabled(void)
|
||||
|
|
|
@ -588,7 +588,7 @@ static int kvm_loongarch_put_cpucfg(CPUState *cs)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int kvm_arch_get_registers(CPUState *cs)
|
||||
int kvm_arch_get_registers(CPUState *cs, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -616,7 +616,7 @@ int kvm_arch_get_registers(CPUState *cs)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int kvm_arch_put_registers(CPUState *cs, int level)
|
||||
int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
|
|
@ -1172,7 +1172,7 @@ static int kvm_mips_get_cp0_registers(CPUState *cs)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int kvm_arch_put_registers(CPUState *cs, int level)
|
||||
int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
|
||||
{
|
||||
CPUMIPSState *env = cpu_env(cs);
|
||||
struct kvm_regs regs;
|
||||
|
@ -1207,7 +1207,7 @@ int kvm_arch_put_registers(CPUState *cs, int level)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int kvm_arch_get_registers(CPUState *cs)
|
||||
int kvm_arch_get_registers(CPUState *cs, Error **errp)
|
||||
{
|
||||
CPUMIPSState *env = cpu_env(cs);
|
||||
int ret = 0;
|
||||
|
|
|
@ -900,7 +900,7 @@ int kvmppc_put_books_sregs(PowerPCCPU *cpu)
|
|||
return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_SREGS, &sregs);
|
||||
}
|
||||
|
||||
int kvm_arch_put_registers(CPUState *cs, int level)
|
||||
int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
|
||||
{
|
||||
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||
CPUPPCState *env = &cpu->env;
|
||||
|
@ -1205,7 +1205,7 @@ static int kvmppc_get_books_sregs(PowerPCCPU *cpu)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int kvm_arch_get_registers(CPUState *cs)
|
||||
int kvm_arch_get_registers(CPUState *cs, Error **errp)
|
||||
{
|
||||
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||
CPUPPCState *env = &cpu->env;
|
||||
|
|
|
@ -1192,7 +1192,7 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
|
|||
KVM_CAP_LAST_INFO
|
||||
};
|
||||
|
||||
int kvm_arch_get_registers(CPUState *cs)
|
||||
int kvm_arch_get_registers(CPUState *cs, Error **errp)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
|
@ -1237,7 +1237,7 @@ int kvm_riscv_sync_mpstate_to_kvm(RISCVCPU *cpu, int state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int kvm_arch_put_registers(CPUState *cs, int level)
|
||||
int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
|
|
|
@ -472,7 +472,7 @@ static int can_sync_regs(CPUState *cs, int regs)
|
|||
#define KVM_SYNC_REQUIRED_REGS (KVM_SYNC_GPRS | KVM_SYNC_ACRS | \
|
||||
KVM_SYNC_CRS | KVM_SYNC_PREFIX)
|
||||
|
||||
int kvm_arch_put_registers(CPUState *cs, int level)
|
||||
int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
|
||||
{
|
||||
CPUS390XState *env = cpu_env(cs);
|
||||
struct kvm_fpu fpu = {};
|
||||
|
@ -598,7 +598,7 @@ int kvm_arch_put_registers(CPUState *cs, int level)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int kvm_arch_get_registers(CPUState *cs)
|
||||
int kvm_arch_get_registers(CPUState *cs, Error **errp)
|
||||
{
|
||||
CPUS390XState *env = cpu_env(cs);
|
||||
struct kvm_fpu fpu;
|
||||
|
|
|
@ -116,7 +116,7 @@ if have_block
|
|||
if host_os != 'windows'
|
||||
tests += {
|
||||
'test-image-locking': [testblock],
|
||||
'test-nested-aio-poll': [testblock],
|
||||
'test-nested-aio-poll': [],
|
||||
}
|
||||
endif
|
||||
if config_host_data.get('CONFIG_REPLICATION')
|
||||
|
|
Loading…
Reference in New Issue