source: rtems/testsuites/sptests/sp40/init.c @ bbf6253

4.104.115
Last change on this file since bbf6253 was bbf6253, checked in by Joel Sherrill <joel.sherrill@…>, on 10/09/09 at 13:43:36

2009-10-09 Sebastian Huber <Sebastian.Huber@…>

  • 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.
  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 *  IO Manager Dynamic Registration
3 *
4 *  COPYRIGHT (c) 1989-2007.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 *  Copyright (c) 2009 embedded brains GmbH.
8 *
9 *  The license and distribution terms for this file may be
10 *  found in the file LICENSE in this distribution or at
11 *  http://www.rtems.com/license/LICENSE.
12 *
13 *  $Id$
14 */
15
16#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
17
18#include <tmacros.h>
19
20static rtems_device_driver test_open(
21     rtems_device_major_number  minor,
22     rtems_device_minor_number  major,
23     void                      *ignored
24)
25{
26  return RTEMS_IO_ERROR;
27}
28
29static rtems_driver_address_table test_driver = {
30  .initialization_entry = NULL,
31  .open_entry = test_open,
32  .close_entry = NULL,
33  .read_entry = NULL,
34  .write_entry = NULL,
35  .control_entry = NULL
36};
37
38#define test_interrupt_context_enter( level ) \
39  do { \
40    _Thread_Disable_dispatch(); \
41    rtems_interrupt_disable( level ); \
42    ++_ISR_Nest_level; \
43  } while (0)
44
45#define test_interrupt_context_leave( level ) \
46  do { \
47    --_ISR_Nest_level; \
48    rtems_interrupt_enable( level ); \
49    _Thread_Enable_dispatch(); \
50  } while (0)
51
52rtems_task Init(
53  rtems_task_argument argument
54)
55{
56  rtems_status_code         sc;
57  rtems_device_major_number registered;
58  rtems_device_major_number registered_not;
59  rtems_device_major_number invalid_major = _IO_Number_of_drivers + 1;
60  rtems_interrupt_level level;
61
62  puts( "\n\n*** TEST 40 ***" );
63
64  /*
65   *  Register a driver with init == NULL and open != NULL
66   */
67
68  puts( "Init - rtems_io_register_driver - init == NULL, open != NULL OK" );
69  sc = rtems_io_register_driver( 0, &test_driver, &registered );
70  printf( "Init - Major slot returned = %d\n", (int) registered );
71  directive_failed( sc, "rtems_io_register_driver" );
72
73  puts( "Init - rtems_io_register_driver - init == NULL, open != NULL OK" );
74  sc = rtems_io_register_driver( 0, &test_driver, &registered_not );
75  printf( "Init - Major slot returned = %d\n", (int) registered_not );
76  fatal_directive_status(
77    sc,
78    RTEMS_TOO_MANY,
79    "rtems_io_register_driver too many"
80  );
81
82  puts( "Init - rtems_io_register_driver - used slot" );
83  sc = rtems_io_register_driver( registered, &test_driver, &registered_not );
84  fatal_directive_status(
85    sc,
86    RTEMS_RESOURCE_IN_USE,
87    "rtems_io_register_driver slot in use"
88  );
89
90  puts( "Init - rtems_io_unregister_driver - used slot" );
91  sc = rtems_io_unregister_driver( registered );
92  directive_failed( sc, "rtems_io_unregister_driver" );
93
94  puts( "Init - rtems_io_register_driver - free slot" );
95  sc = rtems_io_register_driver( registered, &test_driver, &registered );
96  directive_failed( sc, "rtems_io_register_driver" );
97
98  puts( "Init - rtems_io_register_driver - called from interrupt context" );
99  test_interrupt_context_enter( level );
100  sc = rtems_io_register_driver( 0, NULL, NULL );
101  test_interrupt_context_leave( level );
102  fatal_directive_status(
103    sc,
104    RTEMS_CALLED_FROM_ISR,
105    "rtems_io_register_driver"
106  );
107
108  puts( "Init - rtems_io_register_driver - invalid registered major pointer" );
109  sc = rtems_io_register_driver( 0, NULL, NULL );
110  fatal_directive_status(
111    sc,
112    RTEMS_INVALID_ADDRESS,
113    "rtems_io_register_driver"
114  );
115
116  puts( "Init - rtems_io_register_driver - invalid driver table pointer" );
117  sc = rtems_io_register_driver( 0, NULL, &registered );
118  fatal_directive_status(
119    sc,
120    RTEMS_INVALID_ADDRESS,
121    "rtems_io_register_driver"
122  );
123
124  puts( "Init - rtems_io_register_driver - invalid empty driver table" );
125  test_driver.open_entry = NULL;
126  sc = rtems_io_register_driver( 0, &test_driver, &registered );
127  test_driver.open_entry = test_open;
128  fatal_directive_status(
129    sc,
130    RTEMS_INVALID_ADDRESS,
131    "rtems_io_register_driver"
132  );
133
134  puts( "Init - rtems_io_register_driver - invalid major" );
135  sc = rtems_io_register_driver( invalid_major, &test_driver, &registered );
136  fatal_directive_status(
137    sc,
138    RTEMS_INVALID_NUMBER,
139    "rtems_io_register_driver"
140  );
141
142  puts( "Init - rtems_io_unregister_driver - called from interrupt context" );
143  test_interrupt_context_enter( level );
144  sc = rtems_io_unregister_driver( 0 );
145  test_interrupt_context_leave( level );
146  fatal_directive_status(
147    sc,
148    RTEMS_CALLED_FROM_ISR,
149    "rtems_io_unregister_driver"
150  );
151
152  puts( "Init - rtems_io_unregister_driver - invalid major number" );
153  sc = rtems_io_unregister_driver( invalid_major );
154  fatal_directive_status(
155    sc,
156    RTEMS_UNSATISFIED,
157    "rtems_io_unregister_driver"
158  );
159
160  puts( "*** END OF TEST 40 ***" );
161  rtems_test_exit( 0 );
162}
163
164/* configuration information */
165
166#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
167#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
168
169/* more one more driver slot than are statically configured */
170#define CONFIGURE_MAXIMUM_DRIVERS 3
171
172#define CONFIGURE_MAXIMUM_TASKS  1
173#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
174
175#define CONFIGURE_INIT
176#include <rtems/confdefs.h>
177
178/* end of include file */
Note: See TracBrowser for help on using the repository browser.