aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeenu Viswambharan <jeenu.viswambharan@arm.com>2014-02-20 17:19:39 +0000
committerDan Handley <dan.handley@arm.com>2014-02-26 19:53:48 +0000
commit090630e4bcb5a4266a8a6c4ae50e567efa5db83e (patch)
tree91c92a31b02d0f5d62db8788808cf3f69ff73669
parent7f36660559a7d4786e9a30de6c5af74338ed9469 (diff)
downloadarm-trusted-firmware-090630e4bcb5a4266a8a6c4ae50e567efa5db83e.tar.gz
Tolerate runtime service initialization failure
At present, the firmware panics if a runtime service fails to initialize. An earlier patch had implemented late binding for all runtime service handlers. With that in place, this patch allows the firmware to proceed even when a service fails to initialize. Change-Id: I6cf4de2cecea9719f4cd48272a77cf459b080d4e
-rw-r--r--common/runtime_svc.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/common/runtime_svc.c b/common/runtime_svc.c
index 6e8a1bb..1628e8d 100644
--- a/common/runtime_svc.c
+++ b/common/runtime_svc.c
@@ -119,24 +119,25 @@ void runtime_svc_init()
goto error;
}
- /*
- * Fill the indices corresponding to the start and end owning
- * entity numbers with the index of the descriptor which will
- * handle the SMCs for this owning entity range.
- */
- start_idx = get_unique_oen(rt_svc_descs[index].start_oen,
- rt_svc_descs[index].call_type);
- end_idx = get_unique_oen(rt_svc_descs[index].end_oen,
- rt_svc_descs[index].call_type);
- for (; start_idx <= end_idx; start_idx++)
- rt_svc_descs_indices[start_idx] = index;
-
/* Call the initialisation routine for this runtime service */
rc = rt_svc_descs[index].init();
if (rc) {
ERROR("Error initializing runtime service %s\n",
rt_svc_descs[index].name);
- goto error;
+ } else {
+ /*
+ * Fill the indices corresponding to the start and end
+ * owning entity numbers with the index of the
+ * descriptor which will handle the SMCs for this owning
+ * entity range.
+ */
+ start_idx = get_unique_oen(rt_svc_descs[index].start_oen,
+ rt_svc_descs[index].call_type);
+ end_idx = get_unique_oen(rt_svc_descs[index].end_oen,
+ rt_svc_descs[index].call_type);
+
+ for (; start_idx <= end_idx; start_idx++)
+ rt_svc_descs_indices[start_idx] = index;
}
}