📄 redboot_linux_exec.c
字号:
//==========================================================================
//
// redboot_linux_boot.c
//
// RedBoot command to boot Linux on ARM platforms
//
//==========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
// Copyright (C) 2003, 2004 Gary Thomas
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//####OTHERCOPYRIGHTBEGIN####
//
// The structure definitions below are taken from include/asm-arm/setup.h in
// the Linux kernel, Copyright (C) 1997-1999 Russell King. Their presence
// here is for the express purpose of communication with the Linux kernel
// being booted and is considered 'fair use' by the original author and
// are included with his permission.
//
//####OTHERCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): gthomas
// Contributors: gthomas, jskov,
// Russell King <rmk@arm.linux.org.uk>
// Date: 2001-02-20
// Purpose:
// Description:
//
// This code is part of RedBoot (tm).
//
//####DESCRIPTIONEND####
//
//==========================================================================
#include <pkgconf/hal.h>
#include <redboot.h>
#ifdef CYGPKG_IO_ETH_DRIVERS
#include <cyg/io/eth/eth_drv.h> // Logical driver interfaces
#endif
#include <cyg/hal/hal_intr.h>
#include <cyg/hal/hal_cache.h>
#include CYGHWR_MEMORY_LAYOUT_H
#include <cyg/hal/hal_io.h>
#ifndef CYGARC_PHYSICAL_ADDRESS
# error
# define CYGARC_PHYSICAL_ADDRESS(x) (x)
#endif
// FIXME: This should be a CDL variable, and CYGSEM_REDBOOT_ARM_LINUX_BOOT
// active_if CYGHWR_HAL_ARM_REDBOOT_MACHINE_TYPE>0
#ifdef HAL_PLATFORM_MACHINE_TYPE
#define CYGHWR_REDBOOT_ARM_MACHINE_TYPE HAL_PLATFORM_MACHINE_TYPE
// Exported CLI function(s)
static void do_exec(int argc, char *argv[]);
RedBoot_cmd("exec",
"Execute an image - with MMU off",
"[-w timeout] [-b <load addr> [-l <length>]]\n"
" [-r <ramdisk addr> [-s <ramdisk length>]]\n"
" [-c \"kernel command line\"] [-t <target> ] [<entry_point>]",
do_exec
);
// CYGARC_HAL_MMU_OFF inserts code to turn off MMU and jump to a physical
// address. Some ARM implementations may need special handling and define
// their own version.
#ifndef CYGARC_HAL_MMU_OFF
#define __CYGARC_GET_CTLREG \
" mrc p15,0,r0,c1,c0,0\n"
#define __CYGARC_CLR_MMU_BITS \
" bic r0,r0,#0xd\n" \
" bic r0,r0,#0x1000\n" \
#ifdef CYGHWR_HAL_ARM_BIGENDIAN
#define __CYGARC_CLR_MMU_BITS_X \
" bic r0,r0,#0x8d\n" \
" bic r0,r0,#0x1000\n"
#else
#define __CYGARC_CLR_MMU_BITS_X \
" bic r0,r0,#0xd\n" \
" bic r0,r0,#0x1000\n" \
" orr r0,r0,#0x80\n"
#endif
#define __CYGARC_SET_CTLREG(__paddr__) \
" mcr p15,0,r0,c1,c0,0\n" \
" mov pc," #__paddr__ "\n"
#define CYGARC_HAL_MMU_OFF(__paddr__) \
" mcr p15,0,r0,c7,c10,4\n" \
" mcr p15,0,r0,c7,c7,0\n" \
__CYGARC_GET_CTLREG \
__CYGARC_CLR_MMU_BITS \
__CYGARC_SET_CTLREG(__paddr__)
#define CYGARC_HAL_MMU_OFF_X(__paddr__) \
" mcr p15,0,r0,c7,c10,4\n" \
" mcr p15,0,r0,c7,c7,0\n" \
__CYGARC_GET_CTLREG \
__CYGARC_CLR_MMU_BITS_X \
__CYGARC_SET_CTLREG(__paddr__)
#endif // CYGARC_HAL_MMU_OFF
//
// Parameter info for Linux kernel
// ** C A U T I O N ** This setup must match "asm-arm/setup.h"
//
// Info is passed at a fixed location, using a sequence of tagged
// data entries.
//
typedef unsigned long u32;
typedef unsigned short u16;
typedef unsigned char u8;
//=========================================================================
// From Linux <asm-arm/setup.h>
#define ATAG_NONE 0x00000000
struct tag_header {
u32 size; // Size of tag (hdr+data) in *longwords*
u32 tag;
};
#define ATAG_CORE 0x54410001
struct tag_core {
u32 flags; /* bit 0 = read-only */
u32 pagesize;
u32 rootdev;
};
#define ATAG_MEM 0x54410002
struct tag_mem32 {
u32 size;
u32 start;
};
#define ATAG_VIDEOTEXT 0x54410003
struct tag_videotext {
u8 x;
u8 y;
u16 video_page;
u8 video_mode;
u8 video_cols;
u16 video_ega_bx;
u8 video_lines;
u8 video_isvga;
u16 video_points;
};
#define ATAG_RAMDISK 0x54410004
struct tag_ramdisk {
u32 flags; /* b0 = load, b1 = prompt */
u32 size;
u32 start;
};
/*
* this one accidentally used virtual addresses - as such,
* its deprecated.
*/
#define ATAG_INITRD 0x54410005
/* describes where the compressed ramdisk image lives (physical address) */
#define ATAG_INITRD2 0x54420005
struct tag_initrd {
u32 start;
u32 size;
};
#define ATAG_SERIAL 0x54410006
struct tag_serialnr {
u32 low;
u32 high;
};
#define ATAG_REVISION 0x54410007
struct tag_revision {
u32 rev;
};
#define ATAG_VIDEOLFB 0x54410008
struct tag_videolfb {
u16 lfb_width;
u16 lfb_height;
u16 lfb_depth;
u16 lfb_linelength;
u32 lfb_base;
u32 lfb_size;
u8 red_size;
u8 red_pos;
u8 green_size;
u8 green_pos;
u8 blue_size;
u8 blue_pos;
u8 rsvd_size;
u8 rsvd_pos;
};
#define ATAG_CMDLINE 0x54410009
struct tag_cmdline {
char cmdline[1];
};
#define ATAG_ACORN 0x41000101
struct tag_acorn {
u32 memc_control_reg;
u32 vram_pages;
u8 sounddefault;
u8 adfsdrives;
};
#define ATAG_MEMCLK 0x41000402
struct tag_memclk {
u32 fmemclk;
};
struct tag {
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -