diff options
author | Dan Handley <dan.handley@arm.com> | 2014-05-29 17:05:34 +0100 |
---|---|---|
committer | Dan Handley <dan.handley@arm.com> | 2014-05-29 17:05:34 +0100 |
commit | bcc8d77933610d43133944978236cc7815faac37 (patch) | |
tree | d161e3cbf8c10a019b45dbd4f9fd8d41d2496430 | |
parent | 05b6edfe26e3674c3e8e8ff6332aae66fe73e4fa (diff) | |
parent | f05cb4a764c99293586ad6f408b4ca5bec0939a2 (diff) | |
download | arm-trusted-firmware-bcc8d77933610d43133944978236cc7815faac37.tar.gz |
Merge pull request #114 from 'vikramkanigiri:vk/pass_bl33_args'
-rw-r--r-- | bl31/bl31_main.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/bl31/bl31_main.c b/bl31/bl31_main.c index 5117793..f79a122 100644 --- a/bl31/bl31_main.c +++ b/bl31/bl31_main.c @@ -37,6 +37,7 @@ #include <platform.h> #include <runtime_svc.h> #include <stdio.h> +#include <string.h> /******************************************************************************* * This function pointer is used to initialise the BL32 image. It's initialized @@ -154,6 +155,8 @@ void bl31_prepare_next_image_entry() { entry_point_info_t *next_image_info; uint32_t scr, image_type; + cpu_context_t *ctx; + gp_regs_t *gp_regs; /* Determine which image to execute next */ image_type = bl31_get_next_image_type(); @@ -167,6 +170,7 @@ void bl31_prepare_next_image_entry() /* Program EL3 registers to enable entry into the next EL */ next_image_info = bl31_plat_get_next_image_ep_info(image_type); assert(next_image_info); + assert(image_type == GET_SECURITY_STATE(next_image_info->h.attr)); scr = read_scr(); scr &= ~SCR_NS_BIT; @@ -182,13 +186,21 @@ void bl31_prepare_next_image_entry() * Tell the context mgmt. library to ensure that SP_EL3 points to * the right context to exit from EL3 correctly. */ - cm_set_el3_eret_context(GET_SECURITY_STATE(next_image_info->h.attr), + cm_set_el3_eret_context(image_type, next_image_info->pc, next_image_info->spsr, scr); + /* + * Save the args generated in BL2 for the image in the right context + * used on its entry + */ + ctx = cm_get_context(read_mpidr(), image_type); + gp_regs = get_gpregs_ctx(ctx); + memcpy(gp_regs, (void *)&next_image_info->args, sizeof(aapcs64_params_t)); + /* Finally set the next context */ - cm_set_next_eret_context(GET_SECURITY_STATE(next_image_info->h.attr)); + cm_set_next_eret_context(image_type); } /******************************************************************************* |