diff --git a/features/FEATURE_UVISOR/README.md b/features/FEATURE_UVISOR/README.md index d5cb473fc5..930b726237 100644 --- a/features/FEATURE_UVISOR/README.md +++ b/features/FEATURE_UVISOR/README.md @@ -2,13 +2,13 @@ This guide will help you get started with uVisor on mbed OS by walking you through creating a sample application for the NXP FRDM-K64F board. -The uVisor provides sandboxed environments and resources protection for applications built for ARM Cortex-M3 and Cortex-M4 devices. Here we will show you how to enable the uVisor and configure a secure box to get hold of some exclusive resources (memory, peripherals, interrupts). For more information on the uVisor design philosophy, please check out our the uVisor [introductory document](../README.md). +The uVisor provides sandboxed environments and resources protection for applications built for ARM Cortex-M3 and Cortex-M4 devices. Here we will show you how to enable the uVisor and configure a secure box to get hold of some exclusive resources (memory, peripherals, interrupts). For more information on the uVisor design philosophy, please check out our the uVisor [introductory document](../../README.md). ## Overview To get a basic `blinky` application running on mbed OS with uVisor enabled, you will need the following: -* A platform and a toolchain supported by uVisor on mbed OS. You can verify this on [the official list](../README.md#supported-platforms). Please note that uVisor might support some platform internally, but not on mbed OS. Generally this means that the porting process has only been partially completed. If you want to port your platform to uVisor and enable it on mbed OS, please follow the [uVisor porting guide](PORTING.md). +* A platform and a toolchain supported by uVisor on mbed OS. You can verify this on [the official list](../../README.md#supported-platforms). Please note that uVisor might support some platform internally, but not on mbed OS. Generally this means that the porting process has only been partially completed. If you want to port your platform to uVisor and enable it on mbed OS, please follow the [uVisor Porting Guide for mbed OS](../core/PORTING.md). * git. It will be used to download the mbed codebase. * The mbed command-line tools, mbed-cli. You can run `pip install mbed-cli` to install them. @@ -292,7 +292,7 @@ A few things to note in the code above: Compile the application again, re-flash the device, and press the reset button. The device LED should be blinking as in the previous case. -If you don't see the LED blinking, it means that the application halted somewhere, probably because uVisor captured a fault. You can setup the uVisor debug messages to see if there is any problem. Follow the [Debugging uVisor](DEBUGGING.md) document for a step-by-step guide. +If you don't see the LED blinking, it means that the application halted somewhere, probably because uVisor captured a fault. You can setup the uVisor debug messages to see if there is any problem. Follow the [Debugging uVisor on mbed OS](DEBUGGING.md) document for a step-by-step guide. If the LED is blinking, it means that the app is running fine. If you now press the `SW2` button on the NXP FRDM-K64F board, the `private_timer_button_on_press` function will be executed, printing the values in the timer buffer. You can observe these values by opening a serial port connection to the device, with a baud rate of 9600. When the print is completed, you should see the LED blinking again. @@ -313,8 +313,8 @@ In this guide we showed you how to: You can now modify the example or create a new one to protect your resources into a secure box. You might find the following resources useful: -* [The uVisor API documentation](API.md) -* [Debugging uVisor](DEBUGGING.md) +* [uVisor API documentation](API.md) +* [Debugging uVisor on mbed OS](DEBUGGING.md) If you found any bug or inconsistency in this guide, please [raise an issue](https://github.com/ARMmbed/uvisor/issues/new). @@ -354,7 +354,7 @@ NVIC_EnableIRQ(MY_IRQ); > **Note**: In this model a call to `NVIC_SetVector` must always happen before an IRQ state is changed. In platforms that don't relocate the interrupt vector table such a call might be originally absent and must be added to work with uVisor. -For more information on the uVisor APIs, checkout the [uVisor APIs documentation](API.md). +For more information on the uVisor APIs, checkout the [uVisor API documentation](API.md) document. ### The *main box* ACLs @@ -371,13 +371,13 @@ static const UvisorBoxAclItem g_main_box_acls[] = { } ``` -You now need to compile your application using uVisor in debug mode. This operation requires some more advanced steps, which are described in detail in the [Debugging uVisor](DEBUGGING.md) document. The main idea is that you compile the application in debug mode: +You now need to compile your application using uVisor in debug mode. This operation requires some more advanced steps, which are described in detail in the [Debugging uVisor on mbed OS](DEBUGGING.md) document. The main idea is that you compile the application in debug mode: ```bash $ mbed compile -m K64F_SECURE -t GCC_ARM -o "debug-info" ``` -and then use a GDB-compatible interface to flash the device, enable semihosting, and access the uVisor debug messages. Please read the [Debugging uVisor](DEBUGGING.md) document for the detailed instructions. +and then use a GDB-compatible interface to flash the device, enable semihosting, and access the uVisor debug messages. Please read the [Debugging uVisor on mbed OS](DEBUGGING.md) document for the detailed instructions. Once the uVisor debug messages are enabled, you will see you application fail. The failure is due to the first missing ACL being hit by the main box code. The message will look like: diff --git a/features/FEATURE_UVISOR/importer/Makefile b/features/FEATURE_UVISOR/importer/Makefile index 16dc7ff37b..8b0232d657 100644 --- a/features/FEATURE_UVISOR/importer/Makefile +++ b/features/FEATURE_UVISOR/importer/Makefile @@ -33,7 +33,7 @@ TARGET_LIB_INC:=$(TARGET_PREFIX)includes/uvisor-lib # uVisor source directory - hidden from mbed via TARGET_IGNORE UVISOR_GIT_URL:=https://github.com/ARMmbed/uvisor -UVISOR_GIT_BRANCH:=dev +UVISOR_GIT_BRANCH:=master UVISOR_DIR:=TARGET_IGNORE/uvisor UVISOR_API:=$(UVISOR_DIR)/api UVISOR_GIT_CFG=$(UVISOR_DIR)/.git/config @@ -76,7 +76,7 @@ rsync: rsync -a --delete $(UVISOR_API)/rtx/src/ $(TARGET_LIB_SRC)/rtx # # Copying the documentation... - cp $(UVISOR_DIR)/docs/QUICKSTART.md $(TARGET_PREFIX)/README.md + cp $(UVISOR_DIR)/docs/api/QUICKSTART.md $(TARGET_PREFIX)/README.md # # Copying licenses cp $(UVISOR_DIR)/LICENSE* $(TARGET_SUPPORTED) diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway.h index a581fe7c6f..532554f85a 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway.h @@ -73,7 +73,7 @@ #define uvisor_read(box_name, shared, addr, op, msk) \ ({ \ /* Instanstiate the gateway. This gets resolved at link-time. */ \ - __attribute__((aligned(4))) static TRegisterGateway const register_gateway = { \ + UVISOR_ALIGN(4) static TRegisterGateway const register_gateway = { \ .svc_opcode = UVISOR_SVC_OPCODE(UVISOR_SVC_ID_REGISTER_GATEWAY), \ .branch = BRANCH_OPCODE(__UVISOR_OFFSETOF(TRegisterGateway, branch), \ __UVISOR_OFFSETOF(TRegisterGateway, bxlr)), \ @@ -119,7 +119,7 @@ #define uvisor_write(box_name, shared, addr, val, op, msk) \ { \ /* Instanstiate the gateway. This gets resolved at link-time. */ \ - __attribute__((aligned(4))) static TRegisterGateway const register_gateway = { \ + UVISOR_ALIGN(4) static TRegisterGateway const register_gateway = { \ .svc_opcode = UVISOR_SVC_OPCODE(UVISOR_SVC_ID_REGISTER_GATEWAY), \ .branch = BRANCH_OPCODE(__UVISOR_OFFSETOF(TRegisterGateway, branch), \ __UVISOR_OFFSETOF(TRegisterGateway, bxlr)), \ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway_exports.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway_exports.h index 79f9638285..5fb055f2d4 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway_exports.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway_exports.h @@ -47,7 +47,7 @@ typedef struct { uint32_t mask; uint16_t operation; uint16_t bxlr; -} UVISOR_PACKED __attribute__((aligned(4))) TRegisterGateway; +} UVISOR_PACKED UVISOR_ALIGN(4) TRegisterGateway; /** Register gateway operation - Masks * @internal diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/rpc.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/rpc.h new file mode 100644 index 0000000000..8bee897bff --- /dev/null +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/rpc.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __UVISOR_API_RPC_H__ +#define __UVISOR_API_RPC_H__ + +#include "api/inc/uvisor_exports.h" +#include +#include + +/** Specify the maximum number of incoming RPC messages for a box + * + * @param max_num_incoming_rpc The maximum number of incoming RPC messages for + * a box + */ +/* FIXME This is a dummy implementation. */ +#define UVISOR_BOX_RPC_MAX_INCOMING(max_num_incoming_rpc) + +/* This is the token to wait on for the result of an asynchronous RPC. */ +typedef uint32_t uvisor_rpc_result_t; + +typedef uint32_t (*TFN_Ptr)(uint32_t, uint32_t, uint32_t, uint32_t); +typedef int (*TFN_RPC_Callback)(int); + +/** Wait for incoming RPC. + * + * @param fn_ptr_array an array of RPC function targets that this call to + * `rpc_fncall_waitfor` should handle RPC to + * @param fn_count the number of function targets in this array + * @param timeout_ms specifies how long to wait (in ms) for an incoming RPC + * message before returning + */ +int rpc_fncall_waitfor(const TFN_Ptr fn_ptr_array[], size_t fn_count, uint32_t timeout_ms); + +#endif /* __UVISOR_API_RPC_H__ */ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/rpc_gateway.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/rpc_gateway.h new file mode 100644 index 0000000000..81d840d4d1 --- /dev/null +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/rpc_gateway.h @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __UVISOR_API_RPC_GATEWAY_H__ +#define __UVISOR_API_RPC_GATEWAY_H__ + +#include "api/inc/rpc_gateway_exports.h" +#include "api/inc/rpc.h" +#include "api/inc/uvisor_exports.h" +#include + +/* ldr pc, [pc, #