xref: /rk3399_ARM-atf/plat/arm/board/tc/tc_rng_trap.c (revision 79e7aae82dd173d1ccc63e5d553222f1d58f12f5)
1 /*
2  * Copyright (c) 2025, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <assert.h>
8 
9 #include <bl31/sync_handle.h>
10 #include <context.h>
11 #include <plat/common/plat_trng.h>
12 
13 #define XZR_REG_NUM   31
14 
15 
16 int plat_handle_rng_trap(uint64_t esr_el3, cpu_context_t *ctx)
17 {
18 	uint64_t entropy;
19 
20 	/* extract the target register number from the exception syndrome */
21 	unsigned int rt = get_sysreg_iss_rt(esr_el3);
22 
23 	/* ignore XZR accesses and writes to the register */
24 	assert(rt != XZR_REG_NUM && !is_sysreg_iss_write(esr_el3));
25 
26 	if (!plat_get_entropy(&entropy)) {
27 		ERROR("Failed to get entropy\n");
28 		panic();
29 	}
30 
31 	/* Emulate RNDR and RNDRRS */
32 	gp_regs_t *gpregs = get_gpregs_ctx(ctx);
33 
34 	write_ctx_reg(gpregs, rt, entropy);
35 
36 	/*
37 	 * We successfully handled the trap, continue with the next
38 	 * instruction.
39 	 */
40 	return TRAP_RET_CONTINUE;
41 }
42