4 #include <linux/arm-smccc.h>
5 #include <linux/kvm_host.h>
7 #include <asm/kvm_emulate.h>
11 #define ARM_SMCCC_TRNG_VERSION_1_0 0x10000UL
14 #define TRNG_SUCCESS 0UL
15 #define TRNG_NOT_SUPPORTED ((unsigned long)-1)
16 #define TRNG_INVALID_PARAMETER ((unsigned long)-2)
17 #define TRNG_NO_ENTROPY ((unsigned long)-3)
19 #define TRNG_MAX_BITS64 192
21 static const uuid_t arm_smc_trng_uuid
__aligned(4) = UUID_INIT(
22 0x0d21e000, 0x4384, 0x11eb, 0x80, 0x70, 0x52, 0x44, 0x55, 0x4e, 0x5a, 0x4c);
30 if (num_bits > 3 *
size) {
36 for (i = 0; i < DIV_ROUND_UP(num_bits, BITS_PER_LONG); i++)
37 bits[i] = get_random_long();
43 upper_32_bits(bits[0]), lower_32_bits(bits[0]));
47 memzero_explicit(bits,
sizeof(bits));
53 const __le32 *u = (__le32 *)arm_smc_trng_uuid.b;
59 case ARM_SMCCC_TRNG_VERSION:
62 case ARM_SMCCC_TRNG_FEATURES:
64 case ARM_SMCCC_TRNG_VERSION:
65 case ARM_SMCCC_TRNG_FEATURES:
66 case ARM_SMCCC_TRNG_GET_UUID:
67 case ARM_SMCCC_TRNG_RND32:
68 case ARM_SMCCC_TRNG_RND64:
72 case ARM_SMCCC_TRNG_GET_UUID:
74 le32_to_cpu(u[2]), le32_to_cpu(u[3]));
76 case ARM_SMCCC_TRNG_RND32:
79 case ARM_SMCCC_TRNG_RND64:
static u32 smccc_get_function(struct kvm_vcpu *vcpu)
static unsigned long smccc_get_arg1(struct kvm_vcpu *vcpu)
static void smccc_set_retval(struct kvm_vcpu *vcpu, unsigned long a0, unsigned long a1, unsigned long a2, unsigned long a3)
static int kvm_trng_do_rnd(struct kvm_vcpu *vcpu, int size)
#define TRNG_INVALID_PARAMETER
int kvm_trng_call(struct kvm_vcpu *vcpu)
#define ARM_SMCCC_TRNG_VERSION_1_0
static const uuid_t arm_smc_trng_uuid __aligned(4)
#define TRNG_NOT_SUPPORTED