gbios 上半部(boot/arm/head.S)的实现

发布于 2022-09-18 18:13:55 字数 3509 浏览 14 评论 0

#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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

记忆消瘦 2022-09-25 18:13:56

我想问一个问题:

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


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

    bl init

伏妖词 2022-09-25 18:13:56

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)

流年里的时光 2022-09-25 18:13:56

下半部的启动代码是在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

魔法唧唧 2022-09-25 18:13:55


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

原谅我要高飞 2022-09-25 18:13:55
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;
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文