summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/aarch32/debug.S42
-rw-r--r--common/bl_common.c18
-rw-r--r--common/runtime_svc.c28
-rw-r--r--common/tf_printf.c84
4 files changed, 166 insertions, 6 deletions
diff --git a/common/aarch32/debug.S b/common/aarch32/debug.S
new file mode 100644
index 00000000..01ec1e38
--- /dev/null
+++ b/common/aarch32/debug.S
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+
+ .globl do_panic
+
+ /***********************************************************
+ * The common implementation of do_panic for all BL stages
+ ***********************************************************/
+func do_panic
+ b plat_panic_handler
+endfunc do_panic
+
diff --git a/common/bl_common.c b/common/bl_common.c
index be56256b..6dcd4c18 100644
--- a/common/bl_common.c
+++ b/common/bl_common.c
@@ -321,12 +321,16 @@ int load_image(meminfo_t *mem_layout,
(void *) image_base, image_size);
}
+#if !TRUSTED_BOARD_BOOT
/*
* File has been successfully loaded.
- * Flush the image in Trusted SRAM so that the next exception level can
- * see it.
+ * Flush the image to main memory so that it can be executed later by
+ * any CPU, regardless of cache and MMU state.
+ * When TBB is enabled the image is flushed later, after image
+ * authentication.
*/
flush_dcache_range(image_base, image_size);
+#endif /* TRUSTED_BOARD_BOOT */
INFO("Image id=%u loaded at address %p, size = 0x%zx\n", image_id,
(void *) image_base, image_size);
@@ -388,10 +392,12 @@ int load_auth_image(meminfo_t *mem_layout,
image_data->image_size);
return -EAUTH;
}
-
- /* After working with data, invalidate the data cache */
- inv_dcache_range(image_data->image_base,
- (size_t)image_data->image_size);
+ /*
+ * File has been successfully loaded and authenticated.
+ * Flush the image to main memory so that it can be executed later by
+ * any CPU, regardless of cache and MMU state.
+ */
+ flush_dcache_range(image_data->image_base, image_data->image_size);
#endif /* TRUSTED_BOARD_BOOT */
return 0;
diff --git a/common/runtime_svc.c b/common/runtime_svc.c
index b8af6cd8..df0d64ca 100644
--- a/common/runtime_svc.c
+++ b/common/runtime_svc.c
@@ -52,6 +52,34 @@ static rt_svc_desc_t *rt_svc_descs;
/ sizeof(rt_svc_desc_t))
/*******************************************************************************
+ * Function to invoke the registered `handle` corresponding to the smc_fid.
+ ******************************************************************************/
+uintptr_t handle_runtime_svc(uint32_t smc_fid,
+ void *cookie,
+ void *handle,
+ unsigned int flags)
+{
+ u_register_t x1, x2, x3, x4;
+ int index, idx;
+ const rt_svc_desc_t *rt_svc_descs;
+
+ assert(handle);
+ idx = get_unique_oen_from_smc_fid(smc_fid);
+ assert(idx >= 0 && idx < MAX_RT_SVCS);
+
+ index = rt_svc_descs_indices[idx];
+ if (index < 0 || index >= RT_SVC_DECS_NUM)
+ SMC_RET1(handle, SMC_UNK);
+
+ rt_svc_descs = (rt_svc_desc_t *) RT_SVC_DESCS_START;
+
+ get_smc_params_from_ctx(handle, x1, x2, x3, x4);
+
+ return rt_svc_descs[index].handle(smc_fid, x1, x2, x3, x4, cookie,
+ handle, flags);
+}
+
+/*******************************************************************************
* Simple routine to sanity check a runtime service descriptor before using it
******************************************************************************/
static int32_t validate_rt_svc_desc(const rt_svc_desc_t *desc)
diff --git a/common/tf_printf.c b/common/tf_printf.c
index ad0b90aa..8c1857e5 100644
--- a/common/tf_printf.c
+++ b/common/tf_printf.c
@@ -27,7 +27,11 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <arch.h>
+#include <arch_helpers.h>
+#include <assert.h>
#include <debug.h>
+#include <limits.h>
#include <stdarg.h>
#include <stdint.h>
@@ -49,6 +53,85 @@ static void string_print(const char *str)
putchar(*str++);
}
+#ifdef AARCH32
+#define unsigned_num_print(unum, radix) \
+ do { \
+ if ((radix) == 16) \
+ unsigned_hex_print(unum); \
+ else if ((radix) == 10) \
+ unsigned_dec_print(unum); \
+ else \
+ string_print("tf_printf : Unsupported radix");\
+ } while (0);
+
+/*
+ * Utility function to print an unsigned number in decimal format for AArch32.
+ * The function doesn't support printing decimal integers higher than 32 bits
+ * to avoid having to implement 64-bit integer compiler library functions.
+ */
+static void unsigned_dec_print(unsigned long long int unum)
+{
+ unsigned int local_num;
+ /* Just need enough space to store 32 bit decimal integer */
+ unsigned char num_buf[10];
+ int i = 0, rem;
+
+ if (unum > UINT_MAX) {
+ string_print("tf_printf : decimal numbers higher than 32 bits"
+ " not supported\n");
+ return;
+ }
+
+ local_num = (unsigned int)unum;
+
+ do {
+ rem = local_num % 10;
+ num_buf[i++] = '0' + rem;
+ } while (local_num /= 10);
+
+ while (--i >= 0)
+ putchar(num_buf[i]);
+}
+
+/*
+ * Utility function to print an unsigned number in hexadecimal format for
+ * AArch32. The function doesn't use 64-bit integer arithmetic to avoid
+ * having to implement 64-bit compiler library functions. It splits the
+ * 64 bit number into two 32 bit numbers and converts them into equivalent
+ * ASCII characters.
+ */
+static void unsigned_hex_print(unsigned long long int unum)
+{
+ /* Just need enough space to store 16 characters */
+ unsigned char num_buf[16];
+ int i = 0, rem;
+ uint32_t num_local = 0, num_msb = 0;
+
+ /* Get the LSB of 64 bit unum */
+ num_local = (uint32_t)unum;
+ /* Get the MSB of 64 bit unum. This works only on Little Endian */
+ assert((read_sctlr() & SCTLR_EE_BIT) == 0);
+ num_msb = *(((uint32_t *) &unum) + 1);
+
+ do {
+ do {
+ rem = (num_local & 0xf);
+ if (rem < 0xa)
+ num_buf[i++] = '0' + rem;
+ else
+ num_buf[i++] = 'a' + (rem - 0xa);
+ } while (num_local >>= 4);
+
+ num_local = num_msb;
+ num_msb = 0;
+ } while (num_local);
+
+ while (--i >= 0)
+ putchar(num_buf[i]);
+}
+
+#else
+
static void unsigned_num_print(unsigned long long int unum, unsigned int radix)
{
/* Just need enough space to store 64 bit decimal integer */
@@ -66,6 +149,7 @@ static void unsigned_num_print(unsigned long long int unum, unsigned int radix)
while (--i >= 0)
putchar(num_buf[i]);
}
+#endif /* AARCH32 */
/*******************************************************************
* Reduced format print for Trusted firmware.