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
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 //==========================================================================
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
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
67 #ifdef CYGPKG_IO_ETH_DRIVERS
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
68 #include <cyg/io/eth/eth_drv.h> // Logical driver interfaces
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
69 #endif
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
101
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
102 #define __CYGARC_GET_CTLREG \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
103 " mrc p15,0,r0,c1,c0,0\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
104
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
105 #define __CYGARC_CLR_MMU_BITS \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
106 " bic r0,r0,#0xd\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
107 " bic r0,r0,#0x1000\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
108
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
109 #ifdef CYGHWR_HAL_ARM_BIGENDIAN
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
110 #define __CYGARC_CLR_MMU_BITS_X \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
111 " bic r0,r0,#0x8d\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
112 " bic r0,r0,#0x1000\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
113 #else
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
117 " orr r0,r0,#0x80\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
118 #endif
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
119
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
120 #define __CYGARC_SET_CTLREG(__paddr__) \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
123
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
124 #define CYGARC_HAL_MMU_OFF(__paddr__) \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
125 " mcr p15,0,r0,c7,c10,4\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
128 __CYGARC_CLR_MMU_BITS \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
129 __CYGARC_SET_CTLREG(__paddr__)
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
130
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
131 #define CYGARC_HAL_MMU_OFF_X(__paddr__) \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
132 " mcr p15,0,r0,c7,c10,4\n" \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
135 __CYGARC_CLR_MMU_BITS_X \
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
136 __CYGARC_SET_CTLREG(__paddr__)
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
137
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
194 /*
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
195 * this one accidentally used virtual addresses - as such,
524
9ffbb7d747b0 Fix spelling typo in comment
jlarmour
parents: 498
diff changeset
196 * its deprecated.
498
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
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
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
199
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
200 /* describes where the compressed ramdisk image lives (physical address) */
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
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
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
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
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
296 _p_->u.mem.start = CYGARC_PHYSICAL_ADDRESS(CYGMEM_REGION_ram); \
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
320 #ifdef CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
321 bool swap_endian;
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
322 extern char __xtramp_start__[], __xtramp_end__[];
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
326 // Check to see if a valid image has been loaded
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
327 if (entry_address == (unsigned long)NO_MEMORY) {
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
328 diag_printf("Can't execute Linux - invalid entry address\n");
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
329 return;
30d12b1c7bb0 Fix test for valid entry point (loaded data)
gthomas
parents: 1661
diff changeset
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
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");
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
358 (void **)&swap_endian, 0, "swap endianess");
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
359 ++num_opts;
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
360 #endif
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
375
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
376 // Fill in the details of the memory layout
610
9c94e977cc10 fix syntax error
msalter
parents: 607
diff changeset
377 CYGHWR_REDBOOT_LINUX_ATAG_MEM(params);
607
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
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
ae6f2695b07a Misc fixes to Linux boot code - from Patrick Doyle
gthomas
parents: 212
diff changeset
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
bb6fe957336b Add CYG_MACRO_START/END markers for completeness.
gthomas
parents: 600
diff changeset
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
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
428
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
429 #ifdef CYGPKG_IO_ETH_DRIVERS
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
430 eth_drv_stop();
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
431 #endif
fa95d14326ad linux exec fix
msalter
parents: 610
diff changeset
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
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
449 #ifdef CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
450 if (swap_endian) {
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
451 // copy the trampline code
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
452 memcpy((char *)CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS,
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
453 __xtramp_start__,
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
454 __xtramp_end__ - __xtramp_start__);
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
455
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
456 asm volatile (
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
457 CYGARC_HAL_MMU_OFF_X(%5)
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
458 "__xtramp_start__:\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
459 " cmp %1,%4;\n" // Default kernel load address. Relocate
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
460 " beq 2f;\n" // kernel image there if necessary, and
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
461 " cmp %2,#0;\n" // if size is non-zero
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
462 " beq 2f;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
463 "1:\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
464 " ldr r0,[%1],#4;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
465 " eor %5, r0, r0, ror #16;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
466 " bic %5, %5, #0x00ff0000;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
467 " mov r0, r0, ror #8;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
468 " eor r0, r0, %5, lsr #8;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
469 " str r0,[%4],#4;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
470 " subs %2,%2,#4;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
471 " bne 1b;\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
472 "2:\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
473 " mov r0,#0;\n" // Set board type
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
474 " mov r1,%3;\n" // Machine type
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
475 " mov r2,%6;\n" // Kernel parameters
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
476 " mov pc,%0;\n" // Jump to kernel
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
477 "__xtramp_end__:\n"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
478 : :
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
479 "r"(entry),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
480 "r"(CYGARC_PHYSICAL_ADDRESS(base_addr)),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
481 "r"(length),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
482 "r"(CYGHWR_REDBOOT_ARM_MACHINE_TYPE),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
483 "r"(CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
484 "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS)),
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
485 "r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS))
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
486 : "r0", "r1"
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
487 );
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
488 }
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
489 #endif // CYGHWR_REDBOOT_LINUX_EXEC_X_SWITCH
aaa68fc7d7f9 Add -x option to ARM RedBoot exec command
msalter
parents: 1688
diff changeset
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