| /* |
| * Copyright (c) 2018 Synopsys, Inc. All rights reserved. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/device.h> |
| #include <zephyr/kernel.h> |
| #include <errno.h> |
| #include <zephyr/types.h> |
| #include <zephyr/init.h> |
| #include <zephyr/toolchain.h> |
| |
| #include <zephyr/arch/arc/v2/secureshield/arc_secure.h> |
| |
| static void _default_sjli_entry(void); |
| /* |
| * sjli vector table must be in instruction space |
| * \todo: how to let user to install customized sjli entry easily, e.g. |
| * through macros or with the help of compiler? |
| */ |
| const static uint32_t _sjli_vector_table[CONFIG_SJLI_TABLE_SIZE] = { |
| [0] = (uint32_t)_arc_do_secure_call, |
| [1 ... (CONFIG_SJLI_TABLE_SIZE - 1)] = (uint32_t)_default_sjli_entry, |
| }; |
| |
| /* |
| * @brief default entry of sjli call |
| * |
| */ |
| static void _default_sjli_entry(void) |
| { |
| printk("default sjli entry\n"); |
| } |
| |
| /* |
| * @brief initialization of sjli related functions |
| * |
| */ |
| static void sjli_table_init(void) |
| { |
| /* install SJLI table */ |
| z_arc_v2_aux_reg_write(_ARC_V2_NSC_TABLE_BASE, _sjli_vector_table); |
| z_arc_v2_aux_reg_write(_ARC_V2_NSC_TABLE_TOP, |
| (_sjli_vector_table + CONFIG_SJLI_TABLE_SIZE)); |
| } |
| |
| /* |
| * @brief initialization of secureshield related functions. |
| */ |
| static int arc_secureshield_init(const struct device *arg) |
| { |
| sjli_table_init(); |
| |
| /* set nic bit to enable seti/clri and |
| * sleep/wevt in normal mode. |
| * If not set, direct call of seti/clri etc. will raise exception. |
| * Then, these seti/clri instructions should be replaced with secure |
| * secure services (sjli call) |
| * |
| */ |
| __asm__ volatile("sflag 0x20"); |
| |
| return 0; |
| } |
| |
| SYS_INIT(arc_secureshield_init, PRE_KERNEL_1, |
| CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); |