/******************************************************************************* * This function prepare boot argument for 64 bit kernel entry ******************************************************************************/ static entry_point_info_t *bl31_plat_get_next_kernel64_ep_info(void) { entry_point_info_t *next_image_info; unsigned long el_status; unsigned int mode; el_status = 0; mode = 0; /* Kernel image is always non-secured */ next_image_info = &bl33_image_ep_info; /* Figure out what mode we enter the non-secure world in */ el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; el_status &= ID_AA64PFR0_ELX_MASK; if (el_status) { INFO("Kernel_EL2\n"); mode = MODE_EL2; } else{ INFO("Kernel_EL1\n"); mode = MODE_EL1; } INFO("Kernel is 64Bit\n"); next_image_info->spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); next_image_info->pc = get_kernel_info_pc(); next_image_info->args.arg0 = get_kernel_info_r0(); next_image_info->args.arg1 = get_kernel_info_r1(); INFO("pc=0x%lx, r0=0x%lx, r1=0x%lx\n", next_image_info->pc, next_image_info->args.arg0, next_image_info->args.arg1); SET_SECURITY_STATE(next_image_info->h.attr, NON_SECURE); /* None of the images on this platform can have 0x0 as the entrypoint */ if (next_image_info->pc) return next_image_info; else return NULL; }
/******************************************************************************* * This function prepare boot argument for 32 bit kernel entry ******************************************************************************/ static entry_point_info_t *bl31_plat_get_next_kernel32_ep_info(void) { entry_point_info_t *next_image_info; unsigned int mode; mode = 0; /* Kernel image is always non-secured */ next_image_info = &bl33_image_ep_info; /* Figure out what mode we enter the non-secure world in */ mode = MODE32_hyp; /* * TODO: Consider the possibility of specifying the SPSR in * the FIP ToC and allowing the platform to have a say as * well. */ INFO("Kernel is 32Bit\n"); next_image_info->spsr = SPSR_MODE32(mode, SPSR_T_ARM, SPSR_E_LITTLE, (DAIF_FIQ_BIT | DAIF_IRQ_BIT | DAIF_ABT_BIT)); next_image_info->pc = get_kernel_info_pc(); next_image_info->args.arg0 = get_kernel_info_r0(); next_image_info->args.arg1 = get_kernel_info_r1(); next_image_info->args.arg2 = get_kernel_info_r2(); INFO("pc=0x%lx, r0=0x%lx, r1=0x%lx, r2=0x%lx\n", next_image_info->pc, next_image_info->args.arg0, next_image_info->args.arg1, next_image_info->args.arg2); SET_SECURITY_STATE(next_image_info->h.attr, NON_SECURE); /* None of the images on this platform can have 0x0 as the entrypoint */ if (next_image_info->pc) return next_image_info; else return NULL; }
entry_point_info_t *bl31_plat_get_next_kernel_ep_info(uint32_t type) { entry_point_info_t *next_image_info; unsigned long el_status; unsigned int mode; #if RESET_TO_BL31 next_image_info = (type == NON_SECURE) ? &bl33_entrypoint_info : &bl32_entrypoint_info; mt_get_entry_point_info(type, next_image_info); #else next_image_info = (type == NON_SECURE) ? bl2_to_bl31_params->bl33_ep_info : bl2_to_bl31_params->bl32_ep_info; #endif /* Figure out what mode we enter the non-secure world in */ el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; el_status &= ID_AA64PFR0_ELX_MASK; if (el_status) mode = MODE_EL2; else mode = MODE_EL1; #if 0 if (0 == rw) { printf("LK is AArch32\n"); printf("LK start_addr=x0x%x\n", bl33_ep_info->pc); mode = MODE32_svc; ee = 0; /* * TODO: Choose async. exception bits if HYP mode is not * implemented according to the values of SCR.{AW, FW} bits */ daif = DAIF_ABT_BIT | DAIF_IRQ_BIT | DAIF_FIQ_BIT; bl33_ep_info->spsr = SPSR_MODE32(mode, 0, ee, daif); /* * Pass boot argument to LK * ldr w4, =pl_boot_argument * ldr w5, =BOOT_ARGUMENT_SIZE */ bl33_ep_info->args.arg4=(unsigned long)(uintptr_t)&pl_boot_argument; bl33_ep_info->args.arg5=(unsigned long)(uintptr_t)BOOT_ARGUMENT_SIZE; } else #endif { printf("Kernel is 64Bit\n"); next_image_info->spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); next_image_info->pc = get_kernel_info_pc(); next_image_info->args.arg0=get_kernel_info_r0(); next_image_info->args.arg1=get_kernel_info_r1(); printf("pc=0x%llx, r0=0x%llx, r1=0x%llx\n", next_image_info->pc, next_image_info->args.arg0, next_image_info->args.arg1); } SET_SECURITY_STATE(next_image_info->h.attr, NON_SECURE); /* None of the images on this platform can have 0x0 as the entrypoint */ if (next_image_info->pc) return next_image_info; else return NULL; }