|
@@ -11,11 +11,19 @@
|
|
void spapr_nested_reset(SpaprMachineState *spapr)
|
|
void spapr_nested_reset(SpaprMachineState *spapr)
|
|
{
|
|
{
|
|
if (spapr_get_cap(spapr, SPAPR_CAP_NESTED_KVM_HV)) {
|
|
if (spapr_get_cap(spapr, SPAPR_CAP_NESTED_KVM_HV)) {
|
|
|
|
+ spapr->nested.api = NESTED_API_KVM_HV;
|
|
spapr_unregister_nested_hv();
|
|
spapr_unregister_nested_hv();
|
|
spapr_register_nested_hv();
|
|
spapr_register_nested_hv();
|
|
|
|
+ } else {
|
|
|
|
+ spapr->nested.api = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+uint8_t spapr_nested_api(SpaprMachineState *spapr)
|
|
|
|
+{
|
|
|
|
+ return spapr->nested.api;
|
|
|
|
+}
|
|
|
|
+
|
|
#ifdef CONFIG_TCG
|
|
#ifdef CONFIG_TCG
|
|
|
|
|
|
bool spapr_get_pate_nested_hv(SpaprMachineState *spapr, PowerPCCPU *cpu,
|
|
bool spapr_get_pate_nested_hv(SpaprMachineState *spapr, PowerPCCPU *cpu,
|
|
@@ -310,7 +318,7 @@ static target_ulong h_enter_nested(PowerPCCPU *cpu,
|
|
return env->gpr[3];
|
|
return env->gpr[3];
|
|
}
|
|
}
|
|
|
|
|
|
-void spapr_exit_nested(PowerPCCPU *cpu, int excp)
|
|
|
|
|
|
+static void spapr_exit_nested_hv(PowerPCCPU *cpu, int excp)
|
|
{
|
|
{
|
|
CPUPPCState *env = &cpu->env;
|
|
CPUPPCState *env = &cpu->env;
|
|
SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
|
|
SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
|
|
@@ -322,8 +330,6 @@ void spapr_exit_nested(PowerPCCPU *cpu, int excp)
|
|
struct kvmppc_pt_regs *regs;
|
|
struct kvmppc_pt_regs *regs;
|
|
hwaddr len;
|
|
hwaddr len;
|
|
|
|
|
|
- assert(spapr_cpu->in_nested);
|
|
|
|
-
|
|
|
|
nested_save_state(&l2_state, cpu);
|
|
nested_save_state(&l2_state, cpu);
|
|
hsrr0 = env->spr[SPR_HSRR0];
|
|
hsrr0 = env->spr[SPR_HSRR0];
|
|
hsrr1 = env->spr[SPR_HSRR1];
|
|
hsrr1 = env->spr[SPR_HSRR1];
|
|
@@ -413,6 +419,19 @@ void spapr_exit_nested(PowerPCCPU *cpu, int excp)
|
|
address_space_unmap(CPU(cpu)->as, regs, len, len, true);
|
|
address_space_unmap(CPU(cpu)->as, regs, len, len, true);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void spapr_exit_nested(PowerPCCPU *cpu, int excp)
|
|
|
|
+{
|
|
|
|
+ SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
|
|
|
|
+ SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
|
|
|
|
+
|
|
|
|
+ assert(spapr_cpu->in_nested);
|
|
|
|
+ if (spapr_nested_api(spapr) == NESTED_API_KVM_HV) {
|
|
|
|
+ spapr_exit_nested_hv(cpu, excp);
|
|
|
|
+ } else {
|
|
|
|
+ g_assert_not_reached();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void spapr_register_nested_hv(void)
|
|
void spapr_register_nested_hv(void)
|
|
{
|
|
{
|
|
spapr_register_hypercall(KVMPPC_H_SET_PARTITION_TABLE, h_set_ptbl);
|
|
spapr_register_hypercall(KVMPPC_H_SET_PARTITION_TABLE, h_set_ptbl);
|