• Suraj Jitindar Singh's avatar
    KVM: PPC: Book3S HV: Handle differing endianness for H_ENTER_NESTED · 10b5022d
    Suraj Jitindar Singh authored
    The hcall H_ENTER_NESTED takes two parameters: the address in L1 guest
    memory of a hv_regs struct and the address of a pt_regs struct.  The
    hcall requests the L0 hypervisor to use the register values in these
    structs to run a L2 guest and to return the exit state of the L2 guest
    in these structs.  These are in the endianness of the L1 guest, rather
    than being always big-endian as is usually the case for PAPR
    hypercalls.
    
    This is convenient because it means that the L1 guest can pass the
    address of the regs field in its kvm_vcpu_arch struct.  This also
    improves performance slightly by avoiding the need for two copies of
    the pt_regs struct.
    
    When reading/writing these structures, this patch handles the case
    where the endianness of the L1 guest differs from that of the L0
    hypervisor, by byteswapping the structures after reading and before
    writing them back.
    
    Since all the fields of the pt_regs are of the same type, i.e.,
    unsigned long, we treat it as an array of unsigned longs.  The fields
    of struct hv_guest_state are not all the same, so its fields are
    byteswapped individually.
    Reviewed-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    Signed-off-by: default avatarSuraj Jitindar Singh <sjitindarsingh@gmail.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    10b5022d
book3s_hv_nested.c 32.2 KB