fix:Solve the coupling between the kernel and the structure under ARCH.
Close #I3OAFR Change-Id: Icea238e20adf402d0ec1fc7e47ff4e58124a5e83
This commit is contained in:
@@ -1349,8 +1349,6 @@ LITE_OS_SEC_TEXT UINT32 OsExecRecycleAndInit(LosProcessCB *processCB, const CHAR
|
||||
|
||||
LITE_OS_SEC_TEXT UINT32 OsExecStart(const TSK_ENTRY_FUNC entry, UINTPTR sp, UINTPTR mapBase, UINT32 mapSize)
|
||||
{
|
||||
LosTaskCB *taskCB = NULL;
|
||||
TaskContext *taskContext = NULL;
|
||||
UINT32 intSave;
|
||||
|
||||
if (entry == NULL) {
|
||||
@@ -1366,14 +1364,17 @@ LITE_OS_SEC_TEXT UINT32 OsExecStart(const TSK_ENTRY_FUNC entry, UINTPTR sp, UINT
|
||||
}
|
||||
|
||||
SCHEDULER_LOCK(intSave);
|
||||
taskCB = OsCurrTaskGet();
|
||||
LosTaskCB *taskCB = OsCurrTaskGet();
|
||||
|
||||
taskCB->userMapBase = mapBase;
|
||||
taskCB->userMapSize = mapSize;
|
||||
taskCB->taskEntry = (TSK_ENTRY_FUNC)entry;
|
||||
|
||||
taskContext = (TaskContext *)OsTaskStackInit(taskCB->taskID, taskCB->stackSize, (VOID *)taskCB->topOfStack, FALSE);
|
||||
OsUserTaskStackInit(taskContext, taskCB->taskEntry, sp);
|
||||
TaskContext *taskContext = (TaskContext *)OsTaskStackInit(taskCB->taskID, taskCB->stackSize,
|
||||
(VOID *)taskCB->topOfStack, FALSE);
|
||||
OsUserTaskStackInit(taskContext, (UINTPTR)taskCB->taskEntry, sp);
|
||||
taskCB->stackPointer = (VOID *)taskContext;
|
||||
OsTaskContextLoad(taskCB);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
return LOS_OK;
|
||||
}
|
||||
@@ -1555,7 +1556,7 @@ STATIC VOID OsInitCopyTaskParam(LosProcessCB *childProcessCB, const CHAR *name,
|
||||
|
||||
STATIC UINT32 OsCopyTask(UINT32 flags, LosProcessCB *childProcessCB, const CHAR *name, UINTPTR entry, UINT32 size)
|
||||
{
|
||||
LosTaskCB *childTaskCB = NULL;
|
||||
LosTaskCB *runTask = OsCurrTaskGet();
|
||||
TSK_INIT_PARAM_S childPara = { 0 };
|
||||
UINT32 ret;
|
||||
UINT32 intSave;
|
||||
@@ -1571,8 +1572,8 @@ STATIC UINT32 OsCopyTask(UINT32 flags, LosProcessCB *childProcessCB, const CHAR
|
||||
return LOS_ENOMEM;
|
||||
}
|
||||
|
||||
childTaskCB = OS_TCB_FROM_TID(taskID);
|
||||
childTaskCB->taskStatus = OsCurrTaskGet()->taskStatus;
|
||||
LosTaskCB *childTaskCB = OS_TCB_FROM_TID(taskID);
|
||||
childTaskCB->taskStatus = runTask->taskStatus;
|
||||
if (childTaskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
|
||||
childTaskCB->taskStatus &= ~OS_TASK_STATUS_RUNNING;
|
||||
} else {
|
||||
@@ -1585,7 +1586,7 @@ STATIC UINT32 OsCopyTask(UINT32 flags, LosProcessCB *childProcessCB, const CHAR
|
||||
|
||||
if (OsProcessIsUserMode(childProcessCB)) {
|
||||
SCHEDULER_LOCK(intSave);
|
||||
OsUserCloneParentStack(childTaskCB, OsCurrTaskGet());
|
||||
OsUserCloneParentStack(childTaskCB->stackPointer, runTask->topOfStack, runTask->stackSize);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
}
|
||||
return LOS_OK;
|
||||
|
||||
@@ -571,7 +571,7 @@ STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam,
|
||||
taskCB->userArea = initParam->userParam.userArea;
|
||||
taskCB->userMapBase = initParam->userParam.userMapBase;
|
||||
taskCB->userMapSize = initParam->userParam.userMapSize;
|
||||
OsUserTaskStackInit(taskCB->stackPointer, taskCB->taskEntry, initParam->userParam.userSP);
|
||||
OsUserTaskStackInit(taskCB->stackPointer, (UINTPTR)taskCB->taskEntry, initParam->userParam.userSP);
|
||||
}
|
||||
|
||||
if (!processCB->threadNumber) {
|
||||
|
||||
@@ -48,9 +48,6 @@ extern "C" {
|
||||
#define LOS_BIT_CLR(val, bit) ((val) = (val) & ~(1ULL << (UINT32)(bit)))
|
||||
#define LOS_IS_BIT_SET(val, bit) (bool)((((val) >> (UINT32)(bit)) & 1ULL))
|
||||
|
||||
#define OS_SYSCALL_SET_CPSR(regs, cpsr) (*((unsigned long *)((UINTPTR)(regs) - 4)) = (cpsr))
|
||||
#define OS_SYSCALL_SET_SR(regs, cpsr) (*((unsigned long *)((UINTPTR)(regs))) = (cpsr))
|
||||
#define OS_SYSCALL_GET_CPSR(regs) (*((unsigned long *)((UINTPTR)(regs) - 4)))
|
||||
#define SIG_STOP_VISIT 1
|
||||
|
||||
#define OS_KERNEL_KILL_PERMISSION 0U
|
||||
@@ -135,27 +132,6 @@ struct sq_queue_s {
|
||||
};
|
||||
typedef struct sq_queue_s sq_queue_t;
|
||||
|
||||
#define TASK_IRQ_CONTEXT \
|
||||
unsigned int R0; \
|
||||
unsigned int R1; \
|
||||
unsigned int R2; \
|
||||
unsigned int R3; \
|
||||
unsigned int R12; \
|
||||
unsigned int USP; \
|
||||
unsigned int ULR; \
|
||||
unsigned int CPSR; \
|
||||
unsigned int PC;
|
||||
|
||||
typedef struct {
|
||||
TASK_IRQ_CONTEXT
|
||||
} TaskIrqDataSize;
|
||||
|
||||
typedef struct {
|
||||
TASK_IRQ_CONTEXT
|
||||
unsigned int R7;
|
||||
unsigned int count;
|
||||
} sig_switch_context;
|
||||
|
||||
typedef struct {
|
||||
sigset_t sigFlag;
|
||||
sigset_t sigPendFlag;
|
||||
@@ -164,7 +140,8 @@ typedef struct {
|
||||
LOS_DL_LIST waitList;
|
||||
sigset_t sigwaitmask; /* Waiting for pending signals */
|
||||
siginfo_t sigunbinfo; /* Signal info when task unblocked */
|
||||
sig_switch_context context;
|
||||
void *sigContext;
|
||||
unsigned int count;
|
||||
} sig_cb;
|
||||
|
||||
#define SIGEV_THREAD_ID 4
|
||||
@@ -180,8 +157,6 @@ int OsPthreadKill(UINT32 tid, int signo);
|
||||
int OsSigEmptySet(sigset_t *);
|
||||
int OsSigAddSet(sigset_t *, int);
|
||||
int OsSigIsMember(const sigset_t *, int);
|
||||
void OsSaveSignalContext(unsigned int *sp);
|
||||
void OsRestorSignalContext(unsigned int *sp);
|
||||
int OsKill(pid_t pid, int sig, int permission);
|
||||
int OsDispatch(pid_t pid, siginfo_t *info, int permission);
|
||||
int OsSigTimedWait(sigset_t *set, siginfo_t *info, unsigned int timeout);
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
#define __LOS_VM_FAULT_H__
|
||||
|
||||
#include "los_typedef.h"
|
||||
#include "los_exc.h"
|
||||
#include "los_hw_pri.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
@@ -46,6 +46,8 @@ extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef IrqContext PageFaultContext;
|
||||
|
||||
typedef struct {
|
||||
VADDR_T excAddr;
|
||||
VADDR_T fixAddr;
|
||||
@@ -56,7 +58,7 @@ typedef struct {
|
||||
#define VM_MAP_PF_FLAG_INSTRUCTION (1U << 2)
|
||||
#define VM_MAP_PF_FLAG_NOT_PRESENT (1U << 3)
|
||||
|
||||
STATUS_T OsVmPageFaultHandler(VADDR_T vaddr, UINT32 flags, ExcContext *frame);
|
||||
STATUS_T OsVmPageFaultHandler(VADDR_T vaddr, UINT32 flags, PageFaultContext *frame);
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
|
||||
@@ -556,131 +556,64 @@ int OsSigAction(int sig, const sigaction_t *act, sigaction_t *oact)
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
void OsSaveSignalContext(unsigned int *sp)
|
||||
VOID *OsSaveSignalContext(VOID *sp)
|
||||
{
|
||||
UINTPTR sigHandler;
|
||||
UINT32 intSave;
|
||||
LosTaskCB *task = NULL;
|
||||
LosProcessCB *process = NULL;
|
||||
sig_cb *sigcb = NULL;
|
||||
unsigned long cpsr;
|
||||
|
||||
OS_RETURN_IF_VOID(sp == NULL);
|
||||
cpsr = OS_SYSCALL_GET_CPSR(sp);
|
||||
|
||||
OS_RETURN_IF_VOID(((cpsr & CPSR_MASK_MODE) != CPSR_USER_MODE));
|
||||
SCHEDULER_LOCK(intSave);
|
||||
task = OsCurrTaskGet();
|
||||
process = OsCurrProcessGet();
|
||||
sigcb = &task->sig;
|
||||
|
||||
if ((sigcb->context.count == 0) && ((sigcb->sigFlag != 0) || (process->sigShare != 0))) {
|
||||
LosTaskCB *task = OsCurrTaskGet();
|
||||
LosProcessCB *process = OsCurrProcessGet();
|
||||
sig_cb *sigcb = &task->sig;
|
||||
if ((sigcb->count == 0) && ((sigcb->sigFlag != 0) || (process->sigShare != 0))) {
|
||||
sigHandler = OsGetSigHandler();
|
||||
if (sigHandler == 0) {
|
||||
sigcb->sigFlag = 0;
|
||||
process->sigShare = 0;
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
PRINT_ERR("The signal processing function for the current process pid =%d is NULL!\n", task->processID);
|
||||
return;
|
||||
return sp;
|
||||
}
|
||||
/* One pthread do the share signal */
|
||||
sigcb->sigFlag |= process->sigShare;
|
||||
unsigned int signo = (unsigned int)FindFirstSetedBit(sigcb->sigFlag) + 1;
|
||||
UINT32 signo = (UINT32)FindFirstSetedBit(sigcb->sigFlag) + 1;
|
||||
UINT32 sigVal = (UINT32)(UINTPTR)(sigcb->sigunbinfo.si_value.sival_ptr);
|
||||
OsProcessExitCodeSignalSet(process, signo);
|
||||
sigcb->context.CPSR = cpsr;
|
||||
sigcb->context.PC = sp[REG_PC];
|
||||
sigcb->context.USP = sp[REG_SP];
|
||||
sigcb->context.ULR = sp[REG_LR];
|
||||
sigcb->context.R0 = sp[REG_R0];
|
||||
sigcb->context.R1 = sp[REG_R1];
|
||||
sigcb->context.R2 = sp[REG_R2];
|
||||
sigcb->context.R3 = sp[REG_R3];
|
||||
sigcb->context.R7 = sp[REG_R7];
|
||||
sigcb->context.R12 = sp[REG_R12];
|
||||
sp[REG_PC] = sigHandler;
|
||||
sp[REG_R0] = signo;
|
||||
sp[REG_R1] = (unsigned int)(UINTPTR)(sigcb->sigunbinfo.si_value.sival_ptr);
|
||||
sigcb->sigContext = sp;
|
||||
|
||||
VOID *newSp = OsInitSignalContext(sp, sigHandler, signo, sigVal);
|
||||
|
||||
/* sig No bits 00000100 present sig No 3, but 1<< 3 = 00001000, so signo needs minus 1 */
|
||||
sigcb->sigFlag ^= 1ULL << (signo - 1);
|
||||
sigcb->context.count++;
|
||||
}
|
||||
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
}
|
||||
|
||||
void OsSaveSignalContextIrq(unsigned int *sp, unsigned int r7)
|
||||
{
|
||||
UINTPTR sigHandler;
|
||||
LosTaskCB *task = NULL;
|
||||
LosProcessCB *process = NULL;
|
||||
sig_cb *sigcb = NULL;
|
||||
unsigned long cpsr;
|
||||
UINT32 intSave;
|
||||
TaskIrqContext *context = (TaskIrqContext *)(sp);
|
||||
|
||||
OS_RETURN_IF_VOID(sp == NULL);
|
||||
cpsr = context->CPSR;
|
||||
OS_RETURN_IF_VOID(((cpsr & CPSR_MASK_MODE) != CPSR_USER_MODE));
|
||||
|
||||
SCHEDULER_LOCK(intSave);
|
||||
task = OsCurrTaskGet();
|
||||
process = OsCurrProcessGet();
|
||||
sigcb = &task->sig;
|
||||
if ((sigcb->context.count == 0) && ((sigcb->sigFlag != 0) || (process->sigShare != 0))) {
|
||||
sigHandler = OsGetSigHandler();
|
||||
if (sigHandler == 0) {
|
||||
sigcb->sigFlag = 0;
|
||||
process->sigShare = 0;
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
PRINT_ERR("The current process pid =%d starts fail!\n", task->processID);
|
||||
return;
|
||||
}
|
||||
sigcb->sigFlag |= process->sigShare;
|
||||
unsigned int signo = (unsigned int)FindFirstSetedBit(sigcb->sigFlag) + 1;
|
||||
OsProcessExitCodeSignalSet(process, signo);
|
||||
(VOID)memcpy_s(&sigcb->context.R0, sizeof(TaskIrqDataSize), &context->R0, sizeof(TaskIrqDataSize));
|
||||
sigcb->context.R7 = r7;
|
||||
context->PC = sigHandler;
|
||||
context->R0 = signo;
|
||||
context->R1 = (UINT32)(UINTPTR)sigcb->sigunbinfo.si_value.sival_ptr;
|
||||
/* sig No bits 00000100 present sig No 3, but 1<< 3 = 00001000, so signo needs minus 1 */
|
||||
sigcb->sigFlag ^= 1ULL << (signo - 1);
|
||||
sigcb->context.count++;
|
||||
}
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
}
|
||||
|
||||
void OsRestorSignalContext(unsigned int *sp)
|
||||
{
|
||||
LosTaskCB *task = NULL; /* Do not adjust this statement */
|
||||
LosProcessCB *process = NULL;
|
||||
sig_cb *sigcb = NULL;
|
||||
UINT32 intSave;
|
||||
|
||||
SCHEDULER_LOCK(intSave);
|
||||
task = OsCurrTaskGet();
|
||||
sigcb = &task->sig;
|
||||
|
||||
if (sigcb->context.count != 1) {
|
||||
sigcb->count++;
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
PRINT_ERR("sig error count : %d\n", sigcb->context.count);
|
||||
return;
|
||||
return newSp;
|
||||
}
|
||||
|
||||
process = OsCurrProcessGet();
|
||||
sp[REG_PC] = sigcb->context.PC;
|
||||
OS_SYSCALL_SET_CPSR(sp, sigcb->context.CPSR);
|
||||
sp[REG_SP] = sigcb->context.USP;
|
||||
sp[REG_LR] = sigcb->context.ULR;
|
||||
sp[REG_R0] = sigcb->context.R0;
|
||||
sp[REG_R1] = sigcb->context.R1;
|
||||
sp[REG_R2] = sigcb->context.R2;
|
||||
sp[REG_R3] = sigcb->context.R3;
|
||||
sp[REG_R7] = sigcb->context.R7;
|
||||
sp[REG_R12] = sigcb->context.R12;
|
||||
sigcb->context.count--;
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
return sp;
|
||||
}
|
||||
|
||||
VOID *OsRestorSignalContext(VOID *sp)
|
||||
{
|
||||
UINT32 intSave;
|
||||
|
||||
SCHEDULER_LOCK(intSave);
|
||||
LosTaskCB *task = OsCurrTaskGet();
|
||||
sig_cb *sigcb = &task->sig;
|
||||
|
||||
if (sigcb->count != 1) {
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
PRINT_ERR("sig error count : %d\n", sigcb->count);
|
||||
return sp;
|
||||
}
|
||||
|
||||
LosProcessCB *process = OsCurrProcessGet();
|
||||
VOID *saveContext = sigcb->sigContext;
|
||||
sigcb->count--;
|
||||
process->sigShare = 0;
|
||||
OsProcessExitCodeSignalClear(process);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
return saveContext;
|
||||
}
|
||||
|
||||
|
||||
@@ -75,12 +75,12 @@ STATIC STATUS_T OsVmRegionRightCheck(LosVmMapRegion *region, UINT32 flags)
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
STATIC VOID OsFaultTryFixup(ExcContext *frame, VADDR_T excVaddr, STATUS_T *status)
|
||||
STATIC VOID OsFaultTryFixup(PageFaultContext *frame, VADDR_T excVaddr, STATUS_T *status)
|
||||
{
|
||||
INT32 tableNum = (__exc_table_end - __exc_table_start) / sizeof(LosExcTable);
|
||||
LosExcTable *excTable = (LosExcTable *)__exc_table_start;
|
||||
|
||||
if ((frame->regCPSR & CPSR_MODE_MASK) != CPSR_MODE_USR) {
|
||||
if ((frame->CPSR & CPSR_MODE_MASK) != CPSR_MODE_USR) {
|
||||
for (int i = 0; i < tableNum; ++i, ++excTable) {
|
||||
if (frame->PC == (UINTPTR)excTable->excAddr) {
|
||||
frame->PC = (UINTPTR)excTable->fixAddr;
|
||||
@@ -332,7 +332,7 @@ STATIC STATUS_T OsDoFileFault(LosVmMapRegion *region, LosVmPgFault *vmPgFault, U
|
||||
return ret;
|
||||
}
|
||||
|
||||
STATUS_T OsVmPageFaultHandler(VADDR_T vaddr, UINT32 flags, ExcContext *frame)
|
||||
STATUS_T OsVmPageFaultHandler(VADDR_T vaddr, UINT32 flags, PageFaultContext *frame)
|
||||
{
|
||||
LosVmSpace *space = LOS_SpaceGet(vaddr);
|
||||
LosVmMapRegion *region = NULL;
|
||||
|
||||
Reference in New Issue
Block a user