source: rtems/bsps/m68k/genmcf548x/start/start.S @ 511dc4b

Last change on this file since 511dc4b was 511dc4b, checked in by Sebastian Huber <sebastian.huber@…>, on Jun 19, 2018 at 7:09:51 AM

Rework initialization and interrupt stack support

Statically initialize the interrupt stack area
(_Configuration_Interrupt_stack_area_begin,
_Configuration_Interrupt_stack_area_end, and
_Configuration_Interrupt_stack_size) via <rtems/confdefs.h>. Place the
interrupt stack area in a special section ".rtemsstack.interrupt". Let
BSPs define the optimal placement of this section in their linker
command files (e.g. in a fast on-chip memory).

This change makes makes the CPU_HAS_SOFTWARE_INTERRUPT_STACK and
CPU_HAS_HARDWARE_INTERRUPT_STACK CPU port defines superfluous, since the
low level initialization code has all information available via global
symbols.

This change makes the CPU_ALLOCATE_INTERRUPT_STACK CPU port define
superfluous, since the interrupt stacks are allocated by confdefs.h for
all architectures. There is no need for BSP-specific linker command
file magic (except the section placement), see previous ARM linker
command file as a bad example.

Remove _CPU_Install_interrupt_stack(). Initialize the hardware
interrupt stack in _CPU_Initialize() if necessary (e.g.
m68k_install_interrupt_stack()).

The optional _CPU_Interrupt_stack_setup() is still useful to customize
the registration of the interrupt stack area in the per-CPU information.

The initialization stack can reuse the interrupt stack, since

  • interrupts are disabled during the sequential system initialization, and
  • the boot_card() function does not return.

This stack resuse saves memory.

Changes per architecture:

arm:

  • Mostly replace the linker symbol based configuration of stacks with the standard <rtems/confdefs.h> configuration via CONFIGURE_INTERRUPT_STACK_SIZE. The size of the FIQ, ABT and UND mode stack is still defined via linker symbols. These modes are rarely used in applications and the default values provided by the BSP should be sufficient in most cases.
  • Remove the bsp_processor_count linker symbol hack used for the SMP support. This is possible since the interrupt stack area is now allocated by the linker and not allocated from the heap. This makes some configure.ac stuff obsolete. Remove the now superfluous BSP variants altcycv_devkit_smp and realview_pbx_a9_qemu_smp.

bfin:

  • Remove unused magic linker command file allocation of initialization stack. Maybe a previous linker command file copy and paste problem? In the start.S the initialization stack is set to a hard coded value.

lm32, m32c, mips, nios2, riscv, sh, v850:

  • Remove magic linker command file allocation of initialization stack. Reuse interrupt stack for initialization stack.

m68k:

  • Remove magic linker command file allocation of initialization stack. Reuse interrupt stack for initialization stack.

powerpc:

  • Remove magic linker command file allocation of initialization stack. Reuse interrupt stack for initialization stack.
  • Used dedicated memory region (REGION_RTEMSSTACK) for the interrupt stack on BSPs using the shared linkcmds.base (replacement for REGION_RWEXTRA).

sparc:

  • Remove the hard coded initialization stack. Use the interrupt stack for the initialization stack on the boot processor. This saves 16KiB of RAM.

Update #3459.

  • Property mode set to 100644
File size: 18.5 KB
Line 
1/*===============================================================*\
2| Project: RTEMS generic mcf548x BSP                              |
3+-----------------------------------------------------------------+
4| File: start.S                                                   |
5+-----------------------------------------------------------------+
6| The file contains the assembly part of MCF548x init code        |
7+-----------------------------------------------------------------+
8|                    Copyright (c) 2007                           |
9|                    Embedded Brains GmbH                         |
10|                    Obere Lagerstr. 30                           |
11|                    D-82178 Puchheim                             |
12|                    Germany                                      |
13|                    rtems@embedded-brains.de                     |
14+-----------------------------------------------------------------+
15|                                                                 |
16| Parts of the code has been derived from the "dBUG source code"  |
17| package Freescale is providing for M548X EVBs. The usage of     |
18| the modified or unmodified code and it's integration into the   |
19| generic mcf548x BSP has been done according to the Freescale    |
20| license terms.                                                  |
21|                                                                 |
22| The Freescale license terms can be reviewed in the file         |
23|                                                                 |
24|    Freescale_license.txt                                        |
25|                                                                 |
26+-----------------------------------------------------------------+
27|                                                                 |
28| The generic mcf548x BSP has been developed on the basic         |
29| structures and modules of the av5282 BSP.                       |
30|                                                                 |
31+-----------------------------------------------------------------+
32|                                                                 |
33| The license and distribution terms for this file may be         |
34| found in the file LICENSE in this distribution or at            |
35|                                                                 |
36| http://www.rtems.org/license/LICENSE.                           |
37|                                                                 |
38+-----------------------------------------------------------------+
39|                                                                 |
40|   date                      history                        ID   |
41| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
42| 12.11.07                    1.0                            ras  |
43|                                                                 |
44\*===============================================================*/
45
46/*===============================================================*\
47| Includes                                                        |
48\*===============================================================*/
49#include <rtems/asm.h>
50#include <bsp/linker-symbols.h>
51
52/*===============================================================*\
53| External references                                             |
54\*===============================================================*/
55.extern __MBAR
56.extern _CoreSramBase0
57.extern _CoreSramBase1
58.extern _CoreSramSize1
59.extern mcf548x_init
60.extern boot_card
61
62/*===============================================================*\
63| Global symbols                                                  |
64\*===============================================================*/
65
66.global interrupt_vector_table
67.global spurious_int_count
68.global start
69
70
71/*===============================================================*\
72| Exception Table                                                 |
73\*===============================================================*/
74
75.section ".vectors","ax"             /* begin of vectors section */
76PUBLIC (InterruptVectorTable)
77SYM(InterruptVectorTable):
78INITSP:         .long   _Configuration_Interrupt_stack_area_end /* Initial SP             */
79INITPC:         .long   start                   /* Initial PC             */
80vector002:      .long   asm_default_interrupt   /* Access Error           */
81vector003:      .long   asm_default_interrupt   /* Address Error          */
82vector004:      .long   asm_default_interrupt   /* Illegal Instruction    */
83vector005:      .long   asm_default_interrupt   /* Reserved               */
84vector006:      .long   asm_default_interrupt   /* Reserved               */
85vector007:      .long   asm_default_interrupt   /* Reserved               */
86vector008:      .long   asm_default_interrupt   /* Privilege Violation    */
87vector009:      .long   asm_default_interrupt   /* Trace                  */
88vector010:      .long   asm_default_interrupt   /* Unimplemented A-Line   */
89vector011:      .long   asm_default_interrupt   /* Unimplemented F-Line   */
90vector012:      .long   asm_default_interrupt   /* Debug Interrupt        */
91vector013:      .long   asm_default_interrupt   /* Reserved               */
92vector014:      .long   asm_default_interrupt   /* Format Error           */
93vector015:      .long   asm_default_interrupt   /* Unitialized Int.       */
94vector016:      .long   asm_default_interrupt   /* Reserved               */
95vector017:      .long   asm_default_interrupt   /* Reserved               */
96vector018:      .long   asm_default_interrupt   /* Reserved               */
97vector019:      .long   asm_default_interrupt   /* Reserved               */
98vector020:      .long   asm_default_interrupt   /* Reserved               */
99vector021:      .long   asm_default_interrupt   /* Reserved               */
100vector022:      .long   asm_default_interrupt   /* Reserved               */
101vector023:      .long   asm_default_interrupt   /* Reserved               */
102vector024:      .long   asm_spurious_interrupt  /* Spurious Interrupt     */
103vector025:      .long   asm_default_interrupt   /* Autovector Level 1     */
104vector026:      .long   asm_default_interrupt   /* Autovector Level 2     */
105vector027:      .long   asm_default_interrupt   /* Autovector Level 3     */
106vector028:      .long   asm_default_interrupt   /* Autovector Level 4     */
107vector029:      .long   asm_default_interrupt   /* Autovector Level 5     */
108vector030:      .long   asm_default_interrupt   /* Autovector Level 6     */
109vector031:      .long   asm_default_interrupt   /* Autovector Level 7     */
110vector032:      .long   asm_default_interrupt   /* TRAP #0                */
111vector033:      .long   asm_default_interrupt   /* TRAP #1                */
112vector034:      .long   asm_default_interrupt   /* TRAP #2                */
113vector035:      .long   asm_default_interrupt   /* TRAP #3                */
114vector036:      .long   asm_default_interrupt   /* TRAP #4                */
115vector037:      .long   asm_default_interrupt   /* TRAP #5                */
116vector038:      .long   asm_default_interrupt   /* TRAP #6                */
117vector039:      .long   asm_default_interrupt   /* TRAP #7                */
118vector040:      .long   asm_default_interrupt   /* TRAP #8                */
119vector041:      .long   asm_default_interrupt   /* TRAP #9                */
120vector042:      .long   asm_default_interrupt   /* TRAP #10               */
121vector043:      .long   asm_default_interrupt   /* TRAP #11               */
122vector044:      .long   asm_default_interrupt   /* TRAP #12               */
123vector045:      .long   asm_default_interrupt   /* TRAP #13               */
124vector046:      .long   asm_default_interrupt   /* TRAP #14               */
125vector047:      .long   asm_default_interrupt   /* TRAP #15               */
126vector048:      .long   asm_default_interrupt   /* Reserved               */
127vector049:      .long   asm_default_interrupt   /* Reserved               */
128vector050:      .long   asm_default_interrupt   /* Reserved               */
129vector051:      .long   asm_default_interrupt   /* Reserved               */
130vector052:      .long   asm_default_interrupt   /* Reserved               */
131vector053:      .long   asm_default_interrupt   /* Reserved               */
132vector054:      .long   asm_default_interrupt   /* Reserved               */
133vector055:      .long   asm_default_interrupt   /* Reserved               */
134vector056:      .long   asm_default_interrupt   /* Reserved               */
135vector057:      .long   asm_default_interrupt   /* Reserved               */
136vector058:      .long   asm_default_interrupt   /* Reserved               */
137vector059:      .long   asm_default_interrupt   /* Reserved               */
138vector060:      .long   asm_default_interrupt   /* Reserved               */
139vector061:      .long   asm_default_interrupt   /* Reserved               */
140vector062:      .long   asm_default_interrupt   /* Reserved               */
141vector063:      .long   asm_default_interrupt   /* Reserved               */
142vector064:      .long   asm_default_interrupt
143vector065:      .long   asm_default_interrupt
144vector066:      .long   asm_default_interrupt
145vector067:      .long   asm_default_interrupt
146vector068:      .long   asm_default_interrupt
147vector069:      .long   asm_default_interrupt
148vector070:      .long   asm_default_interrupt
149vector071:      .long   asm_default_interrupt
150vector072:      .long   asm_default_interrupt
151vector073:      .long   asm_default_interrupt
152vector074:      .long   asm_default_interrupt
153vector075:      .long   asm_default_interrupt
154vector076:      .long   asm_default_interrupt
155vector077:      .long   asm_default_interrupt
156vector078:      .long   asm_default_interrupt
157vector079:      .long   asm_default_interrupt
158vector080:      .long   asm_default_interrupt
159vector081:      .long   asm_default_interrupt
160vector082:      .long   asm_default_interrupt
161vector083:      .long   asm_default_interrupt
162vector084:      .long   asm_default_interrupt
163vector085:      .long   asm_default_interrupt
164vector086:      .long   asm_default_interrupt
165vector087:      .long   asm_default_interrupt
166vector088:      .long   asm_default_interrupt
167vector089:      .long   asm_default_interrupt
168vector090:      .long   asm_default_interrupt
169vector091:      .long   asm_default_interrupt
170vector092:      .long   asm_default_interrupt
171vector093:      .long   asm_default_interrupt
172vector094:      .long   asm_default_interrupt
173vector095:      .long   asm_default_interrupt
174vector096:      .long   asm_default_interrupt
175vector097:      .long   asm_default_interrupt
176vector098:      .long   asm_default_interrupt
177vector099:      .long   asm_default_interrupt
178vector100:      .long   asm_default_interrupt
179vector101:      .long   asm_default_interrupt
180vector102:      .long   asm_default_interrupt
181vector103:      .long   asm_default_interrupt
182vector104:      .long   asm_default_interrupt
183vector105:      .long   asm_default_interrupt
184vector106:      .long   asm_default_interrupt
185vector107:      .long   asm_default_interrupt
186vector108:      .long   asm_default_interrupt
187vector109:      .long   asm_default_interrupt
188vector110:      .long   asm_default_interrupt
189vector111:      .long   asm_default_interrupt
190vector112:      .long   asm_default_interrupt
191vector113:      .long   asm_default_interrupt
192vector114:      .long   asm_default_interrupt
193vector115:      .long   asm_default_interrupt
194vector116:      .long   asm_default_interrupt
195vector117:      .long   asm_default_interrupt
196vector118:      .long   asm_default_interrupt
197vector119:      .long   asm_default_interrupt
198vector120:      .long   asm_default_interrupt
199vector121:      .long   asm_default_interrupt
200vector122:      .long   asm_default_interrupt
201vector123:      .long   asm_default_interrupt
202vector124:      .long   asm_default_interrupt
203vector125:      .long   asm_default_interrupt
204vector126:      .long   asm_default_interrupt
205vector127:      .long   asm_default_interrupt
206vector128:      .long   asm_default_interrupt
207vector129:      .long   asm_default_interrupt
208vector130:      .long   asm_default_interrupt
209vector131:      .long   asm_default_interrupt
210vector132:      .long   asm_default_interrupt
211vector133:      .long   asm_default_interrupt
212vector134:      .long   asm_default_interrupt
213vector135:      .long   asm_default_interrupt
214vector136:      .long   asm_default_interrupt
215vector137:      .long   asm_default_interrupt
216vector138:      .long   asm_default_interrupt
217vector139:      .long   asm_default_interrupt
218vector140:      .long   asm_default_interrupt
219vector141:      .long   asm_default_interrupt
220vector142:      .long   asm_default_interrupt
221vector143:      .long   asm_default_interrupt
222vector144:      .long   asm_default_interrupt
223vector145:      .long   asm_default_interrupt
224vector146:      .long   asm_default_interrupt
225vector147:      .long   asm_default_interrupt
226vector148:      .long   asm_default_interrupt
227vector149:      .long   asm_default_interrupt
228vector150:      .long   asm_default_interrupt
229vector151:      .long   asm_default_interrupt
230vector152:      .long   asm_default_interrupt
231vector153:      .long   asm_default_interrupt
232vector154:      .long   asm_default_interrupt
233vector155:      .long   asm_default_interrupt
234vector156:      .long   asm_default_interrupt
235vector157:      .long   asm_default_interrupt
236vector158:      .long   asm_default_interrupt
237vector159:      .long   asm_default_interrupt
238vector160:      .long   asm_default_interrupt
239vector161:      .long   asm_default_interrupt
240vector162:      .long   asm_default_interrupt
241vector163:      .long   asm_default_interrupt
242vector164:      .long   asm_default_interrupt
243vector165:      .long   asm_default_interrupt
244vector166:      .long   asm_default_interrupt
245vector167:      .long   asm_default_interrupt
246vector168:      .long   asm_default_interrupt
247vector169:      .long   asm_default_interrupt
248vector170:      .long   asm_default_interrupt
249vector171:      .long   asm_default_interrupt
250vector172:      .long   asm_default_interrupt
251vector173:      .long   asm_default_interrupt
252vector174:      .long   asm_default_interrupt
253vector175:      .long   asm_default_interrupt
254vector176:      .long   asm_default_interrupt
255vector177:      .long   asm_default_interrupt
256vector178:      .long   asm_default_interrupt
257vector179:      .long   asm_default_interrupt
258vector180:      .long   asm_default_interrupt
259vector181:      .long   asm_default_interrupt
260vector182:      .long   asm_default_interrupt
261vector183:      .long   asm_default_interrupt
262vector184:      .long   asm_default_interrupt
263vector185:      .long   asm_default_interrupt
264vector186:      .long   asm_default_interrupt
265vector187:      .long   asm_default_interrupt
266vector188:      .long   asm_default_interrupt
267vector189:      .long   asm_default_interrupt
268vector190:      .long   asm_default_interrupt
269vector191:      .long   asm_default_interrupt
270vector192:      .long   asm_default_interrupt
271vector193:      .long   asm_default_interrupt
272vector194:      .long   asm_default_interrupt
273vector195:      .long   asm_default_interrupt
274vector196:      .long   asm_default_interrupt
275vector197:      .long   asm_default_interrupt
276vector198:      .long   asm_default_interrupt
277vector199:      .long   asm_default_interrupt
278vector200:      .long   asm_default_interrupt
279vector201:      .long   asm_default_interrupt
280vector202:      .long   asm_default_interrupt
281vector203:      .long   asm_default_interrupt
282vector204:      .long   asm_default_interrupt
283vector205:      .long   asm_default_interrupt
284vector206:      .long   asm_default_interrupt
285vector207:      .long   asm_default_interrupt
286vector208:      .long   asm_default_interrupt
287vector209:      .long   asm_default_interrupt
288vector210:      .long   asm_default_interrupt
289vector211:      .long   asm_default_interrupt
290vector212:      .long   asm_default_interrupt
291vector213:      .long   asm_default_interrupt
292vector214:      .long   asm_default_interrupt
293vector215:      .long   asm_default_interrupt
294vector216:      .long   asm_default_interrupt
295vector217:      .long   asm_default_interrupt
296vector218:      .long   asm_default_interrupt
297vector219:      .long   asm_default_interrupt
298vector220:      .long   asm_default_interrupt
299vector221:      .long   asm_default_interrupt
300vector222:      .long   asm_default_interrupt
301vector223:      .long   asm_default_interrupt
302vector224:      .long   asm_default_interrupt
303vector225:      .long   asm_default_interrupt
304vector226:      .long   asm_default_interrupt
305vector227:      .long   asm_default_interrupt
306vector228:      .long   asm_default_interrupt
307vector229:      .long   asm_default_interrupt
308vector230:      .long   asm_default_interrupt
309vector231:      .long   asm_default_interrupt
310vector232:      .long   asm_default_interrupt
311vector233:      .long   asm_default_interrupt
312vector234:      .long   asm_default_interrupt
313vector235:      .long   asm_default_interrupt
314vector236:      .long   asm_default_interrupt
315vector237:      .long   asm_default_interrupt
316vector238:      .long   asm_default_interrupt
317vector239:      .long   asm_default_interrupt
318vector240:      .long   asm_default_interrupt
319vector241:      .long   asm_default_interrupt
320vector242:      .long   asm_default_interrupt
321vector243:      .long   asm_default_interrupt
322vector244:      .long   asm_default_interrupt
323vector245:      .long   asm_default_interrupt
324vector246:      .long   asm_default_interrupt
325vector247:      .long   asm_default_interrupt
326vector248:      .long   asm_default_interrupt
327vector249:      .long   asm_default_interrupt
328vector250:      .long   asm_default_interrupt
329vector251:      .long   asm_default_interrupt
330vector252:      .long   asm_default_interrupt
331vector253:      .long   asm_default_interrupt
332vector254:      .long   asm_default_interrupt
333vector255:      .long   asm_default_interrupt
334
335/*===============================================================*\
336| Start of code                                                   |
337\*===============================================================*/
338.text
339PUBLIC (start)
340SYM(start):
341    move.w      #0x3700,sr              /* disable interrupts */
342    jmp         start_init
343
344/*===============================================================*\
345| Sspurious interrupt counter                                     |
346\*===============================================================*/
347.align 4
348.data                                   /* begin of data section */
349PUBLIC (spurious_int_count)
350SYM(spurious_int_count):
351    .long   0                           /* spurious interrupt counter */
352
353/*===============================================================*\
354| Function: Default exception handler                             |
355+-----------------------------------------------------------------+
356| - stop and disable all interrupts                               |
357| - loop forever                                                  |
358\*===============================================================*/
359.text                                   /* start of text section */
360.align 4
361PUBLIC (asm_default_interrupt)
362SYM(asm_default_interrupt):
363    nop
364    stop    #0x3700                     /* stop */
365    bra.w   asm_default_interrupt       /* loop forever */
366
367/*===============================================================*\
368| Function: Exception handler for spurious interrupts             |
369+-----------------------------------------------------------------+
370| - count spurious interrupts                                     |
371\*===============================================================*/
372.align 4
373PUBLIC (asm_spurious_interrupt)
374SYM(asm_spurious_interrupt):
375    add.l   #1,spurious_int_count
376    rte
377
378/*===============================================================*\
379| Function: start_init                                            |
380+-----------------------------------------------------------------+
381| - Disable all intterupts                                        |
382| - Setup the internal SRAM                                       |
383| - Initialize mcf548x peripherals                                |
384| - Set initial stack pointer                                     |
385| - Boot RTEMS
386\*===============================================================*/
387.align 4
388PUBLIC (start_init)
389SYM(start_init):
390
391    move.l  #0x01040100,d0              /* invalidate instruction/data/branch cache, disable all caches */
392    movec   d0,cacr
393
394    move.l  #_CoreSramBase0,d0          /* initialize RAMBAR0 */
395    add.l   #0x21,d0                    /* for code & data    */
396    movec   d0,rambar0
397
398    move.l  #_CoreSramBase1,d0          /* initialize RAMBAR1 */
399    add.l   #0x21,d0                    /* for code & data    */
400    movec   d0,rambar1                  /* movec d0,RAMBAR1   */
401
402    move.l  #__MBAR,d0                  /* initialize MBAR */
403    movec   d0,mbar
404
405    move.l  #_CoreSramBase1,d0          /* set sp to end of Core SRAM temporarily */
406    add.l   #_CoreSramSize1,d0
407    move.l  d0,sp
408
409    move.l  #0,d0                       /* initialize frame pointer */
410    movea.l d0,a6
411
412    jsr     mcf548x_init                /* Initialize mcf548x peripherals */
413
414    move.l  #_Configuration_Interrupt_stack_area_end,sp /* relocate sp */
415
416    clrl    d0                          /* clear d0 */
417    movel   d0,a7@-                     /* command line == 0 */
418
419    jsr     boot_card                   /* boot rtems */
420
421    movel   a7@+,d0
422
423exit_multitasking:
424    nop
425    nop
426    halt
427    bra     exit_multitasking
428
429.end                                    /* end of start.S module */
430
431
432
Note: See TracBrowser for help on using the repository browser.