blob: d0b4a0f1d3b5cae2b982fa5d9ba776f7ff985210 [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 /* Use the RNDR instruction if the CPU supports it */
Andre Przywara436b4bb2023-02-22 17:55:59 +000018 if (is_feat_rng_supported()) {
Tomas Pilar18b284b2020-10-28 15:35:53 +000019 return read_rndr();
20 }
Tomas Pilar18b284b2020-10-28 15:35:53 +000021
Michalis Pappase4c00bb2018-03-20 14:30:00 +080022 /*
Tomas Pilar18b284b2020-10-28 15:35:53 +000023 * Ideally, a random number should be returned above. If a random
24 * number generator is not supported, return instead a
Michalis Pappase4c00bb2018-03-20 14:30:00 +080025 * combination of a timer's value and a compile-time constant.
Tomas Pilar18b284b2020-10-28 15:35:53 +000026 * This is better than nothing but not necessarily really secure.
Michalis Pappase4c00bb2018-03-20 14:30:00 +080027 */
28 return RANDOM_CANARY_VALUE ^ read_cntpct_el0();
29}
30