• Jordan Niethe's avatar
    KVM: PPC: Add support for nestedv2 guests · 19d31c5f
    Jordan Niethe authored
    A series of hcalls have been added to the PAPR which allow a regular
    guest partition to create and manage guest partitions of its own. KVM
    already had an interface that allowed this on powernv platforms. This
    existing interface will now be called "nestedv1". The newly added PAPR
    interface will be called "nestedv2".  PHYP will support the nestedv2
    interface. At this time the host side of the nestedv2 interface has not
    been implemented on powernv but there is no technical reason why it
    could not be added.
    
    The nestedv1 interface is still supported.
    
    Add support to KVM to utilize these hcalls to enable running nested
    guests as a pseries guest on PHYP.
    
    Overview of the new hcall usage:
    
    - L1 and L0 negotiate capabilities with
      H_GUEST_{G,S}ET_CAPABILITIES()
    
    - L1 requests the L0 create a L2 with
      H_GUEST_CREATE() and receives a handle to use in future hcalls
    
    - L1 requests the L0 create a L2 vCPU with
      H_GUEST_CREATE_VCPU()
    
    - L1 sets up the L2 using H_GUEST_SET and the
      H_GUEST_VCPU_RUN input buffer
    
    - L1 requests the L0 runs the L2 vCPU using H_GUEST_VCPU_RUN()
    
    - L2 returns to L1 with an exit reason and L1 reads the
      H_GUEST_VCPU_RUN output buffer populated by the L0
    
    - L1 handles the exit using H_GET_STATE if necessary
    
    - L1 reruns L2 vCPU with H_GUEST_VCPU_RUN
    
    - L1 frees the L2 in the L0 with H_GUEST_DELETE()
    
    Support for the new API is determined by trying
    H_GUEST_GET_CAPABILITIES. On a successful return, use the nestedv2
    interface.
    
    Use the vcpu register state setters for tracking modified guest state
    elements and copy the thread wide values into the H_GUEST_VCPU_RUN input
    buffer immediately before running a L2. The guest wide
    elements can not be added to the input buffer so send them with a
    separate H_GUEST_SET call if necessary.
    
    Make the vcpu register getter load the corresponding value from the real
    host with H_GUEST_GET. To avoid unnecessarily calling H_GUEST_GET, track
    which values have already been loaded between H_GUEST_VCPU_RUN calls. If
    an element is present in the H_GUEST_VCPU_RUN output buffer it also does
    not need to be loaded again.
    Tested-by: default avatarSachin Sant <sachinp@linux.ibm.com>
    Signed-off-by: default avatarVaibhav Jain <vaibhav@linux.ibm.com>
    Signed-off-by: default avatarGautam Menghani <gautam@linux.ibm.com>
    Signed-off-by: default avatarKautuk Consul <kconsul@linux.vnet.ibm.com>
    Signed-off-by: default avatarAmit Machhiwal <amachhiw@linux.vnet.ibm.com>
    Signed-off-by: default avatarJordan Niethe <jniethe5@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://msgid.link/20230914030600.16993-11-jniethe5@gmail.com
    19d31c5f
book3s_hv_nestedv2.c 25.5 KB