blob: ddaa3cb7e1830f84c5ecebf067d977ebd687dc53 [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;
nabkah01002e5692022-10-10 12:36:46 +010023/*
AlexeiFedorov2f30f102023-03-13 19:37:46 +000024 * This function reads sleep time in ms from shared buffer and spins PE
25 * in a loop for that time period.
nabkah01002e5692022-10-10 12:36:46 +010026 */
27static void realm_sleep_cmd(void)
28{
Shruti Gupta52b5f022023-10-12 22:02:29 +010029 uint64_t sleep = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
nabkah01002e5692022-10-10 12:36:46 +010030
Shruti Guptaa276b202023-12-18 10:07:43 +000031 realm_printf("going to sleep for %llums\n", sleep);
nabkah01002e5692022-10-10 12:36:46 +010032 waitms(sleep);
33}
34
Shruti Gupta6bb95102023-10-02 13:21:37 +010035static void realm_loop_cmd(void)
36{
37 while (true) {
38 waitms(500);
39 }
40}
41
nabkah01002e5692022-10-10 12:36:46 +010042/*
43 * This function requests RSI/ABI version from RMM.
44 */
Shruti Gupta40de8ec2023-10-12 21:45:12 +010045static bool realm_get_rsi_version(void)
nabkah01002e5692022-10-10 12:36:46 +010046{
Shruti Gupta40de8ec2023-10-12 21:45:12 +010047 u_register_t version = 0U;
nabkah01002e5692022-10-10 12:36:46 +010048
Shruti Gupta40de8ec2023-10-12 21:45:12 +010049 version = rsi_get_version(RSI_ABI_VERSION_VAL);
nabkah01002e5692022-10-10 12:36:46 +010050 if (version == (u_register_t)SMC_UNKNOWN) {
Shruti Gupta40de8ec2023-10-12 21:45:12 +010051 realm_printf("SMC_RSI_ABI_VERSION failed\n");
52 return false;
nabkah01002e5692022-10-10 12:36:46 +010053 }
54
Shruti Gupta40de8ec2023-10-12 21:45:12 +010055 realm_printf("RSI ABI version %u.%u (expected: %u.%u)\n",
nabkah01002e5692022-10-10 12:36:46 +010056 RSI_ABI_VERSION_GET_MAJOR(version),
57 RSI_ABI_VERSION_GET_MINOR(version),
Shruti Gupta40de8ec2023-10-12 21:45:12 +010058 RSI_ABI_VERSION_GET_MAJOR(RSI_ABI_VERSION_VAL),
59 RSI_ABI_VERSION_GET_MINOR(RSI_ABI_VERSION_VAL));
60 return true;
nabkah01002e5692022-10-10 12:36:46 +010061}
62
Shruti Guptabb772192023-10-09 16:08:28 +010063bool test_realm_set_ripas(void)
64{
65 u_register_t ret, base, new_base, top;
66 rsi_ripas_respose_type response;
67 rsi_ripas_type ripas;
68
69 base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
70 top = realm_shared_data_get_my_host_val(HOST_ARG2_INDEX);
71 realm_printf("base=0x%lx top =0x%lx\n", base, top);
72 ret = rsi_ipa_state_get(base, &ripas);
73 if (ripas != RSI_EMPTY) {
74 return false;
75 }
76
77 ret = rsi_ipa_state_set(base, top, RSI_RAM,
78 RSI_NO_CHANGE_DESTROYED, &new_base, &response);
79 if (ret != RSI_SUCCESS || response != RSI_ACCEPT) {
80 return false;
81 }
82 while (new_base < top) {
83 realm_printf("new_base=0x%lx top =0x%lx\n", new_base, top);
84 ret = rsi_ipa_state_set(new_base, top, RSI_RAM,
85 RSI_NO_CHANGE_DESTROYED, &new_base, &response);
86 if (ret != RSI_SUCCESS || response != RSI_ACCEPT) {
87 realm_printf("rsi_ipa_state_set failed\n");
88 return false;
89 }
90 }
91
92 /* Verify that RIAS has changed for range base-top. */
93 for (unsigned int i = 0U; (base + (PAGE_SIZE * i) < top); i++) {
94 ret = rsi_ipa_state_get(base + (PAGE_SIZE * i), &ripas);
95 if (ret != RSI_SUCCESS || ripas != RSI_RAM) {
96 realm_printf("rsi_ipa_state_get failed base=0x%lx, ripas=0x%x\n",
97 base + (PAGE_SIZE * i), ripas);
98 return false;
99 }
100 }
101 return true;
102}
103
Shruti Guptafef86212023-10-17 12:15:38 +0100104bool test_realm_reject_set_ripas(void)
105{
106 u_register_t ret, base, new_base;
107 rsi_ripas_respose_type response;
108 rsi_ripas_type ripas;
109
110 base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
111 ret = rsi_ipa_state_get(base, &ripas);
112 if (ret != RSI_SUCCESS || ripas != RSI_EMPTY) {
113 realm_printf("Wrong initial ripas=0x%lx\n", ripas);
114 return false;
115 }
116 ret = rsi_ipa_state_set(base, base + PAGE_SIZE, RSI_RAM,
117 RSI_NO_CHANGE_DESTROYED, &new_base, &response);
118 if (ret == RSI_SUCCESS && response == RSI_REJECT) {
119 realm_printf("rsi_ipa_state_set passed response = %d\n", response);
120 ret = rsi_ipa_state_get(base, &ripas);
121 if (ret == RSI_SUCCESS && ripas == RSI_EMPTY) {
122 return true;
123 } else {
124 realm_printf("rsi_ipa_state_get failed ripas = %d\n", ripas);
125 return false;
126 }
127 }
128 realm_printf("rsi_ipa_state_set failed ret=0x%lx, response = %d\n", ret, response);
129 return false;
130}
131
nabkah01002e5692022-10-10 12:36:46 +0100132/*
133 * This is the entry function for Realm payload, it first requests the shared buffer
134 * IPA address from Host using HOST_CALL/RSI, it reads the command to be executed,
135 * performs the request, and returns to Host with the execution state SUCCESS/FAILED
136 *
137 * Host in NS world requests Realm to execute certain operations using command
138 * depending on the test case the Host wants to perform.
139 */
140void realm_payload_main(void)
141{
nabkah01002e5692022-10-10 12:36:46 +0100142 bool test_succeed = false;
143
144 realm_set_shared_structure((host_shared_data_t *)rsi_get_ns_buffer());
Shruti Gupta550e3e82023-08-16 13:20:11 +0100145 if (realm_get_my_shared_structure() != NULL) {
146 uint8_t cmd = realm_shared_data_get_my_realm_cmd();
AlexeiFedorov2f30f102023-03-13 19:37:46 +0000147
nabkah01002e5692022-10-10 12:36:46 +0100148 switch (cmd) {
149 case REALM_SLEEP_CMD:
150 realm_sleep_cmd();
151 test_succeed = true;
152 break;
Shruti Gupta6bb95102023-10-02 13:21:37 +0100153 case REALM_LOOP_CMD:
154 realm_loop_cmd();
155 test_succeed = true;
156 break;
Shruti Gupta24597d12023-10-02 10:40:19 +0100157 case REALM_MULTIPLE_REC_PSCI_DENIED_CMD:
158 test_succeed = test_realm_multiple_rec_psci_denied_cmd();
Shruti Guptaaffbae82023-08-22 12:51:11 +0100159 case REALM_MULTIPLE_REC_MULTIPLE_CPU_CMD:
160 test_succeed = test_realm_multiple_rec_multiple_cpu_cmd();
Shruti Gupta24597d12023-10-02 10:40:19 +0100161 break;
Shruti Gupta9d0cfe82023-04-17 10:57:26 +0100162 case REALM_PAUTH_SET_CMD:
163 test_succeed = test_realm_pauth_set_cmd();
164 break;
165 case REALM_PAUTH_CHECK_CMD:
166 test_succeed = test_realm_pauth_check_cmd();
167 break;
168 case REALM_PAUTH_FAULT:
169 test_succeed = test_realm_pauth_fault();
170 break;
nabkah01002e5692022-10-10 12:36:46 +0100171 case REALM_GET_RSI_VERSION:
Shruti Gupta40de8ec2023-10-12 21:45:12 +0100172 test_succeed = realm_get_rsi_version();
nabkah01002e5692022-10-10 12:36:46 +0100173 break;
AlexeiFedorov2f30f102023-03-13 19:37:46 +0000174 case REALM_PMU_CYCLE:
175 test_succeed = test_pmuv3_cycle_works_realm();
176 break;
177 case REALM_PMU_EVENT:
178 test_succeed = test_pmuv3_event_works_realm();
179 break;
180 case REALM_PMU_PRESERVE:
181 test_succeed = test_pmuv3_rmm_preserves();
182 break;
183 case REALM_PMU_INTERRUPT:
184 test_succeed = test_pmuv3_overflow_interrupt();
185 break;
Shruti Gupta369955a2023-04-19 18:05:56 +0100186 case REALM_REQ_FPU_FILL_CMD:
Arunachalam Ganapathy7e514f62023-08-30 13:27:36 +0100187 fpu_state_write_rand(&rl_fpu_state_write);
Shruti Gupta369955a2023-04-19 18:05:56 +0100188 test_succeed = true;
189 break;
190 case REALM_REQ_FPU_CMP_CMD:
Arunachalam Ganapathy7e514f62023-08-30 13:27:36 +0100191 fpu_state_read(&rl_fpu_state_read);
192 test_succeed = !fpu_state_compare(&rl_fpu_state_write,
193 &rl_fpu_state_read);
Arunachalam Ganapathy9af432e2023-06-02 17:18:23 +0100194 break;
Shruti Guptafef86212023-10-17 12:15:38 +0100195 case REALM_REJECT_SET_RIPAS_CMD:
196 test_succeed = test_realm_reject_set_ripas();
197 break;
Shruti Guptabb772192023-10-09 16:08:28 +0100198 case REALM_SET_RIPAS_CMD:
199 test_succeed = test_realm_set_ripas();
200 break;
Arunachalam Ganapathy0bbdc2d2023-04-05 15:30:18 +0100201 case REALM_SVE_RDVL:
202 test_succeed = test_realm_sve_rdvl();
203 break;
204 case REALM_SVE_ID_REGISTERS:
205 test_succeed = test_realm_sve_read_id_registers();
206 break;
207 case REALM_SVE_PROBE_VL:
208 test_succeed = test_realm_sve_probe_vl();
Shruti Gupta369955a2023-04-19 18:05:56 +0100209 break;
Arunachalam Ganapathyc1136a82023-04-12 15:24:44 +0100210 case REALM_SVE_OPS:
211 test_succeed = test_realm_sve_ops();
212 break;
Arunachalam Ganapathy5270d012023-04-19 14:53:42 +0100213 case REALM_SVE_FILL_REGS:
214 test_succeed = test_realm_sve_fill_regs();
215 break;
Arunachalam Ganapathyf3697172023-09-04 15:04:46 +0100216 case REALM_SVE_CMP_REGS:
217 test_succeed = test_realm_sve_cmp_regs();
218 break;
Arunachalam Ganapathy73949a22023-06-05 12:01:05 +0100219 case REALM_SVE_UNDEF_ABORT:
220 test_succeed = test_realm_sve_undef_abort();
221 break;
Arunachalam Ganapathy1768e592023-05-23 13:28:38 +0100222 case REALM_SME_ID_REGISTERS:
223 test_succeed = test_realm_sme_read_id_registers();
224 break;
225 case REALM_SME_UNDEF_ABORT:
226 test_succeed = test_realm_sme_undef_abort();
227 break;
nabkah01002e5692022-10-10 12:36:46 +0100228 default:
AlexeiFedorov2f30f102023-03-13 19:37:46 +0000229 realm_printf("%s() invalid cmd %u\n", __func__, cmd);
nabkah01002e5692022-10-10 12:36:46 +0100230 break;
231 }
232 }
233
234 if (test_succeed) {
235 rsi_exit_to_host(HOST_CALL_EXIT_SUCCESS_CMD);
236 } else {
237 rsi_exit_to_host(HOST_CALL_EXIT_FAILED_CMD);
238 }
239}