/******************************************************************************* * On JUNO update the arg2 with address of SCP_BL2U image info. ******************************************************************************/ void bl1_plat_set_ep_info(unsigned int image_id, entry_point_info_t *ep_info) { if (image_id == BL2U_IMAGE_ID) { image_desc_t *image_desc = bl1_plat_get_image_desc(SCP_BL2U_IMAGE_ID); ep_info->args.arg2 = (unsigned long)&image_desc->image_info; } }
/* * Default implementation for bl1_plat_handle_post_image_load(). This function * populates the default arguments to BL2. The BL2 memory layout structure * is allocated and the calculated layout is populated in arg1 to BL2. */ int bl1_plat_handle_post_image_load(unsigned int image_id) { meminfo_t *bl2_tzram_layout; meminfo_t *bl1_tzram_layout; image_desc_t *image_desc; entry_point_info_t *ep_info; if (image_id != BL2_IMAGE_ID) return 0; /* Get the image descriptor */ image_desc = bl1_plat_get_image_desc(BL2_IMAGE_ID); assert(image_desc != NULL); /* Get the entry point info */ ep_info = &image_desc->ep_info; /* Find out how much free trusted ram remains after BL1 load */ bl1_tzram_layout = bl1_plat_sec_mem_layout(); /* * Create a new layout of memory for BL2 as seen by BL1 i.e. * tell it the amount of total and free memory available. * This layout is created at the first free address visible * to BL2. BL2 will read the memory layout before using its * memory for other purposes. */ bl2_tzram_layout = (meminfo_t *) bl1_tzram_layout->total_base; bl1_calc_bl2_mem_layout(bl1_tzram_layout, bl2_tzram_layout); ep_info->args.arg1 = (uintptr_t)bl2_tzram_layout; VERBOSE("BL1: BL2 memory layout address = %p\n", (void *) bl2_tzram_layout); return 0; }
/* * Helper function to load TB_FW_CONFIG and populate the load information to * arg0 of BL2 entrypoint info. */ void arm_load_tb_fw_config(void) { int err; uintptr_t config_base = 0UL; image_desc_t *desc; image_desc_t arm_tb_fw_info = { .image_id = TB_FW_CONFIG_ID, SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY, VERSION_2, image_info_t, 0), .image_info.image_base = ARM_TB_FW_CONFIG_BASE, .image_info.image_max_size = ARM_TB_FW_CONFIG_LIMIT - ARM_TB_FW_CONFIG_BASE }; VERBOSE("BL1: Loading TB_FW_CONFIG\n"); err = load_auth_image(TB_FW_CONFIG_ID, &arm_tb_fw_info.image_info); if (err != 0) { /* Return if TB_FW_CONFIG is not loaded */ VERBOSE("Failed to load TB_FW_CONFIG\n"); return; } /* At this point we know that a DTB is indeed available */ config_base = arm_tb_fw_info.image_info.image_base; tb_fw_cfg_dtb = (void *)config_base; tb_fw_cfg_dtb_size = (size_t)arm_tb_fw_info.image_info.image_max_size; /* The BL2 ep_info arg0 is modified to point to TB_FW_CONFIG */ desc = bl1_plat_get_image_desc(BL2_IMAGE_ID); assert(desc != NULL); desc->ep_info.args.arg0 = config_base; INFO("BL1: TB_FW_CONFIG loaded at address = 0x%lx\n", config_base); #if TRUSTED_BOARD_BOOT && defined(DYN_DISABLE_AUTH) int tb_fw_node; uint32_t disable_auth = 0; err = arm_dyn_tb_fw_cfg_init((void *)config_base, &tb_fw_node); if (err < 0) { ERROR("Invalid TB_FW_CONFIG loaded\n"); panic(); } err = arm_dyn_get_disable_auth((void *)config_base, tb_fw_node, &disable_auth); if (err < 0) return; if (disable_auth == 1) dyn_disable_auth(); #endif } /* * BL2 utility function to set the address of TB_FW_CONFIG passed from BL1. */ void arm_bl2_set_tb_cfg_addr(void *dtb) { assert(dtb != NULL); tb_fw_cfg_dtb = dtb; }