1.6.4. exception handlers

/*
 * exception handlers
 */
	.align  5
undefined_instruction:1
	get_bad_stack
	bad_save_user_regs
	bl 	do_undefined_instruction
	.align	5
    

software_interrupt:
	get_bad_stack
	bad_save_user_regs
	bl 	do_software_interrupt

	.align	5
prefetch_abort:
	get_bad_stack
	bad_save_user_regs
	bl 	do_prefetch_abort

	.align	5
data_abort:
	get_bad_stack
	bad_save_user_regs
	bl 	do_data_abort

	.align	5
not_used:
	get_bad_stack
	bad_save_user_regs
	bl 	do_not_used
2
        

1

如果发生未定义指令异常,CPU会掉转到start.S开头中对应的位置:

	ldr	pc, _undefined_instruction

即把地址为_undefined_instruction中的内容给pc,即跳转到此处执行对应的代码。

其做的事情依次是:

获得出错时候的堆栈

保存用户模式寄存器

跳转到对应的函数:do_undefined_instruction

而do_undefined_instruction函数是在:

u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\cpu\arm920t\interrupts.c

中:

void bad_mode (void)
{
	panic ("Resetting CPU ...\n");
	reset_cpu (0);
}

void do_undefined_instruction (struct pt_regs *pt_regs)
{
	printf ("undefined instruction\n");
	show_regs (pt_regs);
	bad_mode ();
}
                

可以看到,此处起始啥事没错,只是打印一下出错时候的寄存器的值,然后跳转到bad_mode中取reset CPU,直接重启系统了。

2

以上几个宏,和前面的do_undefined_instruction是类似的,就不多说了。