plat/arm: juno: Use TRNG entropy source for SMCCC TRNG interface

Now that we have a framework for the SMCCC TRNG interface, and the
existing Juno entropy code has been prepared, add the few remaining bits
to implement this interface for the Juno Trusted Entropy Source.

We retire the existing Juno specific RNG interface, and use the generic
one for the stack canary generation.

Change-Id: Ib6a6e5568cb8e0059d71740e2d18d6817b07127d
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
This commit is contained in:
Andre Przywara 2020-10-08 00:45:22 +01:00
parent eb18ce3283
commit cb5f0faa71
4 changed files with 31 additions and 24 deletions

View File

@ -1,12 +0,0 @@
/*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef JUNO_DECL_H
#define JUNO_DECL_H
bool juno_getentropy(uint64_t *buf);
#endif /* JUNO_DECL_H */

View File

@ -7,15 +7,14 @@
#include <arch_helpers.h>
#include <common/debug.h>
#include <lib/utils.h>
#include <plat/common/plat_trng.h>
#include <platform_def.h>
#include "juno_decl.h"
u_register_t plat_get_stack_protector_canary(void)
{
uint64_t entropy;
if (!juno_getentropy(&entropy)) {
if (!plat_get_entropy(&entropy)) {
ERROR("Not enough entropy to initialize canary value\n");
panic();
}

View File

@ -14,7 +14,11 @@
#include <lib/utils_def.h>
#include <platform_def.h>
#include "juno_decl.h"
#include <lib/smccc.h>
#include <services/trng_svc.h>
#include <smccc_helpers.h>
#include <plat/common/platform.h>
#define NSAMPLE_CLOCKS 1 /* min 1 cycle, max 231 cycles */
#define NRETRIES 5
@ -36,20 +40,24 @@ static bool output_valid(void)
return false; /* No output data available. */
}
DEFINE_SVC_UUID2(_plat_trng_uuid,
0x23523c58, 0x7448, 0x4083, 0x9d, 0x16,
0xe3, 0xfa, 0xb9, 0xf1, 0x73, 0xbc
);
uuid_t plat_trng_uuid;
static uint32_t crc_value = ~0U;
/*
* This function fills `buf` with 8 bytes of entropy.
* It uses the Trusted Entropy Source peripheral on Juno.
* Returns 'true' when the buffer has been filled with entropy
* successfully, or 'false' otherwise.
* Uses the Trusted Entropy Source peripheral on Juno to return 8 bytes of
* entropy. Returns 'true' when done successfully, 'false' otherwise.
*/
bool juno_getentropy(uint64_t *buf)
bool plat_get_entropy(uint64_t *out)
{
uint64_t ret;
assert(buf);
assert(!check_uptr_overflow((uintptr_t)buf, sizeof(*buf)));
assert(out);
assert(!check_uptr_overflow((uintptr_t)out, sizeof(*out)));
if (!juno_trng_initialized) {
/* Disable interrupt mode. */
@ -79,7 +87,7 @@ bool juno_getentropy(uint64_t *buf)
crc_value = __crc32w(crc_value, mmio_read_32(TRNG_BASE + 8));
crc_value = __crc32w(crc_value, mmio_read_32(TRNG_BASE + 12));
*buf = ret | crc_value;
*out = ret | crc_value;
/* Acknowledge current cycle, clear output registers. */
mmio_write_32(TRNG_BASE + TRNG_STATUS, 1);
@ -88,3 +96,13 @@ bool juno_getentropy(uint64_t *buf)
return true;
}
void plat_entropy_setup(void)
{
uint64_t dummy;
plat_trng_uuid = _plat_trng_uuid;
/* Initialise the entropy source and trigger RNG generation */
plat_get_entropy(&dummy);
}

View File

@ -44,6 +44,8 @@ ifeq (${JUNO_TZMP1}, 1)
$(eval $(call add_define,JUNO_TZMP1))
endif
TRNG_SUPPORT := 1
ifeq (${JUNO_AARCH32_EL3_RUNTIME}, 1)
# Include BL32 in FIP
NEED_BL32 := yes