mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 10:13:56 -06:00
target/ppc: Introduce a vhyp framework for nested HV support
Introduce virtual hypervisor methods that can support a "Nested KVM HV" implementation using the bare metal 2-level radix MMU, and using HV exceptions to return from H_ENTER_NESTED (rather than cause interrupts). HV exceptions can now be raised in the TCG spapr machine when running a nested KVM HV guest. The main ones are the lev==1 syscall, the hdecr, hdsi and hisi, hv fu, and hv emu, and h_virt external interrupts. HV exceptions are intercepted in the exception handler code and instead of causing interrupts in the guest and switching the machine to HV mode, they go to the vhyp where it may exit the H_ENTER_NESTED hcall with the interrupt vector numer as return value as required by the hcall API. Address translation is provided by the 2-level page table walker that is implemented for the bare metal radix MMU. The partition scope page table is pointed to the L1's partition scope by the get_pate vhc method. Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Cédric Le Goater <clg@kaod.org> Message-Id: <20220216102545.1808018-9-npiggin@gmail.com> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
3680e99461
commit
7cebc5db2e
5 changed files with 81 additions and 13 deletions
|
@ -449,6 +449,11 @@ static target_ulong pegasos2_rtas(PowerPCCPU *cpu, Pegasos2MachineState *pm,
|
|||
}
|
||||
}
|
||||
|
||||
static bool pegasos2_cpu_in_nested(PowerPCCPU *cpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void pegasos2_hypercall(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu)
|
||||
{
|
||||
Pegasos2MachineState *pm = PEGASOS2_MACHINE(vhyp);
|
||||
|
@ -504,6 +509,7 @@ static void pegasos2_machine_class_init(ObjectClass *oc, void *data)
|
|||
mc->default_ram_id = "pegasos2.ram";
|
||||
mc->default_ram_size = 512 * MiB;
|
||||
|
||||
vhc->cpu_in_nested = pegasos2_cpu_in_nested;
|
||||
vhc->hypercall = pegasos2_hypercall;
|
||||
vhc->cpu_exec_enter = vhyp_nop;
|
||||
vhc->cpu_exec_exit = vhyp_nop;
|
||||
|
|
|
@ -4472,6 +4472,11 @@ PowerPCCPU *spapr_find_cpu(int vcpu_id)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static bool spapr_cpu_in_nested(PowerPCCPU *cpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void spapr_cpu_exec_enter(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu)
|
||||
{
|
||||
SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
|
||||
|
@ -4580,6 +4585,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
|||
fwc->get_dev_path = spapr_get_fw_dev_path;
|
||||
nc->nmi_monitor_handler = spapr_nmi;
|
||||
smc->phb_placement = spapr_phb_placement;
|
||||
vhc->cpu_in_nested = spapr_cpu_in_nested;
|
||||
vhc->hypercall = emulate_spapr_hypercall;
|
||||
vhc->hpt_mask = spapr_hpt_mask;
|
||||
vhc->map_hptes = spapr_map_hptes;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue