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

Last change on this file was bcef89f2, checked in by Sebastian Huber <sebastian.huber@…>, on 05/19/23 at 06:18:25

Update company name

The embedded brains GmbH & Co. KG is the legal successor of embedded
brains GmbH.

  • Property mode set to 100644
File size: 6.6 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/*
4 *  IO Manager Dynamic Registration
5 *
6 *  COPYRIGHT (c) 1989-2012.
7 *  On-Line Applications Research Corporation (OAR).
8 *
9 *  Copyright (c) 2009 embedded brains GmbH & Co. KG
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#ifdef HAVE_CONFIG_H
34#include "config.h"
35#endif
36
37#include <tmacros.h>
38
39#include <rtems/ioimpl.h>
40
41const char rtems_test_name[] = "SP 40";
42
43/* forward declarations to avoid warnings */
44rtems_task Init(rtems_task_argument argument);
45
46static rtems_device_driver test_open(
47     rtems_device_major_number  minor,
48     rtems_device_minor_number  major,
49     void                      *ignored
50)
51{
52  return RTEMS_IO_ERROR;
53}
54
55static rtems_driver_address_table test_driver = {
56  .initialization_entry = NULL,
57  .open_entry = test_open,
58  .close_entry = NULL,
59  .read_entry = NULL,
60  .write_entry = NULL,
61  .control_entry = NULL
62};
63
64#define test_interrupt_context_enter( level ) \
65  do { \
66    rtems_interrupt_local_disable( level ); \
67    ++_ISR_Nest_level; \
68  } while (0)
69
70#define test_interrupt_context_leave( level ) \
71  do { \
72    --_ISR_Nest_level; \
73    rtems_interrupt_local_enable( level ); \
74  } while (0)
75
76rtems_task Init(
77  rtems_task_argument argument
78)
79{
80  rtems_status_code         sc;
81  rtems_device_major_number registered;
82  rtems_device_major_number registered_not;
83  rtems_device_major_number invalid_major = _IO_Number_of_drivers + 1;
84  rtems_interrupt_level level;
85  bool do_interrupt_context_test = true;
86
87  TEST_BEGIN();
88
89  /* Ensure that this test works as expected */
90  test_interrupt_context_enter( level );
91  do_interrupt_context_test = rtems_interrupt_is_in_progress();
92  test_interrupt_context_leave( level );
93
94  /*
95   *  Register a driver with init == NULL and open != NULL
96   */
97
98  puts( "Init - rtems_io_register_driver - init == NULL, open != NULL OK" );
99  sc = rtems_io_register_driver( 0, &test_driver, &registered );
100  printf( "Init - Major slot returned = %d\n", (int) registered );
101  directive_failed( sc, "rtems_io_register_driver" );
102
103  puts( "Init - rtems_io_register_driver - init == NULL, open != NULL OK" );
104  sc = rtems_io_register_driver( 0, &test_driver, &registered_not );
105  printf( "Init - Major slot returned = %d\n", (int) registered_not );
106  fatal_directive_status(
107    sc,
108    RTEMS_TOO_MANY,
109    "rtems_io_register_driver too many"
110  );
111
112  puts( "Init - rtems_io_register_driver - used slot" );
113  sc = rtems_io_register_driver( registered, &test_driver, &registered_not );
114  fatal_directive_status(
115    sc,
116    RTEMS_RESOURCE_IN_USE,
117    "rtems_io_register_driver slot in use"
118  );
119
120  puts( "Init - rtems_io_unregister_driver - used slot" );
121  sc = rtems_io_unregister_driver( registered );
122  directive_failed( sc, "rtems_io_unregister_driver" );
123
124  puts( "Init - rtems_io_register_driver - free slot" );
125  sc = rtems_io_register_driver( registered, &test_driver, &registered );
126  directive_failed( sc, "rtems_io_register_driver" );
127
128  puts( "Init - rtems_io_register_driver - called from interrupt context" );
129  if ( do_interrupt_context_test ) {
130    test_interrupt_context_enter( level );
131    sc = rtems_io_register_driver( 0, NULL, NULL );
132    test_interrupt_context_leave( level );
133    fatal_directive_status(
134      sc,
135      RTEMS_CALLED_FROM_ISR,
136      "rtems_io_register_driver"
137    );
138  }
139
140  puts( "Init - rtems_io_register_driver - invalid registered major pointer" );
141  sc = rtems_io_register_driver( 0, NULL, NULL );
142  fatal_directive_status(
143    sc,
144    RTEMS_INVALID_ADDRESS,
145    "rtems_io_register_driver"
146  );
147
148  puts( "Init - rtems_io_register_driver - invalid driver table pointer" );
149  sc = rtems_io_register_driver( 0, NULL, &registered );
150  fatal_directive_status(
151    sc,
152    RTEMS_INVALID_ADDRESS,
153    "rtems_io_register_driver"
154  );
155
156  puts( "Init - rtems_io_register_driver - invalid empty driver table" );
157  test_driver.open_entry = NULL;
158  sc = rtems_io_register_driver( 0, &test_driver, &registered );
159  test_driver.open_entry = test_open;
160  fatal_directive_status(
161    sc,
162    RTEMS_INVALID_ADDRESS,
163    "rtems_io_register_driver"
164  );
165
166  puts( "Init - rtems_io_register_driver - invalid major" );
167  sc = rtems_io_register_driver( invalid_major, &test_driver, &registered );
168  fatal_directive_status(
169    sc,
170    RTEMS_INVALID_NUMBER,
171    "rtems_io_register_driver"
172  );
173
174  puts( "Init - rtems_io_unregister_driver - called from interrupt context" );
175  if ( do_interrupt_context_test ) {
176    test_interrupt_context_enter( level );
177    sc = rtems_io_unregister_driver( 0 );
178    test_interrupt_context_leave( level );
179    fatal_directive_status(
180      sc,
181      RTEMS_CALLED_FROM_ISR,
182      "rtems_io_unregister_driver"
183    );
184  }
185
186  puts( "Init - rtems_io_unregister_driver - invalid major number" );
187  sc = rtems_io_unregister_driver( invalid_major );
188  fatal_directive_status(
189    sc,
190    RTEMS_UNSATISFIED,
191    "rtems_io_unregister_driver"
192  );
193
194  TEST_END();
195  rtems_test_exit( 0 );
196}
197
198/* configuration information */
199
200#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
201#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
202#define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
203
204/* more one more driver slot than are statically configured */
205#define CONFIGURE_MAXIMUM_DRIVERS 2
206
207#define CONFIGURE_MAXIMUM_TASKS  1
208#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
209
210#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
211
212#define CONFIGURE_INIT
213#include <rtems/confdefs.h>
214
215/* end of include file */
Note: See TracBrowser for help on using the repository browser.