69 lines
1.6 KiB
C
69 lines
1.6 KiB
C
/*
|
|
* 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);
|