source: rtems/bsps/include/bsp/irq-generic.h @ 0d5e41a

Last change on this file since 0d5e41a was 0d5e41a, checked in by Sebastian Huber <sebastian.huber@…>, on 12/01/22 at 07:55:24

bsps/irq: Add bsp_interrupt_get_dispatch_table_slot()

Update #4769.

  • Property mode set to 100644
File size: 21.0 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup bsp_interrupt
7 *
8 * @brief This header file provides interfaces of the generic interrupt
9 *   controller support.
10 */
11
12/*
13 * Copyright (C) 2016 Chris Johns <chrisj@rtems.org>
14 *
15 * Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 *    notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 *    notice, this list of conditions and the following disclaimer in the
24 *    documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39/*
40 * The API is based on concepts of Pavel Pisa, Till Straumann and Eric Valette.
41 */
42
43#ifndef LIBBSP_SHARED_IRQ_GENERIC_H
44#define LIBBSP_SHARED_IRQ_GENERIC_H
45
46#include <stdbool.h>
47
48#include <rtems/irq-extension.h>
49#include <rtems/score/assert.h>
50
51#ifdef RTEMS_SMP
52  #include <rtems/score/atomic.h>
53#endif
54
55#include <bsp/irq.h>
56
57#ifdef __cplusplus
58extern "C" {
59#endif /* __cplusplus */
60
61#if !defined(BSP_INTERRUPT_VECTOR_COUNT)
62  #error "BSP_INTERRUPT_VECTOR_COUNT shall be defined"
63#endif
64
65#if defined(BSP_INTERRUPT_USE_INDEX_TABLE) && !defined(BSP_INTERRUPT_DISPATCH_TABLE_SIZE)
66  #error "if you define BSP_INTERRUPT_USE_INDEX_TABLE, you have to define BSP_INTERRUPT_DISPATCH_TABLE_SIZE etc. as well"
67#endif
68
69#ifndef BSP_INTERRUPT_DISPATCH_TABLE_SIZE
70  #define BSP_INTERRUPT_DISPATCH_TABLE_SIZE BSP_INTERRUPT_VECTOR_COUNT
71#endif
72
73#define bsp_interrupt_assert(e) _Assert(e)
74
75/**
76 * @brief Each member of this table references the first installed entry at the
77 *   corresponding interrupt vector or is NULL.
78 */
79extern rtems_interrupt_entry *bsp_interrupt_dispatch_table[];
80
81#ifdef BSP_INTERRUPT_USE_INDEX_TABLE
82  #if BSP_INTERRUPT_DISPATCH_TABLE_SIZE < 0x100
83    typedef uint8_t bsp_interrupt_dispatch_index_type;
84  #elif BSP_INTERRUPT_DISPATCH_TABLE_SIZE < 0x10000
85    typedef uint16_t bsp_interrupt_dispatch_index_type;
86  #else
87    typedef uint32_t bsp_interrupt_dispatch_index_type;
88  #endif
89  extern bsp_interrupt_dispatch_index_type bsp_interrupt_dispatch_index_table [];
90#endif
91
92static inline rtems_vector_number bsp_interrupt_dispatch_index(
93  rtems_vector_number vector
94)
95{
96  #ifdef BSP_INTERRUPT_USE_INDEX_TABLE
97    return bsp_interrupt_dispatch_index_table [vector];
98  #else
99    return vector;
100  #endif
101}
102
103/**
104 * @defgroup bsp_interrupt BSP Interrupt Support
105 *
106 * @ingroup RTEMSBSPsShared
107 *
108 * @brief Generic BSP Interrupt Support
109 *
110 * The BSP interrupt support manages a sequence of interrupt vector numbers
111 * greater than or equal to zero and less than @ref BSP_INTERRUPT_VECTOR_COUNT
112 * It provides methods to install, remove, and @ref
113 * bsp_interrupt_handler_dispatch() "dispatch" interrupt entries for each
114 * vector number.  It implements parts of the RTEMS interrupt manager.
115 *
116 * The entry points to a list of interrupt entries are stored in a table
117 * (= dispatch table).
118 *
119 * You have to configure the BSP interrupt support in the <bsp/irq.h> file
120 * for each BSP.  For a minimum configuration you have to provide
121 * @ref BSP_INTERRUPT_VECTOR_COUNT.
122 *
123 * For boards with small memory requirements you can define
124 * @ref BSP_INTERRUPT_USE_INDEX_TABLE.  With an enabled index table the
125 * dispatch table will be accessed via a small index table.  You can define the
126 * size of the dispatch table with @ref BSP_INTERRUPT_DISPATCH_TABLE_SIZE.
127 *
128 * You have to provide some special routines in your BSP (follow the links for
129 * the details):
130 * - bsp_interrupt_facility_initialize()
131 * - bsp_interrupt_vector_enable()
132 * - bsp_interrupt_vector_disable()
133 * - bsp_interrupt_handler_default()
134 *
135 * Optionally, the BSP may define the following macros to customize the vector
136 * installation after installing the first entry and the vector removal before
137 * removing the last entry:
138 * - bsp_interrupt_vector_install()
139 * - bsp_interrupt_vector_remove()
140 *
141 * The following now deprecated functions are provided for backward
142 * compatibility:
143 * - BSP_get_current_rtems_irq_handler()
144 * - BSP_install_rtems_irq_handler()
145 * - BSP_install_rtems_shared_irq_handler()
146 * - BSP_remove_rtems_irq_handler()
147 * - BSP_rtems_irq_mngt_set()
148 * - BSP_rtems_irq_mngt_get()
149 *
150 * @{
151 */
152
153#ifdef BSP_INTERRUPT_CUSTOM_VALID_VECTOR
154  bool bsp_interrupt_is_valid_vector(rtems_vector_number vector);
155#else
156  /**
157   * @brief Returns true if the interrupt vector with number @a vector is
158   * valid.
159   */
160  static inline bool bsp_interrupt_is_valid_vector(rtems_vector_number vector)
161  {
162    return vector < (rtems_vector_number) BSP_INTERRUPT_VECTOR_COUNT;
163  }
164#endif
165
166/**
167 * @brief Default interrupt handler.
168 *
169 * This routine will be called from bsp_interrupt_handler_dispatch() with the
170 * current vector number @a vector when the handler list for this vector is
171 * empty or the vector number is out of range.
172 *
173 * @note This function must cope with arbitrary vector numbers @a vector.
174 */
175void bsp_interrupt_handler_default(rtems_vector_number vector);
176
177/**
178 * @brief Initialize BSP interrupt support.
179 *
180 * You must call this function before you can install, remove and dispatch
181 * interrupt entries.  There is no protection against concurrent
182 * initialization.  This function must be called at most once.  The BSP
183 * specific bsp_interrupt_facility_initialize() function will be called after
184 * all internals are initialized.  If the BSP specific initialization fails,
185 * then this is a fatal error.  The fatal error source is
186 * RTEMS_FATAL_SOURCE_BSP and the fatal error code is
187 * BSP_FATAL_INTERRUPT_INITIALIZATION.
188 */
189void bsp_interrupt_initialize(void);
190
191/**
192 * @brief BSP specific initialization.
193 *
194 * This routine will be called form bsp_interrupt_initialize() and shall do the
195 * following:
196 * - Initialize the facilities that call bsp_interrupt_handler_dispatch().  For
197 * example on PowerPC the external exception handler.
198 * - Initialize the interrupt controller.  You shall set the interrupt
199 * controller in a state such that interrupts are disabled for all vectors.
200 * The vectors will be enabled with your bsp_interrupt_vector_enable() function
201 * and disabled via your bsp_interrupt_vector_disable() function.  These
202 * functions have to work afterwards.
203 */
204void bsp_interrupt_facility_initialize(void);
205
206/**
207 * @brief Gets the attributes of the interrupt vector.
208 *
209 * @param vector is the interrupt vector number.  It shall be valid.
210 *
211 * @param[out] attributes is the pointer to an rtems_interrupt_attributes
212 *   object.  When the function call is successful, the attributes of the
213 *   interrupt vector will be stored in this object.  The pointer shall not be
214 *   NULL.  The object shall be cleared to zero by the caller.
215 *
216 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
217 */
218rtems_status_code bsp_interrupt_get_attributes(
219  rtems_vector_number         vector,
220  rtems_interrupt_attributes *attributes
221);
222
223/**
224 * @brief Checks if the interrupt is enabled.
225 *
226 * The function checks if the interrupt associated with the interrupt vector
227 * specified by ``vector`` was enabled for the processor executing the function
228 * call at some time point during the call.
229 *
230 * @param vector is the interrupt vector number.  It shall be valid.
231 *
232 * @param[out] enabled is the pointer to a ``bool`` object.  It shall not be
233 *   ``NULL``.  When the function call is successful, the enabled status of
234 *   the interrupt associated with the interrupt vector specified by ``vector``
235 *   will be stored in this object.  When the interrupt was enabled for the
236 *   processor executing the function call at some time point during the call,
237 *   the object will be set to true, otherwise to false.
238 *
239 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
240 */
241rtems_status_code bsp_interrupt_vector_is_enabled(
242  rtems_vector_number vector,
243  bool               *enabled
244);
245
246/**
247 * @brief Enables the interrupt vector.
248 *
249 * This function shall enable the vector at the corresponding facility (in most
250 * cases the interrupt controller).  It will be called then the first entry
251 * is installed for the vector in rtems_interrupt_entry_install() for example.
252 *
253 * @note The implementation should use
254 * bsp_interrupt_assert( bsp_interrupt_is_valid_vector( vector ) ) to validate
255 * the vector number in ::RTEMS_DEBUG configurations.
256 *
257 * @param vector is the interrupt vector number.
258 *
259 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
260 *
261 * @retval ::RTEMS_UNSATISFIED The request to enable the interrupt vector has
262 *   not been satisfied.
263 */
264rtems_status_code bsp_interrupt_vector_enable( rtems_vector_number vector );
265
266/**
267 * @brief Disables the interrupt vector.
268 *
269 * This function shall disable the vector at the corresponding facility (in
270 * most cases the interrupt controller).  It will be called then the last
271 * entry is removed for the vector in rtems_interrupt_entry_remove() for
272 * example.
273 *
274 * @note The implementation should use
275 * bsp_interrupt_assert( bsp_interrupt_is_valid_vector( vector ) ) to validate
276 * the vector number in ::RTEMS_DEBUG configurations.
277 *
278 * @param vector is the interrupt vector number.
279 *
280 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
281 *
282 * @retval ::RTEMS_UNSATISFIED The request to disable the interrupt vector has
283 *   not been satisfied.
284 */
285rtems_status_code bsp_interrupt_vector_disable( rtems_vector_number vector );
286
287/**
288 * @brief Checks if the interrupt is pending.
289 *
290 * The function checks if the interrupt associated with the interrupt vector
291 * specified by ``vector`` was pending for the processor executing the function
292 * call at some time point during the call.
293 *
294 * @param vector is the interrupt vector number.  It shall be valid.
295 *
296 * @param[out] pending is the pointer to a ``bool`` object.  It shall not be
297 *   ``NULL``.  When the function call is successful, the pending status of
298 *   the interrupt associated with the interrupt vector specified by ``vector``
299 *   will be stored in this object.  When the interrupt was pending for the
300 *   processor executing the function call at some time point during the call,
301 *   the object will be set to true, otherwise to false.
302 *
303 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
304 *
305 * @retval ::RTEMS_UNSATISFIED The request to get the pending status has not
306 *   been satisfied.
307 */
308rtems_status_code bsp_interrupt_is_pending(
309  rtems_vector_number vector,
310  bool               *pending
311);
312
313/**
314 * @brief Causes the interrupt vector.
315 *
316 * @param vector is the number of the interrupt vector to cause.  It shall be
317 *   valid.
318 *
319 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
320 *
321 * @retval ::RTEMS_UNSATISFIED The request to cause the interrupt vector has
322 *   not been satisfied.
323 */
324rtems_status_code bsp_interrupt_raise( rtems_vector_number vector );
325
326#if defined(RTEMS_SMP)
327/**
328 * @brief Causes the interrupt vector on the processor.
329 *
330 * @param vector is the number of the interrupt vector to cause.  It shall be
331 *   valid.
332 *
333 * @param cpu_index is the index of the target processor of the interrupt
334 *   vector to cause.  It shall be valid.
335 *
336 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
337 *
338 * @retval ::RTEMS_UNSATISFIED The request to cause the interrupt vector has
339 *   not been satisfied.
340 */
341rtems_status_code bsp_interrupt_raise_on(
342  rtems_vector_number vector,
343  uint32_t            cpu_index
344);
345#endif
346
347/**
348 * @brief Clears the interrupt vector.
349 *
350 * @param vector is the number of the interrupt vector to clear.  It shall be
351 *   valid.
352 *
353 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
354 *
355 * @retval ::RTEMS_UNSATISFIED The request to cause the interrupt vector has
356 *   not been satisfied.
357 */
358rtems_status_code bsp_interrupt_clear( rtems_vector_number vector );
359
360#if defined(RTEMS_SMP)
361/**
362 * @brief Handles a spurious interrupt.
363 *
364 * @param vector is the vector number.
365 */
366void bsp_interrupt_spurious( rtems_vector_number vector );
367#endif
368
369/**
370 * @brief Loads the interrupt entry with atomic acquire semantic.
371 *
372 * @param ptr is the pointer to an ::rtems_interrupt_entry pointer.
373 *
374 * @return Returns the pointer value.
375 */
376static inline rtems_interrupt_entry *bsp_interrupt_entry_load_acquire(
377  rtems_interrupt_entry * const *ptr
378)
379{
380#if defined(RTEMS_SMP)
381  return (rtems_interrupt_entry *) _Atomic_Load_uintptr(
382    (const Atomic_Uintptr *) ptr,
383    ATOMIC_ORDER_ACQUIRE
384  );
385#else
386  return *ptr;
387#endif
388}
389
390/**
391 * @brief Stores the interrupt entry with atomic release semantic.
392 *
393 * @param[out] ptr is the pointer to an ::rtems_interrupt_entry pointer.
394 *
395 * @param value is the pointer value.
396 */
397static inline void bsp_interrupt_entry_store_release(
398  rtems_interrupt_entry **ptr,
399  rtems_interrupt_entry  *value
400)
401{
402#if defined(RTEMS_SMP)
403  _Atomic_Store_uintptr(
404    (Atomic_Uintptr *) ptr,
405    (Atomic_Uintptr) value,
406    ATOMIC_ORDER_RELEASE
407  );
408#else
409  rtems_interrupt_level level;
410
411  rtems_interrupt_local_disable( level );
412  *ptr = value;
413  rtems_interrupt_local_enable( level );
414#endif
415}
416
417/**
418 * @brief Loads the first interrupt entry installed at the interrupt vector.
419 *
420 * @param vector is the vector number.
421 *
422 * @return Returns the first entry or NULL.
423 */
424static inline rtems_interrupt_entry *bsp_interrupt_entry_load_first(
425  rtems_vector_number vector
426)
427{
428  rtems_vector_number index;
429
430  index = bsp_interrupt_dispatch_index( vector );
431
432  return bsp_interrupt_entry_load_acquire(
433    &bsp_interrupt_dispatch_table[ index ]
434  );
435}
436
437/**
438 * @brief Sequentially calls all interrupt handlers of the entry its
439 *   successors.
440 *
441 * In uniprocessor configurations, you can call this function within every
442 * context which can be disabled via rtems_interrupt_local_disable().
443 *
444 * In SMP configurations, you can call this function in every context.
445 *
446 * @param entry is the first entry.
447 */
448static inline void bsp_interrupt_dispatch_entries(
449  const rtems_interrupt_entry *entry
450)
451{
452  do {
453    ( *entry->handler )( entry->arg );
454    entry = bsp_interrupt_entry_load_acquire( &entry->next );
455  } while ( RTEMS_PREDICT_FALSE( entry != NULL ) );
456}
457
458/**
459 * @brief Sequentially calls all interrupt handlers installed at the vector.
460 *
461 * This function does not validate the vector number.  If the vector number is
462 * out of range, then the behaviour is undefined.
463 *
464 * The function assumes that no interrupt entries are installed at the vector.
465 * In this case, no operation is performed.
466 *
467 * In uniprocessor configurations, you can call this function within every
468 * context which can be disabled via rtems_interrupt_local_disable().
469 *
470 * In SMP configurations, you can call this function in every context.
471 *
472 * @param vector is the vector number.
473 */
474static inline void bsp_interrupt_handler_dispatch_unlikely(
475  rtems_vector_number vector
476)
477{
478  const rtems_interrupt_entry *entry;
479
480  entry = bsp_interrupt_entry_load_first( vector );
481
482  if ( RTEMS_PREDICT_FALSE( entry != NULL ) ) {
483    bsp_interrupt_dispatch_entries( entry );
484  }
485}
486
487/**
488 * @brief Sequentially calls all interrupt handlers installed at the vector.
489 *
490 * This function does not validate the vector number.  If the vector number is
491 * out of range, then the behaviour is undefined.
492 *
493 * In uniprocessor configurations, you can call this function within every
494 * context which can be disabled via rtems_interrupt_local_disable().
495 *
496 * In SMP configurations, you can call this function in every context.
497 *
498 * @param vector is the vector number.
499 */
500static inline void bsp_interrupt_handler_dispatch_unchecked(
501  rtems_vector_number vector
502)
503{
504  const rtems_interrupt_entry *entry;
505
506  entry = bsp_interrupt_entry_load_first( vector );
507
508  if ( RTEMS_PREDICT_TRUE( entry != NULL ) ) {
509    bsp_interrupt_dispatch_entries( entry );
510  } else {
511#if defined(RTEMS_SMP)
512    bsp_interrupt_spurious( vector );
513#else
514    bsp_interrupt_handler_default( vector );
515#endif
516  }
517}
518
519/**
520 * @brief Sequentially calls all interrupt handlers installed at the vector.
521 *
522 * If the vector number is out of range or the interrupt entry list is empty,
523 * then bsp_interrupt_handler_default() will be called with the vector number
524 * as argument.
525 *
526 * In uniprocessor configurations, you can call this function within every
527 * context which can be disabled via rtems_interrupt_local_disable().
528 *
529 * In SMP configurations, you can call this function in every context.
530 *
531 * @param vector is the vector number.
532 */
533static inline void bsp_interrupt_handler_dispatch( rtems_vector_number vector )
534{
535  if ( bsp_interrupt_is_valid_vector( vector ) ) {
536    bsp_interrupt_handler_dispatch_unchecked( vector );
537  } else {
538    bsp_interrupt_handler_default( vector );
539  }
540}
541
542/** @} */
543
544/**
545 * @brief Acquires the interrupt support lock.
546 *
547 * The interrupt support lock is a mutex.  The mutex is only acquired if the
548 * system is the ::SYSTEM_STATE_UP state.
549 */
550void bsp_interrupt_lock(void);
551
552/**
553 * @brief Releases the interrupt support lock.
554 *
555 * The mutex is only released if the system is the ::SYSTEM_STATE_UP state.
556 */
557void bsp_interrupt_unlock(void);
558
559/**
560 * @brief Checks the vector and routine.  When the checks were successful, the
561 *   interrupt support lock will be obtained.
562 *
563 * @param vector is the interrupt vector number to check.
564 *
565 * @param routine is the routine to check.
566 *
567 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
568 *
569 * @retval ::RTEMS_INCORRECT_STATE The interrupt support was not initialized.
570 *
571 * @retval ::RTEMS_CALLED_FROM_ISR The function was called from within
572 *   interrupt context.
573 *
574 * @retval ::RTEMS_INVALID_ADDRESS The ``routine`` parameter was NULL.
575 *
576 * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
577 *   number specified by ``vector``.
578 */
579rtems_status_code bsp_interrupt_check_and_lock(
580  rtems_vector_number     vector,
581  rtems_interrupt_handler handler
582);
583
584/* For internal use only */
585rtems_interrupt_entry *bsp_interrupt_entry_find(
586  rtems_vector_number      vector,
587  rtems_interrupt_handler  routine,
588  void                    *arg,
589  rtems_interrupt_entry ***previous_next
590);
591
592/* For internal use only */
593void bsp_interrupt_entry_remove(
594  rtems_vector_number     vector,
595  rtems_interrupt_entry  *entry,
596  rtems_interrupt_entry **previous_next
597);
598
599/**
600 * @brief This table contains a bit map which indicates if an entry is unique
601 *   or shared.
602 *
603 * If the bit associated with a vector is set, then the entry is unique,
604 * otherwise it may be shared.  If the bit with index
605 * #BSP_INTERRUPT_DISPATCH_TABLE_SIZE is set, then the interrupt support is
606 * initialized, otherwise it is not initialized.
607 */
608extern uint8_t bsp_interrupt_handler_unique_table[];
609
610/**
611 * @brief Checks if the handler entry associated with the hander index is
612 *   unique.
613 *
614 * @param index is the handler index to check.
615 *
616 * @return Returns true, if handler entry associated with the hander index is
617 *   unique, otherwise false.
618 */
619static inline bool bsp_interrupt_is_handler_unique( rtems_vector_number index )
620{
621  rtems_vector_number table_index;
622  uint8_t             bit;
623
624  table_index = index / 8;
625  bit = (uint8_t) ( 1U << ( index % 8 ) );
626
627  return ( bsp_interrupt_handler_unique_table[ table_index ] & bit ) != 0;
628}
629
630/**
631 * @brief Sets the unique status of the handler entry.
632 *
633 * @param index is the handler index.
634 *
635 * @param unique is the unique status to set.
636 */
637static inline void bsp_interrupt_set_handler_unique(
638  rtems_vector_number index,
639  bool                unique
640)
641{
642  rtems_vector_number table_index;
643  uint8_t             bit;
644
645  table_index = index / 8;
646  bit = (uint8_t) ( 1U << ( index % 8 ) );
647
648  if (unique) {
649    bsp_interrupt_handler_unique_table[ table_index ] |= bit;
650  } else {
651    bsp_interrupt_handler_unique_table[ table_index ] &= ~bit;
652  }
653}
654
655/**
656 * @brief Checks if the interrupt support is initialized.
657 *
658 * @return Returns true, if the interrupt support is initialized, otherwise
659 *   false.
660 */
661static inline bool bsp_interrupt_is_initialized( void )
662{
663  return bsp_interrupt_is_handler_unique( BSP_INTERRUPT_DISPATCH_TABLE_SIZE );
664}
665
666/**
667 * @brief Gets a reference to the interrupt handler table slot associated with
668 *   the index.
669 *
670 * @return Returns a reference to the interrupt handler table slot associated
671 *   with the index.
672 */
673rtems_interrupt_entry **bsp_interrupt_get_dispatch_table_slot(
674  rtems_vector_number index
675);
676
677#ifdef __cplusplus
678}
679#endif /* __cplusplus */
680
681#endif /* LIBBSP_SHARED_IRQ_GENERIC_H */
Note: See TracBrowser for help on using the repository browser.