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 + -
显示快捷键?