Skip to content

Commit

Permalink
hvf: Split out common code on vcpu init and destroy
Browse files Browse the repository at this point in the history
Until now, Hypervisor.framework has only been available on x86_64 systems.
With Apple Silicon shipping now, it extends its reach to aarch64. To
prepare for support for multiple architectures, let's start moving common
code out into its own accel directory.

This patch splits the vcpu init and destroy functions into a generic and
an architecture specific portion. This also allows us to move the generic
functions into the generic hvf code, removing exported functions.

Signed-off-by: Alexander Graf <agraf@csgraf.de>
Reviewed-by: Sergio Lopez <slp@redhat.com>
Message-id: 20210519202253.76782-8-agraf@csgraf.de
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
agraf authored and pm215 committed Jun 3, 2021
1 parent 6e19f86 commit cfe5845
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 23 deletions.
30 changes: 30 additions & 0 deletions accel/hvf/hvf-accel-ops.c
Expand Up @@ -363,6 +363,36 @@ static void hvf_type_init(void)

type_init(hvf_type_init);

static void hvf_vcpu_destroy(CPUState *cpu)
{
hv_return_t ret = hv_vcpu_destroy(cpu->hvf_fd);
assert_hvf_ok(ret);

hvf_arch_vcpu_destroy(cpu);
}

static int hvf_init_vcpu(CPUState *cpu)
{
int r;

/* init cpu signals */
sigset_t set;
struct sigaction sigact;

memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = dummy_signal;
sigaction(SIG_IPI, &sigact, NULL);

pthread_sigmask(SIG_BLOCK, NULL, &set);
sigdelset(&set, SIG_IPI);

r = hv_vcpu_create((hv_vcpuid_t *)&cpu->hvf_fd, HV_VCPU_DEFAULT);
cpu->vcpu_dirty = 1;
assert_hvf_ok(r);

return hvf_arch_init_vcpu(cpu);
}

/*
* The HVF-specific vCPU thread function. This one should only run when the host
* CPU supports the VMX "unrestricted guest" feature.
Expand Down
2 changes: 0 additions & 2 deletions accel/hvf/hvf-accel-ops.h
Expand Up @@ -12,12 +12,10 @@

#include "sysemu/cpus.h"

int hvf_init_vcpu(CPUState *);
int hvf_vcpu_exec(CPUState *);
void hvf_cpu_synchronize_state(CPUState *);
void hvf_cpu_synchronize_post_reset(CPUState *);
void hvf_cpu_synchronize_post_init(CPUState *);
void hvf_cpu_synchronize_pre_loadvm(CPUState *);
void hvf_vcpu_destroy(CPUState *);

#endif /* HVF_CPUS_H */
2 changes: 2 additions & 0 deletions include/sysemu/hvf_int.h
Expand Up @@ -44,6 +44,8 @@ struct HVFState {
extern HVFState *hvf_state;

void assert_hvf_ok(hv_return_t ret);
int hvf_arch_init_vcpu(CPUState *cpu);
void hvf_arch_vcpu_destroy(CPUState *cpu);
hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t);
int hvf_put_registers(CPUState *);
int hvf_get_registers(CPUState *);
Expand Down
23 changes: 2 additions & 21 deletions target/i386/hvf/hvf.c
Expand Up @@ -158,14 +158,12 @@ static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
return false;
}

void hvf_vcpu_destroy(CPUState *cpu)
void hvf_arch_vcpu_destroy(CPUState *cpu)
{
X86CPU *x86_cpu = X86_CPU(cpu);
CPUX86State *env = &x86_cpu->env;

hv_return_t ret = hv_vcpu_destroy((hv_vcpuid_t)cpu->hvf_fd);
g_free(env->hvf_mmio_buf);
assert_hvf_ok(ret);
}

static void init_tsc_freq(CPUX86State *env)
Expand Down Expand Up @@ -210,23 +208,10 @@ static inline bool apic_bus_freq_is_known(CPUX86State *env)
return env->apic_bus_freq != 0;
}

int hvf_init_vcpu(CPUState *cpu)
int hvf_arch_init_vcpu(CPUState *cpu)
{

X86CPU *x86cpu = X86_CPU(cpu);
CPUX86State *env = &x86cpu->env;
int r;

/* init cpu signals */
sigset_t set;
struct sigaction sigact;

memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = dummy_signal;
sigaction(SIG_IPI, &sigact, NULL);

pthread_sigmask(SIG_BLOCK, NULL, &set);
sigdelset(&set, SIG_IPI);

init_emu();
init_decoder();
Expand All @@ -243,10 +228,6 @@ int hvf_init_vcpu(CPUState *cpu)
}
}

r = hv_vcpu_create((hv_vcpuid_t *)&cpu->hvf_fd, HV_VCPU_DEFAULT);
cpu->vcpu_dirty = 1;
assert_hvf_ok(r);

if (hv_vmx_read_capability(HV_VMX_CAP_PINBASED,
&hvf_state->hvf_caps->vmx_cap_pinbased)) {
abort();
Expand Down

0 comments on commit cfe5845

Please sign in to comment.