hc
2024-08-12 233ab1bd4c5697f5cdec94e60206e8c6ac609b4c
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/*
 * This is from the ARM TF Project,
 * Repository: https://github.com/ARM-software/arm-trusted-firmware.git
 * File: include/common/bl_common.h
 * Portions copyright (c) 2013-2016, ARM Limited and Contributors. All rights
 * reserved.
 * Copyright (C) 2016-2017 Rockchip Electronic Co.,Ltd
 *
 * SPDX-License-Identifier:     BSD-3-Clause
 */
 
#ifndef __BL_COMMON_H__
#define __BL_COMMON_H__
 
#define ATF_PARAM_EP        0x01
#define ATF_PARAM_IMAGE_BINARY    0x02
#define ATF_PARAM_BL31        0x03
 
#define ATF_VERSION_1    0x01
 
#define ATF_EP_SECURE    0x0
#define ATF_EP_NON_SECURE    0x1
 
#define SET_PARAM_HEAD(_p, _type, _ver, _attr) do { \
   (_p)->h.type = (uint8_t)(_type); \
   (_p)->h.version = (uint8_t)(_ver); \
   (_p)->h.size = (uint16_t)sizeof(*_p); \
   (_p)->h.attr = (uint32_t)(_attr) ; \
   } while (0)
 
/* ARM64 */
#define MODE_RW_SHIFT    0x4
#define MODE_RW_MASK    0x1
#define MODE_RW_64    0x0
#define MODE_RW_32    0x1
 
#define MODE_EL_SHIFT    0x2
#define MODE_EL_MASK    0x3
#define MODE_EL3    0x3
#define MODE_EL2    0x2
#define MODE_EL1    0x1
#define MODE_EL0    0x0
 
#define MODE_SP_SHIFT    0x0
#define MODE_SP_MASK    0x1
#define MODE_SP_EL0    0x0
#define MODE_SP_ELX    0x1
 
#define SPSR_DAIF_SHIFT    6
#define SPSR_DAIF_MASK    0x0f
 
#define SPSR_64(el, sp, daif)        \
   (MODE_RW_64 << MODE_RW_SHIFT |    \
    ((el) & MODE_EL_MASK) << MODE_EL_SHIFT |    \
    ((sp) & MODE_SP_MASK) << MODE_SP_SHIFT |    \
    ((daif) & SPSR_DAIF_MASK) << SPSR_DAIF_SHIFT)
 
#define SPSR_FIQ             (1 << 6)
#define SPSR_IRQ             (1 << 7)
#define SPSR_SERROR          (1 << 8)
#define SPSR_DEBUG           (1 << 9)
#define SPSR_EXCEPTION_MASK  (SPSR_FIQ | SPSR_IRQ | SPSR_SERROR | SPSR_DEBUG)
 
#define DAIF_FIQ_BIT (1<<0)
#define DAIF_IRQ_BIT (1<<1)
#define DAIF_ABT_BIT (1<<2)
#define DAIF_DBG_BIT (1<<3)
#define DISABLE_ALL_EXECPTIONS    \
   (DAIF_FIQ_BIT | DAIF_IRQ_BIT | DAIF_ABT_BIT | DAIF_DBG_BIT)
 
/* ARM */
#define MODE32_SHIFT        0
#define MODE32_MASK        0x1f
#define MODE32_svc        0x13
 
#define SPSR_FIQ_BIT        (1 << 0)
#define SPSR_IRQ_BIT        (1 << 1)
#define SPSR_ABT_BIT        (1 << 2)
#define SPSR_AIF_SHIFT        6
#define SPSR_AIF_MASK        0x7
 
#define EP_EE_LITTLE        0x0
#define SPSR_E_SHIFT        9
#define SPSR_E_MASK        0x1
#define SPSR_T_SHIFT        5
#define SPSR_T_MASK        0x1
#define SPSR_T_ARM        0
 
#define DISABLE_ALL_EXECPTIONS_32 \
   (SPSR_FIQ_BIT | SPSR_IRQ_BIT | SPSR_ABT_BIT)
 
#define SPSR_32(mode, isa, endian, aif)            \
   (MODE_RW_32 << MODE_RW_SHIFT |            \
   ((mode) & MODE32_MASK) << MODE32_SHIFT |    \
   ((isa) & SPSR_T_MASK) << SPSR_T_SHIFT |     \
   ((endian) & SPSR_E_MASK) << SPSR_E_SHIFT |    \
   ((aif) & SPSR_AIF_MASK) << SPSR_AIF_SHIFT)
 
#ifndef __ASSEMBLY__
 
/*******************************************************************************
 * Structure used for telling the next BL how much of a particular type of
 * memory is available for its use and how much is already used.
 ******************************************************************************/
struct aapcs64_params {
   unsigned long arg0;
   unsigned long arg1;
   unsigned long arg2;
   unsigned long arg3;
   unsigned long arg4;
   unsigned long arg5;
   unsigned long arg6;
   unsigned long arg7;
};
 
/***************************************************************************
 * This structure provides version information and the size of the
 * structure, attributes for the structure it represents
 ***************************************************************************/
struct param_header {
   uint8_t type;        /* type of the structure */
   uint8_t version;    /* version of this structure */
   uint16_t size;      /* size of this structure in bytes */
   uint32_t attr;      /* attributes: unused bits SBZ */
};
 
/*****************************************************************************
 * This structure represents the superset of information needed while
 * switching exception levels. The only two mechanisms to do so are
 * ERET & SMC. Security state is indicated using bit zero of header
 * attribute
 * NOTE: BL1 expects entrypoint followed by spsr at an offset from the start
 * of this structure defined by the macro `ENTRY_POINT_INFO_PC_OFFSET` while
 * processing SMC to jump to BL31.
 *****************************************************************************/
struct entry_point_info {
   struct param_header h;
   uintptr_t pc;
   uint32_t spsr;
   struct aapcs64_params args;
};
 
/*****************************************************************************
 * Image info binary provides information from the image loader that
 * can be used by the firmware to manage available trusted RAM.
 * More advanced firmware image formats can provide additional
 * information that enables optimization or greater flexibility in the
 * common firmware code
 *****************************************************************************/
struct atf_image_info {
   struct param_header h;
   uintptr_t image_base;   /* physical address of base of image */
   uint32_t image_size;    /* bytes read from image file */
};
 
/*****************************************************************************
 * The image descriptor struct definition.
 *****************************************************************************/
struct image_desc {
   /* Contains unique image id for the image. */
   unsigned int image_id;
   /*
    * This member contains Image state information.
    * Refer IMAGE_STATE_XXX defined above.
    */
   unsigned int state;
   uint32_t copied_size;    /* image size copied in blocks */
   struct atf_image_info atf_image_info;
   struct entry_point_info ep_info;
};
 
/*******************************************************************************
 * This structure represents the superset of information that can be passed to
 * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be
 * populated only if BL2 detects its presence. A pointer to a structure of this
 * type should be passed in X0 to BL31's cold boot entrypoint.
 *
 * Use of this structure and the X0 parameter is not mandatory: the BL31
 * platform code can use other mechanisms to provide the necessary information
 * about BL32 and BL33 to the common and SPD code.
 *
 * BL31 image information is mandatory if this structure is used. If either of
 * the optional BL32 and BL33 image information is not provided, this is
 * indicated by the respective image_info pointers being zero.
 ******************************************************************************/
struct bl31_params {
   struct param_header h;
   struct atf_image_info *bl31_image_info;
   struct entry_point_info *bl32_ep_info;
   struct atf_image_info *bl32_image_info;
   struct entry_point_info *bl33_ep_info;
   struct atf_image_info *bl33_image_info;
};
 
/*******************************************************************************
 * This structure represents the superset of information that is passed to
 * BL31, e.g. while passing control to it from BL2, bl31_params
 * and other platform specific params
 ******************************************************************************/
struct bl2_to_bl31_params_mem {
   struct bl31_params bl31_params;
   struct atf_image_info bl31_image_info;
   struct atf_image_info bl32_image_info;
   struct atf_image_info bl33_image_info;
   struct entry_point_info bl33_ep_info;
   struct entry_point_info bl32_ep_info;
   struct entry_point_info bl31_ep_info;
};
 
#endif /*__ASSEMBLY__*/
 
#endif /* __BL_COMMON_H__ */