exception.c
来自「ADS下的bios工程」· C语言 代码 · 共 159 行
C
159 行
#include <bios/stdio.h>
#include <bios/string.h>
#include <bios/s3c2410x.h>
typedef unsigned int ul32;
void Dabort_action(int cpsr, int *reg);
void Pabort_action(int cpsr, int *reg);
void Undef_action(int cpsr, int *reg);
void FIQ_action(int cpsr, int *reg);
void swi_action(ul32 VA1, ul32 VA2, ul32 entry, ul32 swi_num);
extern void InvalidateITLBMVA(u32 mva);
extern void InvalidateDTLBMVA(u32 mva);
void (*IrqAction[NR_IRQS])(void);
void
do_IRQ(int irq)
{
CLEAR_PEND_INT(irq);
(*IrqAction[irq])(); /* Call interrupt service routine */
}
static void DummyAction(void) {}
void
init_IrqAction(void)
{
int i;
/* initialize S3C4 device interrupt controller */
s3c24xxx_interrupt_controller_initialize();
/* setup interrupt service handler routine to default value */
for (i = 0; i < NR_IRQS ; i ++)
IrqAction[i] = DummyAction ;
}
void
set_IrqAction(int irq, void (*action)())
{
IrqAction[irq] = action ;
}
void
Dabort_action(int cpsr, int *reg)
{
int i;
printf(" < Data Abort Register Dump > \n");
for (i = 0; i < 13; i ++)
printf("\tR%2d = 0x%08x\n", i, reg[i]);
printf("\tR13 = 0x%08x\n", (int)reg);
printf("\tR14 = 0x%08x\n", reg[i]);
printf("\tSPSR = 0x%08x\n", cpsr);
while (1)
;
}
void
Pabort_action(int cpsr, int *reg)
{
int i;
printf(" < Prefetch Abort Register Dump > \n");
for (i = 0; i < 13; i ++)
printf("\tR%2d = 0x%08x\n", i, reg[i]);
printf("\tR13 = 0x%08x\n", (int)reg);
printf("\tR14 = 0x%08x\n", reg[i]);
printf("\tSPSR = 0x%08x\n", cpsr);
while (1)
;
}
void
Undef_action(int cpsr, int *reg)
{
int i;
printf(" < Undefined Instruction Register Dump > \n");
for (i = 0; i < 13; i ++)
printf("\tR%2d = 0x%08x\n", i, reg[i]);
printf("\tR13 = 0x%08x\n", (int)reg);
printf("\tR14 = 0x%08x\n", reg[i]);
printf("\tSPSR = 0x%08x\n", cpsr);
while (1)
;
}
void
FIQ_action(int cpsr, int *reg)
{
int i;
printf(" < Fast Interrupt Register Dump > \n");
for (i = 0; i < 13; i ++)
printf("\tR%2d = 0x%08x\n", i, reg[i]);
printf("\tR13 = 0x%08x\n", (int)reg);
printf("\tR14 = 0x%08x\n", reg[i]);
printf("\tSPSR = 0x%08x\n", cpsr);
while (1)
;
}
void
swi_action(ul32 VA1, ul32 VA2, ul32 entry, ul32 swi_num)
{
ul32 *MMU_Table;
printf("swi number(%x) : ", swi_num);
switch (swi_num) {
case 0x000000:
printf("physical address exchainge(0xD00000000 --> 0x00000000)\n");
MMU_Table = (int *)VA1;
*MMU_Table = entry;
InvalidateITLBMVA((u32)MMU_Table);
InvalidateDTLBMVA((u32)MMU_Table);
break;
case 0x00000f:
printf("%s()[%d]:VA1(%x), VA2(%x), entry(%x)\n", __FUNCTION__,
__LINE__, VA1, VA2, entry);
break;
case 0x0000f0:
printf("%s()[%d]:VA1(%x), VA2(%x), entry(%x)\n", __FUNCTION__,
__LINE__, VA1, VA2, entry);
break;
case 0x000f00:
printf("%s()[%d]:VA1(%x), VA2(%x), entry(%x)\n", __FUNCTION__,
__LINE__, VA1, VA2, entry);
break;
case 0x00f000:
printf("%s()[%d]:VA1(%x), VA2(%x), entry(%x)\n", __FUNCTION__,
__LINE__, VA1, VA2, entry);
break;
case 0x0f0000:
printf("%s()[%d]:VA1(%x), VA2(%x), entry(%x)\n", __FUNCTION__,
__LINE__, VA1, VA2, entry);
break;
case 0xf00000:
printf("%s()[%d]:VA1(%x), VA2(%x), entry(%x)\n", __FUNCTION__,
__LINE__, VA1, VA2, entry);
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?