Exemplo n.º 1
0
/*
 * T-Monitor Entry
 */
EXPORT	void	entMonitor( UW vec )
{
	UW	pc, v;
	char	*bp;

	switch( vec /= 4 ) {
	case 37:	// T-Monitor Service Call
		// Execute SVC: v0:r2(fn),a0:r4,a1:r5,a2:r6,a3:r7
		v = procSVC(getRegister(2), getRegister(4),
			getRegister(5), getRegister(6), getRegister(7));
		setRegister(2, v);	// Set Result
		break;

	case 42:	// Break Point (SYSCALL 42)
		printk(("\nBreak pc:%08X psr:%08X\n", adjCurPC(-4), getCurPSR()));
		procCommand(NULL);
		break;

	default:	// Undefined exception/interrupts
		pc = getCurPC();
		if ( vec < 37 ) {
			bp = NULL;
			switch( vec ) {
			case 1:  bp = "NMI/Soft Reset";	break;
			case 6:  bp = "TLB Change";		break;
			case 7:  bp = "TLB Miss(Load)";	break;
			case 8:  bp = "TLB Miss(Store)";	break;
			case 9:  bp = "Address Error(Load)";	break;
			case 10: bp = "Address Error(Store)";	break;
			case 11: bp = "Bus Error(Inst)";	break;
			case 12: bp = "Bus Error(Data)";	break;
			case 14: bp = "Undefined Break";	break;
			case 15: bp = "Reserved Instruction";	break;
			case 16: bp = "CoProcessor Exception";	break;
			case 17: bp = "Integer Overflow";	break;
			case 18: bp = "Trap Exception";	break;
			case 20: bp = "FP Exception";		break;
			default:
				printk(("\nUndefined Exception VEC-%d", vec));
			}
			if ( vec >= 6 && vec <= 10 )
				printk(("\n%s ADDR:%08X", bp, getBadAddr()));
			else if ( bp != NULL) printk(("\n%s", bp));

		} else if ( vec < 56 ) {	// SYSCALL
			printk(("\nUndefined SYSCALL %d", vec));
			pc -= 4 - ((pc & 1) << 1);

		} else if ( vec < 64 ) {	// Interrupt IP0-7
			printk(("\nUndefined Interrupt IP%d", 63 - vec));

		} else {			// Interrupt IRQ#0-63
			printk(("\nUndefined Interrupt IRQ#%d", 127 - vec));
		}
		printk(("\nPC: %08X  PSR: %08X\n", pc, getCurPSR()));
		procCommand(NULL);
	}
}
Exemplo n.º 2
0
/*
 * service call
 */
EXPORT W procSVC( W fno, W p1, W p2, W p3, W p4 )
{
	W	er = E_OK;
	W	n;

	switch ( fno ) {
	  case TM_MONITOR:	/* void tm_monitor( void ) */
		procCommand(NULL, 0);
		break;

	  case TM_GETCHAR:	/* INT	tm_getchar( INT wait ) */
		er = getChar(p1);
		break;

	  case TM_PUTCHAR:	/* INT	tm_putchar( INT c ) */
		er = putChar(p1);
		break;

	  case TM_GETLINE:	/* INT	tm_getline( UB *buff ) */
		er = getString(wrkBuf);
		if ( er < 0 ) break;
		n = er + 1;
		if ( writeMem(p1, wrkBuf, n, 1) != n ) er = E_MACV;
		break;

	  case TM_PUTSTRING:	/* INT	tm_putstring( const UB *buff ) */
		n = readMemStr(p1, wrkBuf, WRKBUF_SZ);
		if ( n < 0 ) { er = E_MACV; break; }
		er = putString(wrkBuf);
		break;

	  case TM_COMMAND:	/* INT	tm_command( const UB *buff ) */
		n = readMemStr(p1, lineBuf, L_LINE);
		if ( n < 0 ) { er = E_MACV; break; }
		procCommand(( n == 0 )? NULL: lineBuf, 1);
		break;

	  case TM_READDISK:
	  case TM_WRITEDISK:
	  case TM_INFODISK:
		/* INT tm_readdisk( const UB *dev, INT sec, INT nsec, void *addr )
		 * INT tm_writedisk( const UB *dev, INT sec, INT nsec, void *addr )
		 * INT tm_infodisk( const UB *dev, INT *blksz, INT *nblks )
		 */
		n = readMemStr(p1, lineBuf, L_LINE);
		if ( n < 0 ) { er = E_MACV; break; }

		if ( fno == TM_INFODISK ) {
			er = infoDisk(lineBuf, (UW*)p2, (UW*)p3);
		} else {
			n = ( fno == TM_READDISK )? 0: 1;
			er = rwDisk(lineBuf, p2, p3, (void*)p4, n);
		}
		break;

	  case TM_EXIT:		/* void tm_exit( INT mode ) */
		sysExit(p1); /* do not return */
		break;

	  case TM_EXTSVC:
		/* INT	tm_extsvc( INT fno, INT par1, INT par2, INT par3 ) */
		er = procExtSVC(p1, p2, p3, p4);
		break;

	  default:
		er = E_PAR;
	}

	return er;
}
Exemplo n.º 3
0
/*
 * Initial Processing after Reset
 */
EXPORT	void	procReset( void )
{
	FP	fp;
	UW	va;

	/* Disable all interupts */

	/* Turn ON all LEDs */
	cpuLED(0x0F);

	/* initialize console serial port */
	initSIO(CONS_PORT, HI_BAUD_RATE);

	/* setting up the initial count for micro-wait */
	setupWaitUsec();

	/* initialize console serial port */
	initSIO(CONS_PORT, HI_BAUD_RATE);

	/* Clear system common area (vector table, and SysInfo) */
	memset(SCArea, 0, sizeof(SysCommonArea));

	/* Initialize system common information (SysInfo) */
	SCInfo.ramtop = (void *)RAM_TOP;
	va = (UW)ROMInfo->userarea;
	if ( va < RAM_TOP || va > RAM_END ) va = RAM_END;
	SCInfo.ramend = (void *)va;
	SCInfo.istkpos = (void *)EIT_STACK;

	/* Set up EIT vectors */
	SCArea->intvec[EIT_DEFAULT]	= _defaultHdr;	// default handler
	SCArea->intvec[EIT_EXC(0)]	= _intHdr;	// Interrupt handler
	SCArea->intvec[EIT_EXC(8)]	= _svcHdr;	// SYSCALL handler
	SCArea->intvec[EIT_IP(2)]	= _ip2Hdr;	// Interrupt (IP 2)
	SCArea->intvec[EIT_IP(3)]	= _ip3Hdr;	// Interrupt (IP 3)
	SCArea->intvec[EIT_IP(4)]	= _ip4Hdr;	// Interrupt (IP 4)
	SCArea->intvec[EIT_IP(5)]	= _ip5Hdr;	// Interrupt (IP 5)
	SCArea->intvec[EIT_IP(6)]	= _ip6Hdr;	// Interrupt (IP 6)
	SCArea->intvec[CALL_MONITOR]	= _defaultHdr;	// M SVC(SYSCALL 37)
	SCArea->intvec[CALL_MONBREAK]	= _defaultHdr;	// M SVC(SYSCALL 42)

	/* Invoke user reset initialization */
	fp = ROMInfo->resetinit;
	if ( fp != NULL ) (*fp)();

	/* Turn ON Green LED */
	cpuLED(0x01);

	/* Kernel entry address */
	fp = ROMInfo->kernel;

	/* Command */
	if ( (dipSW() & 0x10) != 0 || fp == NULL ) {
		printk(("\n** T-Monitor for APP-M150 **\n"));
		procCommand(&fp);
	}

	/* Invoke the Kernel */
	if ( fp != NULL ) (*fp)();

	sysExit(0);
}