📄 mpc8xx_hi.c
字号:
if (cipr & MPC8XX_CPIC_CIPR_PC12)
{
printf("PC12 ");
}
if (cipr & MPC8XX_CPIC_CIPR_SDMA)
{
printf("SDMA ");
}
if (cipr & MPC8XX_CPIC_CIPR_IDMA1)
{
printf("IDMA1 ");
}
if (cipr & MPC8XX_CPIC_CIPR_IDMA2)
{
printf("IDMA2 ");
}
if (cipr & MPC8XX_CPIC_CIPR_TIMER2)
{
printf("TIMER2 ");
}
if (cipr & MPC8XX_CPIC_CIPR_RTT)
{
printf("RTT ");
}
if (cipr & MPC8XX_CPIC_CIPR_I2C)
{
printf("I2C ");
}
if (cipr & MPC8XX_CPIC_CIPR_PC11)
{
printf("PC11 ");
}
if (cipr & MPC8XX_CPIC_CIPR_PC10)
{
printf("PC10 ");
}
if (cipr & MPC8XX_CPIC_CIPR_TIMER3)
{
printf("TIMER3 ");
}
if (cipr & MPC8XX_CPIC_CIPR_PC9)
{
printf("PC9 ");
}
if (cipr & MPC8XX_CPIC_CIPR_PC8)
{
printf("PC8 ");
}
if (cipr & MPC8XX_CPIC_CIPR_PC7)
{
printf("PC7 ");
}
if (cipr & MPC8XX_CPIC_CIPR_TIMER4)
{
printf("TIMER4 ");
}
if (cipr & MPC8XX_CPIC_CIPR_PC6)
{
printf("PC6 ");
}
if (cipr & MPC8XX_CPIC_CIPR_SPI)
{
printf("SPI ");
}
if (cipr & MPC8XX_CPIC_CIPR_SMC1)
{
printf("SMC1 ");
}
if (cipr & MPC8XX_CPIC_CIPR_SMC2)
{
printf("SMC2 ");
}
if (cipr & MPC8XX_CPIC_CIPR_PIP)
{
printf("PIP ");
}
if (cipr & MPC8XX_CPIC_CIPR_PC5)
{
printf("PC5 ");
}
if (cipr & MPC8XX_CPIC_CIPR_PC4)
{
printf("PC4 ");
}
printf("\n");
/*
* Clear interrupts
*/
imm->cpic.CIPR = ~0;
}
/*********************************************************************/
static void
siu_handler (void)
{
MPC8XX_IMM *imm = mpc8xx_get_immp();
uint32 sipend;
sipend = imm->siu.SIPEND & imm->siu.SIMASK;
printf("SIU IRQ(s): ");
if (sipend & MPC8XX_SIU_SIPEND_IRQ0)
{
printf("IRQ0 ");
}
if (sipend & MPC8XX_SIU_SIPEND_LVL0)
{
printf("LVL0 ");
}
if (sipend & MPC8XX_SIU_SIPEND_IRQ1)
{
printf("IRQ1 ");
}
if (sipend & MPC8XX_SIU_SIPEND_LVL1)
{
printf("LVL1 ");
}
if (sipend & MPC8XX_SIU_SIPEND_IRQ2)
{
printf("IRQ2 ");
}
if (sipend & MPC8XX_SIU_SIPEND_LVL2)
{
printf("LVL2 ");
}
if (sipend & MPC8XX_SIU_SIPEND_IRQ3)
{
printf("IRQ3 ");
}
if (sipend & MPC8XX_SIU_SIPEND_LVL3)
{
printf("LVL3 ");
}
if (sipend & MPC8XX_SIU_SIPEND_IRQ4)
{
printf("IRQ4 ");
}
if (sipend & MPC8XX_SIU_SIPEND_LVL4)
{
printf("LVL4 ");
}
if (sipend & MPC8XX_SIU_SIPEND_IRQ5)
{
printf("IRQ5 ");
}
if (sipend & MPC8XX_SIU_SIPEND_LVL5)
{
printf("LVL5 ");
}
if (sipend & MPC8XX_SIU_SIPEND_IRQ6)
{
printf("IRQ6 ");
}
if (sipend & MPC8XX_SIU_SIPEND_LVL6)
{
printf("LVL6 ");
}
if (sipend & MPC8XX_SIU_SIPEND_IRQ7)
{
printf("IRQ7 ");
}
if (sipend & MPC8XX_SIU_SIPEND_LVL7)
{
printf("LVL7 ");
}
printf("\n");
cpic_handler();
}
/*********************************************************************/
int
cpu_handler (int exception)
{
/*
* 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.
*/
int user_brkpnt, user_triggered;
int cpu_handler_flag;
/*
* Most exceptions result in dumping out to the dBUG prompt.
*/
cpu_handler_flag = EXEC_DBUG;
/*
* The value passed in for 'exception' is actually the LR. So,
* pick-off the actual exception number now.
*/
exception = (exception & 0x0000FF00);
/*
* Handle breakpoints properly.
*/
user_brkpnt = breakpoint_deinstall((ADDRESS)context.srr0, &user_triggered);
switch (exception)
{
case 0x0000:
printf(EXCEPT, exception, "Reserved");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0100:
printf(EXCEPT, exception, "Reset");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0200:
printf(EXCEPT, exception, "Machine Check");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0300:
printf(EXCEPT, exception, "Data Storage");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0400:
printf(EXCEPT, exception, "Instruction Storage");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0500:
printf(EXCEPT, exception, "External Interrupt");
siu_handler();
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0600:
printf(EXCEPT, exception, "Alignment");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0700:
printf(EXCEPT, exception, "Program");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0800:
printf(EXCEPT, exception, "Floating-point Unavailable");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0900:
printf(EXCEPT, exception, "Decrementer");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0A00:
case 0x0B00:
printf(EXCEPT, exception, "Reserved");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0C00:
printf(EXCEPT, exception, "System Call");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0D00:
if ((int)trace_thru)
{
/* place breakpoint at trace_thru */
cpu_write_data(trace_thru,32,(int)ILLEGAL);
/* turn off tracing */
CPU_REG_MSR &= (~MPC8XX_MSR_SE);
/* nullify trace_thru and continue execution */
trace_thru = NULL;
cpu_handler_flag = EXEC_RFI;
break;
}
/* each time through, decrement cpu_trace_count */
if (--cpu_trace_count > 0)
{
/* turn tracing on */
CPU_REG_MSR |= MPC8XX_MSR_SE;
cpu_handler_flag = EXEC_RFI;
}
else
{
/* turn off trace bit in MSR */
CPU_REG_MSR &= (~MPC8XX_MSR_SE);
cpu_handler_flag = EXEC_DBUG;
cpu_trace_count = 0;
}
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0E00:
printf(EXCEPT, exception, "Floating-Point Assist");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0F00:
printf(EXCEPT, exception, "Reserved");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x1000:
if (!user_brkpnt)
{
printf(EXCEPT, exception, "Software Emulation");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
}
else
{
if ((ADDRESS)cpu_step_over == (ADDRESS)CPU_REG_SRR0)
{
/* clean up at end of handler */
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
}
if (user_triggered)
{
printf("Breakpoint encountered at %#08X\n",
CPU_REG_SRR0);
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
}
/* else reinstall breakpoints and continue */
/* execution of the task...we will return */
/* task from here, not write out regs and RFI */
else
{
if (breakpoint_install((ADDRESS)context.srr0))
{
/* about to execute at breakpoint */
/* trace thru rather than breaking */
trace_thru = CPU_REG_SRR0;
/* turn tracing on */
CPU_REG_MSR |= MPC8XX_MSR_SE;
cpu_handler_flag = EXEC_RFI;
}
}
}
break;
case 0x1100:
printf(EXCEPT, exception, "Instruction TLB Miss");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x1200:
printf(EXCEPT, exception, "Data TLB Miss");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x1300:
printf(EXCEPT, exception, "Instruction TLB Error");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x1400:
printf(EXCEPT, exception, "Data TLB Error");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x1500:
case 0x1600:
case 0x1700:
case 0x1800:
case 0x1900:
case 0x1A00:
case 0x1B00:
printf(EXCEPT, exception, "Reserved");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x1C00:
printf(EXCEPT, exception, "Data Breakpoint");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x1D00:
printf(EXCEPT, exception, "Instruction Breakpoint");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x1E00:
printf(EXCEPT, exception, "Peripheral Breakpoint");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x1F00:
printf(EXCEPT, exception, "Development Port");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
case 0x0FF00: /* cheat for exit to dbug prompt */
cpu_handler_flag = EXEC_DBUG;
printf("\n");
break;
default:
printf(EXCEPT, exception, "Unknown");
cpu_reg_display(NULL);
cpu_disasm(CPU_REG_SRR0, TRUE);
break;
}
if ((cpu_handler_flag == EXEC_DBUG) && cpu_step_over)
{
breakpoint_remove (cpu_step_over);
cpu_step_over = 0;
}
return cpu_handler_flag;
}
/*********************************************************************/
void
cpu_cache_flush (void)
{
/*
* This routine flushes the D-Cache using an MPC8XX specific
* implementation. This routine doesn't require knowing the
* exact size of memory, and instead flushes specific cache
* lines.
*/
int line;
/*
* Flash invalidate I-cache
*/
mpc8xx_wr_ic_cst(MPC8XX_IC_CST_CMD_DISABLE);
mpc8xx_wr_ic_cst(MPC8XX_IC_CST_CMD_UNLOCKALL);
mpc8xx_wr_ic_cst(MPC8XX_IC_CST_CMD_INVALIDATE);
/* mpc8xx_wr_ic_cst(MPC8XX_IC_CST_CMD_ENABLE);*/
mpc8xx_wr_dc_cst(MPC8XX_DC_CST_CMD_DISABLE);
mpc8xx_wr_dc_cst(MPC8XX_DC_CST_CMD_UNLOCKALL);
for (line = 0; line < (MPC8XX_DCACHE_SIZE/16); ++line)
{
mpc8xx_wr_dc_adr(line);
mpc8xx_wr_dc_cst(MPC8XX_DC_CST_CMD_FLUSHLINE);
}
mpc8xx_wr_dc_cst(MPC8XX_DC_CST_CMD_INVALIDATE);
}
/*********************************************************************/
#define REGREAD (1)
#define REGWRITE (0)
static const char FORMAT8[] = " %8s: %02X\n";
static const char FORMAT16[] = " %8s: %04X\n";
static const char FORMAT32[] = " %8s: %08X\n";
#define IRMD(MOD,REG,SIZE) \
if ((strcasecmp(#REG,reg) == 0) || display_all) \
{ \
if (regread) \
{ \
printf(FORMAT ## SIZE, #REG, \
imm-> MOD . REG ); \
pause(&displayed); \
} \
else \
imm-> MOD . REG = value; \
\
if (!display_all) \
return; \
}
static int display_all;
static int displayed;
/*********************************************************************/
#ifdef Mpc8xx_siu
static void
irmd_siu (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(siu, SIUMCR, 32)
IRMD(siu, SYPCR, 32)
#ifndef SWT
IRMD(siu, SWT, 32)
#endif
IRMD(siu, SWSR, 16)
IRMD(siu, SIPEND, 32)
IRMD(siu, SIMASK, 32)
IRMD(siu, SIEL, 32)
IRMD(siu, SIVEC, 32)
IRMD(siu, TESR, 32)
IRMD(siu, SDCR, 32)
if (!display_all)
printf(INVREG,reg);
}
#endif
/*********************************************************************/
#ifdef Mpc8xx_pcmcia
static void
irmd_pcmcia (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(pcmcia, PBR0, 32)
IRMD(pcmcia, POR0, 32)
IRMD(pcmcia, PBR1, 32)
IRMD(pcmcia, POR1, 32)
IRMD(pcmcia, PBR2, 32)
IRMD(pcmcia, POR2, 32)
IRMD(pcmcia, PBR3, 32)
IRMD(pcmcia, POR3, 32)
IRMD(pcmcia, PBR4, 32)
IRMD(pcmcia, POR4, 32)
IRMD(pcmcia, PBR5, 32)
IRMD(pcmcia, POR5, 32)
IRMD(pcmcia, PBR6, 32)
IRMD(pcmcia, POR6, 32)
IRMD(pcmcia, PBR7, 32)
IRMD(pcmcia, POR7, 32)
#ifndef PGCRA
IRMD(pcmcia, PGCRA, 32)
#endif
IRMD(pcmcia, PGCRB, 32)
IRMD(pcmcia, PSCR, 32)
IRMD(pcmcia, PIPR, 32)
IRMD(pcmcia, PER, 32)
if (!display_all)
printf(INVREG,reg);
}
#endif
/*********************************************************************/
#ifdef Mpc8xx_memc
static void
irmd_memc (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(memc, BR0, 32)
IRMD(memc, OR0, 32)
IRMD(memc, BR1, 32)
IRMD(memc, OR1, 32)
IRMD(memc, BR2, 32)
IRMD(memc, OR2, 32)
IRMD(memc, BR3, 32)
IRMD(memc, OR3, 32)
IRMD(memc, BR4, 32)
IRMD(memc, OR4, 32)
IRMD(memc, BR5, 32)
IRMD(memc, OR5, 32)
IRMD(memc, BR6, 32)
IRMD(memc, OR6, 32)
IRMD(memc, BR7, 32)
IRMD(memc, OR7, 32)
IRMD(memc, MAR, 32)
IRMD(memc, MCR, 32)
IRMD(memc, MAMR, 32)
IRMD(memc, MBMR, 32)
IRMD(memc, MSTAT, 16)
IRMD(memc, MPTPR, 16)
IRMD(memc, MDR, 32)
if (!display_all)
printf(INVREG,reg);
}
#endif
/*********************************************************************/
#ifdef Mpc8xx_sit
static void
irmd_sit (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(sit, TBSCR, 16)
IRMD(sit, TBREFF0, 32)
IRMD(sit, TBREFF1, 32)
IRMD(sit, RTCSC, 16)
IRMD(sit, RTC, 32)
IRMD(sit, RTSEC, 32)
IRMD(sit, RTCAL, 32)
IRMD(sit, PISCR, 16)
IRMD(sit, PITC, 32)
IRMD(sit, PITR, 32)
if (!display_all)
printf(INVREG,reg);
}
#endif
/*********************************************************************/
#ifdef Mpc8xx_clock
static void
irmd_clock (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(clock, SCCR, 32)
IRMD(clock, PLPRCR, 32)
IRMD(clock, RSR, 32)
if (!display_all)
printf(INVREG,reg);
}
#endif
/*********************************************************************/
#ifdef Mpc8xx_sitkey
static void
irmd_sitkey (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(sitkey, TBSCRK, 32)
IRMD(sitkey, TBREFF0K, 32)
IRMD(sitkey, TBREFF1K, 32)
IRMD(sitkey, TBK, 32)
IRMD(sitkey, RTCSCK, 32)
IRMD(sitkey, RTSECK, 32)
IRMD(sitkey, RTCALK, 32)
IRMD(sitkey, PISCRK, 32)
IRMD(sitkey, PITCK, 32)
if (!display_all)
printf(INVREG,reg);
}
#endif
/*********************************************************************/
#ifdef Mpc8xx_clockey
static void
irmd_clockey (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(clockey, SCCRK, 32)
IRMD(clockey, PLPRCRK, 32)
IRMD(clockey, RSRK, 32)
if (!display_all)
printf(INVREG,reg);
}
#endif
/*********************************************************************/
#ifdef Mpc8xx_i2c
static void
irmd_i2c (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(i2c, I2MOD, 8)
IRMD(i2c, I2ADD, 8)
IRMD(i2c, I2BRG, 8)
IRMD(i2c, I2COM, 8)
IRMD(i2c, I2CER, 8)
IRMD(i2c, I2CMR, 8)
if (!display_all)
printf(INVREG,reg);
}
#endif
/*********************************************************************/
#ifdef Mpc8xx_dma
static void
irmd_dma (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(dma, SDAR, 32)
IRMD(dma, SDSR, 8)
IRMD(dma, SDMR, 8)
IRMD(dma, IDSR1, 8)
IRMD(dma, IDMR1, 8)
IRMD(dma, IDSR2, 8)
IRMD(dma, IDMR2, 8)
if (!display_all)
printf(INVREG,reg);
}
#endif
/*********************************************************************/
#ifdef Mpc8xx_cpic
static void
irmd_cpic (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
IRMD(cpic, CIVR, 16)
IRMD(cpic, CICR, 32)
IRMD(cpic, CIPR, 32)
IRMD(cpic, CIMR, 32)
IRMD(cpic, CISR, 32)
if (!display_all)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -