📄 start.s
字号:
/* dlentry.s * * $Id: start.S,v 1.3 2000/08/02 16:30:57 joel Exp $ * * This file contains the entry veneer for RTEMS programs * downloaded to the eth-comm board. * * This file was written by Jay Monkman (jmonkman@fracsa.com) * It was based on the dlentry.s file for the Papyrus BSP, * written by: * * Author: Andrew Bray <andy@i-cubed.co.uk> * * COPYRIGHT (c) 1995 by i-cubed ltd. * * To anyone who acknowledges that this file is provided "AS IS" * without any express or implied warranty: * permission to use, copy, modify, and distribute this file * for any purpose is hereby granted without fee, provided that * the above copyright notice and this notice appears in all * copies, and that the name of i-cubed limited not be used in * advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * i-cubed limited makes no representations about the suitability * of this software for any purpose. * */#include "asm.h"/* * The initial stack is set to run BELOW the code base address. * (between the vectors and text sections) * * All the entry veneer has to do is to clear the BSS. *//* * GDB likes to have debugging information for the entry veneer. * Here is some DWARF information. *//* * There was some debugging info here, but I removed it because I * couldn't get it to work. It isn't really necessary as far as I * can tell. It should still be in the papyrus BSP. -Jay *//* * On entry to download_entry, R3 will hold a pointer to a Board Info * Block (boardinfo_t). This should be copied as soon as possible * to the global M860_binfo. (The block should be copied, _NOT_ * the pointer) */ .section ".entry" /* This might have to be the first thing in the * text section. At one time, it had to be * first, but I don't believe it is true * andy more. */ PUBLIC_VAR (start)SYM(start): bl .startupbase_addr: /* * Parameters from linker */toc_pointer: .long s.gotbss_length: .long bss.sizebss_addr: .long bss.startPUBLIC_VAR (text_addr)text_addr: .long text.startPUBLIC_VAR (text_length)text_length: .long text.size/* * Initialization code */.startup: /* Get start address */ mflr r1 /* clear the bss section */ bl bssclr/* * Copy the Board Info Block */ .extern SYM(M860_binfo) lis r6, SYM(M860_binfo)@ha addi r6, r6, SYM(M860_binfo)@l lhz r4, 0(r3) /* Load the size of the block */ rlwinm. r4, r4, 30, 0x3fffffff /* get number of words */ mtctr r4cpy_b: lwz r5, 0(r3) /* In with the old ... */ stw r5, 0(r6) /* ... Out with the new */ addi r6, r6, 0x4 /* Go to the next word */ addi r3, r3, 0x4 bdnz cpy_b /* decrement counter and loop *//* * C_setup. */ /* set toc */ lwz r2, toc_pointer-base_addr(r1) /* Set up stack pointer = beginning of text section - 56 */ addi r1, r1, -56-4 lis r9, 0xff00 addi r10, 0, -16384 sth r10, 0x950(r9) lis r9, 0x0000 addi r9, r9, 0x0007 mtspr 0x9e, r9 lis r5,environ@ha la r5,environ@l(r5) /* environp */ li r4, 0 /* argv */ li r3, 0 /* argc */ .extern SYM (boot_card) bl SYM (boot_card) /* call the first C routine */loopstop: b loopstop/* * bssclr - zero out bss */bssclr: lwz r4, bss_addr-base_addr(r1) /* Start of bss */ lwz r5, bss_length-base_addr(r1) /* Length of bss */ rlwinm. r5,r5,30,0x3FFFFFFF /* form length/4 */ beqlr /* no bss */ mtctr r5 /* set ctr reg */ xor r6,r6,r6 /* r6 = 0 */clear_bss: stswi r6,r4,0x4 /* store r6 */ addi r4,r4,0x4 /* update r2 */ bdnz clear_bss /* dec counter and loop */ blr /* return */ .comm environ,4,4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -