Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:45

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  COPYRIGHT (c) 1989-2012.
0005  *  On-Line Applications Research Corporation (OAR).
0006  *
0007  * Redistribution and use in source and binary forms, with or without
0008  * modification, are permitted provided that the following conditions
0009  * are met:
0010  * 1. Redistributions of source code must retain the above copyright
0011  *    notice, this list of conditions and the following disclaimer.
0012  * 2. Redistributions in binary form must reproduce the above copyright
0013  *    notice, this list of conditions and the following disclaimer in the
0014  *    documentation and/or other materials provided with the distribution.
0015  *
0016  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0017  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0018  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0019  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0020  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0021  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0022  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0023  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0024  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0025  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0026  * POSSIBILITY OF SUCH DAMAGE.
0027  */
0028 
0029 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032 
0033 #include <tmacros.h>
0034 #include <rtems/devnull.h>
0035 #include <rtems/devzero.h>
0036 #include <rtems/libio.h>
0037 
0038 const char rtems_test_name[] = "SP 21";
0039 
0040 /* forward declarations to avoid warnings */
0041 rtems_task Init(rtems_task_argument argument);
0042 void do_test_io_manager(void);
0043 void do_test_zero_driver(void);
0044 
0045 #define PRIurtems_device_major_number PRIu32
0046 
0047 #define STUB_DRIVER_MAJOR     1
0048 #define ZERO_DRIVER_MAJOR     2
0049 #define NO_DRIVER_MAJOR       3
0050 #define INVALID_DRIVER_MAJOR  UINT32_MAX
0051 
0052 /* driver entries to use with io_register */
0053 rtems_driver_address_table GoodDriver = DEVNULL_DRIVER_TABLE_ENTRY;
0054 rtems_driver_address_table BadDriver_Nothing = {
0055   NULL, NULL, NULL, NULL, NULL, NULL
0056 };
0057 
0058 void do_test_io_manager(void)
0059 {
0060   rtems_status_code         status;
0061   rtems_device_major_number registered;
0062   rtems_device_major_number registered_worked;
0063 
0064   puts( "-----  TESTING THE NULL DRIVER CHECKS  -----" );
0065 
0066   status = rtems_io_initialize( NO_DRIVER_MAJOR, 0, NULL );
0067   directive_failed( status, "rtems_io_initialize" );
0068   puts( "rtems_io_initialize  - NULL DRIVER RTEMS_SUCCESSFUL" );
0069 
0070   status = rtems_io_open( NO_DRIVER_MAJOR, 0, NULL );
0071   directive_failed( status, "rtems_io_open" );
0072   puts( "rtems_io_open        - NULL DRIVER RTEMS_SUCCESSFUL" );
0073 
0074   status = rtems_io_close( NO_DRIVER_MAJOR, 0, NULL );
0075   directive_failed( status, "rtems_io_close" );
0076   puts( "rtems_io_close       - NULL DRIVER RTEMS_SUCCESSFUL" );
0077 
0078   status = rtems_io_read( NO_DRIVER_MAJOR, 0, NULL );
0079   directive_failed( status, "rtems_io_read" );
0080   puts( "rtems_io_read        - NULL DRIVER RTEMS_SUCCESSFUL" );
0081 
0082   status = rtems_io_write( NO_DRIVER_MAJOR, 0, NULL );
0083   directive_failed( status, "rtems_io_write" );
0084   puts( "rtems_io_write       - NULL DRIVER RTEMS_SUCCESSFUL" );
0085 
0086   status = rtems_io_control( NO_DRIVER_MAJOR, 0, NULL );
0087   directive_failed( status, "rtems_io_control" );
0088   puts( "rtems_io_control     - NULL DRIVER RTEMS_SUCCESSFUL" );
0089 
0090   puts( "-----  TESTING THE I/O MANAGER DIRECTIVES  -----" );
0091 
0092   status = rtems_io_initialize( STUB_DRIVER_MAJOR, 0, NULL );
0093   directive_failed( status, "rtems_io_initialize" );
0094   puts( "rtems_io_initialize  - STUB DRIVER RTEMS_SUCCESSFUL" );
0095 
0096   status = rtems_io_open( STUB_DRIVER_MAJOR, 0, NULL );
0097   directive_failed( status, "rtems_io_open" );
0098   puts( "rtems_io_open        - STUB DRIVER RTEMS_SUCCESSFUL" );
0099 
0100   status = rtems_io_close( STUB_DRIVER_MAJOR, 0, NULL );
0101   directive_failed( status, "rtems_io_close" );
0102   puts( "rtems_io_close       - STUB DRIVER RTEMS_SUCCESSFUL" );
0103 
0104   status = rtems_io_read( STUB_DRIVER_MAJOR, 0, NULL );
0105   directive_failed( status, "rtems_io_read" );
0106   puts( "rtems_io_read        - STUB DRIVER RTEMS_SUCCESSFUL" );
0107 
0108   status = rtems_io_write( STUB_DRIVER_MAJOR, 0, NULL );
0109   directive_failed( status, "rtems_io_write" );
0110   puts( "rtems_io_write       - STUB DRIVER RTEMS_SUCCESSFUL" );
0111 
0112   status = rtems_io_control( STUB_DRIVER_MAJOR, 0, NULL );
0113   directive_failed( status, "rtems_io_control" );
0114   puts( "rtems_io_control     - STUB DRIVER RTEMS_SUCCESSFUL" );
0115 
0116   /*
0117    *  Invalid major number
0118    */
0119   puts( "-----  RETURNING INVALID MAJOR NUMBER -----" );
0120 
0121   status = rtems_io_initialize( INVALID_DRIVER_MAJOR, 0, NULL );
0122   fatal_directive_status(
0123     status,
0124     RTEMS_INVALID_NUMBER,
0125     "rtems_io_initialize"
0126   );
0127   puts( "rtems_io_initialize  - RTEMS_INVALID_NUMBER" );
0128 
0129   status = rtems_io_open( INVALID_DRIVER_MAJOR, 0, NULL );
0130   fatal_directive_status(
0131     status,
0132     RTEMS_INVALID_NUMBER,
0133     "rtems_io_open"
0134   );
0135   puts( "rtems_io_open        - RTEMS_INVALID_NUMBER" );
0136 
0137   /*
0138    *  Exercise the io register driver directive
0139    */
0140   puts( "-----  EXERCISE DRIVER REGISTER -----" );
0141 
0142   status = rtems_io_register_driver( 0, &GoodDriver, NULL );
0143   fatal_directive_status(
0144     status,
0145     RTEMS_INVALID_ADDRESS,
0146     "rtems_io_register_driver"
0147   );
0148   puts(
0149    "rtems_io_register_driver - RTEMS_INVALID_ADDRESS - NULL registered"
0150   );
0151 
0152   status = rtems_io_register_driver( 0, NULL, &registered );
0153   fatal_directive_status(
0154     status,
0155     RTEMS_INVALID_ADDRESS,
0156     "rtems_io_register_driver"
0157   );
0158   puts(
0159     "rtems_io_register_driver - RTEMS_INVALID_ADDRESS - NULL device"
0160   );
0161 
0162   status = rtems_io_register_driver( 0, &BadDriver_Nothing, &registered );
0163   fatal_directive_status(
0164     status,
0165     RTEMS_INVALID_ADDRESS,
0166     "rtems_io_register_driver"
0167   );
0168   puts(
0169     "rtems_io_register_driver - RTEMS_INVALID_ADDRESS - no callouts"
0170   );
0171 
0172   status = rtems_io_register_driver(
0173     INVALID_DRIVER_MAJOR, &GoodDriver, &registered );
0174   fatal_directive_status(
0175     status,
0176     RTEMS_INVALID_NUMBER,
0177     "rtems_io_register_driver"
0178   );
0179   puts( "rtems_io_register_driver - RTEMS_INVALID_NUMBER - bad major" );
0180 
0181   /* this has to succeed to overwrite NULL driver entry required above. */
0182   status = rtems_io_register_driver( 0, &GoodDriver, &registered_worked );
0183   directive_failed( status, "rtems_io_register_driver" );
0184   puts( "rtems_io_register_driver - RTEMS_SUCCESSFUL - overwrite NULL" );
0185 
0186   status = rtems_io_register_driver( 0, &GoodDriver, &registered );
0187   if ( status == RTEMS_SUCCESSFUL )
0188     printf(
0189       "registered major = %" PRIurtems_device_major_number "\n", registered );
0190   fatal_directive_status(
0191     status,
0192     RTEMS_TOO_MANY,
0193     "rtems_io_register_driver"
0194   );
0195   puts( "rtems_io_register_driver - RTEMS_TOO_MANY - no slots" );
0196 
0197   /* there should be a driver at major 1 -- clock, console, or stub */
0198   status = rtems_io_register_driver( 1, &GoodDriver, &registered );
0199   fatal_directive_status(
0200     status,
0201     RTEMS_RESOURCE_IN_USE,
0202     "rtems_io_register_driver"
0203   );
0204   puts(
0205     "rtems_io_register_driver - RTEMS_RESOURCE_IN_USE - major in use"
0206   );
0207 
0208   /* this should unregister the device driver we registered above */
0209   status = rtems_io_unregister_driver( registered_worked );
0210   directive_failed( status, "rtems_io_unregister_driver" );
0211   puts( "rtems_io_unregister_driver - RTEMS_SUCCESSFUL" );
0212 }
0213 
0214 void do_test_zero_driver(void)
0215 {
0216   rtems_status_code sc = RTEMS_SUCCESSFUL;
0217   char in = 'I';
0218   rtems_libio_rw_args_t rw_in = {
0219     .buffer = &in,
0220     .count = sizeof(in)
0221   };
0222   char out = 'O';
0223   rtems_libio_rw_args_t rw_out = {
0224     .buffer = &out,
0225     .count = sizeof(out)
0226   };
0227 
0228   puts( "-----  TESTING THE ZERO DRIVER CHECKS  -----" );
0229 
0230   sc = rtems_io_initialize( ZERO_DRIVER_MAJOR, 0, NULL );
0231   rtems_test_assert( sc == RTEMS_TOO_MANY );
0232 
0233   sc = rtems_io_open( ZERO_DRIVER_MAJOR, 0, NULL );
0234   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0235 
0236   sc = rtems_io_close( ZERO_DRIVER_MAJOR, 0, NULL );
0237   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0238 
0239   sc = rtems_io_read( ZERO_DRIVER_MAJOR, 0, &rw_in );
0240   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0241   rtems_test_assert( in == 0 );
0242   rtems_test_assert( rw_in.bytes_moved == sizeof(in) );
0243 
0244   sc = rtems_io_write( ZERO_DRIVER_MAJOR, 0, &rw_out );
0245   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0246   rtems_test_assert( out == 'O' );
0247   rtems_test_assert( rw_out.bytes_moved == sizeof(out) );
0248 
0249   sc = rtems_io_control( ZERO_DRIVER_MAJOR, 0, NULL );
0250   rtems_test_assert( sc == RTEMS_IO_ERROR );
0251 }
0252 
0253 rtems_task Init(
0254   rtems_task_argument argument
0255 )
0256 {
0257   TEST_BEGIN();
0258 
0259   do_test_io_manager();
0260 
0261   do_test_zero_driver();
0262 
0263   TEST_END();
0264   rtems_test_exit( 0 );
0265 }
0266 
0267 /* configuration information */
0268 
0269 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
0270 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0271 #define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
0272 #define CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
0273 #define CONFIGURE_APPLICATION_NEEDS_NULL_DRIVER
0274 
0275 #define CONFIGURE_MAXIMUM_TASKS             1
0276 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0277 
0278 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0279 
0280 #define CONFIGURE_INIT
0281 #include <rtems/confdefs.h>
0282 /* end of file */