#include <g-bios.h>
#include <arch/arm.h>
#include <core/kermit.h>
#include <autoconf.h>.global GTopHalfEntry
.global Hang
GTopHalfEntry:
ldr pc, vect_reset
ldr pc, vect_undef
ldr pc, vect_swi
ldr pc, vect_iabort
ldr pc, vect_dabort
.word (gbios_th_end - GTopHalfEntry)
ldr pc, vect_irq
ldr pc, vect_fiq
.word GB_MAGIC_TH
vect_reset:
.word handle_reset
vect_undef:
.word handle_undef
vect_swi:
.word handle_swi
vect_iabort:
.word handle_iabort
vect_dabort:
.word handle_dabort
vect_irq:
.word handle_irq
vect_fiq:
.word handle_fiq
handle_fiq:
handle_irq:
handle_dabort:
handle_iabort:
handle_swi:
handle_undef:
handle_reset:
msr cpsr, #(ARM_MODE_SVC | ARM_INT_MASK)
mov sp, #INIT_STACK_BASE
bl init
Hang:
b Hang
发布评论
评论(5)
我想问一个问题:
G-BIOS的上半部中的head.S 把 7 种异常向量的跳转地址都弄成一样的, 如程序所示,都去运行:
msr cpsr, #(ARM_MODE_SVC | ARM_INT_MASK)
mov sp, #INIT_STACK_BASE
bl init
TopHalf 中的7 种异常向量的跳转地址都是相同的,都运行以下代码:
msr cpsr, #(ARM_MODE_SVC | ARM_INT_MASK) //进入SVC模式,并关中断
mov sp, #INIT_STACK_BASE
bl init
#define ARM_IRQ_MASK (1 << 7)
#define ARM_INT_MASK (ARM_IRQ_MASK | ARM_FIQ_MASK)
下半部的启动代码是在arch/arm/head.S
b L1
.word GB_MAGIC_BH
.word (g_pGBiosEnd - GBotHalfEntry)
vIntTab:
.word HandleUndef
.word HandleSWI
.word HandleIabort
.word HandleDabort
.word HandleIRQ
.word HandleFiq
L1:
msr cpsr, #(ARM_MODE_IRQ | ARM_INT_MASK)
ldr sp, =IRQ_STACK_BASE
msr cpsr, #(ARM_MODE_FIQ | ARM_INT_MASK)
ldr sp, =FIQ_STACK_BASE
msr cpsr, #(ARM_MODE_SVC | ARM_INT_MASK)
mov sp, #SVC_STACK_BASE
ldr r0, =vIntTab
mov r1, #40
ldm r0, {r2, r3, r4, r5, r6, r7}
stm r1, {r2, r3, r4, r5, r6, r7}
mov fp, #0
bl main
0:
b 0b
上半部创建中断向量表 (ARM的7种异常中断)
vect_reset: //复位
.word handle_reset
vect_undef: //未定义的指令
.word handle_undef
vect_swi: //软件中断
.word handle_swi
vect_iabort: //指令预取中止
.word handle_iabort
vect_dabort: //数据访问中止
.word handle_dabort
vect_irq: // 外部中断请求
.word handle_irq
vect_fiq: // 快速中断请求
.word handle_fiq
init函数 是对硬件的初始化,包括对SOC,UART(串口),memery(内存),NAND的初始化
{
const char *pchBanner = CLRSCREEN
"\t+----------------------------------+\n\r"
"\t| Welcome to MaxWit g-bios! |\n\r"
"\t| (http://maxwit.googlecode.com) |\n\r"
"\t| [" BUILD_TIME "] |\n\r"
"\t+----------------------------------+\n\r";
GtInitSoC();
GtInitUart();
puts(pchBanner);
ReadID();
GtInitMemCtrl();
GtInitNand();
BootMenu();
return -1;
}