1 /*
2 * Copyright (c) 2008 Texas Instruments. All rights reserved.
3 * This program and the accompanying materials are made available under the
4 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License
5 * v. 1.0 which accompanies this distribution. The Eclipse Public License is
6 * available at http://www.eclipse.org/legal/epl-v10.html and the Eclipse
7 * Distribution License is available at
8 * http://www.eclipse.org/org/documents/edl-v10.php.
9 *
10 * Contributors:
11 * Texas Instruments - initial implementation
12 * */
13 /*
14 * ======== Startup.xdc ========
15 */
16
17 package xdc.runtime;
18
19 /*!
20 * ======== Startup ========
21 * The `xdc.runtime` startup bootstrap
22 *
23 * This module manages the very early startup initialization that occurs
24 * before C's `main()` function is invoked. This initialization typically
25 * consists of setting hardware specific registers that control watchdog
26 * timers, access to memory, cache settings, clock speeds, etc.
27 *
28 * In addition to configuration parameters that allow the user to add custom
29 * startup functions, this module also provides services that allow modules
30 * to automatically add initialiazation functions to the startup sequence.
31 *
32 * @a(Startup Sequence) 33 * The following list defines the startup sequence and, in particular, when
34 * user provided startup functions are invoked:
35 * @p(nlist) 36 * - CPU is initialized and initial C stack setup is performed.
37 * - The function specified by `Startup.resetFxn` is called.
38 * `Startup.resetFxn` is called only on platforms where reset is performed
39 * before running a program. For example, boot code for all TI targets
40 * invokes `Startup.resetFxn`, but this function is not invoked on
41 * Microsoft targets.
42 * - C runtime initialization is performed.
43 * - Functions from the array `Startup.firstFxns` are called.
44 * - All `Mod_Module_startup` functions (see Module Initialization below)
45 * are called in a loop until all such functions return
46 * `{@link #Startup_DONE}` or the `{@link #maxPasses}` threshold is
47 * reached.
48 * - Functions from the array `Startup.lastFxns` are called.
49 * - The function `main` is called.
50 * @p 51 * The steps 4 - 6 occur during C++ static object initialization. Since
52 * the ANSI C++ Language Standard does not provide a means to control
53 * the order of C++ constructors, if a C++ constructor uses an XDC module,
54 * there is no guarantee that the module's startup function already ran.
55 * Therefore, any C++ constructor that needs XDC modules' services should
56 * call `Startup_exec` first to force all startup related functions from
57 * steps 4 - 6 to run, before the constructor uses any XDC module.
58 * @p 59 * Also, if a target does not support C++, the steps 4 - 6 will not run
60 * automatically. It is then up to a user's code to invoke `Startup_exec`,
61 * possibly as the first step in `main`.
62 * @p 63 *
64 * @a(Module Initialization) 65 * Every module can optionally define a startup function which is called
66 * before `main()`. Modules declare that they want to participate in this
67 * startup sequence via the `@ModuleStartup` attribute in the module's spec
68 * file. Modules that use this attribute must also implement the following
69 * startup function:
70 * @p(code) 71 * Int Mod_Module_startup(Int state);
72 * @p 73 * where "Mod" is the name of the module requesting startup support.
74 *
75 * The parameter to the startup function serves as "state variable" whose
76 * initial value will be `Startup_NOTDONE`. If `startup()` returns a value
77 * other than `Startup_DONE`, it will be called in a subsequent pass with this
78 * return value passed in as `state`. To ensure this process terminates,
79 * no startup function is ever called more than `{@link #maxPasses}`
80 * times.
81 *
82 * For situations in which the startup of one module depends upon another
83 * having completed its startup processing, the following function is
84 * automatically defined for all modules and proxies:
85 * @p(code) 86 * Bool Mod_Module_startupDone();
87 * @p 88 * where "Mod" is the name of some module or proxy. These predicates can
89 * be used as guards inside of a startup function to probe whether a
90 * particular module has completed its own startup processing. As a
91 * convenience, the function `Startup_rtsDone()` probes the necessary set of
92 * `xdc.runtime` modules required to support instance `create()` functions, and
93 * should be called before any startup-time instance creation and/or
94 * memory allocation is performed.
95 * @p(code) 96 * Int Mod_Module_startup(Int state)
97 * {
98 * if (!Startup_rtsDone()) {
99 * return (Startup_NOTDONE);
100 * }
101 * .
102 * .
103 * .
104 * return (Startup_DONE);
105 * }
106 * @p 107 *
108 * @a(Examples) 109 * The following code shows how to add custom startup functions to this module.
110 * @p(code) 111 * var Startup = xdc.useModule('xdc.runtime.Startup');
112 * Startup.resetFxn = "&myResetFxn";
113 * Startup.firstFxns[Startup.firstFxns.length++] = "&myFirst";
114 * Startup.lastFxns[Startup.lastFxns.length++] = "&myLast";
115 * @p 116 *
117 */
118 @Template("./Startup.xdt")
119
120 module Startup {
121
122 /*!
123 * ======== DONE ========
124 * Returned from module startup functions no further calls are required
125 */
126 const Int DONE = -1;
127
128 /*!
129 * ======== NOTDONE ========
130 * Initial value of state argument passed to module startup functions
131 */
132 const Int NOTDONE = 0;
133
134 /*!
135 * ======== ModuleView ========
136 * @_nodoc 137 */
138 metaonlystruct ModuleView {
139 Bool rtsStartupDone;
140 Bool startupBegun;
141 String resetFxn;
142 String firstFxns[];
143 String lastFxns[];
144 }
145
146 /*!
147 * ======== StartupStateView ========
148 * @_nodoc 149 */
150 metaonlystruct StartupStateView {
151 Int order;
152 String moduleName;
153 String done;
154 }
155
156 /*!
157 * ======== rovViewInfo ========
158 * @_nodoc 159 */
160 @Facet
161 metaonlyconfig xdc.rov.ViewInfo.Instance rovViewInfo =
162 xdc.rov.ViewInfo.create({
163 viewMap: [
164 ['Module',
165 {
166 type: xdc.rov.ViewInfo.MODULE,
167 viewInitFxn: 'viewInitModule',
168 structName: 'ModuleView'
169 }
170 ],
171 ['Startup State',
172 {
173 type: xdc.rov.ViewInfo.MODULE_DATA,
174 viewInitFxn: 'viewInitStartupState',
175 structName: 'StartupStateView'
176 }
177 ]
178 ]
179 });
180
181 /*!
182 * ======== maxPasses ========
183 * Max number of iterations over the set of startup functions
184 */
185 config Int maxPasses = 32;
186
187 /*!
188 * ======== InitFxn ========
189 * Type of function assignable to `firstFxns`, `lastFxns`, or `resetFxn`
190 */
191 typedef Void (*InitFxn)();
192
193 /*!
194 * ======== firstFxns ========
195 * List of functions called before module startup
196 *
197 * @see 198 * #xdoc-sect-2 Startup Sequence
199 */
200 config InitFxn firstFxns[length] = [];
201
202 /*!
203 * ======== lastFxns ========
204 * List of functions called after module startup
205 *
206 * @see 207 * #xdoc-sect-2 Startup Sequence
208 */
209 config InitFxn lastFxns[length] = [];
210
211 /*!
212 * ======== resetFxn ========
213 * Function to be called by during initialization
214 *
215 * This function is called only on platforms where reset is performed
216 * before running the program. The purpose of this function is to set up
217 * the hardware registers (cache, external memory interface, etc.) before
218 * any other code executes.
219 *
220 * This function is called as early as possible in the
221 * {@link #xdoc-sect-2 program initialization} process.
222 *
223 * @see 224 * #xdoc-sect-2 Startup Sequence
225 */
226 metaonlyconfig InitFxn resetFxn = null;
227
228 /*!
229 * ======== exec ========
230 * Execute the startup functions of all resident modules
231 *
232 * Note that this function is idempotent, and can be called at any point
233 * in the platform/target startup sequence in which "ordinary" C functions
234 * can execute. By default, this function is called as part of the
235 * standard C++ static initialization sequence.
236 *
237 * If your target compiler does not support C++, this function must be
238 * called at least once prior to using any `xdc.runtime` modules.
239 * Simply call this function at the very beginning of `main()`.
240 */
241 Void exec();
242
243 /*!
244 * ======== rtsDone ========
245 * Query the state of the `xdc.runtime` package
246 *
247 * This function is used by module startup functions to determine
248 * when it is possible to use the `xdc.runtime` modules; e.g. to
249 * allocate memory, create instances managed by some module (even
250 * those outside the `xdc.runtime` package), call a `Log` function,
251 * etc.
252 *
253 * @a(returns) 254 * Returns `TRUE` when all `xdc.runtime` modules have completed
255 * initialization.
256 */
257 Bool rtsDone();
258
259 internal:
260
261 /*!
262 * ======== reset ========
263 * Application-specific reset function
264 *
265 * This function is defined in `Startup.xdt`
266 * (`xdc_runtime_Startup_reset__I`) and is called as early as
267 * possible in the {@link #xdoc-sect-2 program initialization}
268 * process; for many platforms, it is called prior the the
269 * initialization of the C runtime environment.
270 *
271 * @see 272 * #xdoc-sect-2 Startup Sequence
273 */
274 Void reset();
275
276 Void startMods(Int state[], Int len);
277 readonlyconfig Void (*startModsFxn)(Int[], Int) = startMods;
278
279 extern Void execImplFxn() = xdc_runtime_Startup_exec__I;
280
281 readonlyconfig Void (*execImpl)() = execImplFxn;
282
283 typedef Int (*SFxn)(Int);
284 config SFxn sfxnTab[];
285
286 /*!
287 * ======== sfxnRts ========
288 * Array of runtime modules' startup functions
289 *
290 * This array also contains startup functions of the modules that inherit
291 * from interfaces in `xdc.runtime`. Functions added to this array are
292 * called only once before the startup procedure for all modules begins.
293 *
294 * @see 295 * #xdoc-sect-2 Startup Sequence
296 */
297 config Bool sfxnRts[];
298
299 struct Module_State {
300 Int *stateTab; /* initially null */
301 Bool execFlag; /* if true, startup code processing started */
302 Bool rtsDoneFlag;
303 };
304
305 }
306 /*
307 * @(#) xdc.runtime; 2, 1, 0,438; 12-19-2013 19:53:37; /db/ztree/library/trees/xdc/xdc-z63x/src/packages/
308 */
309