• Jason A. Donenfeld's avatar
    random: handle archrandom with multiple longs · d349ab99
    Jason A. Donenfeld authored
    The archrandom interface was originally designed for x86, which supplies
    RDRAND/RDSEED for receiving random words into registers, resulting in
    one function to generate an int and another to generate a long. However,
    other architectures don't follow this.
    
    On arm64, the SMCCC TRNG interface can return between one and three
    longs. On s390, the CPACF TRNG interface can return arbitrary amounts,
    with four longs having the same cost as one. On UML, the os_getrandom()
    interface can return arbitrary amounts.
    
    So change the api signature to take a "max_longs" parameter designating
    the maximum number of longs requested, and then return the number of
    longs generated.
    
    Since callers need to check this return value and loop anyway, each arch
    implementation does not bother implementing its own loop to try again to
    fill the maximum number of longs. Additionally, all existing callers
    pass in a constant max_longs parameter. Taken together, these two things
    mean that the codegen doesn't really change much for one-word-at-a-time
    platforms, while performance is greatly improved on platforms such as
    s390.
    Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Acked-by: default avatarBorislav Petkov <bp@suse.de>
    Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
    d349ab99
archrandom.h 615 Bytes