• Claudio Carvalho's avatar
    powerpc/kernel: Add ucall_norets() ultravisor call handler · a49dddbd
    Claudio Carvalho authored
    The ultracalls (ucalls for short) allow the Secure Virtual Machines
    (SVM)s and hypervisor to request services from the ultravisor such as
    accessing a register or memory region that can only be accessed when
    running in ultravisor-privileged mode.
    
    This patch adds the ucall_norets() ultravisor call handler.
    
    The specific service needed from an ucall is specified in register
    R3 (the first parameter to the ucall). Other parameters to the
    ucall, if any, are specified in registers R4 through R12.
    
    Return value of all ucalls is in register R3. Other output values
    from the ucall, if any, are returned in registers R4 through R12.
    
    Each ucall returns specific error codes, applicable in the context
    of the ucall. However, like with the PowerPC Architecture Platform
    Reference (PAPR), if no specific error code is defined for a particular
    situation, then the ucall will fallback to an erroneous
    parameter-position based code. i.e U_PARAMETER, U_P2, U_P3 etc depending
    on the ucall parameter that may have caused the error.
    
    Every host kernel (powernv) needs to be able to do ucalls in case it
    ends up being run in a machine with ultravisor enabled. Otherwise, the
    kernel may crash early in boot trying to access ultravisor resources,
    for instance, trying to set the partition table entry 0. Secure guests
    also need to be able to do ucalls and its kernel may not have
    CONFIG_PPC_POWERNV=y. For that reason, the ucall.S file is placed under
    arch/powerpc/kernel.
    
    If ultravisor is not enabled, the ucalls will be redirected to the
    hypervisor which must handle/fail the call.
    
    Thanks to inputs from Ram Pai and Michael Anderson.
    Signed-off-by: default avatarClaudio Carvalho <cclaudio@linux.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20190822034838.27876-3-cclaudio@linux.ibm.com
    a49dddbd
ucall.S 304 Bytes