Browse Source
register a "CpusAccel" interface for KVM as well. Signed-off-by: Claudio Fontana <cfontana@suse.de> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> [added const] Signed-off-by: Claudio Fontana <cfontana@suse.de> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>pull/99/head
committed by
Paolo Bonzini
7 changed files with 124 additions and 82 deletions
@ -0,0 +1,88 @@ |
|||||
|
/*
|
||||
|
* QEMU KVM support |
||||
|
* |
||||
|
* Copyright IBM, Corp. 2008 |
||||
|
* Red Hat, Inc. 2008 |
||||
|
* |
||||
|
* Authors: |
||||
|
* Anthony Liguori <aliguori@us.ibm.com> |
||||
|
* Glauber Costa <gcosta@redhat.com> |
||||
|
* |
||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or later. |
||||
|
* See the COPYING file in the top-level directory. |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#include "qemu/osdep.h" |
||||
|
#include "qemu/error-report.h" |
||||
|
#include "qemu/main-loop.h" |
||||
|
#include "sysemu/kvm_int.h" |
||||
|
#include "sysemu/runstate.h" |
||||
|
#include "sysemu/cpus.h" |
||||
|
#include "qemu/guest-random.h" |
||||
|
|
||||
|
#include "kvm-cpus.h" |
||||
|
|
||||
|
static void *kvm_vcpu_thread_fn(void *arg) |
||||
|
{ |
||||
|
CPUState *cpu = arg; |
||||
|
int r; |
||||
|
|
||||
|
rcu_register_thread(); |
||||
|
|
||||
|
qemu_mutex_lock_iothread(); |
||||
|
qemu_thread_get_self(cpu->thread); |
||||
|
cpu->thread_id = qemu_get_thread_id(); |
||||
|
cpu->can_do_io = 1; |
||||
|
current_cpu = cpu; |
||||
|
|
||||
|
r = kvm_init_vcpu(cpu); |
||||
|
if (r < 0) { |
||||
|
error_report("kvm_init_vcpu failed: %s", strerror(-r)); |
||||
|
exit(1); |
||||
|
} |
||||
|
|
||||
|
kvm_init_cpu_signals(cpu); |
||||
|
|
||||
|
/* signal CPU creation */ |
||||
|
cpu_thread_signal_created(cpu); |
||||
|
qemu_guest_random_seed_thread_part2(cpu->random_seed); |
||||
|
|
||||
|
do { |
||||
|
if (cpu_can_run(cpu)) { |
||||
|
r = kvm_cpu_exec(cpu); |
||||
|
if (r == EXCP_DEBUG) { |
||||
|
cpu_handle_guest_debug(cpu); |
||||
|
} |
||||
|
} |
||||
|
qemu_wait_io_event(cpu); |
||||
|
} while (!cpu->unplug || cpu_can_run(cpu)); |
||||
|
|
||||
|
kvm_destroy_vcpu(cpu); |
||||
|
cpu_thread_signal_destroyed(cpu); |
||||
|
qemu_mutex_unlock_iothread(); |
||||
|
rcu_unregister_thread(); |
||||
|
return NULL; |
||||
|
} |
||||
|
|
||||
|
static void kvm_start_vcpu_thread(CPUState *cpu) |
||||
|
{ |
||||
|
char thread_name[VCPU_THREAD_NAME_SIZE]; |
||||
|
|
||||
|
cpu->thread = g_malloc0(sizeof(QemuThread)); |
||||
|
cpu->halt_cond = g_malloc0(sizeof(QemuCond)); |
||||
|
qemu_cond_init(cpu->halt_cond); |
||||
|
snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM", |
||||
|
cpu->cpu_index); |
||||
|
qemu_thread_create(cpu->thread, thread_name, kvm_vcpu_thread_fn, |
||||
|
cpu, QEMU_THREAD_JOINABLE); |
||||
|
} |
||||
|
|
||||
|
const CpusAccel kvm_cpus = { |
||||
|
.create_vcpu_thread = kvm_start_vcpu_thread, |
||||
|
|
||||
|
.synchronize_post_reset = kvm_cpu_synchronize_post_reset, |
||||
|
.synchronize_post_init = kvm_cpu_synchronize_post_init, |
||||
|
.synchronize_state = kvm_cpu_synchronize_state, |
||||
|
.synchronize_pre_loadvm = kvm_cpu_synchronize_pre_loadvm, |
||||
|
}; |
||||
@ -0,0 +1,17 @@ |
|||||
|
/*
|
||||
|
* Accelerator CPUS Interface |
||||
|
* |
||||
|
* Copyright 2020 SUSE LLC |
||||
|
* |
||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or later. |
||||
|
* See the COPYING file in the top-level directory. |
||||
|
*/ |
||||
|
|
||||
|
#ifndef KVM_CPUS_H |
||||
|
#define KVM_CPUS_H |
||||
|
|
||||
|
#include "sysemu/cpus.h" |
||||
|
|
||||
|
extern const CpusAccel kvm_cpus; |
||||
|
|
||||
|
#endif /* KVM_CPUS_H */ |
||||
@ -1,5 +1,8 @@ |
|||||
kvm_ss = ss.source_set() |
kvm_ss = ss.source_set() |
||||
kvm_ss.add(files('kvm-all.c')) |
kvm_ss.add(files( |
||||
|
'kvm-all.c', |
||||
|
'kvm-cpus.c', |
||||
|
)) |
||||
kvm_ss.add(when: 'CONFIG_SEV', if_false: files('sev-stub.c')) |
kvm_ss.add(when: 'CONFIG_SEV', if_false: files('sev-stub.c')) |
||||
|
|
||||
specific_ss.add_all(when: 'CONFIG_KVM', if_true: kvm_ss) |
specific_ss.add_all(when: 'CONFIG_KVM', if_true: kvm_ss) |
||||
|
|||||
Loading…
Reference in new issue