From 7897a91a8a645a1fc39ec1dc5c38b1069e07bee2 Mon Sep 17 00:00:00 2001 From: wuzheng Date: Tue, 15 Oct 2024 02:08:44 +0000 Subject: [PATCH] add capability interface into kernel --- Ubiquitous/XiZi_IIoT/kernel/Kconfig | 4 + .../XiZi_IIoT/kernel/include/xs_capability.h | 85 +++++++++++++++++ .../XiZi_IIoT/kernel/kernel_test/Kconfig | 4 + .../XiZi_IIoT/kernel/kernel_test/Makefile | 5 + .../kernel/kernel_test/test_capability.c | 0 Ubiquitous/XiZi_IIoT/kernel/thread/Makefile | 5 + .../XiZi_IIoT/kernel/thread/capability.c | 93 +++++++++++++++++++ 7 files changed, 196 insertions(+) create mode 100644 Ubiquitous/XiZi_IIoT/kernel/include/xs_capability.h create mode 100644 Ubiquitous/XiZi_IIoT/kernel/kernel_test/test_capability.c create mode 100644 Ubiquitous/XiZi_IIoT/kernel/thread/capability.c diff --git a/Ubiquitous/XiZi_IIoT/kernel/Kconfig b/Ubiquitous/XiZi_IIoT/kernel/Kconfig index 9d8756ef8..7df2e2c50 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/Kconfig +++ b/Ubiquitous/XiZi_IIoT/kernel/Kconfig @@ -78,6 +78,10 @@ menu "Kernel feature" help Enable task isolation + config KERNEL_CAPABILITY + bool "Enable task capability" + default n + menu "Inter-Task communication" config KERNEL_SEMAPHORE bool "Enable semaphore" diff --git a/Ubiquitous/XiZi_IIoT/kernel/include/xs_capability.h b/Ubiquitous/XiZi_IIoT/kernel/include/xs_capability.h new file mode 100644 index 000000000..f04fc6c17 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/kernel/include/xs_capability.h @@ -0,0 +1,85 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file: xs_capability.h +* @brief: capability header file for XiZi-IIoT +* @version: 1.0 +* @author: AIIT XUOS Lab +* @date: 2024/10/14 +* +*/ + +#ifndef XS_CAPABILITY_H +#define XS_CAPABILITY_H + +/* import board special configuration */ +#include +#include +#include +#include + + +// assume the number of capability types is limited to 8*MAX_NUM_TA +typedef enum { + XS_CAP = 0, + XS_CAP_TASK, + XS_CAP_MEM, + XS_CAP_RESOURCES, + XS_CAP_MAX // the number of capability types +} xs_capability_type; + +typedef struct { + uint8 flags[XS_CAP_MAX/8+1]; +} xs_capability, *xs_capability_t; + +typedef struct { + int32 pid; + xs_capability cap; +} xs_task_capability, *xs_task_capability_t; + +typedef struct capability_node{ + xs_task_capability inner; + struct capability_node* next; +} capability_node, *capability_node_t; + + +// functions to manipulate capability flags +int CheckCapability(xs_capability *cap, xs_capability_type type); + +// set_capability and clear_capability are used to manipulate capability flags +void SetCapability(xs_capability *cap, xs_capability_type type); + +// clear_capability is used to manipulate capability flags +void ClearCapability(xs_capability *cap, xs_capability_type type); + +// functions to manipulate task capabilities +xs_capability* FindTaskCapability(int32 pid); + +// add_task_capability and remove_task_capability are used to manipulate task capabilities +void AddTaskCapability(int32 pid, xs_capability *cap); + +// remove_task_capability is used to manipulate task capabilities +void RemoveTaskCapability(int32 pid); + +// check_task_capability is used to check if a task has a certain capability +x_bool CheckTaskCapability(int32 pid, xs_capability_type type); + +// set_task_capability and clear_task_capability are used to manipulate task capabilities +void SetTaskCapability(int32 pid, xs_capability_type type); + +// clear_task_capability is used to manipulate task capabilities +void ClearTaskCapability(int32 pid, xs_capability_type type); + +#endif /* XS_CAPABILITY_H */ + + diff --git a/Ubiquitous/XiZi_IIoT/kernel/kernel_test/Kconfig b/Ubiquitous/XiZi_IIoT/kernel/kernel_test/Kconfig index 0de9621a0..6929939fe 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/kernel_test/Kconfig +++ b/Ubiquitous/XiZi_IIoT/kernel/kernel_test/Kconfig @@ -11,6 +11,10 @@ menuconfig KERNEL_TEST bool "Config test Circular area" default n select KERNEL_CIRCULAR_AREA + config KERNEL_TEST_CAPABILITY + bool "Config test capability" + default n + select KERNEL_AVL_TREE config KERNEL_TEST_MEM bool "Config test mem" default n diff --git a/Ubiquitous/XiZi_IIoT/kernel/kernel_test/Makefile b/Ubiquitous/XiZi_IIoT/kernel/kernel_test/Makefile index 1c4f0656a..4025274bd 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/kernel_test/Makefile +++ b/Ubiquitous/XiZi_IIoT/kernel/kernel_test/Makefile @@ -16,6 +16,11 @@ ifeq ($(CONFIG_KERNEL_TEST_MSG),y) SRC_FILES += test_mq.c endif +ifeq ($(CONFIG_KERNEL_TEST_CAPABILITY),y) + SRC_FILES += test_capability.c +endif + + ifeq ($(CONFIG_KERNEL_TEST_AVLTREE),y) SRC_FILES += test_avltree.c endif diff --git a/Ubiquitous/XiZi_IIoT/kernel/kernel_test/test_capability.c b/Ubiquitous/XiZi_IIoT/kernel/kernel_test/test_capability.c new file mode 100644 index 000000000..e69de29bb diff --git a/Ubiquitous/XiZi_IIoT/kernel/thread/Makefile b/Ubiquitous/XiZi_IIoT/kernel/thread/Makefile index 21cb5613f..bb8cd43ff 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/thread/Makefile +++ b/Ubiquitous/XiZi_IIoT/kernel/thread/Makefile @@ -75,4 +75,9 @@ ifeq ($(CONFIG_USER_APPLICATION),y) SRC_FILES += appstartup.c endif +ifeq ($(CONFIG_KERNEL_CAPABILITY),y) + SRC_FILES += capability.c +endif + + include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi_IIoT/kernel/thread/capability.c b/Ubiquitous/XiZi_IIoT/kernel/thread/capability.c new file mode 100644 index 000000000..bc6c5bee3 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/kernel/thread/capability.c @@ -0,0 +1,93 @@ +#include "xs_capability.h" + +#ifdef __cplusplus +#define NULL 0L +#else +#define NULL ((void*)0) +#endif + +// global task capability list, used to manage task capabilities +static capability_node task_capabilities={ + .next = NULL +}; + +// functions to manipulate capability flags +int CheckCapability(xs_capability *cap, xs_capability_type type){ + return cap->flags[type/8] & (1 << (type%8)); +} +// set_capability and clear_capability are used to manipulate capability flags +void SetCapability(xs_capability *cap, xs_capability_type type){ + cap->flags[type/8] |= (1 << (type%8)); +} + +// clear_capability is used to manipulate capability flags +void ClearCapability(xs_capability *cap, xs_capability_type type){ + cap->flags[type/8] &= ~(1 << (type%8)); +} + +// functions to manipulate task capabilities +xs_capability* FindTaskCapability(int32 pid){ + capability_node* node = task_capabilities.next; + while(node){ + if(node->inner.pid == pid){ + return &node->inner.cap; + } + node = node->next; + } + return NULL; +} + +// add_task_capability and remove_task_capability are used to manipulate task capabilities +void AddTaskCapability(int32 pid, xs_capability *cap){ + capability_node* node = (capability_node*)x_malloc(sizeof(capability_node)); + node->inner.pid = pid; + node->inner.cap = *cap; + node->next = task_capabilities.next; + task_capabilities.next = node; +} + +// remove_task_capability is used to manipulate task capabilities +void RemoveTaskCapability(int32 pid){ + capability_node* node = &task_capabilities; + while(node->next){ + if(node->next->inner.pid == pid){ + capability_node* removing = node->next; + node->next = node->next->next; + x_free(removing); + return; + } + node = node->next; + } +} + +// check_task_capability is used to check if a task has a certain capability +x_bool CheckTaskCapability(int32 pid, xs_capability_type type){ + x_base lock = CriticalAreaLock(); + xs_capability* cap = FindTaskCapability(pid); + x_bool result = cap && CheckCapability(cap, type); + CriticalAreaUnLock(lock); + return result; +} + +// set_task_capability and clear_task_capability are used to manipulate task capabilities +void SetTaskCapability(int32 pid, xs_capability_type type){ + x_base lock = CriticalAreaLock(); + xs_capability* cap = FindTaskCapability(pid); + if(cap){ + SetCapability(cap, type); + } + CriticalAreaUnLock(lock); +} + +// clear_task_capability is used to manipulate task capabilities +void ClearTaskCapability(int32 pid, xs_capability_type type){ + x_base lock = CriticalAreaLock(); + xs_capability* cap = FindTaskCapability(pid); + if(cap){ + ClearCapability(cap, type); + } + CriticalAreaUnLock(lock); +} + + +