/* * Get task register contents */ LOCAL void get_reg( TCB *tcb, T_REGS *regs, T_EIT *eit, T_CREGS *cregs ) { SStackFrame *ssp; UW cpsr; INT i; ssp = tcb->tskctxb.ssp; cpsr = ssp->spsr_svc; if ( regs != NULL ) { for ( i = 0; i < 12; ++i ) { regs->r[i] = ssp->r[i]; } regs->r[12] = ssp->ip; if ( (cpsr & PSR_M(31)) == PSR_SVC ) { regs->lr = ssp->lr_svc; } else { regs->lr = ssp->lr_usr; } } if ( eit != NULL ) { eit->pc = ssp->pc; eit->cpsr = ssp->spsr_svc; eit->taskmode = ssp->taskmode; } if ( cregs != NULL ) { cregs->ssp = tcb->tskctxb.ssp; cregs->uatb = tcb->tskctxb.uatb; cregs->lsid = tcb->tskctxb.lsid; cregs->usp = ssp->usp; } }
/* obtain CPU mode index */ LOCAL W ixCpuMode(void) { // obtain mode switch(regStack[ixCPSR] & PSR_M(31)) { case PSR_USR: case PSR_SYS: return ixUSR; case PSR_FIQ: return ixFIQ; case PSR_IRQ: return ixIRQ; case PSR_SVC: return ixSVC; case PSR_ABT: return ixABT; case PSR_UND: return ixUND; } return 0; }
/* * Set task register contents */ EXPORT void knl_set_reg( TCB *tcb, T_REGS *regs, T_EIT *eit, T_CREGS *cregs ) { SStackFrame *ssp; #if USE_TRAP UW cpsr; #endif INT i; ssp = tcb->tskctxb.ssp; #if USE_TRAP cpsr = ssp->spsr_svc; #endif if ( cregs != NULL ) { ssp = cregs->ssp; } if ( regs != NULL ) { for ( i = 0; i < 12; ++i ) { ssp->r[i] = regs->r[i]; } #if USE_TRAP ssp->ip = regs->r[12]; if ( (cpsr & PSR_M(31)) == PSR_SVC ) { ssp->lr_svc = regs->lr; } else { ssp->lr_usr = regs->lr; } #endif } if ( eit != NULL ) { ssp->pc = eit->pc; #if USE_TRAP ssp->spsr_svc = (eit->cpsr & 0xff000000) | (cpsr & 0x00ffffff); #endif ssp->taskmode = eit->taskmode; } if ( cregs != NULL ) { tcb->tskctxb.ssp = cregs->ssp; ssp->usp = cregs->usp; } }
/* * Get task register contents */ EXPORT void knl_get_reg( TCB *tcb, T_REGS *regs, T_EIT *eit, T_CREGS *cregs ) { SStackFrame *ssp; #if USE_TRAP UW cpsr; #endif INT i; ssp = tcb->tskctxb.ssp; #if USE_TRAP cpsr = ssp->spsr_svc; #endif if ( regs != NULL ) { for ( i = 0; i < 12; ++i ) { regs->r[i] = ssp->r[i]; } #if USE_TRAP regs->r[12] = ssp->ip; if ( (cpsr & PSR_M(31)) == PSR_SVC ) { regs->lr = ssp->lr_svc; } else { regs->lr = ssp->lr_usr; } #endif } if ( eit != NULL ) { eit->pc = ssp->pc; #if USE_TRAP eit->cpsr = ssp->spsr_svc; #endif eit->taskmode = ssp->taskmode; } if ( cregs != NULL ) { cregs->ssp = tcb->tskctxb.ssp; cregs->usp = ssp->usp; } }
/* * Set task register contents */ LOCAL void set_reg( TCB *tcb, T_REGS *regs, T_EIT *eit, T_CREGS *cregs ) { SStackFrame *ssp; UW cpsr; INT i; ssp = tcb->tskctxb.ssp; cpsr = ssp->spsr_svc; if ( cregs != NULL ) { ssp = cregs->ssp; } if ( regs != NULL ) { for ( i = 0; i < 12; ++i ) { ssp->r[i] = regs->r[i]; } ssp->ip = regs->r[12]; if ( (cpsr & PSR_M(31)) == PSR_SVC ) { ssp->lr_svc = regs->lr; } else { ssp->lr_usr = regs->lr; } } if ( eit != NULL ) { ssp->pc = eit->pc; ssp->spsr_svc = (eit->cpsr & 0xff000000) | (cpsr & 0x00ffffff); ssp->taskmode = eit->taskmode; } if ( cregs != NULL ) { tcb->tskctxb.ssp = cregs->ssp; tcb->tskctxb.uatb = cregs->uatb; tcb->tskctxb.lsid = cregs->lsid; ssp->usp = cregs->usp; } }