Mercurial > ecos
annotate packages/hal/arm/arch/current/src/redboot_linux_exec.c @ 2729:74dbf4c3f2e1 after-copyright-change-20090129
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
| author | jlarmour |
|---|---|
| date | Thu, 29 Jan 2009 17:47:46 +0000 |
| parents | b2fa19bf91f1 |
| children |
| 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 //========================================================================== |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
8 // ####ECOSGPLCOPYRIGHTBEGIN#### |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
9 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
12 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
13 // eCos is free software; you can redistribute it and/or modify it under |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
14 // the terms of the GNU General Public License as published by the Free |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
15 // Software Foundation; either version 2 or (at your option) any later |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
16 // version. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
17 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
18 // eCos is distributed in the hope that it will be useful, but WITHOUT |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
21 // for more details. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
22 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
23 // You should have received a copy of the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
24 // along with eCos; if not, write to the Free Software Foundation, Inc., |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
26 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
27 // As a special exception, if other files instantiate templates or use |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
28 // macros or inline functions from this file, or you compile this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
29 // and link it with other works to produce a work based on this file, |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
30 // this file does not by itself cause the resulting work to be covered by |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
31 // the GNU General Public License. However the source code for this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
32 // must still be made available in accordance with section (3) of the GNU |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
33 // General Public License v2. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
34 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
35 // This exception does not invalidate any other reasons why a work based |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
36 // on this file might be covered by the GNU General Public License. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
37 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1955
diff
changeset
|
38 // ####ECOSGPLCOPYRIGHTEND#### |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
39 //####OTHERCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
40 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
41 // 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
|
42 // 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
|
43 // 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
|
44 // 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
|
45 // are included with his permission. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
46 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
47 //####OTHERCOPYRIGHTEND#### |
|
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 //#####DESCRIPTIONBEGIN#### |
|
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 // Author(s): gthomas |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
52 // Contributors: gthomas, jskov, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
53 // 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
|
54 // Date: 2001-02-20 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
55 // Purpose: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
56 // Description: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
57 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
58 // 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
|
59 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
60 //####DESCRIPTIONEND#### |
|
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 //========================================================================== |
|
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 #include <pkgconf/hal.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
65 #include <redboot.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
66 |
| 821 | 67 #ifdef CYGPKG_IO_ETH_DRIVERS |
| 68 #include <cyg/io/eth/eth_drv.h> // Logical driver interfaces | |
| 69 #endif | |
| 70 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
71 #include <cyg/hal/hal_intr.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
72 #include <cyg/hal/hal_cache.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
73 #include CYGHWR_MEMORY_LAYOUT_H |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
74 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
75 #include <cyg/hal/hal_io.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 #ifndef CYGARC_PHYSICAL_ADDRESS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
78 # error |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
79 # define CYGARC_PHYSICAL_ADDRESS(x) (x) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
80 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
81 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
82 // 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
|
83 // 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
|
84 #ifdef HAL_PLATFORM_MACHINE_TYPE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
85 #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
|
86 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
87 // Exported CLI function(s) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
88 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
|
89 RedBoot_cmd("exec", |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
90 "Execute an image - with MMU off", |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
91 "[-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
|
92 " [-r <ramdisk addr> [-s <ramdisk length>]]\n" |
|
1955
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
93 " [-c \"kernel command line\"] [-t <target> ] [<entry_point>]", |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
94 do_exec |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
95 ); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
96 |
|
212
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
97 // 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
|
98 // 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
|
99 // their own version. |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
100 #ifndef CYGARC_HAL_MMU_OFF |
| 1742 | 101 |
| 102 #define __CYGARC_GET_CTLREG \ | |
| 103 " mrc p15,0,r0,c1,c0,0\n" | |
| 104 | |
| 105 #define __CYGARC_CLR_MMU_BITS \ | |
| 106 " bic r0,r0,#0xd\n" \ | |
| 107 " bic r0,r0,#0x1000\n" \ | |
| 108 | |
| 109 #ifdef CYGHWR_HAL_ARM_BIGENDIAN | |
| 110 #define __CYGARC_CLR_MMU_BITS_X \ | |
| 111 " bic r0,r0,#0x8d\n" \ | |
| 112 " bic r0,r0,#0x1000\n" | |
| 113 #else | |
| 114 #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
|
115 " bic r0,r0,#0xd\n" \ |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
116 " bic r0,r0,#0x1000\n" \ |
| 1742 | 117 " orr r0,r0,#0x80\n" |
| 118 #endif | |
| 119 | |
| 120 #define __CYGARC_SET_CTLREG(__paddr__) \ | |
| 121 " 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
|
122 " mov pc," #__paddr__ "\n" |
| 1742 | 123 |
| 124 #define CYGARC_HAL_MMU_OFF(__paddr__) \ | |
| 125 " mcr p15,0,r0,c7,c10,4\n" \ | |
| 126 " mcr p15,0,r0,c7,c7,0\n" \ | |
|
1899
72c130f0a30d
* src/redboot_linux_exec.c (CYGARC_HAL_MMU_OFF_X): Fix compiler
asl
parents:
1742
diff
changeset
|
127 __CYGARC_GET_CTLREG \ |
| 1742 | 128 __CYGARC_CLR_MMU_BITS \ |
| 129 __CYGARC_SET_CTLREG(__paddr__) | |
| 130 | |
| 131 #define CYGARC_HAL_MMU_OFF_X(__paddr__) \ | |
| 132 " mcr p15,0,r0,c7,c10,4\n" \ | |
| 133 " mcr p15,0,r0,c7,c7,0\n" \ | |
|
1899
72c130f0a30d
* src/redboot_linux_exec.c (CYGARC_HAL_MMU_OFF_X): Fix compiler
asl
parents:
1742
diff
changeset
|
134 __CYGARC_GET_CTLREG \ |
| 1742 | 135 __CYGARC_CLR_MMU_BITS_X \ |
| 136 __CYGARC_SET_CTLREG(__paddr__) | |
| 137 | |
| 138 #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
|
139 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
140 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
141 // Parameter info for Linux kernel |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
142 // ** 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
|
143 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
144 // 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
|
145 // data entries. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
146 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
147 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
148 typedef unsigned long u32; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
149 typedef unsigned short u16; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
150 typedef unsigned char u8; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
151 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
152 //========================================================================= |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
153 // From Linux <asm-arm/setup.h> |
|
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 #define ATAG_NONE 0x00000000 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
156 struct tag_header { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
157 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
|
158 u32 tag; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
159 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
160 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
161 #define ATAG_CORE 0x54410001 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
162 struct tag_core { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
163 u32 flags; /* bit 0 = read-only */ |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
164 u32 pagesize; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
165 u32 rootdev; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
166 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
167 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
168 #define ATAG_MEM 0x54410002 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
169 struct tag_mem32 { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
170 u32 size; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
171 u32 start; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
172 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
173 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
174 #define ATAG_VIDEOTEXT 0x54410003 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
175 struct tag_videotext { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
176 u8 x; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
177 u8 y; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
178 u16 video_page; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
179 u8 video_mode; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
180 u8 video_cols; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
181 u16 video_ega_bx; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
182 u8 video_lines; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
183 u8 video_isvga; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
184 u16 video_points; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
185 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
186 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
187 #define ATAG_RAMDISK 0x54410004 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
188 struct tag_ramdisk { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
189 u32 flags; /* b0 = load, b1 = prompt */ |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
190 u32 size; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
191 u32 start; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
192 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
193 |
| 498 | 194 /* |
| 195 * this one accidentally used virtual addresses - as such, | |
| 524 | 196 * its deprecated. |
| 498 | 197 */ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
198 #define ATAG_INITRD 0x54410005 |
| 498 | 199 |
| 200 /* describes where the compressed ramdisk image lives (physical address) */ | |
| 201 #define ATAG_INITRD2 0x54420005 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
202 struct tag_initrd { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
203 u32 start; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
204 u32 size; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
205 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
206 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
207 #define ATAG_SERIAL 0x54410006 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
208 struct tag_serialnr { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
209 u32 low; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
210 u32 high; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
211 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
212 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
213 #define ATAG_REVISION 0x54410007 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
214 struct tag_revision { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
215 u32 rev; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
216 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
217 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
218 #define ATAG_VIDEOLFB 0x54410008 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
219 struct tag_videolfb { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
220 u16 lfb_width; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
221 u16 lfb_height; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
222 u16 lfb_depth; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
223 u16 lfb_linelength; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
224 u32 lfb_base; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
225 u32 lfb_size; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
226 u8 red_size; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
227 u8 red_pos; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
228 u8 green_size; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
229 u8 green_pos; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
230 u8 blue_size; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
231 u8 blue_pos; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
232 u8 rsvd_size; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
233 u8 rsvd_pos; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
234 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
235 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
236 #define ATAG_CMDLINE 0x54410009 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
237 struct tag_cmdline { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
238 char cmdline[1]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
239 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
240 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
241 #define ATAG_ACORN 0x41000101 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
242 struct tag_acorn { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
243 u32 memc_control_reg; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
244 u32 vram_pages; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
245 u8 sounddefault; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
246 u8 adfsdrives; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
247 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
248 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
249 #define ATAG_MEMCLK 0x41000402 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
250 struct tag_memclk { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
251 u32 fmemclk; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
252 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
253 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
254 struct tag { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
255 struct tag_header hdr; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
256 union { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
257 struct tag_core core; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
258 struct tag_mem32 mem; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
259 struct tag_videotext videotext; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
260 struct tag_ramdisk ramdisk; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
261 struct tag_initrd initrd; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
262 struct tag_serialnr serialnr; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
263 struct tag_revision revision; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
264 struct tag_videolfb videolfb; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
265 struct tag_cmdline cmdline; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
266 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
267 /* |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
268 * Acorn specific |
|
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 struct tag_acorn acorn; |
|
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 /* |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
273 * DC21285 specific |
|
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 struct tag_memclk memclk; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
276 } u; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
277 }; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
278 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
279 // 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
|
280 //========================================================================= |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
281 |
|
600
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
282 // Default memory layout - can be overridden by platform, typically in |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
283 // <cyg/hal/plf_io.h> |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
284 #ifndef CYGHWR_REDBOOT_LINUX_ATAG_MEM |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
285 #define CYGHWR_REDBOOT_LINUX_ATAG_MEM(_p_) \ |
| 607 | 286 CYG_MACRO_START \ |
|
600
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
287 /* Next ATAG_MEM. */ \ |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
288 _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
|
289 _p_->hdr.tag = ATAG_MEM; \ |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
290 /* 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
|
291 * 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
|
292 */ \ |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
293 _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
|
294 if (_p_->u.mem.size < CYGMEM_REGION_ram_SIZE) \ |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
295 _p_->u.mem.size <<= 1; \ |
| 607 | 296 _p_->u.mem.start = CYGARC_PHYSICAL_ADDRESS(CYGMEM_REGION_ram); \ |
| 297 CYG_MACRO_END | |
|
600
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
298 #endif |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
299 |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
300 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
301 // 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
|
302 #define ROUNDUP(n) (((n)+3)&~3) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
303 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
304 static void |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
305 do_exec(int argc, char *argv[]) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
306 { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
307 unsigned long entry; |
|
1955
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
308 unsigned long target; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
309 unsigned long oldints; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
310 bool wait_time_set; |
| 1742 | 311 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
|
312 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
|
313 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
|
314 unsigned long base_addr, length; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
315 unsigned long ramdisk_addr, ramdisk_size; |
| 1742 | 316 struct option_info opts[7]; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
317 char line[8]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
318 char *cmd_line; |
|
212
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
319 struct tag *params = (struct tag *)CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS; |
| 1742 | 320 #ifdef CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH |
| 321 bool swap_endian; | |
| 322 extern char __xtramp_start__[], __xtramp_end__[]; | |
| 323 #endif | |
|
212
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
324 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
|
325 |
| 1688 | 326 // Check to see if a valid image has been loaded |
| 327 if (entry_address == (unsigned long)NO_MEMORY) { | |
| 328 diag_printf("Can't execute Linux - invalid entry address\n"); | |
| 329 return; | |
| 330 } | |
|
212
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
331 // 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
|
332 entry = (unsigned long)CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS; |
|
1955
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
333 target = (unsigned long)CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS; |
|
212
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 | 337 // Round length up to the next quad word |
| 338 length = (length + 3) & ~0x3; | |
| 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"); |
|
1955
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
353 init_opts(&opts[6], 't', true, OPTION_ARG_TYPE_NUM, |
|
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
354 &target, 0, "[physical] target address"); |
|
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
355 num_opts = 7; |
| 1742 | 356 #ifdef CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH |
|
1955
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
357 init_opts(&opts[num_opts], 'x', false, OPTION_ARG_TYPE_FLG, |
| 1742 | 358 (void **)&swap_endian, 0, "swap endianess"); |
| 359 ++num_opts; | |
| 360 #endif | |
| 361 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
|
362 { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
363 return; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
364 } |
|
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 // 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
|
367 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
368 // CORE tag must be present & first |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
369 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
|
370 params->hdr.tag = ATAG_CORE; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
371 params->u.core.flags = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
372 params->u.core.pagesize = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
373 params->u.core.rootdev = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
374 params = (struct tag *)((long *)params + params->hdr.size); |
| 607 | 375 |
| 376 // Fill in the details of the memory layout | |
| 610 | 377 CYGHWR_REDBOOT_LINUX_ATAG_MEM(params); |
| 607 | 378 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
379 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
|
380 if (ramdisk_addr_set) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
381 params->hdr.size = (sizeof(struct tag_initrd) + sizeof(struct tag_header))/sizeof(long); |
| 498 | 382 params->hdr.tag = ATAG_INITRD2; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
383 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
|
384 params->u.initrd.size = ramdisk_size; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
385 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
|
386 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
387 if (cmd_line_set) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
388 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
|
389 params->hdr.tag = ATAG_CMDLINE; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
390 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
|
391 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
|
392 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
393 // Mark end of parameter list |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
394 params->hdr.size = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
395 params->hdr.tag = ATAG_NONE; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
396 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
397 if (wait_time_set) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
398 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
|
399 #ifdef CYGFUN_REDBOOT_BOOT_SCRIPT |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
400 unsigned char *hold_script = script; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
401 script = (unsigned char *)0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
402 #endif |
|
1955
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
403 diag_printf("About to start execution of image at %p, entry point %p - abort with ^C within %d seconds\n", |
|
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
404 (void *)target, (void *)entry, wait_time); |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
405 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
|
406 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
|
407 if (res == _GETS_CTRLC) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
408 #ifdef CYGFUN_REDBOOT_BOOT_SCRIPT |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
409 script = hold_script; // Re-enable script |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
410 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
411 return; |
|
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 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
|
414 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
415 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
416 if (!base_addr_set) { |
|
600
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
417 if ((base_addr == 0) || (length == 0)) { |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
418 // Probably not valid - don't try it |
| 607 | 419 diag_printf("Base address unknown - use \"-b\" option\n"); |
|
600
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
420 return; |
|
a4f75ab7f357
Provide platform specific override for Linux memory layout.
gthomas
parents:
580
diff
changeset
|
421 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
422 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
|
423 (void*)base_addr, (void*)length); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
424 } 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
|
425 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
|
426 return; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
427 } |
| 821 | 428 |
| 429 #ifdef CYGPKG_IO_ETH_DRIVERS | |
| 430 eth_drv_stop(); | |
| 431 #endif | |
| 432 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
433 HAL_DISABLE_INTERRUPTS(oldints); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
434 HAL_DCACHE_SYNC(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
435 HAL_ICACHE_DISABLE(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
436 HAL_DCACHE_DISABLE(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
437 HAL_DCACHE_SYNC(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
438 HAL_ICACHE_INVALIDATE_ALL(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
439 HAL_DCACHE_INVALIDATE_ALL(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
440 |
|
212
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
441 // 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
|
442 // 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
|
443 // 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
|
444 // 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
|
445 // |
|
212
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
446 // 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
|
447 // 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
|
448 |
| 1742 | 449 #ifdef CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH |
| 450 if (swap_endian) { | |
| 451 // copy the trampline code | |
| 452 memcpy((char *)CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS, | |
| 453 __xtramp_start__, | |
| 454 __xtramp_end__ - __xtramp_start__); | |
| 455 | |
| 456 asm volatile ( | |
| 457 CYGARC_HAL_MMU_OFF_X(%5) | |
| 458 "__xtramp_start__:\n" | |
| 459 " cmp %1,%4;\n" // Default kernel load address. Relocate | |
| 460 " beq 2f;\n" // kernel image there if necessary, and | |
| 461 " cmp %2,#0;\n" // if size is non-zero | |
| 462 " beq 2f;\n" | |
| 463 "1:\n" | |
| 464 " ldr r0,[%1],#4;\n" | |
| 465 " eor %5, r0, r0, ror #16;\n" | |
| 466 " bic %5, %5, #0x00ff0000;\n" | |
| 467 " mov r0, r0, ror #8;\n" | |
| 468 " eor r0, r0, %5, lsr #8;\n" | |
| 469 " str r0,[%4],#4;\n" | |
| 470 " subs %2,%2,#4;\n" | |
| 471 " bne 1b;\n" | |
| 472 "2:\n" | |
| 473 " mov r0,#0;\n" // Set board type | |
| 474 " mov r1,%3;\n" // Machine type | |
| 475 " mov r2,%6;\n" // Kernel parameters | |
| 476 " mov pc,%0;\n" // Jump to kernel | |
| 477 "__xtramp_end__:\n" | |
| 478 : : | |
| 479 "r"(entry), | |
| 480 "r"(CYGARC_PHYSICAL_ADDRESS(base_addr)), | |
| 481 "r"(length), | |
| 482 "r"(CYGHWR_REDBOOT_ARM_MACHINE_TYPE), | |
| 483 "r"(CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS), | |
| 484 "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS)), | |
| 485 "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS)) | |
| 486 : "r0", "r1" | |
| 487 ); | |
| 488 } | |
| 489 #endif // CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH | |
| 490 | |
|
212
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
491 // copy the trampline code |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
492 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
|
493 __tramp_start__, |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
494 __tramp_end__ - __tramp_start__); |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
495 |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
496 asm volatile ( |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
497 CYGARC_HAL_MMU_OFF(%5) |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
498 "__tramp_start__:\n" |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
499 " 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
|
500 " 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
|
501 " 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
|
502 " beq 2f;\n" |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
503 "1:\n" |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
504 " ldr r0,[%1],#4;\n" |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
505 " str r0,[%4],#4;\n" |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
506 " subs %2,%2,#4;\n" |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
507 " bne 1b;\n" |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
508 "2:\n" |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
509 " 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
|
510 " 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
|
511 " 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
|
512 " 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
|
513 "__tramp_end__:\n" |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
514 : : |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
515 "r"(entry), |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
516 "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
|
517 "r"(length), |
|
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
518 "r"(CYGHWR_REDBOOT_ARM_MACHINE_TYPE), |
|
1955
b2fa19bf91f1
* src/redboot_linux_exec.c: Added -t option which takes the
asl
parents:
1899
diff
changeset
|
519 "r"(target), |
|
212
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
520 "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
|
521 "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
|
522 : "r0", "r1" |
|
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 } |
|
212
94b558c9fb67
Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents:
210
diff
changeset
|
525 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
526 #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
|
527 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
528 // EOF redboot_linux_exec.c |
