* sp40/init.c, sp40/sp40.doc, sp40/sp40.scn: New test cases.

	* spintrcritical09/init.c, spintrcritical10/init.c,
	spintrcritical11/init.c: Fixed potentially infinite loops.
This commit is contained in:
Joel Sherrill
2009-10-09 13:43:36 +00:00
parent 4ee2c53f01
commit bbf6253a77
4 changed files with 120 additions and 19 deletions

View File

@@ -1,7 +1,11 @@
2009-10-09 Sebastian Huber <Sebastian.Huber@embedded-brains.de>
* sp40/init.c, sp40/sp40.doc, sp40/sp40.scn: New test cases.
2009-10-04 Sebastian Huber <Sebastian.Huber@embedded-brains.de> 2009-10-04 Sebastian Huber <Sebastian.Huber@embedded-brains.de>
* sptests/spintrcritical09/init.c, sptests/spintrcritical10/init.c, * spintrcritical09/init.c, spintrcritical10/init.c,
sptests/spintrcritical11/init.c: Fixed potentially infinite loops. spintrcritical11/init.c: Fixed potentially infinite loops.
* sp20/system.h: Increased micro seconds per tick in order to be more * sp20/system.h: Increased micro seconds per tick in order to be more
independent of the console output speed. independent of the console output speed.

View File

@@ -4,6 +4,8 @@
* COPYRIGHT (c) 1989-2007. * COPYRIGHT (c) 1989-2007.
* On-Line Applications Research Corporation (OAR). * On-Line Applications Research Corporation (OAR).
* *
* Copyright (c) 2009 embedded brains GmbH.
*
* The license and distribution terms for this file may be * The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at * found in the file LICENSE in this distribution or at
* http://www.rtems.com/license/LICENSE. * http://www.rtems.com/license/LICENSE.
@@ -11,24 +13,42 @@
* $Id$ * $Id$
*/ */
#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
#include <tmacros.h> #include <tmacros.h>
rtems_device_driver test_open( static rtems_device_driver test_open(
rtems_device_major_number minor, rtems_device_major_number minor,
rtems_device_minor_number major, rtems_device_minor_number major,
void *ignored void *ignored
) )
{ {
return RTEMS_IO_ERROR;
} }
rtems_driver_address_table test_driver = { static rtems_driver_address_table test_driver = {
NULL, /* initialization procedure */ .initialization_entry = NULL,
test_open, /* open request procedure */ .open_entry = test_open,
NULL, /* close request procedure */ .close_entry = NULL,
NULL, /* read request procedure */ .read_entry = NULL,
NULL, /* write request procedure */ .write_entry = NULL,
NULL, /* special functions procedure */ .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 Init(
rtems_task_argument argument rtems_task_argument argument
) )
@@ -36,6 +56,8 @@ rtems_task Init(
rtems_status_code sc; rtems_status_code sc;
rtems_device_major_number registered; rtems_device_major_number registered;
rtems_device_major_number registered_not; 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 ***" ); puts( "\n\n*** TEST 40 ***" );
@@ -58,24 +80,87 @@ rtems_task Init(
); );
puts( "Init - rtems_io_register_driver - used slot" ); puts( "Init - rtems_io_register_driver - used slot" );
sc = rtems_io_register_driver( registered, &test_driver, &registered ); sc = rtems_io_register_driver( registered, &test_driver, &registered_not );
fatal_directive_status( fatal_directive_status(
sc, sc,
RTEMS_RESOURCE_IN_USE, RTEMS_RESOURCE_IN_USE,
"rtems_io_register_driver slot in use" "rtems_io_register_driver slot in use"
); );
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, &registered );
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"
);
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"
);
puts( "Init - rtems_io_register_driver - invalid driver table pointer" );
sc = rtems_io_register_driver( 0, NULL, &registered );
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, &registered );
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, &registered );
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 ***" ); puts( "*** END OF TEST 40 ***" );
rtems_test_exit( 0 ); rtems_test_exit( 0 );
} }
/* functions */
rtems_task Init(
rtems_task_argument argument
);
/* configuration information */ /* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER

View File

@@ -16,6 +16,7 @@ test set name: sp40
directives: directives:
rtems_io_register_driver rtems_io_register_driver
rtems_io_unregister_driver
concepts: concepts:
@@ -23,3 +24,5 @@ concepts:
when inserting into a slot that is already in use. when inserting into a slot that is already in use.
+ Focus on case where initialization entry is NULL and open entry is NOT NULL. + Focus on case where initialization entry is NULL and open entry is NOT NULL.
+ Provoke error conditions.

View File

@@ -2,6 +2,15 @@
Init - rtems_io_register_driver - init == NULL, open != NULL OK Init - rtems_io_register_driver - init == NULL, open != NULL OK
Init - Major slot returned = 2 Init - Major slot returned = 2
Init - rtems_io_register_driver - init == NULL, open != NULL OK Init - rtems_io_register_driver - init == NULL, open != NULL OK
Init - Major slot returned = 0 Init - Major slot returned = 3
Init - rtems_io_register_driver - used slot Init - rtems_io_register_driver - used slot
Init - rtems_io_unregister_driver - used slot
Init - rtems_io_register_driver - free slot
Init - rtems_io_register_driver - called from interrupt context
Init - rtems_io_register_driver - invalid registered major pointer
Init - rtems_io_register_driver - invalid driver table pointer
Init - rtems_io_register_driver - invalid empty driver table
Init - rtems_io_register_driver - invalid major
Init - rtems_io_unregister_driver - called from interrupt context
Init - rtems_io_unregister_driver - invalid major number
*** END OF TEST 40 *** *** END OF TEST 40 ***