38#ifdef LOSCFG_SECURITY_CAPABILITY
43#ifdef LOSCFG_KERNEL_VM
48 PRINT_ERR(
"%s NOT SUPPORT\n", __FUNCTION__);
53#define GETUNMASKSET(procmask, pendFlag) ((~(procmask)) & (sigset_t)(pendFlag))
54#define UINT64_BIT_SIZE 64
71 ret = ((*set & SIGNO2SET((
unsigned int)signo)) != 0);
81 while (tmpInfoNode != NULL) {
82 if (tmpInfoNode->
info.si_signo == signo) {
84 (VOID)memcpy_s(&sigcb->
sigunbinfo,
sizeof(siginfo_t), &tmpInfoNode->
info,
sizeof(siginfo_t));
86 *prevHook = tmpInfoNode->
next;
88 tmpInfoNode = *prevHook;
91 prevHook = &tmpInfoNode->
next;
92 tmpInfoNode = tmpInfoNode->
next;
100 while (tmp != NULL) {
101 if (tmp->
info.si_signo == info->si_signo) {
118 (VOID)memcpy_s(&tmp->
info,
sizeof(siginfo_t), info,
sizeof(siginfo_t));
149 if ((signo != SIGKILL) && (taskCB->
waitFlag != OS_TASK_WAIT_SIGNAL)) {
154 case OS_TASK_WAIT_PROCESS:
155 case OS_TASK_WAIT_GID:
156 case OS_TASK_WAIT_ANYPROCESS:
159 case OS_TASK_WAIT_JOIN:
163 case OS_TASK_WAIT_SIGNAL:
166 case OS_TASK_WAIT_LITEIPC:
170 case OS_TASK_WAIT_FUTEX:
187 OS_RETURN_IF_NULL(sigcb);
189 if (info->si_signo == 0) {
217 if (unmaskset != NULL_SIGNAL_SET) {
237 unsigned int intSave;
240 SCHEDULER_LOCK(intSave);
243 if (oldsetl != NULL) {
248 set = *(sigset_t *)setl;
274 SCHEDULER_UNLOCK(intSave);
286 ret = handler(taskCB, arg);
287 OS_RETURN_IF(ret != 0, ret);
314 OS_RETURN_IF(ret < 0, ret);
318 OS_RETURN_IF(info->
receivedTcb != NULL, SIG_STOP_VISIT);
329 OS_RETURN_IF(ret < 0, ret);
332 OS_RETURN_IF(info->
awakenedTcb != NULL, SIG_STOP_VISIT);
368 .unblockedTcb = NULL,
378 if (info.
sigInfo->si_signo == SIGKILL) {
394 *set = NULL_SIGNAL_SET;
403 if (gid == OS_KERNEL_PROCESS_GROUP) {
405 }
else if (gid == OS_USER_PRIVILEGE_PROCESS_GROUP) {
427#ifdef LOSCFG_SECURITY_CAPABILITY
450int OsKill(pid_t pid,
int sig,
int permission)
462 info.si_code = SI_USER;
463 info.si_value.sival_ptr = NULL;
468 }
else if (pid == -1) {
483 unsigned int intSave;
485 SCHEDULER_LOCK(intSave);
486 ret =
OsKill(pid, sig, OS_USER_KILL_PERMISSION);
487 SCHEDULER_UNLOCK(intSave);
500 info.si_signo = signo;
501 info.si_code = SI_USER;
502 info.si_value.sival_ptr = NULL;
516 if (OS_TID_CHECK_INVALID(tid)) {
521 SCHEDULER_LOCK(intSave);
523 SCHEDULER_UNLOCK(intSave);
536 *set |= SIGNO2SET((
unsigned int)signo);
544 unsigned int intSave;
550 SCHEDULER_LOCK(intSave);
553 SCHEDULER_UNLOCK(intSave);
564 for (count = 0; (count < UINT64_BIT_SIZE) && (n ^ 1ULL); n >>= 1, count++) {}
565 return (count < UINT64_BIT_SIZE) ? count : (-1);
593 if (ret == LOS_ERRNO_TSK_TIMEOUT) {
599 (VOID)memcpy_s(info,
sizeof(siginfo_t), &sigcb->
sigunbinfo,
sizeof(siginfo_t));
607 unsigned int intSave;
609 SCHEDULER_LOCK(intSave);
613 SCHEDULER_UNLOCK(intSave);
620 sigset_t oldSigprocmask;
629 unsigned int intSave;
637 SCHEDULER_LOCK(intSave);
641 setSuspend = FULL_SIGNAL_SET & (~(*set));
647 SCHEDULER_UNLOCK(intSave);
658 PRINT_ERR(
"FUNC %s LINE = %d, ret = %x\n", __FUNCTION__, __LINE__, ret);
662 SCHEDULER_UNLOCK(intSave);
682 if (!
GOOD_SIGNO(sig) || sig < 1 || act == NULL) {
745 SCHEDULER_LOCK(intSave);
748 if (sigHandler == 0) {
751 SCHEDULER_UNLOCK(intSave);
752 PRINT_ERR(
"The signal processing function for the current process pid =%d is NULL!\n", task->
processID);
766 sigcb->
sigFlag ^= 1ULL << (signo - 1);
768 SCHEDULER_UNLOCK(intSave);
772 SCHEDULER_UNLOCK(intSave);
793 SCHEDULER_LOCK(intSave);
794 if (sigcb->
count != 1) {
795 SCHEDULER_UNLOCK(intSave);
796 PRINT_ERR(
"sig error count : %d\n", sigcb->
count);
806 SCHEDULER_UNLOCK(intSave);
macro EXC_SP_SET reg1 mrc 获取CPU信息 and mov mul reg0 计算当前CPU栈的偏移位置 ldr reg1 相减得到栈顶 mov sp
BOOL IsCapPermit(UINT32 capIndex)
STATIC INLINE INT32 LOS_AtomicAdd(Atomic *v, INT32 addVal)
Atomic addition.
STATIC INLINE INT32 LOS_AtomicSub(Atomic *v, INT32 subVal)
Atomic subtraction.
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
VOID LOS_Schedule(VOID)
Trigger active task scheduling.
原子操作 http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-basic-atomic....
VOID OsFutexNodeDeleteFromFutexHash(FutexNode *node, BOOL isDeleteHead, FutexNode **headNode, BOOL *queueFlags)
从哈希桶上删除快锁
VOID OsInitSignalContext(const VOID *sp, VOID *signalContext, UINTPTR sigHandler, UINT32 signo, UINT32 param)
初始化信号上下文
LITE_OS_SEC_TEXT INT32 OsSendSignalToProcessGroup(INT32 pid, siginfo_t *info, INT32 permission)
LITE_OS_SEC_TEXT VOID OsSetSigHandler(UINTPTR addr)
设置进程的信号处理函数
LITE_OS_SEC_TEXT UINTPTR OsGetSigHandler(VOID)
获取进程的信号处理函数
LITE_OS_SEC_TEXT INT32 OsSendSignalToAllProcess(siginfo_t *info, INT32 permission)
VOID OsWaitWakeTask(LosTaskCB *taskCB, UINT32 wakePID)
STATIC INLINE BOOL OsProcessIsInactive(const LosProcessCB *processCB)
进程不活跃函数定义:身上贴有不使用且不活跃标签的进程
STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)
STATIC INLINE VOID OsProcessExitCodeSignalSet(LosProcessCB *processCB, UINT32 signal)
设置进程退出信号(0 ~ 7)
STATIC INLINE VOID OsProcessExitCodeSignalClear(LosProcessCB *processCB)
清除进程退出信号(0 ~ 7)
STATIC INLINE BOOL OsProcessIsUnused(const LosProcessCB *processCB)
STATIC INLINE BOOL OsProcessIDUserCheckInvalid(UINT32 pid)
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
STATIC INLINE BOOL OsTaskIsPending(const LosTaskCB *taskCB)
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
VOID * OsSaveSignalContext(VOID *sp, VOID *newSp)
保存信号上下文
void OsSigMaskSwitch(LosTaskCB *const rtcb, sigset_t set)
int OsSigTimedWaitNoLock(sigset_t *set, siginfo_t *info, unsigned int timeout)
等待信号时间
STATIC INLINE VOID OsSigWaitTaskWake(LosTaskCB *taskCB, INT32 signo)
唤醒被挂起的处于等待指定信号的任务
int OsSigAddSet(sigset_t *set, int signo)
向信号集中加入signo信号
int OsPause(void)
通过信号挂起当前任务
int OsSigAction(int sig, const sigaction_t *act, sigaction_t *oact)
VOID * OsRestorSignalContext(VOID *sp)
STATIC VOID OsMoveTmpInfoToUnbInfo(sig_cb *sigcb, INT32 signo)
int OsTcbDispatch(LosTaskCB *stcb, siginfo_t *info)
给任务(线程)发送一个信号
int OsSigprocMask(int how, const sigset_t_l *setl, sigset_t_l *oldsetl)
STATIC UINT32 OsPendingTaskWake(LosTaskCB *taskCB, INT32 signo)
int OsSigProcessForeachChild(LosProcessCB *spcb, ForEachTaskCB handler, void *arg)
让进程的每一个task执行参数函数
int OsSigEmptySet(sigset_t *set)
信号集全部清0
VOID OsSigIntUnlock(VOID)
static int SigProcessSignalHandler(LosTaskCB *tcb, void *arg)
信号处理函数,这里就是上面的 handler = SigProcessSignalHandler,见于 OsSigProcessSend
VOID OsClearSigInfoTmpList(sig_cb *sigcb)
STATIC int FindFirstSetedBit(UINT64 n)
int OsPthreadKill(UINT32 tid, int signo)
发送信号
static int OsSignalPermissionToCheck(const LosProcessCB *spcb)
int OsDispatch(pid_t pid, siginfo_t *info, int permission)
信号分发,发送信号权限/进程组过滤.
int OsKillLock(pid_t pid, int sig)
给发送信号过程加锁
int OsSigPending(sigset_t *set)
获取阻塞当前任务的信号集
static int SigProcessKillSigHandler(LosTaskCB *tcb, void *arg)
进程收到 SIGKILL 信号后,通知任务tcb处理.
int OsKill(pid_t pid, int sig, int permission)
static void SigProcessLoadTcb(struct ProcessSignalInfo *info, siginfo_t *sigInfo)
int OsSigSuspend(const sigset_t *set)
用参数set代替进程的原有掩码,并暂停进程执行,直到收到信号再恢复原有掩码并继续执行进程。
INT32 OsTaskKillUnsafe(UINT32 taskID, INT32 signo)
int OsSigIsMember(const sigset_t *set, int signo)
判定信号signo是否存在信号集中。如果信号集里已有该信号则返回1,否则返回0。如果有错误则返回-1
STATIC INT32 OsAddSigInfoToTmpList(sig_cb *sigcb, siginfo_t *info)
int OsSigTimedWait(sigset_t *set, siginfo_t *info, unsigned int timeout)
让当前任务等待的信号
int OsSigProcessSend(LosProcessCB *spcb, siginfo_t *sigInfo)
给参数进程发送参数信号
struct sigaction sigaction_t
static int GOOD_SIGNO(unsigned int sig)
信号ID是否有效
INT32 OsUserTaskOperatePermissionsCheck(const LosTaskCB *taskCB)
LITE_OS_SEC_TEXT VOID OsRunningTaskToExit(LosTaskCB *runTask, UINT32 status)
STATIC INLINE LosTaskCB * OsGetTaskCB(UINT32 taskID)
通过任务ID获取任务实体,task由任务池分配,本质是个数组,彼此都挨在一块
STATIC INLINE VOID OsTaskWaitSetPendMask(UINT16 mask, UINTPTR lockID, UINT32 timeout)
设置事件阻塞掩码,即设置任务的等待事件.
STATIC INLINE VOID OsTaskWakeClearPendMask(LosTaskCB *resumeTask)
清除事件阻塞掩码,即任务不再等待任何事件.
int(* ForEachTaskCB)(LosTaskCB *tcb, void *arg)
回调任务函数,例如:进程被kill 9 时,通知所有任务善后处理
STATIC INLINE BOOL OsTaskIsKilled(const LosTaskCB *taskCB)
struct LOS_DL_LIST * pstNext
LOS_DL_LIST threadSiblingList
UINT32(* wait)(LosTaskCB *runTask, LOS_DL_LIST *list, UINT32 timeout)
任务等待
VOID(* wake)(LosTaskCB *taskCB)
任务唤醒
struct SigInfoListNode * next
FutexNode futex
指明任务在等待哪把快锁,一次只等一锁,锁和任务的关系是(1:N)关系
sig_cb sig
信号控制块,用于异步通信,类似于 linux singal模块
UINT32 userID
用户ID [0,60000],0为root用户
unsigned int sigIntLock
信号中断锁
SigInfoListNode * tmpInfoListHead
sigset_t sigprocmask
Signals that are blocked | 任务屏蔽了哪些信号
LOS_DL_LIST waitList
待链表,上面挂的是等待信号到来的任务, 请查找 OsTaskWait(&sigcb->waitList, timeout, TRUE) 理解
sigset_t sigPendFlag
信号阻塞标签集,记录那些信号来过,任务依然阻塞的集合.即:这些信号不能唤醒任务
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 void
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)