Prevent corruption to rax during stack alignment on x86-64 (#670)
[dyninst.git] / external / bluegene / MessageHeader.h
1 /* begin_generated_IBM_copyright_prolog                             */
2 /*                                                                  */
3 /* This is an automatically generated copyright prolog.             */
4 /* After initializing,  DO NOT MODIFY OR MOVE                       */
5 /* ================================================================ */
6 /* IBM Confidential                                                 */
7 /*                                                                  */
8 /* Licensed Machine Code Source Materials                           */
9 /*                                                                  */
10 /* Product(s):                                                      */
11 /*     Blue Gene/Q Licensed Machine Code                            */
12 /*                                                                  */
13 /* (C) Copyright IBM Corp.  2011, 2011                              */
14 /*                                                                  */
15 /* The Source code for this program is not published  or otherwise  */
16 /* divested of its trade secrets,  irrespective of what has been    */
17 /* deposited with the U.S. Copyright Office.                        */
18 /* ================================================================ */
19 /*                                                                  */
20 /* end_generated_IBM_copyright_prolog                               */
21
22 //! \file  MessageHeader.h
23 //! \brief Declaration for bgcios::MessageHeader class.
24
25 #ifndef MESSAGEHEADER_H
26 #define MESSAGEHEADER_H
27
28 // Includes
29 #include <inttypes.h>
30 #include <string.h>
31
32 namespace bgcios
33 {
34
35 //! Header describing a I/O service message.
36
37 struct MessageHeader
38 {
39    uint8_t  service;              //!< Service to process message.
40    uint8_t  version;              //!< Protocol version number.
41    uint16_t type;                 //!< Content of message.
42    uint32_t rank;                 //!< Rank message is associated with.
43    uint32_t sequenceId;           //!< Correlate requests and acknowledgements.
44    uint32_t returnCode;           //!< Result of previous request.
45    uint32_t errorCode;            //!< Error detail (typically errno value).
46    uint32_t length;               //!< Amount of data in message (including this header).
47    uint64_t jobId;                //!< Job message is associated with.
48 };
49
50 //! Values for service field of MessageHeader.
51
52 const uint8_t IosctlService  = 1; //!< I/O control service.
53 const uint8_t JobctlService  = 2; //!< Job control service.
54 const uint8_t StdioService   = 3; //!< Standard I/O service.
55 const uint8_t SysioService   = 4; //!< System I/O service.
56 const uint8_t ToolctlService = 5; //!< Tool control service.
57
58 //! Values for return code field of MessageHeader.
59
60 enum ReturnCode {
61    Success = 0,                   //!< Success (no error).
62    WrongService,                  //!< Service value in message header is not valid.
63    UnsupportedType,               //!< Type value in message header is not supported.
64    JobIdError,                    //!< Job id value is not valid.
65    ProcessIdError,                //!< Rank value is not valid.
66    RequestFailed,                 //!< Requested operation failed.   
67    SubBlockJobError,              //!< Sub-block job specifications are not valid.  
68    SendError,                     //!< Sending a message failed.
69    RecvError,                     //!< Receiving a message failed.
70    VersionMismatch,               //!< Protocol versions do not match.
71    NodeNotReady,                  //!< Compute node is not ready for requested operation.
72    SecondaryGroupIdError,         //!< Setting secondary group id failed.
73    PrimaryGroupIdError,           //!< Setting primary group id failed.
74    UserIdError,                   //!< Setting user id failed.
75    WorkingDirError,               //!< Changing to working directory failed.
76    AppOpenError,                  //!< Opening application executable failed.
77    AppAuthorityError,             //!< No authority to application executable.
78    AppReadError,                  //!< Reading data from application executable failed.
79    AppElfHeaderSize,              //!< Application executable ELF header is wrong size.
80    AppElfHeaderError,             //!< Application executable ELF header contains invalid value.
81    AppNoCodeSection,              //!< Application executable contains no code sections.
82    AppCodeSectionSize,            //!< Application executable code section is too big.
83    AppSegmentAlignment,           //!< Application executable segment has wrong alignment.
84    AppTooManySegments,            //!< Application executable has too many segments.
85    AppStaticTLBError,             //!< Generating static TLB map for application failed.
86    AppMemoryError,                //!< Initializing memory for process failed.
87    ArgumentListSize,              //!< Argument list has too many items.
88    ToolStartError,                //!< Starting tool process failed.
89    ToolAuthorityError,            //!< No authority to tool executable.
90    ToolIdError,                   //!< Tool id is not valid.
91    ToolTimeoutExpired,            //!< Timeout expired ending a tool.
92    ToolPriorityConflict,          //!< Tool priority conflict.
93    ToolMaxAttachedExceeded,       //!< Tool maximum number of tools exceeded.
94    ToolIdConflict,                //!< Tool id conflict.
95    JobsDirError,                  //!< Creating /jobs directory failed.
96    JobsObjectError,               //!< Creating object in /jobs directory failed.
97    ToolPriorityError,             //!< Tool priority level is not valid.
98    ToolRankNotFound,              //!< Tool request could not find requested target process.
99    CornerCoreError,               //!< Corner core number is not valid.
100    NumCoresInProcessError,        //!< Number of cores allocated to a process is not valid.
101    ProcessActive,                 //!< Process is currently active on a hardware thread.
102    NumProcessesError,             //!< Number of processes on node is not valid.
103    RanksInJobError,               //!< Number of active ranks in job is not valid.
104    ClassRouteDataError,           //!< Class route data is not valid.
105    ToolNumberOfCmdsExceeded,      //!< Tool number of commands is not valid.
106    RequestIncomplete,             //!< Requested operation was partially successful.
107    PrologPgmStartError,           //!< Starting job prolog program process failed.
108    PrologPgmError,                //!< Job prolog program failed. 
109    EpilogPgmStartError,           //!< Starting job epilog program process failed.
110    EpilogPgmError,                //!< Job epilog program failed. 
111    RequestInProgress,             //!< Requested operation is currently in progress.
112    ToolControlConflict,           //!< Control authority conflict with another tool.
113    NodesInJobError,               //!< No compute nodes matched job specifications.
114    ToolConflictingCmds,           //!< An invalid combination of commands was specifed in the command list.
115    ReturnCodeListEnd              //!< End of the return code enumerations. 
116 };
117
118 //! Default size for small message memory regions (match Linux page size).
119 const uint32_t SmallMessageRegionSize = 65536;
120
121 //! Maximum size of data in a small message.
122 const uint32_t SmallMessageDataSize = 65472;
123
124 //! Size of an immediate message (fits in one packet).
125 const uint32_t ImmediateMessageSize = 512;
126
127 //! \brief  Initialize message header.
128 //! \param  header Pointer to message header.
129 //! \return Nothing.
130
131 inline void initHeader(struct MessageHeader *header) { memset(header, 0x00, sizeof(struct MessageHeader)); }
132
133 //! \brief  Get the length of the data in a message (can be zero).
134 //! \param  header Pointer to message header.
135 //! \return Length of data in message.
136
137 inline uint32_t dataLength(struct MessageHeader *header) { return header->length - sizeof(struct MessageHeader); }
138
139 } // namespace bgcios
140
141 #endif // MESSAGEHEADER_H
142