Commit cb5f0faa authored by Andre Przywara's avatar Andre Przywara
Browse files

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: default avatarAndre Przywara <andre.przywara@arm.com>
parent eb18ce32
/*
* 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 */
......@@ -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();
}
......
......@@ -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);
}
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment