annotate packages/hal/arm/arch/current/src/redboot_linux_exec.c @ 1742:aaa68fc7d7f9

Add -x option to ARM RedBoot exec command
author msalter
date Thu, 02 Sep 2004 16:30:51 +0000
parents 30d12b1c7bb0
children 72c130f0a30d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
2 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
3 // redboot_linux_boot.c
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
4 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
5 // RedBoot command to boot Linux on ARM platforms
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
6 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
1742
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
1661
431860e2ee69 Improve Linux 'exec' to be sensitive to load failures
gthomas
parents: 821
diff changeset
12 // Copyright (C) 2003, 2004 Gary Thomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
41 //####OTHERCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
42 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
43 // The structure definitions below are taken from include/asm-arm/setup.h in
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
44 // the Linux kernel, Copyright (C) 1997-1999 Russell King. Their presence
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
45 // here is for the express purpose of communication with the Linux kernel
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
46 // being booted and is considered 'fair use' by the original author and
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
47 // are included with his permission.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
48 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
49 //####OTHERCOPYRIGHTEND####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
50 //==========================================================================
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
51 //#####DESCRIPTIONBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
52 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
53 // Author(s): gthomas
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
54 // Contributors: gthomas, jskov,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
55 // Russell King <rmk@arm.linux.org.uk>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
56 // Date: 2001-02-20
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
57 // Purpose:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
58 // Description:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
59 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
60 // This code is part of RedBoot (tm).
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
61 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
62 //####DESCRIPTIONEND####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
63 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
64 //==========================================================================
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
65
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
66 #include <pkgconf/hal.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
67 #include <redboot.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
68
821
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
69 #ifdef CYGPKG_IO_ETH_DRIVERS
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
70 #include <cyg/io/eth/eth_drv.h> // Logical driver interfaces
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
71 #endif
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
72
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
73 #include <cyg/hal/hal_intr.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
74 #include <cyg/hal/hal_cache.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
75 #include CYGHWR_MEMORY_LAYOUT_H
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
76
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
77 #include <cyg/hal/hal_io.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
78
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
79 #ifndef CYGARC_PHYSICAL_ADDRESS
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
80 # error
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
81 # define CYGARC_PHYSICAL_ADDRESS(x) (x)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
82 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
83
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
84 // FIXME: This should be a CDL variable, and CYGSEM_REDBOOT_ARM_LINUX_BOOT
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
85 // active_if CYGHWR_HAL_ARM_REDBOOT_MACHINE_TYPE>0
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
86 #ifdef HAL_PLATFORM_MACHINE_TYPE
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
87 #define CYGHWR_REDBOOT_ARM_MACHINE_TYPE HAL_PLATFORM_MACHINE_TYPE
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
88
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
89 // Exported CLI function(s)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
90 static void do_exec(int argc, char *argv[]);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
91 RedBoot_cmd("exec",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
92 "Execute an image - with MMU off",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
93 "[-w timeout] [-b <load addr> [-l <length>]]\n"
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
94 " [-r <ramdisk addr> [-s <ramdisk length>]]\n"
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
95 " [-c \"kernel command line\"] [<entry_point>]",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
96 do_exec
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
97 );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
98
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
99 // CYGARC_HAL_MMU_OFF inserts code to turn off MMU and jump to a physical
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
100 // address. Some ARM implementations may need special handling and define
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
101 // their own version.
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
102 #ifndef CYGARC_HAL_MMU_OFF
1742
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
103
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
104 #define __CYGARC_GET_CTLREG \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
105 " mrc p15,0,r0,c1,c0,0\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
106
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
107 #define __CYGARC_CLR_MMU_BITS \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
108 " bic r0,r0,#0xd\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
109 " bic r0,r0,#0x1000\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
110
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
111 #ifdef CYGHWR_HAL_ARM_BIGENDIAN
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
112 #define __CYGARC_CLR_MMU_BITS_X \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
113 " bic r0,r0,#0x8d\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
114 " bic r0,r0,#0x1000\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
115 #else
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
116 #define __CYGARC_CLR_MMU_BITS_X \
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
117 " bic r0,r0,#0xd\n" \
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
118 " bic r0,r0,#0x1000\n" \
1742
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
119 " orr r0,r0,#0x80\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
120 #endif
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
121
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
122 #define __CYGARC_SET_CTLREG(__paddr__) \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
123 " mcr p15,0,r0,c1,c0,0\n" \
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
124 " mov pc," #__paddr__ "\n"
1742
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
125
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
126 #define CYGARC_HAL_MMU_OFF(__paddr__) \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
127 " mcr p15,0,r0,c7,c10,4\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
128 " mcr p15,0,r0,c7,c7,0\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
129 __CYGARC_GET_CTLREG \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
130 __CYGARC_CLR_MMU_BITS \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
131 __CYGARC_SET_CTLREG(__paddr__)
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
132
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
133 #define CYGARC_HAL_MMU_OFF_X(__paddr__) \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
134 " mcr p15,0,r0,c7,c10,4\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
135 " mcr p15,0,r0,c7,c7,0\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
136 __CYGARC_GET_CTLREG \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
137 __CYGARC_CLR_MMU_BITS_X \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
138 __CYGARC_SET_CTLREG(__paddr__)
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
139
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
140 #endif // CYGARC_HAL_MMU_OFF
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
141
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
142 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
143 // Parameter info for Linux kernel
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
144 // ** C A U T I O N ** This setup must match "asm-arm/setup.h"
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
145 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
146 // Info is passed at a fixed location, using a sequence of tagged
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
147 // data entries.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
148 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
149
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
150 typedef unsigned long u32;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
151 typedef unsigned short u16;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
152 typedef unsigned char u8;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
153
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
154 //=========================================================================
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
155 // From Linux <asm-arm/setup.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
156
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
157 #define ATAG_NONE 0x00000000
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
158 struct tag_header {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
159 u32 size; // Size of tag (hdr+data) in *longwords*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
160 u32 tag;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
161 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
162
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
163 #define ATAG_CORE 0x54410001
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
164 struct tag_core {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
165 u32 flags; /* bit 0 = read-only */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
166 u32 pagesize;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
167 u32 rootdev;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
168 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
169
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
170 #define ATAG_MEM 0x54410002
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
171 struct tag_mem32 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
172 u32 size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
173 u32 start;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
174 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
175
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
176 #define ATAG_VIDEOTEXT 0x54410003
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
177 struct tag_videotext {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
178 u8 x;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
179 u8 y;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
180 u16 video_page;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
181 u8 video_mode;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
182 u8 video_cols;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
183 u16 video_ega_bx;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
184 u8 video_lines;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
185 u8 video_isvga;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
186 u16 video_points;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
187 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
188
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
189 #define ATAG_RAMDISK 0x54410004
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
190 struct tag_ramdisk {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
191 u32 flags; /* b0 = load, b1 = prompt */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
192 u32 size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
193 u32 start;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
194 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
195
498
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
196 /*
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
197 * this one accidentally used virtual addresses - as such,
524
9ffbb7d747b0 Fix spelling typo in comment
jlarmour
parents: 498
diff changeset
198 * its deprecated.
498
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
199 */
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
200 #define ATAG_INITRD 0x54410005
498
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
201
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
202 /* describes where the compressed ramdisk image lives (physical address) */
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
203 #define ATAG_INITRD2 0x54420005
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
204 struct tag_initrd {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
205 u32 start;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
206 u32 size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
207 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
209 #define ATAG_SERIAL 0x54410006
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
210 struct tag_serialnr {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
211 u32 low;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
212 u32 high;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
213 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
214
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
215 #define ATAG_REVISION 0x54410007
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
216 struct tag_revision {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
217 u32 rev;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
218 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
219
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
220 #define ATAG_VIDEOLFB 0x54410008
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
221 struct tag_videolfb {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
222 u16 lfb_width;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
223 u16 lfb_height;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
224 u16 lfb_depth;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
225 u16 lfb_linelength;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
226 u32 lfb_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
227 u32 lfb_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
228 u8 red_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
229 u8 red_pos;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
230 u8 green_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
231 u8 green_pos;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
232 u8 blue_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
233 u8 blue_pos;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
234 u8 rsvd_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
235 u8 rsvd_pos;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
236 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
237
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
238 #define ATAG_CMDLINE 0x54410009
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
239 struct tag_cmdline {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
240 char cmdline[1];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
241 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
242
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
243 #define ATAG_ACORN 0x41000101
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
244 struct tag_acorn {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
245 u32 memc_control_reg;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
246 u32 vram_pages;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
247 u8 sounddefault;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
248 u8 adfsdrives;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
249 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
250
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
251 #define ATAG_MEMCLK 0x41000402
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
252 struct tag_memclk {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
253 u32 fmemclk;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
254 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
255
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
256 struct tag {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
257 struct tag_header hdr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
258 union {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
259 struct tag_core core;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
260 struct tag_mem32 mem;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
261 struct tag_videotext videotext;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
262 struct tag_ramdisk ramdisk;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
263 struct tag_initrd initrd;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
264 struct tag_serialnr serialnr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
265 struct tag_revision revision;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
266 struct tag_videolfb videolfb;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
267 struct tag_cmdline cmdline;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
268
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
269 /*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
270 * Acorn specific
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
271 */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
272 struct tag_acorn acorn;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
273
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
274 /*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
275 * DC21285 specific
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
276 */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
277 struct tag_memclk memclk;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
278 } u;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
279 };
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
280
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
281 // End of inclusion from <asm-arm/setup.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
282 //=========================================================================
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
283
600
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
284 // Default memory layout - can be overridden by platform, typically in
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
285 // <cyg/hal/plf_io.h>
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
286 #ifndef CYGHWR_REDBOOT_LINUX_ATAG_MEM
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
287 #define CYGHWR_REDBOOT_LINUX_ATAG_MEM(_p_) \
607
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
288 CYG_MACRO_START \
600
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
289 /* Next ATAG_MEM. */ \
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
290 _p_->hdr.size = (sizeof(struct tag_mem32) + sizeof(struct tag_header))/sizeof(long); \
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
291 _p_->hdr.tag = ATAG_MEM; \
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
292 /* Round up so there's only one bit set in the memory size. \
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
293 * Don't double it if it's already a power of two, though. \
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
294 */ \
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
295 _p_->u.mem.size = 1<<hal_msbindex(CYGMEM_REGION_ram_SIZE); \
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
296 if (_p_->u.mem.size < CYGMEM_REGION_ram_SIZE) \
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
297 _p_->u.mem.size <<= 1; \
607
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
298 _p_->u.mem.start = CYGARC_PHYSICAL_ADDRESS(CYGMEM_REGION_ram); \
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
299 CYG_MACRO_END
600
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
300 #endif
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
301
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
302
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
303 // Round up a quantity to a longword (32 bit) length
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
304 #define ROUNDUP(n) (((n)+3)&~3)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
305
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
306 static void
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
307 do_exec(int argc, char *argv[])
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
308 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
309 unsigned long entry;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
310 unsigned long oldints;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
311 bool wait_time_set;
1742
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
312 int wait_time, res, num_opts;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
313 bool base_addr_set, length_set, cmd_line_set;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
314 bool ramdisk_addr_set, ramdisk_size_set;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
315 unsigned long base_addr, length;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
316 unsigned long ramdisk_addr, ramdisk_size;
1742
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
317 struct option_info opts[7];
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
318 char line[8];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
319 char *cmd_line;
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
320 struct tag *params = (struct tag *)CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS;
1742
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
321 #ifdef CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
322 bool swap_endian;
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
323 extern char __xtramp_start__[], __xtramp_end__[];
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
324 #endif
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
325 extern char __tramp_start__[], __tramp_end__[];
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
326
1688
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
327 // Check to see if a valid image has been loaded
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
328 if (entry_address == (unsigned long)NO_MEMORY) {
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
329 diag_printf("Can't execute Linux - invalid entry address\n");
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
330 return;
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
331 }
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
332 // Default physical entry point for Linux is kernel base.
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
333 entry = (unsigned long)CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS;
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
334
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
335 base_addr = load_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
336 length = load_address_end - load_address;
498
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
337 // Round length up to the next quad word
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
338 length = (length + 3) & ~0x3;
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
339
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
340 ramdisk_size = 4096*1024;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
341 init_opts(&opts[0], 'w', true, OPTION_ARG_TYPE_NUM,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
342 (void **)&wait_time, (bool *)&wait_time_set, "wait timeout");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
343 init_opts(&opts[1], 'b', true, OPTION_ARG_TYPE_NUM,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
344 (void **)&base_addr, (bool *)&base_addr_set, "base address");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
345 init_opts(&opts[2], 'l', true, OPTION_ARG_TYPE_NUM,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
346 (void **)&length, (bool *)&length_set, "length");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
347 init_opts(&opts[3], 'c', true, OPTION_ARG_TYPE_STR,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
348 (void **)&cmd_line, (bool *)&cmd_line_set, "kernel command line");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
349 init_opts(&opts[4], 'r', true, OPTION_ARG_TYPE_NUM,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
350 (void **)&ramdisk_addr, (bool *)&ramdisk_addr_set, "ramdisk_addr");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
351 init_opts(&opts[5], 's', true, OPTION_ARG_TYPE_NUM,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
352 (void **)&ramdisk_size, (bool *)&ramdisk_size_set, "ramdisk_size");
1742
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
353 num_opts = 6;
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
354 #ifdef CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
355 init_opts(&opts[6], 'x', false, OPTION_ARG_TYPE_FLG,
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
356 (void **)&swap_endian, 0, "swap endianess");
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
357 ++num_opts;
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
358 #endif
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
359 if (!scan_opts(argc, argv, 1, opts, num_opts, (void *)&entry, OPTION_ARG_TYPE_NUM, "[physical] starting address"))
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
360 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
361 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
362 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
363
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
364 // Set up parameters to pass to kernel
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
365
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
366 // CORE tag must be present & first
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
367 params->hdr.size = (sizeof(struct tag_core) + sizeof(struct tag_header))/sizeof(long);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
368 params->hdr.tag = ATAG_CORE;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
369 params->u.core.flags = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
370 params->u.core.pagesize = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
371 params->u.core.rootdev = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
372 params = (struct tag *)((long *)params + params->hdr.size);
607
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
373
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
374 // Fill in the details of the memory layout
610
9c94e977cc10 fix syntax error
msalter
parents: 607
diff changeset
375 CYGHWR_REDBOOT_LINUX_ATAG_MEM(params);
607
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
376
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
377 params = (struct tag *)((long *)params + params->hdr.size);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
378 if (ramdisk_addr_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
379 params->hdr.size = (sizeof(struct tag_initrd) + sizeof(struct tag_header))/sizeof(long);
498
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
380 params->hdr.tag = ATAG_INITRD2;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
381 params->u.initrd.start = CYGARC_PHYSICAL_ADDRESS(ramdisk_addr);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
382 params->u.initrd.size = ramdisk_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
383 params = (struct tag *)((long *)params + params->hdr.size);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
384 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
385 if (cmd_line_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
386 params->hdr.size = (ROUNDUP(strlen(cmd_line)) + sizeof(struct tag_header))/sizeof(long);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
387 params->hdr.tag = ATAG_CMDLINE;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
388 strcpy(params->u.cmdline.cmdline, cmd_line);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
389 params = (struct tag *)((long *)params + params->hdr.size);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
390 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
391 // Mark end of parameter list
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
392 params->hdr.size = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
393 params->hdr.tag = ATAG_NONE;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
394
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
395 if (wait_time_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
396 int script_timeout_ms = wait_time * 1000;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
397 #ifdef CYGFUN_REDBOOT_BOOT_SCRIPT
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
398 unsigned char *hold_script = script;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
399 script = (unsigned char *)0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
400 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
401 diag_printf("About to start execution at %p - abort with ^C within %d seconds\n",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
402 (void *)entry, wait_time);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
403 while (script_timeout_ms >= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
404 res = _rb_gets(line, sizeof(line), CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
405 if (res == _GETS_CTRLC) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
406 #ifdef CYGFUN_REDBOOT_BOOT_SCRIPT
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
407 script = hold_script; // Re-enable script
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
408 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
409 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
410 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
411 script_timeout_ms -= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
412 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
413 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
414 if (!base_addr_set) {
600
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
415 if ((base_addr == 0) || (length == 0)) {
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
416 // Probably not valid - don't try it
607
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
417 diag_printf("Base address unknown - use \"-b\" option\n");
600
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
418 return;
a4f75ab7f357 Provide platform specific override for Linux memory layout.
gthomas
parents: 580
diff changeset
419 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
420 diag_printf("Using base address %p and length %p\n",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
421 (void*)base_addr, (void*)length);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
422 } else if (base_addr_set && !length_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
423 diag_printf("Length required for non-standard base address\n");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
424 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
425 }
821
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
426
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
427 #ifdef CYGPKG_IO_ETH_DRIVERS
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
428 eth_drv_stop();
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
429 #endif
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
430
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
431 HAL_DISABLE_INTERRUPTS(oldints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
432 HAL_DCACHE_SYNC();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
433 HAL_ICACHE_DISABLE();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
434 HAL_DCACHE_DISABLE();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
435 HAL_DCACHE_SYNC();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
436 HAL_ICACHE_INVALIDATE_ALL();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
437 HAL_DCACHE_INVALIDATE_ALL();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
438
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
439 // Tricky code. We are currently running with the MMU on and the
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
440 // memory map possibly convoluted from 1-1. The trampoline code
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
441 // between labels __tramp_start__ and __tramp_end__ must be copied
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
442 // to RAM and then executed at the non-mapped address.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
443 //
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
444 // This magic was created in order to be able to execute standard
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
445 // Linux kernels with as little change/perturberance as possible.
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
446
1742
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
447 #ifdef CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
448 if (swap_endian) {
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
449 // copy the trampline code
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
450 memcpy((char *)CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS,
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
451 __xtramp_start__,
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
452 __xtramp_end__ - __xtramp_start__);
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
453
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
454 asm volatile (
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
455 CYGARC_HAL_MMU_OFF_X(%5)
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
456 "__xtramp_start__:\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
457 " cmp %1,%4;\n" // Default kernel load address. Relocate
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
458 " beq 2f;\n" // kernel image there if necessary, and
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
459 " cmp %2,#0;\n" // if size is non-zero
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
460 " beq 2f;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
461 "1:\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
462 " ldr r0,[%1],#4;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
463 " eor %5, r0, r0, ror #16;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
464 " bic %5, %5, #0x00ff0000;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
465 " mov r0, r0, ror #8;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
466 " eor r0, r0, %5, lsr #8;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
467 " str r0,[%4],#4;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
468 " subs %2,%2,#4;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
469 " bne 1b;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
470 "2:\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
471 " mov r0,#0;\n" // Set board type
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
472 " mov r1,%3;\n" // Machine type
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
473 " mov r2,%6;\n" // Kernel parameters
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
474 " mov pc,%0;\n" // Jump to kernel
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
475 "__xtramp_end__:\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
476 : :
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
477 "r"(entry),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
478 "r"(CYGARC_PHYSICAL_ADDRESS(base_addr)),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
479 "r"(length),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
480 "r"(CYGHWR_REDBOOT_ARM_MACHINE_TYPE),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
481 "r"(CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
482 "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS)),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
483 "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS))
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
484 : "r0", "r1"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
485 );
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
486 }
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
487 #endif // CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
488
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
489 // copy the trampline code
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
490 memcpy((char *)CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS,
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
491 __tramp_start__,
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
492 __tramp_end__ - __tramp_start__);
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
493
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
494 asm volatile (
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
495 CYGARC_HAL_MMU_OFF(%5)
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
496 "__tramp_start__:\n"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
497 " cmp %1,%4;\n" // Default kernel load address. Relocate
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
498 " beq 2f;\n" // kernel image there if necessary, and
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
499 " cmp %2,#0;\n" // if size is non-zero
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
500 " beq 2f;\n"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
501 "1:\n"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
502 " ldr r0,[%1],#4;\n"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
503 " str r0,[%4],#4;\n"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
504 " subs %2,%2,#4;\n"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
505 " bne 1b;\n"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
506 "2:\n"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
507 " mov r0,#0;\n" // Set board type
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
508 " mov r1,%3;\n" // Machine type
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
509 " mov r2,%6;\n" // Kernel parameters
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
510 " mov pc,%0;\n" // Jump to kernel
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
511 "__tramp_end__:\n"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
512 : :
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
513 "r"(entry),
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
514 "r"(CYGARC_PHYSICAL_ADDRESS(base_addr)),
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
515 "r"(length),
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
516 "r"(CYGHWR_REDBOOT_ARM_MACHINE_TYPE),
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
517 "r"(CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS),
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
518 "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS)),
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
519 "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS))
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
520 : "r0", "r1"
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
521 );
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
522 }
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
523
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
524 #endif // HAL_PLATFORM_MACHINE_TYPE - otherwise we do not support this stuff...
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
525
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
526 // EOF redboot_linux_exec.c