diff options
Diffstat (limited to 'testsuites/sptests/sp40/init.c')
-rw-r--r-- | testsuites/sptests/sp40/init.c | 117 |
1 files changed, 101 insertions, 16 deletions
diff --git a/testsuites/sptests/sp40/init.c b/testsuites/sptests/sp40/init.c index e85437f188..db916e4f37 100644 --- a/testsuites/sptests/sp40/init.c +++ b/testsuites/sptests/sp40/init.c @@ -4,6 +4,8 @@ * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2009 embedded brains GmbH. + * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. @@ -11,24 +13,42 @@ * $Id$ */ +#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__ + #include <tmacros.h> -rtems_device_driver test_open( +static rtems_device_driver test_open( rtems_device_major_number minor, rtems_device_minor_number major, void *ignored ) { + return RTEMS_IO_ERROR; } -rtems_driver_address_table test_driver = { - NULL, /* initialization procedure */ - test_open, /* open request procedure */ - NULL, /* close request procedure */ - NULL, /* read request procedure */ - NULL, /* write request procedure */ - NULL, /* special functions procedure */ +static rtems_driver_address_table test_driver = { + .initialization_entry = NULL, + .open_entry = test_open, + .close_entry = NULL, + .read_entry = NULL, + .write_entry = NULL, + .control_entry = NULL }; + +#define test_interrupt_context_enter( level ) \ + do { \ + _Thread_Disable_dispatch(); \ + rtems_interrupt_disable( level ); \ + ++_ISR_Nest_level; \ + } while (0) + +#define test_interrupt_context_leave( level ) \ + do { \ + --_ISR_Nest_level; \ + rtems_interrupt_enable( level ); \ + _Thread_Enable_dispatch(); \ + } while (0) + rtems_task Init( rtems_task_argument argument ) @@ -36,6 +56,8 @@ rtems_task Init( rtems_status_code sc; rtems_device_major_number registered; rtems_device_major_number registered_not; + rtems_device_major_number invalid_major = _IO_Number_of_drivers + 1; + rtems_interrupt_level level; puts( "\n\n*** TEST 40 ***" ); @@ -58,23 +80,86 @@ rtems_task Init( ); puts( "Init - rtems_io_register_driver - used slot" ); - sc = rtems_io_register_driver( registered, &test_driver, ®istered ); + sc = rtems_io_register_driver( registered, &test_driver, ®istered_not ); fatal_directive_status( sc, RTEMS_RESOURCE_IN_USE, "rtems_io_register_driver slot in use" ); - puts( "*** END OF TEST 40 ***" ); - rtems_test_exit( 0 ); -} + puts( "Init - rtems_io_unregister_driver - used slot" ); + sc = rtems_io_unregister_driver( registered ); + directive_failed( sc, "rtems_io_unregister_driver" ); + + puts( "Init - rtems_io_register_driver - free slot" ); + sc = rtems_io_register_driver( registered, &test_driver, ®istered ); + directive_failed( sc, "rtems_io_register_driver" ); + puts( "Init - rtems_io_register_driver - called from interrupt context" ); + test_interrupt_context_enter( level ); + sc = rtems_io_register_driver( 0, NULL, NULL ); + test_interrupt_context_leave( level ); + fatal_directive_status( + sc, + RTEMS_CALLED_FROM_ISR, + "rtems_io_register_driver" + ); -/* functions */ + puts( "Init - rtems_io_register_driver - invalid registered major pointer" ); + sc = rtems_io_register_driver( 0, NULL, NULL ); + fatal_directive_status( + sc, + RTEMS_INVALID_ADDRESS, + "rtems_io_register_driver" + ); -rtems_task Init( - rtems_task_argument argument -); + puts( "Init - rtems_io_register_driver - invalid driver table pointer" ); + sc = rtems_io_register_driver( 0, NULL, ®istered ); + fatal_directive_status( + sc, + RTEMS_INVALID_ADDRESS, + "rtems_io_register_driver" + ); + + puts( "Init - rtems_io_register_driver - invalid empty driver table" ); + test_driver.open_entry = NULL; + sc = rtems_io_register_driver( 0, &test_driver, ®istered ); + test_driver.open_entry = test_open; + fatal_directive_status( + sc, + RTEMS_INVALID_ADDRESS, + "rtems_io_register_driver" + ); + + puts( "Init - rtems_io_register_driver - invalid major" ); + sc = rtems_io_register_driver( invalid_major, &test_driver, ®istered ); + fatal_directive_status( + sc, + RTEMS_INVALID_NUMBER, + "rtems_io_register_driver" + ); + + puts( "Init - rtems_io_unregister_driver - called from interrupt context" ); + test_interrupt_context_enter( level ); + sc = rtems_io_unregister_driver( 0 ); + test_interrupt_context_leave( level ); + fatal_directive_status( + sc, + RTEMS_CALLED_FROM_ISR, + "rtems_io_unregister_driver" + ); + + puts( "Init - rtems_io_unregister_driver - invalid major number" ); + sc = rtems_io_unregister_driver( invalid_major ); + fatal_directive_status( + sc, + RTEMS_UNSATISFIED, + "rtems_io_unregister_driver" + ); + + puts( "*** END OF TEST 40 ***" ); + rtems_test_exit( 0 ); +} /* configuration information */ |