blob: 1f2a4f218359ad0506450dfbc0ec928ecdac873b [file] [log] [blame]
/*
* File: mcf5xxx.c
* Purpose: Generic high-level routines for generic ColdFire processors
*
* Notes:
*
* License: All software covered by license agreement in -
* docs/Freescale_Software_License.pdf
*/
#include "common.h"
/********************************************************************/
#define EXCEPTFMT "%s -- PC = %#08X\n"
/********************************************************************/
/*
* This is the exception handler for all defined exceptions. Most
* exceptions do nothing, but some of the more important ones are
* handled to some extent.
*
* Called by asm_exception_handler
*/
void
mcf5xxx_exception_handler (void *framep)
{
switch (MCF5XXX_RD_SF_FORMAT(framep))
{
case 4:
case 5:
case 6:
case 7:
break;
default:
printf(EXCEPTFMT,"Illegal stack type", MCF5XXX_SF_PC(framep));
break;
}
switch (MCF5XXX_RD_SF_VECTOR(framep))
{
case 2:
printf(EXCEPTFMT, "Access Error", MCF5XXX_SF_PC(framep));
switch (MCF5XXX_RD_SF_FS(framep))
{
case 4:
printf("Error on instruction fetch\n");
break;
case 8:
printf("Error on operand write\n");
break;
case 9:
printf("Attempted write to write-protected space\n");
break;
case 12:
printf("Error on operand read\n");
break;
default:
printf("Reserved Fault Status Encoding\n");
break;
}
break;
case 3:
printf(EXCEPTFMT, "Address Error", MCF5XXX_SF_PC(framep));
switch (MCF5XXX_RD_SF_FS(framep))
{
case 4:
printf("Error on instruction fetch\n");
break;
case 8:
printf("Error on operand write\n");
break;
case 9:
printf("Attempted write to write-protected space\n");
break;
case 12:
printf("Error on operand read\n");
break;
default:
printf("Reserved Fault Status Encoding\n");
break;
}
break;
case 4:
printf(EXCEPTFMT, "Illegal instruction", MCF5XXX_SF_PC(framep));
break;
case 8:
printf(EXCEPTFMT, "Privilege violation", MCF5XXX_SF_PC(framep));
break;
case 9:
printf(EXCEPTFMT, "Trace Exception", MCF5XXX_SF_PC(framep));
break;
case 10:
printf(EXCEPTFMT, "Unimplemented A-Line Instruction", \
MCF5XXX_SF_PC(framep));
break;
case 11:
printf(EXCEPTFMT, "Unimplemented F-Line Instruction", \
MCF5XXX_SF_PC(framep));
break;
case 12:
printf(EXCEPTFMT, "Debug Interrupt", MCF5XXX_SF_PC(framep));
break;
case 14:
printf(EXCEPTFMT, "Format Error", MCF5XXX_SF_PC(framep));
break;
case 15:
printf(EXCEPTFMT, "Unitialized Interrupt", MCF5XXX_SF_PC(framep));
break;
case 24:
printf(EXCEPTFMT, "Spurious Interrupt", MCF5XXX_SF_PC(framep));
break;
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
printf("Autovector interrupt level %d\n",
MCF5XXX_RD_SF_VECTOR(framep) - 24);
break;
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
printf("TRAP #%d\n", MCF5XXX_RD_SF_VECTOR(framep) - 32);
break;
case 5:
case 6:
case 7:
case 13:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63:
printf("Reserved: #%d\n", MCF5XXX_RD_SF_VECTOR(framep));
break;
default:
cpu_handle_interrupt(MCF5XXX_RD_SF_VECTOR(framep));
break;
}
}
/********************************************************************/
/*
* Interpret the reset values of D0 and D1
*
* Parameters:
* d0 - the reset value of data register zero
* d1 - the reset value of data register one
*/
void
mcf5xxx_interpret_d0d1(int d0, int d1)
{
#ifdef DEBUG_PRINT
printf("\nColdFire Core Configuration:\n");
printf("----------------------------\n");
printf("Processor Family %#02x\n",MCF5XXX_D0_PF(d0));
printf("ColdFire Core Version: %d\n",MCF5XXX_D0_VER(d0));
printf("Processor Revision: %d\n",MCF5XXX_D0_REV(d1));
printf("Bus Width: ");
switch (MCF5XXX_D1_BUSW(d1))
{
case 0:
printf("32-bit\n");
break;
default:
printf("Reserved\n");
}
printf("ISA Version: ");
switch (MCF5XXX_D0_ISA(d0))
{
case 0:
printf("A\n");
break;
case 1:
printf("B\n");
break;
case 2:
printf("C\n");
break;
case 8:
printf("A+\n");
break;
default:
printf("Reserved\n");
}
printf("Debug Version: ");
switch (MCF5XXX_D0_DEBUG(d0))
{
case 0:
printf("A\n");
break;
case 1:
printf("B\n");
break;
case 2:
printf("C\n");
break;
case 3:
printf("D\n");
break;
case 4:
printf("E\n");
break;
case 9:
printf("B+\n");
break;
default :
printf("Reserved\n");
}
printf("MAC: %s\n", MCF5XXX_D0_MAC(d0) ? "Yes" : "No");
printf("DIV: %s\n", MCF5XXX_D0_DIV(d0) ? "Yes" : "No");
printf("EMAC: %s\n", MCF5XXX_D0_EMAC(d0) ? "Yes" : "No");
printf("FPU: %s\n", MCF5XXX_D0_FPU(d0) ? "Yes" : "No");
printf("MMU: %s\n", MCF5XXX_D0_MMU(d0) ? "Yes" : "No");
printf("RAM Bank 0 Size: ");
switch (MCF5XXX_D1_RAM0SIZ(d1))
{
case 0:
case 1:
case 2:
case 3:
printf("None\n");
break;
case 4:
printf("4KB\n");
break;
case 5:
printf("8KB\n");
break;
case 6:
printf("16KB\n");
break;
case 7:
printf("32KB\n");
break;
case 8:
printf("64KB\n");
break;
case 9:
printf("128KB\n");
break;
case 10:
printf("256KB\n");
break;
case 11:
printf("512KB\n");
break;
default:
printf("Reserved\n");
}
printf("RAM Bank 1 Size: ");
switch (MCF5XXX_D1_RAM1SIZ(d1))
{
case 0:
case 1:
case 2:
case 3:
printf("None\n");
break;
case 4:
printf("4KB\n");
break;
case 5:
printf("8KB\n");
break;
case 6:
printf("16KB\n");
break;
case 7:
printf("32KB\n");
break;
case 8:
printf("64KB\n");
break;
case 9:
printf("128KB\n");
break;
case 10:
printf("256KB\n");
break;
case 11:
printf("512KB\n");
break;
default:
printf("Reserved\n");
}
printf("ROM Bank 0 Size: ");
switch (MCF5XXX_D1_ROM0SIZ(d1))
{
case 0:
case 1:
case 2:
case 3:
printf("None\n");
break;
case 4:
printf("4KB\n");
break;
case 5:
printf("8KB\n");
break;
case 6:
printf("16KB\n");
break;
case 7:
printf("32KB\n");
break;
case 8:
printf("64KB\n");
break;
case 9:
printf("128KB\n");
default:
printf("Reserved\n");
}
printf("ROM Bank 1 Size: ");
switch (MCF5XXX_D1_ROM1SIZ(d1))
{
case 0:
case 1:
case 2:
case 3:
printf("None\n");
break;
case 4:
printf("4KB\n");
break;
case 5:
printf("8KB\n");
break;
case 6:
printf("16KB\n");
break;
case 7:
printf("32KB\n");
break;
case 8:
printf("64KB\n");
break;
case 9:
printf("128KB\n");
default:
printf("Reserved\n");
}
printf("Cache Line Size: ");
switch (MCF5XXX_D1_CL(d1))
{
case 0:
printf("16-byte\n");
break;
default:
printf("Reserved\n");
}
printf("I-Cache Associativity: ");
switch (MCF5XXX_D1_ICA(d1))
{
case 0:
printf("Four-way\n");
break;
case 1:
printf("Direct mapped\n");
break;
default:
printf("Reserved\n");
}
printf("D-Cache Associativity: ");
switch (MCF5XXX_D1_DCA(d1))
{
case 0:
printf("Four-way\n");
break;
case 1:
printf("Direct mapped\n");
break;
default:
printf("Reserved\n");
}
printf("I-Cache Size: ");
switch (MCF5XXX_D1_ICSIZ(d1))
{
case 0:
printf("None\n");
break;
case 1:
printf("512B\n");
break;
case 2:
printf("1KB\n");
break;
case 3:
printf("2KB\n");
break;
case 4:
printf("4KB\n");
break;
case 5:
printf("8KB\n");
break;
case 6:
printf("16KB\n");
break;
case 7:
printf("32KB\n");
break;
case 8:
printf("64KB\n");
break;
default:
printf("Reserved\n");
}
printf("D-Cache Size: ");
switch (MCF5XXX_D1_DCSIZ(d1))
{
case 0:
printf("None\n");
break;
case 1:
printf("512B\n");
break;
case 2:
printf("1KB\n");
break;
case 3:
printf("2KB\n");
break;
case 4:
printf("4KB\n");
break;
case 5:
printf("8KB\n");
break;
case 6:
printf("16KB\n");
break;
case 7:
printf("32KB\n");
break;
case 8:
printf("64KB\n");
break;
default:
printf("Reserved\n");
}
printf("\n");
#else
/* Remove compiler warnings. */
( void ) d0;
( void ) d1;
#endif
}
/********************************************************************/
void
mcf5xxx_irq_enable (void)
{
asm_set_ipl(0);
}
/********************************************************************/
void
mcf5xxx_irq_disable (void)
{
asm_set_ipl(7);
}
/********************************************************************/
/*
* Write new interrupt vector handler into the vector table
* Return previous handler address
*/
ADDRESS
mcf5xxx_set_handler (int vector, ADDRESS new_handler)
{
ADDRESS old_handler;
extern uint32 __VECTOR_RAM[];
old_handler = (ADDRESS) __VECTOR_RAM[vector];
__VECTOR_RAM[vector] = (uint32)new_handler;
return old_handler;
}
/********************************************************************/