RTEMS  5.0.0
cpu.h
Go to the documentation of this file.
1 
7 /*
8  * This include file contains macros pertaining to the Opencores
9  * or1k processor family.
10  *
11  * COPYRIGHT (c) 2014 Hesham ALMatary <heshamelmatary@gmail.com>
12  * COPYRIGHT (c) 1989-1999.
13  * On-Line Applications Research Corporation (OAR).
14  *
15  * The license and distribution terms for this file may be
16  * found in the file LICENSE in this distribution or at
17  * http://www.rtems.org/license/LICENSE.
18  *
19  * This file adapted from no_cpu example of the RTEMS distribution.
20  * The body has been modified for the Opencores OR1k implementation by
21  * Chris Ziomkowski. <chris@asics.ws>
22  *
23  */
24 
25 #ifndef _OR1K_CPU_H
26 #define _OR1K_CPU_H
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 
33 #include <rtems/score/or1k.h> /* pick up machine definitions */
35 #include <rtems/score/basedefs.h>
36 #ifndef ASM
37 #include <rtems/bspIo.h>
38 #include <stdint.h>
39 #include <stdio.h> /* for printk */
40 #endif
41 
42 /* conditional compilation parameters */
43 
44 /*
45  * Does the RTEMS invoke the user's ISR with the vector number and
46  * a pointer to the saved interrupt frame (1) or just the vector
47  * number (0)?
48  *
49  */
50 
51 #define CPU_ISR_PASSES_FRAME_POINTER TRUE
52 
53 /*
54  * Does the CPU have hardware floating point?
55  *
56  * If TRUE, then the RTEMS_FLOATING_POINT task attribute is supported.
57  * If FALSE, then the RTEMS_FLOATING_POINT task attribute is ignored.
58  *
59  * If there is a FP coprocessor such as the i387 or mc68881, then
60  * the answer is TRUE.
61  *
62  * The macro name "OR1K_HAS_FPU" should be made CPU specific.
63  * It indicates whether or not this CPU model has FP support. For
64  * example, it would be possible to have an i386_nofp CPU model
65  * which set this to false to indicate that you have an i386 without
66  * an i387 and wish to leave floating point support out of RTEMS.
67  *
68  * The CPU_SOFTWARE_FP is used to indicate whether or not there
69  * is software implemented floating point that must be context
70  * switched. The determination of whether or not this applies
71  * is very tool specific and the state saved/restored is also
72  * compiler specific.
73  *
74  * Or1k Specific Information:
75  *
76  * At this time there are no implementations of Or1k that are
77  * expected to implement floating point. More importantly, the
78  * floating point architecture is expected to change significantly
79  * before such chips are fabricated.
80  */
81 
82 #define CPU_HARDWARE_FP FALSE
83 #define CPU_SOFTWARE_FP FALSE
84 
85 /*
86  * Are all tasks RTEMS_FLOATING_POINT tasks implicitly?
87  *
88  * If TRUE, then the RTEMS_FLOATING_POINT task attribute is assumed.
89  * If FALSE, then the RTEMS_FLOATING_POINT task attribute is followed.
90  *
91  * If CPU_HARDWARE_FP is FALSE, then this should be FALSE as well.
92  *
93  */
94 
95 #define CPU_ALL_TASKS_ARE_FP FALSE
96 
97 /*
98  * Should the IDLE task have a floating point context?
99  *
100  * If TRUE, then the IDLE task is created as a RTEMS_FLOATING_POINT task
101  * and it has a floating point context which is switched in and out.
102  * If FALSE, then the IDLE task does not have a floating point context.
103  *
104  * Setting this to TRUE negatively impacts the time required to preempt
105  * the IDLE task from an interrupt because the floating point context
106  * must be saved as part of the preemption.
107  *
108  */
109 
110 #define CPU_IDLE_TASK_IS_FP FALSE
111 
112 /*
113  * Should the saving of the floating point registers be deferred
114  * until a context switch is made to another different floating point
115  * task?
116  *
117  * If TRUE, then the floating point context will not be stored until
118  * necessary. It will remain in the floating point registers and not
119  * disturned until another floating point task is switched to.
120  *
121  * If FALSE, then the floating point context is saved when a floating
122  * point task is switched out and restored when the next floating point
123  * task is restored. The state of the floating point registers between
124  * those two operations is not specified.
125  *
126  * If the floating point context does NOT have to be saved as part of
127  * interrupt dispatching, then it should be safe to set this to TRUE.
128  *
129  * Setting this flag to TRUE results in using a different algorithm
130  * for deciding when to save and restore the floating point context.
131  * The deferred FP switch algorithm minimizes the number of times
132  * the FP context is saved and restored. The FP context is not saved
133  * until a context switch is made to another, different FP task.
134  * Thus in a system with only one FP task, the FP context will never
135  * be saved or restored.
136  *
137  */
138 
139 #define CPU_USE_DEFERRED_FP_SWITCH TRUE
140 
141 #define CPU_ENABLE_ROBUST_THREAD_DISPATCH FALSE
142 
143 /*
144  * Does the stack grow up (toward higher addresses) or down
145  * (toward lower addresses)?
146  *
147  * If TRUE, then the grows upward.
148  * If FALSE, then the grows toward smaller addresses.
149  *
150  */
151 
152 #define CPU_STACK_GROWS_UP FALSE
153 
154 /* FIXME: Is this the right value? */
155 #define CPU_CACHE_LINE_BYTES 32
156 
157 #define CPU_STRUCTURE_ALIGNMENT RTEMS_ALIGNED( CPU_CACHE_LINE_BYTES )
158 
159 /*
160  * The following defines the number of bits actually used in the
161  * interrupt field of the task mode. How those bits map to the
162  * CPU interrupt levels is defined by the routine _CPU_ISR_Set_level().
163  *
164  */
165 
166 #define CPU_MODES_INTERRUPT_MASK 0x00000001
167 
168 /*
169  * Processor defined structures required for cpukit/score.
170  */
171 
172 
173 /*
174  * Contexts
175  *
176  * Generally there are 2 types of context to save.
177  * 1. Interrupt registers to save
178  * 2. Task level registers to save
179  *
180  * This means we have the following 3 context items:
181  * 1. task level context stuff:: Context_Control
182  * 2. floating point task stuff:: Context_Control_fp
183  * 3. special interrupt level context :: Context_Control_interrupt
184  *
185  * On some processors, it is cost-effective to save only the callee
186  * preserved registers during a task context switch. This means
187  * that the ISR code needs to save those registers which do not
188  * persist across function calls. It is not mandatory to make this
189  * distinctions between the caller/callee saves registers for the
190  * purpose of minimizing context saved during task switch and on interrupts.
191  * If the cost of saving extra registers is minimal, simplicity is the
192  * choice. Save the same context on interrupt entry as for tasks in
193  * this case.
194  *
195  * Additionally, if gdb is to be made aware of RTEMS tasks for this CPU, then
196  * care should be used in designing the context area.
197  *
198  * On some CPUs with hardware floating point support, the Context_Control_fp
199  * structure will not be used or it simply consist of an array of a
200  * fixed number of bytes. This is done when the floating point context
201  * is dumped by a "FP save context" type instruction and the format
202  * is not really defined by the CPU. In this case, there is no need
203  * to figure out the exact format -- only the size. Of course, although
204  * this is enough information for RTEMS, it is probably not enough for
205  * a debugger such as gdb. But that is another problem.
206  *
207  *
208  */
209 #ifndef ASM
210 #ifdef OR1K_64BIT_ARCH
211 #define or1kreg uint64_t
212 #else
213 #define or1kreg uint32_t
214 #endif
215 
216 typedef struct {
217  uint32_t r1; /* Stack pointer */
218  uint32_t r2; /* Frame pointer */
219  uint32_t r3;
220  uint32_t r4;
221  uint32_t r5;
222  uint32_t r6;
223  uint32_t r7;
224  uint32_t r8;
225  uint32_t r9;
226  uint32_t r10;
227  uint32_t r11;
228  uint32_t r12;
229  uint32_t r13;
230  uint32_t r14;
231  uint32_t r15;
232  uint32_t r16;
233  uint32_t r17;
234  uint32_t r18;
235  uint32_t r19;
236  uint32_t r20;
237  uint32_t r21;
238  uint32_t r22;
239  uint32_t r23;
240  uint32_t r24;
241  uint32_t r25;
242  uint32_t r26;
243  uint32_t r27;
244  uint32_t r28;
245  uint32_t r29;
246  uint32_t r30;
247  uint32_t r31;
248 
249  uint32_t sr; /* Current supervision register non persistent values */
250  uint32_t epcr;
251  uint32_t eear;
252  uint32_t esr;
254 
255 #define _CPU_Context_Get_SP( _context ) \
256  (_context)->r1
257 
258 typedef struct {
260  double some_float_register;
262 
264 
265 /*
266  * The size of the floating point context area. On some CPUs this
267  * will not be a "sizeof" because the format of the floating point
268  * area is not defined -- only the size is. This is usually on
269  * CPUs with a "floating point save context" instruction.
270  *
271  * Or1k Specific Information:
272  *
273  */
274 
275 #define CPU_CONTEXT_FP_SIZE 0
276 
277 /*
278  * Amount of extra stack (above minimum stack size) required by
279  * MPCI receive server thread. Remember that in a multiprocessor
280  * system this thread must exist and be able to process all directives.
281  *
282  */
283 
284 #define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
285 
286 /*
287  * Should be large enough to run all RTEMS tests. This insures
288  * that a "reasonable" small application should not have any problems.
289  *
290  */
291 
292 #define CPU_STACK_MINIMUM_SIZE 4096
293 
294 /*
295  * CPU's worst alignment requirement for data types on a byte boundary. This
296  * alignment does not take into account the requirements for the stack.
297  *
298  */
299 
300 #define CPU_ALIGNMENT 8
301 
302 /*
303  * This is defined if the port has a special way to report the ISR nesting
304  * level. Most ports maintain the variable _ISR_Nest_level.
305  */
306 #define CPU_PROVIDES_ISR_IS_IN_PROGRESS FALSE
307 
315 #define CPU_SIZEOF_POINTER 4
316 
317 /*
318  * This number corresponds to the byte alignment requirement for the
319  * heap handler. This alignment requirement may be stricter than that
320  * for the data types alignment specified by CPU_ALIGNMENT. It is
321  * common for the heap to follow the same alignment requirement as
322  * CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict enough for the heap,
323  * then this should be set to CPU_ALIGNMENT.
324  *
325  * NOTE: This does not have to be a power of 2 although it should be
326  * a multiple of 2 greater than or equal to 2. The requirement
327  * to be a multiple of 2 is because the heap uses the least
328  * significant field of the front and back flags to indicate
329  * that a block is in use or free. So you do not want any odd
330  * length blocks really putting length data in that bit.
331  *
332  * On byte oriented architectures, CPU_HEAP_ALIGNMENT normally will
333  * have to be greater or equal to than CPU_ALIGNMENT to ensure that
334  * elements allocated from the heap meet all restrictions.
335  *
336  */
337 
338 #define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
339 
340 /*
341  * This number corresponds to the byte alignment requirement for the
342  * stack. This alignment requirement may be stricter than that for the
343  * data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
344  * is strict enough for the stack, then this should be set to 0.
345  *
346  * NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
347  *
348  */
349 
350 #define CPU_STACK_ALIGNMENT 0
351 
352 #define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
353 
354 /* ISR handler macros */
355 
356 /*
357  * Support routine to initialize the RTEMS vector table after it is allocated.
358  *
359  * NO_CPU Specific Information:
360  *
361  * XXX document implementation including references if appropriate
362  */
363 
364 #define _CPU_Initialize_vectors()
365 
366 /*
367  * Disable all interrupts for an RTEMS critical section. The previous
368  * level is returned in _level.
369  *
370  */
371 
372 static inline uint32_t or1k_interrupt_disable( void )
373 {
374  uint32_t sr;
375  sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
376 
377  _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~CPU_OR1K_SPR_SR_IEE));
378 
379  return sr;
380 }
381 
382 static inline void or1k_interrupt_enable(uint32_t level)
383 {
384  uint32_t sr;
385 
386  /* Enable interrupts and restore rs */
387  sr = level | CPU_OR1K_SPR_SR_IEE | CPU_OR1K_SPR_SR_TEE;
388  _OR1K_mtspr(CPU_OR1K_SPR_SR, sr);
389 
390 }
391 
392 #define _CPU_ISR_Disable( _level ) \
393  _level = or1k_interrupt_disable()
394 
395 
396 /*
397  * Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
398  * This indicates the end of an RTEMS critical section. The parameter
399  * _level is not modified.
400  *
401  */
402 
403 #define _CPU_ISR_Enable( _level ) \
404  or1k_interrupt_enable( _level )
405 
406 /*
407  * This temporarily restores the interrupt to _level before immediately
408  * disabling them again. This is used to divide long RTEMS critical
409  * sections into two or more parts. The parameter _level is not
410  * modified.
411  *
412  */
413 
414 #define _CPU_ISR_Flash( _level ) \
415  do{ \
416  _CPU_ISR_Enable( _level ); \
417  _OR1K_mtspr(CPU_OR1K_SPR_SR, (_level & ~CPU_OR1K_SPR_SR_IEE)); \
418  } while(0)
419 
421 {
422  return ( level & CPU_OR1K_SPR_SR ) != 0;
423 }
424 
425 /*
426  * Map interrupt level in task mode onto the hardware that the CPU
427  * actually provides. Currently, interrupt levels which do not
428  * map onto the CPU in a generic fashion are undefined. Someday,
429  * it would be nice if these were "mapped" by the application
430  * via a callout. For example, m68k has 8 levels 0 - 7, levels
431  * 8 - 255 would be available for bsp/application specific meaning.
432  * This could be used to manage a programmable interrupt controller
433  * via the rtems_task_mode directive.
434  *
435  * The get routine usually must be implemented as a subroutine.
436  *
437  */
438 
439 void _CPU_ISR_Set_level( uint32_t level );
440 
441 uint32_t _CPU_ISR_Get_level( void );
442 
443 /* end of ISR handler macros */
444 
445 /* Context handler macros */
446 
447 #define OR1K_FAST_CONTEXT_SWITCH_ENABLED FALSE
448 /*
449  * Initialize the context to a state suitable for starting a
450  * task after a context restore operation. Generally, this
451  * involves:
452  *
453  * - setting a starting address
454  * - preparing the stack
455  * - preparing the stack and frame pointers
456  * - setting the proper interrupt level in the context
457  * - initializing the floating point context
458  *
459  * This routine generally does not set any unnecessary register
460  * in the context. The state of the "general data" registers is
461  * undefined at task start time.
462  *
463  * NOTE: This is_fp parameter is TRUE if the thread is to be a floating
464  * point thread. This is typically only used on CPUs where the
465  * FPU may be easily disabled by software such as on the SPARC
466  * where the PSR contains an enable FPU bit.
467  *
468  */
469 
489  void *stack_area_begin,
490  size_t stack_area_size,
491  uint32_t new_level,
492  void (*entry_point)( void ),
493  bool is_fp,
494  void *tls_area
495 );
496 
497 /*
498  * This routine is responsible for somehow restarting the currently
499  * executing task. If you are lucky, then all that is necessary
500  * is restoring the context. Otherwise, there will need to be
501  * a special assembly routine which does something special in this
502  * case. Context_Restore should work most of the time. It will
503  * not work if restarting self conflicts with the stack frame
504  * assumptions of restoring a context.
505  *
506  */
507 
508 #define _CPU_Context_Restart_self( _the_context ) \
509  _CPU_Context_restore( (_the_context) );
510 
511 /*
512  * This routine is responsible to initialize the FP context.
513  *
514  * The FP area pointer is passed by reference to allow the initial pointer
515  * into a floating point context area (used to save the floating point
516  * context) to be at an arbitrary place in the floating point context area.
517  *
518  * This is necessary because some FP units are designed to have
519  * their context saved as a stack which grows into lower addresses.
520  * Other FP units can be saved by simply moving registers into offsets
521  * from the base of the context area. Finally some FP units provide
522  * a "dump context" instruction which could fill in from high to low
523  * or low to high based on the whim of the CPU designers.
524  */
525 #define _CPU_Context_Initialize_fp( _fp_area_p ) \
526  memset( *( _fp_area_p ), 0, CPU_CONTEXT_FP_SIZE )
527 
528 /* end of Context handler macros */
529 
530 /* Fatal Error manager macros */
531 
532 /*
533  * This routine copies _error into a known place -- typically a stack
534  * location or a register, optionally disables interrupts, and
535  * halts/stops the CPU.
536  *
537  */
538 
539 #include <inttypes.h>
540 
541 #define _CPU_Fatal_halt(_source, _error ) \
542  printk("Fatal Error %d.%" PRId32 " Halted\n",_source, _error); \
543  _OR1KSIM_CPU_Halt(); \
544  for(;;)
545 
546 /* end of Fatal Error manager macros */
547 
548 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
549 
550 #endif /* ASM */
551 
552 #define CPU_SIZEOF_POINTER 4
553 
554 #define CPU_MAXIMUM_PROCESSORS 32
555 
556 #ifndef ASM
557 typedef struct {
558  uint32_t r[32];
559 
560  /* The following registers must be saved if we have
561  fast context switch disabled and nested interrupt
562  levels are enabled.
563  */
564 #if !OR1K_FAST_CONTEXT_SWITCH_ENABLED
565  uint32_t epcr; /* exception PC register */
566  uint32_t eear; /* exception effective address register */
567  uint32_t esr; /* exception supervision register */
568 #endif
569 
571 
578 
579 
580 /* end of Priority handler macros */
581 
582 /* functions */
583 
584 /*
585  * _CPU_Initialize
586  *
587  * This routine performs CPU dependent initialization.
588  *
589  */
590 
591 void _CPU_Initialize(
592  void
593 );
594 
595 typedef void ( *CPU_ISR_raw_handler )( uint32_t, CPU_Exception_frame * );
596 
598  uint32_t vector,
599  CPU_ISR_raw_handler new_handler,
600  CPU_ISR_raw_handler *old_handler
601 );
602 
603 typedef void ( *CPU_ISR_handler )( uint32_t );
604 
606  uint32_t vector,
607  CPU_ISR_handler new_handler,
608  CPU_ISR_handler *old_handler
609 )
610 {
612  vector,
613  (CPU_ISR_raw_handler) new_handler,
614  (CPU_ISR_raw_handler *) old_handler
615  );
616 }
617 
618 void *_CPU_Thread_Idle_body( uintptr_t ignored );
619 
620 /*
621  * _CPU_Context_switch
622  *
623  * This routine switches from the run context to the heir context.
624  *
625  * Or1k Specific Information:
626  *
627  * Please see the comments in the .c file for a description of how
628  * this function works. There are several things to be aware of.
629  */
630 
632  Context_Control *run,
633  Context_Control *heir
634 );
635 
636 /*
637  * _CPU_Context_restore
638  *
639  * This routine is generally used only to restart self in an
640  * efficient manner. It may simply be a label in _CPU_Context_switch.
641  *
642  * NOTE: May be unnecessary to reload some registers.
643  *
644  */
645 
647  Context_Control *new_context
649 
650 /*
651  * _CPU_Context_save_fp
652  *
653  * This routine saves the floating point context passed to it.
654  *
655  */
656 
658  void **fp_context_ptr
659 );
660 
661 /*
662  * _CPU_Context_restore_fp
663  *
664  * This routine restores the floating point context passed to it.
665  *
666  */
667 
669  void **fp_context_ptr
670 );
671 
672 /* The following routine swaps the endian format of an unsigned int.
673  * It must be static because it is referenced indirectly.
674  *
675  * This version will work on any processor, but if there is a better
676  * way for your CPU PLEASE use it. The most common way to do this is to:
677  *
678  * swap least significant two bytes with 16-bit rotate
679  * swap upper and lower 16-bits
680  * swap most significant two bytes with 16-bit rotate
681  *
682  * Some CPUs have special instructions which swap a 32-bit quantity in
683  * a single instruction (e.g. i486). It is probably best to avoid
684  * an "endian swapping control bit" in the CPU. One good reason is
685  * that interrupts would probably have to be disabled to insure that
686  * an interrupt does not try to access the same "chunk" with the wrong
687  * endian. Another good reason is that on some CPUs, the endian bit
688  * endianness for ALL fetches -- both code and data -- so the code
689  * will be fetched incorrectly.
690  *
691  */
692 
693 static inline unsigned int CPU_swap_u32(
694  unsigned int value
695 )
696 {
697  uint32_t byte1, byte2, byte3, byte4, swapped;
698 
699  byte4 = (value >> 24) & 0xff;
700  byte3 = (value >> 16) & 0xff;
701  byte2 = (value >> 8) & 0xff;
702  byte1 = value & 0xff;
703 
704  swapped = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
705  return( swapped );
706 }
707 
708 #define CPU_swap_u16( value ) \
709  (((value&0xff) << 8) | ((value >> 8)&0xff))
710 
711 typedef uint32_t CPU_Counter_ticks;
712 
713 uint32_t _CPU_Counter_frequency( void );
714 
715 CPU_Counter_ticks _CPU_Counter_read( void );
716 
717 static inline CPU_Counter_ticks _CPU_Counter_difference(
718  CPU_Counter_ticks second,
719  CPU_Counter_ticks first
720 )
721 {
722  return second - first;
723 }
724 
726 typedef uintptr_t CPU_Uint32ptr;
727 
728 #endif /* ASM */
729 
730 #ifdef __cplusplus
731 }
732 #endif
733 
734 #endif
void _CPU_Exception_frame_print(const CPU_Exception_frame *frame)
Prints the exception frame via printk().
Definition: vectorexceptions.c:45
void _CPU_ISR_Set_level(uint32_t level)
Sets the hardware interrupt level by the level value.
Definition: cpu.c:57
CPU_Counter_ticks _CPU_Counter_read(void)
Returns the current CPU counter value.
Definition: system-clocks.c:117
Thread register context.
Definition: cpu.h:196
void * _CPU_Thread_Idle_body(uintptr_t ignored)
Definition: idle-mcf5272.c:20
#define RTEMS_INLINE_ROUTINE
Definition: basedefs.h:65
void _CPU_Context_restore_fp(Context_Control_fp **fp_context_ptr)
Definition: cpu.c:207
Interrupt stack frame (ISF).
Definition: cpu.h:306
void _CPU_Context_Initialize(Context_Control *context, void *stack_area_begin, size_t stack_area_size, uint32_t new_level, void(*entry_point)(void), bool is_fp, void *tls_area)
Initializes the CPU context.
Definition: epiphany-context-initialize.c:40
void _CPU_Context_switch(Context_Control *run, Context_Control *heir)
CPU switch context.
Definition: cpu_asm.c:91
OR1K utility.
void _CPU_Initialize(void)
CPU initialization.
Definition: cpu.c:45
SPARC basic context.
Definition: cpu.h:242
Provide printf() PRIxxx Constante Beyond Standards.
uint32_t CPU_Counter_ticks
Unsigned integer type for CPU counter values.
Definition: cpu.h:1202
#define RTEMS_NO_RETURN
Definition: basedefs.h:101
Interface to Kernel Print Methods.
uint32_t _CPU_ISR_Get_level(void)
Definition: cpu.c:88
unsigned context
Definition: tlb.h:108
RTEMS_INLINE_ROUTINE void _CPU_ISR_install_raw_handler(uint32_t vector, CPU_ISR_raw_handler new_handler, CPU_ISR_raw_handler *old_handler)
SPARC specific raw ISR installer.
Definition: cpu.h:703
bool _CPU_ISR_Is_enabled(uint32_t level)
Returns true if interrupts are enabled in the specified ISR level, otherwise returns false...
Definition: cpu.h:381
void _CPU_Context_restore(Context_Control *new_context) RTEMS_NO_RETURN
Definition: cpu_asm.c:111
uintptr_t CPU_Uint32ptr
Definition: cpu.h:668
uint32_t _CPU_Counter_frequency(void)
Returns the current CPU counter frequency in Hz.
Definition: system-clocks.c:112
Basic Definitions.
RTEMS_INLINE_ROUTINE void _CPU_ISR_install_vector(uint32_t vector, CPU_ISR_handler new_handler, CPU_ISR_handler *old_handler)
SPARC specific RTEMS ISR installer.
Definition: cpu.h:605
void _CPU_Context_save_fp(Context_Control_fp **fp_context_ptr)
Definition: cpu.c:198
The set of registers that specifies the complete processor state.
Definition: cpu.h:635