blob: aaf7479cdb2eb8c7bb5e8c78c7efa8fa0e5ac1fa [file] [log] [blame]
nabkah01002e5692022-10-10 12:36:46 +01001/*
AlexeiFedorov2f30f102023-03-13 19:37:46 +00002 * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
nabkah01002e5692022-10-10 12:36:46 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#include <stdio.h>
9
Shruti Gupta9d0cfe82023-04-17 10:57:26 +010010#include <arch_features.h>
nabkah01002e5692022-10-10 12:36:46 +010011#include <debug.h>
Shruti Gupta369955a2023-04-19 18:05:56 +010012#include <fpu.h>
nabkah01002e5692022-10-10 12:36:46 +010013#include <host_realm_helper.h>
14#include <host_shared_data.h>
Shruti Gupta9d0cfe82023-04-17 10:57:26 +010015#include <pauth.h>
nabkah01002e5692022-10-10 12:36:46 +010016#include "realm_def.h"
17#include <realm_rsi.h>
AlexeiFedorov2f30f102023-03-13 19:37:46 +000018#include <realm_tests.h>
nabkah01002e5692022-10-10 12:36:46 +010019#include <tftf_lib.h>
20
Arunachalam Ganapathy7e514f62023-08-30 13:27:36 +010021static fpu_state_t rl_fpu_state_write;
22static fpu_state_t rl_fpu_state_read;
23
nabkah01002e5692022-10-10 12:36:46 +010024/*
AlexeiFedorov2f30f102023-03-13 19:37:46 +000025 * This function reads sleep time in ms from shared buffer and spins PE
26 * in a loop for that time period.
nabkah01002e5692022-10-10 12:36:46 +010027 */
28static void realm_sleep_cmd(void)
29{
Shruti Gupta52b5f022023-10-12 22:02:29 +010030 uint64_t sleep = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
nabkah01002e5692022-10-10 12:36:46 +010031
AlexeiFedorov2f30f102023-03-13 19:37:46 +000032 realm_printf("Realm: going to sleep for %llums\n", sleep);
nabkah01002e5692022-10-10 12:36:46 +010033 waitms(sleep);
34}
35
Shruti Gupta6bb95102023-10-02 13:21:37 +010036static void realm_loop_cmd(void)
37{
38 while (true) {
39 waitms(500);
40 }
41}
42
nabkah01002e5692022-10-10 12:36:46 +010043/*
44 * This function requests RSI/ABI version from RMM.
45 */
Shruti Gupta40de8ec2023-10-12 21:45:12 +010046static bool realm_get_rsi_version(void)
nabkah01002e5692022-10-10 12:36:46 +010047{
Shruti Gupta40de8ec2023-10-12 21:45:12 +010048 u_register_t version = 0U;
nabkah01002e5692022-10-10 12:36:46 +010049
Shruti Gupta40de8ec2023-10-12 21:45:12 +010050 version = rsi_get_version(RSI_ABI_VERSION_VAL);
nabkah01002e5692022-10-10 12:36:46 +010051 if (version == (u_register_t)SMC_UNKNOWN) {
Shruti Gupta40de8ec2023-10-12 21:45:12 +010052 realm_printf("SMC_RSI_ABI_VERSION failed\n");
53 return false;
nabkah01002e5692022-10-10 12:36:46 +010054 }
55
Shruti Gupta40de8ec2023-10-12 21:45:12 +010056 realm_printf("RSI ABI version %u.%u (expected: %u.%u)\n",
nabkah01002e5692022-10-10 12:36:46 +010057 RSI_ABI_VERSION_GET_MAJOR(version),
58 RSI_ABI_VERSION_GET_MINOR(version),
Shruti Gupta40de8ec2023-10-12 21:45:12 +010059 RSI_ABI_VERSION_GET_MAJOR(RSI_ABI_VERSION_VAL),
60 RSI_ABI_VERSION_GET_MINOR(RSI_ABI_VERSION_VAL));
61 return true;
nabkah01002e5692022-10-10 12:36:46 +010062}
63
64/*
65 * This is the entry function for Realm payload, it first requests the shared buffer
66 * IPA address from Host using HOST_CALL/RSI, it reads the command to be executed,
67 * performs the request, and returns to Host with the execution state SUCCESS/FAILED
68 *
69 * Host in NS world requests Realm to execute certain operations using command
70 * depending on the test case the Host wants to perform.
71 */
72void realm_payload_main(void)
73{
nabkah01002e5692022-10-10 12:36:46 +010074 bool test_succeed = false;
75
76 realm_set_shared_structure((host_shared_data_t *)rsi_get_ns_buffer());
Shruti Gupta550e3e82023-08-16 13:20:11 +010077 if (realm_get_my_shared_structure() != NULL) {
78 uint8_t cmd = realm_shared_data_get_my_realm_cmd();
AlexeiFedorov2f30f102023-03-13 19:37:46 +000079
nabkah01002e5692022-10-10 12:36:46 +010080 switch (cmd) {
81 case REALM_SLEEP_CMD:
82 realm_sleep_cmd();
83 test_succeed = true;
84 break;
Shruti Gupta6bb95102023-10-02 13:21:37 +010085 case REALM_LOOP_CMD:
86 realm_loop_cmd();
87 test_succeed = true;
88 break;
Shruti Gupta24597d12023-10-02 10:40:19 +010089 case REALM_MULTIPLE_REC_PSCI_DENIED_CMD:
90 test_succeed = test_realm_multiple_rec_psci_denied_cmd();
91 break;
Shruti Gupta9d0cfe82023-04-17 10:57:26 +010092 case REALM_PAUTH_SET_CMD:
93 test_succeed = test_realm_pauth_set_cmd();
94 break;
95 case REALM_PAUTH_CHECK_CMD:
96 test_succeed = test_realm_pauth_check_cmd();
97 break;
98 case REALM_PAUTH_FAULT:
99 test_succeed = test_realm_pauth_fault();
100 break;
nabkah01002e5692022-10-10 12:36:46 +0100101 case REALM_GET_RSI_VERSION:
Shruti Gupta40de8ec2023-10-12 21:45:12 +0100102 test_succeed = realm_get_rsi_version();
nabkah01002e5692022-10-10 12:36:46 +0100103 break;
AlexeiFedorov2f30f102023-03-13 19:37:46 +0000104 case REALM_PMU_CYCLE:
105 test_succeed = test_pmuv3_cycle_works_realm();
106 break;
107 case REALM_PMU_EVENT:
108 test_succeed = test_pmuv3_event_works_realm();
109 break;
110 case REALM_PMU_PRESERVE:
111 test_succeed = test_pmuv3_rmm_preserves();
112 break;
113 case REALM_PMU_INTERRUPT:
114 test_succeed = test_pmuv3_overflow_interrupt();
115 break;
Shruti Gupta369955a2023-04-19 18:05:56 +0100116 case REALM_REQ_FPU_FILL_CMD:
Arunachalam Ganapathy7e514f62023-08-30 13:27:36 +0100117 fpu_state_write_rand(&rl_fpu_state_write);
Shruti Gupta369955a2023-04-19 18:05:56 +0100118 test_succeed = true;
119 break;
120 case REALM_REQ_FPU_CMP_CMD:
Arunachalam Ganapathy7e514f62023-08-30 13:27:36 +0100121 fpu_state_read(&rl_fpu_state_read);
122 test_succeed = !fpu_state_compare(&rl_fpu_state_write,
123 &rl_fpu_state_read);
Arunachalam Ganapathy9af432e2023-06-02 17:18:23 +0100124 break;
Arunachalam Ganapathy0bbdc2d2023-04-05 15:30:18 +0100125 case REALM_SVE_RDVL:
126 test_succeed = test_realm_sve_rdvl();
127 break;
128 case REALM_SVE_ID_REGISTERS:
129 test_succeed = test_realm_sve_read_id_registers();
130 break;
131 case REALM_SVE_PROBE_VL:
132 test_succeed = test_realm_sve_probe_vl();
Shruti Gupta369955a2023-04-19 18:05:56 +0100133 break;
Arunachalam Ganapathyc1136a82023-04-12 15:24:44 +0100134 case REALM_SVE_OPS:
135 test_succeed = test_realm_sve_ops();
136 break;
Arunachalam Ganapathy5270d012023-04-19 14:53:42 +0100137 case REALM_SVE_FILL_REGS:
138 test_succeed = test_realm_sve_fill_regs();
139 break;
Arunachalam Ganapathyf3697172023-09-04 15:04:46 +0100140 case REALM_SVE_CMP_REGS:
141 test_succeed = test_realm_sve_cmp_regs();
142 break;
Arunachalam Ganapathy73949a22023-06-05 12:01:05 +0100143 case REALM_SVE_UNDEF_ABORT:
144 test_succeed = test_realm_sve_undef_abort();
145 break;
nabkah01002e5692022-10-10 12:36:46 +0100146 default:
AlexeiFedorov2f30f102023-03-13 19:37:46 +0000147 realm_printf("%s() invalid cmd %u\n", __func__, cmd);
nabkah01002e5692022-10-10 12:36:46 +0100148 break;
149 }
150 }
151
152 if (test_succeed) {
153 rsi_exit_to_host(HOST_CALL_EXIT_SUCCESS_CMD);
154 } else {
155 rsi_exit_to_host(HOST_CALL_EXIT_FAILED_CMD);
156 }
157}