source: rtems/cpukit/score/cpu/avr/rtems/score/cpu.h @ cdfe85a7

4.104.115
Last change on this file since cdfe85a7 was cdfe85a7, checked in by Joel Sherrill <joel.sherrill@…>, on 08/11/09 at 17:03:01

2009-08-11 Josh Switnicki <josh.switnicki@…>

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