blob: 1887164fb429d34e10e3b218631a89698d20f879 [file] [log] [blame]
/*
* Copyright (c) 2024-2025, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <debug.h>
#include <stdlib.h>
#include <realm_helpers.h>
#include <realm_psi.h>
#include <realm_rsi.h>
#include <smccc.h>
static unsigned int volatile realm_got_undef_abort;
/* Generate 64-bit random number */
unsigned long long realm_rand64(void)
{
return ((unsigned long long)rand() << 32) | rand();
}
/* This function will call the Host to request IPA of the NS shared buffer */
u_register_t realm_get_ns_buffer(void)
{
smc_ret_values res = {};
struct rsi_host_call host_cal __aligned(sizeof(struct rsi_host_call));
host_cal.imm = HOST_CALL_GET_SHARED_BUFF_CMD;
res = tftf_smc(&(smc_args) {RSI_HOST_CALL, (u_register_t)&host_cal,
0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
if (res.ret0 != RSI_SUCCESS) {
/* retry with PSI */
hvc_ret_values ret = tftf_hvc(&(hvc_args) {PSI_CALL_GET_SHARED_BUFF_CMD, 0UL, 0UL,
0UL, 0UL, 0UL, 0UL, 0UL});
if (ret.ret0 != RSI_SUCCESS) {
return 0U;
}
return ret.ret1;
}
return host_cal.gprs[0];
}
bool realm_sync_exception_handler(void)
{
uint64_t esr_el1 = read_esr_el1();
if (EC_BITS(esr_el1) == EC_UNKNOWN) {
realm_printf("received undefined abort. "
"ESR_EL1: 0x%llx ELR_EL1: 0x%llx\n",
esr_el1, read_elr_el1());
realm_got_undef_abort++;
}
return true;
}
void realm_reset_undef_abort_count(void)
{
realm_got_undef_abort = 0U;
}
unsigned int realm_get_undef_abort_count(void)
{
return realm_got_undef_abort;
}