start.s
来自「RTEMS (Real-Time Executive for Multiproc」· S 代码 · 共 211 行
S
211 行
/*-------------------------------------------------------------------------+| start.s v1.1 - PC386 BSP - 1997/08/07+--------------------------------------------------------------------------+| This file contains the entry point for the application.| The name of this entry point is compiler dependent.| It jumps to the BSP which is responsible for performing all initialization.+--------------------------------------------------------------------------+| (C) Copyright 1997 -| - NavIST Group - Real-Time Distributed Systems and Industrial Automation|| http://pandora.ist.utl.pt|| Instituto Superior Tecnico * Lisboa * PORTUGAL+--------------------------------------------------------------------------+| Modified the 20/05/1998 by valette@crf.canon.fr in order to give a working| example of eraly stage debugging via the DEBUG_EARLY_START define.+--------------------------------------------------------------------------+| Disclaimer:|| This file is provided "AS IS" without warranty of any kind, either| expressed or implied.+--------------------------------------------------------------------------+| This code is based on an earlier generation RTEMS i386 start.s and the| following copyright applies:|| **************************************************************************| * COPYRIGHT (c) 1989-1999.| * On-Line Applications Research Corporation (OAR). | *| * The license and distribution terms for this file may be| * found in the file LICENSE in this distribution or at| * http://www.rtems.com/license/LICENSE.| **************************************************************************|| $Id: start.S,v 1.3.6.1 2003/09/04 18:44:04 joel Exp $+--------------------------------------------------------------------------*//* * The most trivial start.s possible. It does not know anything * about system it is running on, so it will jump to appropriate * place in BSP specific place to do things it knows nothing about */#include "asm.h"/*----------------------------------------------------------------------------+| Size of heap and stack: +----------------------------------------------------------------------------*/.set STACK_SIZE, 0x1000/*----------------------------------------------------------------------------+| CODE section+----------------------------------------------------------------------------*/BEGIN_CODE PUBLIC (start) # GNU default entry point EXTERN (boot_card) EXTERN (_load_segments) EXTERN (_return_to_monitor) EXTERN (_IBMPC_initVideo) EXTERN (debugPollingGetChar) EXTERN (checkCPUtypeSetCr0) /* * In case this crashes on your machine and this is not due * to video mode set by the loader, you may try to define * the following variable: *//* #define DEBUG_EARLY_START */SYM (start): /* * When things are really, REALLY!, bad -- turn on the speaker and * lock up. This shows whether or not we make it to a certain * location. */#if 0 inb $0x61, al orb $0x03, al outb al, $0x61 # enable the speakerspeakl: jmp speakl # and SPIN!!!#endif nop cli # DISABLE INTERRUPTS!!! cld#ifdef DEBUG_EARLY_START /* * Must get video attribute to have a working printk. * Note that the following code assume we already have * valid segments and a stack. It should be true for * any loader starting RTEMS in protected mode (or * at least I hope so : -)). */ call _IBMPC_initVideo /* * try printk and a getchar in polling mode ASAP */ pushl $welcome_msg call printk addl $4, esp /* call debugPollingGetChar */ #endif /*----------------------------------------------------------------------------+| Load the segment registers (this is done by the board's BSP) and perform any| other board specific initialization procedures, this piece of code| does not know anything about || NOTE: Upon return, gs will contain the segment descriptor for a segment which| maps directly to all of physical memory.+----------------------------------------------------------------------------*/ jmp SYM (_load_segments) # load board dependent segments/*----------------------------------------------------------------------------+| Set up the stack+----------------------------------------------------------------------------*/ PUBLIC (_establish_stack)SYM (_establish_stack): movl $_end, eax # eax = end of bss/start of heap addl $STACK_SIZE, eax # make room for stack andl $0xffffffc0, eax # align it on 16 byte boundary movl eax, esp # set stack pointer movl eax, ebp # set base pointer/*----------------------------------------------------------------------------+| Zero out the BSS segment+----------------------------------------------------------------------------*/SYM (zero_bss): cld # make direction flag count up movl $ SYM (_end), ecx # find end of .bss movl $ SYM (_bss_start), edi # edi = beginning of .bss subl edi, ecx # ecx = size of .bss in bytes shrl ecx # size of .bss in longs shrl ecx xorl eax, eax # value to clear out memory repne # while ecx != 0 stosl # clear a long in the bss/*-------------------------------------------------------------------+| Initialize the video because zero_bss has cleared initVideo parameters| if it was called earlier| So from now we can use printk+-------------------------------------------------------------------*/ call _IBMPC_initVideo /*---------------------------------------------------------------------+| Check CPU type. Enable Cache and init coprocessor if needed.+---------------------------------------------------------------------*/ call checkCPUtypeSetCr0 /*---------------------------------------------------------------------+| Transfer control to User's Board Support Package+---------------------------------------------------------------------*/ pushl $0 # environp pushl $0 # argv pushl $0 # argc call SYM (boot_card) addl $12, esp/*---------------------------------------------------------------------+| Clean up - we do not know anything about it, so we will| jump to BSP specific code to do cleanup+---------------------------------------------------------------------*/ jmp SYM (_return_to_monitor)END_CODEBEGIN_DATA PUBLIC(_stack_size)SYM(_stack_size): .long STACK_SIZE#ifdef DEBUG_EARLY_START PUBLIC (welcome_msg)SYM (welcome_msg) : .string "Ready to debug RTEMS ?\nEnter <CR>\n" PUBLIC (hex_msg)SYM (hex_msg) : .string "0x%x\n" PUBLIC (made_it_msg)SYM (made_it_msg) : .string "made it to %d\n"#endifEND_DATAEND
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?