免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2840 | 回复: 5

gbios 上半部(boot/arm/head.S)的实现 [复制链接]

论坛徽章:
0
发表于 2009-04-20 18:38 |显示全部楼层
#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

论坛徽章:
0
发表于 2009-04-20 18:58 |显示全部楼层

  上半部创建中断向量表 (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的初始化

论坛徽章:
0
发表于 2009-04-20 19:00 |显示全部楼层
int init(void)
{
    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;
}

论坛徽章:
0
发表于 2009-04-29 21:02 |显示全部楼层
我想问一个问题:

G-BIOS的上半部中的head.S 把 7 种异常向量的跳转地址都弄成一样的, 如程序所示,都去运行:

&nbsp;&nbsp;&nbsp;&nbsp;msr cpsr, #(ARM_MODE_SVC | ARM_INT_MASK)
&nbsp;&nbsp;&nbsp;&nbsp;mov sp, #INIT_STACK_BASE

&nbsp;&nbsp;&nbsp;&nbsp;bl init


那中断不就没作用了?  

请问 G-BIOS对中断怎么处理的? 我看到 bottom-half 的入口也是一个汇编文件, 其中定义了 跳转表 和 真正的异常处理代码,  但这时跳转表已经不是位于 0x00 位置了, 还会起作用吗?  这个问题怎么解释? 谢谢!



原帖由 fleyahjj 于 2009-4-20 18:58 发表

  上半部创建中断向量表 (ARM的7种异常中断)

vect_reset:             //复位
    .word handle_reset
vect_undef:            //未定义的指令
    .word handle_undef
vect_swi:              //软 ...

论坛徽章:
0
发表于 2009-05-07 14:06 |显示全部楼层
TopHalf 中的7 种异常向量的跳转地址都是相同的,都运行以下代码:

      msr cpsr, #(ARM_MODE_SVC | ARM_INT_MASK) //进入SVC模式,并关中断
    mov sp, #INIT_STACK_BASE

    bl init


#define ARM_FIQ_MASK (1 << 6)
#define ARM_IRQ_MASK (1 << 7)
#define ARM_INT_MASK (ARM_IRQ_MASK | ARM_FIQ_MASK)


上半部只初始化了soc, uart,memery,nand(其中nand 只支持读的功能),中断并未启用

上半部会通过从uart或nand上,将下半部load到sdram
其中
     int GtNandLoad(void) ;           //从nand上load下半部到sdram
     int GtSerialLoad(void *pLoadAddr) //通过串口从host端load 下半部到sdram

void StartGbios(void) // 启动下半部


void StartGbios(void)
{
    BottomEntry pfnBottomEntry;


    pfnBottomEntry = (BottomEntry)GBIOS_BH_START;

    if (GB_MAGIC_BH != *(UINT32 *)(GBIOS_BH_START + 4))
    {
        puts("Wrong Bottom-half!\n");
    }
    else
    {
        puts("Booting Bottom-half ...\n");
    }


    pfnBottomEntry();
}




论坛徽章:
0
发表于 2009-05-07 14:18 |显示全部楼层
下半部的启动代码是在arch/arm/head.S


GBotHalfEntry:
    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



ldr   r0,   =vIntTab   // 真正的中断向量表
mov   r1,   #40
ldm   r0,   {r2, r3, r4, r5, r6, r7}
stm   r1,   {r2, r3, r4, r5, r6, r7
}   
上面的指令是将上半部的中断向量表的跳转地址重置 如下即是新的跳转表
vIntTab:
.word HandleUndef
.word HandleSWI
.word HandleIabort
.word HandleDabort
.word HandleIRQ
.word HandleFiq
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP