[PATCH] score: Statically initialize IO manager

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Apr 7 14:51:32 UTC 2014


This simplifies the RTEMS initialization and helps to avoid a memory
overhead.  The workspace demands of the IO manager were not included in
the <rtems/confdefs.h> workspace size estimate.  This is also fixed as a
side-effect.
---
 cpukit/libmisc/monitor/mon-driver.c |    5 +--
 cpukit/sapi/include/confdefs.h      |   37 +++++++++--------------
 cpukit/sapi/include/rtems/config.h  |   13 --------
 cpukit/sapi/include/rtems/io.h      |   13 +-------
 cpukit/sapi/src/exinit.c            |    3 --
 cpukit/sapi/src/io.c                |   56 -----------------------------------
 testsuites/libtests/block11/init.c  |    1 -
 testsuites/sptests/sp21/init.c      |    3 +-
 testsuites/sptests/spsize/size.c    |    3 --
 9 files changed, 19 insertions(+), 115 deletions(-)

diff --git a/cpukit/libmisc/monitor/mon-driver.c b/cpukit/libmisc/monitor/mon-driver.c
index 70073c6..8abe281 100644
--- a/cpukit/libmisc/monitor/mon-driver.c
+++ b/cpukit/libmisc/monitor/mon-driver.c
@@ -63,10 +63,9 @@ rtems_monitor_driver_next(
     rtems_id              *next_id
 )
 {
-    const rtems_configuration_table *c = &Configuration;
     uint32_t   n = rtems_object_id_get_index(*next_id);
 
-    if (n >= c->number_of_device_drivers)
+    if (n >= _IO_Number_of_drivers)
         goto failed;
 
     _Thread_Disable_dispatch();
@@ -79,7 +78,7 @@ rtems_monitor_driver_next(
     canonical_driver->name = rtems_build_name('-', '-', '-', '-');
 
     *next_id += 1;
-    return (const void *) (c->Device_driver_table + n);
+    return (const void *) (&_IO_Driver_address_table[n]);
 
 failed:
     *next_id = RTEMS_OBJECT_ID_FINAL;
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
index 5f64d73..53a8699 100644
--- a/cpukit/sapi/include/confdefs.h
+++ b/cpukit/sapi/include/confdefs.h
@@ -70,7 +70,6 @@ extern "C" {
 #endif
 
 extern rtems_initialization_tasks_table Initialization_tasks[];
-extern rtems_driver_address_table       Device_drivers[];
 #if defined(RTEMS_MULTIPROCESSING)
   extern rtems_multiprocessing_table      Multiprocessing_configuration;
 #endif
@@ -1202,8 +1201,18 @@ const rtems_libio_helper rtems_fs_init_helper =
 
 #ifndef CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
 
+/**
+ * This specifies the maximum number of device drivers that
+ * can be installed in the system at one time.  It must account
+ * for both the statically and dynamically installed drivers.
+ */
+#ifndef CONFIGURE_MAXIMUM_DRIVERS
+  #define CONFIGURE_MAXIMUM_DRIVERS
+#endif
+
 #ifdef CONFIGURE_INIT
-  rtems_driver_address_table Device_drivers[] = {
+  rtems_driver_address_table
+    _IO_Driver_address_table[ CONFIGURE_MAXIMUM_DRIVERS ] = {
     #ifdef CONFIGURE_BSP_PREREQUISITE_DRIVERS
       CONFIGURE_BSP_PREREQUISITE_DRIVERS,
     #endif
@@ -1254,27 +1263,12 @@ const rtems_libio_helper rtems_fs_init_helper =
       NULL_DRIVER_TABLE_ENTRY
     #endif
   };
-#endif
-
-#endif  /* CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE */
 
-/*
- *  Default the number of drivers per node.  This value may be
- *  overridden by the user.
- */
-
-#define CONFIGURE_NUMBER_OF_DRIVERS \
-  RTEMS_ARRAY_SIZE(Device_drivers)
-
-/**
- * This specifies the maximum number of device drivers that
- * can be installed in the system at one time.  It must account
- * for both the statically and dynamically installed drivers.
- */
-#ifndef CONFIGURE_MAXIMUM_DRIVERS
-  #define CONFIGURE_MAXIMUM_DRIVERS CONFIGURE_NUMBER_OF_DRIVERS
+  const size_t _IO_Number_of_drivers =
+    RTEMS_ARRAY_SIZE( _IO_Driver_address_table );
 #endif
 
+#endif  /* CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE */
 
 #ifdef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
   /*
@@ -2475,9 +2469,6 @@ const rtems_libio_helper rtems_fs_init_helper =
         false,
       #endif
     #endif
-    CONFIGURE_MAXIMUM_DRIVERS,                /* maximum device drivers */
-    CONFIGURE_NUMBER_OF_DRIVERS,              /* static device drivers */
-    Device_drivers,                           /* pointer to driver table */
     CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS,   /* number of static extensions */
     CONFIGURE_INITIAL_EXTENSION_TABLE,        /* pointer to static extensions */
     #if defined(RTEMS_MULTIPROCESSING)
diff --git a/cpukit/sapi/include/rtems/config.h b/cpukit/sapi/include/rtems/config.h
index 0998f05..9a9d0a3 100644
--- a/cpukit/sapi/include/rtems/config.h
+++ b/cpukit/sapi/include/rtems/config.h
@@ -57,7 +57,6 @@ typedef void *posix_api_configuration_table;
 #include <rtems/rtems/config.h>
 
 #include <rtems/extension.h>
-#include <rtems/io.h>
 #if defined(RTEMS_MULTIPROCESSING)
 #include <rtems/score/mpci.h>
 #endif
@@ -242,9 +241,6 @@ typedef struct {
     bool                         smp_enabled;
   #endif
 
-  uint32_t                       maximum_drivers;
-  uint32_t                       number_of_device_drivers;
-  rtems_driver_address_table    *Device_driver_table;
   uint32_t                       number_of_initial_extensions;
   const rtems_extensions_table  *User_extension_table;
   #if defined(RTEMS_MULTIPROCESSING)
@@ -335,15 +331,6 @@ extern const rtems_configuration_table Configuration;
 #define rtems_configuration_get_do_zero_of_workspace() \
    (Configuration.do_zero_of_workspace)
 
-#define rtems_configuration_get_maximum_drivers() \
-        (Configuration.maximum_drivers)
-
-#define rtems_configuration_get_number_of_device_drivers() \
-        (Configuration.number_of_device_drivers)
-
-#define rtems_configuration_get_device_driver_table() \
-        (Configuration.Device_driver_table)
-
 #define rtems_configuration_get_number_of_initial_extensions() \
         (Configuration.number_of_initial_extensions)
 
diff --git a/cpukit/sapi/include/rtems/io.h b/cpukit/sapi/include/rtems/io.h
index 799a305..ce750b0 100644
--- a/cpukit/sapi/include/rtems/io.h
+++ b/cpukit/sapi/include/rtems/io.h
@@ -250,18 +250,9 @@ rtems_status_code rtems_io_lookup_name(
     rtems_driver_name_t  *device_info
 ) RTEMS_COMPILER_DEPRECATED_ATTRIBUTE;
 
-SAPI_IO_EXTERN uint32_t _IO_Number_of_drivers;
+extern const size_t _IO_Number_of_drivers;
 
-SAPI_IO_EXTERN rtems_driver_address_table *_IO_Driver_address_table;
-
-/**
- * @brief Initialization of device drivers.
- *
- * NOTE: The IO manager has been extended to support runtime driver
- * registration. The driver table is now allocated in the
- * workspace.
- */
-void _IO_Manager_initialization( void );
+extern rtems_driver_address_table _IO_Driver_address_table[];
 
 /**
  * @brief Initialization of all device drivers.
diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
index 45c6cf6..235ba77 100644
--- a/cpukit/sapi/src/exinit.c
+++ b/cpukit/sapi/src/exinit.c
@@ -32,7 +32,6 @@
 #include <rtems/debug.h>
 #include <rtems/extensionimpl.h>
 #include <rtems/init.h>
-#include <rtems/io.h>
 #include <rtems/score/sysstate.h>
 
 #include <rtems/score/apiext.h>
@@ -142,8 +141,6 @@ void rtems_initialize_data_structures(void)
 
   _Extension_Manager_initialization();
 
-  _IO_Manager_initialization();
-
   _POSIX_API_Initialize();
 
   _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
diff --git a/cpukit/sapi/src/io.c b/cpukit/sapi/src/io.c
index 99da902..c14f5e7 100644
--- a/cpukit/sapi/src/io.c
+++ b/cpukit/sapi/src/io.c
@@ -19,63 +19,7 @@
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
-#include <rtems/config.h>
 #include <rtems/io.h>
-#include <rtems/score/isr.h>
-#include <rtems/score/thread.h>
-#include <rtems/score/wkspace.h>
-
-#include <string.h>
-
-void _IO_Manager_initialization(void)
-{
-  uint32_t                    index;
-  rtems_driver_address_table *driver_table;
-  uint32_t                    drivers_in_table;
-  uint32_t                    number_of_drivers;
-
-  driver_table      = rtems_configuration_get_device_driver_table();
-  drivers_in_table  = rtems_configuration_get_number_of_device_drivers();
-  number_of_drivers = rtems_configuration_get_maximum_drivers();
-
-  /*
-   *  If the user claims there are less drivers than are actually in
-   *  the table, then let's just go with the table's count.
-   */
-  if ( number_of_drivers <= drivers_in_table )
-    number_of_drivers = drivers_in_table;
-
-  /*
-   *  If the maximum number of driver is the same as the number in the
-   *  table, then we do not have to copy the driver table.  They can't
-   *  register any dynamically.
-   */
-  if ( number_of_drivers == drivers_in_table ) {
-    _IO_Driver_address_table = driver_table;
-    _IO_Number_of_drivers = number_of_drivers;
-    return;
-  }
-
-  /*
-   *  The application requested extra slots in the driver table, so we
-   *  have to allocate a new driver table and copy theirs to it.
-   */
-
-  _IO_Driver_address_table = (rtems_driver_address_table *)
-      _Workspace_Allocate_or_fatal_error(
-        sizeof( rtems_driver_address_table ) * ( number_of_drivers )
-      );
-  _IO_Number_of_drivers = number_of_drivers;
-
-  memset(
-    _IO_Driver_address_table, 0,
-    sizeof( rtems_driver_address_table ) * ( number_of_drivers )
-  );
-
-  for ( index = 0 ; index < drivers_in_table ; index++ )
-    _IO_Driver_address_table[index] = driver_table[index];
-}
 
 void _IO_Initialize_all_drivers( void )
 {
diff --git a/testsuites/libtests/block11/init.c b/testsuites/libtests/block11/init.c
index e144f0c..0704dad 100644
--- a/testsuites/libtests/block11/init.c
+++ b/testsuites/libtests/block11/init.c
@@ -434,7 +434,6 @@ static rtems_task Init(rtems_task_argument argument)
 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 5
 
 #define CONFIGURE_MAXIMUM_TASKS 1
-#define CONFIGURE_MAXIMUM_DRIVERS 2
 
 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
 
diff --git a/testsuites/sptests/sp21/init.c b/testsuites/sptests/sp21/init.c
index 62a48b8..0eb453c 100644
--- a/testsuites/sptests/sp21/init.c
+++ b/testsuites/sptests/sp21/init.c
@@ -29,8 +29,7 @@ void do_test_zero_driver(void);
 #define STUB_DRIVER_MAJOR     0x2
 #define ZERO_DRIVER_MAJOR     0x3
 #define NO_DRIVER_MAJOR       0x4
-#define INVALID_DRIVER_MAJOR  \
-     (rtems_configuration_get_number_of_device_drivers() + 1)
+#define INVALID_DRIVER_MAJOR  UINT32_MAX
 
 /* driver entries to use with io_register */
 rtems_driver_address_table GoodDriver = DEVNULL_DRIVER_TABLE_ENTRY;
diff --git a/testsuites/sptests/spsize/size.c b/testsuites/sptests/spsize/size.c
index 6acdaa6..a6e6047 100644
--- a/testsuites/sptests/spsize/size.c
+++ b/testsuites/sptests/spsize/size.c
@@ -290,9 +290,6 @@ uninitialized =
 
 /*intr.h*/      0                                         +
 
-/*io.h*/        (sizeof _IO_Number_of_drivers)            +
-                (sizeof _IO_Driver_address_table)         +
-
 /*isr.h*/       (sizeof _ISR_Nest_level)                  +
 #if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
                 (sizeof _ISR_Vector_table)                +
-- 
1.7.7




More information about the devel mailing list