xiuos3/kernel/kernel_service/xs_service.c

712 lines
19 KiB
C

/*
* 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_service.c
* @brief: this file is provided for kernel switch of userapi
* @version: 1.0
* @author: AIIT XUOS Lab
* @date: 2020/3/8
*
*/
#include <string.h>
#include <xs_ktask.h>
#include <xs_service.h>
#ifdef FS_VFS
#include <iot-vfs_posix.h>
#endif
#ifdef TASK_ISOLATION
#include <xs_isolation.h>
#endif
extern inline struct TaskDescriptor *GetTaskWithIdnodeInfo(int32 id);
#ifdef SEPARATE_COMPILE
extern long ShowTask(void);
extern void ShowMemory(void);
extern long ShowSem(void);
extern long ShowEvent(void);
extern long ShowMutex(void);
//extern long ShowMemPool(void);
extern long ShowMsgQueue(void);
//extern long showdevice(void);
extern long ShowTimer(void);
uintptr_t KsPrintInfo(uint32_t knum,uintptr_t *param, uint8_t num )
{
uintptr_t arg = param[0];
uintptr_t ret = arg;
struct TaskDescriptor *tid = NONE;
KPrintf("ecall from user mode : arg: %d\n", arg );
switch (arg)
{
case 1:
#ifdef TOOL_SHELL
ShowTask();
#endif
break;
case 2:
ShowMemory();
break;
case 3:
#ifdef KERNEL_SEMAPHORE
//ShowSem();
#endif
break;
case 4:
#ifdef KERNEL_EVENT
ShowEvent();
#endif
break;
case 5:
#ifdef KERNEL_MUTEX
ShowMutex();
#endif
break;
case 6:
//ShowMemPool();
break;
case 7:
#ifdef KERNEL_MESSAGEQUEUE
ShowMsgQueue();
#endif
break;
case 8:
//showdevice();
break;
case 9:
#ifdef KERNEL_SOFTTIMER
ShowTimer();
#endif
break;
default:
KPrintf("unsurport \n");
break;
}
return ret;
}
uintptr_t KsTaskCreate(uint32_t knum,uintptr_t *param, uint8_t num)
{
return (uintptr_t) UTaskCreate((char *)(param[0]), (void *)(param[1]),(void *)(param[2]),(uint32)(param[3]),(uint8)(param[4]));
}
uintptr_t KsStartupTask(uint32_t knum,uintptr_t *param, uint8_t num)
{
x_err_t ret ;
int32 id = (int32)(param[0]);
ret = StartupKTask(id);
return (uintptr_t)ret;
}
uintptr_t KsTaskDelete(uint32_t knum,uintptr_t *param, uint8_t num)
{
x_err_t ret ;
ret = KTaskDelete((int32) (param[0]));
return (uintptr_t)ret;
}
extern void KTaskQuit(void);
uintptr_t KsTaskQuit(uint32_t knum,uintptr_t *param, uint8_t num )
{
KTaskQuit();
return 0;
}
uintptr_t KsTaskCoreCombine(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret = EOK ;
int32 id;
#ifdef ARCH_SMP
if( param[0] == NONE){
id = GetKTaskDescriptor()->id.id;
}else{
id = (int32 )(param[0]);
}
ret = KTaskCoreCombine(id, (uint8)(param[1]));
#endif
return (uintptr_t)ret;
}
uintptr_t KsTaskCoreUnCombine(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret = EOK;
int32 id;
#ifdef ARCH_SMP
KTaskDescriptorType tid;
if( param[0] == NONE){
id = GetKTaskDescriptor()->id.id;
}else{
id = (int32 )(param[0]);
}
ret = KTaskCoreUnCombine(id);
#endif
return (uintptr_t)ret;
}
uintptr_t KsMdelayTask(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret ;
ret = MdelayKTask((int32)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsGetTaskID(uint32_t knum,uintptr_t *param, uint8_t num )
{
return (uintptr_t)GetKTaskDescriptor()->id.id;
}
uintptr_t KsGetTaskName(uint32_t knum,uintptr_t *param, uint8_t num )
{
KTaskDescriptorType task ;
uint8_t *buf = (uint8_t *)(param[1]);
task = GetTaskWithIdnodeInfo( (int32)(param[0]));
if ( task == NONE )
return -ERROR;
strncpy(buf, task->task_base_info.name, NAME_NUM_MAX);
return EOK;
}
uintptr_t KsGetTaskStat(uint32_t knum,uintptr_t *param, uint8_t num )
{
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo( (int32)(param[0]));
return (uintptr_t)task->task_dync_sched_member.stat;
}
uintptr_t KsGetTaskCombinedCore(uint32_t knum,uintptr_t *param, uint8_t num )
{
#ifdef ARCH_SMP
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo( (int32)(param[0]));
return (uintptr_t)task->task_smp_info.combined_coreid;
#else
return (uintptr_t)0;
#endif
}
uintptr_t KsGetTaskRunningCore(uint32_t knum,uintptr_t *param, uint8_t num )
{
#ifdef ARCH_SMP
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo( (int32)(param[0]));
return (uintptr_t)task->task_smp_info.runing_coreid;
#else
return (uintptr_t)0;
#endif
}
uintptr_t KsGetTaskErrorstatus(uint32_t knum,uintptr_t *param, uint8_t num )
{
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo( (int32)(param[0]));
return (uintptr_t)task->exstatus;
}
uintptr_t KsGetTaskPriority (uint32_t knum,uintptr_t *param, uint8_t num )
{
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo( (int32)(param[0]));
return (uintptr_t)task->task_dync_sched_member.cur_prio;
}
uintptr_t KsMalloc(uint32_t knum,uintptr_t *param, uint8_t num )
{
uintptr_t *ret = (uintptr_t *)x_umalloc( (x_size_t)param[0]);
#ifdef MOMERY_PROTECT_ENABLE
if( mem_access.AddRegion && ret != NONE){
struct TaskDescriptor *task;
task = GetKTaskDescriptor();
mem_access.AddRegion(task->task_dync_sched_member.isolation, (x_ubase)ret , (x_size_t)param[0] , REGION_TYPE_HEAP );
}
#endif
return (uintptr_t)ret;
}
uintptr_t KsFree(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_ufree((void *)(param[0]));
#ifdef MOMERY_PROTECT_ENABLE
if(mem_access.ClearRegion){
struct TaskDescriptor *task;
task = GetKTaskDescriptor();
mem_access.ClearRegion(task->task_dync_sched_member.isolation, (x_ubase)param[0]);
}
#endif
return 0;
}
#ifdef KERNEL_MUTEX
uintptr_t KsCreateMutex(uint32_t knum,uintptr_t *param, uint8_t num )
{
int32 ret;
ret = KMutexCreate();
return (uintptr_t)ret;
}
uintptr_t KsDeleteMutex(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret = EOK;
KMutexDelete((int32)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsMutexObtain(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret ;
ret = KMutexObtain((int32)(param[0]),(int32)(param[1]));
return (uintptr_t)ret;
}
uintptr_t KsMutexAbandon(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret ;
ret = KMutexAbandon((int32)(param[0]));
return (uintptr_t)ret;
}
#endif
#ifdef KERNEL_SEMAPHORE
uintptr_t KsCreateSemaphore(uint32_t knum,uintptr_t *param, uint8_t num)
{
int32 ret;
ret = KSemaphoreCreate((uint16)param[0]);
return (uintptr_t)ret ;
}
uintptr_t KsDeleteSemaphore(uint32_t knum,uintptr_t *param, uint8_t num )
{
KSemaphoreDelete((int32)(param[0]));
return 0;
}
uintptr_t KsSemaphoreObtain(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret ;
ret = KSemaphoreObtain((int32)(param[0]),(int32)(param[1]));
return (uintptr_t)ret;
}
uintptr_t KsSemaphoreAbandon(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret ;
ret = KSemaphoreAbandon((int32)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsSemaphoreSetValue(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret ;
ret = KSemaphoreSetValue((int32)(param[0]),(uint16)(param[1]));
return (uintptr_t)ret;
}
#endif
#ifdef KERNEL_EVENT
uintptr_t KsCreateEvent(uint32_t knum,uintptr_t *param, uint8_t num )
{
EventIdType ret;
ret = KEventCreate((uint8)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsDeleteEvent(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret = 0;
KEventDelete((EventIdType)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsEventTrigger(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret;
ret = KEventTrigger((EventIdType)(param[0]), (uint32)(param[1]));
return (uintptr_t)ret;
}
uintptr_t KsEventProcess(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret;
ret = KEventProcess((EventIdType)(param[0]), (uint32)(param[1]), (uint8)(param[2]), (int32)(param[3]), (uint32 *)(param[4]) );
return (uintptr_t)ret;
}
#endif
#ifdef KERNEL_MESSAGEQUEUE
uintptr_t KsCreateMsgQueue(uint32_t knum,uintptr_t *param, uint8_t num )
{
int32 ret;
ret = KCreateMsgQueue((int32)(param[0]), (x_size_t)(param[1]) );
return (uintptr_t)ret;
}
uintptr_t KsDeleteMsgQueue(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret;
ret = KDeleteMsgQueue((int32)(param[0]) );
return (uintptr_t)ret;
}
uintptr_t KsMsgQueueSendwait(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret;
ret = KMsgQueueSendwait((int32)(param[0]), (const void *)(param[1]), (x_size_t)(param[2]), (int32)(param[3]) );
return (uintptr_t)ret;
}
uintptr_t KsMsgQueueSend(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret;
ret = KMsgQueueSend((int32)(param[0]), (const void *)(param[1]), (x_size_t)(param[2]) );
return (uintptr_t)ret;
}
uintptr_t KsMsgQueueUrgentSend(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret;
ret = KMsgQueueUrgentSend((int32)(param[0]), (const void *)(param[1]), (x_size_t)(param[2]) );
return (uintptr_t)ret;
}
uintptr_t KsMsgQueueRecv(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret;
ret = KMsgQueueRecv((int32)(param[0]), (void *)(param[1]), (x_size_t)(param[2]), (int32)(param[3]) );
return (uintptr_t)ret;
}
uintptr_t KsMsgQueueReinit(uint32_t knum,uintptr_t *param, uint8_t num )
{
x_err_t ret;
ret = KMsgQueueReinit((int32)(param[0]) );
return (uintptr_t)ret;
}
#endif
/* fs posix*/
#ifdef FS_VFS
uintptr_t KsOpen(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = open((const char *)(param[0]), (int)(param[1]), (mode_t)(param[2]));
return (uintptr_t)ret;
}
uintptr_t KsRead(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = read((int)(param[0]), (void *)(param[1]), (size_t)(param[2]) );
return (uintptr_t)ret;
}
uintptr_t KsWrite(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = write((int)(param[0]), (const void *)(param[1]), (size_t)(param[2]));
return (uintptr_t)ret;
}
uintptr_t KsClose(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = close((int)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsIoctl(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = ioctl((int)(param[0]), (int)(param[1]), (void *)(param[2]));
return (uintptr_t)ret;
}
uintptr_t KsLseek(uint32_t knum,uintptr_t *param, uint8_t num )
{
off_t ret;
ret = lseek((int)(param[0]), (off_t)(param[1]), (int)(param[2]) );
return (uintptr_t)ret;
}
uintptr_t KsRename(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = rename((const char *)(param[0]), (const char *)(param[1]) );
return (uintptr_t)ret;
}
uintptr_t KsUnlink(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = unlink((const char *)(param[0]) );
return (uintptr_t)ret;
}
uintptr_t KsStat(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = stat((const char *)(param[0]), (struct stat *)(param[1]));
return (uintptr_t)ret;
}
uintptr_t KsFstat(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = fstat((int)(param[0]), (struct stat *)(param[1]));
return (uintptr_t)ret;
}
uintptr_t KsFsync(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = fsync((int)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsFtruncate(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = ftruncate((int)(param[0]), (off_t)(param[1]));
return (uintptr_t)ret;
}
uintptr_t KsMkdir(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = mkdir((const char *)(param[0]), (mode_t)(param[1]));
return (uintptr_t)ret;
}
uintptr_t KsOpendir(uint32_t knum,uintptr_t *param, uint8_t num )
{
DIR *ret;
ret = opendir((const char *)(param[0]) );
return (uintptr_t)ret;
}
uintptr_t KsClosedir(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = closedir((DIR *)(param[0]) );
return (uintptr_t)ret;
}
uintptr_t KsReaddir(uint32_t knum,uintptr_t *param, uint8_t num )
{
struct dirent *ret;
ret = readdir((DIR *)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsRmdir(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = rmdir((const char *)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsChdir(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = chdir((const char *)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsGetcwd(uint32_t knum,uintptr_t *param, uint8_t num )
{
char *ret;
ret = getcwd((char *)(param[0]), (size_t)(param[1]));
return (uintptr_t)ret;
}
uintptr_t KsTelldir(uint32_t knum,uintptr_t *param, uint8_t num )
{
long ret = 0;
//ret = telldir((DIR *)(param[0]));
return (uintptr_t)ret;
}
uintptr_t KsSeekdir(uint32_t knum,uintptr_t *param, uint8_t num )
{
seekdir((DIR *)(param[0]), (off_t)(param[1]));
return 0;
}
uintptr_t KsRewinddir(uint32_t knum,uintptr_t *param, uint8_t num )
{
rewinddir((DIR *)(param[0]));
return 0;
}
uintptr_t KsStatfs(uint32_t knum,uintptr_t *param, uint8_t num )
{
int ret;
ret = statfs((const char *)(param[0]), (struct statfs *)(param[1]));
return (uintptr_t)ret;
}
#endif
struct Kernel_Service g_service_table[256] __attribute__ ((section (".g_service_table"))) =
{
[KS_USER_PRINT_INFO] = { KsPrintInfo, 1 },
/*************** Task ************/
[KS_USER_TASK_CREATE] = { KsTaskCreate, 5 },
[KS_USER_TASK_STARTUP] = { KsStartupTask, 1 },
[KS_USER_TASK_DELETE] = { KsTaskDelete, 1 },
[KS_USER_TASK_EXECEXIT] = { KsTaskQuit, 0 },
[KS_USER_TASK_CORE_COMBINE] = { KsTaskCoreCombine, 2 },
[KS_USER_TASK_CORE_UNCOMBINE] = { KsTaskCoreUnCombine, 1 },
[KS_USER_TASK_DELAY] = { KsMdelayTask, 1 },
[KS_USER_GET_TASK_NAME] = { KsGetTaskName, 2 },
[KS_USER_GET_TASK_ID] = { KsGetTaskID, 0 },
[KS_USER_GET_TASK_STAT] = { KsGetTaskStat, 1 },
[KS_USER_GET_TASK_COMBINEED_CORE] = { KsGetTaskCombinedCore, 1 },
[KS_USER_GET_TASK_RUNNING_CORE] = { KsGetTaskRunningCore, 1 },
[KS_USER_GET_TASK_ERROR_STATUS] = { KsGetTaskErrorstatus, 1 },
[KS_USER_GET_TASK_PRIORITY] = { KsGetTaskPriority, 1 },
/*************** Memory ************/
[KS_USER_MALLOC] = { KsMalloc, 1 },
[KS_USER_FREE] = { KsFree, 1 },
#ifdef KERNEL_MUTEX
/*************** Mutex ************/
[KS_USER_MUTEX_CREATE] = { KsCreateMutex, 0 },
[KS_USER_MUTEX_DELETE] = { KsDeleteMutex, 1 },
[KS_USER_MUTEX_OBTAIN] = { KsMutexObtain, 2 },
[KS_USER_MUTEX_ABANDON] = { KsMutexAbandon, 1 },
#endif
#ifdef KERNEL_SEMAPHORE
/*************** Semaphore ************/
[KS_USER_SEMAPHORE_CREATE] = { KsCreateSemaphore, 1 },
[KS_USER_SEMAPHORE_DELETE] = { KsDeleteSemaphore, 1 },
[KS_USER_SEMAPHORE_OBTAIN] = { KsSemaphoreObtain, 2 },
[KS_USER_SEMAPHORE_ABANDON] = { KsSemaphoreAbandon, 1 },
[KS_USER_SEMAPHORE_SETVALUE] = { KsSemaphoreSetValue, 2 },
#endif
/*************** Event ************/
#ifdef KERNEL_EVENT
[KS_USER_EVENT_CREATE] = { KsCreateEvent, 1 },
[KS_USER_EVENT_DELETE] = { KsDeleteEvent, 1 },
[KS_USER_EVENT_TRIGGER] = { KsEventTrigger, 2 },
[KS_USER_EVENT_PROCESS] = { KsEventProcess, 5 },
#endif
#ifdef KERNEL_MESSAGEQUEUE
/*************** Msg queue ************/
[KS_USER_MSGQUEUE_CREATE] = { KsCreateMsgQueue, 2 },
[KS_USER_MSGQUEUE_DELETE] = { KsDeleteMsgQueue, 1 },
[KS_USER_MSGQUEUE_SENDWAIT] = { KsMsgQueueSendwait, 4 },
[KS_USER_MSGQUEUE_SEND] = { KsMsgQueueSend, 3 },
[KS_USER_MSGQUEUE_URGENTSEND] = { KsMsgQueueUrgentSend, 3 },
[KS_USER_MSGQUEUE_RECV] = { KsMsgQueueRecv, 4 },
[KS_USER_MSGQUEUE_REINIT] = { KsMsgQueueReinit, 1 },
#endif
#ifdef FS_VFS
/*************** fs poxix ************/
[KS_USER_OPEN] = { KsOpen , 3 },
[KS_USER_READ] = { KsRead , 3 },
[KS_USER_WRITE] = { KsWrite , 3 },
[KS_USER_CLOSE] = { KsClose , 1 },
[KS_USER_IOCTL] = { KsIoctl , 3 },
[KS_USER_LSEEK] = { KsLseek , 3 },
[KS_USER_RENAME] = { KsRename , 2 },
[KS_USER_UNLINK] = { KsUnlink , 1 },
[KS_USER_STAT] = { KsStat , 2 },
[KS_USER_FS_STAT] = { KsFstat , 2 },
[KS_USER_FS_SYNC] = { KsFsync , 1 },
[KS_USER_FTRUNCATE] = { KsFtruncate , 2 },
[KS_USER_MKDIR] = { KsMkdir , 2 },
[KS_USER_OPENDIR] = { KsOpendir , 1 },
[KS_USER_CLOSEDIR] = { KsClosedir , 1 },
[KS_USER_READDIR] = { KsReaddir , 1 },
[KS_USER_RMDIR] = { KsRmdir , 1 },
[KS_USER_CHDIR] = { KsChdir , 1 },
[KS_USER_GETCWD] = { KsGetcwd, 2 },
[KS_USER_TELLDIR] = { KsTelldir, 1 },
[KS_USER_SEEKDIR] = { KsSeekdir, 2 },
[KS_USER_REWIND_DIR] = { KsRewinddir, 1 },
[KS_USER_STAT_FS] = { KsStatfs, 2 },
#endif
[KS_USER_END ... 255] = {NONE, 0}
};
#else
struct utask
{
char name[NAME_NUM_MAX];
void *func_entry;
void *func_param;
int32_t stack_size;
uint8_t prio;
};
typedef struct utask UtaskType;
int32_t UserTaskCreate(UtaskType utask)
{
return KTaskCreate(utask.name, utask.func_entry, utask.func_param,utask.stack_size,utask.prio);
}
x_err_t UserGetTaskName(int32_t id ,char *name)
{
KTaskDescriptorType task ;
uint8_t *buf = (uint8_t *)(name);
task = GetTaskWithIdnodeInfo(id);
if ( task == NONE )
return -ERROR;
strncpy(buf, task->task_base_info.name, NAME_NUM_MAX);
return EOK;
}
int32_t UserGetTaskID(void)
{
return (uintptr_t)GetKTaskDescriptor()->id.id;
}
uint8_t UserGetTaskStat(int32_t id)
{
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo(id);
return (uintptr_t)task->task_dync_sched_member.stat;
}
#ifdef ARCH_SMP
uint8_t UserGetTaskCombinedCore(int32_t id)
{
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo(id);
return (uintptr_t)task->task_smp_info.combined_coreid;
}
uint8_t UserGetTaskRunningCore(int32_t id)
{
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo(id);
return (uintptr_t)task->task_smp_info.runing_coreid;
}
#endif
x_err_t UserGetTaskErrorstatus(int32_t id)
{
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo(id);
return (uintptr_t)task->exstatus;
}
uint8_t UserGetTaskPriority(int32_t id)
{
KTaskDescriptorType task ;
task = GetTaskWithIdnodeInfo(id);
return (uintptr_t)task->task_dync_sched_member.cur_prio;
}
long occupy_g_service_table __attribute__ ((section (".g_service_table"))) = 0;
#endif