Beispiel #1
0
/*
 * 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;
	}
}
Beispiel #2
0
/*
        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;
	}
}
Beispiel #5
0
/*
 * 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;
	}
}