On Tue, Oct 02, 2018 at 09:31:16PM +1000, Paul Mackerras wrote: > This starts the process of adding the code to support nested HV-style > virtualization. It defines a new H_SET_PARTITION_TABLE hypercall which > a nested hypervisor can use to set the base address and size of a > partition table in its memory (analogous to the PTCR register). > On the host (level 0 hypervisor) side, the H_SET_PARTITION_TABLE > hypercall from the guest is handled by code that saves the virtual > PTCR value for the guest. > > This also adds code for creating and destroying nested guests and for > reading the partition table entry for a nested guest from L1 memory. > Each nested guest has its own shadow LPID value, different in general > from the LPID value used by the nested hypervisor to refer to it. The > shadow LPID value is allocated at nested guest creation time. > > Nested hypervisor functionality is only available for a radix guest, > which therefore means a radix host on a POWER9 (or later) processor. > > Signed-off-by: Paul Mackerras <paulus@xxxxxxxxxx> Reviewed-by: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> Couple of nits noted below [snip] > +void kvmhv_set_ptbl_entry(unsigned int lpid, u64 dw0, u64 dw1) > +{ > + if (cpu_has_feature(CPU_FTR_HVMODE)) { > + mmu_partition_table_set_entry(lpid, dw0, dw1); > + } else { > + pseries_partition_tb[lpid].patb0 = cpu_to_be64(dw0); > + pseries_partition_tb[lpid].patb1 = cpu_to_be64(dw1); > + /* this will be emulated, L0 will do the necessary barriers */ > + asm volatile(PPC_TLBIE_5(%0, %1, 2, 0, 1) : : > + "r" (TLBIEL_INVAL_SET_LPID), "r" (lpid)); It seems a bit odd to me to introduce this with a mechanism we never actually implement, then replace it. But I guess if refolding the series is painful.. > + } [snip] > +/* > + * Handle the H_SET_PARTITION_TABLE hcall. > + * r4 = guest real address of partition table + log_2(size) - 12 > + * (formatted as for the PTCR). > + */ > +long kvmhv_set_partition_table(struct kvm_vcpu *vcpu) > +{ > + struct kvm *kvm = vcpu->kvm; > + unsigned long ptcr = kvmppc_get_gpr(vcpu, 4); > + > + kvm->arch.l1_ptcr = ptcr; Still no validation here. > + return H_SUCCESS; > +} -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Attachment:
signature.asc
Description: PGP signature