From 9216d4e8abc689ad1b7f60476338ec12e90c29f5 Mon Sep 17 00:00:00 2001 From: Amar Takhar Date: Sun, 28 Dec 2014 17:17:16 -0500 Subject: Move the score MP headers. --- cpukit/score/include/rtems/score/mpci.h | 135 ---------------- cpukit/score/include/rtems/score/mppkt.h | 121 --------------- cpukit/score/include/rtems/score/objectmp.h | 228 ---------------------------- cpukit/score/include/rtems/score/threadmp.h | 127 ---------------- include/rtems/score/mpci.h | 135 ++++++++++++++++ include/rtems/score/mppkt.h | 121 +++++++++++++++ include/rtems/score/objectmp.h | 228 ++++++++++++++++++++++++++++ include/rtems/score/threadmp.h | 127 ++++++++++++++++ 8 files changed, 611 insertions(+), 611 deletions(-) delete mode 100644 cpukit/score/include/rtems/score/mpci.h delete mode 100644 cpukit/score/include/rtems/score/mppkt.h delete mode 100644 cpukit/score/include/rtems/score/objectmp.h delete mode 100644 cpukit/score/include/rtems/score/threadmp.h create mode 100644 include/rtems/score/mpci.h create mode 100644 include/rtems/score/mppkt.h create mode 100644 include/rtems/score/objectmp.h create mode 100644 include/rtems/score/threadmp.h diff --git a/cpukit/score/include/rtems/score/mpci.h b/cpukit/score/include/rtems/score/mpci.h deleted file mode 100644 index c20b45c3e1..0000000000 --- a/cpukit/score/include/rtems/score/mpci.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @file - * - * @ingroup ScoreMPCI - * - * @brief MPCI Layer API - */ - -/* - * COPYRIGHT (c) 1989-2009. - * 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. - */ - -#ifndef _RTEMS_SCORE_MPCI_H -#define _RTEMS_SCORE_MPCI_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup ScoreMPCI MPCI Handler - * - * @ingroup Score - * - * The MPCI Handler encapsulates functionality which is related to the - * generation, receipt, and processing of remote operations in a - * multiprocessor system. This handler contains the message passing - * support for making remote service calls as well as the server thread - * which processes requests from remote nodes. -*/ -/**@{*/ - -/** - * The following defines the node number used when a broadcast is desired. - */ -#define MPCI_ALL_NODES 0 - -/** - * This type is returned by all user provided MPCI routines. - */ -typedef void MPCI_Entry; - -/** - * This type defines the prototype for the initization entry point - * in an Multiprocessor Communications Interface. - */ -typedef MPCI_Entry ( *MPCI_initialization_entry )( void ); - -/** - * This type defines the prototype for the get packet entry point - * in an Multiprocessor Communications Interface. The single - * parameter will point to the packet allocated. - */ -typedef MPCI_Entry ( *MPCI_get_packet_entry )( - MP_packet_Prefix ** - ); - -/** - * This type defines the prototype for the return packet entry point - * in an Multiprocessor Communications Interface. The single - * parameter will point to a packet previously allocated by the - * get packet MPCI entry. - */ -typedef MPCI_Entry ( *MPCI_return_packet_entry )( - MP_packet_Prefix * - ); - -/** - * This type defines the prototype for send get packet entry point - * in an Multiprocessor Communications Interface. The single - * parameter will point to a packet previously allocated by the - * get packet entry point that has been filled in by the caller. - */ -typedef MPCI_Entry ( *MPCI_send_entry )( - uint32_t, - MP_packet_Prefix * - ); - -/** - * This type defines the prototype for the receive packet entry point - * in an Multiprocessor Communications Interface. The single - * parameter will point to a packet allocated and filled in by the - * receive packet handler. The caller will block until a packet is - * received. - */ -typedef MPCI_Entry ( *MPCI_receive_entry )( - MP_packet_Prefix ** - ); - -/** - * This type defines the Multiprocessor Communications - * Interface (MPCI) Table. This table defines the user-provided - * MPCI which is a required part of a multiprocessor system. - * - * For non-blocking local operations that become remote operations, - * we need a timeout. This is a per-driver timeout: default_timeout - */ -typedef struct { - /** This fields contains the timeout for MPCI operations in ticks. */ - uint32_t default_timeout; - /** This field contains the maximum size of a packet supported by this - * MPCI layer. This size places a limit on the size of a message - * which can be transmitted over this interface. - **/ - size_t maximum_packet_size; - /** This field points to the MPCI initialization entry point. */ - MPCI_initialization_entry initialization; - /** This field points to the MPCI get packet entry point. */ - MPCI_get_packet_entry get_packet; - /** This field points to the MPCI return packet entry point. */ - MPCI_return_packet_entry return_packet; - /** This field points to the MPCI send packet entry point. */ - MPCI_send_entry send_packet; - /** This field points to the MPCI receive packet entry point. */ - MPCI_receive_entry receive_packet; -} MPCI_Control; - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/cpukit/score/include/rtems/score/mppkt.h b/cpukit/score/include/rtems/score/mppkt.h deleted file mode 100644 index cd1d9b9cb2..0000000000 --- a/cpukit/score/include/rtems/score/mppkt.h +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @file rtems/score/mppkt.h - * - * @brief Specification for the Packet Handler - * - * This package is the specification for the Packet Handler. - * This handler defines the basic packet and provides - * mechanisms to utilize packets based on this prefix. - * Packets are the fundamental basis for messages passed between - * nodes in an MP system. - */ - -/* - * COPYRIGHT (c) 1989-2011. - * 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. - */ - -#ifndef _RTEMS_SCORE_MPPKT_H -#define _RTEMS_SCORE_MPPKT_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup ScoreMPPacket MP Packet Handler - * - * @ingroup Score - * - * This handler encapsulates the primary definition of MPCI packets. This - * handler defines the part of the packet that is common to all remote - * operations. - */ -/**@{*/ - -/** - * The following enumerated type defines the packet classes. - * - * @note In general, each class corresponds to a manager - * which supports global operations. Each manager - * defines the set of supported operations. - */ -typedef enum { - MP_PACKET_MPCI_INTERNAL = 0, - MP_PACKET_TASKS = 1, - MP_PACKET_MESSAGE_QUEUE = 2, - MP_PACKET_SEMAPHORE = 3, - MP_PACKET_PARTITION = 4, - MP_PACKET_REGION = 5, - MP_PACKET_EVENT = 6, - MP_PACKET_SIGNAL = 7 -} MP_packet_Classes; - -/** - * This constant defines the first entry in the MP_packet_Classes enumeration. - */ -#define MP_PACKET_CLASSES_FIRST MP_PACKET_MPCI_INTERNAL - -/** - * This constant defines the last entry in the MP_packet_Classes enumeration. - */ -#define MP_PACKET_CLASSES_LAST MP_PACKET_SIGNAL - -/** - * The following record contains the prefix for every packet - * passed between nodes in an MP system. - * - * @note This structure is padded to ensure that anything following it - * is on a 16 byte boundary. This is the most stringent structure - * alignment rule encountered yet. - */ -typedef struct { - /** This field indicates the API class of the operation being performed. */ - MP_packet_Classes the_class; - /** This field is the id of the object to be acted upon. */ - Objects_Id id; - /** This field is the ID of the originating thread. */ - Objects_Id source_tid; - /** This field is the priority of the originating thread. */ - Priority_Control source_priority; - /** This field is where the status of the operation will be returned. */ - uint32_t return_code; - /** This field is the length of the data following the prefix. */ - uint32_t length; - /** This field is the length of the data which required network conversion. */ - uint32_t to_convert; - /** This field is the requested timeout for this operation. */ - Watchdog_Interval timeout; -} MP_packet_Prefix; - -/** - * An MPCI must support packets of at least this size. - */ -#define MP_PACKET_MINIMUM_PACKET_SIZE 64 - -/** - * The following constant defines the number of uint32_t's - * in a packet which must be converted to native format in a - * heterogeneous system. In packets longer than - * MP_PACKET_MINIMUN_HETERO_CONVERSION uint32_t's, some of the "extra" data - * may a user message buffer which is not automatically endian swapped. - */ -#define MP_PACKET_MINIMUN_HETERO_CONVERSION \ - ( sizeof( MP_packet_Prefix ) / sizeof( uint32_t ) ) - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/cpukit/score/include/rtems/score/objectmp.h b/cpukit/score/include/rtems/score/objectmp.h deleted file mode 100644 index 934b3981ef..0000000000 --- a/cpukit/score/include/rtems/score/objectmp.h +++ /dev/null @@ -1,228 +0,0 @@ -/** - * @file rtems/score/objectmp.h - * - * @brief Data Associated with the Manipulation of Global RTEMS Objects - * - * This include file contains all the constants and structures associated - * with the manipulation of Global RTEMS Objects. - */ - -/* - * COPYRIGHT (c) 1989-2009. - * 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. - */ - -#ifndef _RTEMS_SCORE_OBJECTMP_H -#define _RTEMS_SCORE_OBJECTMP_H - -#ifndef _RTEMS_SCORE_OBJECTIMPL_H -# error "Never use directly; include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup ScoreObjectMP Object Handler Multiprocessing Support - * - * @ingroup Score - * - * This handler encapsulates functionality which is used to manage - * objects which have been declared to be globally visible. This handler - * knows objects from all of the nodes in the system. - */ -/**@{*/ - -/** - * @brief Intializes the inactive global object chain - * based on the maximum number of global objects configured. - * - * This routine intializes the inactive global object chain - * based on the maximum number of global objects configured. - */ -void _Objects_MP_Handler_initialization(void); - -/** - * @brief Intializes the global object node number - * used in the ID field of all objects. - * - * This routine intializes the global object node number - * used in the ID field of all objects. - */ -void _Objects_MP_Handler_early_initialization(void); - -/** - * @brief Place the specified global object in the - * specified information table. - * - * This routine place the specified global object in the - * specified information table. - * - * @param[in] information points to the object information table for this - * object class. - * @param[in] the_global_object points to the object being opened. - * @param[in] the_name is the name of the object being opened. - * @param[in] the_id is the Id of the object being opened. - * - * @todo This method only works for object types with 4 byte object names. - * It does not support variable length object names. - */ -void _Objects_MP_Open ( - Objects_Information *information, - Objects_MP_Control *the_global_object, - uint32_t the_name, - Objects_Id the_id -); - -/** - * @brief Allocates a global object control block - * and places it in the specified information table. - * - * This routine allocates a global object control block - * and places it in the specified information table. If the - * allocation fails, then is_fatal_error determines the - * error processing actions taken. - * - * @param[in] information points to the object information table for this - * object class. - * @param[in] the_name is the name of the object being opened. - * @param[in] the_id is the Id of the object being opened. - * @param[in] is_fatal_error is true if not being able to allocate the - * object is considered a fatal error. - * - * @todo This method only works for object types with 4 byte object names. - * It does not support variable length object names. - */ -bool _Objects_MP_Allocate_and_open ( - Objects_Information *information, - uint32_t the_name, - Objects_Id the_id, - bool is_fatal_error -); - -/** - * @brief Removes a global object from the specified information table. - * - * This routine removes a global object from the specified - * information table and deallocates the global object control block. - */ -void _Objects_MP_Close ( - Objects_Information *information, - Objects_Id the_id -); - -/** - * @brief Look for the object with the_name in the global - * object tables indicated by information. - * - * This routine looks for the object with the_name in the global - * object tables indicated by information. It returns the ID of the - * object with that name if one is found. - * - * @param[in] information points to the object information table for this - * object class. - * @param[in] the_name is the name of the object being searched for. - * @param[in] nodes_to_search indicates the set of nodes to search. - * @param[in] the_id will contain the Id of the object if found. - * - * @retval This method returns one of the - * @ref Objects_Name_or_id_lookup_errors. If successful, @a the_id - * will contain the Id of the object. - */ -Objects_Name_or_id_lookup_errors _Objects_MP_Global_name_search ( - Objects_Information *information, - Objects_Name the_name, - uint32_t nodes_to_search, - Objects_Id *the_id -); - -/** - * @brief Searches the Global Object Table managed - * by information for the object indicated by ID. - * - * This function searches the Global Object Table managed - * by information for the object indicated by ID. If the object - * is found, then location is set to objects_remote, otherwise - * location is set to objects_error. In both cases, the_object - * is undefined. - * - * @param[in] information points to the object information table for this - * object class. - * @param[in] the_id is the Id of the object being opened. - * @param[in] location will contain the location of the object. - * @param[in] the_object will contain a pointer to the object. - * - * @retval This method fills in @a location to indicate successful location - * of the object or error. On success, @a the_object will be - * filled in. - */ -void _Objects_MP_Is_remote ( - Objects_Information *information, - Objects_Id the_id, - Objects_Locations *location, - Objects_Control **the_object -); - -/** - * This is the maximum number of global objects configured. - */ -SCORE_EXTERN uint32_t _Objects_MP_Maximum_global_objects; - -/** - * The following chain header is used to manage the set of - * inactive global object control blocks. - */ -SCORE_EXTERN Chain_Control _Objects_MP_Inactive_global_objects; - -/** - * This function allocates a Global Object control block. - */ - -RTEMS_INLINE_ROUTINE Objects_MP_Control *_Objects_MP_Allocate_global_object ( - void -) -{ - return (Objects_MP_Control *) - _Chain_Get( &_Objects_MP_Inactive_global_objects ); -} - -/** - * This routine deallocates a Global Object control block. - */ - -RTEMS_INLINE_ROUTINE void _Objects_MP_Free_global_object ( - Objects_MP_Control *the_object -) -{ - _Chain_Append( - &_Objects_MP_Inactive_global_objects, - &the_object->Object.Node - ); -} - -/** - * This function returns whether the global object is NULL or not. - */ - -RTEMS_INLINE_ROUTINE bool _Objects_MP_Is_null_global_object ( - Objects_MP_Control *the_object -) -{ - return( the_object == NULL ); -} - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/cpukit/score/include/rtems/score/threadmp.h b/cpukit/score/include/rtems/score/threadmp.h deleted file mode 100644 index 27b6989893..0000000000 --- a/cpukit/score/include/rtems/score/threadmp.h +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @file rtems/score/threadmp.h - * - * @brief Multiprocessing Portion of the Thread Package - * - * This include file contains the specification for all routines - * and data specific to the multiprocessing portion of the thread package. - */ - -/* - * COPYRIGHT (c) 1989-2009. - * 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. - */ - -#ifndef _RTEMS_SCORE_THREADMP_H -#define _RTEMS_SCORE_THREADMP_H - -#ifndef _RTEMS_SCORE_THREADIMPL_H -# error "Never use directly; include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup ScoreThreadMP Thread Handler Multiprocessing Support - * - * @ingroup Score - * - * This handler encapsulates functionality which is related to managing - * threads in a multiprocessor system configuration. This handler must - * manage proxies which represent remote threads blocking on local - * operations. - */ -/**@{*/ - -/** - * @brief Initialize MP thread handler. - * - * This routine initializes the multiprocessing portion of the Thread Handler. - */ -void _Thread_MP_Handler_initialization ( - uint32_t maximum_proxies -); - -/** - * @brief Allocate a MP proxy control block from - * the inactive chain of free proxy control blocks. - * - * This allocates a proxy control block from - * the inactive chain of free proxy control blocks. - * - * @note This function returns a thread control pointer - * because proxies are substitutes for remote threads. - */ -Thread_Control *_Thread_MP_Allocate_proxy ( - States_Control the_state -); - -/** - * @brief Removes the MP proxy control block for the specified - * id from the active chain of proxy control blocks. - * - * This function removes the proxy control block for the specified - * id from the active chain of proxy control blocks. - */ -Thread_Control *_Thread_MP_Find_proxy ( - Objects_Id the_id -); - -/** - * @brief Manage the active set MP proxies. - * - * The following chain is used to manage the active set proxies. - */ -SCORE_EXTERN Chain_Control _Thread_MP_Active_proxies; - -/** - * @brief Manage the inactive set of MP proxies. - * - * The following chain is used to manage the inactive set of proxies. - */ -SCORE_EXTERN Chain_Control _Thread_MP_Inactive_proxies; - -/** - * This function returns true if the thread in question is the - * multiprocessing receive thread. - * - * @note This is a macro to avoid needing a prototype for - * _MPCI_Receive_server_tcb until it is used. - */ -#define _Thread_MP_Is_receive(_the_thread) \ - ((_the_thread) == _MPCI_Receive_server_tcb) - -/** - * This routine frees a proxy control block to the - * inactive chain of free proxy control blocks. - */ - -RTEMS_INLINE_ROUTINE void _Thread_MP_Free_proxy ( - Thread_Control *the_thread -) -{ - Thread_Proxy_control *the_proxy; - - the_proxy = (Thread_Proxy_control *) the_thread; - - _Chain_Extract( &the_proxy->Active ); - - _Chain_Append( &_Thread_MP_Inactive_proxies, &the_thread->Object.Node ); -} - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/include/rtems/score/mpci.h b/include/rtems/score/mpci.h new file mode 100644 index 0000000000..c20b45c3e1 --- /dev/null +++ b/include/rtems/score/mpci.h @@ -0,0 +1,135 @@ +/** + * @file + * + * @ingroup ScoreMPCI + * + * @brief MPCI Layer API + */ + +/* + * COPYRIGHT (c) 1989-2009. + * 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. + */ + +#ifndef _RTEMS_SCORE_MPCI_H +#define _RTEMS_SCORE_MPCI_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ScoreMPCI MPCI Handler + * + * @ingroup Score + * + * The MPCI Handler encapsulates functionality which is related to the + * generation, receipt, and processing of remote operations in a + * multiprocessor system. This handler contains the message passing + * support for making remote service calls as well as the server thread + * which processes requests from remote nodes. +*/ +/**@{*/ + +/** + * The following defines the node number used when a broadcast is desired. + */ +#define MPCI_ALL_NODES 0 + +/** + * This type is returned by all user provided MPCI routines. + */ +typedef void MPCI_Entry; + +/** + * This type defines the prototype for the initization entry point + * in an Multiprocessor Communications Interface. + */ +typedef MPCI_Entry ( *MPCI_initialization_entry )( void ); + +/** + * This type defines the prototype for the get packet entry point + * in an Multiprocessor Communications Interface. The single + * parameter will point to the packet allocated. + */ +typedef MPCI_Entry ( *MPCI_get_packet_entry )( + MP_packet_Prefix ** + ); + +/** + * This type defines the prototype for the return packet entry point + * in an Multiprocessor Communications Interface. The single + * parameter will point to a packet previously allocated by the + * get packet MPCI entry. + */ +typedef MPCI_Entry ( *MPCI_return_packet_entry )( + MP_packet_Prefix * + ); + +/** + * This type defines the prototype for send get packet entry point + * in an Multiprocessor Communications Interface. The single + * parameter will point to a packet previously allocated by the + * get packet entry point that has been filled in by the caller. + */ +typedef MPCI_Entry ( *MPCI_send_entry )( + uint32_t, + MP_packet_Prefix * + ); + +/** + * This type defines the prototype for the receive packet entry point + * in an Multiprocessor Communications Interface. The single + * parameter will point to a packet allocated and filled in by the + * receive packet handler. The caller will block until a packet is + * received. + */ +typedef MPCI_Entry ( *MPCI_receive_entry )( + MP_packet_Prefix ** + ); + +/** + * This type defines the Multiprocessor Communications + * Interface (MPCI) Table. This table defines the user-provided + * MPCI which is a required part of a multiprocessor system. + * + * For non-blocking local operations that become remote operations, + * we need a timeout. This is a per-driver timeout: default_timeout + */ +typedef struct { + /** This fields contains the timeout for MPCI operations in ticks. */ + uint32_t default_timeout; + /** This field contains the maximum size of a packet supported by this + * MPCI layer. This size places a limit on the size of a message + * which can be transmitted over this interface. + **/ + size_t maximum_packet_size; + /** This field points to the MPCI initialization entry point. */ + MPCI_initialization_entry initialization; + /** This field points to the MPCI get packet entry point. */ + MPCI_get_packet_entry get_packet; + /** This field points to the MPCI return packet entry point. */ + MPCI_return_packet_entry return_packet; + /** This field points to the MPCI send packet entry point. */ + MPCI_send_entry send_packet; + /** This field points to the MPCI receive packet entry point. */ + MPCI_receive_entry receive_packet; +} MPCI_Control; + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ diff --git a/include/rtems/score/mppkt.h b/include/rtems/score/mppkt.h new file mode 100644 index 0000000000..cd1d9b9cb2 --- /dev/null +++ b/include/rtems/score/mppkt.h @@ -0,0 +1,121 @@ +/** + * @file rtems/score/mppkt.h + * + * @brief Specification for the Packet Handler + * + * This package is the specification for the Packet Handler. + * This handler defines the basic packet and provides + * mechanisms to utilize packets based on this prefix. + * Packets are the fundamental basis for messages passed between + * nodes in an MP system. + */ + +/* + * COPYRIGHT (c) 1989-2011. + * 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. + */ + +#ifndef _RTEMS_SCORE_MPPKT_H +#define _RTEMS_SCORE_MPPKT_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ScoreMPPacket MP Packet Handler + * + * @ingroup Score + * + * This handler encapsulates the primary definition of MPCI packets. This + * handler defines the part of the packet that is common to all remote + * operations. + */ +/**@{*/ + +/** + * The following enumerated type defines the packet classes. + * + * @note In general, each class corresponds to a manager + * which supports global operations. Each manager + * defines the set of supported operations. + */ +typedef enum { + MP_PACKET_MPCI_INTERNAL = 0, + MP_PACKET_TASKS = 1, + MP_PACKET_MESSAGE_QUEUE = 2, + MP_PACKET_SEMAPHORE = 3, + MP_PACKET_PARTITION = 4, + MP_PACKET_REGION = 5, + MP_PACKET_EVENT = 6, + MP_PACKET_SIGNAL = 7 +} MP_packet_Classes; + +/** + * This constant defines the first entry in the MP_packet_Classes enumeration. + */ +#define MP_PACKET_CLASSES_FIRST MP_PACKET_MPCI_INTERNAL + +/** + * This constant defines the last entry in the MP_packet_Classes enumeration. + */ +#define MP_PACKET_CLASSES_LAST MP_PACKET_SIGNAL + +/** + * The following record contains the prefix for every packet + * passed between nodes in an MP system. + * + * @note This structure is padded to ensure that anything following it + * is on a 16 byte boundary. This is the most stringent structure + * alignment rule encountered yet. + */ +typedef struct { + /** This field indicates the API class of the operation being performed. */ + MP_packet_Classes the_class; + /** This field is the id of the object to be acted upon. */ + Objects_Id id; + /** This field is the ID of the originating thread. */ + Objects_Id source_tid; + /** This field is the priority of the originating thread. */ + Priority_Control source_priority; + /** This field is where the status of the operation will be returned. */ + uint32_t return_code; + /** This field is the length of the data following the prefix. */ + uint32_t length; + /** This field is the length of the data which required network conversion. */ + uint32_t to_convert; + /** This field is the requested timeout for this operation. */ + Watchdog_Interval timeout; +} MP_packet_Prefix; + +/** + * An MPCI must support packets of at least this size. + */ +#define MP_PACKET_MINIMUM_PACKET_SIZE 64 + +/** + * The following constant defines the number of uint32_t's + * in a packet which must be converted to native format in a + * heterogeneous system. In packets longer than + * MP_PACKET_MINIMUN_HETERO_CONVERSION uint32_t's, some of the "extra" data + * may a user message buffer which is not automatically endian swapped. + */ +#define MP_PACKET_MINIMUN_HETERO_CONVERSION \ + ( sizeof( MP_packet_Prefix ) / sizeof( uint32_t ) ) + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ diff --git a/include/rtems/score/objectmp.h b/include/rtems/score/objectmp.h new file mode 100644 index 0000000000..934b3981ef --- /dev/null +++ b/include/rtems/score/objectmp.h @@ -0,0 +1,228 @@ +/** + * @file rtems/score/objectmp.h + * + * @brief Data Associated with the Manipulation of Global RTEMS Objects + * + * This include file contains all the constants and structures associated + * with the manipulation of Global RTEMS Objects. + */ + +/* + * COPYRIGHT (c) 1989-2009. + * 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. + */ + +#ifndef _RTEMS_SCORE_OBJECTMP_H +#define _RTEMS_SCORE_OBJECTMP_H + +#ifndef _RTEMS_SCORE_OBJECTIMPL_H +# error "Never use directly; include instead." +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ScoreObjectMP Object Handler Multiprocessing Support + * + * @ingroup Score + * + * This handler encapsulates functionality which is used to manage + * objects which have been declared to be globally visible. This handler + * knows objects from all of the nodes in the system. + */ +/**@{*/ + +/** + * @brief Intializes the inactive global object chain + * based on the maximum number of global objects configured. + * + * This routine intializes the inactive global object chain + * based on the maximum number of global objects configured. + */ +void _Objects_MP_Handler_initialization(void); + +/** + * @brief Intializes the global object node number + * used in the ID field of all objects. + * + * This routine intializes the global object node number + * used in the ID field of all objects. + */ +void _Objects_MP_Handler_early_initialization(void); + +/** + * @brief Place the specified global object in the + * specified information table. + * + * This routine place the specified global object in the + * specified information table. + * + * @param[in] information points to the object information table for this + * object class. + * @param[in] the_global_object points to the object being opened. + * @param[in] the_name is the name of the object being opened. + * @param[in] the_id is the Id of the object being opened. + * + * @todo This method only works for object types with 4 byte object names. + * It does not support variable length object names. + */ +void _Objects_MP_Open ( + Objects_Information *information, + Objects_MP_Control *the_global_object, + uint32_t the_name, + Objects_Id the_id +); + +/** + * @brief Allocates a global object control block + * and places it in the specified information table. + * + * This routine allocates a global object control block + * and places it in the specified information table. If the + * allocation fails, then is_fatal_error determines the + * error processing actions taken. + * + * @param[in] information points to the object information table for this + * object class. + * @param[in] the_name is the name of the object being opened. + * @param[in] the_id is the Id of the object being opened. + * @param[in] is_fatal_error is true if not being able to allocate the + * object is considered a fatal error. + * + * @todo This method only works for object types with 4 byte object names. + * It does not support variable length object names. + */ +bool _Objects_MP_Allocate_and_open ( + Objects_Information *information, + uint32_t the_name, + Objects_Id the_id, + bool is_fatal_error +); + +/** + * @brief Removes a global object from the specified information table. + * + * This routine removes a global object from the specified + * information table and deallocates the global object control block. + */ +void _Objects_MP_Close ( + Objects_Information *information, + Objects_Id the_id +); + +/** + * @brief Look for the object with the_name in the global + * object tables indicated by information. + * + * This routine looks for the object with the_name in the global + * object tables indicated by information. It returns the ID of the + * object with that name if one is found. + * + * @param[in] information points to the object information table for this + * object class. + * @param[in] the_name is the name of the object being searched for. + * @param[in] nodes_to_search indicates the set of nodes to search. + * @param[in] the_id will contain the Id of the object if found. + * + * @retval This method returns one of the + * @ref Objects_Name_or_id_lookup_errors. If successful, @a the_id + * will contain the Id of the object. + */ +Objects_Name_or_id_lookup_errors _Objects_MP_Global_name_search ( + Objects_Information *information, + Objects_Name the_name, + uint32_t nodes_to_search, + Objects_Id *the_id +); + +/** + * @brief Searches the Global Object Table managed + * by information for the object indicated by ID. + * + * This function searches the Global Object Table managed + * by information for the object indicated by ID. If the object + * is found, then location is set to objects_remote, otherwise + * location is set to objects_error. In both cases, the_object + * is undefined. + * + * @param[in] information points to the object information table for this + * object class. + * @param[in] the_id is the Id of the object being opened. + * @param[in] location will contain the location of the object. + * @param[in] the_object will contain a pointer to the object. + * + * @retval This method fills in @a location to indicate successful location + * of the object or error. On success, @a the_object will be + * filled in. + */ +void _Objects_MP_Is_remote ( + Objects_Information *information, + Objects_Id the_id, + Objects_Locations *location, + Objects_Control **the_object +); + +/** + * This is the maximum number of global objects configured. + */ +SCORE_EXTERN uint32_t _Objects_MP_Maximum_global_objects; + +/** + * The following chain header is used to manage the set of + * inactive global object control blocks. + */ +SCORE_EXTERN Chain_Control _Objects_MP_Inactive_global_objects; + +/** + * This function allocates a Global Object control block. + */ + +RTEMS_INLINE_ROUTINE Objects_MP_Control *_Objects_MP_Allocate_global_object ( + void +) +{ + return (Objects_MP_Control *) + _Chain_Get( &_Objects_MP_Inactive_global_objects ); +} + +/** + * This routine deallocates a Global Object control block. + */ + +RTEMS_INLINE_ROUTINE void _Objects_MP_Free_global_object ( + Objects_MP_Control *the_object +) +{ + _Chain_Append( + &_Objects_MP_Inactive_global_objects, + &the_object->Object.Node + ); +} + +/** + * This function returns whether the global object is NULL or not. + */ + +RTEMS_INLINE_ROUTINE bool _Objects_MP_Is_null_global_object ( + Objects_MP_Control *the_object +) +{ + return( the_object == NULL ); +} + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ diff --git a/include/rtems/score/threadmp.h b/include/rtems/score/threadmp.h new file mode 100644 index 0000000000..27b6989893 --- /dev/null +++ b/include/rtems/score/threadmp.h @@ -0,0 +1,127 @@ +/** + * @file rtems/score/threadmp.h + * + * @brief Multiprocessing Portion of the Thread Package + * + * This include file contains the specification for all routines + * and data specific to the multiprocessing portion of the thread package. + */ + +/* + * COPYRIGHT (c) 1989-2009. + * 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. + */ + +#ifndef _RTEMS_SCORE_THREADMP_H +#define _RTEMS_SCORE_THREADMP_H + +#ifndef _RTEMS_SCORE_THREADIMPL_H +# error "Never use directly; include instead." +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ScoreThreadMP Thread Handler Multiprocessing Support + * + * @ingroup Score + * + * This handler encapsulates functionality which is related to managing + * threads in a multiprocessor system configuration. This handler must + * manage proxies which represent remote threads blocking on local + * operations. + */ +/**@{*/ + +/** + * @brief Initialize MP thread handler. + * + * This routine initializes the multiprocessing portion of the Thread Handler. + */ +void _Thread_MP_Handler_initialization ( + uint32_t maximum_proxies +); + +/** + * @brief Allocate a MP proxy control block from + * the inactive chain of free proxy control blocks. + * + * This allocates a proxy control block from + * the inactive chain of free proxy control blocks. + * + * @note This function returns a thread control pointer + * because proxies are substitutes for remote threads. + */ +Thread_Control *_Thread_MP_Allocate_proxy ( + States_Control the_state +); + +/** + * @brief Removes the MP proxy control block for the specified + * id from the active chain of proxy control blocks. + * + * This function removes the proxy control block for the specified + * id from the active chain of proxy control blocks. + */ +Thread_Control *_Thread_MP_Find_proxy ( + Objects_Id the_id +); + +/** + * @brief Manage the active set MP proxies. + * + * The following chain is used to manage the active set proxies. + */ +SCORE_EXTERN Chain_Control _Thread_MP_Active_proxies; + +/** + * @brief Manage the inactive set of MP proxies. + * + * The following chain is used to manage the inactive set of proxies. + */ +SCORE_EXTERN Chain_Control _Thread_MP_Inactive_proxies; + +/** + * This function returns true if the thread in question is the + * multiprocessing receive thread. + * + * @note This is a macro to avoid needing a prototype for + * _MPCI_Receive_server_tcb until it is used. + */ +#define _Thread_MP_Is_receive(_the_thread) \ + ((_the_thread) == _MPCI_Receive_server_tcb) + +/** + * This routine frees a proxy control block to the + * inactive chain of free proxy control blocks. + */ + +RTEMS_INLINE_ROUTINE void _Thread_MP_Free_proxy ( + Thread_Control *the_thread +) +{ + Thread_Proxy_control *the_proxy; + + the_proxy = (Thread_Proxy_control *) the_thread; + + _Chain_Extract( &the_proxy->Active ); + + _Chain_Append( &_Thread_MP_Inactive_proxies, &the_thread->Object.Node ); +} + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ -- cgit v1.2.3