File indexing completed on 2025-05-11 08:24:45
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 #ifdef HAVE_CONFIG_H
0034 #include "config.h"
0035 #endif
0036
0037 #include <tmacros.h>
0038
0039 #include <rtems/ioimpl.h>
0040
0041 const char rtems_test_name[] = "SP 40";
0042
0043
0044 rtems_task Init(rtems_task_argument argument);
0045
0046 static rtems_device_driver test_open(
0047 rtems_device_major_number minor,
0048 rtems_device_minor_number major,
0049 void *ignored
0050 )
0051 {
0052 return RTEMS_IO_ERROR;
0053 }
0054
0055 static rtems_driver_address_table test_driver = {
0056 .initialization_entry = NULL,
0057 .open_entry = test_open,
0058 .close_entry = NULL,
0059 .read_entry = NULL,
0060 .write_entry = NULL,
0061 .control_entry = NULL
0062 };
0063
0064 #define test_interrupt_context_enter( level ) \
0065 do { \
0066 rtems_interrupt_local_disable( level ); \
0067 ++_ISR_Nest_level; \
0068 } while (0)
0069
0070 #define test_interrupt_context_leave( level ) \
0071 do { \
0072 --_ISR_Nest_level; \
0073 rtems_interrupt_local_enable( level ); \
0074 } while (0)
0075
0076 rtems_task Init(
0077 rtems_task_argument argument
0078 )
0079 {
0080 rtems_status_code sc;
0081 rtems_device_major_number registered;
0082 rtems_device_major_number registered_not;
0083 rtems_device_major_number invalid_major = _IO_Number_of_drivers + 1;
0084 rtems_interrupt_level level;
0085 bool do_interrupt_context_test = true;
0086
0087 TEST_BEGIN();
0088
0089
0090 test_interrupt_context_enter( level );
0091 do_interrupt_context_test = rtems_interrupt_is_in_progress();
0092 test_interrupt_context_leave( level );
0093
0094
0095
0096
0097
0098 puts( "Init - rtems_io_register_driver - init == NULL, open != NULL OK" );
0099 sc = rtems_io_register_driver( 0, &test_driver, ®istered );
0100 printf( "Init - Major slot returned = %d\n", (int) registered );
0101 directive_failed( sc, "rtems_io_register_driver" );
0102
0103 puts( "Init - rtems_io_register_driver - init == NULL, open != NULL OK" );
0104 sc = rtems_io_register_driver( 0, &test_driver, ®istered_not );
0105 printf( "Init - Major slot returned = %d\n", (int) registered_not );
0106 fatal_directive_status(
0107 sc,
0108 RTEMS_TOO_MANY,
0109 "rtems_io_register_driver too many"
0110 );
0111
0112 puts( "Init - rtems_io_register_driver - used slot" );
0113 sc = rtems_io_register_driver( registered, &test_driver, ®istered_not );
0114 fatal_directive_status(
0115 sc,
0116 RTEMS_RESOURCE_IN_USE,
0117 "rtems_io_register_driver slot in use"
0118 );
0119
0120 puts( "Init - rtems_io_unregister_driver - used slot" );
0121 sc = rtems_io_unregister_driver( registered );
0122 directive_failed( sc, "rtems_io_unregister_driver" );
0123
0124 puts( "Init - rtems_io_register_driver - free slot" );
0125 sc = rtems_io_register_driver( registered, &test_driver, ®istered );
0126 directive_failed( sc, "rtems_io_register_driver" );
0127
0128 puts( "Init - rtems_io_register_driver - called from interrupt context" );
0129 if ( do_interrupt_context_test ) {
0130 test_interrupt_context_enter( level );
0131 sc = rtems_io_register_driver( 0, NULL, NULL );
0132 test_interrupt_context_leave( level );
0133 fatal_directive_status(
0134 sc,
0135 RTEMS_CALLED_FROM_ISR,
0136 "rtems_io_register_driver"
0137 );
0138 }
0139
0140 puts( "Init - rtems_io_register_driver - invalid registered major pointer" );
0141 sc = rtems_io_register_driver( 0, NULL, NULL );
0142 fatal_directive_status(
0143 sc,
0144 RTEMS_INVALID_ADDRESS,
0145 "rtems_io_register_driver"
0146 );
0147
0148 puts( "Init - rtems_io_register_driver - invalid driver table pointer" );
0149 sc = rtems_io_register_driver( 0, NULL, ®istered );
0150 fatal_directive_status(
0151 sc,
0152 RTEMS_INVALID_ADDRESS,
0153 "rtems_io_register_driver"
0154 );
0155
0156 puts( "Init - rtems_io_register_driver - invalid empty driver table" );
0157 test_driver.open_entry = NULL;
0158 sc = rtems_io_register_driver( 0, &test_driver, ®istered );
0159 test_driver.open_entry = test_open;
0160 fatal_directive_status(
0161 sc,
0162 RTEMS_INVALID_ADDRESS,
0163 "rtems_io_register_driver"
0164 );
0165
0166 puts( "Init - rtems_io_register_driver - invalid major" );
0167 sc = rtems_io_register_driver( invalid_major, &test_driver, ®istered );
0168 fatal_directive_status(
0169 sc,
0170 RTEMS_INVALID_NUMBER,
0171 "rtems_io_register_driver"
0172 );
0173
0174 puts( "Init - rtems_io_unregister_driver - called from interrupt context" );
0175 if ( do_interrupt_context_test ) {
0176 test_interrupt_context_enter( level );
0177 sc = rtems_io_unregister_driver( 0 );
0178 test_interrupt_context_leave( level );
0179 fatal_directive_status(
0180 sc,
0181 RTEMS_CALLED_FROM_ISR,
0182 "rtems_io_unregister_driver"
0183 );
0184 }
0185
0186 puts( "Init - rtems_io_unregister_driver - invalid major number" );
0187 sc = rtems_io_unregister_driver( invalid_major );
0188 fatal_directive_status(
0189 sc,
0190 RTEMS_UNSATISFIED,
0191 "rtems_io_unregister_driver"
0192 );
0193
0194 TEST_END();
0195 rtems_test_exit( 0 );
0196 }
0197
0198
0199
0200 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0201 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0202 #define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
0203
0204
0205 #define CONFIGURE_MAXIMUM_DRIVERS 2
0206
0207 #define CONFIGURE_MAXIMUM_TASKS 1
0208 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0209
0210 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0211
0212 #define CONFIGURE_INIT
0213 #include <rtems/confdefs.h>
0214
0215