File indexing completed on 2025-05-11 08:24:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 #include <bsp/irq-generic.h>
0038 #include <rtems/malloc.h>
0039
0040 #include <stdlib.h>
0041
0042 static rtems_status_code bsp_interrupt_handler_do_replace(
0043 rtems_vector_number vector,
0044 const char *info,
0045 rtems_interrupt_handler routine,
0046 void *arg
0047 )
0048 {
0049 rtems_interrupt_entry *entry;
0050 rtems_interrupt_entry **unused;
0051
0052 entry = bsp_interrupt_entry_find( vector, routine, arg, &unused );
0053
0054 if ( entry == NULL ) {
0055 return RTEMS_UNSATISFIED;
0056 }
0057
0058 entry->handler = routine;
0059 entry->info = info;
0060
0061 return RTEMS_SUCCESSFUL;
0062 }
0063
0064 static rtems_status_code bsp_interrupt_handler_replace(
0065 rtems_vector_number vector,
0066 const char *info,
0067 rtems_interrupt_handler routine,
0068 void *arg
0069 )
0070 {
0071 rtems_status_code sc;
0072
0073 sc = bsp_interrupt_check_and_lock( vector, routine );
0074
0075 if ( sc != RTEMS_SUCCESSFUL ) {
0076 return sc;
0077 }
0078
0079 sc = bsp_interrupt_handler_do_replace( vector, info, routine, arg );
0080 bsp_interrupt_unlock();
0081
0082 return sc;
0083 }
0084
0085 rtems_status_code rtems_interrupt_handler_install(
0086 rtems_vector_number vector,
0087 const char *info,
0088 rtems_option options,
0089 rtems_interrupt_handler routine,
0090 void *arg
0091 )
0092 {
0093 rtems_interrupt_entry *entry;
0094 rtems_status_code sc;
0095
0096 if ( RTEMS_INTERRUPT_IS_REPLACE( options ) ) {
0097 return bsp_interrupt_handler_replace( vector, info, routine, arg );
0098 }
0099
0100 entry = rtems_malloc( sizeof( *entry ) );
0101
0102 if ( entry == NULL ) {
0103 return RTEMS_NO_MEMORY;
0104 }
0105
0106 rtems_interrupt_entry_initialize( entry, routine, arg, info );
0107 sc = rtems_interrupt_entry_install( vector, options, entry );
0108
0109 if ( sc != RTEMS_SUCCESSFUL ) {
0110 free( entry );
0111 }
0112
0113 return sc;
0114 }