1301d27d9SRadoslaw Biernacki /* 283683dddSTomas Pilar * Copyright (c) 2021, ARM Limited and Contributors. All rights reserved. 3301d27d9SRadoslaw Biernacki * 4301d27d9SRadoslaw Biernacki * SPDX-License-Identifier: BSD-3-Clause 5301d27d9SRadoslaw Biernacki */ 6301d27d9SRadoslaw Biernacki 7301d27d9SRadoslaw Biernacki #include <stdint.h> 8301d27d9SRadoslaw Biernacki 9301d27d9SRadoslaw Biernacki #include <arch_helpers.h> 1083683dddSTomas Pilar #include <arch_features.h> 11301d27d9SRadoslaw Biernacki #include <plat/common/platform.h> 12301d27d9SRadoslaw Biernacki 13301d27d9SRadoslaw Biernacki #define RANDOM_CANARY_VALUE ((u_register_t) 3288484550995823360ULL) 14301d27d9SRadoslaw Biernacki plat_get_stack_protector_canary(void)15301d27d9SRadoslaw Biernackiu_register_t plat_get_stack_protector_canary(void) 16301d27d9SRadoslaw Biernacki { 1783683dddSTomas Pilar /* Use the RNDR instruction if the CPU supports it */ 18*ac17e52cSAndre Przywara if (is_feat_rng_supported()) { 1983683dddSTomas Pilar return read_rndr(); 2083683dddSTomas Pilar } 2183683dddSTomas Pilar 22301d27d9SRadoslaw Biernacki /* 2383683dddSTomas Pilar * Ideally, a random number should be returned above. If a random 2483683dddSTomas Pilar * number generator is not supported, return instead a 25301d27d9SRadoslaw Biernacki * combination of a timer's value and a compile-time constant. 2683683dddSTomas Pilar * This is better than nothing but not necessarily really secure. 27301d27d9SRadoslaw Biernacki */ 28301d27d9SRadoslaw Biernacki return RANDOM_CANARY_VALUE ^ read_cntpct_el0(); 29301d27d9SRadoslaw Biernacki } 30301d27d9SRadoslaw Biernacki 31