source: rtems/cpukit/score/cpu/lm32/rtems/score/cpu.h @ f1738ed

4.115
Last change on this file since f1738ed was f1738ed, checked in by Sebastian Huber <sebastian.huber@…>, on 11/04/12 at 20:04:39

score: PR1607: Add and use CPU_SIZEOF_POINTER

Add and use new CPU port define CPU_SIZEOF_POINTER. It must be an
integer literal that can be used by the assembler. This value will be
used to calculate offsets of structure members. These offsets will be
used in assembler code.

The size of a pointer is part of the application binary interface (ABI)
and thus independent of the actual programming language. The compiler
will provide defines to determine the current ABI. We use these defines
to select the appropriate CPU_SIZEOF_POINTER value.

Static assertions in the new file "cpukit/score/src/percpuasm.c" will
ensure that the value of CPU_SIZEOF_POINTER is consistent with the
current compiler settings. Also the offset values used by assembler
code are verfied.

  • Property mode set to 100644
File size: 40.3 KB
Line 
1/**
2 * @file rtems/score/cpu.h
3 */
4
5/*
6 *  This include file contains information pertaining to the LM32
7 *  processor.
8 */
9
10/*
11 *  COPYRIGHT (c) 1989-2008.
12 *  On-Line Applications Research Corporation (OAR).
13 *
14 *  The license and distribution terms for this file may be
15 *  found in the file LICENSE in this distribution or at
16 *  http://www.rtems.com/license/LICENSE.
17 */
18
19#ifndef _RTEMS_SCORE_CPU_H
20#define _RTEMS_SCORE_CPU_H
21
22#ifdef __cplusplus
23extern "C" {
24#endif
25
26#include <rtems/score/types.h>
27#include <rtems/score/lm32.h>
28
29/* conditional compilation parameters */
30
31/**
32 *  Should the calls to @ref _Thread_Enable_dispatch be inlined?
33 *
34 *  If TRUE, then they are inlined.
35 *  If FALSE, then a subroutine call is made.
36 *
37 *  This conditional is an example of the classic trade-off of size
38 *  versus speed.  Inlining the call (TRUE) typically increases the
39 *  size of RTEMS while speeding up the enabling of dispatching.
40 *
41 *  @note In general, the @ref _Thread_Dispatch_disable_level will
42 *  only be 0 or 1 unless you are in an interrupt handler and that
43 *  interrupt handler invokes the executive.]  When not inlined
44 *  something calls @ref _Thread_Enable_dispatch which in turns calls
45 *  @ref _Thread_Dispatch.  If the enable dispatch is inlined, then
46 *  one subroutine call is avoided entirely.
47 *
48 *  Port Specific Information:
49 *
50 *  XXX document implementation including references if appropriate
51 */
52#define CPU_INLINE_ENABLE_DISPATCH       FALSE
53
54/**
55 *  Should the body of the search loops in _Thread_queue_Enqueue_priority
56 *  be unrolled one time?  In unrolled each iteration of the loop examines
57 *  two "nodes" on the chain being searched.  Otherwise, only one node
58 *  is examined per iteration.
59 *
60 *  If TRUE, then the loops are unrolled.
61 *  If FALSE, then the loops are not unrolled.
62 *
63 *  The primary factor in making this decision is the cost of disabling
64 *  and enabling interrupts (_ISR_Flash) versus the cost of rest of the
65 *  body of the loop.  On some CPUs, the flash is more expensive than
66 *  one iteration of the loop body.  In this case, it might be desirable
67 *  to unroll the loop.  It is important to note that on some CPUs, this
68 *  code is the longest interrupt disable period in RTEMS.  So it is
69 *  necessary to strike a balance when setting this parameter.
70 *
71 *  Port Specific Information:
72 *
73 *  XXX document implementation including references if appropriate
74 */
75#define CPU_UNROLL_ENQUEUE_PRIORITY      TRUE
76
77/**
78 *  Does RTEMS manage a dedicated interrupt stack in software?
79 *
80 *  If TRUE, then a stack is allocated in @ref _ISR_Handler_initialization.
81 *  If FALSE, nothing is done.
82 *
83 *  If the CPU supports a dedicated interrupt stack in hardware,
84 *  then it is generally the responsibility of the BSP to allocate it
85 *  and set it up.
86 *
87 *  If the CPU does not support a dedicated interrupt stack, then
88 *  the porter has two options: (1) execute interrupts on the
89 *  stack of the interrupted task, and (2) have RTEMS manage a dedicated
90 *  interrupt stack.
91 *
92 *  If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
93 *
94 *  Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
95 *  @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
96 *  possible that both are FALSE for a particular CPU.  Although it
97 *  is unclear what that would imply about the interrupt processing
98 *  procedure on that CPU.
99 *
100 *  Port Specific Information:
101 *
102 *  XXX document implementation including references if appropriate
103 */
104#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
105
106/**
107 *  Does the CPU follow the simple vectored interrupt model?
108 *
109 *  If TRUE, then RTEMS allocates the vector table it internally manages.
110 *  If FALSE, then the BSP is assumed to allocate and manage the vector
111 *  table
112 *
113 *  Port Specific Information:
114 *
115 *  XXX document implementation including references if appropriate
116 */
117#define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
118
119/**
120 *  Does this CPU have hardware support for a dedicated interrupt stack?
121 *
122 *  If TRUE, then it must be installed during initialization.
123 *  If FALSE, then no installation is performed.
124 *
125 *  If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
126 *
127 *  Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
128 *  @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
129 *  possible that both are FALSE for a particular CPU.  Although it
130 *  is unclear what that would imply about the interrupt processing
131 *  procedure on that CPU.
132 *
133 *  Port Specific Information:
134 *
135 *  XXX document implementation including references if appropriate
136 */
137#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
138
139/**
140 *  Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
141 *
142 *  If TRUE, then the memory is allocated during initialization.
143 *  If FALSE, then the memory is allocated during initialization.
144 *
145 *  This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
146 *
147 *  Port Specific Information:
148 *
149 *  XXX document implementation including references if appropriate
150 */
151#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
152
153/**
154 *  Does the RTEMS invoke the user's ISR with the vector number and
155 *  a pointer to the saved interrupt frame (1) or just the vector
156 *  number (0)?
157 *
158 *  Port Specific Information:
159 *
160 *  XXX document implementation including references if appropriate
161 */
162#define CPU_ISR_PASSES_FRAME_POINTER 1
163
164/**
165 *  @def CPU_HARDWARE_FP
166 *
167 *  Does the CPU have hardware floating point?
168 *
169 *  If TRUE, then the RTEMS_FLOATING_POINT task attribute is supported.
170 *  If FALSE, then the RTEMS_FLOATING_POINT task attribute is ignored.
171 *
172 *  If there is a FP coprocessor such as the i387 or mc68881, then
173 *  the answer is TRUE.
174 *
175 *  The macro name "NO_CPU_HAS_FPU" should be made CPU specific.
176 *  It indicates whether or not this CPU model has FP support.  For
177 *  example, it would be possible to have an i386_nofp CPU model
178 *  which set this to false to indicate that you have an i386 without
179 *  an i387 and wish to leave floating point support out of RTEMS.
180 */
181
182/**
183 *  @def CPU_SOFTWARE_FP
184 *
185 *  Does the CPU have no hardware floating point and GCC provides a
186 *  software floating point implementation which must be context
187 *  switched?
188 *
189 *  This feature conditional is used to indicate whether or not there
190 *  is software implemented floating point that must be context
191 *  switched.  The determination of whether or not this applies
192 *  is very tool specific and the state saved/restored is also
193 *  compiler specific.
194 *
195 *  Port Specific Information:
196 *
197 *  XXX document implementation including references if appropriate
198 */
199#define CPU_HARDWARE_FP     FALSE
200#define CPU_SOFTWARE_FP     FALSE
201
202/**
203 *  Are all tasks RTEMS_FLOATING_POINT tasks implicitly?
204 *
205 *  If TRUE, then the RTEMS_FLOATING_POINT task attribute is assumed.
206 *  If FALSE, then the RTEMS_FLOATING_POINT task attribute is followed.
207 *
208 *  So far, the only CPUs in which this option has been used are the
209 *  HP PA-RISC and PowerPC.  On the PA-RISC, The HP C compiler and
210 *  gcc both implicitly used the floating point registers to perform
211 *  integer multiplies.  Similarly, the PowerPC port of gcc has been
212 *  seen to allocate floating point local variables and touch the FPU
213 *  even when the flow through a subroutine (like vfprintf()) might
214 *  not use floating point formats.
215 *
216 *  If a function which you would not think utilize the FP unit DOES,
217 *  then one can not easily predict which tasks will use the FP hardware.
218 *  In this case, this option should be TRUE.
219 *
220 *  If @ref CPU_HARDWARE_FP is FALSE, then this should be FALSE as well.
221 *
222 *  Port Specific Information:
223 *
224 *  XXX document implementation including references if appropriate
225 */
226#define CPU_ALL_TASKS_ARE_FP     FALSE
227
228/**
229 *  Should the IDLE task have a floating point context?
230 *
231 *  If TRUE, then the IDLE task is created as a RTEMS_FLOATING_POINT task
232 *  and it has a floating point context which is switched in and out.
233 *  If FALSE, then the IDLE task does not have a floating point context.
234 *
235 *  Setting this to TRUE negatively impacts the time required to preempt
236 *  the IDLE task from an interrupt because the floating point context
237 *  must be saved as part of the preemption.
238 *
239 *  Port Specific Information:
240 *
241 *  XXX document implementation including references if appropriate
242 */
243#define CPU_IDLE_TASK_IS_FP      FALSE
244
245/**
246 *  Should the saving of the floating point registers be deferred
247 *  until a context switch is made to another different floating point
248 *  task?
249 *
250 *  If TRUE, then the floating point context will not be stored until
251 *  necessary.  It will remain in the floating point registers and not
252 *  disturned until another floating point task is switched to.
253 *
254 *  If FALSE, then the floating point context is saved when a floating
255 *  point task is switched out and restored when the next floating point
256 *  task is restored.  The state of the floating point registers between
257 *  those two operations is not specified.
258 *
259 *  If the floating point context does NOT have to be saved as part of
260 *  interrupt dispatching, then it should be safe to set this to TRUE.
261 *
262 *  Setting this flag to TRUE results in using a different algorithm
263 *  for deciding when to save and restore the floating point context.
264 *  The deferred FP switch algorithm minimizes the number of times
265 *  the FP context is saved and restored.  The FP context is not saved
266 *  until a context switch is made to another, different FP task.
267 *  Thus in a system with only one FP task, the FP context will never
268 *  be saved or restored.
269 *
270 *  Port Specific Information:
271 *
272 *  XXX document implementation including references if appropriate
273 */
274#define CPU_USE_DEFERRED_FP_SWITCH       TRUE
275
276/**
277 *  Does this port provide a CPU dependent IDLE task implementation?
278 *
279 *  If TRUE, then the routine @ref _CPU_Thread_Idle_body
280 *  must be provided and is the default IDLE thread body instead of
281 *  @ref _CPU_Thread_Idle_body.
282 *
283 *  If FALSE, then use the generic IDLE thread body if the BSP does
284 *  not provide one.
285 *
286 *  This is intended to allow for supporting processors which have
287 *  a low power or idle mode.  When the IDLE thread is executed, then
288 *  the CPU can be powered down.
289 *
290 *  The order of precedence for selecting the IDLE thread body is:
291 *
292 *    -#  BSP provided
293 *    -#  CPU dependent (if provided)
294 *    -#  generic (if no BSP and no CPU dependent)
295 *
296 *  Port Specific Information:
297 *
298 *  XXX document implementation including references if appropriate
299 */
300#define CPU_PROVIDES_IDLE_THREAD_BODY    TRUE
301
302/**
303 *  Does the stack grow up (toward higher addresses) or down
304 *  (toward lower addresses)?
305 *
306 *  If TRUE, then the grows upward.
307 *  If FALSE, then the grows toward smaller addresses.
308 *
309 *  Port Specific Information:
310 *
311 *  XXX document implementation including references if appropriate
312 */
313#define CPU_STACK_GROWS_UP               FALSE
314
315/**
316 *  The following is the variable attribute used to force alignment
317 *  of critical RTEMS structures.  On some processors it may make
318 *  sense to have these aligned on tighter boundaries than
319 *  the minimum requirements of the compiler in order to have as
320 *  much of the critical data area as possible in a cache line.
321 *
322 *  The placement of this macro in the declaration of the variables
323 *  is based on the syntactically requirements of the GNU C
324 *  "__attribute__" extension.  For example with GNU C, use
325 *  the following to force a structures to a 32 byte boundary.
326 *
327 *      __attribute__ ((aligned (32)))
328 *
329 *  @note Currently only the Priority Bit Map table uses this feature.
330 *        To benefit from using this, the data must be heavily
331 *        used so it will stay in the cache and used frequently enough
332 *        in the executive to justify turning this on.
333 *
334 *  Port Specific Information:
335 *
336 *  L2 cache lines are 32 bytes in Milkymist SoC
337 */
338#define CPU_STRUCTURE_ALIGNMENT __attribute__ ((aligned (32)))
339
340#define CPU_TIMESTAMP_USE_INT64_INLINE TRUE
341
342/**
343 *  @defgroup CPUEndian Processor Dependent Endianness Support
344 *
345 *  This group assists in issues related to processor endianness.
346 */
347
348/**
349 *  @ingroup CPUEndian
350 *  Define what is required to specify how the network to host conversion
351 *  routines are handled.
352 *
353 *  @note @a CPU_BIG_ENDIAN and @a CPU_LITTLE_ENDIAN should NOT have the
354 *  same values.
355 *
356 *  @see CPU_LITTLE_ENDIAN
357 *
358 *  Port Specific Information:
359 *
360 *  XXX document implementation including references if appropriate
361 */
362#define CPU_BIG_ENDIAN                           TRUE
363
364/**
365 *  @ingroup CPUEndian
366 *  Define what is required to specify how the network to host conversion
367 *  routines are handled.
368 *
369 *  @note @ref CPU_BIG_ENDIAN and @ref CPU_LITTLE_ENDIAN should NOT have the
370 *  same values.
371 *
372 *  @see CPU_BIG_ENDIAN
373 *
374 *  Port Specific Information:
375 *
376 *  XXX document implementation including references if appropriate
377 */
378#define CPU_LITTLE_ENDIAN                        FALSE
379
380/**
381 *  @ingroup CPUInterrupt
382 *  The following defines the number of bits actually used in the
383 *  interrupt field of the task mode.  How those bits map to the
384 *  CPU interrupt levels is defined by the routine @ref _CPU_ISR_Set_level.
385 *
386 *  Port Specific Information:
387 *
388 *  XXX document implementation including references if appropriate
389 */
390#define CPU_MODES_INTERRUPT_MASK   0x00000001
391
392/*
393 *  Processor defined structures required for cpukit/score.
394 *
395 *  Port Specific Information:
396 *
397 *  XXX document implementation including references if appropriate
398 */
399
400/* may need to put some structures here.  */
401
402/**
403 * @defgroup CPUContext Processor Dependent Context Management
404 *
405 *  From the highest level viewpoint, there are 2 types of context to save.
406 *
407 *     -# Interrupt registers to save
408 *     -# Task level registers to save
409 *
410 *  Since RTEMS handles integer and floating point contexts separately, this
411 *  means we have the following 3 context items:
412 *
413 *     -# task level context stuff::  Context_Control
414 *     -# floating point task stuff:: Context_Control_fp
415 *     -# special interrupt level context :: CPU_Interrupt_frame
416 *
417 *  On some processors, it is cost-effective to save only the callee
418 *  preserved registers during a task context switch.  This means
419 *  that the ISR code needs to save those registers which do not
420 *  persist across function calls.  It is not mandatory to make this
421 *  distinctions between the caller/callee saves registers for the
422 *  purpose of minimizing context saved during task switch and on interrupts.
423 *  If the cost of saving extra registers is minimal, simplicity is the
424 *  choice.  Save the same context on interrupt entry as for tasks in
425 *  this case.
426 *
427 *  Additionally, if gdb is to be made aware of RTEMS tasks for this CPU, then
428 *  care should be used in designing the context area.
429 *
430 *  On some CPUs with hardware floating point support, the Context_Control_fp
431 *  structure will not be used or it simply consist of an array of a
432 *  fixed number of bytes.   This is done when the floating point context
433 *  is dumped by a "FP save context" type instruction and the format
434 *  is not really defined by the CPU.  In this case, there is no need
435 *  to figure out the exact format -- only the size.  Of course, although
436 *  this is enough information for RTEMS, it is probably not enough for
437 *  a debugger such as gdb.  But that is another problem.
438 *
439 *  Port Specific Information:
440 *
441 *  XXX document implementation including references if appropriate
442 */
443
444/**
445 *  @ingroup CPUContext Management
446 *  This defines the minimal set of integer and processor state registers
447 *  that must be saved during a voluntary context switch from one thread
448 *  to another.
449 */
450typedef struct {
451  uint32_t r11;
452  uint32_t r12;
453  uint32_t r13;
454  uint32_t r14;
455  uint32_t r15;
456  uint32_t r16;
457  uint32_t r17;
458  uint32_t r18;
459  uint32_t r19;
460  uint32_t r20;
461  uint32_t r21;
462  uint32_t r22;
463  uint32_t r23;
464  uint32_t r24;
465  uint32_t r25;
466  uint32_t gp;
467  uint32_t fp;
468  uint32_t sp;
469  uint32_t ra;
470  uint32_t ie;
471  uint32_t epc;
472} Context_Control;
473
474/**
475 *  @ingroup CPUContext Management
476 *
477 *  This macro returns the stack pointer associated with @a _context.
478 *
479 *  @param[in] _context is the thread context area to access
480 *
481 *  @return This method returns the stack pointer.
482 */
483#define _CPU_Context_Get_SP( _context ) \
484  (_context)->sp
485
486/**
487 *  @ingroup CPUContext Management
488 *  This defines the complete set of floating point registers that must
489 *  be saved during any context switch from one thread to another.
490 */
491typedef struct {
492} Context_Control_fp;
493
494/**
495 *  @ingroup CPUContext Management
496 *  This defines the set of integer and processor state registers that must
497 *  be saved during an interrupt.  This set does not include any which are
498 *  in @ref Context_Control.
499 */
500typedef struct {
501  uint32_t r1;
502  uint32_t r2;
503  uint32_t r3;
504  uint32_t r4;
505  uint32_t r5;
506  uint32_t r6;
507  uint32_t r7;
508  uint32_t r8;
509  uint32_t r9;
510  uint32_t r10;
511  uint32_t ra;
512  uint32_t ba;
513  uint32_t ea;
514} CPU_Interrupt_frame;
515
516/**
517 *  This variable is optional.  It is used on CPUs on which it is difficult
518 *  to generate an "uninitialized" FP context.  It is filled in by
519 *  @ref _CPU_Initialize and copied into the task's FP context area during
520 *  @ref _CPU_Context_Initialize.
521 *
522 *  Port Specific Information:
523 *
524 *  XXX document implementation including references if appropriate
525 */
526#if 0
527SCORE_EXTERN Context_Control_fp  _CPU_Null_fp_context;
528#endif
529
530/**
531 *  @defgroup CPUInterrupt Processor Dependent Interrupt Management
532 *
533 *  On some CPUs, RTEMS supports a software managed interrupt stack.
534 *  This stack is allocated by the Interrupt Manager and the switch
535 *  is performed in @ref _ISR_Handler.  These variables contain pointers
536 *  to the lowest and highest addresses in the chunk of memory allocated
537 *  for the interrupt stack.  Since it is unknown whether the stack
538 *  grows up or down (in general), this give the CPU dependent
539 *  code the option of picking the version it wants to use.
540 *
541 *  @note These two variables are required if the macro
542 *        @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
543 *
544 *  Port Specific Information:
545 *
546 *  XXX document implementation including references if appropriate
547 */
548
549/*
550 *  Nothing prevents the porter from declaring more CPU specific variables.
551 *
552 *  Port Specific Information:
553 *
554 *  XXX document implementation including references if appropriate
555 */
556
557/* XXX: if needed, put more variables here */
558
559/**
560 *  @ingroup CPUContext
561 *  The size of the floating point context area.  On some CPUs this
562 *  will not be a "sizeof" because the format of the floating point
563 *  area is not defined -- only the size is.  This is usually on
564 *  CPUs with a "floating point save context" instruction.
565 *
566 *  Port Specific Information:
567 *
568 *  XXX document implementation including references if appropriate
569 */
570#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
571
572/**
573 *  Amount of extra stack (above minimum stack size) required by
574 *  MPCI receive server thread.  Remember that in a multiprocessor
575 *  system this thread must exist and be able to process all directives.
576 *
577 *  Port Specific Information:
578 *
579 *  XXX document implementation including references if appropriate
580 */
581#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
582
583/**
584 *  @ingroup CPUInterrupt
585 *  This defines the number of entries in the @ref _ISR_Vector_table managed
586 *  by RTEMS.
587 *
588 *  Port Specific Information:
589 *
590 *  XXX document implementation including references if appropriate
591 */
592#define CPU_INTERRUPT_NUMBER_OF_VECTORS      32
593
594/**
595 *  @ingroup CPUInterrupt
596 *  This defines the highest interrupt vector number for this port.
597 */
598#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER  (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
599
600/**
601 *  @ingroup CPUInterrupt
602 *  This is defined if the port has a special way to report the ISR nesting
603 *  level.  Most ports maintain the variable @a _ISR_Nest_level.
604 */
605#define CPU_PROVIDES_ISR_IS_IN_PROGRESS FALSE
606
607/**
608 *  @ingroup CPUContext
609 *  Should be large enough to run all RTEMS tests.  This ensures
610 *  that a "reasonable" small application should not have any problems.
611 *
612 *  Port Specific Information:
613 *
614 *  XXX document implementation including references if appropriate
615 */
616#define CPU_STACK_MINIMUM_SIZE          (1024*4)
617
618#define CPU_SIZEOF_POINTER 4
619
620/**
621 *  CPU's worst alignment requirement for data types on a byte boundary.  This
622 *  alignment does not take into account the requirements for the stack.
623 *
624 *  Port Specific Information:
625 *  The LM32 architecture manual simply states: "All memory accesses must be
626 *  aligned to the size of the access", and there is no hardware support
627 *  whatsoever for 64-bit numbers.
628 *  (lm32_archman.pdf, July 2009, p. 15)
629 */
630#define CPU_ALIGNMENT              4
631
632/**
633 *  This number corresponds to the byte alignment requirement for the
634 *  heap handler.  This alignment requirement may be stricter than that
635 *  for the data types alignment specified by @ref CPU_ALIGNMENT.  It is
636 *  common for the heap to follow the same alignment requirement as
637 *  @ref CPU_ALIGNMENT.  If the @ref CPU_ALIGNMENT is strict enough for
638 *  the heap, then this should be set to @ref CPU_ALIGNMENT.
639 *
640 *  @note  This does not have to be a power of 2 although it should be
641 *         a multiple of 2 greater than or equal to 2.  The requirement
642 *         to be a multiple of 2 is because the heap uses the least
643 *         significant field of the front and back flags to indicate
644 *         that a block is in use or free.  So you do not want any odd
645 *         length blocks really putting length data in that bit.
646 *
647 *         On byte oriented architectures, @ref CPU_HEAP_ALIGNMENT normally will
648 *         have to be greater or equal to than @ref CPU_ALIGNMENT to ensure that
649 *         elements allocated from the heap meet all restrictions.
650 *
651 *  Port Specific Information:
652 *
653 *  XXX document implementation including references if appropriate
654 */
655#define CPU_HEAP_ALIGNMENT         CPU_ALIGNMENT
656
657/**
658 *  This number corresponds to the byte alignment requirement for memory
659 *  buffers allocated by the partition manager.  This alignment requirement
660 *  may be stricter than that for the data types alignment specified by
661 *  @ref CPU_ALIGNMENT.  It is common for the partition to follow the same
662 *  alignment requirement as @ref CPU_ALIGNMENT.  If the @ref CPU_ALIGNMENT is
663 *  strict enough for the partition, then this should be set to
664 *  @ref CPU_ALIGNMENT.
665 *
666 *  @note  This does not have to be a power of 2.  It does have to
667 *         be greater or equal to than @ref CPU_ALIGNMENT.
668 *
669 *  Port Specific Information:
670 *
671 *  XXX document implementation including references if appropriate
672 */
673#define CPU_PARTITION_ALIGNMENT    CPU_ALIGNMENT
674
675/**
676 *  This number corresponds to the byte alignment requirement for the
677 *  stack.  This alignment requirement may be stricter than that for the
678 *  data types alignment specified by @ref CPU_ALIGNMENT.
679 *
680 *
681 *  Port Specific Information:
682 *
683 *  Stack is software-managed
684 */
685#define CPU_STACK_ALIGNMENT        CPU_ALIGNMENT
686
687/*
688 *  ISR handler macros
689 */
690
691/**
692 *  @ingroup CPUInterrupt
693 *  Support routine to initialize the RTEMS vector table after it is allocated.
694 *
695 *  Port Specific Information:
696 *
697 *  XXX document implementation including references if appropriate
698 */
699#define _CPU_Initialize_vectors()
700
701/**
702 *  @ingroup CPUInterrupt
703 *  Disable all interrupts for an RTEMS critical section.  The previous
704 *  level is returned in @a _isr_cookie.
705 *
706 *  @param[out] _isr_cookie will contain the previous level cookie
707 *
708 *  Port Specific Information:
709 *
710 *  XXX document implementation including references if appropriate
711 */
712#define _CPU_ISR_Disable( _isr_cookie ) \
713  lm32_disable_interrupts( _isr_cookie );
714
715/**
716 *  @ingroup CPUInterrupt
717 *  Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
718 *  This indicates the end of an RTEMS critical section.  The parameter
719 *  @a _isr_cookie is not modified.
720 *
721 *  @param[in] _isr_cookie contain the previous level cookie
722 *
723 *  Port Specific Information:
724 *
725 *  XXX document implementation including references if appropriate
726 */
727#define _CPU_ISR_Enable( _isr_cookie ) \
728  lm32_enable_interrupts( _isr_cookie );
729
730/**
731 *  @ingroup CPUInterrupt
732 *  This temporarily restores the interrupt to @a _isr_cookie before immediately
733 *  disabling them again.  This is used to divide long RTEMS critical
734 *  sections into two or more parts.  The parameter @a _isr_cookie is not
735 *  modified.
736 *
737 *  @param[in] _isr_cookie contain the previous level cookie
738 *
739 *  Port Specific Information:
740 *
741 *  XXX document implementation including references if appropriate
742 */
743#define _CPU_ISR_Flash( _isr_cookie ) \
744  lm32_flash_interrupts( _isr_cookie );
745
746/**
747 *  @ingroup CPUInterrupt
748 *
749 *  This routine and @ref _CPU_ISR_Get_level
750 *  Map the interrupt level in task mode onto the hardware that the CPU
751 *  actually provides.  Currently, interrupt levels which do not
752 *  map onto the CPU in a generic fashion are undefined.  Someday,
753 *  it would be nice if these were "mapped" by the application
754 *  via a callout.  For example, m68k has 8 levels 0 - 7, levels
755 *  8 - 255 would be available for bsp/application specific meaning.
756 *  This could be used to manage a programmable interrupt controller
757 *  via the rtems_task_mode directive.
758 *
759 *  Port Specific Information:
760 *
761 *  XXX document implementation including references if appropriate
762 */
763#define _CPU_ISR_Set_level( new_level ) \
764  { \
765    _CPU_ISR_Enable( ( new_level==0 ) ? 1 : 0 ); \
766  }
767
768/**
769 *  @ingroup CPUInterrupt
770 *  Return the current interrupt disable level for this task in
771 *  the format used by the interrupt level portion of the task mode.
772 *
773 *  @note This routine usually must be implemented as a subroutine.
774 *
775 *  Port Specific Information:
776 *
777 *  XXX document implementation including references if appropriate
778 */
779uint32_t   _CPU_ISR_Get_level( void );
780
781/* end of ISR handler macros */
782
783/* Context handler macros */
784
785/**
786 *  @ingroup CPUContext
787 *  Initialize the context to a state suitable for starting a
788 *  task after a context restore operation.  Generally, this
789 *  involves:
790 *
791 *     - setting a starting address
792 *     - preparing the stack
793 *     - preparing the stack and frame pointers
794 *     - setting the proper interrupt level in the context
795 *     - initializing the floating point context
796 *
797 *  This routine generally does not set any unnecessary register
798 *  in the context.  The state of the "general data" registers is
799 *  undefined at task start time.
800 *
801 *  @param[in] _the_context is the context structure to be initialized
802 *  @param[in] _stack_base is the lowest physical address of this task's stack
803 *  @param[in] _size is the size of this task's stack
804 *  @param[in] _isr is the interrupt disable level
805 *  @param[in] _entry_point is the thread's entry point.  This is
806 *         always @a _Thread_Handler
807 *  @param[in] _is_fp is TRUE if the thread is to be a floating
808 *        point thread.  This is typically only used on CPUs where the
809 *        FPU may be easily disabled by software such as on the SPARC
810 *        where the PSR contains an enable FPU bit.
811 *
812 *  Port Specific Information:
813 *
814 *  XXX document implementation including references if appropriate
815 */
816extern char _gp[];
817
818#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
819                                 _isr, _entry_point, _is_fp ) \
820   do { \
821     uint32_t _stack = (uint32_t)(_stack_base) + (_size) - 4; \
822     (_the_context)->gp = (uint32_t)_gp; \
823     (_the_context)->fp = (uint32_t)_stack; \
824     (_the_context)->sp = (uint32_t)_stack; \
825     (_the_context)->ra = (uint32_t)(_entry_point); \
826   } while ( 0 )
827
828/**
829 *  This routine is responsible for somehow restarting the currently
830 *  executing task.  If you are lucky, then all that is necessary
831 *  is restoring the context.  Otherwise, there will need to be
832 *  a special assembly routine which does something special in this
833 *  case.  For many ports, simply adding a label to the restore path
834 *  of @ref _CPU_Context_switch will work.  On other ports, it may be
835 *  possibly to load a few arguments and jump to the restore path. It will
836 *  not work if restarting self conflicts with the stack frame
837 *  assumptions of restoring a context.
838 *
839 *  Port Specific Information:
840 *
841 *  XXX document implementation including references if appropriate
842 */
843#define _CPU_Context_Restart_self( _the_context ) \
844   _CPU_Context_restore( (_the_context) );
845
846/**
847 *  @ingroup CPUContext
848 *  The purpose of this macro is to allow the initial pointer into
849 *  a floating point context area (used to save the floating point
850 *  context) to be at an arbitrary place in the floating point
851 *  context area.
852 *
853 *  This is necessary because some FP units are designed to have
854 *  their context saved as a stack which grows into lower addresses.
855 *  Other FP units can be saved by simply moving registers into offsets
856 *  from the base of the context area.  Finally some FP units provide
857 *  a "dump context" instruction which could fill in from high to low
858 *  or low to high based on the whim of the CPU designers.
859 *
860 *  @param[in] _base is the lowest physical address of the floating point
861 *         context area
862 *  @param[in] _offset is the offset into the floating point area
863 *
864 *  Port Specific Information:
865 *
866 *  XXX document implementation including references if appropriate
867 */
868#define _CPU_Context_Fp_start( _base, _offset )
869#if 0
870   ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
871#endif
872
873/**
874 *  This routine initializes the FP context area passed to it to.
875 *  There are a few standard ways in which to initialize the
876 *  floating point context.  The code included for this macro assumes
877 *  that this is a CPU in which a "initial" FP context was saved into
878 *  @a _CPU_Null_fp_context and it simply copies it to the destination
879 *  context passed to it.
880 *
881 *  Other floating point context save/restore models include:
882 *    -# not doing anything, and
883 *    -# putting a "null FP status word" in the correct place in the FP context.
884 *
885 *  @param[in] _destination is the floating point context area
886 *
887 *  Port Specific Information:
888 *
889 *  XXX document implementation including references if appropriate
890 */
891#define _CPU_Context_Initialize_fp( _destination )
892#if 0
893  { \
894   *(*(_destination)) = _CPU_Null_fp_context; \
895  }
896#endif
897
898/* end of Context handler macros */
899
900/* Fatal Error manager macros */
901
902/**
903 *  This routine copies _error into a known place -- typically a stack
904 *  location or a register, optionally disables interrupts, and
905 *  halts/stops the CPU.
906 *
907 *  Port Specific Information:
908 *
909 *  XXX document implementation including references if appropriate
910 */
911#define _CPU_Fatal_halt( _error ) \
912  { \
913  }
914
915/* end of Fatal Error manager macros */
916
917/* Bitfield handler macros */
918
919/**
920 *  @defgroup CPUBitfield Processor Dependent Bitfield Manipulation
921 *
922 *  This set of routines are used to implement fast searches for
923 *  the most important ready task.
924 */
925
926/**
927 *  @ingroup CPUBitfield
928 *  This definition is set to TRUE if the port uses the generic bitfield
929 *  manipulation implementation.
930 */
931#define CPU_USE_GENERIC_BITFIELD_CODE TRUE
932
933/**
934 *  @ingroup CPUBitfield
935 *  This definition is set to TRUE if the port uses the data tables provided
936 *  by the generic bitfield manipulation implementation.
937 *  This can occur when actually using the generic bitfield manipulation
938 *  implementation or when implementing the same algorithm in assembly
939 *  language for improved performance.  It is unlikely that a port will use
940 *  the data if it has a bitfield scan instruction.
941 */
942#define CPU_USE_GENERIC_BITFIELD_DATA TRUE
943
944/**
945 *  @ingroup CPUBitfield
946 *  This routine sets @a _output to the bit number of the first bit
947 *  set in @a _value.  @a _value is of CPU dependent type
948 *  @a Priority_bit_map_Control.  This type may be either 16 or 32 bits
949 *  wide although only the 16 least significant bits will be used.
950 *
951 *  There are a number of variables in using a "find first bit" type
952 *  instruction.
953 *
954 *    -# What happens when run on a value of zero?
955 *    -# Bits may be numbered from MSB to LSB or vice-versa.
956 *    -# The numbering may be zero or one based.
957 *    -# The "find first bit" instruction may search from MSB or LSB.
958 *
959 *  RTEMS guarantees that (1) will never happen so it is not a concern.
960 *  (2),(3), (4) are handled by the macros @ref _CPU_Priority_Mask and
961 *  @ref _CPU_Priority_bits_index.  These three form a set of routines
962 *  which must logically operate together.  Bits in the _value are
963 *  set and cleared based on masks built by @ref _CPU_Priority_Mask.
964 *  The basic major and minor values calculated by @ref _Priority_Major
965 *  and @ref _Priority_Minor are "massaged" by @ref _CPU_Priority_bits_index
966 *  to properly range between the values returned by the "find first bit"
967 *  instruction.  This makes it possible for @ref _Priority_Get_highest to
968 *  calculate the major and directly index into the minor table.
969 *  This mapping is necessary to ensure that 0 (a high priority major/minor)
970 *  is the first bit found.
971 *
972 *  This entire "find first bit" and mapping process depends heavily
973 *  on the manner in which a priority is broken into a major and minor
974 *  components with the major being the 4 MSB of a priority and minor
975 *  the 4 LSB.  Thus (0 << 4) + 0 corresponds to priority 0 -- the highest
976 *  priority.  And (15 << 4) + 14 corresponds to priority 254 -- the next
977 *  to the lowest priority.
978 *
979 *  If your CPU does not have a "find first bit" instruction, then
980 *  there are ways to make do without it.  Here are a handful of ways
981 *  to implement this in software:
982 *
983@verbatim
984      - a series of 16 bit test instructions
985      - a "binary search using if's"
986      - _number = 0
987        if _value > 0x00ff
988          _value >>=8
989          _number = 8;
990
991        if _value > 0x0000f
992          _value >=8
993          _number += 4
994
995        _number += bit_set_table[ _value ]
996@endverbatim
997
998 *    where bit_set_table[ 16 ] has values which indicate the first
999 *      bit set
1000 *
1001 *  @param[in] _value is the value to be scanned
1002 *  @param[in] _output is the first bit set
1003 *
1004 *  Port Specific Information:
1005 *
1006 *  XXX document implementation including references if appropriate
1007 */
1008
1009#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
1010#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
1011  { \
1012    (_output) = 0;   /* do something to prevent warnings */ \
1013  }
1014#endif
1015
1016/* end of Bitfield handler macros */
1017
1018/**
1019 *  This routine builds the mask which corresponds to the bit fields
1020 *  as searched by @ref _CPU_Bitfield_Find_first_bit.  See the discussion
1021 *  for that routine.
1022 *
1023 *  Port Specific Information:
1024 *
1025 *  XXX document implementation including references if appropriate
1026 */
1027#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
1028
1029#define _CPU_Priority_Mask( _bit_number ) \
1030  ( 1 << (_bit_number) )
1031
1032#endif
1033
1034/**
1035 *  @ingroup CPUBitfield
1036 *  This routine translates the bit numbers returned by
1037 *  @ref _CPU_Bitfield_Find_first_bit into something suitable for use as
1038 *  a major or minor component of a priority.  See the discussion
1039 *  for that routine.
1040 *
1041 *  @param[in] _priority is the major or minor number to translate
1042 *
1043 *  Port Specific Information:
1044 *
1045 *  XXX document implementation including references if appropriate
1046 */
1047#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
1048
1049#define _CPU_Priority_bits_index( _priority ) \
1050  (_priority)
1051
1052#endif
1053
1054/* end of Priority handler macros */
1055
1056/* functions */
1057
1058/**
1059 *  This routine performs CPU dependent initialization.
1060 *
1061 *  Port Specific Information:
1062 *
1063 *  XXX document implementation including references if appropriate
1064 */
1065void _CPU_Initialize(void);
1066
1067/**
1068 *  @ingroup CPUInterrupt
1069 *  This routine installs a "raw" interrupt handler directly into the
1070 *  processor's vector table.
1071 *
1072 *  @param[in] vector is the vector number
1073 *  @param[in] new_handler is the raw ISR handler to install
1074 *  @param[in] old_handler is the previously installed ISR Handler
1075 *
1076 *  Port Specific Information:
1077 *
1078 *  XXX document implementation including references if appropriate
1079 */
1080void _CPU_ISR_install_raw_handler(
1081  uint32_t    vector,
1082  proc_ptr    new_handler,
1083  proc_ptr   *old_handler
1084);
1085
1086/**
1087 *  @ingroup CPUInterrupt
1088 *  This routine installs an interrupt vector.
1089 *
1090 *  @param[in] vector is the vector number
1091 *  @param[in] new_handler is the RTEMS ISR handler to install
1092 *  @param[in] old_handler is the previously installed ISR Handler
1093 *
1094 *  Port Specific Information:
1095 *
1096 *  XXX document implementation including references if appropriate
1097 */
1098void _CPU_ISR_install_vector(
1099  uint32_t    vector,
1100  proc_ptr    new_handler,
1101  proc_ptr   *old_handler
1102);
1103
1104/**
1105 *  @ingroup CPUInterrupt
1106 *  This routine installs the hardware interrupt stack pointer.
1107 *
1108 *  @note  It need only be provided if @ref CPU_HAS_HARDWARE_INTERRUPT_STACK
1109 *         is TRUE.
1110 *
1111 *  Port Specific Information:
1112 *
1113 *  XXX document implementation including references if appropriate
1114 */
1115void _CPU_Install_interrupt_stack( void );
1116
1117/**
1118 *  This routine is the CPU dependent IDLE thread body.
1119 *
1120 *  @note  It need only be provided if @ref CPU_PROVIDES_IDLE_THREAD_BODY
1121 *         is TRUE.
1122 *
1123 *  Port Specific Information:
1124 *
1125 *  XXX document implementation including references if appropriate
1126 */
1127void *_CPU_Thread_Idle_body( uintptr_t ignored );
1128
1129/**
1130 *  @ingroup CPUContext
1131 *  This routine switches from the run context to the heir context.
1132 *
1133 *  @param[in] run points to the context of the currently executing task
1134 *  @param[in] heir points to the context of the heir task
1135 *
1136 *  Port Specific Information:
1137 *
1138 *  XXX document implementation including references if appropriate
1139 */
1140void _CPU_Context_switch(
1141  Context_Control  *run,
1142  Context_Control  *heir
1143);
1144
1145/**
1146 *  @ingroup CPUContext
1147 *  This routine is generally used only to restart self in an
1148 *  efficient manner.  It may simply be a label in @ref _CPU_Context_switch.
1149 *
1150 *  @param[in] new_context points to the context to be restored.
1151 *
1152 *  @note May be unnecessary to reload some registers.
1153 *
1154 *  Port Specific Information:
1155 *
1156 *  XXX document implementation including references if appropriate
1157 */
1158void _CPU_Context_restore(
1159  Context_Control *new_context
1160) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
1161
1162/**
1163 *  @ingroup CPUContext
1164 *  This routine saves the floating point context passed to it.
1165 *
1166 *  @param[in] fp_context_ptr is a pointer to a pointer to a floating
1167 *  point context area
1168 *
1169 *  @return on output @a *fp_context_ptr will contain the address that
1170 *  should be used with @ref _CPU_Context_restore_fp to restore this context.
1171 *
1172 *  Port Specific Information:
1173 *
1174 *  XXX document implementation including references if appropriate
1175 */
1176void _CPU_Context_save_fp(
1177  Context_Control_fp **fp_context_ptr
1178);
1179
1180/**
1181 *  @ingroup CPUContext
1182 *  This routine restores the floating point context passed to it.
1183 *
1184 *  @param[in] fp_context_ptr is a pointer to a pointer to a floating
1185 *  point context area to restore
1186 *
1187 *  @return on output @a *fp_context_ptr will contain the address that
1188 *  should be used with @ref _CPU_Context_save_fp to save this context.
1189 *
1190 *  Port Specific Information:
1191 *
1192 *  XXX document implementation including references if appropriate
1193 */
1194void _CPU_Context_restore_fp(
1195  Context_Control_fp **fp_context_ptr
1196);
1197
1198/**
1199 *  @ingroup CPUEndian
1200 *  The following routine swaps the endian format of an unsigned int.
1201 *  It must be static because it is referenced indirectly.
1202 *
1203 *  This version will work on any processor, but if there is a better
1204 *  way for your CPU PLEASE use it.  The most common way to do this is to:
1205 *
1206 *     swap least significant two bytes with 16-bit rotate
1207 *     swap upper and lower 16-bits
1208 *     swap most significant two bytes with 16-bit rotate
1209 *
1210 *  Some CPUs have special instructions which swap a 32-bit quantity in
1211 *  a single instruction (e.g. i486).  It is probably best to avoid
1212 *  an "endian swapping control bit" in the CPU.  One good reason is
1213 *  that interrupts would probably have to be disabled to ensure that
1214 *  an interrupt does not try to access the same "chunk" with the wrong
1215 *  endian.  Another good reason is that on some CPUs, the endian bit
1216 *  endianness for ALL fetches -- both code and data -- so the code
1217 *  will be fetched incorrectly.
1218 *
1219 *  @param[in] value is the value to be swapped
1220 *  @return the value after being endian swapped
1221 *
1222 *  Port Specific Information:
1223 *
1224 *  XXX document implementation including references if appropriate
1225 */
1226static inline uint32_t CPU_swap_u32(
1227  uint32_t value
1228)
1229{
1230  uint32_t byte1, byte2, byte3, byte4, swapped;
1231
1232  byte4 = (value >> 24) & 0xff;
1233  byte3 = (value >> 16) & 0xff;
1234  byte2 = (value >> 8)  & 0xff;
1235  byte1 =  value        & 0xff;
1236
1237  swapped = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
1238  return swapped;
1239}
1240
1241/**
1242 *  @ingroup CPUEndian
1243 *  This routine swaps a 16 bir quantity.
1244 *
1245 *  @param[in] value is the value to be swapped
1246 *  @return the value after being endian swapped
1247 */
1248static inline uint16_t CPU_swap_u16(uint16_t v)
1249{
1250    return v << 8 | v >> 8;
1251}
1252
1253#ifdef __cplusplus
1254}
1255#endif
1256
1257#endif
Note: See TracBrowser for help on using the repository browser.