1 /*
2  * Copyright 2021 The Hafnium Authors.
3  *
4  * Use of this source code is governed by a BSD-style
5  * license that can be found in the LICENSE file or at
6  * https://opensource.org/licenses/BSD-3-Clause.
7  */
8 
9 #include <stdalign.h>
10 #include <stdint.h>
11 
12 #include "hf/ffa.h"
13 #include "hf/mm.h"
14 #include "hf/std.h"
15 
16 #include "vmapi/hf/call.h"
17 
18 #include "test/abort.h"
19 #include "test/hftest.h"
20 #include "test/vmapi/ffa.h"
21 
22 static struct ffa_boot_info_header* boot_info_header;
23 
get_boot_info_header(void)24 struct ffa_boot_info_header* get_boot_info_header(void)
25 {
26 	return boot_info_header;
27 }
28 
29 alignas(4096) uint8_t kstack[MAX_CPUS][4096];
30 
31 void test_main_sp(bool);
32 
kmain(struct ffa_boot_info_header * boot_info_blob)33 noreturn void kmain(struct ffa_boot_info_header* boot_info_blob)
34 {
35 	extern void secondary_ep_entry(void);
36 	struct ffa_value res;
37 
38 	/*
39 	 * Initialize the stage-1 MMU and identity-map the entire address space.
40 	 */
41 	if (!hftest_mm_init()) {
42 		HFTEST_LOG_FAILURE();
43 		HFTEST_LOG(HFTEST_LOG_INDENT "Memory initialization failed");
44 		abort();
45 	}
46 
47 	/* Register entry point for secondary vCPUs. */
48 	res = ffa_secondary_ep_register((uintptr_t)secondary_ep_entry);
49 	EXPECT_EQ(res.func, FFA_SUCCESS_32);
50 
51 	boot_info_header = boot_info_blob;
52 
53 	test_main_sp(true);
54 
55 	/* Do not expect to get to this point, so abort. */
56 	abort();
57 }
58