samples: add sample to show how ARC TEE works
* this is a simple sample to show how secure applicaiton and non-secure application work together. More details are in README.rst Signed-off-by: Wayne Ren <wei.ren@synopsys.com>
This commit is contained in:
parent
1e2d42273e
commit
5a0acd5105
5 changed files with 201 additions and 0 deletions
8
samples/boards/arc_secure_services/CMakeLists.txt
Normal file
8
samples/boards/arc_secure_services/CMakeLists.txt
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
|
||||||
|
project(arc_secure_services)
|
||||||
|
|
||||||
|
target_sources(app PRIVATE src/main.c)
|
126
samples/boards/arc_secure_services/README.rst
Normal file
126
samples/boards/arc_secure_services/README.rst
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
.. _arc_secure_service:
|
||||||
|
|
||||||
|
ARC Secure Service
|
||||||
|
##################
|
||||||
|
|
||||||
|
Overview
|
||||||
|
********
|
||||||
|
|
||||||
|
This sample implements a simple secure service based on ARC SecureShield to
|
||||||
|
demonstrate how a secure zephyr application runs together with a normal
|
||||||
|
Zephyr application.
|
||||||
|
|
||||||
|
In this sample:
|
||||||
|
|
||||||
|
* Secure application will be in the secure memory space defined in
|
||||||
|
``arc_mpu_regions.c``. Half of RAM and ROM is allocated to secure world,
|
||||||
|
the other half is allocated to normal world.
|
||||||
|
|
||||||
|
* Memory not allocated to the secure application is allocated to
|
||||||
|
the normal application.
|
||||||
|
|
||||||
|
* By default, all the peripheral space is normal mode accessible, i.e.,
|
||||||
|
the peripherals are shared between normal mode and secure mode. If some
|
||||||
|
peripherals are required by secure world, it can be done by adding static
|
||||||
|
mpu entry in ``arc_mpu_regions.c``.
|
||||||
|
|
||||||
|
* The interrupts of two internal timers are configure as normal interrupts,
|
||||||
|
so the normal zephyr's kernel tick can work correctly.
|
||||||
|
|
||||||
|
* Secure interrupts priority > secure threads priority > normal interrupts
|
||||||
|
priority > normal threads priority.
|
||||||
|
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
************
|
||||||
|
|
||||||
|
To use this sample, ARC processor should be equipped with ARC SecureShield. In
|
||||||
|
Zephyr, the following board configurations are supported:
|
||||||
|
|
||||||
|
* em_starterkit_em7d
|
||||||
|
* secure application: em_starterkit_em7d_secure
|
||||||
|
* normal application: em_starterkit_em7d_normal
|
||||||
|
* nsim_sem
|
||||||
|
* secure application: nsim_sem
|
||||||
|
* normal application: nsim_sem_normal
|
||||||
|
|
||||||
|
Building and Running
|
||||||
|
********************
|
||||||
|
|
||||||
|
Building
|
||||||
|
========
|
||||||
|
|
||||||
|
Secure application
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
First, you should build the secure application.
|
||||||
|
|
||||||
|
.. zephyr-app-commands::
|
||||||
|
:zephyr-app: samples/boards/arc_secure_services
|
||||||
|
:board: em_starterkit_em7d_secure nsim_sem
|
||||||
|
:goals: build
|
||||||
|
:compact:
|
||||||
|
|
||||||
|
Normal application
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Currently, in normal application, MPU is not accessible, so no user space and
|
||||||
|
mpu-based stack checking.
|
||||||
|
|
||||||
|
Here,take :ref:'dining-philosophers-sample' as an example for normal
|
||||||
|
application.
|
||||||
|
|
||||||
|
.. zephyr-app-commands::
|
||||||
|
:zephyr-app: samples/philosophers
|
||||||
|
:board: em_starterkit_em7d_normal nsim_sem_normal
|
||||||
|
:goals: build
|
||||||
|
:compact:
|
||||||
|
|
||||||
|
Running
|
||||||
|
=======
|
||||||
|
|
||||||
|
* Run using the bootloader
|
||||||
|
|
||||||
|
The bootloader should load the secure and normal application into the correct place,
|
||||||
|
then jump to the entry of the secure application. The entry of normal application
|
||||||
|
is hardcoded in secure application. Secure application will boot normal application.
|
||||||
|
|
||||||
|
* Run using the debugger (recommended)
|
||||||
|
|
||||||
|
Use the gdb debugger to load and run the two applications.
|
||||||
|
|
||||||
|
For em starter kit, run the following commands
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# load secure application first
|
||||||
|
$ cd samples/boards/arc_secure_services/build
|
||||||
|
$ west debug
|
||||||
|
# load normal application
|
||||||
|
$ monitor load_image ../../../philosophers/build/zepher/zephyr.elf
|
||||||
|
$ c
|
||||||
|
|
||||||
|
For nsim sem, you need two consoles: one for application output, and one for
|
||||||
|
debugger.
|
||||||
|
|
||||||
|
In the console for output:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# open debug server
|
||||||
|
$ cd samples/boards/arc_secure_services/build
|
||||||
|
$ west debugserver
|
||||||
|
|
||||||
|
In the console for debugger:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
# open debug server
|
||||||
|
$ cd samples/boards/arc_secure_services/build
|
||||||
|
$ arc-elf32-gdb zephyr/zephyr.elf
|
||||||
|
$ target remote :3333
|
||||||
|
# load normal application
|
||||||
|
$ load ../../../philosophers/build/zepher/zephyr.elf
|
||||||
|
# load secure application
|
||||||
|
$ load
|
||||||
|
$ c
|
0
samples/boards/arc_secure_services/prj.conf
Normal file
0
samples/boards/arc_secure_services/prj.conf
Normal file
8
samples/boards/arc_secure_services/sample.yaml
Normal file
8
samples/boards/arc_secure_services/sample.yaml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
sample:
|
||||||
|
description: Sample application to verify the secure monitor for
|
||||||
|
Designware ARC SecureShiled.
|
||||||
|
name: Designware ARC Secure monitor
|
||||||
|
tests:
|
||||||
|
test:
|
||||||
|
platform_whitelist: nsim_sem em_starterkit_em7d_secure
|
||||||
|
tags: secure
|
59
samples/boards/arc_secure_services/src/main.c
Normal file
59
samples/boards/arc_secure_services/src/main.c
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Synopsys.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zephyr.h>
|
||||||
|
#include <misc/printk.h>
|
||||||
|
#include <soc.h>
|
||||||
|
|
||||||
|
#if defined(CONFIG_SOC_NSIM_SEM)
|
||||||
|
#define NORMAL_FIRMWARE_ENTRY 0x40000
|
||||||
|
#elif defined(CONFIG_SOC_EMSK)
|
||||||
|
#define NORMAL_FIRMWARE_ENTRY 0x20000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define STACKSIZE 1024
|
||||||
|
#define PRIORITY 7
|
||||||
|
#define SLEEPTIME 1000
|
||||||
|
|
||||||
|
|
||||||
|
void threadA(void *dummy1, void *dummy2, void *dummy3)
|
||||||
|
{
|
||||||
|
ARG_UNUSED(dummy1);
|
||||||
|
ARG_UNUSED(dummy2);
|
||||||
|
ARG_UNUSED(dummy3);
|
||||||
|
|
||||||
|
|
||||||
|
printk("Go to normal application\n");
|
||||||
|
|
||||||
|
arc_go_to_normal(*((u32_t *)(NORMAL_FIRMWARE_ENTRY)));
|
||||||
|
|
||||||
|
printk("should not come here\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
K_THREAD_DEFINE(thread_a, STACKSIZE, threadA, NULL, NULL, NULL,
|
||||||
|
PRIORITY, 0, K_NO_WAIT);
|
||||||
|
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
/* necessary configuration before go to normal */
|
||||||
|
s32_t i = 0;
|
||||||
|
|
||||||
|
/* allocate timer 0 and timer1 to normal mode */
|
||||||
|
z_arc_v2_irq_uinit_secure_set(IRQ_TIMER0, 0);
|
||||||
|
z_arc_v2_irq_uinit_secure_set(IRQ_TIMER1, 0);
|
||||||
|
|
||||||
|
/* disable the secure interrupts for debug purpose*/
|
||||||
|
/* _arc_v2_irq_unit_int_disable(IRQ_S_TIMER0); */
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
printk("I am the %s thread in secure world: %d\n",
|
||||||
|
__func__, i++);
|
||||||
|
k_sleep(SLEEPTIME);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue