[PATCH 2/5] config: Add _MPCI_Configuration
Sebastian Huber
sebastian.huber at embedded-brains.de
Thu Dec 12 08:43:04 UTC 2019
Replace the user MPCI configuration table with a system provided
_MPCI_Configuration.
Update #3735.
---
bsps/include/shm_driver.h | 2 +-
cpukit/Makefile.am | 1 +
cpukit/include/rtems/confdefs.h | 16 +++++----
cpukit/include/rtems/config.h | 63 ++----------------------------------
cpukit/include/rtems/rtems/types.h | 5 +++
cpukit/include/rtems/score/mpci.h | 34 +++++++++++++++++++
cpukit/libmisc/monitor/mon-monitor.c | 3 +-
cpukit/libmisc/monitor/mon-mpci.c | 15 +++------
cpukit/libmisc/monitor/mon-server.c | 4 +--
cpukit/score/src/mpci.c | 26 ++-------------
cpukit/score/src/mpcidefault.c | 31 ++++++++++++++++++
cpukit/score/src/objectmp.c | 6 ++--
cpukit/score/src/thread.c | 2 +-
testsuites/sptests/spsize/size.c | 9 +-----
14 files changed, 99 insertions(+), 118 deletions(-)
create mode 100644 cpukit/score/src/mpcidefault.c
diff --git a/bsps/include/shm_driver.h b/bsps/include/shm_driver.h
index 3dca866aa1..f81945b3d8 100644
--- a/bsps/include/shm_driver.h
+++ b/bsps/include/shm_driver.h
@@ -433,7 +433,7 @@ struct shm_config_info {
typedef struct shm_config_info shm_config_table;
-#define SHM_MAXIMUM_NODES Multiprocessing_configuration.maximum_nodes
+#define SHM_MAXIMUM_NODES _MPCI_Configuration.maximum_nodes
/* global variables */
diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am
index 71daca821a..6e5d05ceea 100644
--- a/cpukit/Makefile.am
+++ b/cpukit/Makefile.am
@@ -1060,6 +1060,7 @@ librtemscpu_a_SOURCES += rtems/src/semmp.c
librtemscpu_a_SOURCES += rtems/src/signalmp.c
librtemscpu_a_SOURCES += rtems/src/taskmp.c
librtemscpu_a_SOURCES += score/src/mpci.c
+librtemscpu_a_SOURCES += score/src/mpcidefault.c
librtemscpu_a_SOURCES += score/src/objectmp.c
librtemscpu_a_SOURCES += score/src/threadmp.c
diff --git a/cpukit/include/rtems/confdefs.h b/cpukit/include/rtems/confdefs.h
index 6265350bef..c827f2c188 100644
--- a/cpukit/include/rtems/confdefs.h
+++ b/cpukit/include/rtems/confdefs.h
@@ -1853,7 +1853,15 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
#endif
#ifdef CONFIGURE_INIT
- rtems_multiprocessing_table Multiprocessing_configuration = {
+ #if CONFIGURE_MP_NODE_NUMBER < 1
+ #error "CONFIGURE_MP_NODE_NUMBER must be greater than or equal to one"
+ #endif
+
+ #if CONFIGURE_MP_NODE_NUMBER > CONFIGURE_MP_MAXIMUM_NODES
+ #error "CONFIGURE_MP_NODE_NUMBER must be less than or equal to CONFIGURE_MP_MAXIMUM_NODES"
+ #endif
+
+ const MPCI_Configuration _MPCI_Configuration = {
CONFIGURE_MP_NODE_NUMBER, /* local node number */
CONFIGURE_MP_MAXIMUM_NODES, /* maximum # nodes */
CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS, /* maximum # global objects */
@@ -1863,11 +1871,8 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
};
#endif
- #define CONFIGURE_MULTIPROCESSING_TABLE &Multiprocessing_configuration
-
#define _CONFIGURE_MPCI_RECEIVE_SERVER_COUNT 1
#else
- #define CONFIGURE_MULTIPROCESSING_TABLE NULL
#define _CONFIGURE_MPCI_RECEIVE_SERVER_COUNT 0
#endif /* CONFIGURE_MP_APPLICATION */
#else
@@ -2896,9 +2901,6 @@ struct _reent *__getreent(void)
false,
#endif
#endif
- #if defined(RTEMS_MULTIPROCESSING)
- CONFIGURE_MULTIPROCESSING_TABLE, /* pointer to MP config table */
- #endif
#ifdef RTEMS_SMP
_CONFIGURE_MAXIMUM_PROCESSORS,
#endif
diff --git a/cpukit/include/rtems/config.h b/cpukit/include/rtems/config.h
index 23fad8d83c..15e944dd2f 100644
--- a/cpukit/include/rtems/config.h
+++ b/cpukit/include/rtems/config.h
@@ -35,7 +35,7 @@
#include <rtems/posix/config.h>
#include <rtems/extension.h>
#if defined(RTEMS_MULTIPROCESSING)
-#include <rtems/score/mpci.h>
+#include <rtems/rtems/types.h>
#endif
#ifdef __cplusplus
@@ -53,35 +53,6 @@ extern "C" {
#define rtems_resource_maximum_per_allocation(resource) \
_Objects_Maximum_per_allocation(resource)
-#if defined(RTEMS_MULTIPROCESSING)
-/*
- * The following records define the Multiprocessor Configuration
- * Table. This table defines the multiprocessor system
- * characteristics which must be known by RTEMS in a multiprocessor
- * system.
- */
-typedef struct {
- /** This is the local node number. */
- uint32_t node;
- /** This is the maximum number of nodes in system. */
- uint32_t maximum_nodes;
- /** This is the maximum number of global objects. */
- uint32_t maximum_global_objects;
- /** This is the maximum number of proxies. */
- uint32_t maximum_proxies;
-
- /**
- * The MPCI Receive server is assumed to have a stack of at least
- * minimum stack size. This field specifies the amount of extra
- * stack this task will be given in bytes.
- */
- uint32_t extra_mpci_receive_server_stack;
-
- /** This is a pointer to User/BSP provided MPCI Table. */
- rtems_mpci_table *User_mpci_table;
-} rtems_multiprocessing_table;
-#endif
-
/**
* @brief Task stack allocator initialization hook.
*
@@ -206,9 +177,6 @@ typedef struct {
bool smp_enabled;
#endif
- #if defined(RTEMS_MULTIPROCESSING)
- rtems_multiprocessing_table *User_multiprocessing_table;
- #endif
#ifdef RTEMS_SMP
uint32_t maximum_processors;
#endif
@@ -219,31 +187,6 @@ typedef struct {
*/
extern const rtems_configuration_table Configuration;
-#if defined(RTEMS_MULTIPROCESSING)
- /**
- * This points to the multiprocessing configuration table.
- */
- extern rtems_multiprocessing_table *_Configuration_MP_table;
-#endif
-
-#if defined(RTEMS_MULTIPROCESSING)
- /**
- * @brief RTEMS multiprocessing configuration table.
- *
- * This is the RTEMS Multiprocessing Configuration Table expected to
- * be generated by confdefs.h.
- */
- extern rtems_multiprocessing_table Multiprocessing_configuration;
-
- /*
- * This is the default Multiprocessing Configuration Table.
- * It is used in single processor configurations.
- */
- extern const rtems_multiprocessing_table
- _Initialization_Default_multiprocessing_table;
-#endif
-
-
/*
* Some handy macros to avoid dependencies on either the BSP
* or the exact format of the configuration table.
@@ -308,10 +251,10 @@ uint32_t rtems_configuration_get_maximum_extensions( void );
#if defined(RTEMS_MULTIPROCESSING)
#define rtems_configuration_get_user_multiprocessing_table() \
- (Configuration.User_multiprocessing_table)
+ (&_MPCI_Configuration)
#else
#define rtems_configuration_get_user_multiprocessing_table() \
- NULL
+ NULL
#endif
/**
diff --git a/cpukit/include/rtems/rtems/types.h b/cpukit/include/rtems/rtems/types.h
index 47c3b4c04e..b0600eb0a8 100644
--- a/cpukit/include/rtems/rtems/types.h
+++ b/cpukit/include/rtems/rtems/types.h
@@ -221,6 +221,11 @@ typedef MPCI_Entry rtems_mpci_entry;
*/
typedef MPCI_Control rtems_mpci_table;
+/**
+ * @brief Structure which is used to configure an MPCI handler.
+ */
+typedef MPCI_Configuration rtems_multiprocessing_table;
+
#endif
/** @} */
diff --git a/cpukit/include/rtems/score/mpci.h b/cpukit/include/rtems/score/mpci.h
index e5bcdbaced..a72b1f0d5b 100644
--- a/cpukit/include/rtems/score/mpci.h
+++ b/cpukit/include/rtems/score/mpci.h
@@ -128,6 +128,40 @@ typedef struct {
MPCI_receive_entry receive_packet;
} MPCI_Control;
+/*
+ * The following records define the Multiprocessor Configuration
+ * Table. This table defines the multiprocessor system
+ * characteristics which must be known by RTEMS in a multiprocessor
+ * system.
+ */
+typedef struct {
+ /** This is the local node number. */
+ uint32_t node;
+ /** This is the maximum number of nodes in system. */
+ uint32_t maximum_nodes;
+ /** This is the maximum number of global objects. */
+ uint32_t maximum_global_objects;
+ /** This is the maximum number of proxies. */
+ uint32_t maximum_proxies;
+
+ /**
+ * The MPCI Receive server is assumed to have a stack of at least
+ * minimum stack size. This field specifies the amount of extra
+ * stack this task will be given in bytes.
+ */
+ uint32_t extra_mpci_receive_server_stack;
+
+ /** This is a pointer to User/BSP provided MPCI Table. */
+ MPCI_Control *User_mpci_table;
+} MPCI_Configuration;
+
+/**
+ * @brief The MPCI configuration.
+ *
+ * Provided by the application via <rtems/confdefs.h>.
+ */
+extern const MPCI_Configuration _MPCI_Configuration;
+
/** @} */
#ifdef __cplusplus
diff --git a/cpukit/libmisc/monitor/mon-monitor.c b/cpukit/libmisc/monitor/mon-monitor.c
index a990548e61..9c099dc57c 100644
--- a/cpukit/libmisc/monitor/mon-monitor.c
+++ b/cpukit/libmisc/monitor/mon-monitor.c
@@ -360,8 +360,7 @@ void rtems_monitor_node_cmd(
}
if ((new_node >= 1) &&
- _Configuration_MP_table &&
- (new_node <= _Configuration_MP_table->maximum_nodes))
+ (new_node <= _MPCI_Configuration.maximum_nodes))
rtems_monitor_default_node = new_node;
}
#endif
diff --git a/cpukit/libmisc/monitor/mon-mpci.c b/cpukit/libmisc/monitor/mon-mpci.c
index 1ede142e52..9616518473 100644
--- a/cpukit/libmisc/monitor/mon-mpci.c
+++ b/cpukit/libmisc/monitor/mon-mpci.c
@@ -28,13 +28,10 @@ rtems_monitor_mpci_canonical(
const void *config_void
)
{
- const rtems_configuration_table *c = &Configuration;
- rtems_multiprocessing_table *m;
- rtems_mpci_table *mt;
+ const rtems_multiprocessing_table *m;
+ const rtems_mpci_table *mt;
- m = c->User_multiprocessing_table;
- if (m == 0)
- return;
+ m = rtems_configuration_get_user_multiprocessing_table();
mt = m->User_mpci_table;
canonical_mpci->node = m->node;
@@ -70,19 +67,15 @@ rtems_monitor_mpci_next(
rtems_id *next_id
)
{
- const rtems_configuration_table *c = &Configuration;
int n = rtems_object_id_get_index(*next_id);
if (n >= 1)
goto failed;
- if ( ! c->User_multiprocessing_table)
- goto failed;
-
_Objects_Allocator_lock();
*next_id += 1;
- return (void *) c;
+ return &Configuration;
failed:
*next_id = RTEMS_OBJECT_ID_FINAL;
diff --git a/cpukit/libmisc/monitor/mon-server.c b/cpukit/libmisc/monitor/mon-server.c
index 3cb6cdf7ce..d8a1687f0b 100644
--- a/cpukit/libmisc/monitor/mon-server.c
+++ b/cpukit/libmisc/monitor/mon-server.c
@@ -221,9 +221,9 @@ rtems_monitor_server_init(
rtems_status_code status;
if (_System_state_Is_multiprocessing &&
- (_Configuration_MP_table->maximum_nodes > 1))
+ (_MPCI_Configuration.maximum_nodes > 1))
{
- uint32_t maximum_nodes = _Configuration_MP_table->maximum_nodes;
+ uint32_t maximum_nodes = _MPCI_Configuration.maximum_nodes;
/*
* create the msg que our server will listen
diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c
index f488325fc5..424090b117 100644
--- a/cpukit/score/src/mpci.c
+++ b/cpukit/score/src/mpci.c
@@ -27,7 +27,6 @@
#include <rtems/score/schedulerimpl.h>
#include <rtems/score/threadimpl.h>
#include <rtems/score/threadqimpl.h>
-#include <rtems/config.h>
#include <rtems/sysinit.h>
RTEMS_STATIC_ASSERT(
@@ -39,18 +38,6 @@ RTEMS_STATIC_ASSERT(
bool _System_state_Is_multiprocessing;
-rtems_multiprocessing_table *_Configuration_MP_table;
-
-const rtems_multiprocessing_table
- _Initialization_Default_multiprocessing_table = {
- 1, /* local node number */
- 1, /* maximum number nodes in system */
- 0, /* maximum number global objects */
- 0, /* maximum number proxies */
- STACK_MINIMUM_SIZE, /* MPCI receive server stack size */
- NULL /* pointer to MPCI address table */
-};
-
/**
* This is the core semaphore which the MPCI Receive Server blocks on.
*/
@@ -72,14 +59,7 @@ static void _MPCI_Handler_early_initialization( void )
* In an MP configuration, internally we view single processor
* systems as a very restricted multiprocessor system.
*/
- _Configuration_MP_table = rtems_configuration_get_user_multiprocessing_table();
-
- if ( _Configuration_MP_table == NULL ) {
- _Configuration_MP_table = RTEMS_DECONST(
- rtems_multiprocessing_table *,
- &_Initialization_Default_multiprocessing_table
- );
- } else {
+ if ( _MPCI_Configuration.maximum_nodes > 1 ) {
_System_state_Is_multiprocessing = true;
}
@@ -92,7 +72,7 @@ static void _MPCI_Handler_initialization( void )
_Objects_MP_Handler_initialization();
- users_mpci_table = _Configuration_MP_table->User_mpci_table;
+ users_mpci_table = _MPCI_Configuration.User_mpci_table;
if ( _System_state_Is_multiprocessing && !users_mpci_table )
_Internal_error( INTERNAL_ERROR_NO_MPCI );
@@ -152,7 +132,7 @@ static void _MPCI_Create_server( void )
NULL, /* allocate the stack */
_Stack_Minimum() +
CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK +
- _Configuration_MP_table->extra_mpci_receive_server_stack,
+ _MPCI_Configuration.extra_mpci_receive_server_stack
CPU_ALL_TASKS_ARE_FP,
PRIORITY_PSEUDO_ISR,
false, /* no preempt */
diff --git a/cpukit/score/src/mpcidefault.c b/cpukit/score/src/mpcidefault.c
new file mode 100644
index 0000000000..60f1ef31a7
--- /dev/null
+++ b/cpukit/score/src/mpcidefault.c
@@ -0,0 +1,31 @@
+/**
+ * @file
+ *
+ * @brief Multiprocessing Communications Interface (MPCI) Default Configuration
+ * @ingroup RTEMSScoreMPCI
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2014.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/mpci.h>
+#include <rtems/score/stack.h>
+
+const MPCI_Configuration _MPCI_Configuration = {
+ 1, /* local node number */
+ 1, /* maximum number nodes in system */
+ 0, /* maximum number global objects */
+ 0, /* maximum number proxies */
+ STACK_MINIMUM_SIZE, /* MPCI receive server stack size */
+ NULL /* pointer to MPCI address table */
+};
diff --git a/cpukit/score/src/objectmp.c b/cpukit/score/src/objectmp.c
index 74ed22033a..1910b8ccba 100644
--- a/cpukit/score/src/objectmp.c
+++ b/cpukit/score/src/objectmp.c
@@ -161,8 +161,8 @@ void _Objects_MP_Handler_early_initialization(void)
uint32_t node;
uint32_t maximum_nodes;
- node = _Configuration_MP_table->node;
- maximum_nodes = _Configuration_MP_table->maximum_nodes;
+ node = _MPCI_Configuration.node;
+ maximum_nodes = _MPCI_Configuration.maximum_nodes;
if ( node < 1 || node > maximum_nodes )
_Internal_error( INTERNAL_ERROR_INVALID_NODE );
@@ -175,7 +175,7 @@ void _Objects_MP_Handler_initialization( void )
{
uint32_t maximum_global_objects;
- maximum_global_objects = _Configuration_MP_table->maximum_global_objects;
+ maximum_global_objects = _MPCI_Configuration.maximum_global_objects;
_Objects_MP_Maximum_global_objects = maximum_global_objects;
diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c
index 812d9296af..32a5132eee 100644
--- a/cpukit/score/src/thread.c
+++ b/cpukit/score/src/thread.c
@@ -62,7 +62,7 @@ void _Thread_Handler_initialization(void)
rtems_configuration_get_stack_allocate_init_hook();
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies =
- _Configuration_MP_table->maximum_proxies;
+ _MPCI_Configuration.maximum_proxies;
#endif
if ( rtems_configuration_get_stack_allocate_hook() == NULL ||
diff --git a/testsuites/sptests/spsize/size.c b/testsuites/sptests/spsize/size.c
index 1369cd7072..578576cba7 100644
--- a/testsuites/sptests/spsize/size.c
+++ b/testsuites/sptests/spsize/size.c
@@ -250,10 +250,7 @@ uninitialized =
/*clock.h*/ 0 +
-/*config.h*/
- #if defined(RTEMS_MULTIPROCESSING)
- (sizeof _Configuration_MP_table) +
- #endif
+/*config.h*/ 0 +
/*context.h*/ (sizeof _Thread_Dispatch_necessary) +
@@ -433,10 +430,6 @@ uninitialized += (sizeof _CPU_Interrupt_stack_low) +
initialized +=
/*copyrt.h*/ (strlen(_Copyright_Notice)+1) +
-
-#if defined(RTEMS_MULTIPROCESSING)
- (sizeof _Initialization_Default_multiprocessing_table) +
-#endif
(strlen(_RTEMS_version)+1);
--
2.16.4
More information about the devel
mailing list