blob: 15ce3d6d2cbecc0d9f5164a37efe7e28a2eafa83 [file] [log] [blame]
Michalis Pappase4c00bb2018-03-20 14:30:00 +08001/*
Tomas Pilar18b284b2020-10-28 15:35:53 +00002 * Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
Michalis Pappase4c00bb2018-03-20 14:30:00 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Michalis Pappase4c00bb2018-03-20 14:30:00 +08007#include <stdint.h>
8
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00009#include <arch_helpers.h>
Tomas Pilar18b284b2020-10-28 15:35:53 +000010#include <arch_features.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000011#include <plat/common/platform.h>
12
Michalis Pappase4c00bb2018-03-20 14:30:00 +080013#define RANDOM_CANARY_VALUE ((u_register_t) 3288484550995823360ULL)
14
15u_register_t plat_get_stack_protector_canary(void)
16{
Tomas Pilar18b284b2020-10-28 15:35:53 +000017#if ENABLE_FEAT_RNG
18 /* Use the RNDR instruction if the CPU supports it */
19 if (is_armv8_5_rng_present()) {
20 return read_rndr();
21 }
22#endif
23
Michalis Pappase4c00bb2018-03-20 14:30:00 +080024 /*
Tomas Pilar18b284b2020-10-28 15:35:53 +000025 * Ideally, a random number should be returned above. If a random
26 * number generator is not supported, return instead a
Michalis Pappase4c00bb2018-03-20 14:30:00 +080027 * combination of a timer's value and a compile-time constant.
Tomas Pilar18b284b2020-10-28 15:35:53 +000028 * This is better than nothing but not necessarily really secure.
Michalis Pappase4c00bb2018-03-20 14:30:00 +080029 */
30 return RANDOM_CANARY_VALUE ^ read_cntpct_el0();
31}
32