1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
/*
* Copyright (c) 2018, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <console.h>
#include <debug.h>
#include <pl011.h>
#include <platform_def.h>
#include <secure_partition.h>
#include <sp_helpers.h>
#include <spm_svc.h>
#include <std_svc.h>
#include "cactus_mm.h"
#include "cactus_mm_tests.h"
/* Host machine information injected by the build system in the ELF file. */
extern const char build_message[];
extern const char version_string[];
/*
* The ARM Trusted Firmware passes a description of the memory resources
* allocated to the secure partition through the x0 register. This maps to
* a secure_partition_boot_info_t structure type.
*
* This functions prints the information stored in this structure.
*/
static void cactus_print_memory_layout(const secure_partition_boot_info_t *boot_info)
{
NOTICE("Secure Partition memory layout:\n");
NOTICE(" Secure Partition image : %p - %p\n",
(void *) boot_info->sp_image_base,
(void *)(boot_info->sp_image_base + boot_info->sp_image_size));
NOTICE(" Text region : %p - %p\n",
(void *) CACTUS_TEXT_START, (void *) CACTUS_TEXT_END);
NOTICE(" Read-only data region : %p - %p\n",
(void *) CACTUS_RODATA_START, (void *) CACTUS_RODATA_END);
NOTICE(" Read-write data region : %p - %p\n",
(void *) CACTUS_RWDATA_START, (void *) CACTUS_RWDATA_END);
NOTICE(" BSS region : %p - %p\n",
(void *) CACTUS_BSS_START, (void *) CACTUS_BSS_END);
NOTICE(" Unused SP image space : %p - %p\n",
(void *) CACTUS_BSS_END,
(void *)(boot_info->sp_image_base + boot_info->sp_image_size));
NOTICE(" EL3-EL0 shared buffer : %p - %p\n",
(void *) boot_info->sp_shared_buf_base,
(void *)(boot_info->sp_shared_buf_base + boot_info->sp_shared_buf_size));
NOTICE(" S-NS shared buffer : %p - %p\n",
(void *) boot_info->sp_ns_comm_buf_base,
(void *)(boot_info->sp_ns_comm_buf_base + boot_info->sp_ns_comm_buf_size));
assert(boot_info->sp_ns_comm_buf_base == ARM_SECURE_SERVICE_BUFFER_BASE);
assert(boot_info->sp_ns_comm_buf_size == ARM_SECURE_SERVICE_BUFFER_SIZE);
NOTICE(" Stacks region (%u CPUS) : %p - %p\n",
boot_info->num_cpus,
(void *) boot_info->sp_stack_base,
(void *)(boot_info->sp_stack_base +
(boot_info->sp_pcpu_stack_size * boot_info->num_cpus)));
NOTICE(" Heap region : %p - %p\n",
(void *) boot_info->sp_heap_base,
(void *)(boot_info->sp_heap_base + boot_info->sp_heap_size));
NOTICE("Total memory : %p - %p\n",
(void *) boot_info->sp_mem_base, (void *) boot_info->sp_mem_limit);
}
void __dead2 cactus_main(void *el3_el0_buffer, size_t el3_el0_buffer_size)
{
console_init(PL011_UART2_BASE,
PL011_UART2_CLK_IN_HZ,
PL011_BAUDRATE);
NOTICE("Booting test Secure Partition Cactus\n");
NOTICE("%s\n", build_message);
NOTICE("%s\n", version_string);
NOTICE("Running at S-EL0\n");
const secure_partition_boot_info_t *boot_info =
(const secure_partition_boot_info_t *) el3_el0_buffer;
if (el3_el0_buffer_size < sizeof(secure_partition_boot_info_t)) {
ERROR("The memory buffer shared between EL3/S-EL0 is too small\n");
ERROR("It is %lu bytes, it should be at least %lu bytes\n",
el3_el0_buffer_size,
sizeof(secure_partition_boot_info_t));
panic();
}
if ((CACTUS_TEXT_START != boot_info->sp_image_base) ||
(CACTUS_RWDATA_END > boot_info->sp_image_base
+ boot_info->sp_image_size)) {
ERROR("Cactus does not fit in the buffer allocated for the secure partition\n");
panic();
}
cactus_print_memory_layout(boot_info);
/*
* Run some initial tests.
*
* These are executed when the system is still booting, just after SPM
* has handed over to Cactus.
*/
misc_tests();
system_setup_tests();
mem_attr_changes_tests(boot_info);
/*
* Handle secure service requests.
*/
secure_services_loop();
}
|