IMF: postpone SCR_EL3 update if context is not initialized
authorJuan Castillo <juan.castillo@arm.com>
Fri, 30 Oct 2015 14:53:24 +0000 (14:53 +0000)
committerAchin Gupta <achin.gupta@arm.com>
Thu, 5 Nov 2015 16:36:55 +0000 (16:36 +0000)
The set_routing_model() function in the Interrupt Management
Framework calls the context management library to update the
SCR_EL3 register. This context management library assumes that
the context has been previously initialized. Consequently, if
a Secure Payload Dispatcher (SPD) tries to set the routing model
before initializing the context, the system will fail (in debug
mode, an assertion will be raised).

This patch fixes the issue by checking if the context has been
initialized before updating SCR_EL3. If a valid context is not
available, SCR_EL3 update will be done when the SPD calls the
context initialization function. This function will call
get_scr_el3_from_routing_model() to obtain the SCR_EL3 value.
If the SPD does not call the context initialization function
then it is SPD's responsibility to obtain SCR_EL3 from the IMF
and update the context accordingly.

Fixes ARM-software/tf-issues#327

Change-Id: Ic2f1c6e899e578a8db858ec43747c63a8539c16f

bl31/interrupt_mgmt.c

index 5478902fe66e036ed14c9c7cd825640d5bdf0ea5..206578b4dce23b98ab951a6b3b4e246565c4f962 100644 (file)
@@ -129,7 +129,12 @@ static void set_scr_el3_from_rm(uint32_t type,
        flag = get_interrupt_rm_flag(interrupt_type_flags, security_state);
        bit_pos = plat_interrupt_type_to_line(type, security_state);
        intr_type_descs[type].scr_el3[security_state] = flag << bit_pos;
-       cm_write_scr_el3_bit(security_state, bit_pos, flag);
+
+       /* Update scr_el3 only if there is a context available. If not, it
+        * will be updated later during context initialization which will obtain
+        * the scr_el3 value to be used via get_scr_el3_from_routing_model() */
+       if (cm_get_context(security_state))
+               cm_write_scr_el3_bit(security_state, bit_pos, flag);
 }
 
 /*******************************************************************************