1 /*
2  * Copyright (c) 2015-2022, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <assert.h>
8 #include <string.h>
9 
10 #include <platform_def.h>
11 
12 #include <common/bl_common.h>
13 #include <common/debug.h>
14 #include <common/desc_image_load.h>
15 #include <common/uuid.h>
16 #include <drivers/io/io_driver.h>
17 #include <drivers/io/io_encrypted.h>
18 #include <drivers/io/io_fip.h>
19 #include <drivers/io/io_memmap.h>
20 #include <drivers/io/io_semihosting.h>
21 #include <drivers/io/io_storage.h>
22 #include <lib/semihosting.h>
23 #include <tools_share/firmware_image_package.h>
24 
25 #include "qemu_private.h"
26 
27 /* Semihosting filenames */
28 #define BL2_IMAGE_NAME			"bl2.bin"
29 #define BL31_IMAGE_NAME			"bl31.bin"
30 #define BL32_IMAGE_NAME			"bl32.bin"
31 #define TB_FW_CONFIG_NAME		"tb_fw_config.dtb"
32 #define TOS_FW_CONFIG_NAME		"tos_fw_config.dtb"
33 #define BL32_EXTRA1_IMAGE_NAME		"bl32_extra1.bin"
34 #define BL32_EXTRA2_IMAGE_NAME		"bl32_extra2.bin"
35 #define BL33_IMAGE_NAME			"bl33.bin"
36 
37 #if TRUSTED_BOARD_BOOT
38 #define TRUSTED_BOOT_FW_CERT_NAME	"tb_fw.crt"
39 #define TRUSTED_KEY_CERT_NAME		"trusted_key.crt"
40 #define SOC_FW_KEY_CERT_NAME		"soc_fw_key.crt"
41 #define TOS_FW_KEY_CERT_NAME		"tos_fw_key.crt"
42 #define NT_FW_KEY_CERT_NAME		"nt_fw_key.crt"
43 #define SOC_FW_CONTENT_CERT_NAME	"soc_fw_content.crt"
44 #define TOS_FW_CONTENT_CERT_NAME	"tos_fw_content.crt"
45 #define NT_FW_CONTENT_CERT_NAME		"nt_fw_content.crt"
46 #endif /* TRUSTED_BOARD_BOOT */
47 
48 
49 
50 /* IO devices */
51 static const io_dev_connector_t *fip_dev_con;
52 static uintptr_t fip_dev_handle;
53 static const io_dev_connector_t *memmap_dev_con;
54 static uintptr_t memmap_dev_handle;
55 static const io_dev_connector_t *sh_dev_con;
56 static uintptr_t sh_dev_handle;
57 #ifndef DECRYPTION_SUPPORT_none
58 static const io_dev_connector_t *enc_dev_con;
59 static uintptr_t enc_dev_handle;
60 #endif
61 
62 static const io_block_spec_t fip_block_spec = {
63 	.offset = PLAT_QEMU_FIP_BASE,
64 	.length = PLAT_QEMU_FIP_MAX_SIZE
65 };
66 
67 static const io_uuid_spec_t bl2_uuid_spec = {
68 	.uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2,
69 };
70 
71 static const io_uuid_spec_t bl31_uuid_spec = {
72 	.uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
73 };
74 
75 static const io_uuid_spec_t bl32_uuid_spec = {
76 	.uuid = UUID_SECURE_PAYLOAD_BL32,
77 };
78 
79 static const io_uuid_spec_t bl32_extra1_uuid_spec = {
80 	.uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA1,
81 };
82 
83 static const io_uuid_spec_t bl32_extra2_uuid_spec = {
84 	.uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA2,
85 };
86 
87 static const io_uuid_spec_t tb_fw_config_uuid_spec = {
88 	.uuid = UUID_TB_FW_CONFIG,
89 };
90 
91 static const io_uuid_spec_t tos_fw_config_uuid_spec = {
92 	.uuid = UUID_TOS_FW_CONFIG,
93 };
94 
95 static const io_uuid_spec_t bl33_uuid_spec = {
96 	.uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
97 };
98 
99 #if TRUSTED_BOARD_BOOT
100 static const io_uuid_spec_t tb_fw_cert_uuid_spec = {
101 	.uuid = UUID_TRUSTED_BOOT_FW_CERT,
102 };
103 
104 static const io_uuid_spec_t trusted_key_cert_uuid_spec = {
105 	.uuid = UUID_TRUSTED_KEY_CERT,
106 };
107 
108 static const io_uuid_spec_t soc_fw_key_cert_uuid_spec = {
109 	.uuid = UUID_SOC_FW_KEY_CERT,
110 };
111 
112 static const io_uuid_spec_t tos_fw_key_cert_uuid_spec = {
113 	.uuid = UUID_TRUSTED_OS_FW_KEY_CERT,
114 };
115 
116 static const io_uuid_spec_t nt_fw_key_cert_uuid_spec = {
117 	.uuid = UUID_NON_TRUSTED_FW_KEY_CERT,
118 };
119 
120 static const io_uuid_spec_t soc_fw_cert_uuid_spec = {
121 	.uuid = UUID_SOC_FW_CONTENT_CERT,
122 };
123 
124 static const io_uuid_spec_t tos_fw_cert_uuid_spec = {
125 	.uuid = UUID_TRUSTED_OS_FW_CONTENT_CERT,
126 };
127 
128 static const io_uuid_spec_t nt_fw_cert_uuid_spec = {
129 	.uuid = UUID_NON_TRUSTED_FW_CONTENT_CERT,
130 };
131 #endif /* TRUSTED_BOARD_BOOT */
132 
133 static const io_file_spec_t sh_file_spec[] = {
134 	[BL2_IMAGE_ID] = {
135 		.path = BL2_IMAGE_NAME,
136 		.mode = FOPEN_MODE_RB
137 	},
138 	[BL31_IMAGE_ID] = {
139 		.path = BL31_IMAGE_NAME,
140 		.mode = FOPEN_MODE_RB
141 	},
142 	[BL32_IMAGE_ID] = {
143 		.path = BL32_IMAGE_NAME,
144 		.mode = FOPEN_MODE_RB
145 	},
146 	[BL32_EXTRA1_IMAGE_ID] = {
147 		.path = BL32_EXTRA1_IMAGE_NAME,
148 		.mode = FOPEN_MODE_RB
149 	},
150 	[BL32_EXTRA2_IMAGE_ID] = {
151 		.path = BL32_EXTRA2_IMAGE_NAME,
152 		.mode = FOPEN_MODE_RB
153 	},
154 	[TB_FW_CONFIG_ID] = {
155 		.path = TB_FW_CONFIG_NAME,
156 		.mode = FOPEN_MODE_RB
157 	},
158 	[TOS_FW_CONFIG_ID] = {
159 		.path = TOS_FW_CONFIG_NAME,
160 		.mode = FOPEN_MODE_RB
161 	},
162 	[BL33_IMAGE_ID] = {
163 		.path = BL33_IMAGE_NAME,
164 		.mode = FOPEN_MODE_RB
165 	},
166 #if TRUSTED_BOARD_BOOT
167 	[TRUSTED_BOOT_FW_CERT_ID] = {
168 		.path = TRUSTED_BOOT_FW_CERT_NAME,
169 		.mode = FOPEN_MODE_RB
170 	},
171 	[TRUSTED_KEY_CERT_ID] = {
172 		.path = TRUSTED_KEY_CERT_NAME,
173 		.mode = FOPEN_MODE_RB
174 	},
175 	[SOC_FW_KEY_CERT_ID] = {
176 		.path = SOC_FW_KEY_CERT_NAME,
177 		.mode = FOPEN_MODE_RB
178 	},
179 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
180 		.path = TOS_FW_KEY_CERT_NAME,
181 		.mode = FOPEN_MODE_RB
182 	},
183 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
184 		.path = NT_FW_KEY_CERT_NAME,
185 		.mode = FOPEN_MODE_RB
186 	},
187 	[SOC_FW_CONTENT_CERT_ID] = {
188 		.path = SOC_FW_CONTENT_CERT_NAME,
189 		.mode = FOPEN_MODE_RB
190 	},
191 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
192 		.path = TOS_FW_CONTENT_CERT_NAME,
193 		.mode = FOPEN_MODE_RB
194 	},
195 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
196 		.path = NT_FW_CONTENT_CERT_NAME,
197 		.mode = FOPEN_MODE_RB
198 	},
199 #endif /* TRUSTED_BOARD_BOOT */
200 };
201 
202 static int open_fip(const uintptr_t spec);
203 static int open_memmap(const uintptr_t spec);
204 #ifndef DECRYPTION_SUPPORT_none
205 static int open_enc_fip(const uintptr_t spec);
206 #endif
207 
208 struct plat_io_policy {
209 	uintptr_t *dev_handle;
210 	uintptr_t image_spec;
211 	int (*check)(const uintptr_t spec);
212 };
213 
214 /* By default, ARM platforms load images from the FIP */
215 static const struct plat_io_policy policies[] = {
216 	[FIP_IMAGE_ID] = {
217 		&memmap_dev_handle,
218 		(uintptr_t)&fip_block_spec,
219 		open_memmap
220 	},
221 	[ENC_IMAGE_ID] = {
222 		&fip_dev_handle,
223 		(uintptr_t)NULL,
224 		open_fip
225 	},
226 	[BL2_IMAGE_ID] = {
227 		&fip_dev_handle,
228 		(uintptr_t)&bl2_uuid_spec,
229 		open_fip
230 	},
231 #if ENCRYPT_BL31 && !defined(DECRYPTION_SUPPORT_none)
232 	[BL31_IMAGE_ID] = {
233 		&enc_dev_handle,
234 		(uintptr_t)&bl31_uuid_spec,
235 		open_enc_fip
236 	},
237 #else
238 	[BL31_IMAGE_ID] = {
239 		&fip_dev_handle,
240 		(uintptr_t)&bl31_uuid_spec,
241 		open_fip
242 	},
243 #endif
244 #if ENCRYPT_BL32 && !defined(DECRYPTION_SUPPORT_none)
245 	[BL32_IMAGE_ID] = {
246 		&enc_dev_handle,
247 		(uintptr_t)&bl32_uuid_spec,
248 		open_enc_fip
249 	},
250 	[BL32_EXTRA1_IMAGE_ID] = {
251 		&enc_dev_handle,
252 		(uintptr_t)&bl32_extra1_uuid_spec,
253 		open_enc_fip
254 	},
255 	[BL32_EXTRA2_IMAGE_ID] = {
256 		&enc_dev_handle,
257 		(uintptr_t)&bl32_extra2_uuid_spec,
258 		open_enc_fip
259 	},
260 #else
261 	[BL32_IMAGE_ID] = {
262 		&fip_dev_handle,
263 		(uintptr_t)&bl32_uuid_spec,
264 		open_fip
265 	},
266 	[BL32_EXTRA1_IMAGE_ID] = {
267 		&fip_dev_handle,
268 		(uintptr_t)&bl32_extra1_uuid_spec,
269 		open_fip
270 	},
271 	[BL32_EXTRA2_IMAGE_ID] = {
272 		&fip_dev_handle,
273 		(uintptr_t)&bl32_extra2_uuid_spec,
274 		open_fip
275 	},
276 #endif
277 	[TB_FW_CONFIG_ID] = {
278 		&fip_dev_handle,
279 		(uintptr_t)&tb_fw_config_uuid_spec,
280 		open_fip
281 	},
282 	[TOS_FW_CONFIG_ID] = {
283 		&fip_dev_handle,
284 		(uintptr_t)&tos_fw_config_uuid_spec,
285 		open_fip
286 	},
287 	[BL33_IMAGE_ID] = {
288 		&fip_dev_handle,
289 		(uintptr_t)&bl33_uuid_spec,
290 		open_fip
291 	},
292 #if TRUSTED_BOARD_BOOT
293 	[TRUSTED_BOOT_FW_CERT_ID] = {
294 		&fip_dev_handle,
295 		(uintptr_t)&tb_fw_cert_uuid_spec,
296 		open_fip
297 	},
298 	[TRUSTED_KEY_CERT_ID] = {
299 		&fip_dev_handle,
300 		(uintptr_t)&trusted_key_cert_uuid_spec,
301 		open_fip
302 	},
303 	[SOC_FW_KEY_CERT_ID] = {
304 		&fip_dev_handle,
305 		(uintptr_t)&soc_fw_key_cert_uuid_spec,
306 		open_fip
307 	},
308 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
309 		&fip_dev_handle,
310 		(uintptr_t)&tos_fw_key_cert_uuid_spec,
311 		open_fip
312 	},
313 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
314 		&fip_dev_handle,
315 		(uintptr_t)&nt_fw_key_cert_uuid_spec,
316 		open_fip
317 	},
318 	[SOC_FW_CONTENT_CERT_ID] = {
319 		&fip_dev_handle,
320 		(uintptr_t)&soc_fw_cert_uuid_spec,
321 		open_fip
322 	},
323 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
324 		&fip_dev_handle,
325 		(uintptr_t)&tos_fw_cert_uuid_spec,
326 		open_fip
327 	},
328 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
329 		&fip_dev_handle,
330 		(uintptr_t)&nt_fw_cert_uuid_spec,
331 		open_fip
332 	},
333 #endif /* TRUSTED_BOARD_BOOT */
334 };
335 
336 #if defined(SPD_spmd)
337 static struct sp_pkg {
338 	struct plat_io_policy policy;
339 	io_file_spec_t sh_file_spec;
340 	uint8_t uuid[UUID_BYTES_LENGTH];
341 	char path[80];
342 } sp_pkgs[MAX_SP_IDS];
343 static unsigned int sp_pkg_count;
344 
qemu_io_register_sp_pkg(const char * name,const char * uuid,uintptr_t load_addr)345 int qemu_io_register_sp_pkg(const char *name, const char *uuid,
346 			    uintptr_t load_addr)
347 {
348 	struct sp_pkg *pkg;
349 	bl_mem_params_node_t *mem_params;
350 
351 	if (sp_pkg_count == MAX_SP_IDS) {
352 		INFO("Reached Max number of SPs\n");
353 		return -1;
354 	}
355 	mem_params = get_bl_mem_params_node(SP_PKG1_ID + sp_pkg_count);
356 	if (mem_params == NULL) {
357 		ERROR("Can't find SP_PKG ID %u (SP_PKG%u_ID)\n",
358 		      SP_PKG1_ID + sp_pkg_count, sp_pkg_count);
359 		return -1;
360 	}
361 	pkg = sp_pkgs + sp_pkg_count;
362 
363 	if (read_uuid(pkg->uuid, (char *)uuid)) {
364 		return -1;
365 	}
366 
367 	strlcpy(pkg->path, name, sizeof(pkg->path));
368 	strlcat(pkg->path, ".pkg", sizeof(pkg->path));
369 
370 	pkg->policy.dev_handle = &fip_dev_handle;
371 	pkg->policy.image_spec = (uintptr_t)&pkg->uuid;
372 	pkg->policy.check = open_fip;
373 	pkg->sh_file_spec.path = pkg->path;
374 	pkg->sh_file_spec.mode = FOPEN_MODE_RB;
375 
376 	mem_params->image_info.image_base = load_addr;
377 	mem_params->image_info.image_max_size = SZ_4M;
378 	mem_params->image_info.h.attr &= ~IMAGE_ATTRIB_SKIP_LOADING;
379 
380 	sp_pkg_count++;
381 
382 	return 0;
383 }
384 #endif /*SPD_spmd*/
385 
get_io_file_spec(unsigned int image_id)386 static const io_file_spec_t *get_io_file_spec(unsigned int image_id)
387 {
388 #if defined(SPD_spmd)
389 	if (image_id >= SP_PKG1_ID && image_id <= SP_PKG8_ID) {
390 		return &sp_pkgs[image_id - SP_PKG1_ID].sh_file_spec;
391 	}
392 #endif
393 
394 	assert(image_id < ARRAY_SIZE(sh_file_spec));
395 	return &sh_file_spec[image_id];
396 }
397 
get_io_policy(unsigned int image_id)398 static const struct plat_io_policy *get_io_policy(unsigned int image_id)
399 {
400 #if defined(SPD_spmd)
401 	if (image_id >= SP_PKG1_ID && image_id <= SP_PKG8_ID) {
402 		return &sp_pkgs[image_id - SP_PKG1_ID].policy;
403 	}
404 #endif
405 
406 	assert(image_id < ARRAY_SIZE(policies));
407 	return &policies[image_id];
408 }
409 
open_fip(const uintptr_t spec)410 static int open_fip(const uintptr_t spec)
411 {
412 	int result;
413 	uintptr_t local_image_handle;
414 
415 	/* See if a Firmware Image Package is available */
416 	result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_ID);
417 	if (result == 0 && spec != (uintptr_t)NULL) {
418 		result = io_open(fip_dev_handle, spec, &local_image_handle);
419 		if (result == 0) {
420 			VERBOSE("Using FIP\n");
421 			io_close(local_image_handle);
422 		}
423 	}
424 	return result;
425 }
426 
427 #ifndef DECRYPTION_SUPPORT_none
open_enc_fip(const uintptr_t spec)428 static int open_enc_fip(const uintptr_t spec)
429 {
430 	int result;
431 	uintptr_t local_image_handle;
432 
433 	/* See if an encrypted FIP is available */
434 	result = io_dev_init(enc_dev_handle, (uintptr_t)ENC_IMAGE_ID);
435 	if (result == 0) {
436 		result = io_open(enc_dev_handle, spec, &local_image_handle);
437 		if (result == 0) {
438 			VERBOSE("Using encrypted FIP\n");
439 			io_close(local_image_handle);
440 		}
441 	}
442 	return result;
443 }
444 #endif
445 
open_memmap(const uintptr_t spec)446 static int open_memmap(const uintptr_t spec)
447 {
448 	int result;
449 	uintptr_t local_image_handle;
450 
451 	result = io_dev_init(memmap_dev_handle, (uintptr_t)NULL);
452 	if (result == 0) {
453 		result = io_open(memmap_dev_handle, spec, &local_image_handle);
454 		if (result == 0) {
455 			VERBOSE("Using Memmap\n");
456 			io_close(local_image_handle);
457 		}
458 	}
459 	return result;
460 }
461 
open_semihosting(const uintptr_t spec)462 static int open_semihosting(const uintptr_t spec)
463 {
464 	int result;
465 	uintptr_t local_image_handle;
466 
467 	/* See if the file exists on semi-hosting.*/
468 	result = io_dev_init(sh_dev_handle, (uintptr_t)NULL);
469 	if (result == 0) {
470 		result = io_open(sh_dev_handle, spec, &local_image_handle);
471 		if (result == 0) {
472 			VERBOSE("Using Semi-hosting IO\n");
473 			io_close(local_image_handle);
474 		}
475 	}
476 	return result;
477 }
478 
plat_qemu_io_setup(void)479 void plat_qemu_io_setup(void)
480 {
481 	int io_result;
482 
483 	io_result = register_io_dev_fip(&fip_dev_con);
484 	assert(io_result == 0);
485 
486 	io_result = register_io_dev_memmap(&memmap_dev_con);
487 	assert(io_result == 0);
488 
489 	/* Open connections to devices and cache the handles */
490 	io_result = io_dev_open(fip_dev_con, (uintptr_t)NULL,
491 				&fip_dev_handle);
492 	assert(io_result == 0);
493 
494 	io_result = io_dev_open(memmap_dev_con, (uintptr_t)NULL,
495 				&memmap_dev_handle);
496 	assert(io_result == 0);
497 
498 #ifndef DECRYPTION_SUPPORT_none
499 	io_result = register_io_dev_enc(&enc_dev_con);
500 	assert(io_result == 0);
501 
502 	io_result = io_dev_open(enc_dev_con, (uintptr_t)NULL,
503 				&enc_dev_handle);
504 	assert(io_result == 0);
505 #endif
506 
507 	/* Register the additional IO devices on this platform */
508 	io_result = register_io_dev_sh(&sh_dev_con);
509 	assert(io_result == 0);
510 
511 	/* Open connections to devices and cache the handles */
512 	io_result = io_dev_open(sh_dev_con, (uintptr_t)NULL, &sh_dev_handle);
513 	assert(io_result == 0);
514 
515 	/* Ignore improbable errors in release builds */
516 	(void)io_result;
517 }
518 
get_alt_image_source(unsigned int image_id,uintptr_t * dev_handle,uintptr_t * image_spec)519 static int get_alt_image_source(unsigned int image_id, uintptr_t *dev_handle,
520 				  uintptr_t *image_spec)
521 {
522 	const io_file_spec_t *spec = get_io_file_spec(image_id);
523 	int result;
524 
525 	result = open_semihosting((const uintptr_t)spec);
526 	if (result == 0) {
527 		*dev_handle = sh_dev_handle;
528 		*image_spec = (uintptr_t)spec;
529 	}
530 
531 	return result;
532 }
533 
534 /*
535  * Return an IO device handle and specification which can be used to access
536  * an image. Use this to enforce platform load policy
537  */
plat_get_image_source(unsigned int image_id,uintptr_t * dev_handle,uintptr_t * image_spec)538 int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
539 			  uintptr_t *image_spec)
540 {
541 	const struct plat_io_policy *policy = get_io_policy(image_id);
542 	int result;
543 
544 	result = policy->check(policy->image_spec);
545 	if (result == 0) {
546 		*image_spec = policy->image_spec;
547 		*dev_handle = *(policy->dev_handle);
548 	} else {
549 		VERBOSE("Trying alternative IO\n");
550 		result = get_alt_image_source(image_id, dev_handle, image_spec);
551 	}
552 
553 	return result;
554 }
555