librtas-1.3.10/0000755000175100001440000000000012313120670012273 5ustar nfontuserslibrtas-1.3.10/COPYRIGHT0000644000175100001440000002653612313120670013602 0ustar nfontusersCommon Public License Version 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. librtas-1.3.10/doxygen.rtas0000644000175100001440000013427512313120670014657 0ustar nfontusers# Doxyfile 1.3.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = librtas # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc/librtas # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = NO # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ./librtas_src # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO librtas-1.3.10/README0000644000175100001440000000237712313120670013164 0ustar nfontusers librtas ------------------------------------------------ Technical contacts: librtas.so - John Rose librtasevent.so - Nathan Fontenot Admin contacts: Micheal Strosaker Nathan Fontenot May 2005 Librtas provides a set of libraries for user-space access to the Run-Time Abstraction Services (RTAS) on the ppc64 architecture. librtas.so This library that allows user-space programs to make RTAS calls which provide support for low-level system hardware configuration and operations, such as getting hardware sensor (temp, fan speed, etc.) data, setting the operator panel LEDS, getting hardware error logs, injecting artificial hardware errors (for testing), getting VPD (Vital Product Data), and loading new firmware. librtasevent.so This library provides a set of definitions and useful routines for analyzing RTAS events, such as parsing out the sections of an RTAS event and printing the contents of a RTAS event in human-readable form (used by many of the RAS tools on ppc64). Building & Installing: ---------------------- To compile, do the following: make su - root make install /sbin/ldconfig librtas-1.3.10/doxygen.rtasevent0000644000175100001440000013431412313120670015713 0ustar nfontusers# Doxyfile 1.3.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = librtasevent # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc/librtasevent # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = NO # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ./librtasevent_src # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO librtas-1.3.10/librtasevent_src/0000755000175100001440000000000012313120670015644 5ustar nfontuserslibrtas-1.3.10/librtasevent_src/librtasevent.h0000644000175100001440000004122612313120670020524 0ustar nfontusers/** * @file librtasevent.h * @brief Structure and Interface definitions for librtasevent * * This provides the structure and interface definitions for librtasevent. * Also see librtasevent_v4.h and librtasevent_v6.h for additional * structure definitions particular those event versions. * * librtasevent usage: * The librtasevent library is meant to place the structure definitions, * parsing and printing of RTAS events into a common place. The use of * librtasevent is easiest through the following interfaces: * * parse_rtas_event() - This takes a buffer containing an RTAS event in * binary form and returns a pointer to an rtas_event struct. This * struct has a list of rtas_event_scn objects hanging off of it * for each section of the rtas event. * * This presents the user with a broken down representation of the RTAS * event that can then be easily searched for any relevant information * or passed to either rtas_print_event() to print the entire RTAS event * or the rtas_print_event_scn() to print a particular section of the * RTAS event. * * When finished a call to rtas_cleanup_event() will free all of the data * structuires associated with the RTAS event. * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #ifndef _H_RTAS_EVENTS #define _H_RTAS_EVENTS #include #include struct rtas_event; /** * @struct rtas_event_scn * @brief Contains the data for a RTAS event section */ struct scn_header { struct scn_header *next; struct rtas_event *re; uint32_t raw_offset; int scn_id; }; #define RE_SHDR_SZ (sizeof(struct scn_header)) #define RE_SHDR_OFFSET(x) ((char *)(x) + RE_SHDR_SZ) /* definitions for struct rtas_event_scn scn_id */ #define RTAS_EVENT_HDR 1 #define RTAS_EVENT_EXT_HDR 2 #define RTAS_EPOW_SCN 3 #define RTAS_IO_SCN 4 #define RTAS_CPU_SCN 5 #define RTAS_IBM_DIAG_SCN 6 #define RTAS_MEM_SCN 7 #define RTAS_POST_SCN 8 #define RTAS_IBM_SP_SCN 9 #define RTAS_VEND_ERRLOG_SCN 10 #define RTAS_PRIV_HDR_SCN 11 #define RTAS_USR_HDR_SCN 12 #define RTAS_DUMP_SCN 13 #define RTAS_LRI_SCN 14 #define RTAS_MT_SCN 15 #define RTAS_PSRC_SCN 16 #define RTAS_SSRC_SCN 17 #define RTAS_GENERIC_SCN 18 #define RTAS_HP_SCN 19 #define RTAS_MAX_SCN_ID 20 /** * @struct rtas_event * @brief Anchor structure for parsed RTAS events */ struct rtas_event { int version; int event_no; char *buffer; uint32_t offset; uint32_t event_length; struct scn_header *event_scns; }; #define RE_EVENT_OFFSET(re) ((re)->buffer + (re)->offset) /** * @struct rtas_date * @brief definition of date format in rtas events */ struct rtas_date { uint32_t year; uint32_t month; uint32_t day; }; struct rtas_date_raw { uint32_t year:16; uint32_t month:8; uint32_t day:8; }; /** * @struct rtas_time * @brief definition of timestamp in rtas events */ struct rtas_time { uint32_t hour; uint32_t minutes; uint32_t seconds; uint32_t hundredths; }; struct rtas_time_raw { uint32_t hour:8; uint32_t minutes:8; uint32_t seconds:8; uint32_t hundredths:8; }; /* include version specific data */ #include "librtasevent_v4.h" #include "librtasevent_v6.h" /** * @struct rtas_event_hdr * @brief Fixed header at the beginning of all RTAS events */ struct rtas_event_hdr { struct scn_header shdr; uint32_t version; /**< Architectural version */ uint32_t severity; /**< Severity level of error */ #define RTAS_HDR_SEV_NO_ERROR 0 #define RTAS_HDR_SEV_EVENT 1 #define RTAS_HDR_SEV_WARNING 2 #define RTAS_HDR_SEV_ERROR_SYNC 3 #define RTAS_HDR_SEV_ERROR 4 #define RTAS_HDR_SEV_FATAL 5 #define RTAS_HDR_SEV_ALREADY_REPORTED 6 uint32_t disposition; /**< Degree of recovery */ #define RTAS_HDR_DISP_FULLY_RECOVERED 0 #define RTAS_HDR_DISP_LIMITED_RECOVERY 1 #define RTAS_HDR_DISP_NOT_RECOVERED 2 uint32_t extended; /**< extended log present? */ uint32_t initiator; /**< Initiator of event */ #define RTAS_HDR_INIT_UNKNOWN 0 #define RTAS_HDR_INIT_CPU 1 #define RTAS_HDR_INIT_PCI 2 #define RTAS_HDR_INIT_ISA 3 #define RTAS_HDR_INIT_MEMORY 4 #define RTAS_HDR_INIT_HOT_PLUG 5 uint32_t target; /**< Target of failed operation */ #define RTAS_HDR_TARGET_UNKNOWN 0 #define RTAS_HDR_TARGET_CPU 1 #define RTAS_HDR_TARGET_PCI 2 #define RTAS_HDR_TARGET_ISA 3 #define RTAS_HDR_TARGET_MEMORY 4 #define RTAS_HDR_TARGET_HOT_PLUG 5 uint32_t type; /**< General event or error*/ #define RTAS_HDR_TYPE_RETRY 1 #define RTAS_HDR_TYPE_TCE_ERR 2 #define RTAS_HDR_TYPE_INTERN_DEV_FAIL 3 #define RTAS_HDR_TYPE_TIMEOUT 4 #define RTAS_HDR_TYPE_DATA_PARITY 5 #define RTAS_HDR_TYPE_ADDR_PARITY 6 #define RTAS_HDR_TYPE_CACHE_PARITY 7 #define RTAS_HDR_TYPE_ADDR_INVALID 8 #define RTAS_HDR_TYPE_ECC_UNCORRECTED 9 #define RTAS_HDR_TYPE_ECC_CORRECTED 10 #define RTAS_HDR_TYPE_EPOW 64 #define RTAS_HDR_TYPE_PRRN 160 #define RTAS_HDR_TYPE_PLATFORM_ERROR 224 #define RTAS_HDR_TYPE_IBM_IO_EVENT 225 #define RTAS_HDR_TYPE_PLATFORM_INFO 226 #define RTAS_HDR_TYPE_RESOURCE_DEALLOC 227 #define RTAS_HDR_TYPE_DUMP_NOTIFICATION 228 #define RTAS_HDR_TYPE_HOTPLUG 229 uint32_t ext_log_length; /**< length in bytes */ }; struct rtas_event_hdr_raw { uint32_t version:8; uint32_t data1:8; uint32_t data2:8; uint32_t type:8; uint32_t ext_log_length; } __attribute__((__packed__)); #define RE_EVENT_HDR_SZ 8 /** * @struct rtas_event_exthdr * @brief RTAS optional extended error log header (12 bytes) */ struct rtas_event_exthdr { struct scn_header shdr; uint32_t valid; uint32_t unrecoverable; uint32_t recoverable; uint32_t unrecoverable_bypassed; uint32_t predictive; uint32_t newlog; uint32_t bigendian; uint32_t platform_specific; /**< only in version 3+ */ uint32_t platform_value; /**< valid iff platform_specific */ uint32_t power_pc; uint32_t addr_invalid; uint32_t format_type; #define RTAS_EXTHDR_FMT_CPU 1 #define RTAS_EXTHDR_FMT_MEMORY 2 #define RTAS_EXTHDR_FMT_IO 3 #define RTAS_EXTHDR_FMT_POST 4 #define RTAS_EXTHDR_FMT_EPOW 5 #define RTAS_EXTHDR_FMT_IBM_DIAG 12 #define RTAS_EXTHDR_FMT_IBM_SP 13 #define RTAS_EXTHDR_FMT_VEND_SPECIFIC_1 14 #define RTAS_EXTHDR_FMT_VEND_SPECIFIC_2 15 /* This group is in version 3+ only */ uint32_t non_hardware; /**< Firmware or software is suspect */ uint32_t hot_plug; uint32_t group_failure; uint32_t residual; /**< Residual error from previous boot */ uint32_t boot; /**< Error during boot */ uint32_t config_change; /**< Configuration chang since last boot */ uint32_t post; struct rtas_time time; /**< Time of error in BCD HHMMSS00 */ struct rtas_date date; /**< Time of error in BCD YYYYMMDD */ }; struct rtas_event_exthdr_raw { uint32_t data1:8; uint32_t data2:8; uint32_t data3:8; /* This group is in version 3+ only */ uint32_t data4:8; struct rtas_time_raw time; struct rtas_date_raw date; }__attribute__((__packed__)); #define RE_EXT_HDR_SZ 12 /** * @struct rtas_epow_scn * @brief Common RTAS EPOW section */ struct rtas_epow_scn { struct scn_header shdr; /* The following represent the fields of a pre-version 6 RTAS EPOW event */ uint32_t sensor_value:28; /**< EPOW sensor value */ uint32_t action_code:4; /**< EPOW action code */ #define RTAS_EPOW_ACTION_RESET 0x00 #define RTAS_EPOW_ACTION_WARN_COOLING 0x01 #define RTAS_EPOW_ACTION_WARN_POWER 0x02 #define RTAS_EPOW_ACTION_SYSTEM_SHUTDOWN 0x03 #define RTAS_EPOW_ACTION_SYSTEM_HALT 0x04 #define RTAS_EPOW_ACTION_MAIN_ENCLOSURE 0x05 #define RTAS_EPOW_ACTION_POWER_OFF 0x07 uint32_t sensor:1; /**< detected by a defined sensor */ uint32_t power_fault:1; /**< caused by a power fault */ uint32_t fan:1; /**< caused by a fan failure */ uint32_t temp:1; /**< caused by over-temperature condition */ uint32_t redundancy:1; /**< loss of redundancy */ uint32_t CUoD:1; /**< CUoD entitlement exceeded */ uint32_t /* reserved */ :2; uint32_t general:1; /**< general unspecified fault */ uint32_t power_loss:1; /**< fault due to loss of power source */ uint32_t power_supply:1; /**< fault due to internal power failure */ uint32_t power_switch:1; /**< manual activation of power-off switch */ uint32_t battery:1; /**< fault due to internal battery failure */ uint32_t /* reserved */ :3; uint32_t /* reserved */ :16; uint32_t sensor_token:32; /**< token for sensor causing the EPOW */ uint32_t sensor_index:32; /**< index number of sensor causing EPOW */ uint32_t sensor_value2:32; uint32_t sensor_status:32; uint32_t /* reserved */ :32; /* The following represent a version 6 RTAS EPOW event */ struct rtas_v6_hdr v6hdr; uint32_t event_modifier; /**< EPOW event modifier */ #define RTAS_EPOW_MOD_NA 0x00 #define RTAS_EPOW_MOD_NORMAL_SHUTDOWN 0x01 #define RTAS_EPOW_MOD_UTILITY_POWER_LOSS 0x02 #define RTAS_EPOW_MOD_CRIT_FUNC_LOSS 0x03 #define RTAS_EPOW_MOD_AMBIENT_TEMP 0x04 char reason_code[8]; /**< platform specific reason code */ }; struct rtas_v6_epow_scn_raw { struct rtas_v6_hdr_raw v6hdr; uint32_t data1:8; uint32_t event_modifier:8; char reason_code[8]; }__attribute__((__packed__)); /* defines used for copying in data from the RTAS event */ #define RE_EPOW_V6_SCN_SZ 20 /** * @struct rtas_io_scn * @brief RTAS i/o section */ struct rtas_io_scn { struct scn_header shdr; /* The following represents the pre-version 6 RTAS event */ uint32_t bus_addr_parity:1; /**< bus address parity error */ uint32_t bus_data_parity:1; /**< bus data pariy error */ uint32_t bus_timeout:1; /**< bus time-out */ uint32_t bridge_internal:1; /**< bridge/device internal error */ uint32_t non_pci:1; /**< i.e. secondary bus such as ISA */ uint32_t mezzanine_addr_parity:1; /**< Mezzanine/System address parity*/ uint32_t mezzanine_data_parity:1; /**< Mezzanine/System data parity */ uint32_t mezzanine_timeout:1; /**< Mezzanine/System bus time-out */ uint32_t bridge_via_sysbus:1; /**< bridge connected to System bus */ uint32_t bridge_via_mezzanine:1; /**< bridge is connected to memory controller via Mezzanine Bus */ uint32_t bridge_via_expbus:1; /**< bridge is connected to I/O expansion bus */ uint32_t detected_by_expbus:1; /**< detected by I/O Expansion bus */ uint32_t expbus_data_parity:1; /**< expansion bus (parity, CRC) error */ uint32_t expbus_timeout:1; /**< expansion bus time-out */ uint32_t expbus_connection_failure:1; uint32_t expbus_not_operating:1; /**< expansion bus not in an operating state */ /* PCI Bus Data of the IOA signalling the error */ uint32_t pci_sig_bus_id:8; /**< IOA signalling the error */ uint32_t pci_sig_busno:8; /**< PCI device ID */ uint32_t pci_sig_devfn:8; /**< PCI function ID */ uint32_t pci_sig_deviceid:16; /**< PCI "Device ID" from configuration register */ uint32_t pci_sig_vendorid:16; /**< PCI "Vendor ID" from configuration register */ uint32_t pci_sig_revisionid:8; /**< PCI "Revision ID" from configuration register */ uint32_t pci_sig_slot:8; /**< Slot identifier number 00=>system board, ff=>multiple */ /* PCI Bus Data of the IOA sending the the error */ uint32_t pci_send_bus_id:8; /**< IOA sending at time of error */ uint32_t pci_send_busno:8; /**< PCI device ID */ uint32_t pci_send_devfn:8; /**< PCI function ID */ uint32_t pci_send_deviceid:16; /**< PCI "Device ID" from configuration register */ uint32_t pci_send_vendorid:16; /**< PCI "Vendor ID" from configuration register */ uint32_t pci_send_revisionid:8; /**< PCI "REvision ID" from configuration register */ uint32_t pci_send_slot:8; /**< Slot identifier number 00=>system board, ff=>multiple */ uint32_t /* reserved */ :16; uint32_t /* reserved */ :32; uint32_t /* reserved */ :32; /* The following represents the version 6 rtas event */ struct rtas_v6_hdr v6hdr; uint32_t event_type; /**< I/O event type */ #define RTAS_IO_TYPE_DETECTED 0x01 #define RTAS_IO_TYPE_RECOVERED 0x02 #define RTAS_IO_TYPE_EVENT 0x03 #define RTAS_IO_TYPE_RPC_PASS_THRU 0x04 uint32_t rpc_length; /**< RPC field length. The RPC data is optional and appears after this structure in the event if present */ uint32_t scope; /**< event scope */ #define RTAS_IO_SCOPE_NA 0x00 #define RTAS_IO_SCOPE_RIO_HUB 0x36 #define RTAS_IO_SCOPE_RIO_BRIDGE 0x37 #define RTAS_IO_SCOPE_PHB 0x38 #define RTAS_IO_SCOPE_EADS_GLOBAL 0x39 #define RTAS_IO_SCOPE_EADS_SLOT 0x3A uint32_t subtype; /**< I/O event sub-type */ #define RTAS_IO_SUBTYPE_NA 0x00 #define RTAS_IO_SUBTYPE_REBALANCE 0x01 #define RTAS_IO_SUBTYPE_NODE_ONLINE 0x02 #define RTAS_IO_SUBTYPE_NODE_OFFLINE 0x04 #define RTAS_IO_SUBTYPE_PLAT_DUMP_SZ 0x05 uint32_t drc_index; /**< DRC index */ char rpc_data[216]; }; struct rtas_v6_io_scn_raw { struct rtas_v6_hdr_raw v6hdr; uint32_t event_type:8; uint32_t rpc_length:8; uint32_t scope:8; uint32_t subtype:8; uint32_t drc_index; char rpc_data[216]; }__attribute__((__packed__)); #define RE_IO_V6_SCN_OFFSET (RE_SCN_HDR_SZ + RE_V4_SCN_SZ) /* Retrieving and free'ing parsed RTAS events */ struct rtas_event * parse_rtas_event(char *, int); int cleanup_rtas_event(struct rtas_event *); /* Retrieving a particular section from a parsed RTAS event */ struct rtas_event_hdr * rtas_get_event_hdr_scn(struct rtas_event *); struct rtas_event_exthdr * rtas_get_event_exthdr_scn(struct rtas_event *); struct rtas_epow_scn * rtas_get_epow_scn(struct rtas_event *); struct rtas_io_scn * rtas_get_io_scn(struct rtas_event *); struct rtas_cpu_scn * rtas_get_cpu_scn(struct rtas_event *); struct rtas_ibm_diag_scn * rtas_get_ibmdiag_scn(struct rtas_event *); struct rtas_mem_scn * rtas_get_mem_scn(struct rtas_event *); struct rtas_post_scn * rtas_get_post_scn(struct rtas_event *); struct rtas_ibmsp_scn * rtas_get_ibm_sp_scn(struct rtas_event *); struct rtas_vend_errlog_scn * rtas_get_vend_errlog_scn(struct rtas_event *); struct rtas_priv_hdr_scn * rtas_get_priv_hdr_scn(struct rtas_event *); struct rtas_usr_hdr_scn * rtas_get_usr_hdr_scn(struct rtas_event *); struct rtas_dump_scn * rtas_get_dump_scn(struct rtas_event *); struct rtas_lri_scn * rtas_get_lri_scn(struct rtas_event *); struct rtas_mt_scn * rtas_get_mt_scn(struct rtas_event *); struct rtas_src_scn * rtas_get_src_scn(struct rtas_event *); struct rtas_hotplug_scn * rtas_get_hotplug_scn(struct rtas_event *); int update_os_id_scn(struct rtas_event *, const char *); /* Printing RTAS event data */ int rtas_print_scn(FILE *, struct scn_header *, int); int rtas_print_event(FILE *, struct rtas_event *, int); int rtas_print_raw_event(FILE *, struct rtas_event *); int rtas_set_print_width(int); #endif librtas-1.3.10/librtasevent_src/librtasevent.so.1.3.80000755000175100001440000051177712313120670021404 0ustar nfontusersELF@c0@8@'$tt~(~(~(#X(@~P~P~PXXX$$dtR~(~(~(GNUoDґjW\@+éGCcO'6L\C_M3+" -%/THWV24`YZ9B$D7*GSa?I@A8R[< ]> U&=E QF!51X^:b ,J P)(;K#0N.C !q&A1!(q AT D@$ D&Np UFA' "#$%&'()+,.012578:=>?@ACEFGHIJMNOPRTX[\^`ab"γׯ&>^EZ wXZ it1i%=y9r{%ރ|]3BcdTaK =odRxՉ\/1ƼF6{:5(h+1d)z~-G  C&P"=`bC%Oa(kئG@EVZkʒee3 WY]r]ۢFECZA" j0*$9Xsu|㻩n(Lߞ=P1s/{" W=aXXqټ& w~(c + M"Wfm}xINPePiHU8dCP ^L P PYxvHP(`0XX(PT(yxP=0DUPC`t?p+%@`phP6@PxT PPpP@<fXhPsPyPtP.hH 8PPhT`t%Lh8PhPpD-n0__gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesrtas_copymemcpycleanup_rtas_eventfreeadd_re_scnre_scn_idstrncmpget_re_scn__errno_locationparse_v6_rtas_eventparse_priv_hdr_scnparse_usr_hdr_scnparse_epow_scnparse_io_scnparse_dump_scnparse_lri_scnparse_mt_scnparse_src_scnparse_hotplug_scnparse_generic_v6_scnparse_rtas_eventmallocmemsetparse_cpu_scnparse_ibm_diag_scnparse_mem_scnparse_post_scnparse_sp_scnparse_vend_errlog_scnprint_re_hdr_scnprint_re_exthdr_scnprint_re_epow_scnprint_re_io_scnprint_re_cpu_scnprint_re_ibm_diag_scnprint_re_mem_scnprint_re_post_scnprint_re_ibmsp_scnprint_re_vend_errlog_scnprint_re_priv_hdr_scnprint_re_usr_hdr_scnprint_re_dump_scnprint_re_lri_scnprint_re_mt_scnprint_re_src_scnprint_re_generic_scnprint_re_hotplug_scnrtas_entity_namesprint_scn_titlevsnprintfstrlenrtas_printprint_raw_datafprintfrtas_print_raw_eventrtas_set_print_widthrtas_print_scnfflushrtas_print_eventrtas_get_event_hdr_scnrtas_get_event_exthdr_scnrtas_get_cpu_scnrtas_get_dump_scnupdate_os_id_scnprint_v6_hdrrtas_get_epow_scnrtas_get_io_scnrtas_get_lri_scnrtas_get_mem_scnrtas_get_post_scnrtas_get_ibm_sp_scnstrcmpstrcpyrtas_get_src_scnprint_mtmsprint_re_fru_scnprint_src_refcodertas_get_priv_hdr_scnrtas_get_usr_hdr_scnprint_usr_hdr_subsystem_idprint_usr_hdr_event_dataprint_usr_hdr_actionparse_mtmsrtas_get_mt_scnrtas_get_ibm_diag_scnrtas_get_vend_errlog_scnrtas_get_hotplug_scnlibc.so.6_edata__bss_start_endlibrtasevent.so.1GLIBC_2.4GLIBC_2.3 ii ii %% %(%0%@%H%P%h%p%%%%% %(%0%8%@%H%hP&X&`&h&p& x&(&0&8%&@&H&X&p&x&&&&&CPC`CxCCCD D(D00D@8D`@DpHDPDXD`C`hDpCxDCDDDD@EDpEDE E0EPE`ExEEEEEF( F8(Fx0F8F@FHGPG(XGh`GxhGpGxHHH8HHHpHHHHHHII(I8IhIxIIJJJH JX(J0J8J@JHK(PK8XKh`KxhKpKxKKKLLPL`LLMM MpMMMN@NPNNNOOP O`(Ox0O8O@OHOPOXP0`P@hPxpPxPPQQQHQXQQQQR R0R`RpRRRSSHSXS S(S0S8TH@TXHTPTXU`UhUHpUXxUUUUV0V@VVVWW8WHWWWWXX(XhXxX X(Y0Y(8Yh@YxHYPYXZ `Z0hZPpZ`xZZ[[ [X[h[[[\\X\h\\]]]X]h]]^ ^(^80^H8^p@^H^P^X^`_h_Hp_Xx____```@`P````aa(a`apaaaab b((bX0bh8b@bHbPbXc`c(xhhhhhhhhhhhhhhhhiiiw0($0@|HX|`p}4x}Lth 08HP`xhxP (8L@PXhp<h( 0@HX`pdxh< \ 08HʸP`hx| ׬ތ (8@PXhpX(0@HXd`px< 08HP`hx\,| l(8@PDXhp"`H~8~@~H~0$ $($0$8$@$H$P%X%`hp&x&&&X`&'''' '('0'8'P'h'p''' '('08(@((H(@P(`X(x`(hp(x(((((())))@)h)x))))))) *(*H0*x8*@*H*P+X+8`+@h+Hp+Xx+x+++++,,0,H,P,h,x,,,,,----( -@(-H0-X8-h@-xH-P-X-`-h-p-x---... .8.X.p....../ /P///0 0@(0x0080@,H0P0X1`1`h1p1x112202X22233@3h334484h445055 5(50585@5H6P68X`6Ph6`p6px66666d677 787`7x7777778880 8H(8h0888@8H8P8X8`8h9p98x9`9x9999:: :@:`:::;;;0;H;`;p;; ;(;0;8;@<H<P<0X>@>>>>? ?X? ?(?0@(8@`@@H@PAXA0`A`hApAxBB@BxBBCC(C8CHchcpcxccccccctc d(d(0dP8dx@dHdPdXd`dhepexe0eXeheeeeeeeeefff(f0f@fpfff f(f0f8f@fHgPg(Xg8`gPhg`pghxgggggggghhh h@hhhhii8iHiXip i(i0i8i@xHiPiXi`ihipjxjj0jHjPj`jxjjjjjjkkkk(k8k`kk k(k0k8l@l(Hl@PlPXlh`lxhlplxllmmPmmnn n@n`nnno o oHohoop pP(px0p8p@qHqXPqXq`rhr pr0xr@rPr`rprrrss(s8sPs`spssssssst t (t00tH8tX@thHtxPtXt`thtptxt^& X&(%&0N&8U&@_&H-&PS&X?&`E&h&p(&x&L&H&#&#&`&@&&&&0&[T(&@X\pJ. bF]0BH'`x+ 8Q>  K82P h$IG1 Z(@!X6pR7<D09A(b0}ib@B8N |!/A KA(H`H `8!p|N A(bh}ibxBpN A(b}ibBN A(bH}ibXBPN A(b8}ibHB@N A(b}ibBN A(bp}ibBxN A(b}ibBN A(b}ib BN A(bx}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(bX}ibhB`N A(b}ibBN A(bh}ibxBpN A(b}ibBN A(b8}ibHB@N A(b}ib(B N A(b0}ib@B8N A(b}ibBN A(bx}ibBN A(b}ib(B N A(b}ibBN A(b}ibBN A(b }ib0B(N A(b}ibBN A(b}ibBN A(bP}ib`BXN A(b@}ibPBHN A(b}ibBN A(b}ibBN A(bP}ib`BXN A(b}ibBN A(b`}ibpBhN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(bH}ibXBPN A(b}ibBN A(b(}ib8B0N A(b}ibBN A(b }ib0B(N A(b}ibBN A(b}ibBN A(b}ibBN A(b`}ibpBhN ``|€!q/@/A" iKA("0뢀(~}=HP})t;@@H```8 x$}=* A(| iIN!A(~@A88!|N `|b8!/A,"@/A A(| iIN!A(8!p|N |!|? x|+x?i? x }+x }$Kx|xKmA(? x |Jx ? 8?|N |!!|? x/@8H? Hh`? ? |/A /@T/ AH /AH? /A? |xKA(H? pHl`? X? `H(`? xKA(x/@`KuA(/@`H8p?p /A ?p |xK-A(H`KA(/@`KA(8`|x8?|N !|? x|+x8?88 ?8 ?8 ? /@?8 HD? 0H`?0 0?0 /@`?08 8?PN |!q|? x|x肀P8KA(|`x/@8 pH`|x肀X8KA(|`x/@8pH0|x肀`8KqA(|`x/@8pH|x肀h8KAA(|`x/@8pH|x肀p8KA(|`x/@8pH|x肀x8KA(|`x/@8pHp|x肀8KA(|`x/@8pH@|x肀8KA(|`x/@8pH8p`p|x8?|N !|? x|#xH8`? | H@0H,? /@`80`0|x8?PN |!q|? x|#x/@$KA(|ix8 8pH,?)|}#Kx|xK|`xp`p|x8?|N |!Q|? x?i? x | xx肀8KA(|`x/A0KEA(K%A(|ix8 8HP? x 8 x ? KA(|`x/AKA(8HKA(|`x/AKA(8H`? | x? x | KA(|`xt?t9)?+Ax d}) "||J| N D\tK A(|`xpHKA(|`xpHKyA(|`xpHxKA(|`xpH`K A(|`xpHHKIA(|`xpH0K A(|`xpHKA(|`xpp/A KA(8H,`? x ? x @AD``|x8?|N |!Q|? x|#x8` KuA(|`x/@$KQA(|ix8 8H88 KmA(? ?8 8` K A(|`x/@0KA(KA(|ix8 9 ?Hx ?+A0?y x d}) "||J| N @XpKA(|`xpHKA(|`xpHKuA(|`xpHKA(|`xpHKA(|`xpHhKA(|`xpHPKA(|`xpH8KA(|`xpH K A(|ix8 8pp/@8? x ? x @@KUA(|`xpp/AKA(8`|x8?|N |!Q|? x?_8|x88KYA(8|x8袀KIA(|`xp8p|9?})p| }#Kx|x}f[xKA(|`x| xp|Jpp|9?})p| }#Kx|x袀KA(|`x| xp|Jp" |x 8|xKA(|`xx |Px 8 x |8xHX`p|9?})p| }#Kx|x袀K-A(|`x| xp|Jp?x8 xx?|HA`p|9?})p| }#Kx|x袀KA(|`x| xp|Jp8|xKA(|`xtt||x8?|N |!Q|? x|#x| |J8|8p"Ѐ |/A$bKaA(|`x| xp|JpH`")|x }#Kx肀|xKA(|`x| xp|Jp?|8 |8xH`8tH`?H@@T"i? x | x?8 }c[x肀}ESxKQA(|`x| xp|JpH0" |x肀K!A(|`x| xp|Jp?t8 tt/@\`" |x肀KA(|`x| xp|Jp?x8 xx/@`" |x肀KA(|`x| xp|Jp8xH`?H@A? x +@X? x +~AL"i? x }c[x肁|xK A(|`x| xp|JpH<`H`" |x肁KA(|`x| xp|Jp?8 H0" |x肀KA(|`x| xp|Jp?x8 xx/@`" |x肁KMA(|`x| xp|Jp?H@A,`p||x8?|N |!q|? x8p" bKA(|`x| xp|Jp?i?Ȁ x |}c[x|xKA(|`x| xp|Jpb KA(|`x| xp|Jpp||x8?|N !|? x|`x/ A$|"(x$}))?0H؀88/A8/A,8/AT8/AT8/@A0H8/A\8/AD8/APHX00H\80HP@0HDH0H8P0H,X0H `0H"()?0`0|x8?PN !|? x|`x/@(/A" 80H80`0|x8?PN |!A|? x   ? _ (8888x8p8|x88KA(8|x88KA(8?8|x8}&KxKA(|`x8H(`8p8x"Ѐ H`| 8p} J 0x / A /-A/ A,HL?8 | 8|JpH4| 8|Jx?8 H?8 x/Axx | 8|Jx |XPx 8 x |9?})| | 8|Z}#Kx}DSx|xKUA(8|xKA(|`x|9?})| }#Kx|x袀K A(|`x| x|J?| "8 H@?8 " | H@?HA@H`" | HAp/@("Ѐ | | P| 8 H4px | 8|Jx |XPx 8 x |9?})| | 8|Z}#Kx}DSx|xKA(8|xKA(|`x|9?})| }#Kx|x袀KA(|`x| x|J?| "8 ?HA`|9}k|!@| 8|J}c[x}DSx|xKA(|`x"Ѐ | |J|"А " 9?|x}$KxKA(|`x|x8?|N |!a|? x|+x/A/@,H`KA(|ix8 8H`" ?؀ |/@$KA(|ix8 8Hp?؀ |"hx$}))||x | A(iIN!A(|`xpKA(p|`|x8?|N |!a|? x|+x8p/A/@,H`KA(|ix8 8H\`" ?؀ | 8A8?؀ |bp|xK%A(|`x| xp|JpH$bxKA(|`x| xp|Jp? xHD`|x|xKuA(|`x| xp|Jp?x xx/@`?؀ | 8A8?؀ |b|xKYA(|`x| xp|JpH$bK5A(|`x| xp|Jpp|`|x8?|N |!|? x8KA(|`x|x8?|N |!Q|? x|#x8p? |/A$KޡA(|ix8 8H\x?x x b肁|xK A(|`x| xp|Jp?x x]`T~x | x?x x]`T~x "x$}) b肁}e[x|xKۡA(|`x| xp|Jp?x x]$x/@/@xH`?x xlTx | x?x xlTx "x$}) b肁}e[x|xK A(|`x| xp|JpH`/@t?x xtTx b肁|xKڽA(|`x| xp|Jp?x x b肁|xKډA(|`x| xp|Jp?x xx/@/@xH`?x x T>x | x?x x T>x "x$}) b肁}e[x|xKA(|`x| xp|JpH`?x xxe/@/@xH`?x x T>x | x?x x T>x "x$}) b肁}e[x|xKYA(|`x| xp|JpH`?x x |x?x x |xK|`xb肁x|xKA(|`x| xp|Jpp|`|x8?|N |!|? x8KA(|`x|x8?|N |!!|? x|#x8? |/A$KiA(|ix8 8H@?) ? x/@? x6dxц/A@? xx/A0bKבA(|`x| x|JH0`H`bKaA(|`x| x|J|H? xxF/AH ? xdx/A H ? x$x/A(H ? x&x/A0H ? x.xF/A8H b@肂H?K=A(|`x| x|J/AH/@? xxF/A$bPKA(|`x| x|J? xɤx>F/A$bXKյA(|`x| x|J? xdx6/A$b`K}A(|`x| x|J? xx'/A$bhKEA(|`x| x|J? xxF/A$bpK A(|`x| x|J? xdx/A$bxKA(|`x| x|J? x$x/A$bKԝA(|`x| x|J? x | x? "x |x? #x |x? x |x? x |x? x | x? x apxb肂}ESx}CxxxKA(|`x| x|JHbKA(|`|x8?|N |!a|? x8`8KA(|`xpp/@$KեA(|ix8 8HT?Ѐ x ?p ?p8 |x8K5A(p8K֙A(8`|x8?|N |!|? x8KA(|`x|x8?|N |!a|? x|#x8p?Ѐ |/A$KԁA(|ix8 8HxbKA(|`x| xp|Jp?x x/A$bKA(|`x| xp|Jp?x xxF/A$bKёA(|`x| xp|Jp?x xdx/A$bKYA(|`x| xp|Jp?x x$x/A$bK!A(|`x| xp|Jp?x x&x/A$bKA(|`x| xp|Jp?x x.xF/A$bKбA(|`x| xp|Jp?x x6dxц/A$bKyA(|`x| xp|Jp?x x>$x/A$bKAA(|`x| xp|Jp?x x | x?x x b肂}e[x‚|xKA(|`x| xp|Jp?x x ?x x b肃}e[x|xKϱA(|`x| xp|Jp?) |/@8?x T/A$bKeA(|`x| xp|JpbKEA(|`x| xp|Jpp|`|x8?|N |!a|? x8`XK5A(|`xpp/@$KA(|ix8 8HT?Ѐ x ?p ?p8 |x8@KѡA(p8 KA(8`|x8?|N |!|? x8 KaA(|`x|x8?|N |!Q|? xKA(|`x/@8HKmA(|`xpp/(@8H?i? x | x8 | x?x9)0p|}#Kx|xKmA(?p} p|T:|HP|/@0?p} p|T:|HP| | p|Jppx ?x '8`|x8?|N |!Q|? x|#x8p? |/ A$KΡA(|ix8 8Hx?x9)|b }$Kx|xKA(|`x| xp|Jp?x x b(肃0|xKA(|`x| xp|Jp?x TB/A8H @bH肃PKˁA(|`x| xp|Jp?x T/AXH `bh肃pK1A(|`x| xp|Jp?x (x ?x ,x bx肃}e[x|xKA(|`x| xp|Jp/@8?x T/AH b肃KʑA(|`x| xp|Jp?x 'x b肃|xK]A(|`x| xp|Jp?x 'x /Ab0K)A(|`x| xp|Jp?x TB/A@?x9i0?x 'x }c[x|xKA(|`x| xp|JpH0?x8 0b|xKɭA(|`x| xp|JpbKɍA(|`x| xp|Jpp|`|x8?|N |!a|? x8`HK}A(|`xpp/@$KYA(|ix8 8Hp88HKuA(?Ѐ x ?p ?Ѐ |/A$?p8 |x8KA(Hp?p8 4|x8KˡA(?p 8x'T>x T>x ?p y`  ?p 8xFT>x  ?p y` p8K˵A(8`|x8?|N |!|? x8KA(|`x|x8?|N |!q|? x|#xx?) t8pbKEA(|`x| xp|Jp?x x x b肃|xKA(|`x| xp|Jpt/@?x T/AbKA(|`x| xp|Jp?x x ?x $x b肃}e[xƒ|xK}A(|`x| xp|Jp?x x x | x?x ,x b肄}e[x„|xK-A(|`x| xp|Jp?x TB/A$bKA(|`x| xp|Jp?x T/A$bKA(|`x| xp|Jp?x T/A$b KőA(|`x| xp|Jp?x T/A$b(K]A(|`x| xp|Jp?x TJ/A$b0K)A(|`x| xp|Jp?x T/A$b8KA(|`x| xp|Jp?x TR/A$b@KA(|`x| xp|Jp?x T/A$bHKčA(|`x| xp|Jp?x T/A$bPKYA(|`x| xp|Jpt/@8?x T/A$bXKA(|`x| xp|Jpb`KA(|`x| xp|Jpp||x8?|N |!a|? x|#xx8p?x9)4|b}$Kx|xKuA(|`x| xp|Jp?x x x | x?x x"T>x b肄}e[x„h|xK A(|`x| xp|Jp?x =x b肄p|xKA(|`x| xp|Jp?x =x +A?y x dx}) "x||J| N 8\bK]A(|`x| xp|JpHbK9A(|`x| xp|JpHtbKA(|`x| xp|JpHPbKA(|`x| xp|JpH,bKA(|`x| xp|JpH`bKA(|`x| xp|Jp?x8 @|x8KřA(|`x| xp|Jpb`KYA(|`x| xp|Jpp||x8?|N |!q|? x|#x? |/A$K5A(|ix8 8pH\?) |/@$||xK|`xpH$||xK|`xp`p|x8?|N |!a|? x8` KÁA(|`xxx/@$K]A(|ix8 8Hx88 KyA(?Ѐ x ?x ?Ѐ |/A$?x8 |x8KA(HL? | x?Ѐ x | p?x9i4?p x }c[x|xKyA(x8KA(8`|x8?|N |!|? x8K9A(|`x|x8?|N |!a|? x|#xx8pbKuA(|`x| xp|Jp?x x/A$bK9A(|`x| xp|Jp?x xxF/A$bKA(|`x| xp|Jp?x xdx/A$bKA(|`x| xp|Jp?x x$x/A$bKA(|`x| xp|Jp?x x&x/A$bKYA(|`x| xp|Jp?x x.xF/A$bK!A(|`x| xp|Jp?x x6dxц/A$bKA(|`x| xp|Jp?x x>$x/A$bKA(|`x| xp|Jp?x xEx/A$bKyA(|`x| xp|Jp?x xMxF/A$bKAA(|`x| xp|Jp?) |/@T?x xUdx/A$bKA(|`x| xp|Jp?x x]$x/A$bKA(|`x| xp|Jp?x xdx/A$bKA(|`x| xp|Jp?x xlxF/A$b KIA(|`x| xp|Jp?x xtdx/A$b(KA(|`x| xp|Jp?x x|$x/A$b0KA(|`x| xp|Jp?x x | x?x x Tx |x?x x x yk`?x x |x?x x| x8} 8x |x?x "x |x?x #x b8}DSx}Cx}f[xxx| xKA(|`x| xp|Jp?x %x | x?x &x Tx |x?x &x x yk`?x *x |x?x (x |x?x ,x |x?x -x b@}DSx}Cx}f[xxx| xKiA(|`x| xp|JpbHKIA(|`x| xp|Jpp||x8?|N |!Q|? x|#xx8t8p?x9)8|b}$Kx|xKA(|`x| xt|Jt?x @x bP肅X|xKqA(|`x| xt|Jt?x @x /A`?/A/A$H?/A\/AHb`KA(|`x| xt|JtHbhKA(|`x| xt|JtH?x @x bp|xKA(|`x| xt|JtHp?x @x bx|xKqA(|`x| xt|Jt8pH4?x @x b|xK5A(|`x| xt|Jt?x Bx bP肅|xKA(|`x| xt|Jt?x Bx ?+:A?y x d}) "||J| N 4X|bKA(|`x| xt|JtHbKA(|`x| xt|JtHbKeA(|`x| xt|JtHbKAA(|`x| xt|JtHlbKA(|`x| xt|JtHHbKA(|`x| xt|JtH$bKA(|`x| xt|Jt?x Cx bP肅|xKA(|`x| xt|Jt?x Cx +A?y x d}) "||J| N <`bK!A(|`x| xt|JtHbKA(|`x| xt|JtHbKA(|`x| xt|JtHlbKA(|`x| xt|JtHHbKA(|`x| xt|JtH$bKmA(|`x| xt|Jt?x Dx bP肆|xK9A(|`x| xt|Jtp/A?x Ax b肆|xKA(|`x| xt|Jt?x Ax /Ad?x9iH?x Ax }c[x|xKA(|`x| xt|JtH,bHKA(|`x| xt|JtH`t||x8?|N |!q|? x|#x? |/A$K]A(|ix8 8pH\?) |/@$||xK|`xpH$||xK|`xp`p|x8?|N |!a|? x8`0KA(|`xpp/@$KA(|ix8 8HT?Ѐ x ?p ?p8 |x8KA(p8KyA(8`|x8?|N |!|? x8KA(|`x|x8?|N |!a|? x|#x8p?Ѐ |/A$KaA(|ix8 8H x?x9)|b }$Kx|xKA(|`x| xp|Jp?x x b(肆0|xKA(|`x| xp|Jp?x x /At/A/A$H/@A/AAH?x $x b8肆@|xK A(|`x| xp|JpH?x "x bH肆P|xKA(|`x| xp|JpH?x (x ?x $x bX肆`}e[x|xKA(|`x| xp|JpH\?x $x bh肆p|xKQA(|`x| xp|JpH$bxK-A(|`x| xp|JpbK A(|`x| xp|Jpp|`|x8?|N |!a|? x8`8KA(|`xpp/@$KA(|ix8 8HT?Ѐ x ?p ?p8 |x8KiA(p8KA(8`|x8?|N |!|? x8K)A(|`x|x8?|N |!a|? x|#xx8p?Ѐ |/A$KA(|ix8 8HbK9A(|`x| xp|Jp?x x/A$bKA(|`x| xp|Jp?x xxF/A$bKA(|`x| xp|Jp?x xdx/A$bKA(|`x| xp|Jp?x x$x/A$bKUA(|`x| xp|Jp?x x&x/A$bKA(|`x| xp|Jp?x x.xF/A$bKA(|`x| xp|Jp?x x6dxц/A$bKA(|`x| xp|Jp?x x>$x/A$bKuA(|`x| xp|Jp?x xEx/A$bK=A(|`x| xp|Jp?x xMxF/A$bKA(|`x| xp|Jp?x xUdx/A$bKA(|`x| xp|Jp?x x]$x/A$bKA(|`x| xp|Jp?x xdx/A$bK]A(|`x| xp|Jp?) |/@t?x xtdx/A$bK A(|`x| xp|Jp?x x|$x/A$bKA(|`x| xp|Jp?x x b|xKA(|`x| xp|Jp?x x b|xKuA(|`x| xp|Jp?x x ?x x b肇 }e[x|xK1A(|`x| xp|Jp?x $x | x?x &x b(肇0}e[x‡8|xKA(|`x| xp|Jp?x ,x | x?x (x b(肇@}e[x‡H|xKA(|`x| xp|JpbPKyA(|`x| xp|Jpp|`|x8?|N |!a|? x8`pKiA(|`xpp/@$KEA(|ix8 8H?Ѐ x ?p ?p8 |x8KA(?p8 &?p8 (|x8KA(?p8 8?p8 <|x8KA(?p8 D?p8 H|x8K]A(?p8 hp8KA(8`|x8?|N |!|? x8KA(|`x|x8?|N |!a|? x|#xx8p?Ѐ |/A$KA(|ix8 8H4bXK!A(|`x| xp|Jp?x x /A4?x8 b`肇h|xKA(|`x| xp|Jp?x x/A$bpKA(|`x| xp|Jp?x xxF/A$bxKiA(|`x| xp|Jp?x xdx/A$bK1A(|`x| xp|Jp?x x$x/A$bKA(|`x| xp|Jp?x x&x/A$bKA(|`x| xp|Jp?x x.xF/A$bKA(|`x| xp|Jp?x x6dxц/A$bKQA(|`x| xp|Jp?x x>$x/A$bKA(|`x| xp|Jp?x xEx/A$bKA(|`x| xp|Jp?x xMxF/A$bKA(|`x| xp|Jp?x xUdx/A$bKqA(|`x| xp|Jp?x x]$x/A$bK9A(|`x| xp|Jp?x xdx/A$bKA(|`x| xp|Jp?x xlxF/A$bKA(|`x| xp|Jp?x x|$x/A$bKA(|`x| xp|Jp?x8 (b|xKeA(|`x| xp|Jp?x8 x bX肉0}e[xŠ`|xKA(|`x| xp|Jp? xdx/AhH p? xlx/AhH pbx肊ŠK!A(|`x| xp|Jp?Ј x |xK=|`x| xp|Jp?Ј x /At/@8?Ј x b(肊|xKA(|`x| xp|Jp?8 b肊|xKuA(|`x| xp|JpbKUA(|`x| xp|Jp? `xH `?x8 |x肈8KA(|`x/@0|x|xK|`x| xp|JpH?x8 |x肉8KA(|`x/@0|x|xK|`x| xp|JpHT?x8 |x肉8KAA(|`x/@,|x|xKm|`x| xp|Jp?x xx/@`p||x8?|N |!a|? x8pb肊KA(|`x| xp|Jp8tHp`t| } J Hx /A\t| } J Hx b|xKQA(|`x| xp|Jp?t8 tt/@H`bKA(|`x| xp|Jp8tH`?9iHt|"x&}) }c[x|xKMA(|`x/@Tt|"x&})9) b|xKA(|`x| xp|Jpp|HH?t8 tt|"x&})9) /@D`p|`|x8?|N |!Q|? x|#x8t8p? |/A8? |/A$KA(|ix8 8H?8 |x肊8K1A(|`x/@@?9)|b}$Kx|xK9A(|`x| xt|JtH255)BA060007A keyboard was not foundBA060008No configurable adapters found by the remote IPL menu in the SMS utilitiesBA06000BThe system was not able to find an operating system on the devices in the boot listBA06000CA pointer to the operating system was found in non-volatile storageBA060020The environment variable "boot-device" exceeded the allowed character limitBA060021The environment variable "boot-device" contained more than five entriesBA060022The environment variable "boot-device" contained an entry that exceeded 255 characters in lengthBA080001An IDE device remained busy for a longer period than the time out periodBA080010An IDE device is busy longer than specified time-out periodBA080011An IDE command timed out; command is exceeding the period allowed to completeBA080012The ATA command failedBA080013The media is not present in the trayBA080014The media has been changedBA080015The packet command failed; the media might not be readableBA090001SCSI DASD: test unit ready failed; hardware errorBA090002SCSI DASD: test unit ready failed; sense data availableBA090003SCSI DASD: send diagnostic failed; sense data availableBA090004SCSI DASD: send diagnostic failed: devofl cmdBA100001SCSI tape: test unit ready failed; hardware errorBA100002SCSI tape: test unit ready failed; sense data availableBA100003SCSI tape: send diagnostic failed; sense data availableBA100004SCSI tape: send diagnostic failed: devofl cmdBA110001SCSI changer: test unit ready failed; hardware errorBA110002SCSI changer: test unit ready failed; sense data availableBA110003SCSI changer: send diagnostic failed; sense data availableBA110004SCSI changer: send diagnostic failed: devofl commandBA120001On an undetermined SCSI device, test unit ready failed; hardware errorBA120002On an undetermined SCSI device, test unit ready failed; sense data availableBA120003On an undetermined SCSI device, send diagnostic failed; sense data availableBA120004On an undetermined SCSI device, send diagnostic failed; devofl commandBA130001SCSI CD-ROM: test unit ready failed; hardware errorBA130002SCSI CD-ROM: test unit ready failed; sense data availableBA130003SCSI CD-ROM: send diagnostic failed; sense data availableBA130004SCSI CD-ROM: send diagnostic failed: devofl commandBA130010USB CD-ROM: device remained busy longer than the time-out periodBA130011USB CD-ROM: execution of ATA/ATAPI command was not completed with the allowed timeBA130012USB CD-ROM: execution of ATA/ATAPI command failedBA130013USB CD-ROM: bootable media is missing from the driveBA130014USB CD-ROM: the media in the USB CD-ROM drive has been changedBA130015USB CD-ROM: ATA/ATAPI packet command execution failedBA140001SCSI read/write optical: test unit ready failed; hardware errorBA140002SCSI read/write optical: test unit ready failed; sense data availableBA140003SCSI read/write optical: send diagnostic failed; sense data availableBA140004SCSI read/write optical: send diagnostic failed; devofl commandBA150001PCI Ethernet BNC/RJ-45 or PCI Ethernet AUI/RJ-45 adapter: internal wrap test failureBA15100110/100 MBPS Ethernet PCI adapter: internal wrap test failureBA15100210/100 MBPS Ethernet cardBA160001PCI auto LANstreamer token ring adapter: failed to complete hardware initializationBA161001PCI token ring adapter: failed to complete hardware initializationBA170000NVRAMRC initialization failed; device test failedBA170100NVRAM data validation check failedBA170201The firmware was unable to expand target partition - saving configuration variableBA170202The firmware was unable to expand target partition - writing error log entryBA170203The firmware was unable to expand target partition - writing VPD dataBA170210Setenv/$Setenv parameter error - name contains a null characterBA170211Setenv/$Setenv parameter error - value contains a null characterBA170998NVRAMRC script evaluation error - command line execution errorBA170999NVRAMRC script evaluation error - stack unbalanced on completionBA180008PCI device Fcode evaluation errorBA180010PCI probe error, bridge in freeze stateBA180011PCI bridge probe error, bridge is not usableBA180012PCI device runtime error, bridge in freeze stateBA180100FDDI adapter Fcode driver is not supported on this systemBA180101Stack underflow from fibre-channel adapterBA188000An unsupported adapter was found in a PCI slotBA188001EEH recovered a failing I/O adapterBA188002EEH could not recover the failed I/O adapterBA190001Firmware function to get/set time-of-day reported an errorBA210000Partition firmware reports a default catchBA210001Partition firmware reports a stack underflow was caughtBA210002Partition firmware was ready before standout was readyBA250010dlpar error in open firmwareBA278001Failed to flash firmware: invalid image fileBA278002Flash file is not designed for this eServer platformBA278003Unable to lock the firmware update lid managerBA278004An invalid firmware update lid was requestedBA278005Failed to flash a firmware update lidBA278006Unable to unlock the firmware update lid managerBA278007Failed to reboot the system after a firmware flash updateIDPEMR%-20s%c%c %-20s%08x ID:Flags:%-20s%08x Length:%-20s%c - Priority:High priority and mandatory call-out. Medium priority. Medium priority group A (1st group). Medium priority group B (2nd group). Medium priority group C (3rd group). Low Priority. FRU ID Section%-20s%08x Failing Component:("normal" hardware FRU) (Code FRU) (Configuration error) (Mainteneace procedure required) (External FRU) (External Code FRU) (Tool FRU) (Symbolic FRU) %-20s%s FRU Stocking Part:Procedure ID:CCIN:Serial Number:FRU PE Section%-20s%s PCE Name: FRU MR Section Manufacturing Replaceable Unit Fields (%d): %-20s%c %-20s%08x MRU Priority:MRU ID:FRU Section (%d)%-20s%08x %-20s%08x Call-Out Type:YesNo%-20s%-8s %-20s%-8s Fru ID Included:Fru Subscns:Loc Code Length:Location Code:%s "Primary Reference Code:%c" %s PSPrimary SRC SectionSecondary SRC Section%-20s%08x %-20s%08x SRC Version:Subsections:Platform Data: Extended Reference Codes: 2: %08x 3: %08x 4: %08x 5: %08x 6: %08x 7: %08x 8: %08x 9: %08x Sub-Section ID:Platform Data:JanFebMarAprMayJunJulAugSepOctNovDec%-20s %c%c %-20s%08x Section ID:Section Length:%-20s%08x %-20s%08x Version:Sub_type:%-20s%08x Component ID:Private Header%-20s%x %s %x Date:%-20s%x:%x:%x:%x Time:%-20sCreator ID:Hardware Management ConsoleService ProcessorPHypPower ControlPartition FirmwareSLICUnknown (%c). Section Count:Creator Subsystem Name: %s. Creator Subsystem Version: %08x%08x. Platform Log ID:Log Entry ID: %-20s%08x Subsystem ID:(Processor, including internal cache) (Memory, including external cache) (I/O (hub, bridge, bus)) (I/O adapter, device and peripheral) (CEC Hardware) (Power/Cooling System) (Other Subsystems) (Surveillance Error) (Platform Firmware) (Software) (External Environment) Event Data %-20s%08x Event Type:Miscellaneous, informational only. Dump notification. Previously reported error has been corrected by system. System resources manually deconfigured by user. System resources deconfigured by system dueto prior error event. Resource deallocation event notification. Customer environmental problem has returned to normal. Concurrent maintenance event. Capacity upgrade event. Resource sparing event. Dynamic reconfiguration event. Normal system/platform shutdown or powered off. Platform powered off by user without normal shutdown. Unknown event type (%d). Event Severity:Informational or non-error event, Recovered error, general. Predictive error, general. Predictive error, degraded performance. Predictive error, fault may be corrected after platform re-IPL. Predictive Error, fault may be corrected after IPL, degraded performance. Predictive error, loss of redundancy. Unrecoverable error, general. Unrecoverable error, bypassed with degraded performance. Unrecoverable error, bypassed with loss of redundancy. Unrecoverable error, bypassed with loss of redundancy and performance. Unrecoverable error, bypassed with loss of function. Error on diagnostic test, general. Error on diagnostic test, resource may produce incorrect results. Unknown event severity (%d). Action Flag:Service Action (hidden error) call home) Required. Report Externally, (HMC only). (HMC and Hypervisor). Error isolation incomplete, further analysis required. Unknown action flag (0x%08x). User Header%-20s%s (tttt-mmm) Model/Type:%-20s%s Serial Number:Machine TypeUnknown SectionRaw Section Data: IBM Diagnostics Section%-20s%08x Event ID:Vendor Error Log Section%-20s%c%c%c%c Vendor ID:Raw Vendor Error Log: Hotplug section%-20s%08x Hotplug Type:Hotplug Action:Hotplug Identifier:%-20s%sHotplug drc_name:Hotplug drc_index:Hotplug count:   (o   rhp"[P ooooP%% %(%0%@%H%P%h%p%%%%%%%%%%%h&&&&& &(&0&8%&@&H&X&p&x&&&&&CPC`CxCCCDDD0D@D`DpDDDC`DCDCDDDD@EDpEDE E0EPE`ExEEEEEF(F8FxFFFGG(GhGxGGHHH8HHHpHHHHHHII(I8IhIxIIJJJHJXJJJJK(K8KhKxKKKKKLLPL`LLMM MpMMMN@NPNNNOOPO`OxOOOOOP0P@PxPPPQQQHQXQQQQR R0R`RpRRRSSHSXSSSSTHTXTTUUUHUXUUUUV0V@VVVWW8WHWWWWXX(XhXxXXYY(YhYxYYZ Z0ZPZ`ZZ[[ [X[h[[[\\X\h\\]]]X]h]]^^^8^H^p^^^^__H_X____```@`P````aa(a`apaaaabb(bXbhbbbbcc(hhhhhhhhhhhhhhhhiiiw0$||}4}LthxPL<h dh< \ʸ| ׬ތXd<\,|lD"`H~8~@~H~0$$$$$$$%%&&&&X`&'''' '('0'8'P'h'p'''''((((@(`(x(((((((())))@)h)x)))))))**H*x***++8+@+H+X+x+++++,,0,H,P,h,x,,,,,----(-@-H-X-h-x---------... .8.X.p....../ /P///00@0x00,0011`11112202X22233@3h334484h445055555556686P6`6p66666d677 787`7x77777788808H8h88888889989`9x9999:: :@:`:::;;;0;H;`;p;;;;;;<<<0>@>>>>? ?X???@(@`@@AA0A`AABB@BxBBCC(C8CHchcpcxccccccctcdd(dPdxdddddeee0eXeheeeeeeeeefff(f0f@fpffffffffgg(g8gPg`ghgggggggghhh h@hhhhii8iHiXipiiiixiiiiijjj0jHjPj`jxjjjjjjkkkk(k8k`kkkkkll(l@lPlhlxllllmmPmmnn n@n`nnno o oHohooppPpxppqqXqqrr r0r@rPr`rprrrss(s8sPs`spssssssstt t0tHtXthtxttttttGCC: (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]ospWG,}4 l, |,,,Gh,#!d,)7<,,S,0 |`,3,7ތ,BH,LA\,Ox Hrtas_copycleanup_rtas_eventadd_re_scn =re_scn_id get_re_scn parse_v6_rtas_event uparse_rtas_event  wprint_scn_titleprint_raw_datartas_print_raw_event>rtas_set_print_widthtrtas_print Xrtas_print_scn rtas_print_event .rtas_get_event_hdr_scn iprint_re_hdr_scn rtas_get_event_exthdr_scn print_re_exthdr_scn prtas_entity_namesJ 6parse_cpu_scn}rtas_get_cpu_scnprint_re_cpu_scnbuparse_dump_scnrtas_get_dump_scnupdate_os_id_scnYprint_re_dump_scnMGYparse_epow_scnrtas_get_epow_scnprint_re_epow_scnG#!oparse_io_scnrtas_get_io_scnprint_re_io_scnJ)7Gparse_lri_scnrtas_get_lri_scnprint_re_lri_scnJ,Sparse_mem_scn(rtas_get_mem_scn[print_re_mem_scnM0 parse_post_scnrtas_get_post_scnJprint_re_post_scnN32parse_sp_scnxrtas_get_ibm_sp_scnprint_re_ibmsp_scnu7 parse_src_scnyrtas_get_src_scn print_re_fru_scn print_src_refcode mprint_re_src_scnB z%print_v6_hdrparse_priv_hdr_scnrtas_get_priv_hdr_scnprint_re_priv_hdr_scnbparse_usr_hdr_scnrtas_get_usr_hdr_scnprint_usr_hdr_subsystem_id+print_usr_hdr_event_datapprint_usr_hdr_actionprint_re_usr_hdr_scnparse_mtms^print_mtmsparse_mt_scnrtas_get_mt_scn!print_re_mt_scnparse_generic_v6_scnprint_re_generic_scnLAwparse_ibm_diag_scnrtas_get_ibm_diag_scn:print_re_ibm_diag_scnparse_vend_errlog_scnrtas_get_vend_errlog_scnprint_re_vend_errlog_scnVOHsparse_hotplug_scnrtas_get_hotplug_scnprint_re_hotplug_scn }4s1uintp|pe 4B Y. /# re0K# 1# g2W# Y (K <WW# XW# &Yj# =Z# [# R\# (e Yf# wg#dayh# mo Tp# q# Hr# s# 7(' # w# }# j#   id# 7# <# # #pe  # id# 7# #h 7## #? #p#n'#(#)#X*#`peOx34#S5'#<7# 8#!; #(< #,= #0> #4@ #8A #<B #@C #DDE#HG#l!H#lDI#l6K#ppepe#(^+_#S`'# 9aj#  ~ # <# # g # l # # f# # - # (H # # # # r# # # # M#  # # # A# ~# # # ^# d# # # r# -Q# ]}4}toh0reK82u-W}Mre,K0scn.P~p6H ve;@~(FfruGsrcH~L~~_P(Xgen^g{ =rezK0scnzh8gzW|h(h)`dWL qS q0'L4 d0gW8t reK0gW8PKth ureK0S qPibmjHt gWDrcW@6Kh buf5j05W8re7KX 8 P 9 Hrc:W@+ A8s1uintii|H1D-o b# # # # # |#( #0 #8 #@ (#H #P \ #X "#` $#h &b#p *b#t 8,p#x 0F# 1T# 2# 26# <?{# mH# tI# {J# K# L-# Nb# P#+z   # v# Wb#  io4MY.\ /\#re0# 1 # g2b#Y ( <Wb# Xb# &Y# =Z # [ # R\\#b(e Yf #wg #dayh #moZTp #q #Hr #s # ~ #< # #g  #l  # #f # #-  #(w # # # #r # # # #M #  # # #A #~ # # #^ #d # # # r # -# zbhfmty0ap{w|bwbuf}wi~bwlen~bw=~bw ^bx 90b8h`aXendP=MLibHjbDlenb@?bxP0re8lenb`PO>b0 btHb02b Xfmt0apobufowi bo6!bo=!bo"boH#boN$bo%o&o|b6 {0{\8T{blen}bPb .0re8Tb\XlenbP c cre0Z b \0Tb8 cHlenb@  Lj re0bL |\0Tb8 lenb<b=b &!b X' ` b  1  L  &_U   K ij ;  p M] ` ints1uu|4WY./# re09#1#g24#Y (9<V4#W4#&Xo#=Y#Z#R[#86# #  # y# %# # S#  # i!# id## $# & # @' # ^(#$ 24w re90wP? 7w<Q re690F4<E0TE48cpuGwXlenH4P hints1uu|ul'u 4W Y. /# re0T# 1# g24# Y (T <V4# W4# &Xo# =Y# Z# R[#   id# 7# <# # #ul $Xu # SZ#id # #$ #$ #$ 2#$  #(  #, 9|#0 g4reT0 ?P D38re2T0 V=4Yre<T0id<8>P v?Hlen@4@d4hc0Tc48 ?eHlenf4@ hdints1uu|ul4W Y. /# re0I# 1# g24# Y (I <V4# W4# &Xo# =Y# Z# R[#   id# 7# <# # #ul HY # # # # # fan# # p# # # J # . # ! #  #   #  c #$  #(  #,SO#4 #< {#< ;#< !#@ 4hreI0 P = lre<I0 ~L4 >K0TK48 Mh<N4dlenO4` U4 0T48 Xlen4P 4d S0T482 Xd<ints1uu|4WY./# re09#1#g24#Y (9<V4#W4#&Xo#=Y#Z#R[#  id# 7# <# # # u l  +_,# /# 0# 1# 2# 4# 5# 6# b7# 9# : # < # > # @ # B # >C# D# $H# I# J# OK# >M#  P#  R#  V#$ W#$ X#$ Y#( [#( ^#, `#,Sh?#8 `j#@ 3p#@ t#@|#@  #D 5_#H uo l t4d re90ioX`S*P? w? re>90 kM4 :jL0TL48ioNXlenO4P 4h 0T48ioHlen4D 14@  4h<  0T 48 5<ints1uu|4WY./# re09#1#g24#Y (9<V4#W4#&Xo#=Y#Z#R[#  id# 7# <# # # u l      ] P0G#S?# n# #  #$ @ #( 4< !re90lriP w3 \ nre290 $A4\ @0T@48lriBXlenC4P  |Oints1uu|4WY./# re09#1#g24#Y (9<V4#W4#&Xo#=Y#Z#R[# 856# 7# ECC8# y9# ;# Y=# ># bus?# @# B# C # iD # G # H # K# 8L# eO# Q# T # @U # +W#$ X#$ Z #( \#,  4ʸ " re90mem"P? H4"ʸ U[ re390 B4| A0TA48memC"XlenD4P d| ints1uu|4WY./# re09#1#g24#Y (9<V4#W4#&Xo#=Y#Z#R[#pgh# i# Jj# cpuk# l# ion# o# p# (q# s# t # u # v # 0x # Qy # 8{#}#[~#(#<#H u l  l  l  l4| re90P?pC <JreB90Q4 P0TP48RXlenS4P Fތ ints1uu|ul4W Y. /# re0I# 1# g24# Y (I <V4# W4# &Xo# =Y# Z# R[# 82 # ibm|# # # # # # # # # # l #  #  # 7 #  # # u# rtc# # # # *# # c# #  # c #${4׬ rreI0sprPO4r׬#re3I0PB4ތpA0TA48spCrXlenD4P  ތ ints1uu|ulul4W Y. /# re0Y# 1# g24# Y (Y <V4# W4# &Xo# =Y# Z# R[#uol   id# 7# <# # #ulul !{ Y|# p}_# ` `# id# 7# # 8 # # # # p_#%ul MH # g# ]#& +u#id# I W #W#gl h  7## #? #u#n&#' #(#X)`#`ulOg x2R3#S4o#<6# 7R#!: #(; #,< #0= #4? #8@ #<A #@B #DDDb#HF#l!G#lDH#l6J#publurl#  ido# fo#+`ތreY0PfzJ` <reIY0K<PLH 9Mo@i`WrehY0jPkH 9lo@+;4sreY0srcsXfruPH4D4@0_`p`ido!<sreY04>`0T48len4`4?u0len4P:49`0T948;Xlen<4T1=P 4% `0T48<hlen4`u4Xr `0T48`i4\len4Xtmru P4X fru0T48+4`Xlen4P4 msrcs0i4Tlen4P4Y 0T48srcsPfruHlen4D+4@r lxk  v[\ ints1uu|4WY./# re09#1#g24#Y (9<V4#W4#&Xo#=Y#Z#R[#(d Ye# wf# dayg#mn To# p# Hq# r# u l  > id># 7# <# # # uN lX34#S5#-7?# r8#$=u#0 'D#0jG#8H#<J#@K#DM#H u lP0TU#SV# X# Y# Z# `[# >n#(!{Y|#p}# 8TU#SV#kW# (]%^#S_# 9`o# (4d'o0S'8T'4len)4`@4dre?90APNg@ref90u4bt0Tt48vXlenw4P{4re90P1're904t+0idWdlen4`4p0len4P04<0len4P4<[0T48Xlen4PEXre90kX84kX0len4`4Bre90mtP!re90p+4*0T*48mt,Xlen-4PFC4)reB90genDXaETSPh4\v Tg0Tg48geniXlenjP o d li T xsM\ints1uu|ul4W Y. /# re0I# 1# g24# Y (I <V4# W4# &Xo# =Y# Z# R[#  { #  # 7( # |# }# o# 4\,reI03PO i3,|:re2I0 A4|l]@0T@483BXlenC4P X4lreWI0veYP{; }Dre|I0P4DD0T48veXlen4PD_"Tints1uu|ul4W Y. /# re0I# 1# g24# Y (I <W4# X4# &Yo# =Z# [# R\#   id# 7# <# # #ul } ~ + (hsi#SjO#l# >s# w# |# u1#$4reI0P5re4I0C4"T+B0TB48DXlenE4P% $ > $ > $ >   II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8  : ; I 8  : ; : ;I 8  : ;I8 .? : ; ' @: ; I : ; I .? : ; ' I@4: ; I  4: ; I  U .: ; ' I@.? : ;' I@: ;I : ;I 4: ;I 4: ;I % : ; I$ > $ > $ >   I : ;  : ;I8  I : ; : ; I8 I!I/  : ; I8  : ; I 8  : ; I 8 .? : ; ' I@: ; I 4: ; I 4: ; I !I/: ; I .: ; ' I@.? : ;' I@: ;I : ;I 4: ;I 4: ;I I 4: ; I?  % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 .? : ; ' I@ : ; I 4: ; I .? : ; ' I@: ; I 4: ; I % $ > $ > $ >  II!I/ &I : ; I  : ;  : ; I8 : ; I8 : ; I 8  : ; I 8 .? : ; ' I@: ; I 4: ; I 4: ; I .? : ; ' I@: ; I % $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8 : ; I 8  : ;I 8  : ;I8 .? : ; ' I@: ; I 4: ; I .: ; ' I@: ; I 4: ; I .? : ; ' I@% $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 I !I/  : ; : ;I8  : ;I 8 .? : ; ' I@: ; I 4: ; I  4: ; I .: ; ' I@: ; I .? : ;' I@: ;I % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 I !I/  : ;  : ; I  : ; I.? : ; ' I@: ; I 4: ; I .? : ; ' I@: ; I % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 .? : ; ' I@ : ; I 4: ; I .? : ; ' I@: ; I % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 I !I/ .? : ; ' I@: ; I 4: ; I .? : ; ' I@: ; I 4: ; I % $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 .? : ; ' I@: ; I 4: ; I .? : ; ' I@: ; I % $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8  : ; : ;I8  : ;I8  : ;I 8 .: ; ' I@: ; I 4: ; I .? : ; ' I@4: ; I  U: ; I .: ;' I@: ;I 4: ;I 4: ;I  .? : ;' I@: ;I % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 I !I/  : ; : ;I8 .? : ; ' I@: ; I 4: ; I : ; I 4: ; I .? : ;' I@: ;I 4: ;I 4: ;I .? : ;' @: ;I  U% $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8 .? : ; ' I@: ; I 4: ; I : ; I 4: ; I < .? : ; ' I@% $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8  : ; : ;I  : ;I : ; : ;I8  : ;I 8  : ;I8 .? : ; ' I@: ; I 4: ; I .? : ; ' I@: ; I 4: ; I | /usr/includeget_rtas_event.clibrtasevent.hlibrtasevent_v4.hlibrtasevent_v6.hstdint.h }4Ƀ i==.E >/>#0KZ(0=/>=/==+P=u.J%0K_f' =M.6J>/! u0==>KM=/;[> fg.p .r  .t  .v  .x 5z 31/! g/g2z y/!t=Y2! jw=Y.C vg=9.J g=4.O "ZY#Y#Y#Y#Y$Y#Y#\==/T 0/! Y=Y. Y=>Y==Y. u[uu=. Zg.A Y==Y;.H uZY4XO $Y#Y#Y#Y#Y#Y#Y$Y#Y2Z==1/! : /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/include/bits/usr/includeprint_rtas_event.cstddef.htypes.hstdio.hlibio.hstdarg.hstdint.hlibrtasevent.h h/1Kh/ Y01YL0?KKK>zy tKKMLx tc X/ u0>/ Y= tu  .w  .x 6y 5z 432=! tYg=2/! tL0/0gh//0/0Y1=Y#Y=#@=gK=e ; h>gKK<:X" Y.o %?YY5>==! 0Y.k %>gʄYwgʄ=! gY 0YY#.` 0&=̭%%M=! gY 1YY7.L /LYM+<Y E==ggggggg,?=! a /usr/includertas_cpu.clibrtasevent.hlibrtasevent_v4.hstdint.h iY=Y .z ZuZ/! gY 0YY$._ 0Yggggggg1=! b /usr/includertas_dump.clibrtasevent.hlibrtasevent_v6.hstdint.h iY=Y .z ZuZ/! gYyY=.n Y=.u L/! 0YY.d 0>>=>YY氃=! b /usr/includertas_epow.clibrtasevent.hlibrtasevent_v6.hstdint.h hiY=Y.q ZZYuZ/! gY /K0=Y#AYYYYYYYYY/ /0Zk####i / YY5gwu!  ` /usr/includertas_io.clibrtasevent.hlibrtasevent_v6.hstdint.h diY=Y.o YZYZ/! gY /0Ygggggggggggggggg0,/ //0L###/#M######v#####=Y&/ YY5gwu! a /usr/includertas_lri.clibrtasevent.hlibrtasevent_v6.hstdint.h <iY=Y .z ZuZ/! gY 0YY&.] 0L####=! a /usr/includertas_mem.clibrtasevent.hlibrtasevent_v4.hstdint.h iY=Y .z ZuZ/! gY /0YY8.K Yggggggggggggggg01=! b /usr/includertas_post.clibrtasevent.hlibrtasevent_v4.hstdint.h |iY=Y.k [u?u?u?u>Z/! gY /0YY/.T YYgggggggggggggg=! ` /usr/includertas_sp.clibrtasevent.hlibrtasevent_v4.hstdint.h iY=Y .z ZuZ/! gY 0YY. 0YYYYYYYYYYYYYYYYYYYYYYYYYYʃ=! x /usr/includertas_srcfru.clibrtasevent.hlibrtasevent_v6.hrtas_src_codes.cstdint.h ތiY=Y.h Yvuwuwuu?u?/! kY=Y .w YvK>/! kY=Y .w YvK>/! kY=Y. YZuu. vY0<<H 0Y==Y5.N [[u//vYYZu#==.m =L>g.t=L>0uZ/! gY 0w=/ u0ʃ#####/ 2YZ=#########uuu/ 1YYʄ/ 1YKv+/ 0=M"Y=˽Yz t/ g0Kv#//B7=! /0Y..U 0=Nwx=0̄Y:y=! e /usr/includertas_v6_misc.clibrtasevent.hlibrtasevent_v6.hstdint.h 'Z=w0/iY=Y.m Y]yY?Y/! gY 0YY.A 0=ڑ(######=Y#=!iY=Y .y YZuZ/! gY gK0gLgLgLgLgLgLgLgLgLgLgM/ g08"""""""""""""t""""""""""""""/ g0Zuu#u#j  '/ 0YY .w 0׃=!ug>u=i/iY=Y .x YYvgZ/! gY 0YY .y 0ן=!h0Y=Y.m YZuuKY .z Y/!0YY.t /K$=! b /usr/includertas_vend.clibrtasevent.hlibrtasevent_v4.hstdint.h \iY=Y .z ZuZ/! gY 0YY .z 0=!iY=Y.o YwYKY6Y/! gY 0YY.s 0K=! e /usr/includertas_hotplug.clibrtasevent.hlibrtasevent_v6.hstdint.h iY=Y .x Zu\/! gY 0YY.m 0YY˃=!  xA $}4PA~D $}PA~D HPD $PA~D LHPD $PA~D $tPA~D $h8PA~D  xA $@DT A~D $@PA~D $@xPA~D @P4HPD @pHPD $@PA~D $@ */ #ifndef _H_RTAS_EVENT_HDRS #define _H_RTAS_EVENT_HDRS #include #include #define RE_V4_SCN_SZ 28 /** * @struct rtas_cpu_scn * @brief RTAS CPU section */ struct rtas_cpu_scn { struct scn_header shdr; uint32_t internal:1; /**< internal error, other than cache */ uint32_t intcache:1; /**< internal cache error */ uint32_t extcache_parity:1; /**< or multi-bit ECC */ uint32_t extcache_ecc:1; /**< single bit ecc error */ uint32_t sysbus_timeout:1; /**< timeout waiting for mem controller*/ uint32_t io_timeout:1; /**< timeout waiting for I/O */ uint32_t sysbus_parity:1; /**< Address/Data parity error */ uint32_t sysbus_protocol:1; /**< transfer error */ uint32_t id:8; /**< physical CPU id number */ uint32_t element:16; /**< id number of sender of parity error or element which timed out */ uint32_t failing_address_hi:32; uint32_t failing_address_lo:32; uint32_t try_reboot:1; /**< V4: 1 => reboot may fix fault */ uint32_t /* reserved */ :7; uint32_t /* reserved */ :24; uint32_t /* reserved */ :32; uint32_t /* reserved */ :32; uint32_t /* reserved */ :32; }; /** * @struct rtas_mem_scn * @brief RTAS memory controller section */ struct rtas_mem_scn { struct scn_header shdr; uint32_t uncorrectable:1; /**< uncorrectable memory error */ uint32_t ECC:1; /**< ECC correctable error */ uint32_t threshold_exceeded:1; /**< correctable error threshold exceeded */ uint32_t control_internal:1; /**< memory controller internal error */ uint32_t bad_address:1; /**< memory address error */ uint32_t bad_data:1; /**< memort data error */ uint32_t bus:1; /**< memory bus/switch internal error */ uint32_t timeout:1; /**< memory time-out error */ uint32_t sysbus_parity:1; /**< system bus parity error */ uint32_t sysbus_timeout:1; /**< system bus time-out error */ uint32_t sysbus_protocol:1; /**< system bus protocol/transfer error */ uint32_t hostbridge_timeout:1; /**< host bridge time-out error */ uint32_t hostbridge_parity:1; /**< host bridge address/data parity error */ uint32_t /* reserved */:1; uint32_t support:1; /**< system support function error */ uint32_t sysbus_internal:1; /**< system bus internal hardware/switch error */ uint32_t controller_detected:8; /**< physical memory controller number that detected the error */ uint32_t controller_faulted:8; /**< physical memory controller number that caused the error */ uint32_t failing_address_hi:32; uint32_t failing_address_lo:32; uint32_t ecc_syndrome:16; /**< syndrome bits */ uint32_t memory_card:8; /**< memory card number */ uint32_t /* reserved */:8; uint32_t sub_elements:32; /**< memory sub-elements implicated on this card */ uint32_t element:16; /**< id number of sender of address/data parity error */ uint32_t /* reserved */:16; uint32_t /* reserved */:32; }; /** * struct rtas_post_scn * @brief RTAS power-on self test section */ struct rtas_post_scn { struct scn_header shdr; uint32_t firmware:1; /**< firmware error */ uint32_t config:1; /**< configuration error */ uint32_t cpu:1; /**< CPU POST error */ uint32_t memory:1; /**< memory POST error */ uint32_t io:1; /**< I/O subsystem POST error */ uint32_t keyboard:1; /**< keyboard POST error */ uint32_t mouse:1; /**< mouse POST error */ uint32_t display:1; /**< Graphic IOA / Display POST error */ uint32_t ipl_floppy:1; /**< diskette IPL error */ uint32_t ipl_controller:1; /**< drive controller IPL error */ uint32_t ipl_cdrom:1; /**< cd-rom IPL error */ uint32_t ipl_disk:1; /**< hard disk IPL error */ uint32_t ipl_net:1; /**< network IPL error */ uint32_t ipl_other:1; /**< other device IPL error */ uint32_t /* reserved */ :1; uint32_t firmware_selftest:1; /**< sef-test error in firmware */ char devname[13]; /**< device name */ uint32_t err_code[5]; /**< POST error code */ uint32_t firmware_rev[3]; /**< firmware revision level */ uint32_t loc_code[9]; /**< location code of failing device */ }; /** * @struct rtas_ibmsp_scn * @brief RTAS event service processor section */ struct rtas_ibmsp_scn { struct scn_header shdr; char ibm[4]; /**< "IBM\0" */ uint32_t timeout:1; /**< service processor timeout */ uint32_t i2c_bus:1; /**< I/O (I2C) general bus error */ uint32_t i2c_secondary_bus:1; /**< secondary I/O (I2C) bus error */ uint32_t memory:1; /**< internal service processor memory error */ uint32_t registers:1; /**< erro accessing special registers */ uint32_t communication:1; /**< unknown communication error */ uint32_t firmware:1; /**< service processor firmware error or incorrect version */ uint32_t hardware:1; /**< other internal service processor hardware error */ uint32_t vpd_eeprom:1; /**< error accessing VPD EEPROM */ uint32_t op_panel:1; /**< error accessing operator panel */ uint32_t power_controller:1; /**< error accessing power controller */ uint32_t fan_sensor:1; /**< error accessing fan controller */ uint32_t thermal_sensor:1; /**< error accessing thernal sensor */ uint32_t voltage_sensor:1; /**< error accessing voltage sensor */ uint32_t /* reserved */ :2; uint32_t serial_port:1; /**< error accessing serial port */ uint32_t nvram:1; /**< NVRAM error */ uint32_t rtc:1; /**< error accessing real-time clock */ uint32_t jtag:1; /**< error accessing scan controller */ uint32_t tod_battery:1; /**< voltage loss from TOD battery backup */ uint32_t /* reserved */ :1; uint32_t heartbeat:1; /**< heartbeat loss from surveillance processor */ uint32_t surveillance:1; /**< surveillance timeout */ uint32_t pcn_connection:1; /**< power control network general connection failure */ uint32_t pcn_node:1; /**< power control network node failure */ uint32_t /* reserved */ :2; uint32_t pcn_access:1; /**< error accessing power control network */ uint32_t /* reserved */ :3; uint32_t sensor_token:32; uint32_t sensor_index:32; uint32_t /* reserved */:32; uint32_t /* reserved */:32; uint32_t /* reserved */:32; }; /** * @struct rtas_ibm_diag_scn * @brief RTAS IBM diagnostic section */ struct rtas_ibm_diag_scn { struct scn_header shdr; uint32_t event_id:32; }; /** * @struct rtas_vend_errlog * @brief Vendor Specific Error Log section */ struct rtas_vend_errlog { struct scn_header shdr; char vendor_id[4]; uint32_t vendor_data_sz; char *vendor_data; }; #endif librtas-1.3.10/librtasevent_src/rtas_srcfru.c0000644000175100001440000003732412313120670020356 0ustar nfontusers/** * @file rtas_srcfru.c * @brief RTAS SRC/FRU sections routines * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /* rtas_src_codes contains data used by these routines */ #include "rtas_src_codes.c" /** * parse_fru_id_scn * @brief Parse a FRU Identity Substructure * * @param re rtas_event pointer * @returns pointer to parsed rtas_fru_id_scn, NULL on failure */ static struct rtas_fru_hdr * parse_fru_id_scn(struct rtas_event *re) { struct rtas_fru_id_scn *fru_id; fru_id = malloc(sizeof(*fru_id)); if (fru_id == NULL) { errno = ENOMEM; return NULL; } memset(fru_id, 0, sizeof(*fru_id)); rtas_copy(RE_FRU_HDR_OFFSET(fru_id), re, RE_FRU_HDR_SZ); if (fruid_has_part_no(fru_id)) { strcpy(fru_id->part_no, RE_EVENT_OFFSET(re)); re->offset += 8; } if (fruid_has_proc_id(fru_id)) { strcpy(fru_id->procedure_id, RE_EVENT_OFFSET(re)); re->offset += 8; } if (fruid_has_ccin(fru_id)) { rtas_copy(fru_id->ccin, re, 4); fru_id->ccin[4] = '\0'; } if (fruid_has_serial_no(fru_id)) { rtas_copy(fru_id->serial_no, re, 12); fru_id->serial_no[12] = '\0'; } return (struct rtas_fru_hdr *)fru_id; } /** * parse_fru_pe_scn * @brief parse a FRU Power Enclosure Identity Substructure * * @param re rtas_event pointer * @returns pointer to parsed rtas_fru_pe_scn, NULL on failure */ static struct rtas_fru_hdr * parse_fru_pe_scn(struct rtas_event *re) { struct rtas_fru_pe_scn *fru_pe; uint32_t scn_sz; char *data; fru_pe = malloc(sizeof(*fru_pe)); if (fru_pe == NULL) { errno = ENOMEM; return NULL; } memset(fru_pe, 0, sizeof(*fru_pe)); rtas_copy(RE_FRU_HDR_OFFSET(fru_pe), re, RE_FRU_HDR_SZ); scn_sz = fru_pe->fruhdr.length; data = (char *)fru_pe + sizeof(fru_pe->fruhdr); rtas_copy(data, re, scn_sz - RE_FRU_HDR_SZ); return (struct rtas_fru_hdr *)fru_pe; } /** * parse_fru_mr_scn * @brief parse a FRU Manufacturing Replaceable Unit Substructure * * @param re rtas_event pointer * @returns pointer to parsed rtas_fru_mr_scn, NULL on failure */ static struct rtas_fru_hdr * parse_fru_mr_scn(struct rtas_event *re) { struct rtas_fru_mr_scn *fru_mr; uint32_t scn_sz; char *data; fru_mr = malloc(sizeof(*fru_mr)); if (fru_mr == NULL) { errno = ENOMEM; return NULL; } memset(fru_mr, 0, sizeof(*fru_mr)); rtas_copy(RE_FRU_HDR_OFFSET(fru_mr), re, RE_FRU_HDR_SZ); scn_sz = fru_mr->fruhdr.length; data = (char *)fru_mr + sizeof(fru_mr->fruhdr); rtas_copy(data, re, scn_sz - RE_FRU_HDR_SZ); return (struct rtas_fru_hdr *)fru_mr; } /** * parse_v6_src_scn * @brief parse a version 6 rtas SRC section * * @param re rtas_event pointer * @param src_start pointer to beginning of SRC section * @return 0 on success, !0 on failure */ int parse_src_scn(struct rtas_event *re) { struct rtas_src_scn *src; struct rtas_fru_scn *fru, *last_fru; int total_len, srcsub_len; src = malloc(sizeof(*src)); if (src == NULL) { errno = ENOMEM; return 1; } memset(src, 0, sizeof(*src)); src->shdr.raw_offset = re->offset; rtas_copy(RE_SHDR_OFFSET(src), re, RE_SRC_SCN_SZ); add_re_scn(re, src, re_scn_id(&src->v6hdr)); if (! src_subscns_included(src)) return 0; rtas_copy(RE_SHDR_OFFSET(src) + RE_SRC_SCN_SZ + 4, re, RE_SRC_SUBSCN_SZ); srcsub_len = src->subscn_length * 4; /*get number of bytes */ total_len = RE_SRC_SUBSCN_SZ; last_fru = NULL; do { uint32_t fru_len, fru_end; struct rtas_fru_hdr *last_fruhdr = NULL; fru = malloc(sizeof(*fru)); if (fru == NULL) { cleanup_rtas_event(re); errno = ENOMEM; return 1; } memset(fru, 0, sizeof(*fru)); /* First the fixed part of the fru */ rtas_copy(fru, re, RE_FRU_SCN_SZ); /* Then the variable length location string */ rtas_copy(fru->loc_code, re, fru->loc_code_length); fru_len = RE_FRU_SCN_SZ + fru->loc_code_length; fru_end = re->offset + fru->length - fru_len; while (re->offset < fru_end) { struct rtas_fru_hdr *cur_fruhdr = NULL; char *id = re->buffer + re->offset; if (strncmp(id, "ID", 2) == 0) cur_fruhdr = parse_fru_id_scn(re); else if (strncmp(id, "PE", 2) == 0) cur_fruhdr = parse_fru_pe_scn(re); else if (strncmp(id, "MR", 2) == 0) cur_fruhdr = parse_fru_mr_scn(re); else { re->offset++; continue; } if (cur_fruhdr == NULL) { cleanup_rtas_event(re); return -1; } if (last_fruhdr == NULL) fru->subscns = cur_fruhdr; else last_fruhdr->next = cur_fruhdr; last_fruhdr = cur_fruhdr; } if (last_fru == NULL) src->fru_scns = fru; else last_fru->next = fru; last_fru = fru; total_len += fru->length; } while (total_len < srcsub_len); return 0; } /** * rtas_get_src_scn * @brief retrieve the RTAS src section for a RTAS event * * @param re rtas_event pointer * @return rtas_event_scn pointer for a SRC section */ struct rtas_src_scn * rtas_get_src_scn(struct rtas_event *re) { return (struct rtas_src_scn *)get_re_scn(re, RTAS_PSRC_SCN); } /** * print_fru_hdr * @brief print the contents of a FRU header * * @param fruhdr pointer to fru_hdr to print * @param verbosity verbose level * @returns the number of bytes printed */ static int print_fru_hdr(struct rtas_fru_hdr *fruhdr, int verbosity) { int len = 0; len += rtas_print("%-20s%c%c "PRNT_FMT_R, "ID:", fruhdr->id[0], fruhdr->id[1], "Flags:", fruhdr->flags); if (verbosity >= 2) len += rtas_print(PRNT_FMT_R, "Length:", fruhdr->length); return len; } /** * print_fru_priority * @brief decode the FRU prority level and print a description of it. * * @param priority * @returns the number of bytes printed */ static int print_fru_priority(char priority) { int len = 0; len = rtas_print("%-20s%c - ", "Priority:", priority); switch (priority) { case RTAS_FRU_PRIORITY_HIGH: len += rtas_print("High priority and mandatory call-out.\n"); break; case RTAS_FRU_PRIORITY_MEDIUM: len += rtas_print("Medium priority.\n"); break; case RTAS_FRU_PRIORITY_MEDIUM_A: len += rtas_print("Medium priority group A (1st group).\n"); break; case RTAS_FRU_PRIORITY_MEDIUM_B: len += rtas_print("Medium priority group B (2nd group).\n"); break; case RTAS_FRU_PRIORITY_MEDIUM_C: len += rtas_print("Medium priority group C (3rd group).\n"); break; case RTAS_FRU_PRIORITY_LOW: len += rtas_print("Low Priority.\n"); break; } return len; } /** * print_fru_id_scn * @bried print the contents of a FRU Identity substructure * * @param fruhdr pointer to the fru_hdr of the FRU ID section to print * @param verbosity verbose level * @returns the number of bytes printed */ static int print_fru_id_scn(struct rtas_fru_hdr *fruhdr, int verbosity) { struct rtas_fru_id_scn *fru_id = (struct rtas_fru_id_scn *)fruhdr; int len; uint32_t component; len = print_scn_title("FRU ID Section"); len += print_fru_hdr(fruhdr, verbosity); component = fru_id->fruhdr.flags & RTAS_FRUID_COMP_MASK; if (component) { len += rtas_print(PRNT_FMT" ", "Failing Component:", component); switch (component) { case RTAS_FRUID_COMP_HARDWARE: len += rtas_print("(\"normal\" hardware FRU)\n"); break; case RTAS_FRUID_COMP_CODE: len += rtas_print("(Code FRU)\n"); break; case RTAS_FRUID_COMP_CONFIG_ERROR: len += rtas_print("(Configuration error)\n"); break; case RTAS_FRUID_COMP_MAINT_REQUIRED: len += rtas_print("(Mainteneace procedure required)\n"); break; case RTAS_FRUID_COMP_EXTERNAL: len += rtas_print("(External FRU)\n"); break; case RTAS_FRUID_COMP_EXTERNAL_CODE: len += rtas_print("(External Code FRU)\n"); break; case RTAS_FRUID_COMP_TOOL: len += rtas_print("(Tool FRU)\n"); break; case RTAS_FRUID_COMP_SYMBOLIC: len += rtas_print("(Symbolic FRU)\n"); break; default: len += rtas_print("\n"); break; } } if (fruid_has_part_no(fru_id)) len += rtas_print("%-20s%s\n", "FRU Stocking Part:", fru_id->part_no); if (fruid_has_proc_id(fru_id)) len += rtas_print("%-20s%s\n", "Procedure ID:", fru_id->procedure_id); if (fruid_has_ccin(fru_id)) len += rtas_print("%-20s%s\n", "CCIN:", fru_id->ccin); if (fruid_has_serial_no(fru_id)) len += rtas_print("%-20s%s\n", "Serial Number:", fru_id->serial_no); len += rtas_print("\n"); return len; } /** * print_fru_pe_scn * @bried print the contents of a FRU Power Enclosure substructure * * @param fruhdr pointer to the fru_hdr of the FRU PE section to print * @param verbosity verbose level * @returns the number of bytes printed */ static int print_fru_pe_scn(struct rtas_fru_hdr *fruhdr, int verbosity) { struct rtas_fru_pe_scn *fru_pe = (struct rtas_fru_pe_scn *)fruhdr; int len; len = print_scn_title("FRU PE Section"); len += print_fru_hdr(fruhdr, verbosity); len += print_mtms(&fru_pe->pce_mtms); if (fru_pe->pce_name[0] != '\0') len += rtas_print("%-20s%s\n\n", "PCE Name:", fru_pe->pce_name); else len += rtas_print("\n\n"); return len; } /** * print_fru_mr_scn * @bried print the contents of a FRU Manufacturing Replaceable substructure * * @param fruhdr pointer to the fru_hdr of the FRU MR section to print * @param verbosity verbose level * @returns the number of bytes printed */ static int print_fru_mr_scn(struct rtas_fru_hdr *fruhdr, int verbosity) { struct rtas_fru_mr_scn *fru_mr = (struct rtas_fru_mr_scn *)fruhdr; int i, len; len = print_scn_title("FRU MR Section"); len += print_fru_hdr(fruhdr, verbosity); len += rtas_print("\nManufacturing Replaceable Unit Fields (%d):\n", frumr_num_callouts(fru_mr)); for (i = 0; i < frumr_num_callouts(fru_mr); i++) { struct fru_mru *mru = &fru_mr->mrus[i]; len += rtas_print("%-20s%c %-20s%08x\n", "MRU Priority:", mru->priority, "MRU ID:", mru->id); } len += rtas_print("\n"); return len; } /** * print_re_fru_scn * @brief print the contents of an FRU section * * @param res rtas_event_scn pointer for a fru section * @param verbosity verbose level of output * @param count current fru section number that we are printing * @return number of bytes written */ int print_re_fru_scn(struct rtas_fru_scn *fru, int verbosity, int count) { struct rtas_fru_hdr *fruhdr; int len = 0; len += print_scn_title("FRU Section (%d)", count); if (verbosity >= 2) { len += rtas_print(PRNT_FMT_2, "Length:", fru->length, "Call-Out Type:", fru->type); len += rtas_print("%-20s%-8s %-20s%-8s\n", "Fru ID Included:", (fru->fru_id_included) ? "Yes" : "No", "Fru Subscns:", (fru->fru_subscn_included) ? "Yes" : "No"); } len += print_fru_priority(fru->priority); if (fru->loc_code_length) { if (verbosity >= 2) len += rtas_print(PRNT_FMT_R, "Loc Code Length:", fru->loc_code_length); len += rtas_print("%-20s%s\n", "Location Code:", fru->loc_code); } len += rtas_print("\n"); for (fruhdr = fru->subscns; fruhdr != NULL; fruhdr = fruhdr->next) { if (strncmp(fruhdr->id, "ID", 2) == 0) len += print_fru_id_scn(fruhdr, verbosity); else if (strncmp(fruhdr->id, "PE", 2) == 0) len += print_fru_pe_scn(fruhdr, verbosity); else if (strncmp(fruhdr->id, "MR", 2) == 0) len += print_fru_mr_scn(fruhdr, verbosity); } return len; } /** * print_src_refcode * @brief print a detailed description of the SRC reference code * * @param src rtas_v6_src_scn pointer * @return number of bytes written */ int print_src_refcode(struct rtas_src_scn *src) { int i, len = 0; len += rtas_print("%s \"", "Primary Reference Code:"); for (i = 0; i < 32; i++) { if (src->primary_refcode[i] == '\0') break; len += rtas_print("%c", src->primary_refcode[i]); } len += rtas_print("\"\n"); i = 0; while (src_codes[i].desc != NULL) { if (strcmp(src->primary_refcode, src_codes[i].id) == 0) { len += rtas_print("%s\n", src_codes[i].desc); return len; } i++; } return len; } /** * print_re_src_scn * @brief print the contents of a SRC section * * @param res rtas_event_scn pointer for SRC section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_src_scn(struct scn_header *shdr, int verbosity) { struct rtas_src_scn *src; struct rtas_fru_scn *fru; int len = 0; int count = 1; if ((shdr->scn_id != RTAS_PSRC_SCN) && (shdr->scn_id != RTAS_SSRC_SCN)) { errno = EFAULT; return 0; } src = (struct rtas_src_scn *)shdr; if (strncmp(src->v6hdr.id, RTAS_PSRC_SCN_ID, 2) == 0) len += print_v6_hdr("Primary SRC Section", (struct rtas_v6_hdr *)&src->v6hdr, verbosity); else len += print_v6_hdr("Secondary SRC Section", (struct rtas_v6_hdr *)&src->v6hdr, verbosity); if (verbosity >= 2) { len += rtas_print(PRNT_FMT_2"\n", "SRC Version:", src->version, "Subsections:", src_subscns_included(src)); } len += rtas_print("Platform Data:\n"); len += print_raw_data((char*)src->src_platform_data, sizeof(src->src_platform_data)); len += rtas_print("\n"); len += rtas_print("Extended Reference Codes:\n"); len += rtas_print("2: %08x 3: %08x 4: %08x 5: %08x\n", src->ext_refcode2, src->ext_refcode3, src->ext_refcode4, src->ext_refcode5); len += rtas_print("6: %08x 7: %08x 8: %08x 9: %08x\n\n", src->ext_refcode6, src->ext_refcode7, src->ext_refcode8, src->ext_refcode9); len += print_src_refcode(src); if (src_subscns_included(src)) { if (verbosity >= 2) { len += rtas_print(PRNT_FMT_2, "Sub-Section ID:", src->subscn_id, "Platform Data:", src->subscn_platform_data); len += rtas_print(PRNT_FMT_R, "Length:", src->subscn_length); } } len += rtas_print("\n"); for (fru = src->fru_scns; fru != NULL; fru = fru->next) { len += print_re_fru_scn(fru, verbosity, count); count++; } return len; } librtas-1.3.10/librtasevent_src/librtasevent_v6.h0000644000175100001440000003235712313120670021144 0ustar nfontusers/** * @file librtasevent_v6.h * @brief Structure definitions for RTAS event version 6 sections * * Copyright (C) 2005 IBM Corporation. * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #ifndef _H_RE_V6_RTAS_EVENT #define _H_RE_V6_RTAS_EVENT #include #include /** * @struct rtas_v6_scn_hdr * @brief common header for RTAS version 6 sections * * Almost every version 6 section starts with the same data as defined * in this structure. This is provided to make further structure definitions * and manipulation. */ struct rtas_v6_hdr { char id[2]; /**< section id */ uint32_t length; /**< section length */ uint32_t version; /**< section version */ uint32_t subtype; /**< section sub-type id */ uint32_t creator_comp_id; /**< component id of section creator */ }; struct rtas_v6_hdr_raw { char id[2]; uint32_t length:16; uint32_t version:8; uint32_t subtype:8; uint32_t creator_comp_id:16; }__attribute__((__packed__)); #define RTAS_V6_HDR_SIZE 16 /* defines for the rtas_event_scn id */ #define RTAS_DUMP_SCN_ID "DH" #define RTAS_EPOW_SCN_ID "EP" #define RTAS_HMC_SCN_ID "HM" #define RTAS_IO_SCN_ID "IE" #define RTAS_IP_SCN_ID "LP" #define RTAS_LRI_SCN_ID "LR" #define RTAS_MI_SCN_ID "MI" #define RTAS_MTMS_SCN_ID "MT" #define RTAS_PSRC_SCN_ID "PS" #define RTAS_SSRC_SCN_ID "SS" #define RTAS_SW_SCN_ID "SW" #define RTAS_UDD_SCN_ID "UD" #define RTAS_HP_SCN_ID "HP" /** * @struct rtas_v6_main_ascn_ * @brief RTAS version 6 Main A Section */ struct rtas_priv_hdr_scn { struct scn_header shdr; struct rtas_v6_hdr v6hdr; struct rtas_date date; struct rtas_time time; char creator_id; /**< subsystem creator id */ #define RTAS_PH_CREAT_SERVICE_PROC 'E' #define RTAS_PH_CREAT_HYPERVISOR 'H' #define RTAS_PH_CREAT_POWER_CONTROL 'W' #define RTAS_PH_CREAT_PARTITION_FW 'L' uint32_t scn_count; /**< number of sections in log */ uint32_t creator_subid_hi; uint32_t creator_subid_lo; uint32_t plid; /**< platform log id */ uint32_t log_entry_id; /**< Unique log entry id */ char creator_subid_name[9]; }; struct rtas_priv_hdr_scn_raw { struct rtas_v6_hdr_raw v6hdr; struct rtas_date_raw date; struct rtas_time_raw time; uint32_t /* reserved */:32; uint32_t /* reserved */:32; char creator_id; uint32_t /* reserved */ :16; uint32_t scn_count:8; uint32_t /* reserved */ :32; uint32_t creator_subid_hi; uint32_t creator_subid_lo; uint32_t plid; uint32_t log_entry_id; char creator_subid_name[9]; }__attribute__((__packed__)); /** * @struct rtas_v6_main_b_scn * @brief RTAS version 6 Main B Section */ struct rtas_usr_hdr_scn { struct scn_header shdr; struct rtas_v6_hdr v6hdr; uint32_t subsystem_id; /**< subsystem id */ uint32_t event_data; uint32_t event_severity; uint32_t event_type; /**< error/event severity */ #define RTAS_UH_TYPE_NA 0x00 #define RTAS_UH_TYPE_INFO_ONLY 0x01 #define RTAS_UH_TYPE_DUMP_NOTIFICATION 0x08 #define RTAS_UH_TYPE_PREVIOUSLY_REPORTED 0x10 #define RTAS_UH_TYPE_DECONFIG_USER 0x20 #define RTAS_UH_TYPE_DECONFIG_SYSTEM 0x21 #define RTAS_UH_TYPE_DECONFIG_NOTICE 0x22 #define RTAS_UH_TYPE_RETURN_TO_NORMAL 0x30 #define RTAS_UH_TYPE_CONCURRENT_MAINT 0x40 #define RTAS_UH_TYPE_CAPACITY UPGRADE 0x60 #define RTAS_UH_TYPE_RESOURCE_SPARING 0x70 #define RTAS_UH_TYPE_DYNAMIC_RECONFIG 0x80 #define RTAS_UH_TYPE_NORMAL_SHUTDOWN 0xD0 #define RTAS_UH_TYPE_ABNORMAL_SHUTDOWN 0xE0 uint32_t action; /**< erro action code */ #define RTAS_UH_ACTION_SERVICE 0x8000 #define RTAS_UH_ACTION_HIDDEN 0x4000 #define RTAS_UH_ACTION_REPORT_EXTERNALLY 0x2000 #define RTAS_UH_ACTION_HMC_ONLY 0x1000 #define RTAS_UH_ACTION_CALL_HOME 0x0800 #define RTAS_UH_ACTION_ISO_INCOMPLETE 0x0400 }; struct rtas_usr_hdr_scn_raw { struct rtas_v6_hdr_raw v6hdr; uint32_t subsystem_id:8; uint32_t event_data:8; uint32_t event_severity:8; uint32_t event_type:8; uint32_t /* reserved */:32; uint32_t /* reserved */:16; uint32_t action:16; uint32_t /* reserved */ :32; }__attribute__((__packed__)); #define RE_USR_HDR_SCN_SZ 24 struct rtas_mtms { char model[9]; /**< machine type / model */ char serial_no[13]; /**< serial number */ }; /** * @struct rtas_v6_dump_hdr * @brief RTAS version 6 dump locator section */ struct rtas_dump_scn { struct scn_header shdr; struct rtas_v6_hdr v6hdr; /*These defines are for the v6hdr.subtype field in dump sections */ #define RTAS_DUMP_SUBTYPE_FSP 0x01 #define RTAS_DUMP_SUBTYPE_PLATFORM 0x02 #define RTAS_DUMP_SUBTYPE_SMA 0x03 #define RTAS_DUMP_SUBTYPE_POWER 0x04 #define RTAS_DUMP_SUBTYPE_LOG 0x05 #define RTAS_DUMP_SUBTYPE_PARTDUMP 0x06 #define RTAS_DUMP_SUBTYPE_PLATDUMP 0x07 uint32_t id; /**< dump id */ uint32_t location; /**< 0 => dump sent to HMC 1 => dump sent to partition */ uint32_t fname_type; /**< 0 => file name in ASCII 1 => file name in hex */ uint32_t size_valid; /**< dump size field valid */ uint32_t id_len; /**< OS assigned dump id length */ uint32_t size_hi; /**< dump size (hi-bits) */ uint32_t size_lo; /**< dump size (low bits) */ char os_id[40]; /**< OS assigned dump id */ }; struct rtas_dump_scn_raw { struct rtas_v6_hdr_raw v6hdr; uint32_t id; uint32_t data1:8; uint32_t /* reserved */ :16; uint32_t id_len:8; uint32_t size_hi; uint32_t size_lo; char os_id[40]; }__attribute__((__packed__)); #define RE_V6_DUMP_SCN_SZ 64 /** * @struct rtas_v6_lri_hdr * @brief RTAS v6 logical resource identification section */ struct rtas_lri_scn { struct scn_header shdr; struct rtas_v6_hdr v6hdr; uint32_t resource; /**< resource type */ #define RTAS_LRI_RES_PROC 0x10 #define RTAS_LRI_RES_SHARED_PROC 0x11 #define RTAS_LRI_RES_MEM_PAGE 0x40 #define RTAS_LRI_RES_MEM_LMB 0x41 uint32_t capacity; /**< entitled capacity */ union { uint32_t _lri_cpu_id; /**< logical CPU id (type = proc) */ uint32_t _lri_drc_index; /**< DRC index (type = mem LMB) */ uint32_t _lri_mem_addr_lo; /**< mem logical addr low bits (type = mem page) */ } _lri_u1; #define lri_cpu_id _lri_u1._lri_cpu_id #define lri_drc_index _lri_u1._lri_drc_index #define lri_mem_addr_lo _lri_u1._lri_mem_addr_lo uint32_t lri_mem_addr_hi; /**< mem logical addr high bits (type = mem page) */ }; struct rtas_lri_scn_raw { struct rtas_v6_hdr_raw v6hdr; uint32_t resource:8; uint32_t /* reserved */:8; uint32_t capacity:16; union { uint32_t _lri_cpu_id:32; uint32_t _lri_drc_index:32; uint32_t _lri_mem_addr_lo; } _lri_u1; uint32_t lri_mem_addr_hi; }__attribute__((__packed__)); #define RE_LRI_SCN_SZ 20 /** * @struct rtas_fru_hdr * @breif data that appears at the beginning of every FRU section */ struct rtas_fru_hdr { struct rtas_fru_hdr *next; char id[2]; uint32_t length:8; uint32_t flags:8; }; #define RE_FRU_HDR_SZ 4 #define RE_FRU_HDR_OFFSET(x) ((char *)(x) + sizeof(struct rtas_fru_hdr *)) /** * @struct rtas_fru_id_scn * @breif Contents of the FRU Identity Substructure */ struct rtas_fru_id_scn { struct rtas_fru_hdr fruhdr; #define RTAS_FRUID_COMP_MASK 0xF0 #define RTAS_FRUID_COMP_HARDWARE 0x10 #define RTAS_FRUID_COMP_CODE 0x20 #define RTAS_FRUID_COMP_CONFIG_ERROR 0x30 #define RTAS_FRUID_COMP_MAINT_REQUIRED 0x40 #define RTAS_FRUID_COMP_EXTERNAL 0x90 #define RTAS_FRUID_COMP_EXTERNAL_CODE 0xA0 #define RTAS_FRUID_COMP_TOOL 0xB0 #define RTAS_FRUID_COMP_SYMBOLIC 0xC0 #define RTAS_FRUID_HAS_PART_NO 0x08 #define RTAS_FRUID_HAS_CCIN 0x04 #define RTAS_FRUID_HAS_PROC_ID 0x02 #define RTAS_FRUID_HAS_SERIAL_NO 0x01 #define fruid_has_part_no(x) ((x)->fruhdr.flags & RTAS_FRUID_HAS_PART_NO) #define fruid_has_ccin(x) ((x)->fruhdr.flags & RTAS_FRUID_HAS_CCIN) #define fruid_has_proc_id(x) ((x)->fruhdr.flags & RTAS_FRUID_HAS_PROC_ID) #define fruid_has_serial_no(x) ((x)->fruhdr.flags & RTAS_FRUID_HAS_SERIAL_NO) char part_no[8]; char procedure_id[8]; char ccin[5]; char serial_no[13]; }; /** * @struct rtas_fru_pe_scn * @brief contents of the FRU Power Enclosure Substructure */ struct rtas_fru_pe_scn { struct rtas_fru_hdr fruhdr; struct rtas_mtms pce_mtms; char pce_name[32]; }; /** * @struct fru_mru * @brief FRU MR Description structs */ struct fru_mru { uint32_t /* reserved */:24; char priority; uint32_t id; }; /** * @struct rtas_fru_mr_scn * @brief contents of the FRU Manufacturing Replacement Unit Substructure */ struct rtas_fru_mr_scn { struct rtas_fru_hdr fruhdr; #define frumr_num_callouts(x) ((x)->fruhdr.flags & 0x0F) uint32_t /* reserved */:32; struct fru_mru mrus[15]; }; /** * @struct rtas_v6_fru_scn * @brief RTAS version 6 FRU callout section */ struct rtas_fru_scn { uint32_t length:8; /**< call-out length */ uint32_t type:4; /**< callout type */ uint32_t fru_id_included:1; /**< fru id subsection included */ uint32_t fru_subscn_included:3; char priority; /**< fru priority */ #define RTAS_FRU_PRIORITY_HIGH 'H' #define RTAS_FRU_PRIORITY_MEDIUM 'M' #define RTAS_FRU_PRIORITY_MEDIUM_A 'A' #define RTAS_FRU_PRIORITY_MEDIUM_B 'B' #define RTAS_FRU_PRIORITY_MEDIUM_C 'C' #define RTAS_FRU_PRIORITY_LOW 'L' uint32_t loc_code_length:8; /**< location field length */ char loc_code[80]; /**< location code */ struct rtas_fru_scn *next; struct rtas_fru_hdr *subscns; }; #define RE_FRU_SCN_SZ 4 /** * @struct rtas_v6_src_hdr * @brief RTAS version 6 SRC section */ struct rtas_src_scn { struct scn_header shdr; struct rtas_v6_hdr_raw v6hdr; uint32_t version:8; /**< SRC version */ char src_platform_data[7]; /**< platform specific data */ #define src_subscns_included(src) ((src)->src_platform_data[0] & 0x01) uint32_t ext_refcode2:32; /**< extended reference code word 2 */ uint32_t ext_refcode3:32; /**< extended reference code word 3 */ uint32_t ext_refcode4:32; /**< extended reference code word 4 */ uint32_t ext_refcode5:32; /**< extended reference code word 5 */ uint32_t ext_refcode6:32; /**< extended reference code word 6 */ uint32_t ext_refcode7:32; /**< extended reference code word 7 */ uint32_t ext_refcode8:32; /**< extended reference code word 8 */ uint32_t ext_refcode9:32; /**< extended reference code word 9 */ char primary_refcode[36];/**< primary reference code */ uint32_t subscn_id:8; /**< sub-section id (0xC0) */ uint32_t subscn_platform_data:8; /**< platform specific data */ uint32_t subscn_length:16; /**< sub-section length */ struct rtas_fru_scn *fru_scns; }; #define RE_SRC_SCN_SZ 80 #define RE_SRC_SUBSCN_SZ 4 /** * @struct rtas_v6_mt_scn * @brief RTAS version 6 Machine Type section */ struct rtas_mt_scn { struct scn_header shdr; struct rtas_v6_hdr_raw v6hdr; struct rtas_mtms mtms; }; /** * @struct rtas_v6_generic */ struct rtas_v6_generic { struct scn_header shdr; struct rtas_v6_hdr v6hdr; char *data; }; /** * @struct rtas_hotplug_scn * @brief RTAS version 6 Hotplug section */ struct rtas_hotplug_scn { struct scn_header shdr; struct rtas_v6_hdr v6hdr; uint32_t type:8; #define RTAS_HP_TYPE_CPU 1 #define RTAS_HP_TYPE_MEMORY 2 #define RTAS_HP_TYPE_SLOT 3 #define RTAS_HP_TYPE_PHB 4 #define RTAS_HP_TYPE_PCI 5 uint32_t action:8; #define RTAS_HP_ACTION_ADD 1 #define RTAS_HP_ACTION_REMOVE 2 uint32_t identifier:8; #define RTAS_HP_ID_DRC_NAME 1 #define RTAS_HP_ID_DRC_INDEX 2 #define RTAS_HP_ID_DRC_COUNT 3 uint32_t reserved:8; union { uint32_t drc_index:32; uint32_t count:32; char drc_name[1]; } u1; }; struct rtas_hotplug_scn_raw { struct rtas_v6_hdr_raw v6hdr; uint32_t type:8; uint32_t action:8; uint32_t identifier:8; uint32_t /* reserved */:8; union { uint32_t drc_index:32; uint32_t count:32; char drc_name[1]; } u1; }__attribute__((__packed__)); #define RE_HOTPLUG_SCN_SZ 16 #endif librtas-1.3.10/librtasevent_src/print_rtas_event.c0000644000175100001440000003657712313120670021420 0ustar nfontusers/** * @file print_rtas_event.c * @brief generic routines to handle printing RTAS event sections * * Copyriht (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #include #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * rtas_print_width * @brief character width of the librtasevent output * * The default output of librtasevent is 80 characters wide. This can * be adjusted via the rtas_set_print_width() call. */ static int rtas_print_width = 80; /** * line_offset * @brief current character offset into the print line */ static int line_offset = 0; /** * ostream * @brief output stream for librtasevent printing */ static FILE *ostream; /** * re_print_fns * @brief arrary of function pointers for printing RTAS event sections * * NOTE: the index of these print functions corresponds to the * definitions for the rtas event sections from librtasevent.h. Changes * need to be made in both places to avoid breaking librtasevent. */ static int (*re_print_fns[])() = { NULL, print_re_hdr_scn, print_re_exthdr_scn, print_re_epow_scn, print_re_io_scn, print_re_cpu_scn, print_re_ibm_diag_scn, print_re_mem_scn, print_re_post_scn, print_re_ibmsp_scn, print_re_vend_errlog_scn, print_re_priv_hdr_scn, print_re_usr_hdr_scn, print_re_dump_scn, print_re_lri_scn, print_re_mt_scn, print_re_src_scn, print_re_src_scn, print_re_generic_scn, print_re_hotplug_scn }; /** * rtas_severity_names * @brief description of the RTAS severity levels */ static char *rtas_severity_names[] = { "No Error", "Event", "Warning", "Error Sync", "Error", "Fatal", "Already Reported", "(7)" }; /** * rtas_disposition_names * @brief description of the RTAS event disposition levels */ static char *rtas_disposition_names[] = { "Fully Recovered", "Limited Recovery", "Not Recoverd", "(4)" }; /** * rtas_entity_names * @brief description of the initiator and target names */ char *rtas_entity_names[] = { /* for initiator & targets */ "Unknown", "CPU", "PCI", "ISA", "Memory", "Power Management", "Hot Plug", "(7)", "(8)", "(9)", "(10)", "(11)", "(12)", "(13)", "(14)", "(15)" }; /** * rtas_error_type * @brief description of some of the RTAS error types * * Not all of the event types are covered in this array, please * bounds check before using. */ static char *rtas_event_error_type[] = { "Unknown", "Retry", "TCE Error", "Internal Device Failure", "Timeout", "Data Parity", "Address Parity", "Cache Parity", "Address Invalid", "ECC Uncorrected", "ECC Corrupted", }; /** * print_scn_title * @brief print the title of the RTAS event section * * @param fmt string format for section title * @param ... additional args a la printf() * @return number of characters printed */ int print_scn_title(char *fmt, ...) { va_list ap; int rspace; char buf[1024]; int i, len, offset; memset(buf, 0, sizeof(buf)); offset = snprintf(buf, sizeof(buf), "==== "); va_start(ap, fmt); offset += vsnprintf(buf + offset, sizeof(buf) - offset, fmt, ap); va_end(ap); offset += snprintf(buf + offset, sizeof(buf) - offset, " "); rspace = (rtas_print_width - (strlen(buf) + 2 + 9)); for (i = 0; i < rspace; i++) offset += snprintf(buf + offset, sizeof(buf) - offset, "="); offset += snprintf(buf + offset, sizeof(buf) - offset, "\n"); len = rtas_print(buf); return len; } /** * print_raw_data * @brief dump raw data * * @param data pointer to data to dump * @param data_len length of data to dump * @return number of bytes written */ int print_raw_data(char *data, int data_len) { unsigned char *h, *a; unsigned char *end = (unsigned char *)data + data_len; unsigned int offset = 0; int i,j; int len = 0; /* make sure we're starting on a new line */ if (line_offset != 0) len += rtas_print("\n"); h = a = (unsigned char *)data; while (h < end) { /* print offset */ len += fprintf(ostream, "0x%04x: ", offset); offset += 16; /* print hex */ for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (h < end) len += fprintf(ostream, "%02x", *h++); else len += fprintf(ostream, " "); } len += fprintf(ostream, " "); } /* print ascii */ len += fprintf(ostream, " ["); for (i = 0; i < 16; i++) { if (a <= end) { if ((*a >= ' ') && (*a <= '~')) len += fprintf(ostream, "%c", *a); else len += fprintf(ostream, "."); a++; } else len += fprintf(ostream, " "); } len += fprintf(ostream, "]\n"); } return len; } /** * rtas_print_raw_event * @brief Dump the entire rtas event in raw format * * @param stream ouput stream to write to * @param re rtas_event pointer * @return number of bytes written */ int rtas_print_raw_event(FILE *stream, struct rtas_event *re) { int len = 0; ostream = stream; len += print_scn_title("Raw RTAS Event Begin"); len += print_raw_data(re->buffer, re->event_length); len += print_scn_title("Raw RTAS Event End"); return len; } /** * rtas_error_type * @brief print a description of the RTAS error type * * @param type RTAS event type * @return pointer to description of RTAS type * @return NULL on unrecognized event type */ static char * rtas_error_type(int type) { if (type < 11) return rtas_event_error_type[type]; switch (type) { case 64: return "EPOW"; case 160: return "Platform Resource Reassignment"; case 224: return "Platform Error"; case 225: return "I/O Event"; case 226: return "Platform Information Event"; case 227: return "Resource Deallocation Event"; case 228: return "Dump Notification Event"; case 229: return "Hotplug Event"; } return rtas_event_error_type[0]; } /** * rtas_set_print_width * @brief set the output character width for librtasevent * * @param width character width of output * @return 0 on success, !0 on failure */ int rtas_set_print_width(int width) { if ((width > 0) && (width < 1024)) { rtas_print_width = width; return 0; } return 1; } /** * rtas_print * @brief routine to handle all librtas printing * * @param fmt string format a la printf() * @param ... additional args a la printf() * @return number of bytes written */ int rtas_print(char *fmt, ...) { va_list ap; char buf[1024]; char tmpbuf[1024]; int i; int buf_offset = 0, offset = 0; int tmpbuf_len; int width = 0; int prnt_len; char *newline = NULL; char *brkpt = NULL; memset(tmpbuf, 0, sizeof(tmpbuf)); memset(buf, 0, sizeof(buf)); va_start(ap, fmt); tmpbuf_len = vsnprintf(tmpbuf, sizeof(tmpbuf), fmt, ap); va_end(ap); i = 0; while (i < tmpbuf_len) { brkpt = NULL; newline = NULL; for (i = offset, width = line_offset; (width < rtas_print_width) && (i < tmpbuf_len); i++) { switch(tmpbuf[i]) { case ' ': case '-': width++; brkpt = &tmpbuf[i]; break; case '\n': newline = &tmpbuf[i]; width++; break; default: width++; break; } if (newline != NULL) { prnt_len = newline - &tmpbuf[offset] + 1; snprintf(buf + buf_offset, prnt_len, &tmpbuf[offset]); buf_offset = strlen(buf); buf_offset += snprintf(buf + buf_offset, sizeof(buf) - buf_offset, "\n"); offset += prnt_len; line_offset = 0; break; } } if (width >= rtas_print_width) { if (brkpt == NULL) { /* this won't fit on one line, break it across lines */ prnt_len = width - line_offset + 1; } else { prnt_len = (brkpt - &tmpbuf[offset]) + 1; } /* print up to the last brkpt */ snprintf(buf + buf_offset, prnt_len, &tmpbuf[offset]); buf_offset = strlen(buf); buf_offset += snprintf(buf + buf_offset, sizeof(buf) - buf_offset, "\n"); offset += prnt_len; line_offset = 0; } } prnt_len = snprintf(buf + buf_offset, sizeof(buf) - buf_offset, &tmpbuf[offset]); line_offset += prnt_len; return fprintf(ostream, buf); } /** * rtas_print_scn * @brief print the contents of the specified rtas event section * * @param stream output stream to write to * @param res rtas_event_scn pointer to print * @param verbosity verbose level for output * @return number of bytes written */ int rtas_print_scn(FILE *stream, struct scn_header *shdr, int verbosity) { int len; if ((stream == NULL) || (shdr == NULL)) { errno = EFAULT; return 0; } ostream = stream; /* validate the section id */ if (shdr->scn_id < 0) { errno = EFAULT; return 0; } len = re_print_fns[shdr->scn_id](shdr, verbosity); fflush(stream); return len; } /** * rtas_print_event * @brief print the contents of an entire rtas event * * @param stream output stream to print to * @param re rtas_event pointer to print out * @param verbosity verbose level of output * @return number of bytes written */ int rtas_print_event(FILE *stream, struct rtas_event *re, int verbosity) { struct scn_header *shdr; int len = 0; if ((stream == NULL) || (re == NULL)) { errno = EFAULT; return 0; } ostream = stream; if (re->event_no != -1) len += print_scn_title("RTAS Event Dump (%d) Begin", re->event_no); else len += print_scn_title("RTAS Event Dump Begin"); for (shdr = re->event_scns; shdr != NULL; shdr = shdr->next) len += rtas_print_scn(stream, shdr, verbosity); if (re->event_no != -1) len += print_scn_title("RTAS Event Dump (%d) End", re->event_no); else len += print_scn_title("RTAS Event Dump End"); return len; } /** * rtas_get_event_hdr_scn * @brief Retrieve the Main RTAS event header * * @param re rtas_event pointer * @return pointer to rtas_event_scn for main rtas event header */ struct rtas_event_hdr * rtas_get_event_hdr_scn(struct rtas_event *re) { return (struct rtas_event_hdr *)get_re_scn(re, RTAS_EVENT_HDR); } /** * print_re_hdr_scn * @brief Print the contents of an RTAS main event header * * @param res rtas_event_scn pointer for main RTAS event header * @param verbosity verbose level for output * @return number of bytes written */ int print_re_hdr_scn(struct scn_header *shdr, int verbosity) { struct rtas_event_hdr *re_hdr; int len = 0; if (shdr->scn_id != RTAS_EVENT_HDR) { errno = EFAULT; return 0; } re_hdr = (struct rtas_event_hdr *)shdr; len += rtas_print(PRNT_FMT" ", "Version:", re_hdr->version); len += rtas_print(PRNT_FMT" (%s)\n", "Severity:", re_hdr->severity, rtas_severity_names[re_hdr->severity]); if (re_hdr->disposition || (verbosity >= 2)) { len += rtas_print(PRNT_FMT" (%s)\n", "Disposition:", re_hdr->disposition, rtas_disposition_names[re_hdr->disposition]); } if (verbosity >= 2) { len += rtas_print(PRNT_FMT" ", "Extended:", re_hdr->extended); len += rtas_print(PRNT_FMT"\n", "Log Length:", re_hdr->ext_log_length); } if (re_hdr->initiator || verbosity >=2) { len += rtas_print(PRNT_FMT" (%s)\n", "Initiator", re_hdr->initiator, rtas_entity_names[re_hdr->initiator]); } if (re_hdr->target || (verbosity >= 2)) { len += rtas_print(PRNT_FMT" (%s)\n", "Target", re_hdr->target, rtas_entity_names[re_hdr->target]); } len += rtas_print(PRNT_FMT" (%s)\n", "Type", re_hdr->type, rtas_error_type(re_hdr->type)); return len; } /** * rtas_get_event_exthdr_scn * @brief Retrieve the RTAS Event extended header * * @param re rtas_event pointer * @return rtas_event_scn pointer for RTAS extended header section */ struct rtas_event_exthdr * rtas_get_event_exthdr_scn(struct rtas_event *re) { return (struct rtas_event_exthdr *)get_re_scn(re, RTAS_EVENT_EXT_HDR); } /** * print_re_exthdr_scn * @brief print the contents of the RTAS extended header section * * @param res rtas_event_scn pointer for the extended header * @param verbosity verbose level of output * @return number of bytes written */ int print_re_exthdr_scn(struct scn_header *shdr, int verbosity) { struct rtas_event_exthdr *rex_hdr; int len = 0; int version; if (shdr->scn_id != RTAS_EVENT_EXT_HDR) { errno = EFAULT; return 0; } rex_hdr = (struct rtas_event_exthdr *)shdr; version = shdr->re->version; if (!rex_hdr->valid) { if (rex_hdr->bigendian && rex_hdr->power_pc) len += rtas_print("Extended log data is not valid.\n\n"); else len += rtas_print("Extended log data can not be decoded.\n\n"); return len; } /* Dump useful stuff in the rex_hdr */ len += rtas_print("%-19s%s%s%s%s%s\n", "Status:", rex_hdr->unrecoverable ? " unrecoverable" : "", rex_hdr->recoverable ? " recoverable" : "", rex_hdr->unrecoverable_bypassed ? " bypassed" : "", rex_hdr->predictive ? " predictive" : "", rex_hdr->newlog ? " new" : ""); if (version < 6) { if (version >= 3) { if (rex_hdr->non_hardware) len += rtas_print("Error may be caused by defects in " "software or firmware.\n"); if (rex_hdr->hot_plug) len += rtas_print("Error is isolated to hot-pluggable unit.\n"); if (rex_hdr->group_failure) len += rtas_print("Error is isolated to a group of failing " "units.\n"); } if (rex_hdr->residual) len += rtas_print("Residual error from previous boot.\n"); if (rex_hdr->boot) len += rtas_print("Error detected during IPL process.\n"); if (rex_hdr->config_change) len += rtas_print("Configuration changed since last boot.\n"); if (rex_hdr->post) len += rtas_print("Error detected prior to IPL.\n"); len += rtas_print("%-20s%x/%x/%x %-20s%x:%x:%x:%x\n\n", "Date:", rex_hdr->date.year, rex_hdr->date.month, rex_hdr->date.day, "Time:", rex_hdr->time.hour, rex_hdr->time.minutes, rex_hdr->time.seconds, rex_hdr->time.hundredths); } else { rtas_print("\n"); } return len; } librtas-1.3.10/librtasevent_src/rtas_mem.c0000644000175100001440000000672712313120670017633 0ustar nfontusers/** * @file rtas_mem.c * @brief RTAS Memory Controller detected routines * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot * @author Jake Moilanen */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_mem_scn * */ int parse_mem_scn(struct rtas_event *re) { struct rtas_mem_scn *mem; mem = malloc(sizeof(*mem)); if (mem == NULL) { errno = ENOMEM; return -1; } mem->shdr.raw_offset = re->offset; rtas_copy(RE_SHDR_OFFSET(mem), re, RE_V4_SCN_SZ); add_re_scn(re, mem, RTAS_MEM_SCN); return 0; } /** * rtas_get_mem_scn * @brief Retrieve the Memory Detected failure section of the RTAS Event * * @param re rtas_event pointer * @return rtas_event_scn pointer for memory section */ struct rtas_mem_scn * rtas_get_mem_scn(struct rtas_event *re) { return (struct rtas_mem_scn *)get_re_scn(re, RTAS_MEM_SCN); } /** * print_re_mem_scn * @brief print the contents of a RTAS memory controller detected error section * * @param res rtas_event_scn pointer for memory section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_mem_scn(struct scn_header *shdr, int verbosity) { struct rtas_mem_scn *mem = (struct rtas_mem_scn *)shdr; int len = 0; if (shdr->scn_id != RTAS_MEM_SCN) { errno = EFAULT; return 0; } len += print_scn_title("Memory Section"); if (mem->uncorrectable) len += rtas_print("Uncorrectable Memory error.\n"); if (mem->ECC) len += rtas_print("ECC Correctable error.\n"); if (mem->threshold_exceeded) len += rtas_print("Correctable threshold exceeded.\n"); if (mem->control_internal) len += rtas_print("Memory Controller internal error.\n"); if (mem->bad_address) len += rtas_print("Memory Address error.\n"); if (mem->bad_data) len += rtas_print("Memory Data error.\n"); if (mem->bus) len += rtas_print("Memory bus/switch internal error.\n"); if (mem->timeout) len += rtas_print("Memory timeout.\n"); if (mem->sysbus_parity) len += rtas_print("System bus parity.\n"); if (mem->sysbus_timeout) len += rtas_print("System bus timeout.\n"); if (mem->sysbus_protocol) len += rtas_print("System bus protocol/transfer.\n"); if (mem->hostbridge_timeout) len += rtas_print("I/O Host Bridge timeout.\n"); if (mem->hostbridge_parity) len += rtas_print("I/O Host Bridge parity.\n"); if (shdr->re->version >= 3) { if (mem->support) len += rtas_print("System support function error.\n"); if (mem->sysbus_internal) len += rtas_print("System bus internal hardware/switch error.\n"); } len += rtas_print("Memory Controller that detected failure: %x.\n", mem->controller_detected); len += rtas_print("Memory Controller that faulted: %x.\n", mem->controller_faulted); len += rtas_print(PRNT_FMT_ADDR, "Failing address:", mem->failing_address_hi, mem->failing_address_lo); len += rtas_print(PRNT_FMT_2, "ECC syndrome bits:", mem->ecc_syndrome, "Memory Card:", mem->memory_card); len += rtas_print(PRNT_FMT_2, "Failing element:", mem->element, "Sub element bits:", mem->sub_elements); len += rtas_print("\n"); return len; } librtas-1.3.10/librtasevent_src/rtas_post.c0000644000175100001440000000660612313120670020036 0ustar nfontusers/** * @file rtas_post.c * @brief RTAS Power-On Self Test (POST) section routines * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot * @author Jake Moilanen */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_post_scn * */ int parse_post_scn(struct rtas_event *re) { struct rtas_post_scn *post; post = malloc(sizeof(*post)); if (post == NULL) { errno = ENOMEM; return -1; } post->shdr.raw_offset = re->offset; /* This memcpy will get us up through the devname... */ rtas_copy(RE_SHDR_OFFSET(post), re, 14); post->devname[12] = '\0'; /* Copy in the error code... */ rtas_copy(post->err_code, re, 4); post->err_code[4] = '\0'; /* Next the firmware revision level... */ rtas_copy(post->firmware_rev, re, 2); post->firmware_rev[2] = '\0'; /* and lastly, the location code */ rtas_copy(post->loc_code, re, 8); post->loc_code[8] = '\0'; add_re_scn(re, post, RTAS_CPU_SCN); return 0; } /** * rtas_get_post_ecn * @brief Retrieve the Power-On Self Test (POST) section of the RTAS Event * * @param re rtas_event pointer * @return rtas_event_scn pointer for post section */ struct rtas_post_scn * rtas_get_post_scn(struct rtas_event *re) { return (struct rtas_post_scn *)get_re_scn(re, RTAS_POST_SCN); } /** * print_re_post_scn * @brief print the contents of a POST section * * @param res rtas_event_scn pointer for post section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_post_scn(struct scn_header *shdr, int verbosity) { struct rtas_post_scn *post = (struct rtas_post_scn *)shdr; int len = 0; if (shdr->scn_id != RTAS_POST_SCN) { errno = EFAULT; return 0; } len += print_scn_title("Power-On Self Test Section"); if (post->devname[0]) len += rtas_print("%-20s%s\n", "Failing Device:", post->devname); if (post->firmware) len += rtas_print("Firmware Error.\n"); if (post->config) len += rtas_print("Configuration Error.\n"); if (post->cpu) len += rtas_print("CPU POST Error.\n"); if (post->memory) len += rtas_print("Memory POST Error.\n"); if (post->io) len += rtas_print("I/O Subsystem POST Error.\n"); if (post->keyboard) len += rtas_print("Keyboard POST Error.\n"); if (post->mouse) len += rtas_print("Mouse POST Error.\n"); if (post->display) len += rtas_print("Display POST Error.\n"); if (post->ipl_floppy) len += rtas_print("Floppy IPL Error.\n"); if (post->ipl_controller) len += rtas_print("Drive Controller Error during IPL.\n"); if (post->ipl_cdrom) len += rtas_print("CDROM IPL Error.\n"); if (post->ipl_disk) len += rtas_print("Disk IPL Error.\n"); if (post->ipl_net) len += rtas_print("Network IPL Error.\n"); if (post->ipl_other) len += rtas_print("Other (tape,flash) IPL Error.\n"); if (post->firmware_selftest) len += rtas_print("Self-test error in firmware extended " "diagnostics.\n"); len += rtas_print("POST Error Code: %x\n", post->err_code); len += rtas_print("Firmware Revision Code: %x\n", post->firmware_rev); len += rtas_print("\n"); return len; } librtas-1.3.10/librtasevent_src/rtas_dump.c0000644000175100001440000000711012313120670020005 0ustar nfontusers/** * @file rtas_dump.c * @brief RTAS version 6 Dump Locator section routines * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_rtas_dump_scn * */ int parse_dump_scn(struct rtas_event *re) { struct rtas_dump_scn *dump; struct rtas_dump_scn_raw *rawhdr; dump = malloc(sizeof(*dump)); if (dump == NULL) { errno = ENOMEM; return -1; } dump->shdr.raw_offset = re->offset; rawhdr = (struct rtas_dump_scn_raw *)(re->buffer + re->offset); parse_v6_hdr(&dump->v6hdr, &rawhdr->v6hdr); dump->id = be32toh(rawhdr->id); dump->location = (rawhdr->data1 & 0x80) >> 7; dump->fname_type = (rawhdr->data1 & 0x40) >> 6; dump->size_valid = (rawhdr->data1 & 0x20) >> 5; dump->id_len = rawhdr->id_len; dump->size_hi = be32toh(rawhdr->size_hi); dump->size_lo = be32toh(rawhdr->size_lo); memcpy(dump->os_id, rawhdr->os_id, 40); re->offset += RE_V6_DUMP_SCN_SZ; add_re_scn(re, dump, RTAS_DUMP_SCN); return 0; } /** * rtas_get_dump_scn * @brief Retrieve the Dump Locator section of the RTAS Event * * @param re rtas_event pointer * @return rtas_event_scn pointer to dump locator section */ struct rtas_dump_scn * rtas_get_dump_scn(struct rtas_event *re) { return (struct rtas_dump_scn *)get_re_scn(re, RTAS_DUMP_SCN); } /** * update_os_dump_id * */ int update_os_id_scn(struct rtas_event *re, const char *id) { struct rtas_dump_scn *dump_scn; struct rtas_dump_scn *raw_scn; int len; dump_scn = rtas_get_dump_scn(re); if (dump_scn == NULL) return -1; len = strlen(id); if (len > 40) return -1; /* Now we know it exist, get a pointer to the dump section * in the raw event. */ raw_scn = (struct rtas_dump_scn *)(re->buffer + dump_scn->shdr.raw_offset - RE_SHDR_SZ); memcpy(raw_scn->os_id, id, len); if ((len % 4) > 0) len += (4 - (len % 4)); raw_scn->id_len = len; return 0; } /** * print_v6_dump_scn * @brief Print the contents of a version 6 dump locator section * * @param res rtas_event_scn pointer for dump locator section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_dump_scn(struct scn_header *shdr, int verbosity) { struct rtas_dump_scn *dump; int len = 0; if (shdr->scn_id != RTAS_DUMP_SCN) { errno = EFAULT; return 0; } dump = (struct rtas_dump_scn *)shdr; len += print_v6_hdr("Dump Locator section", &dump->v6hdr, verbosity); len += rtas_print(PRNT_FMT_L, "Dump ID:", dump->id); len += rtas_print("%-20s%8s\n", "Dump Field Format:", (dump->fname_type ? "hex" : "ascii")); len += rtas_print("%-20s%s\n", "Dump Location:", (dump->location ? "HMC" : "Partition")); len += rtas_print(PRNT_FMT_ADDR, "Dump Size:", dump->size_hi, dump->size_lo); if (verbosity >= 2) { len += rtas_print("%-20s%8s ", "Dump Size Valid:", (dump->size_valid ? "Yes" : "No")); len += rtas_print(PRNT_FMT_R, "Dump ID Length:", dump->id_len); if (dump->id_len) { len += rtas_print("Dump ID:"); if (dump->fname_type) len += print_raw_data(dump->os_id, dump->id_len); else len += rtas_print("%s\n", dump->os_id); } } len += rtas_print("\n"); return len; } librtas-1.3.10/librtasevent_src/rtas_cpu.c0000644000175100001440000000535012313120670017633 0ustar nfontusers/** * @file rtas_cpu.c * @brief RTAS error log detail for CPU-detected failures * * This provides the definition of RTAS CPU-detected error log * format and a print routine to dump the contents of a * cpu-detected error log. * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_cpu_scn * */ int parse_cpu_scn(struct rtas_event *re) { struct rtas_cpu_scn *cpu_scn; cpu_scn = malloc(sizeof(*cpu_scn)); if (cpu_scn == NULL) { errno = ENOMEM; return -1; } cpu_scn->shdr.raw_offset = re->offset; rtas_copy(RE_SHDR_OFFSET(cpu_scn), re, RE_V4_SCN_SZ); add_re_scn(re, cpu_scn, RTAS_CPU_SCN); return 0; } /** * rtas_get_cpu_scn * @brief Retrieve the CPU section of the RTAS Event * * @param re rtas_event pointer * @return rtas_event_scn pointer for cpu section */ struct rtas_cpu_scn * rtas_get_cpu_scn(struct rtas_event *re) { return (struct rtas_cpu_scn *)get_re_scn(re, RTAS_CPU_SCN); } /** * print_cpu_failure * @brief Print the contents of a cpu section * * @param res rtas_event_scn pointer to cpu section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_cpu_scn(struct scn_header *shdr, int verbosity) { struct rtas_cpu_scn *cpu; int len = 0; if (shdr->scn_id != RTAS_CPU_SCN) { errno = EFAULT; return 0; } cpu = (struct rtas_cpu_scn *)shdr; len += print_scn_title("CPU Section"); if (cpu->internal) len += rtas_print("Internal error (not cache).\n"); if (cpu->intcache) len += rtas_print("Internal cache.\n"); if (cpu->extcache_parity) len += rtas_print("External cache parity (or multi-bit).\n"); if (cpu->extcache_ecc) len += rtas_print("External cache ECC.\n"); if (cpu->sysbus_timeout) len += rtas_print("System bus timeout.\n"); if (cpu->io_timeout) len += rtas_print("I/O timeout.\n"); if (cpu->sysbus_parity) len += rtas_print("System bus parity.\n"); if (cpu->sysbus_protocol) len += rtas_print("System bus protocol/transfer.\n"); len += rtas_print(PRNT_FMT_2, "CPU id:", cpu->id, "Failing Element:", cpu->element); len += rtas_print(PRNT_FMT_ADDR, "Failing address:", cpu->failing_address_hi, cpu->failing_address_lo); if ((shdr->re->version >= 4) && (cpu->try_reboot)) len += rtas_print("A reboot of the system may correct the problem.\n"); len += rtas_print("\n"); return len; } librtas-1.3.10/librtasevent_src/librtasevent.so.1.3.90000755000175100001440000053222412313120670021373 0ustar nfontusersELFx@@8@'$``((($`)PPPXXX$$dtR(((GNU34i=q$afe F>&O<]9P%K.C;V_ [1UG2bNc,3/R@ ="B(XL-a05AE:6I Q?d\MH)+J`W^D T7 ZS4!'*$Y8#C !q&1P!(q AT D@$ D&Np U ƁA'!#$%&'()*+-.023479:<?@ACDFHIJKLMPQRSUW[^_acde"γׯ&>^EZ w @VXZ it1i%=y9r{%ރ|]3BcdTaIIK =odRxՉ\/1ƼF6{:5(h+1d)z~-G  C&P"=`bC$)'Oa(kئG@EVZkʒee3 WY]r]ۢFECZA" j0*$9Xsu|㻩n(Lߞ=P1s/{" W=aXXqټ& {(c + m"w}In=PPudhpP~@xP%\PhPlPh83PTXP]D Pct?xKR`(pPc LTP@pP'PPmpX<|6x"Ps (PX0NHp 0(,hP`Pht@3@<tR`LP@HP M! __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesrtas_copymemcpycleanup_rtas_eventfreeadd_re_scnre_scn_idstrncmpget_re_scn__errno_locationparse_rtas_timeparse_rtas_dateparse_v6_rtas_eventparse_priv_hdr_scnparse_usr_hdr_scnparse_epow_scnparse_io_scnparse_dump_scnparse_lri_scnparse_mt_scnparse_src_scnparse_hotplug_scnparse_generic_v6_scnparse_rtas_eventmallocmemsetparse_cpu_scnparse_ibm_diag_scnparse_mem_scnparse_post_scnparse_sp_scnparse_vend_errlog_scnprint_re_hdr_scnprint_re_exthdr_scnprint_re_epow_scnprint_re_io_scnprint_re_cpu_scnprint_re_ibm_diag_scnprint_re_mem_scnprint_re_post_scnprint_re_ibmsp_scnprint_re_vend_errlog_scnprint_re_priv_hdr_scnprint_re_usr_hdr_scnprint_re_dump_scnprint_re_lri_scnprint_re_mt_scnprint_re_src_scnprint_re_generic_scnprint_re_hotplug_scnrtas_entity_namesprint_scn_titlevsnprintfstrlenrtas_printprint_raw_datafprintfrtas_print_raw_eventrtas_set_print_widthrtas_print_scnfflushrtas_print_eventrtas_get_event_hdr_scnrtas_get_event_exthdr_scnrtas_get_cpu_scnparse_v6_hdrrtas_get_dump_scnupdate_os_id_scnprint_v6_hdrrtas_get_epow_scnrtas_get_io_scnrtas_get_lri_scnrtas_get_mem_scnrtas_get_post_scnrtas_get_ibm_sp_scnstrcmpstrcpyrtas_get_src_scnprint_mtmsprint_re_fru_scnprint_src_refcodertas_get_priv_hdr_scnrtas_get_usr_hdr_scnprint_usr_hdr_subsystem_idprint_usr_hdr_event_dataprint_usr_hdr_actionparse_mtmsrtas_get_mt_scnrtas_get_ibm_diag_scnrtas_get_vend_errlog_scnrtas_get_hotplug_scnlibc.so.6_edata__bss_start_endlibrtasevent.so.1GLIBC_2.4GLIBC_2.3 ii. ii834444(40484P4X4h4444 4(40484@4H4PP4X4`4h5p5x555 45(505@5X5`5p5555RHRXRpRRRR S(S(0S88SX@ShHSxPSXS`RXhSpRxSRSSSS8SShTSTT(THTXTpTTTTTU  U0(Up0U8U@UHVPV XV``VphVpVxWWW0W@WhWxWWWWWWX X0X`XpXXXYY@ YP(Y0Y8Y@YHZ PZ0XZ``ZphZpZxZZZZ[H[X[[\\\h\x\\]8]H]]]]^H ^X(^p0^8^@^H^P^X_(`_8h_pp_x__```@`P````aa(aXahaaabb@bPb b(b0b8c@@cPHcPcXc`dhd@pdPxdddde(e8eeeef0f@fxfffgg g`gpg g(h0h 8h`@hpHhPhXi`i(hiHpiXxiijjjPj`jjjkkPk`kkkllPl`lll m(m00m@8mh@mxHmPmXm`nhn@pnPxnnnnnoo8oHoooopp pXphppppq q (qP0q`8q@qHqPqXr`r xwwwwwwwwwwwwwwwwwxx@H P(X0`8h@@HpPxX@`hpx{ #3#@##d### (#8|@#PX#hp# #p#d#H## ##(D0#@H#X``#px###X##(##H #08#HP#`h#xD##|###8# # (#8D@#PX#hϰp#Є##0#Լ#Ռ##P#(ܤ0#@H#X`#px##`#x#p#h#x# #08#H|P#`|h#x#,####X## x(#8@#P X#h 0p##h##x#X## #( 0#@!4H#X"0`#p"x###%|#&#'#(#) #* #0*8#H,|P#`.h#x.l#10#8@H033333 3(30383@HP5X5`h5p5x55566666 686P6X6x66666 7(7 07887X@7pH7PX7`7hp7x7777888888`8p8x88888899@9p 9(9098:@:0H:8P:@X:P`:ph:p:x:::;;(;@;H;`;p;;;;;<<<< <8<@>H>x>>??8?p?x ?(0?8?@@H@XP@X@`@h@pAxA(APAxAABB8B`BBCC0C`CCD(DDDDD D(D0E8E0@LHEHPEXXEh`ExhEpExEEͨEFFF0FXFpFFFFFFGGG(G@G`Gx G(G0G8G@GHGPHXH0`HXhHppHxHHHHII8IXIxIIJJJ(J@JXJhJJJJJ J(J0K8K(@K@HK`PKxXK`KhKpKxLLL0LPLLLLLLM8MxMMMNNPNNNO  OX(O0O8O@P(HPXPPXP`QhQ8pQpxQQRR R0R@r`rhrprxrrrrrrHrss sH sp(s0s8s@sHsPtXt`t(htPpt`xtxttttttttuuu u(u8uhuuuuuu u(u0v8v @v0HvHPvXXv``vxhvpxvvvvvvvwww8w`wwxx0x@xPxhxxxx x(x0x8x@xHxPxXx` hypy(xy@yHyXypyxyyyyyyzzz z0zXzzzzz {({ 0{88{H@{`H{pP{X{`{h{p|x|H|||}}8}X}x}}~\~~@~`~~~Hp (0P8@HPX(`8hHpXxh 0HXhx( (08@@HXPX`h p0xHXa& [&(&&0Q&8X&@b&H/&PV&XA&`H&h &p*&x&O&K&$&$&c&C&&&&2&^W0H'`x_M0 e I8`PEh)- (:T(@@ XNp4 %LJ3 ]0H`Bx"8U9> 8GPh;A(bp}ibBxN |!/A KA(H`H`8!p|N A(b}ibBN A(bH}ibXBPN A(b}ibBN A(bx}ibBN A(b}ib(B N A(b}ibBN A(bP}ib`BXN A(bh}ibxBpN A(b}ibBN A(bx}ibBN A(bH}ibXBPN A(b@}ibPBHN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ib BN A(b}ibBN A(b(}ib8B0N A(bp}ibBxN A(b}ibBN A(b}ibBN A(bX}ibhB`N A(b}ibBN A(bX}ibhB`N A(b}ibBN A(b(}ib8B0N A(b`}ibpBhN A(b0}ib@B8N A(b}ibBN A(b}ibBN A(b}ibBN A(b0}ib@B8N A(b}ibBN A(b}ibBN A(b8}ibHB@N A(b@}ibPBHN A(b}ibBN A(b}ibBN A(b}ibBN A(b }ib0B(N A(b`}ibpBhN A(b}ibBN A(b}ib(B N A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ib BN A(b}ibBN |€!q/@/A" iKEA("0뢀(~}=HP})t;@@H```8 x$}=* A(| iIN!A(~@A88!|N `|b8!/A,"@/A A(| iIN!A(8!p|N |!|? x|+x?i? x }+x }$Kx|xKuA(? x |Jx ? 8?|N |!!|? x/@8H? Hh`? ? |/A /@T/ AH /AH? /A? |xKA(H? pHl`? X? `H(`? xKYA(x/@`K5A(/@`H8p?p 0/A ?p 0|xKA(H`KA(/@`KA(8`|x8?|N !|? x|+x8?88 ?8 ?8 ? /@?8 HD? 0H`?0 0?0 /@`?08 8?PN |!q|? x|x肀P8KA(|`x/@8 pH`|x肀X8KA(|`x/@8pH0|x肀`8KyA(|`x/@8pH|x肀h8KIA(|`x/@8pH|x肀p8KA(|`x/@8pH|x肀x8KA(|`x/@8pHp|x肀8KA(|`x/@8pH@|x肀8KA(|`x/@8pH8p`p|x8?|N !|? x|#xH8`? | H@0H,? /@`80`0|x8?PN |!q|? x|#x/@$KA(|ix8 8pH,?)|}#Kx|xK|`xp`p|x8?|N |!q|? x? | x? x | p?p x ?Ȑ ?p x T~x ?Ȑ ?p x x T|p|x ?Ȑ ?p x x Tz|p|x ?Ȑ $?p x T>x ?Ȑ (?p x x ?Ȑ ,?p x ?Ȑ 0?p x ?Ȑ 4? x 8 x ? 8KA(8?|N |!q|? x? | x? x | p?p x Tx ?Ȑ ?p x x Tr|6p|x ?Ȑ ?p x x T|.p|x ?Ȑ ?p x x T|&p|x ?Ȑ $?p x x T8|p|x ?Ȑ (?p x x Tz|p|x ?Ȑ ,?p x x T|p|x ?Ȑ 0?p x Tx ?Ȑ 4?p x x ?Ȑ 8?p x Tx ?Ȑ $x/A$bK%A(|`x| xp|Jp?x x | x?x x b肂}e[xƒ|xKA(|`x| xp|Jp?x x ?x x b肃}e[x|xK˕A(|`x| xp|Jp?) |/@8?x T/A$bKIA(|`x| xp|Jpb K)A(|`x| xp|Jpp|`|x8?|N |!a|? x8`pKaA(|`xxx/@$K%A(|ix8 8Hp?Ѐ x ?x ? | x?Ѐ x | p?x8 ?p|x}$KxKeA(?p x ?x ,?p x Tx ?x 0?p x x Tr|6p|x ?x 4?p x x T|.p|x ?x 8?p x ?x x T>x ?x y`  ?p x T>x T>T>x  ?x y` ?p x ?x H?x9iL?p8 }c[x|x8KA(?Ѐ x 8 x ?А x8KAA(8`|x8?|N |!|? x8KUA(|`x|x8?|N |!q|? x|#xx?) t8pbKA(|`x| xp|Jp?x x x b肃|xKIA(|`x| xp|Jpt/@?x T/AbK A(|`x| xp|Jp?x x ?x $x b肃}e[x„|xKA(|`x| xp|Jp?x x x | x?x ,x b肄}e[x„|xKqA(|`x| xp|Jp?x TB/A$bK=A(|`x| xp|Jp?x T/A$b K A(|`x| xp|Jp?x T/A$b(KA(|`x| xp|Jp?x T/A$b0KA(|`x| xp|Jp?x TJ/A$b8KmA(|`x| xp|Jp?x T/A$b@K9A(|`x| xp|Jp?x TR/A$bHKA(|`x| xp|Jp?x T/A$bPKA(|`x| xp|Jp?x T/A$bXKA(|`x| xp|Jpt/@8?x T/A$b`K]A(|`x| xp|JpbhK=A(|`x| xp|Jpp||x8?|N |!a|? x|#xx8p?x9)4|b}$Kx|xKA(|`x| xp|Jp?x x x | x?x x"T>x b肄}e[x„p|xKQA(|`x| xp|Jp?x Hx b肄x|xKA(|`x| xp|Jp?x Hx +Ax d}) "||J| N 8\bKA(|`x| xp|JpHbKA(|`x| xp|JpHtbK]A(|`x| xp|JpHPbK9A(|`x| xp|JpH,bKA(|`x| xp|JpH`bKA(|`x| xp|Jp?x8 L|x8K)A(|`x| xp|JpbhKA(|`x| xp|Jpp||x8?|N |!q|? x|#x? |/A$KA(|ix8 8pH\?) |/@$||xK|`xpH$||xK|`xp`p|x8?|N |!a|? x8`8KA(|`xxx/@$KA(|ix8 8Hlx888KA(?Ѐ x ?x ?Ѐ |/A$?x8 |x8KUA(H? | x?Ѐ x | p?x8 8?p|x}$KxKA(?p x ?x L?p x ?x P?p x ?x T?p x ?x X?p x ?x \?x9i`?p8 }c[x|x8KA(?Ѐ x ?x $x/A$bKUA(|`x| xp|Jp?x xEx/A$bKA(|`x| xp|Jp?x xMxF/A$bKA(|`x| xp|Jp?) |/@T?x xUdx/A$bKA(|`x| xp|Jp?x x]$x/A$bK]A(|`x| xp|Jp?x xdx/A$b K%A(|`x| xp|Jp?x xlxF/A$b(KA(|`x| xp|Jp?x xtdx/A$b0KA(|`x| xp|Jp?x x|$x/A$b8K}A(|`x| xp|Jp?x x | x?x x Tx |x?x x x yk`?x x |x?x x| x8} 8x |x?x "x |x?x #x b@}DSx}Cx}f[xxx| xKA(|`x| xp|Jp?x %x | x?x &x Tx |x?x &x x yk`?x *x |x?x (x |x?x ,x |x?x -x bH}DSx}Cx}f[xxx| xK A(|`x| xp|JpbPKA(|`x| xp|Jpp||x8?|N |!Q|? x|#xx8t8p?x9)8|b}$Kx|xKA(|`x| xt|Jt?x Lx bX肅`|xKA(|`x| xt|Jt?x Lx /A`+A/A$H/A\/AHbhKA(|`x| xt|JtHbpK}A(|`x| xt|JtH?x Lx bx|xKIA(|`x| xt|JtHp?x Lx b|xKA(|`x| xt|Jt8pH4?x Lx b|xKA(|`x| xt|Jt?x Tx bX肅|xKA(|`x| xt|Jt?x Tx +:Ax d}) "||J| N 4X|bKUA(|`x| xt|JtHbK1A(|`x| xt|JtHbK A(|`x| xt|JtHbKA(|`x| xt|JtHlbKA(|`x| xt|JtHHbKA(|`x| xt|JtH$bK}A(|`x| xt|Jt?x Xx bX肅|xKIA(|`x| xt|Jt?x Xx +Ax d}) "||J| N <`bKA(|`x| xt|JtHbKA(|`x| xt|JtHbKA(|`x| xt|JtHlbKaA(|`x| xt|JtHHbK=A(|`x| xt|JtH$bKA(|`x| xt|Jt?x \x bX肆|xKA(|`x| xt|Jtp/A?x Px b肆 |xKA(|`x| xt|Jt?x Px /Ah?x9i`?x Px |}c[x|xKA(|`x| xt|JtH,bPK1A(|`x| xt|JtH`t||x8?|N |!q|? x|#x? |/A$K5A(|ix8 8pH\?) |/@$||xK|`xpH$||xK|`xp`p|x8?|N |!a|? x8`@KA(|`xxx/@$K]A(|ix8 8H?Ѐ x ?x ? | x?Ѐ x | p?x8 ?p|x}$KxKA(?p x ?x ,?p x ?x 0?p x ?x 4?p x ?x 8?Ѐ x 8 x ?А x8KA(8`|x8?|N |!|? x8KA(|`x|x8?|N |!a|? x|#x8p?Ѐ |/A$KA(|ix8 8H x?x9)|b(}$Kx|xK!A(|`x| xp|Jp?x ,x b0肆8|xKA(|`x| xp|Jp?x ,x /At+A/A$H/@A/AAH?x 4x b@肆H|xK%A(|`x| xp|JpH?x 0x bP肆X|xKA(|`x| xp|JpH?x 8x ?x 4x b`肆h}e[x|xKA(|`x| xp|JpH\?x 4x bp肆x|xKmA(|`x| xp|JpH$bKIA(|`x| xp|JpbK)A(|`x| xp|Jpp|`|x8?|N |!a|? x8`8KaA(|`xpp/@$K%A(|ix8 8HT?Ѐ x ?p ?p8 |x8KA(p8K1A(8`|x8?|N |!|? x8KEA(|`x|x8?|N |!a|? x|#xx8p?Ѐ |/A$KA(|ix8 8HbKA(|`x| xp|Jp?x x/A$bKA(|`x| xp|Jp?x xxF/A$bKA(|`x| xp|Jp?x xdx/A$bKA(|`x| xp|Jp?x x$x/A$bKqA(|`x| xp|Jp?x x&x/A$bK9A(|`x| xp|Jp?x x.xF/A$bKA(|`x| xp|Jp?x x6dxц/A$bKA(|`x| xp|Jp?x x>$x/A$bKA(|`x| xp|Jp?x xEx/A$bKYA(|`x| xp|Jp?x xMxF/A$bK!A(|`x| xp|Jp?x xUdx/A$bKA(|`x| xp|Jp?x x]$x/A$bKA(|`x| xp|Jp?x xdx/A$bKyA(|`x| xp|Jp?) |/@t?x xtdx/A$bK)A(|`x| xp|Jp?x x|$x/A$bKA(|`x| xp|Jp?x x b|xKA(|`x| xp|Jp?x x b|xKA(|`x| xp|Jp?x x ?x x b 肇(}e[x|xKMA(|`x| xp|Jp?x $x | x?x &x b0肇8}e[x‡@|xKA(|`x| xp|Jp?x ,x | x?x (x b0肇H}e[x‡P|xKA(|`x| xp|JpbXKA(|`x| xp|Jpp|`|x8?|N |!a|? x8`pKA(|`xpp/@$KA(|ix8 8H?Ѐ x ?p ?p8 |x8K9A(?p8 &?p8 (|x8KA(?p8 8?p8 <|x8KA(?p8 D?p8 H|x8KA(?p8 hp8KA(8`|x8?|N |!|? x8K-A(|`x|x8?|N |!a|? x|#xx8p?Ѐ |/A$KA(|ix8 8H4b`KA(|`x| xp|Jp?x x /A4?x8 bh肇p|xKA(|`x| xp|Jp?x x/A$bxKA(|`x| xp|Jp?x xxF/A$bKA(|`x| xp|Jp?x xdx/A$bKMA(|`x| xp|Jp?x x$x/A$bKA(|`x| xp|Jp?x x&x/A$bKA(|`x| xp|Jp?x x.xF/A$bKA(|`x| xp|Jp?x x6dxц/A$bKmA(|`x| xp|Jp?x x>$x/A$bK5A(|`x| xp|Jp?x xEx/A$bKA(|`x| xp|Jp?x xMxF/A$bKA(|`x| xp|Jp?x xUdx/A$bKA(|`x| xp|Jp?x x]$x/A$bKUA(|`x| xp|Jp?x xdx/A$bKA(|`x| xp|Jp?x xlxF/A$bKA(|`x| xp|Jp?x x|$x/A$bKA(|`x| xp|Jp?x8 (b|xKA(|`x| xp|Jp?x8 x b`肉8}e[xŠh|xKA(|`x| xp|Jp? xdx/ApH x? xlx/ApH xb肊ŠK=A(|`x| xp|Jp?Ј x |xK=|`x| xp|Jp?Ј x /At/@8?Ј x b0肊|xK~A(|`x| xp|Jp?8 b肊|xK~A(|`x| xp|JpbK~qA(|`x| xp|Jp? `xH `?x8 |x肉8KMA(|`x/@0|x|xK|`x| xp|JpH?x8 |x肉8KA(|`x/@0|x|xK|`x| xp|JpHT?x8 |x肉8KA(|`x/@,|x|xKm|`x| xp|Jp?x xx/@`p||x8?|N |!a|? x8pb肊K|A(|`x| xp|Jp8tHp`t| } J Hx /A\t| } J Hx b|xK|mA(|`x| xp|Jp?t8 tt/@H`bK|-A(|`x| xp|Jp8tH`?9iHt|"x&}) }c[x|xKA(|`x/@Tt|"x&})9) b|xK{A(|`x| xp|Jpp|HH?t8 tt|"x&})9) /@D`p|`|x8?|N |!Q|? x|#x8t8p? |/A8? |/A$K}9A(|ix8 8H?8 |x肊8K~A(|`x/@D?8 | x|b}$Kx|xK|A(|`x| xt|JtH@?8 | x|b}$Kx|xK|AA(|`x| xt|Jt/@X? x | x? !x x xb肊}e[x‹|xKyA(|`x| xt|JtbKyA(|`x| xt|Jt?8 !|x8K}A(|`x| xt|JtbKy5A(|`x| xt|JtbKyA(|`x| xt|Jt? (x ? ,x ? 0x ? 4x b}Cx}e[x}FSx|xKxA(|`x| xt|Jt? 8x ? 255)BA060007A keyboard was not foundBA060008No configurable adapters found by the remote IPL menu in the SMS utilitiesBA06000BThe system was not able to find an operating system on the devices in the boot listBA06000CA pointer to the operating system was found in non-volatile storageBA060020The environment variable "boot-device" exceeded the allowed character limitBA060021The environment variable "boot-device" contained more than five entriesBA060022The environment variable "boot-device" contained an entry that exceeded 255 characters in lengthBA080001An IDE device remained busy for a longer period than the time out periodBA080010An IDE device is busy longer than specified time-out periodBA080011An IDE command timed out; command is exceeding the period allowed to completeBA080012The ATA command failedBA080013The media is not present in the trayBA080014The media has been changedBA080015The packet command failed; the media might not be readableBA090001SCSI DASD: test unit ready failed; hardware errorBA090002SCSI DASD: test unit ready failed; sense data availableBA090003SCSI DASD: send diagnostic failed; sense data availableBA090004SCSI DASD: send diagnostic failed: devofl cmdBA100001SCSI tape: test unit ready failed; hardware errorBA100002SCSI tape: test unit ready failed; sense data availableBA100003SCSI tape: send diagnostic failed; sense data availableBA100004SCSI tape: send diagnostic failed: devofl cmdBA110001SCSI changer: test unit ready failed; hardware errorBA110002SCSI changer: test unit ready failed; sense data availableBA110003SCSI changer: send diagnostic failed; sense data availableBA110004SCSI changer: send diagnostic failed: devofl commandBA120001On an undetermined SCSI device, test unit ready failed; hardware errorBA120002On an undetermined SCSI device, test unit ready failed; sense data availableBA120003On an undetermined SCSI device, send diagnostic failed; sense data availableBA120004On an undetermined SCSI device, send diagnostic failed; devofl commandBA130001SCSI CD-ROM: test unit ready failed; hardware errorBA130002SCSI CD-ROM: test unit ready failed; sense data availableBA130003SCSI CD-ROM: send diagnostic failed; sense data availableBA130004SCSI CD-ROM: send diagnostic failed: devofl commandBA130010USB CD-ROM: device remained busy longer than the time-out periodBA130011USB CD-ROM: execution of ATA/ATAPI command was not completed with the allowed timeBA130012USB CD-ROM: execution of ATA/ATAPI command failedBA130013USB CD-ROM: bootable media is missing from the driveBA130014USB CD-ROM: the media in the USB CD-ROM drive has been changedBA130015USB CD-ROM: ATA/ATAPI packet command execution failedBA140001SCSI read/write optical: test unit ready failed; hardware errorBA140002SCSI read/write optical: test unit ready failed; sense data availableBA140003SCSI read/write optical: send diagnostic failed; sense data availableBA140004SCSI read/write optical: send diagnostic failed; devofl commandBA150001PCI Ethernet BNC/RJ-45 or PCI Ethernet AUI/RJ-45 adapter: internal wrap test failureBA15100110/100 MBPS Ethernet PCI adapter: internal wrap test failureBA15100210/100 MBPS Ethernet cardBA160001PCI auto LANstreamer token ring adapter: failed to complete hardware initializationBA161001PCI token ring adapter: failed to complete hardware initializationBA170000NVRAMRC initialization failed; device test failedBA170100NVRAM data validation check failedBA170201The firmware was unable to expand target partition - saving configuration variableBA170202The firmware was unable to expand target partition - writing error log entryBA170203The firmware was unable to expand target partition - writing VPD dataBA170210Setenv/$Setenv parameter error - name contains a null characterBA170211Setenv/$Setenv parameter error - value contains a null characterBA170998NVRAMRC script evaluation error - command line execution errorBA170999NVRAMRC script evaluation error - stack unbalanced on completionBA180008PCI device Fcode evaluation errorBA180010PCI probe error, bridge in freeze stateBA180011PCI bridge probe error, bridge is not usableBA180012PCI device runtime error, bridge in freeze stateBA180100FDDI adapter Fcode driver is not supported on this systemBA180101Stack underflow from fibre-channel adapterBA188000An unsupported adapter was found in a PCI slotBA188001EEH recovered a failing I/O adapterBA188002EEH could not recover the failed I/O adapterBA190001Firmware function to get/set time-of-day reported an errorBA210000Partition firmware reports a default catchBA210001Partition firmware reports a stack underflow was caughtBA210002Partition firmware was ready before standout was readyBA250010dlpar error in open firmwareBA278001Failed to flash firmware: invalid image fileBA278002Flash file is not designed for this eServer platformBA278003Unable to lock the firmware update lid managerBA278004An invalid firmware update lid was requestedBA278005Failed to flash a firmware update lidBA278006Unable to unlock the firmware update lid managerBA278007Failed to reboot the system after a firmware flash updateIDPEMR%-20s%c%c %-20s%08x ID:Flags:%-20s%08x Length:%-20s%c - Priority:High priority and mandatory call-out. Medium priority. Medium priority group A (1st group). Medium priority group B (2nd group). Medium priority group C (3rd group). Low Priority. FRU ID Section%-20s%08x Failing Component:("normal" hardware FRU) (Code FRU) (Configuration error) (Mainteneace procedure required) (External FRU) (External Code FRU) (Tool FRU) (Symbolic FRU) %-20s%s FRU Stocking Part:Procedure ID:CCIN:Serial Number:FRU PE Section%-20s%s PCE Name: FRU MR Section Manufacturing Replaceable Unit Fields (%d): %-20s%c %-20s%08x MRU Priority:MRU ID:FRU Section (%d)%-20s%08x %-20s%08x Call-Out Type:YesNo%-20s%-8s %-20s%-8s Fru ID Included:Fru Subscns:Loc Code Length:Location Code:%s "Primary Reference Code:%c" %s PSPrimary SRC SectionSecondary SRC Section%-20s%08x %-20s%08x SRC Version:Subsections:Platform Data: Extended Reference Codes: 2: %08x 3: %08x 4: %08x 5: %08x 6: %08x 7: %08x 8: %08x 9: %08x Sub-Section ID:Platform Data:JanFebMarAprMayJunJulAugSepOctNovDec%-20s %c%c %-20s%08x Section ID:Section Length:%-20s%08x %-20s%08x Version:Sub_type:%-20s%08x Component ID:Private Header%-20s%x %s %x Date:%-20s%x:%x:%x:%x Time:%-20sCreator ID:Hardware Management ConsoleService ProcessorPHypPower ControlPartition FirmwareSLICUnknown (%c). Section Count:Creator Subsystem Name: %s. Creator Subsystem Version: %08x%08x. Platform Log ID:Log Entry ID: %-20s%08x Subsystem ID:(Processor, including internal cache) (Memory, including external cache) (I/O (hub, bridge, bus)) (I/O adapter, device and peripheral) (CEC Hardware) (Power/Cooling System) (Other Subsystems) (Surveillance Error) (Platform Firmware) (Software) (External Environment) Event Data %-20s%08x Event Type:Miscellaneous, informational only. Dump notification. Previously reported error has been corrected by system. System resources manually deconfigured by user. System resources deconfigured by system dueto prior error event. Resource deallocation event notification. Customer environmental problem has returned to normal. Concurrent maintenance event. Capacity upgrade event. Resource sparing event. Dynamic reconfiguration event. Normal system/platform shutdown or powered off. Platform powered off by user without normal shutdown. Unknown event type (%d). Event Severity:Informational or non-error event, Recovered error, general. Predictive error, general. Predictive error, degraded performance. Predictive error, fault may be corrected after platform re-IPL. Predictive Error, fault may be corrected after IPL, degraded performance. Predictive error, loss of redundancy. Unrecoverable error, general. Unrecoverable error, bypassed with degraded performance. Unrecoverable error, bypassed with loss of redundancy. Unrecoverable error, bypassed with loss of redundancy and performance. Unrecoverable error, bypassed with loss of function. Error on diagnostic test, general. Error on diagnostic test, resource may produce incorrect results. Unknown event severity (%d). Action Flag:Service Action (hidden error) call home) Required. Report Externally, (HMC only). (HMC and Hypervisor). Error isolation incomplete, further analysis required. Unknown action flag (0x%08x). User Header%-20s%s (tttt-mmm) Model/Type:%-20s%s Serial Number:Machine TypeUnknown SectionRaw Section Data: IBM Diagnostics Section%-20s%08x Event ID:Vendor Error Log Section%-20s%c%c%c%c Vendor ID:Raw Vendor Error Log: CPUMemorySlotPHBPCIAddRemoveDRC NameDRC IndexCountHotplug section%-20s%08x (%s) Hotplug Type:Hotplug Action:Hotplug Identifier:%-20s%sHotplug drc_name:%-20s%08x Hotplug drc_index:Hotplug count:  x oP B vp1 ] ooo"oP34444(40484P4X4h4444444444P44455555 45(505@5X5`5p5555RHRXRpRRRRSS(S8SXShSxSSRXSRSRSSSS8SShTSTT(THTXTpTTTTTU U0UpUUUVV V`VpVVWWW0W@WhWxWWWWWWX X0X`XpXXXYY@YPYYYYZ Z0Z`ZpZZZZZZ[H[X[[\\\h\x\\]8]H]]]]^H^X^p^^^^^_(_8_p___```@`P````aa(aXahaaabb@bPbbbbc@cPcccdd@dPdddde(e8eeeef0f@fxfffgg g`gpgghh h`hphhii(iHiXiijjjPj`jjjkkPk`kkkllPl`lllmm0m@mhmxmmmnn@nPnnnnnoo8oHoooopp pXphppppqq qPq`qqqqrr wwwwwwwwwwwwwwwwwxx@HPX`h@px@{ #3#@##d####|### #p#d#H## ##D##`####X##(##H####D##|###8# ##D##ϰ#Є##0#Լ#Ռ##P#ܤ#####`#x#p#h#x###|#|##,####X##x## # 0##h##x#X## # #!4#"0#"###%|#&#'#(#) #*#*#,|#.#.l#10##8@H0333333333555555566666 686P6X6x6666677 787X7p77777777888888`8p8x88888899@9p999::0:8:@:P:p:::::;;(;@;H;`;p;;;;;<<<< <8<@>H>x>>??8?p?x???@@X@@@@AA(APAxAABB8B`BBCC0C`CCD(DDDDDDDEE0LEHEXEhExEEEEͨEFFF0FXFpFFFFFFGGG(G@G`GxGGGGGGHH0HXHpHHHHHII8IXIxIIJJJ(J@JXJhJJJJJJJKK(K@K`KxKKKKLLL0LPLLLLLLM8MxMMMNNPNNNO OXOOOP(PXPPQQ8QpQQRR R0R@r`rhrprxrrrrrrHrss sHspsssssttt(tPt`txttttttttuuu u(u8uhuuuuuuuuvv v0vHvXv`vxvvvvvvvvwww8w`wwxx0x@xPxhxxxxxxxxxxxx yy(y@yHyXypyxyyyyyyzzz z0zXzzzzz{{ {8{H{`{p{{{{||H|||}}8}X}x}}~\~~@~`~~~HpP(8HXh 0HXhx(@X 0HXGCC: (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]ospWG,d, H,(, ,  x,&  x,,Є8,0Լ,4P`,8>,2parse_sp_scnxrtas_get_ibm_sp_scnprint_re_ibmsp_scnuprint_usr_hdr_action print_re_usr_hdr_scn parse_mtms ,print_mtms qparse_mt_scn rtas_get_mt_scn print_re_mt_scn Qparse_generic_v6_scn print_re_generic_scnTwparse_ibm_diag_scnrtas_get_ibm_diag_scn:print_re_ibm_diag_scnparse_vend_errlog_scnrtas_get_vend_errlog_scnprint_re_vend_errlog_scnVWwZparse_hotplug_scnrtas_get_hotplug_scnprint_re_hotplug_scn FdHintJppeE 4B . V/# re0K# 1# 2W#  (K QWW# XW# -Yj# Z# [# g\#  e f# g# dayh# 4k l# m#dayn# 0u v# $w# x#  y# |^ }# $~# #  # t( @# w# # j# S id# # Q# # #pe !c id"# ## Q$# %# &# V #id # #s#c3h[\ \# ^]#_^ #_ #hap#i#j\#Vkl#Xl#`pleOxu@v#w#Qy# z#!)} #(6~ #,C #0P #4] #8j #<w #@ #D#H#l^#lY#lsl#ppepe#E8@## j#0 78 @# Q# # # #$ #( #, ^#0 B#4 | Q# -# 3# ^# B# ) @# R# # # #$ #( ,#, #0 #4 #8 U#< #@ s#D #H !#L #P #T #X #\ #` 5#d Q#t   -# 3# 9#?#5 ##rdtoh0reK8o-WM re,K0scn.P@6H Zve; @X FfruGlsrcH D&Ll PXgen^ ^r|{ rezK0scnzh8zW@|hX`W|  0|4 0W8 JreK0W8*  reK00 8  ` p reK0 8  `)Kpdh xreK0  P!ibmjHp 7WD!rc7W@"xKdHbufwj0#wW8!reyKX 0z P { H!rc|W@ FH(@8intJiNi1-o rb# |# n# G# # #( ]#0 a#8 Q#@ #H  #P  #X y"#` 3$#h &b#p :*b#t ,p#x B0F# *1T# 2# 6# ?{# H# I# J# K# L-# kNb# XP#1+z  4q U# # b#  E8io4M.\ V/\#re0# 1 # 2b# ( QWb# Xb# -Y# Z # [ # g\\#b e f # g #dayh #0uE v # $w # x #  y # 78 @# Q #  #  #  #$  #(  #, ^ #0 B #4 @# R #  #  #  #$  #( , #,  #0  #4  #8 U #<  #@ s #D  #H ! #L  #P  #T  #X  #\  #` 5#d #t[zbHfmty0ap{wk|bwbuf}wi~bwlen~bw~bw b OJ 0eb8hJ`aJXendJPMLibHjbDlenb@?9b 0re8lenb`!D ^b0 bD6 b0b`fmt0apobufoJ wi!bo"bo"bo?#bo$bo%bo{&o'o}b` V|0@|\8|blen~bP"b 0re8b@\XlenbPN j re0EbX f@\0b80 Hlenb@ X re0b(Q @\0b8 lenbQbb !b '  p eb p e'1 U  L  U   j  ]   F(?intJEu4W.V/# re09#1#24# (9QW4#X4#-Yo#Z#[#g\# 86@# # # # # # # 7 # !# id## E$# n& # ' # (#$ 4(w re90 /wP? 7wH re690 &F4H8@E0E48cpuGwXlenH4Pu FintJEuul'u 4W . V/# re0T# 1# 24#  (T QW4# X4# -Yo# Z# [# g\# S id# # Q# # #ul ! id"# ## Q$# %# &# p @# Z# id#, #0 X#4 M#8 #< u#@ }#D |#H @& # id# -# # u# }# |# 4ureT0 uX {P CureBT0 M4DreLT0idL8 lNuP OuHlenP4@ ct4Dl@s0s48 uuHlenv4@l F intJEuul4W . V/# re0I# 1# 24#  (I QW4# X4# -Yo# Z# [# g\# S id# # Q# # #ul ! id"# ## Q$# %# &# .X @ # 7# #q# +#fan# !# # & # ## $ # % # & #|( # + #  - #$ V. #( / #,3O#4 5#H v<#L ?@#-B# C# vE#  4|*reI0 *X 0P DD*| ireCI0 S4 S@R0R48 T*hQU4dlenV4` 48 1@048 *Xlen4P d48 @048= F ЄintJEu4W.V/# re09#1#24# (9QW4#X4#-Yo#Z#[#g\#S id# #Q## # u l! id"# ## Q$# %# &# 8O@P# S# T# YU# V# eX# Y# )Z# [# <]# y^ # /` # Lb # d # Vf # g# Ah# l# mm# n# o# q#  t#  ?v#  {z#$ N{#$ |#$ q}#( #( ]#, k#,?#8 #L #P #T#XK#\ #` u l 5# # # ##K#  # 4 :re90ioX¬ )P GD reF90 U4D 0@T0T48ioVXlenW4P _4ϰ !@048ioHlen4D 4@ 4ϰЄ n@048 FЄԼintJEu4W.V/# re09#1#24# (9QW4#X4#-Yo#Z#[#g\#S id# #Q## # u l! id"# ## Q$# %# &# ) F @@#?##, #00#4 #8   F U# # #0#  #84Є dre90lridX jP)=d0 re<90 K40Լ U@J0J48lriLdXlenM4P FԼPintJEu4W.V/# re09#1#24# (9QW4#X4#-Yo#Z#[#g\#85@6# 7# ECC8# 29# f;# =# ># bus?# b@# 7B# C # D # WG # EH # jK# L# O# Q# nT # U # W#$ wX#$ rZ #( E\#, 4ԼՌ " re90mem"P? 4"Ռ [ re390B4P <@A0A48memC"XlenD4P FP bintJEu4W.V/# re09#1#24# (9QW4#X4#-Yo#Z#[#g\#pg@h# ;i# j# cpuk# Dl# ion# o# p# q# s# t # u # Xv # x #  y # {#a}#~#(K#<#H u l  l  l  l4Pܤ re90P?)Cܤ JreB90Q4#@P0P48RXlenS4P F` 2intJEuul4W . V/# re0I# 1# 24#  (I QW4# X4# -Yo# Z# [# g\# U82 @# ibm|# b# # # D# n# # ;# # # % #  #  #  # i # x# .# rtc# # x# d# # # # #  #  #$44prreI0sprPOA4rre3I0 B4` @A0A48spCrXlenD4P q &DF` intJEuulul4W . V/# re0Y# 1# 24#  (Y QW4# X4# -Yo# Z# [# g\#uol S id# # Q# # #ul !/ id"# ## Q$# %# &#u?l h /# )_#  V #id # #s#h D8h#e0#t1#?2# )3_#%u&l H:a;h# <?#=#& DhFu#idG# NOh#YT#al 3h[l \# ^]#_^ #_ #hau#i#jl#Vk|#Xl#`u|lO xu@v#w#Qy# z#!)} #(6~ #,C #0P #4] #8j #<w #@ #D#H#l^#lY#ls|#pulul#  ido# o#`xW;reY0R;P3JxpreIY0KPLH Mo@&iphrehY0mjPkH lo@4hx>reY0srcXfru|P|H4D4@0pidox reY04\048len4`^4|%hu0len4PT:4||r 90948R;;Xlen<4T=P4| s048hlen4`.4, 048m`i4\len4XHmru Paq4,Y |fru|0484Xlen4P4 src0i4Tlen4P4 O@048srcPfru|Hlen4D4@ _lx$ O  D"F& intJEu4W.V/# re09#1#24# (9QW4#X4#-Yo#Z#[#g\# evf#g# dayh#4k l# m# dayn#0uv#$w#x# y# |L }# $~# #  # u\ l S id# #Q## # u l! id"# ## Q$# %# &#p>@?#@\#B?#,5C#8Eu#HK#L1L#PM#TO#XP#\Q#` u l 9ToU#Wv#5X# ]u# _#1c# d#$f#(g#,i#0Z@p@q#r\#t#,u#0v#4 w#8H#<N# # # # # H#w#)L# }8@##$N# E8@#\# o#0X@+ +018?v*&Xu0%u0r%{8I.x-0-8\C4x'*Bo0B8B4lenD4`[4 tyreZ90\yX ]Py  0re904 0@048yXlen4PV4h[ere90BeX kPoz ehre 904xBe0idWdlen4`C4xXB >BBe0lenD4P:4X Be0len4Ph4  @048BeXlen4PO  ) &re90$ &8N4 !4v q$ &0len4`,4!4"0 re+90mt- PwH "0" reG90V4"#] Q@U0U48mtW XlenX4Pn4#%| rem90geno P pH@4%|& "@048gen XlenP o 2 lk " xs0F&,|1intJEuul4W . V/# re0I# 1# 24#  (I QW4# X4# -Yo# Z# [# g\#  { @# ' # t( @# |# # o# 4&'DreI0RPO 3'(:re2I0 <A4() @@0@48RBXlenC4P X4) *+reWI0veYP{Z }**xre|I0o4*,|@048veXlen4P?F,|10 intJEuul4W . V/# re0I# 1# 24#  (I QW4# X4# -Yo# Z# [# g\# S id# # Q# # #ul ! id"# ## Q$# %# &# CK  8@#O# ^#,H#,#,n#,u1#0 K  Z# ^#H##u1# \4,|.reI0"X PCH..l_reGI0*Z4.l10F@Y0Y48"[Xlen\4PoVlNLF o{lMk @olN X% $ > $ > $ >   II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8  : ; I 8  : ; : ;I8  : ;I8  : ;I 8 .? : ; ' @: ; I : ; I .? : ; ' I@4: ; I  4: ; I  U .: ; ' I@.: ; ' @.? : ;' I@: ;I 4: ;I !4: ;I ".? : ;' I@#: ;I % : ; I$ > $ > $ >   I : ;  : ;I8  I : ; : ; I8 I!I/  : ; I8 .? : ; ' I@: ; I 4: ; I 4: ; I !I/: ; I .: ; ' I@.? : ;' I@: ;I : ;I 4: ;I 4: ;I I4: ; I?  % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 .? : ; ' I@ : ; I 4: ; I .? : ; ' I@: ; I 4: ; I % $ > $ > $ >  II!I/ &I : ; I  : ;  : ; I8 : ; I8 : ; I 8 .? : ; ' I@: ; I 4: ; I 4: ; I .? : ; ' I@: ; I % $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8  : ; : ;I8  : ;I 8  : ;I 8 .? : ; ' I@: ; I 4: ; I .: ; ' I@: ; I 4: ; I .? : ; ' I@% $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 I !I/ : ; I 8  : ; : ;I8  : ;I 8  : ;.? : ; ' I@: ; I 4: ; I  4: ; I .: ; ' I@: ; I .? : ;' I@: ;I % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 I !I/ : ; I 8  : ;  : ; I : ; I  : ;I8 .? : ; ' I@: ; I 4: ; I 4: ; I .? : ; ' I@: ; I % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 .? : ; ' I@ : ; I 4: ; I .? : ; ' I@: ; I % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 I !I/ .? : ; ' I@: ; I 4: ; I .? : ; ' I@: ; I 4: ; I % $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 .? : ; ' I@: ; I 4: ; I .? : ; ' I@: ; I % $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8  : ; : ;I8  : ;I8  : ;I 8 .: ; ' I@: ; I 4: ; I .? : ; ' I@4: ; I  U: ; I .: ;' I@: ;I 4: ;I 4: ;I  .? : ;' I@: ;I % $ > $ > $ >  I: ; I : ;  : ; I8 : ; I8 : ; I 8 : ; I 8 I !I/  : ; : ;I8 .? : ; ' @: ; I .? : ; ' I@4: ; I : ; I 4: ; I .? : ;' I@: ;I : ;I 4: ;I 4: ;I .? : ;' @ U% $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8 .? : ; ' I@: ; I 4: ; I : ; I 4: ; I < .? : ; ' I@% $ > $ > $ >  II!I/ : ; I  : ;  : ; I8 : ; I8 : ; I 8  : ; : ;I  : ;I : ; : ;I8  : ;I 8  : ;I8 .? : ; ' I@: ; I 4: ; I : ; I 4: ; I | /usr/includeget_rtas_event.clibrtasevent.hlibrtasevent_v4.hlibrtasevent_v6.hstdint.h dɃ i==.E >/>#0KZ(0=/>=/==+P=u.J%0K_f' =M.6J>/! u0==>KM=/;[> fg.p .r  .t  .v  .x 5z 31/! g/g2z y/!t=Y2!wZuugZZuYwuuhuhuhuY jw=Y. vg=>.E g=9.J "ZY#Y#Y#Y#Y(Z#Y#\==/O 5/! Y=Y. Y=>Y==Y. ?uu=. hY.B Y==Y:.I >Y4XO Y#Y#Y#Y#Y#Y#Y$Y#Y2Z==1/! @ /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/include/bits/usr/includeprint_rtas_event.cstddef.htypes.hstdio.hlibio.hstdarg.hstdint.hlibrtasevent.h Hh/1Kh/ Y01YL0?KKK>zy tKKMLx tc X/ u0>/ Y=tt  .v  .w  .x 6y 5z 432=! tYg=2/! tL0/0gh//0/0Y1=Y#Y=#@=gK=e ; h>gKK<:X" Y.o %?YY5>==! 0Y.k %>gʄYwgʄ=! gY 0YY#.` 0MW&=̟W%W%M=! gY 1YY7.L /LYM+<Y @==YYYYYYY&?=! a /usr/includertas_cpu.clibrtasevent.hlibrtasevent_v4.hstdint.h (iY=Y .z ZuZ/! gY 0YY$._ 0Yggggggg1=! b /usr/includertas_dump.clibrtasevent.hlibrtasevent_v6.hstdint.h jY=Y.k ZuZuZYZuZ/! gYyY=.n Y=.u L/! 0YY.d 0>>=>YY=! b /usr/includertas_epow.clibrtasevent.hlibrtasevent_v6.hstdint.h jY=Y.k ZZYuZwZ/! gY /K0=Y#AYYYYYYYYY/ /0Z]####i / YY5gwu! ` /usr/includertas_io.clibrtasevent.hlibrtasevent_v6.hstdint.h  iY=Y.g YZYvYYYZYZ/! gY /0Ygggggggggggggggg0,/ //0L###/#L######h#####=Y&/ YY5gwu! a /usr/includertas_lri.clibrtasevent.hlibrtasevent_v6.hstdint.h ЄjY=Y.q ZuYZYZuZ/! gY 0YY&.] 0L####=! a /usr/includertas_mem.clibrtasevent.hlibrtasevent_v4.hstdint.h ԼiY=Y .z ZuZ/! gY /0YY8.K Yggggggggggggggg01=! b /usr/includertas_post.clibrtasevent.hlibrtasevent_v4.hstdint.h PiY=Y.k [u?u?u?u>Z/! gY /0YY/.T YYgggggggggggggg=! ` /usr/includertas_sp.clibrtasevent.hlibrtasevent_v4.hstdint.h iY=Y .z ZuZ/! gY 0YY. 0YYYYYYYYYYYYYYYYYYYYYYYYYYʃ=! x /usr/includertas_srcfru.clibrtasevent.hlibrtasevent_v6.hrtas_src_codes.cstdint.h `iY=Y.h Yvuwuwuu?u?/! kY=Y .w YvK>/! kY=Y .w YvK>/! kY=Y. YZuu. vY0<<H 0Y==Y5.N [[u//vYYZu#==.m =L>g.t=L>0uZ/! gY 0w=/ u0ʃ#####/ 2YZ=#########uuu/ 1YYʄ/ 1YKv+/ 0=M"Y=˽Yz t/ g0Kv#//B7=! /0Y0.S 0=Nwx=0̄Y:y=! #e /usr/includertas_v6_misc.clibrtasevent.hlibrtasevent_v6.hstdint.h YYYYiYYYYYiYYZYYYY fZ=w"/jY=Y .c YZuYZYZY]Y?uY/! gY 0YY=.F 0(######=Y#=!jY=Y.p YZvYYYYZuZ/! gY g=0gLgLgLgLgLgLgLgLgLgLgM/ g08"""""""""""""s""""""""""""""/ g0Zgg#g#j  '/ 0YY .w 0׃=!ug>u=i/iY=Y .x YYvgZ/! gY 0YY .y 0埄=!jY=Y.k YZgvYYKY .z Y/!0YY.t /K=! b /usr/includertas_vend.clibrtasevent.hlibrtasevent_v4.hstdint.h &iY=Y .z ZuZ/! gY 0YY .z 0=!iY=Y.o YwYKY6Y/! gY 0YY.s 0K=! e /usr/includertas_hotplug.clibrtasevent.hlibrtasevent_v6.hstdint.h ,|jY=Y.f ZvYYZ"Y"]uZ/! gY0YY.l 0ZZ[YY˃=!  xA $dPA~D $PA~D HPD $PA~D |HPD $PA~D $hPA~D $ dPA~D $pPA~D $dPA~D  xA $HDT A~D $PA~D $ PA~D LHPD DpHPD $PA~D $` |hb ~ ~0 } }@ P )  L | n  { |8 {x ~ , } U | w | ~ ~ P   P  2P Ih Y i`P ~P  @ @ 8 (P  P +xP = CT XHP jt {( 0  "   P P  ' 5 B  LP ] q h pP `L   D  PPP,>QpbwPX<hp XP! P1DtUchs0HP|'=Old Lq|(pxT@ /PAU\Xidz\xinitfini.ccrtstuff.c__do_global_dtors_auxframe_dummy__JCR_LIST____CTOR_LIST____DTOR_LIST__completed.6751dtor_idx.6753__do_global_ctors_aux__JCR_END____CTOR_END____FRAME_END__get_rtas_event.c_get_re_scnparse_re_hdrparse_re_exthdrprint_rtas_event.crtas_print_widthline_offsetre_print_fnsrtas_severity_namesrtas_disposition_namesrtas_event_error_typeostreamrtas_error_typertas_cpu.crtas_dump.crtas_epow.cprint_v4_epowprint_v6_epowrtas_io.cprint_v4_ioprint_v6_iortas_lri.crtas_mem.crtas_post.crtas_sp.crtas_srcfru.csrc_codesparse_fru_id_scnparse_fru_pe_scnparse_fru_mr_scnprint_fru_hdrprint_fru_priorityprint_fru_id_scnprint_fru_pe_scnprint_fru_mr_scnrtas_v6_misc.cmonthsrtas_vend.crtas_hotplug.chotplug_typeshotplug_actionshotplug_ids00000010.plt_call.parse_usr_hdr_scn+000000010.plt_call.parse_v6_rtas_event+000000010.plt_call.print_src_refcode+000000014.plt_call.__gmon_start__+000000010.plt_call.parse_generic_v6_scn+000000010.plt_call.rtas_copy+000000010.plt_call.parse_vend_errlog_scn+000000010.plt_call.parse_rtas_time+000000010.plt_call.malloc@@GLIBC_2.3+000000010.plt_call.rtas_print_scn+000000010.plt_call.parse_mtms+000000010.plt_call.vsnprintf@@GLIBC_2.4+000000010.plt_call.parse_post_scn+000000010.plt_call.get_re_scn+000000010.plt_call.print_re_fru_scn+000000010.plt_call.strncmp@@GLIBC_2.3+000000010.plt_call.memset@@GLIBC_2.3+000000010.plt_call.parse_rtas_date+000000010.plt_call.parse_priv_hdr_scn+000000010.plt_call.__errno_location@@GLIBC_2.3+000000010.plt_call.parse_cpu_scn+000000010.plt_call.fprintf@@GLIBC_2.4+000000010.plt_call.rtas_print+000000010.plt_call.parse_mt_scn+000000010.plt_call.parse_io_scn+0__dso_handle__DTOR_END__00000010.plt_call.parse_hotplug_scn+000000010.plt_call.re_scn_id+000000010.plt_call.fflush@@GLIBC_2.3+000000010.plt_call.strcmp@@GLIBC_2.3+000000010.plt_call.add_re_scn+000000010.plt_call.rtas_get_dump_scn+000000010.plt_call.print_raw_data+000000010.plt_call.strcpy@@GLIBC_2.3+000000010.plt_call.memcpy@@GLIBC_2.3+0__glink_PLTresolve00000010.plt_call.print_scn_title+000000010.plt_call.free@@GLIBC_2.3+000000010.plt_call.print_usr_hdr_subsystem_id+000000010.plt_call.cleanup_rtas_event+000000010.plt_call.print_v6_hdr+000000010.plt_call.parse_epow_scn+000000010.plt_call.print_usr_hdr_event_data+000000010.plt_call.parse_dump_scn+000000010.plt_call.parse_src_scn+000000010.plt_call.parse_sp_scn+000000010.plt_call.__cxa_finalize@@GLIBC_2.3+000000010.plt_call.snprintf@@GLIBC_2.4+000000010.plt_call.strlen@@GLIBC_2.3+000000010.plt_call.parse_v6_hdr+000000010.plt_call.print_usr_hdr_action+000000010.plt_call.parse_mem_scn+000000010.plt_call.parse_ibm_diag_scn+000000010.plt_call.print_mtms+000000010.plt_call.parse_lri_scn+0_DYNAMICprint_re_hdr_scnparse_vend_errlog_scnrtas_get_lri_scnparse_usr_hdr_scnrtas_get_event_hdr_scnparse_rtas_datefree@@GLIBC_2.3rtas_get_hotplug_scnrtas_get_usr_hdr_scnrtas_entity_namesparse_mt_scn__gmon_start___Jv_RegisterClassesrtas_printparse_priv_hdr_scnrtas_get_post_scnvsnprintf@@GLIBC_2.4rtas_get_mem_scnprint_re_dump_scn_finiprint_re_usr_hdr_scnrtas_get_dump_scnprint_re_cpu_scnprint_mtmsprint_re_vend_errlog_scnrtas_copy__cxa_finalize@@GLIBC_2.3__errno_location@@GLIBC_2.3strlen@@GLIBC_2.3rtas_get_event_exthdr_scnrtas_get_cpu_scnparse_mtmsparse_cpu_scnparse_io_scnre_scn_idrtas_get_src_scnprint_re_exthdr_scncleanup_rtas_eventprint_re_src_scnrtas_get_ibm_sp_scnupdate_os_id_scnprint_raw_dataparse_rtas_eventprint_scn_titleparse_ibm_diag_scnrtas_get_vend_errlog_scnrtas_get_priv_hdr_scnmalloc@@GLIBC_2.3print_re_ibmsp_scnrtas_print_eventprint_re_generic_scnparse_v6_hdrget_re_scnparse_v6_rtas_eventrtas_print_scnprint_re_priv_hdr_scnprint_re_mt_scnmemset@@GLIBC_2.3print_src_refcodeparse_generic_v6_scnrtas_get_mt_scnrtas_get_io_scnstrncmp@@GLIBC_2.3print_re_mem_scnparse_mem_scnprint_re_io_scnparse_dump_scnparse_hotplug_scnprint_usr_hdr_subsystem_idrtas_get_ibm_diag_scn__bss_startfprintf@@GLIBC_2.4parse_epow_scnfflush@@GLIBC_2.3strcmp@@GLIBC_2.3parse_rtas_timeprint_re_ibm_diag_scnmemcpy@@GLIBC_2.3print_usr_hdr_actionprint_v6_hdradd_re_scn_endstrcpy@@GLIBC_2.3rtas_print_raw_eventrtas_set_print_widthprint_re_hotplug_scnparse_post_scnprint_usr_hdr_event_dataprint_re_post_scnprint_re_epow_scnprint_re_lri_scnrtas_get_epow_scnsnprintf@@GLIBC_2.4_edataparse_sp_scnprint_re_fru_scnparse_lri_scnparse_src_scn_initlibrtas-1.3.10/librtasevent_src/rtas_io.c0000644000175100001440000001716312313120670017460 0ustar nfontusers/** * @file rtas_io.c * @brief RTAS I/O event section routines * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot * @author Jake Moilanen */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_io_scn * */ int parse_io_scn(struct rtas_event *re) { struct rtas_io_scn *io; io = malloc(sizeof(*io)); if (io == NULL) { errno = ENOMEM; return -1; } memset(io, 0, sizeof(*io)); io->shdr.raw_offset = re->offset; if (re->version < 6) { rtas_copy(RE_SHDR_OFFSET(io), re, RE_V4_SCN_SZ); } else { struct rtas_v6_io_scn_raw *rawhdr; rawhdr = (struct rtas_v6_io_scn_raw *)(re->buffer + re->offset); parse_v6_hdr(&io->v6hdr, &rawhdr->v6hdr); io->event_type = rawhdr->event_type; io->rpc_length = rawhdr->rpc_length; io->scope = rawhdr->scope; io->subtype = rawhdr->subtype; io->drc_index = be32toh(rawhdr->drc_index); memcpy(io->rpc_data, rawhdr->rpc_data, 216); re->offset += io->v6hdr.length; } add_re_scn(re, io, RTAS_IO_SCN); return 0; } /** * rtas_get_io_scn * @brief Retrieve the I/O section of the RTAS Event * * @param re rtas_event pointer * @return rtas_event_scn pointer for i/o section */ struct rtas_io_scn * rtas_get_io_scn(struct rtas_event *re) { return (struct rtas_io_scn *)get_re_scn(re, RTAS_IO_SCN); } /** * print_v4_io * @brief print the contents of a RTAS pre-version 6 I/O section * * @param res rtas_event_scn pointer to i/o section * @param verbosity verbose level of output * @return number of bytes written */ static int print_v4_io(struct scn_header *shdr, int verbosity) { struct rtas_io_scn *io = (struct rtas_io_scn *)shdr; int len = 0; len += print_scn_title("I/O Event Section"); if (io->bus_addr_parity) len += rtas_print("I/O bus address parity.\n"); if (io->bus_data_parity) len += rtas_print("I/O bus data parity.\n"); if (io->bus_timeout) len += rtas_print("I/O bus timeout, access or other.\n"); if (io->bridge_internal) len += rtas_print("I/O bus bridge/device internal.\n"); if (io->non_pci) len += rtas_print("Signaling IOA is a PCI to non-PCI bridge " "(e.g. ISA).\n"); if (io->mezzanine_addr_parity) len += rtas_print("Mezzanine/System bus address parity.\n"); if (io->mezzanine_data_parity) len += rtas_print("Mezzanine/System bus data parity.\n"); if (io->mezzanine_timeout) len += rtas_print("Mezzanine/System bus timeout, transfer " "or protocol.\n"); if (io->bridge_via_sysbus) len += rtas_print("Bridge is connected to system bus.\n"); if (io->bridge_via_mezzanine) len += rtas_print("Bridge is connected to memory controller " "via mezzanine bus.\n"); if (shdr->re->version >= 3) { if (io->bridge_via_expbus) len += rtas_print("Bridge is connected to I/O expansion bus.\n"); if (io->detected_by_expbus) len += rtas_print("Error on system bus detected by I/O " "expansion bus controller.\n"); if (io->expbus_data_parity) len += rtas_print("I/O expansion bus data error.\n"); if (io->expbus_timeout) len += rtas_print("I/O expansion bus timeout, access or other.\n"); if (io->expbus_connection_failure) len += rtas_print("I/O expansion bus connection failure.\n"); if (io->expbus_not_operating) len += rtas_print("I/O expansion unit not in an operating " "state (powered off, off-line).\n"); } len += rtas_print("IOA Signaling the error: %x:%x.%x\n vendor: %04x " "device: %04x rev: %02x slot: %x\n", io->pci_sig_busno, io->pci_sig_devfn >> 3, io->pci_sig_devfn & 0x7, io->pci_sig_vendorid, io->pci_sig_deviceid, io->pci_sig_revisionid, io->pci_sig_slot); len += rtas_print("IOA Sending during the error: %x:%x.%x\n" " vendor: %04x device: %04x rev: %02x slot: %x\n", io->pci_send_busno, io->pci_send_devfn >> 3, io->pci_send_devfn & 0x7, io->pci_send_vendorid, io->pci_send_deviceid, io->pci_send_revisionid, io->pci_send_slot); len += rtas_print("\n"); return len; } /** * print_v6_io * @brief print the contents of a version 6 RTAS I/O section * * @param res rtas_event_scn pointer to i/o section * @param verbosity verbose level of output * @return number of bytes written */ static int print_v6_io(struct scn_header *shdr, int verbosity) { struct rtas_io_scn *io = (struct rtas_io_scn *)shdr; int len = 0; int has_rpc_data = 0; len += print_v6_hdr("I/O Event Section", &io->v6hdr, verbosity); len += rtas_print(PRNT_FMT_L, "Event Type:", io->event_type); switch (io->event_type) { case 0x01: len += rtas_print(" - Error Detected.\n"); break; case 0x02: len += rtas_print(" - Error Recovered.\n"); break; case 0x03: len += rtas_print(" - Event (%x).\n", io->event_type); break; case 0x04: len += rtas_print(" - RPC Pass Through (%x).\n", io->event_type); has_rpc_data = 1; break; default: len += rtas_print(" - Unknown event type (%x).\n", io->event_type); break; } len += rtas_print(PRNT_FMT_L, "Error/Event Scope:", io->scope); switch (io->scope) { case 0x00: len += rtas_print(" - N/A.\n"); break; case 0x36: len += rtas_print(" - RIO-hub.\n"); break; case 0x37: len += rtas_print(" - RIO-bridge.\n"); break; case 0x38: len += rtas_print(" - PHB.\n"); break; case 0x39: len += rtas_print(" - EADS Global.\n"); break; case 0x3A: len += rtas_print(" - EADS Slot.\n"); break; default: len += rtas_print(" - Unknown error/event scope.\n"); break; } len += rtas_print(PRNT_FMT_L, "I/O Event Subtype:", io->subtype); switch (io->subtype) { case 0x00: len += rtas_print(" - N/A.\n"); break; case 0x01: len += rtas_print(" - Rebalance Request.\n"); break; case 0x03: len += rtas_print(" - Node online.\n"); break; case 0x04: len += rtas_print(" - Node off-line.\n"); break; case 0x05: len += rtas_print(" - Platform Dump maximum size change.\n"); break; default: len += rtas_print(" - Unknown subtype.\n"); break; } len += rtas_print(PRNT_FMT_L, "DRC Index:", io->drc_index); if (has_rpc_data) { len += rtas_print(PRNT_FMT_R, "RPC Field Length:", io->rpc_length); if (io->rpc_length != 0) len += print_raw_data(io->rpc_data, io->rpc_length); } else { len += rtas_print("\n"); } return len; } /** * print_re_io_scn * @brief print the contents of a RTAS event i/o section * * @param res rtas_event_scn pointer for i/o section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_io_scn(struct scn_header *shdr, int verbosity) { if (shdr->scn_id != RTAS_IO_SCN) { errno = EFAULT; return 0; } if (shdr->re->version == 6) return print_v6_io(shdr, verbosity); else return print_v4_io(shdr, verbosity); } librtas-1.3.10/librtasevent_src/rtas_v6_misc.c0000644000175100001440000004376012313120670020421 0ustar nfontusers/** * @file rtas_v6_misc.c * @brief Routines to print out various RTAS version 6 event sections * * Copyright (C) 2004 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fotenot */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * months * @brief array of month strings * * This array is indexed wih a hex value, thats what the extra blanks * are for so please leave them. */ static char *months[] = {"", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "", "", "", "", "", "", "Oct", "Nov", "Dec"}; void parse_rtas_date(struct rtas_date *rtas_date, struct rtas_date_raw *rawdate) { rtas_date->year = be16toh(rawdate->year); rtas_date->month = rawdate->month; rtas_date->day = rawdate->day; } void parse_rtas_time(struct rtas_time *rtas_time, struct rtas_time_raw *rawtime) { rtas_time->hour = rawtime->hour; rtas_time->minutes = rawtime->minutes; rtas_time->seconds = rawtime->seconds; rtas_time->hundredths = rawtime->hundredths; } void parse_v6_hdr(struct rtas_v6_hdr *v6hdr, struct rtas_v6_hdr_raw *rawv6) { v6hdr->id[0] = rawv6->id[0]; v6hdr->id[1] = rawv6->id[1]; v6hdr->length = be16toh(rawv6->length); v6hdr->version = rawv6->version; v6hdr->subtype = rawv6->subtype; v6hdr->creator_comp_id = be16toh(rawv6->creator_comp_id); } /** * print_v6_scn_hdr * @brief print the generic version 6 section header * * @param name section name * @param shdr rtas_v6_scn_hdr pointer * @param verbosity verbose level of output * @return number of bytes written */ int print_v6_hdr(char *name, struct rtas_v6_hdr *v6hdr, int verbosity) { int len; len = print_scn_title(name); if (verbosity > 1) { len += rtas_print("%-20s %c%c "PRNT_FMT_R, "Section ID:", v6hdr->id[0], v6hdr->id[1], "Section Length:", v6hdr->length); len += rtas_print(PRNT_FMT_2, "Version:", v6hdr->version, "Sub_type:", v6hdr->subtype); len += rtas_print(PRNT_FMT_R, "Component ID:", v6hdr->creator_comp_id); } return len; } /** * parse_main_a_scn * */ int parse_priv_hdr_scn(struct rtas_event *re) { struct rtas_priv_hdr_scn *privhdr; struct rtas_priv_hdr_scn_raw *rawhdr; privhdr = malloc(sizeof(*privhdr)); if (privhdr == NULL) { errno = ENOMEM; return -1; } memset(privhdr, 0, sizeof(*privhdr)); privhdr->shdr.raw_offset = re->offset; rawhdr = (struct rtas_priv_hdr_scn_raw *)(re->buffer + re->offset); parse_v6_hdr(&privhdr->v6hdr, &rawhdr->v6hdr); parse_rtas_date(&privhdr->date, &rawhdr->date); parse_rtas_time(&privhdr->time, &rawhdr->time); privhdr->creator_id = rawhdr->creator_id; privhdr->scn_count = rawhdr->scn_count; privhdr->creator_subid_hi = be32toh(rawhdr->creator_subid_hi); privhdr->creator_subid_lo = be32toh(rawhdr->creator_subid_lo); privhdr->plid = be32toh(rawhdr->plid); privhdr->log_entry_id = be32toh(rawhdr->log_entry_id); /* If the creator id is 'E', the the subsystem version is in ascii, * copy this info to a null terminated string. */ if (privhdr->creator_id == RTAS_PH_CREAT_SERVICE_PROC) { memcpy(privhdr->creator_subid_name, &privhdr->creator_subid_hi, 8); privhdr->creator_subid_name[8] = '\0'; } re->offset += 48; add_re_scn(re, privhdr, RTAS_PRIV_HDR_SCN); return 0; } /** * rtas_get_priv_hdr_scn * @brief retrieve the Private Header section of an RTAS Event * * @param re rtas_event pointer * @return pointer to rtas_event_scn on success, NULL on failure */ struct rtas_priv_hdr_scn * rtas_get_priv_hdr_scn(struct rtas_event *re) { return (struct rtas_priv_hdr_scn *)get_re_scn(re, RTAS_PRIV_HDR_SCN); } /** * print_re_priv_hdr_scn * @brief print the RTAS private header section * * @param res rtas_event_scn pointer to main a section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_priv_hdr_scn(struct scn_header *shdr, int verbosity) { struct rtas_priv_hdr_scn *privhdr; int len = 0; if (shdr->scn_id != RTAS_PRIV_HDR_SCN) { errno = EFAULT; return 0; } privhdr = (struct rtas_priv_hdr_scn *)shdr; len += print_v6_hdr("Private Header", &privhdr->v6hdr, verbosity); len += rtas_print("%-20s%x %s %x\n", "Date:", privhdr->date.day, months[privhdr->date.month], privhdr->date.year); len += rtas_print("%-20s%x:%x:%x:%x\n", "Time:", privhdr->time.hour, privhdr->time.minutes, privhdr->time.seconds, privhdr->time.hundredths); len += rtas_print("%-20s", "Creator ID:"); switch(privhdr->creator_id) { case 'C': len += rtas_print("Hardware Management Console"); break; case 'E': len += rtas_print("Service Processor"); break; case 'H': len += rtas_print("PHyp"); break; case 'W': len += rtas_print("Power Control"); break; case 'L': len += rtas_print("Partition Firmware"); break; case 'S': len += rtas_print("SLIC"); break; default: len += rtas_print("Unknown"); break; } len += rtas_print(" (%c).\n", privhdr->creator_id); if (verbosity >= 2) len += rtas_print(PRNT_FMT_R, "Section Count:", privhdr->scn_count); if (privhdr->creator_id == 'E') len += rtas_print("Creator Subsystem Name: %s.\n", privhdr->creator_subid_name); else len += rtas_print("Creator Subsystem Version: %08x%08x.\n", privhdr->creator_subid_hi, privhdr->creator_subid_lo); len += rtas_print(PRNT_FMT_2, "Platform Log ID:", privhdr->plid, "Log Entry ID:", privhdr->log_entry_id); len += rtas_print("\n"); return len; } /** * parse_usr_hdr_scn * */ int parse_usr_hdr_scn(struct rtas_event *re) { struct rtas_usr_hdr_scn *usrhdr; struct rtas_usr_hdr_scn_raw *rawhdr; usrhdr = malloc(sizeof(*usrhdr)); if (usrhdr == NULL) { errno = ENOMEM; return -1; } memset(usrhdr, 0, sizeof(*usrhdr)); usrhdr->shdr.raw_offset = re->offset; rawhdr = (struct rtas_usr_hdr_scn_raw *)(re->buffer + re->offset); parse_v6_hdr(&usrhdr->v6hdr, &rawhdr->v6hdr); usrhdr->subsystem_id = rawhdr->subsystem_id; usrhdr->event_data = rawhdr->event_data; usrhdr->event_severity = rawhdr->event_severity; usrhdr->event_type = rawhdr->event_type; usrhdr->action = be16toh(rawhdr->action); re->offset += RE_USR_HDR_SCN_SZ; add_re_scn(re, usrhdr, RTAS_USR_HDR_SCN); return 0; } /** * rtas_rtas_usr_hdr_scn * @brief retrieve the User Header section for an RTAS event. * * @param re rtas_event pointer * @return rtas_event_scn pointer to User Header section, NULL on failure */ struct rtas_usr_hdr_scn * rtas_get_usr_hdr_scn(struct rtas_event *re) { return (struct rtas_usr_hdr_scn *)get_re_scn(re, RTAS_USR_HDR_SCN); } /** * print_usr_hdr_subsystem_id * @brief Print the subsystem id from the Main B section * * @param mainb rtas_v6_main_b_scn pointer * @return number of bytes written */ int print_usr_hdr_subsystem_id(struct rtas_usr_hdr_scn *usrhdr) { unsigned int id = usrhdr->subsystem_id; int len = 0; len += rtas_print(PRNT_FMT" ", "Subsystem ID:", id); if ((id >= 0x10) && (id <= 0x1F)) len += rtas_print("(Processor, including internal cache)\n"); else if ((id >= 0x20) && (id <= 0x2F)) len += rtas_print("(Memory, including external cache)\n"); else if ((id >= 0x30) && (id <= 0x3F)) len += rtas_print("(I/O (hub, bridge, bus))\n"); else if ((id >= 0x40) && (id <= 0x4F)) len += rtas_print("(I/O adapter, device and peripheral)\n"); else if ((id >= 0x50) && (id <= 0x5F)) len += rtas_print("(CEC Hardware)\n"); else if ((id >= 0x60) && (id <= 0x6F)) len += rtas_print("(Power/Cooling System)\n"); else if ((id >= 0x70) && (id <= 0x79)) len += rtas_print("(Other Subsystems)\n"); else if ((id >= 0x7A) && (id <= 0x7F)) len += rtas_print("(Surveillance Error)\n"); else if ((id >= 0x80) && (id <= 0x8F)) len += rtas_print("(Platform Firmware)\n"); else if ((id >= 0x90) && (id <= 0x9F)) len += rtas_print("(Software)\n"); else if ((id >= 0xA0) && (id <= 0xAF)) len += rtas_print("(External Environment)\n"); else len += rtas_print("\n"); return len; } /** * print_usr_hdr_event * @brief print the RTAS User Header section type data * * @param mainb rtas_usr_hdr_scn pointer * @return number of bytes written */ int print_usr_hdr_event_data(struct rtas_usr_hdr_scn *usrhdr) { int len = 0; len += rtas_print(PRNT_FMT_R, "Event Data", usrhdr->event_data); len += rtas_print("\n"PRNT_FMT_R, "Event Type:", usrhdr->event_type); switch (usrhdr->event_type) { case 0x01: len += rtas_print("Miscellaneous, informational only.\n"); break; case 0x08: len += rtas_print("Dump notification.\n"); break; case 0x10: len += rtas_print("Previously reported error has been " "corrected by system.\n"); break; case 0x20: len += rtas_print("System resources manually " "deconfigured by user.\n"); break; case 0x21: len += rtas_print("System resources deconfigured by system due" "to prior error event.\n"); break; case 0x22: len += rtas_print("Resource deallocation event notification.\n"); break; case 0x30: len += rtas_print("Customer environmental problem has " "returned to normal.\n"); break; case 0x40: len += rtas_print("Concurrent maintenance event.\n"); break; case 0x60: len += rtas_print("Capacity upgrade event.\n"); break; case 0x70: len += rtas_print("Resource sparing event.\n"); break; case 0x80: len += rtas_print("Dynamic reconfiguration event.\n"); break; case 0xD0: len += rtas_print("Normal system/platform shutdown " "or powered off.\n"); break; case 0xE0: len += rtas_print("Platform powered off by user without normal " "shutdown.\n"); break; default: len += rtas_print("Unknown event type (%d).\n", usrhdr->event_type); break; } len += rtas_print("\n"PRNT_FMT_R, "Event Severity:", usrhdr->event_severity); switch (usrhdr->event_severity) { case 0x00: len += rtas_print("Informational or non-error event,\n"); break; case 0x10: len += rtas_print("Recovered error, general.\n"); break; case 0x20: len += rtas_print("Predictive error, general.\n"); break; case 0x21: len += rtas_print("Predictive error, degraded performance.\n"); break; case 0x22: len += rtas_print("Predictive error, fault may be corrected " "after platform re-IPL.\n"); break; case 0x23: len += rtas_print("Predictive Error, fault may be corrected " "after IPL, degraded performance.\n"); break; case 0x24: len += rtas_print("Predictive error, loss of redundancy.\n"); break; case 0x40: len += rtas_print("Unrecoverable error, general.\n"); break; case 0x41: len += rtas_print("Unrecoverable error, bypassed with " "degraded performance.\n"); break; case 0x44: len += rtas_print("Unrecoverable error, bypassed with " "loss of redundancy.\n"); break; case 0x45: len += rtas_print("Unrecoverable error, bypassed with loss of\n" "redundancy and performance.\n"); break; case 0x48: len += rtas_print("Unrecoverable error, bypassed with " "loss of function.\n"); break; case 0x60: len += rtas_print("Error on diagnostic test, general.\n"); break; case 0x61: len += rtas_print("Error on diagnostic test, resource may " "produce incorrect results.\n"); break; default: len += rtas_print("Unknown event severity (%d).\n", usrhdr->event_type); break; } len += rtas_print("\n"); return len; } /** * print_usr_hdr_action * @brief print the RTAS User Header Section action data * * @param mainb rtas_v6_us_hdr_scn pointer * @return number of bytes written */ int print_usr_hdr_action(struct rtas_usr_hdr_scn *usrhdr) { int len = 0; len += rtas_print(PRNT_FMT" ", "Action Flag:", usrhdr->action); switch (usrhdr->action) { case 0x8000: len += rtas_print("Service Action "); if (usrhdr->action & 0x4000) len += rtas_print("(hidden error) "); if (usrhdr->action & 0x0800) len += rtas_print("call home) "); len += rtas_print("Required.\n"); break; case 0x2000: len += rtas_print("Report Externally, "); if (usrhdr->action & 0x1000) len += rtas_print("(HMC only).\n"); else len += rtas_print("(HMC and Hypervisor).\n"); break; case 0x0400: len += rtas_print("Error isolation incomplete,\n" " " "further analysis required.\n"); break; case 0x0000: break; default: len += rtas_print("Unknown action flag (0x%08x).\n", usrhdr->action); } return len; } /** * print_re_usr_hdr_scn * @brief print the contents of a RTAS User Header section * * @param res rtas_event_scn ponter * @param verbosity verbose level of ouput * @return number of bytes written */ int print_re_usr_hdr_scn(struct scn_header *shdr, int verbosity) { struct rtas_usr_hdr_scn *usrhdr; int len = 0; if (shdr->scn_id != RTAS_USR_HDR_SCN) { errno = EFAULT; return 0; } usrhdr = (struct rtas_usr_hdr_scn *)shdr; len += print_v6_hdr("User Header", &usrhdr->v6hdr, verbosity); len += print_usr_hdr_subsystem_id(usrhdr); len += print_usr_hdr_event_data(usrhdr); len += print_usr_hdr_action(usrhdr); len += rtas_print("\n"); return len; } /** * parse_mtms * */ void parse_mtms(struct rtas_event *re, struct rtas_mtms *mtms) { rtas_copy(mtms->model, re, 8); mtms->model[8] = '\0'; rtas_copy(mtms->serial_no, re, 12); mtms->serial_no[12] = '\0'; } /** * print_mtms * */ int print_mtms(struct rtas_mtms *mtms) { int len; len = rtas_print("%-20s%s (tttt-mmm)\n", "Model/Type:", mtms->model); len += rtas_print("%-20s%s\n", "Serial Number:", mtms->serial_no); return len; } /** * parse_mt_scn * */ int parse_mt_scn(struct rtas_event *re) { struct rtas_mt_scn *mt; mt = malloc(sizeof(*mt)); if (mt == NULL) { errno = ENOMEM; return -1; } memset(mt, 0, sizeof(*mt)); mt->shdr.raw_offset = re->offset; rtas_copy(RE_SHDR_OFFSET(mt), re, sizeof(struct rtas_v6_hdr_raw)); parse_mtms(re, &mt->mtms); add_re_scn(re, mt, RTAS_MT_SCN); return 0; } /** * rtas_get_mtms_scn * @brief retrieve the Failing Enclosure (MTMS) section of an RTAS Event * * @param re rtas_event pointer * @return pointer to rtas_event_scn on success, NULL on failure */ struct rtas_mt_scn * rtas_get_mt_scn(struct rtas_event *re) { return (struct rtas_mt_scn *)get_re_scn(re, RTAS_MT_SCN); } /** * print_re_mt_scn * @brief print the contents of a Machine Type section * * @param res rtas_event_scn pointer for mtms section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_mt_scn(struct scn_header *shdr, int verbosity) { struct rtas_mt_scn *mt; int len = 0; if (shdr->scn_id != RTAS_MT_SCN) { errno = EFAULT; return 0; } mt = (struct rtas_mt_scn *)shdr; len += print_v6_hdr("Machine Type", (struct rtas_v6_hdr *)&mt->v6hdr, verbosity); len += print_mtms(&mt->mtms); len += rtas_print("\n"); return len; } /** * parse_generic_v6_scn * */ int parse_generic_v6_scn(struct rtas_event *re) { struct rtas_v6_generic *gen; struct rtas_v6_hdr_raw *rawhdr; gen = malloc(sizeof(*gen)); if (gen == NULL) { errno = ENOMEM; return -1; } memset(gen, 0, sizeof(*gen)); gen->shdr.raw_offset = re->offset; rawhdr = (struct rtas_v6_hdr_raw *)(re->buffer + re->offset); parse_v6_hdr(&gen->v6hdr, rawhdr); re->offset += RTAS_V6_HDR_SIZE; if (gen->v6hdr.length > RTAS_V6_HDR_SIZE) { uint32_t data_sz = gen->v6hdr.length - RTAS_V6_HDR_SIZE; gen->data = malloc(data_sz); if (gen->data == NULL) { errno = ENOMEM; return -1; } memset(gen->data, 0, data_sz); rtas_copy(gen->data, re, data_sz); } add_re_scn(re, gen, RTAS_GENERIC_SCN); return 0; } /** * print_re_generic_scn * */ int print_re_generic_scn(struct scn_header *shdr, int verbosity) { struct rtas_v6_generic *gen; uint32_t len = 0; if (shdr->scn_id != RTAS_GENERIC_SCN) { errno = EFAULT; return 0; } gen = (struct rtas_v6_generic *)shdr; len += print_v6_hdr("Unknown Section", &gen->v6hdr, 2); len += rtas_print("\n"); if (gen->data != NULL) { len += rtas_print("Raw Section Data:\n"); len += print_raw_data(gen->data, gen->v6hdr.length - sizeof(struct rtas_v6_hdr_raw)); } len += rtas_print("\n"); return len; } librtas-1.3.10/librtasevent_src/rtas_sp.c0000644000175100001440000001127712313120670017473 0ustar nfontusers/** * @file rtas_sp.c * @brief RTAS Service Processor section routines * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot * @author Jake Moilanen */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_sp_scn * */ int parse_sp_scn(struct rtas_event *re) { struct rtas_ibmsp_scn *sp; sp = malloc(sizeof(*sp)); if (sp == NULL) { errno = ENOMEM; return 1; } sp->shdr.raw_offset = re->offset; rtas_copy(RE_SHDR_OFFSET(sp), re, RE_V4_SCN_SZ); add_re_scn(re, sp, RTAS_CPU_SCN); return 0; } /** * rtas_get_ibm_sp_scn * @brief Retrieve the IBM Service Processor Log section of the RTAS Event * * @param re rtas_event pointer * @return rtas_event_scn pointer for IBM SP section */ struct rtas_ibmsp_scn * rtas_get_ibm_sp_scn(struct rtas_event *re) { return (struct rtas_ibmsp_scn *)get_re_scn(re, RTAS_IBM_SP_SCN); } /** * print_re_ibmsp_scn * @brief print the contents of a RTAS Service Processor section * * @param res rtas_evnt_scn pointer for IBM SP section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_ibmsp_scn(struct scn_header *shdr, int verbosity) { struct rtas_ibmsp_scn *sp; int len = 0; if (shdr->scn_id != RTAS_IBM_SP_SCN) { errno = EFAULT; return 0; } sp = (struct rtas_ibmsp_scn *)shdr; len += print_scn_title("Service Processor Section"); if (strcmp(sp->ibm, "IBM") != 0) len += rtas_print("This log entry may be corrupt (IBM " "signature malformed).\n"); if (sp->timeout) len += rtas_print("Timeout on communication response from " "service processor.\n"); if (sp->i2c_bus) len += rtas_print("I2C general bus error.\n"); if (sp->i2c_secondary_bus) len += rtas_print("I2C secondary bus error.\n"); if (sp->memory) len += rtas_print("Internal service processor memory error.\n"); if (sp->registers) len += rtas_print("Service processor error accessing special " "registers.\n"); if (sp->communication) len += rtas_print("Service processor reports unknown " "communcation error.\n"); if (sp->firmware) len += rtas_print("Internal service processor firmware error.\n"); if (sp->hardware) len += rtas_print("Other internal service processor hardware " "error.\n"); if (sp->vpd_eeprom) len += rtas_print("Service processor error accessing VPD EEPROM.\n"); if (sp->op_panel) len += rtas_print("Service processor error accessing Operator " "Panel.\n"); if (sp->power_controller) len += rtas_print("Service processor error accessing Power " "Controller.\n"); if (sp->fan_sensor) len += rtas_print("Service processor error accessing " "Fan Sensor.\n"); if (sp->thermal_sensor) len += rtas_print("Service processor error accessing " "Thermal Sensor.\n"); if (sp->voltage_sensor) len += rtas_print("Service processor error accessing " "Voltage Sensor.\n"); if (sp->serial_port) len += rtas_print("Service processor error accessing " "serial port.\n"); if (sp->nvram) len += rtas_print("Service processor detected NVRAM error.\n"); if (sp->rtc) len += rtas_print("Service processor error accessing real " "time clock.\n"); if (sp->jtag) len += rtas_print("Service processor error accessing JTAG/COP.\n"); if (sp->tod_battery) len += rtas_print("Service processor or RTAS detects loss of " "voltage \nfrom TOD battery.\n"); if (sp->heartbeat) len += rtas_print("Loss of heartbeat from Service processor.\n"); if (sp->surveillance) len += rtas_print("Service processor detected a surveillance " "timeout.\n"); if (sp->pcn_connection) len += rtas_print("Power Control Network general connection " "failure.\n"); if (sp->pcn_node) len += rtas_print("Power Control Network node failure.\n"); if (sp->pcn_access) len += rtas_print("Service processor error accessing Power " "Control Network.\n"); if (sp->sensor_token) len += rtas_print(PRNT_FMT_R, "Sensor Token:", sp->sensor_token); if (sp->sensor_index) len += rtas_print(PRNT_FMT_R, "Sensor Index:", sp->sensor_index); len += rtas_print("\n"); return len; } librtas-1.3.10/librtasevent_src/rtas_event.h0000644000175100001440000000521712313120670020174 0ustar nfontusers/** * @file rtas_event.h * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #ifndef _H_RTAS_EVENT #define _H_RTAS_EVENT #define PRNT_FMT "%-20s%08x" #define PRNT_FMT_L PRNT_FMT" " #define PRNT_FMT_R PRNT_FMT"\n" #define PRNT_FMT_2 PRNT_FMT_L PRNT_FMT_R #define PRNT_FMT_ADDR "%-20s%08x%08x\n" void rtas_copy(void *, struct rtas_event *, uint32_t); /* parse routines */ void parse_rtas_date(struct rtas_date *, struct rtas_date_raw *); void parse_rtas_time(struct rtas_time *, struct rtas_time_raw *); void parse_v6_hdr(struct rtas_v6_hdr *, struct rtas_v6_hdr_raw *); int parse_priv_hdr_scn(struct rtas_event *); int parse_usr_hdr_scn(struct rtas_event *); int parse_epow_scn(struct rtas_event *); int parse_io_scn(struct rtas_event *); int parse_dump_scn(struct rtas_event *); int parse_lri_scn(struct rtas_event *); int parse_mt_scn(struct rtas_event *); int parse_src_scn(struct rtas_event *); int parse_cpu_scn(struct rtas_event *); int parse_ibm_diag_scn(struct rtas_event *); int parse_mem_scn(struct rtas_event *); int parse_post_scn(struct rtas_event *); int parse_sp_scn(struct rtas_event *); int parse_vend_errlog_scn(struct rtas_event *); int parse_generic_v6_scn(struct rtas_event *); void parse_mtms(struct rtas_event *, struct rtas_mtms *); int parse_hotplug_scn(struct rtas_event *); /* print routines */ int print_re_hdr_scn(struct scn_header *, int); int print_re_exthdr_scn(struct scn_header *, int); int print_re_epow_scn(struct scn_header *, int); int print_re_io_scn(struct scn_header *, int); int print_re_cpu_scn(struct scn_header *, int); int print_re_ibm_diag_scn(struct scn_header *, int); int print_re_mem_scn(struct scn_header *, int); int print_re_post_scn(struct scn_header *, int); int print_re_ibmsp_scn(struct scn_header *, int); int print_re_vend_errlog_scn(struct scn_header *, int); int print_re_priv_hdr_scn(struct scn_header *, int); int print_re_usr_hdr_scn(struct scn_header *, int); int print_re_dump_scn(struct scn_header *, int); int print_re_lri_scn(struct scn_header *, int); int print_re_mt_scn(struct scn_header *, int); int print_re_src_scn(struct scn_header *, int); int print_re_generic_scn(struct scn_header *, int); int print_re_hotplug_scn(struct scn_header *, int); int print_mtms(struct rtas_mtms *); int print_scn_title(char *, ...); int print_v6_hdr(char *, struct rtas_v6_hdr *, int); int print_raw_data(char *, int); int rtas_print(char *fmt, ...); struct scn_header * get_re_scn(struct rtas_event *, int); void add_re_scn(struct rtas_event *, void *, int); int re_scn_id(struct rtas_v6_hdr_raw *); #endif librtas-1.3.10/librtasevent_src/rtas_hotplug.c0000644000175100001440000000621712313120670020531 0ustar nfontusers/** * @file rtas_hotplug.c * @brief RTAS version 6 Hotplug section routines * * Copyright (C) 2013 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Tyrel Datwyler */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_hotplug_scn * */ int parse_hotplug_scn(struct rtas_event *re) { struct rtas_hotplug_scn *hotplug; struct rtas_hotplug_scn_raw *rawhdr; hotplug = malloc(sizeof(*hotplug)); if (hotplug == NULL) { errno = ENOMEM; return -1; } hotplug->shdr.raw_offset = re->offset; rawhdr = (struct rtas_hotplug_scn_raw *)(re->buffer + re->offset); parse_v6_hdr(&hotplug->v6hdr, &rawhdr->v6hdr); hotplug->type = rawhdr->type; hotplug->action = rawhdr->action; hotplug->identifier = rawhdr->identifier; switch (hotplug->identifier) { case RTAS_HP_ID_DRC_NAME: /* Need to Fix up */ break; case RTAS_HP_ID_DRC_INDEX: hotplug->u1.drc_index = be32toh(rawhdr->u1.drc_index); break; case RTAS_HP_ID_DRC_COUNT: hotplug->u1.count = be32toh(rawhdr->u1.count); break; } /* TODO: Fixup scn size when drc_name is included */ re->offset += RE_HOTPLUG_SCN_SZ; add_re_scn(re, hotplug, RTAS_HP_SCN); return 0; } /** * rtas_get_hotplug_scn * @brief Retrieve the Hotplug section of the RTAS Event * * @param re rtas_event pointer * @return rtas_event_scn pointer to Hotplug section */ struct rtas_hotplug_scn * rtas_get_hotplug_scn(struct rtas_event *re) { return (struct rtas_hotplug_scn *)get_re_scn(re, RTAS_HP_SCN); } static char *hotplug_types[] = {"", "CPU", "Memory", "Slot", "PHB", "PCI"}; static char *hotplug_actions[] = {"", "Add", "Remove"}; static char *hotplug_ids[] = {"", "DRC Name", "DRC Index", "Count"}; /** * print_re_hotplug_scn * @brief Print the contents of a version 6 Hotplug section * * @param res rtas_event_scn pointer for Hotplug section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_hotplug_scn(struct scn_header *shdr, int verbosity) { struct rtas_hotplug_scn *hotplug; int len = 0; if (shdr->scn_id != RTAS_HP_SCN) { errno = EFAULT; return 0; } hotplug = (struct rtas_hotplug_scn *)shdr; len += print_v6_hdr("Hotplug section", &hotplug->v6hdr, verbosity); len += rtas_print(PRNT_FMT" (%s)\n", "Hotplug Type:", hotplug->type, hotplug_types[hotplug->type]); len += rtas_print(PRNT_FMT" (%s)\n", "Hotplug Action:", hotplug->action, hotplug_actions[hotplug->action]); len += rtas_print(PRNT_FMT" (%s)\n", "Hotplug Identifier:", hotplug->identifier, hotplug_ids[hotplug->identifier]); if (hotplug->identifier == RTAS_HP_ID_DRC_NAME) { len += rtas_print("%-20s%s", "Hotplug drc_name:", hotplug->u1.drc_name); } else if (hotplug->identifier == RTAS_HP_ID_DRC_INDEX) { len += rtas_print(PRNT_FMT_R, "Hotplug drc_index:", hotplug->u1.drc_index); } else { len += rtas_print(PRNT_FMT_R, "Hotplug count:", hotplug->u1.count); } len += rtas_print("\n"); return len; } librtas-1.3.10/librtasevent_src/rtas_src_codes.c0000644000175100001440000002202312313120670021004 0ustar nfontusers/** * @file rtas_src_codes.c * @brief SRC Section Codes * * Copyright (C) 2004 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ /** * @struct src_code * @brief structure to hold src codes and their description */ struct src_code { char *id; char *desc; }; /** * src_codes * @brief List of known SRC codes */ static struct src_code src_codes[] = { /* B1xx Codes - Service Processor Early Termination */ {"B1517200", "Invalid boot request"}, {"B1517201", "Service processor failure"}, {"B1517202", "The permanent and temporary firmware sides are both marked invalid"}, {"B1517203", "Error setting boot parameters"}, {"B1517204", "Error reading boot parameters"}, {"B1517205", "Boot code error"}, {"B1517206", "Unit check timer was reset"}, {"B1817200", "Invalid boot request"}, {"B1817201", "Service processor failure"}, {"B1817202", "The permanent and temporary firmware sides are both marked invalid"}, {"B1817203", "Error setting boot parameters"}, {"B1817204", "Error reading boot parameters"}, {"B1817205", "Boot code error"}, {"B1817206", "Unit check timer was reset"}, {"B1817207", "Error reading from NVRAM"}, {"B1817208", "Error writing to NVRAM"}, /* BAxx Codes - Partition Firmware reference codes */ {"BA000010", "The device data structure is corrupted"}, {"BA000020", "Incompatible firmware levels were found"}, {"BA000030", "An lpevent communication failure occurred"}, {"BA000040", "The firmware was unable to obtain the RTAS code lid details"}, {"BA000050", "The firmware was unable to load the RTAS code lid"}, {"BA000060", "The firmware was unable to obtain the open firmware code lid details"}, {"BA000070", "The firmware was unable to load the open firmware code lid"}, {"BA010000", "There is insufficient information to boot the partition"}, {"BA010001", "The client IP address is already in use by another network device"}, {"BA010002", "Cannot get gateway IP address"}, {"BA010003", "Cannot get server hardware address"}, {"BA010004", "Bootp failed"}, {"BA010005", "File transmission (TFTP) failed"}, {"BA010006", "The boot image is too large"}, {"BA020001", "Partition firmware password entry error"}, {"BA020009", "Invalid password entered - system locked"}, {"BA030011", "RTAS attempt to allocate memory failed"}, {"BA04000F", "Self test failed on device; no error or location code information available"}, {"BA040010", "Self test failed on device; can't locate package"}, {"BA050001", "Failed to reboot a partition in logical partition mode"}, {"BA050004", "Failed to locate service processor device tree node"}, {"BA05000A", "Failed to send boot failed message to the service processor"}, {"BA060003", "IP parameter requires 3 period characters"}, {"BA060004", "Invalid IP parameter"}, {"BA060005", "Invalid IP parameter (>255)"}, {"BA060007", "A keyboard was not found"}, {"BA060008", "No configurable adapters found by the remote IPL menu in the SMS utilities"}, {"BA06000B", "The system was not able to find an operating system on the devices in the boot list"}, {"BA06000C", "A pointer to the operating system was found in non-volatile storage"}, {"BA060020", "The environment variable \"boot-device\" exceeded the allowed character limit"}, {"BA060021", "The environment variable \"boot-device\" contained more than five entries"}, {"BA060022", "The environment variable \"boot-device\" contained an entry that exceeded 255 characters in length"}, {"BA080001", "An IDE device remained busy for a longer period than the time out period"}, {"BA080010", "An IDE device is busy longer than specified time-out period"}, {"BA080011", "An IDE command timed out; command is exceeding the period allowed to complete"}, {"BA080012", "The ATA command failed"}, {"BA080013", "The media is not present in the tray"}, {"BA080014", "The media has been changed"}, {"BA080015", "The packet command failed; the media might not be readable"}, {"BA090001", "SCSI DASD: test unit ready failed; hardware error"}, {"BA090002", "SCSI DASD: test unit ready failed; sense data available"}, {"BA090003", "SCSI DASD: send diagnostic failed; sense data available"}, {"BA090004", "SCSI DASD: send diagnostic failed: devofl cmd"}, {"BA100001", "SCSI tape: test unit ready failed; hardware error"}, {"BA100002", "SCSI tape: test unit ready failed; sense data available"}, {"BA100003", "SCSI tape: send diagnostic failed; sense data available"}, {"BA100004", "SCSI tape: send diagnostic failed: devofl cmd"}, {"BA110001", "SCSI changer: test unit ready failed; hardware error"}, {"BA110002", "SCSI changer: test unit ready failed; sense data available"}, {"BA110003", "SCSI changer: send diagnostic failed; sense data available"}, {"BA110004", "SCSI changer: send diagnostic failed: devofl command"}, {"BA120001", "On an undetermined SCSI device, test unit ready failed; hardware error"}, {"BA120002", "On an undetermined SCSI device, test unit ready failed; sense data available"}, {"BA120003", "On an undetermined SCSI device, send diagnostic failed; sense data available"}, {"BA120004", "On an undetermined SCSI device, send diagnostic failed; devofl command"}, {"BA130001", "SCSI CD-ROM: test unit ready failed; hardware error"}, {"BA130002", "SCSI CD-ROM: test unit ready failed; sense data available"}, {"BA130003", "SCSI CD-ROM: send diagnostic failed; sense data available"}, {"BA130004", "SCSI CD-ROM: send diagnostic failed: devofl command"}, {"BA130010", "USB CD-ROM: device remained busy longer than the time-out period"}, {"BA130011", "USB CD-ROM: execution of ATA/ATAPI command was not completed with the allowed time"}, {"BA130012", "USB CD-ROM: execution of ATA/ATAPI command failed"}, {"BA130013", "USB CD-ROM: bootable media is missing from the drive"}, {"BA130014", "USB CD-ROM: the media in the USB CD-ROM drive has been changed"}, {"BA130015", "USB CD-ROM: ATA/ATAPI packet command execution failed"}, {"BA140001", "SCSI read/write optical: test unit ready failed; hardware error"}, {"BA140002", "SCSI read/write optical: test unit ready failed; sense data available"}, {"BA140003", "SCSI read/write optical: send diagnostic failed; sense data available"}, {"BA140004", "SCSI read/write optical: send diagnostic failed; devofl command"}, {"BA150001", "PCI Ethernet BNC/RJ-45 or PCI Ethernet AUI/RJ-45 adapter: internal wrap test failure"}, {"BA151001", "10/100 MBPS Ethernet PCI adapter: internal wrap test failure"}, {"BA151002", "10/100 MBPS Ethernet card"}, {"BA160001", "PCI auto LANstreamer token ring adapter: failed to complete hardware initialization"}, {"BA161001", "PCI token ring adapter: failed to complete hardware initialization"}, {"BA170000", "NVRAMRC initialization failed; device test failed"}, {"BA170100", "NVRAM data validation check failed"}, {"BA170201", "The firmware was unable to expand target partition - saving configuration variable"}, {"BA170202", "The firmware was unable to expand target partition - writing error log entry"}, {"BA170203", "The firmware was unable to expand target partition - writing VPD data"}, {"BA170210", "Setenv/$Setenv parameter error - name contains a null character"}, {"BA170211", "Setenv/$Setenv parameter error - value contains a null character"}, {"BA170998", "NVRAMRC script evaluation error - command line execution error"}, {"BA170999", "NVRAMRC script evaluation error - stack unbalanced on completion"}, {"BA180008", "PCI device Fcode evaluation error"}, {"BA180010", "PCI probe error, bridge in freeze state"}, {"BA180011", "PCI bridge probe error, bridge is not usable"}, {"BA180012", "PCI device runtime error, bridge in freeze state"}, {"BA180100", "FDDI adapter Fcode driver is not supported on this system"}, {"BA180101", "Stack underflow from fibre-channel adapter"}, {"BA188000", "An unsupported adapter was found in a PCI slot"}, {"BA188001", "EEH recovered a failing I/O adapter"}, {"BA188002", "EEH could not recover the failed I/O adapter"}, {"BA190001", "Firmware function to get/set time-of-day reported an error"}, {"BA210000", "Partition firmware reports a default catch"}, {"BA210001", "Partition firmware reports a stack underflow was caught"}, {"BA210002", "Partition firmware was ready before standout was ready"}, {"BA250010", "dlpar error in open firmware"}, {"BA278001", "Failed to flash firmware: invalid image file"}, {"BA278002", "Flash file is not designed for this eServer platform"}, {"BA278003", "Unable to lock the firmware update lid manager"}, {"BA278004", "An invalid firmware update lid was requested"}, {"BA278005", "Failed to flash a firmware update lid"}, {"BA278006", "Unable to unlock the firmware update lid manager"}, {"BA278007", "Failed to reboot the system after a firmware flash update"}, {NULL, NULL} }; librtas-1.3.10/librtasevent_src/rtas_vend.c0000644000175100001440000000723612313120670020005 0ustar nfontusers/** * @file rtas_vend.c * @brief RTAS error log detial for vendor specific extensions * * Copyright (C) IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_ibm diag_scn * */ int parse_ibm_diag_scn(struct rtas_event *re) { struct rtas_ibm_diag_scn *ibmdiag; ibmdiag = malloc(sizeof(*ibmdiag)); if (ibmdiag == NULL) { errno = ENOMEM; return -1; } ibmdiag->shdr.raw_offset = re->offset; rtas_copy(RE_SHDR_OFFSET(ibmdiag), re, sizeof(uint32_t)); add_re_scn(re, ibmdiag, RTAS_IBM_DIAG_SCN); return 0; } /** * rtas_get_ibm_diag_scn * @brief Retrieve the IBM Diagnostic Log section of the RTAS Event * * @param re rtas_event pointer * @return rtas_event_scn pointer for diagnostics log section */ struct rtas_ibm_diag_scn * rtas_get_ibm_diag_scn(struct rtas_event *re) { return (struct rtas_ibm_diag_scn *)get_re_scn(re, RTAS_IBM_DIAG_SCN); } /** * print_re_ibm_diag_scn * @brief print the contents of an IBM diagnostics log section * * @param res rtas_event_scn pointer for IBM diagnostics log section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_ibm_diag_scn(struct scn_header *shdr, int verbosity) { struct rtas_ibm_diag_scn *ibmdiag; int len = 0; if (shdr->scn_id != RTAS_IBM_DIAG_SCN) { errno = EFAULT; return -1; } ibmdiag = (struct rtas_ibm_diag_scn *)shdr; len += print_scn_title("IBM Diagnostics Section"); len += rtas_print(PRNT_FMT"\n", "Event ID:", ibmdiag->event_id); return len; } /** * parse_vend_specific_scn * */ int parse_vend_errlog_scn(struct rtas_event *re) { struct rtas_vend_errlog *ve; ve = malloc(sizeof(*ve)); if (ve == NULL) { errno = ENOMEM; return -1; } ve->shdr.raw_offset = re->offset; rtas_copy(RE_SHDR_OFFSET(ve), re, 4); /* See if there is additional data */ ve->vendor_data_sz = re->event_length - re->offset; if (ve->vendor_data_sz > 0) { ve->vendor_data = malloc(ve->vendor_data_sz); if (ve->vendor_data == NULL) { errno = ENOMEM; return -1; } rtas_copy(ve->vendor_data, re, ve->vendor_data_sz); } add_re_scn(re, ve, RTAS_VEND_ERRLOG_SCN); return 0; } /** * rtas_get_vend_specific * @brief retrive a vendor specific section of the RTAS event * * @param re parsed rtas event * @return reference to a rtas_event_scn on success, NULL on failure */ struct rtas_vend_errlog_scn * rtas_get_vend_errlog_scn(struct rtas_event *re) { return (struct rtas_vend_errlog_scn *)get_re_scn(re, RTAS_VEND_ERRLOG_SCN); } /** * print_re_vend_specific_scn * @brief print the contents of a vendor specific section * * @param res rtas_event_scn to print * @param verbosity verbose level * @return number of bytes written */ int print_re_vend_errlog_scn(struct scn_header *shdr, int verbosity) { struct rtas_vend_errlog *ve; int len = 0; if (shdr->scn_id != RTAS_VEND_ERRLOG_SCN) { errno = EFAULT; return -1; } ve = (struct rtas_vend_errlog *)shdr; len += print_scn_title("Vendor Error Log Section"); len += rtas_print("%-20s%c%c%c%c\n", "Vendor ID:", ve->vendor_id[0], ve->vendor_id[1], ve->vendor_id[2], ve->vendor_id[3]); if (ve->vendor_data != NULL) { len += rtas_print("Raw Vendor Error Log:\n"); len += print_raw_data(ve->vendor_data, ve->vendor_data_sz); } return len; } librtas-1.3.10/librtasevent_src/rtas_lri.c0000644000175100001440000000546412313120670017640 0ustar nfontusers/** * @file rtas_lri.c * @brief RTAS Logical Resource Identification (LRI) Data routines * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_lri_scn * */ int parse_lri_scn(struct rtas_event *re) { struct rtas_lri_scn *lri; struct rtas_lri_scn_raw *rawhdr; lri = malloc(sizeof(*lri)); if (lri == NULL) { errno = ENOMEM; return -1; } lri->shdr.raw_offset = re->offset; rawhdr = (struct rtas_lri_scn_raw *)(re->buffer + re->offset); parse_v6_hdr(&lri->v6hdr, &rawhdr->v6hdr); lri->resource = rawhdr->resource; lri->capacity = be16toh(rawhdr->capacity); lri->lri_mem_addr_lo = be32toh(rawhdr->lri_mem_addr_lo); lri->lri_mem_addr_hi = be32toh(rawhdr->lri_mem_addr_hi); re->offset += RE_LRI_SCN_SZ; add_re_scn(re, lri, RTAS_LRI_SCN); return 0; } /** * rtas_get_lri_scn * @brief Retrieve the Logical Resource ID (LRI) section of the RTAS Event * * @param re rtas_event pointer * @return rtas_event_scn pointer for lri section */ struct rtas_lri_scn * rtas_get_lri_scn(struct rtas_event *re) { return (struct rtas_lri_scn *)get_re_scn(re, RTAS_LRI_SCN); } /** * print_re_lriscn * @brief print the contents of a LRI section * * @param res rtas_event_scn pointer for lri section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_lri_scn(struct scn_header *shdr, int verbosity) { struct rtas_lri_scn *lri; int len = 0; if (shdr->scn_id != RTAS_LRI_SCN) { errno = EFAULT; return 0; } lri = (struct rtas_lri_scn *)shdr; len += print_v6_hdr("Logical Resource Identification", &lri->v6hdr, verbosity); len += rtas_print(PRNT_FMT" ", "Resource Type:", lri->resource); switch (lri->resource) { case 0x10: len += rtas_print("(Processor)\n" PRNT_FMT_R, "CPU ID:", lri->lri_cpu_id); break; case 0x11: len += rtas_print("(Shared Processor)\n" PRNT_FMT_R, "Entitled Capacity:", lri->capacity); break; case 0x40: len += rtas_print("(Memory Page)\n" PRNT_FMT_ADDR, "Logical Address:", lri->lri_mem_addr_hi, lri->lri_mem_addr_lo); break; case 0x41: len += rtas_print("(Memory LMB)\n" PRNT_FMT_R, "DRC Index:", lri->lri_drc_index); break; default: len += rtas_print("(Unknown Resource)\n"); break; } len += rtas_print("\n"); return len; } librtas-1.3.10/librtasevent_src/rtas_epow.c0000644000175100001440000001355712313120670020026 0ustar nfontusers/** * @file rtas_epow.c * @brief RTAS event EPOW section routines * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot * @author Jake Moilanen */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * parse_epow_scn * */ int parse_epow_scn(struct rtas_event *re) { struct rtas_epow_scn *epow; struct rtas_v6_epow_scn_raw *rawhdr; epow = malloc(sizeof(*epow)); if (epow == NULL) { errno = ENOMEM; return -1; } memset(epow, 0, sizeof(*epow)); epow->shdr.raw_offset = re->offset; if (re->version < 6) { rtas_copy(RE_SHDR_OFFSET(epow), re, RE_V4_SCN_SZ); } else { rawhdr = (struct rtas_v6_epow_scn_raw *)(re->buffer + re->offset); parse_v6_hdr(&epow->v6hdr, &rawhdr->v6hdr); epow->sensor_value = (rawhdr->data1 & 0xF0) >> 4; epow->action_code = rawhdr->data1 & 0x0F; epow->event_modifier = rawhdr->event_modifier; memcpy(epow->reason_code, rawhdr->reason_code, 8); re->offset += RE_EPOW_V6_SCN_SZ; } add_re_scn(re, epow, RTAS_EPOW_SCN); return 0; } /** * rtas_get_epow_scn * @brief Retrieve the Environmental and Power Warning (EPOW) section * * @param re rtas_event pointer * @return rtas_event_scn pointer for the epow section */ struct rtas_epow_scn * rtas_get_epow_scn(struct rtas_event *re) { return (struct rtas_epow_scn *)get_re_scn(re, RTAS_EPOW_SCN); } /** * print_v4_epow * @brief print the contents of a pre-version 6 EPOW section * * @param res rtas_event_scn pointer for epow section * @param verbosity verbose level of output * @return number of bytes written */ static int print_v4_epow(struct scn_header *shdr, int verbosity) { struct rtas_epow_scn *epow = (struct rtas_epow_scn *)shdr; int version = shdr->re->version; int len = 0; len += print_scn_title("EPOW Warning"); len += rtas_print(PRNT_FMT_R, "EPOW Sensor Value:", epow->sensor_value); if (version >= 3) { if (epow->sensor) { len += rtas_print("EPOW detected by a sensor\n"); len += rtas_print(PRNT_FMT_2, "Sensor Token:", epow->sensor_token, "Sensor Index:", epow->sensor_index); len += rtas_print(PRNT_FMT_2, "Sensor Value:", epow->sensor_value, "Sensor Status:", epow->sensor_status); } if (epow->power_fault) len += rtas_print("EPOW caused by a power fault.\n"); if (epow->fan) len += rtas_print("EPOW caused by fan failure.\n"); if (epow->temp) len += rtas_print("EPOW caused by over-temperature condition.\n"); if (epow->redundancy) len += rtas_print("EPOW warning due to loss of redundancy.\n"); if (epow->CUoD) len += rtas_print("EPOW warning due to CUoD Entitlement " "Exceeded.\n"); if (epow->general) len += rtas_print("EPOW general power fault.\n"); if (epow->power_loss) len += rtas_print("EPOW power fault due to loss of power " "source.\n"); if (epow->power_supply) len += rtas_print("EPOW power fault due to internal power " "supply failure.\n"); if (epow->power_switch) len += rtas_print("EPOW power fault due to activation of " "power switch.\n"); } if ((version == 4) && (epow->battery)) len += rtas_print("EPOW power fault due to internal battery " "failure.\n"); len += rtas_print("\n"); return len; } /** * print_v6_epow * @brief print the contents of a RTAS version 6 EPOW section * * @param res rtas_event_scn pointer for epow section * @param verbosity verbose level of output * @return number of bytes written */ static int print_v6_epow(struct scn_header *shdr, int verbosity) { struct rtas_epow_scn *epow = (struct rtas_epow_scn *)shdr; int len = 0; len += print_v6_hdr("EPOW Warning", &epow->v6hdr, verbosity); len += rtas_print(PRNT_FMT_2, "Sensor Value:", epow->sensor_value, "Action Code:", epow->action_code); len += rtas_print(PRNT_FMT_R, "EPOW Event:", epow->event_modifier); switch (epow->event_modifier) { case RTAS_EPOW_MOD_NA: break; case RTAS_EPOW_MOD_NORMAL_SHUTDOWN: len += rtas_print(" - Normal System Shutdown with no " "additional delay.\n"); break; case RTAS_EPOW_MOD_UTILITY_POWER_LOSS: len += rtas_print(" - Loss of utility power, system is " "running on UPS/battery.\n"); break; case RTAS_EPOW_MOD_CRIT_FUNC_LOSS: len += rtas_print(" - Loss of system critical functions, " "system should be shutdown.\n"); break; case RTAS_EPOW_MOD_AMBIENT_TEMP: len += rtas_print(" - Ambient temperature too high, " "system should be shutdown.\n"); break; default: len += rtas_print(" - Unknown action code.\n"); } len += rtas_print("Platform specific reason code:"); len += print_raw_data(epow->reason_code, 8); len += rtas_print("\n"); return len; } /** * print_re_epow_scn * @brief print the contents of a RTAS EPOW section * * @param res rtas_event_scn pointer to epow section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_epow_scn(struct scn_header *shdr, int verbosity) { if (shdr->scn_id != RTAS_EPOW_SCN) { errno = EFAULT; return 0; } if (shdr->re->version == 6) return print_v6_epow(shdr, verbosity); else return print_v4_epow(shdr, verbosity); } librtas-1.3.10/librtasevent_src/Makefile0000644000175100001440000000237012313120670017306 0ustar nfontusers# # Makefile for librtasevent_src # # Copyright (C) 2005 IBM Corporation # Common Public License Version 1.0 (see COPYRIGHT) # include ../rules.mk LIBRE_SONAME = librtasevent.so LIBRE = $(LIBRE_SONAME).$(VERSION) LIBRE_OBJS = get_rtas_event.o print_rtas_event.o rtas_cpu.o rtas_dump.o \ rtas_epow.o rtas_io.o rtas_lri.o rtas_mem.o rtas_post.o \ rtas_sp.o rtas_srcfru.o rtas_v6_misc.o rtas_vend.o rtas_hotplug.o LIBRE_HDRS = librtasevent.h librtasevent_v4.h librtasevent_v6.h HEADERS = $(LIBRE_HDRS) rtas_event.h CFLAGS += -fPIC -DPIC -I. LDFLAGS += -shared -Wl,-soname -Wl,$(LIBRE_SONAME).$(MAJOR_NO) all: $(LIBRE_OBJS) $(HEADERS) @echo "LD librtasevent_src/$(LIBRE)..." @$(CC) $(LIBRE_OBJS) $(LDFLAGS) -o $(LIBRE) install: @$(call install_lib,$(LIBRE),$(DESTDIR)) @$(call install_inc,$(LIBRE_HDRS),$(DESTDIR)) @ln -sf $(LIBRE) $(DESTDIR)/$(LIB_DIR)$(call is_lib64,$(LIBRE))/$(LIBRE_SONAME) @ln -sf $(LIBRE) $(DESTDIR)/$(LIB_DIR)$(call is_lib64,$(LIBRE))/$(LIBRE_SONAME).1 uninstall: @$(call uninstall_lib,$(LIBRE),$(DESTDIR)) @$(call uninstall_inc,$(LIBRE_HDRS),$(DESTDIR)) @rm -f $(DESTDIR)/$(LIB_DIR)$(call is_lib64,$(LIBRE))/$(LIBRE_SONAME) clean: @echo "Cleaning up $(WORK_DIR) files..." @rm -f $(LIBRE_OBJS) $(LIBRE_SONAME) $(LIBRE) librtas-1.3.10/librtasevent_src/get_rtas_event.c0000644000175100001440000002701712313120670021030 0ustar nfontusers/** * @file get_rtas_event.c * @brief librtasevent routines to parse RTAS events * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Nathan Fontenot */ #include #include #include #include #include "librtasevent.h" #include "rtas_event.h" /** * rtas_copy * @brief front end for common memcpy calls * * NOTE: This will chang the value of the rtas_event offset value * * @param to place to copy data to * @param re rtas_event pointer * @param size amount to copy */ void rtas_copy(void *to, struct rtas_event *re, uint32_t size) { memcpy(to, (re->buffer + re->offset), size); re->offset += size; } /** * cleanup_rtas_event * @brief free the structures related to a parsed rtas event * * @param re rtas_event pointer * @return 0 on success, !0 on failure */ int cleanup_rtas_event(struct rtas_event *re) { struct scn_header *scn; if (re == NULL) return 0; scn = re->event_scns; while (scn != NULL) { struct scn_header *tmpscn = scn->next; switch (scn->scn_id) { case RTAS_VEND_ERRLOG_SCN: { struct rtas_vend_errlog *ve = (struct rtas_vend_errlog *)scn; if (ve->vendor_data != NULL) free(ve->vendor_data); break; } case RTAS_PSRC_SCN: case RTAS_SSRC_SCN: { struct rtas_fru_hdr *fruhdr; struct rtas_fru_scn *fru; struct rtas_src_scn *src = (struct rtas_src_scn *)scn; fru = src->fru_scns; while (fru != NULL) { struct rtas_fru_scn *tmpfru = fru->next; fruhdr = fru->subscns; while (fruhdr != NULL) { struct rtas_fru_hdr *tmphdr = fruhdr->next; free(fruhdr); fruhdr = tmphdr; } free(fru); fru = tmpfru; } break; } case RTAS_GENERIC_SCN: { struct rtas_v6_generic *gen = (struct rtas_v6_generic *)scn; if (gen->data != NULL) free(gen->data); break; } } free(scn); scn = tmpscn; } free(re); return 0; } /** * add_re_scn * @brief Add a rtas event section to the section list * * @param re rtas_event pointer to add this section to * @param scn pointer to start of rtas event section * @param scn_id id of the section to be added * return pointer to newly created rtas_event_scn */ void add_re_scn(struct rtas_event *re, void *scn, int scn_id) { struct scn_header *shdr = (struct scn_header *)scn; shdr->next = NULL; shdr->re = re; shdr->scn_id = scn_id; if (re->event_scns == NULL) { re->event_scns = shdr; } else { struct scn_header *tmp_hdr = re->event_scns; while (tmp_hdr->next != NULL) tmp_hdr = tmp_hdr->next; tmp_hdr->next = shdr; } } /** * re_scn_id * @brief Convert the two character section id into an internal identifier * * @param shdr rtas_v6_hdr pointer * @return section identifier on success, -1 on failure */ int re_scn_id(struct rtas_v6_hdr_raw *v6hdr) { if (strncmp(v6hdr->id, RTAS_DUMP_SCN_ID, 2) == 0) return RTAS_DUMP_SCN; if (strncmp(v6hdr->id, RTAS_EPOW_SCN_ID, 2) == 0) return RTAS_EPOW_SCN; if (strncmp(v6hdr->id, RTAS_IO_SCN_ID, 2) == 0) return RTAS_IO_SCN; if (strncmp(v6hdr->id, RTAS_LRI_SCN_ID, 2) == 0) return RTAS_LRI_SCN; if (strncmp(v6hdr->id, RTAS_MTMS_SCN_ID, 2) == 0) return RTAS_MT_SCN; if (strncmp(v6hdr->id, RTAS_PSRC_SCN_ID, 2) == 0) return RTAS_PSRC_SCN; if (strncmp(v6hdr->id, RTAS_SSRC_SCN_ID, 2) == 0) return RTAS_SSRC_SCN; if (strncmp(v6hdr->id, RTAS_HP_SCN_ID, 2) == 0) return RTAS_HP_SCN; return -1; } /** * _get_re_scn * @brief the real work for retreiving rtas event sections * * @param res rtas_event_scn pointer at which to start search * @param scn_id section id to search for * @return rtas_event_scn on success, NULL on failure */ static struct scn_header * _get_re_scn(struct scn_header *scn_hdr, int scn_id) { for ( ; scn_hdr != NULL; scn_hdr = scn_hdr->next) { if (scn_hdr->scn_id == scn_id) return scn_hdr; } return NULL; } /** * get_re_scn * @brief find the specified section on the list of sections * * NOTE: this function has been split just so we can have common place * to check for NULL 're' pointers (no sense checking everywhere we * call this). * * @param re rtas_event pointer * @param scn_id id of the section to find * @return rtas_event_scn on success, NULL on failure */ struct scn_header * get_re_scn(struct rtas_event *re, int scn_id) { if (re == NULL) { errno = EFAULT; return NULL; } return _get_re_scn(re->event_scns, scn_id); } /** * parse_re_hdr */ static void parse_re_hdr(struct rtas_event *re, struct rtas_event_hdr *re_hdr) { struct rtas_event_hdr_raw *rawhdr; rawhdr = (struct rtas_event_hdr_raw *)(re->buffer + re->offset); re_hdr->version = rawhdr->version; re_hdr->severity = (rawhdr->data1 & 0xE0) >> 5; re_hdr->disposition = (rawhdr->data1 & 0x1C) >> 3; re_hdr->extended = (rawhdr->data1 & 0x04) >> 2; re_hdr->initiator = (rawhdr->data2 & 0xF0) >> 4; re_hdr->target = rawhdr->data2 & 0x0F; re_hdr->type = rawhdr->type; re_hdr->ext_log_length = be32toh(rawhdr->ext_log_length); re->offset += RE_EVENT_HDR_SZ; add_re_scn(re, re_hdr, RTAS_EVENT_HDR); } static void parse_re_exthdr(struct rtas_event *re, struct rtas_event_exthdr *rex_hdr) { struct rtas_event_exthdr_raw *rawhdr; rawhdr = (struct rtas_event_exthdr_raw *)(re->buffer + re->offset); rex_hdr->valid = (rawhdr->data1 & 0x80) >> 7; rex_hdr->unrecoverable = (rawhdr->data1 & 0x40) >> 6; rex_hdr->recoverable = (rawhdr->data1 & 0x20) >> 5; rex_hdr->unrecoverable_bypassed = (rawhdr->data1 & 0x10) >> 4; rex_hdr->predictive = (rawhdr->data1 & 0x08) >> 3; rex_hdr->newlog = (rawhdr->data1 & 0x04) >> 2; rex_hdr->bigendian = (rawhdr->data1 & 0x02) >> 1; rex_hdr->platform_specific = (rawhdr->data2 & 0x80) >> 7; rex_hdr->platform_value = rawhdr->data2 & 0x0F; rex_hdr->power_pc = (rawhdr->data3 & 0x80) >> 7; rex_hdr->addr_invalid = (rawhdr->data3 & 0x10) >> 4; rex_hdr->format_type = rawhdr->data3 & 0x0F; rex_hdr->non_hardware = (rawhdr->data4 & 0x80) >> 7; rex_hdr->hot_plug = (rawhdr->data4 & 0x40) >> 6; rex_hdr->group_failure = (rawhdr->data4 & 0x20) >> 5; rex_hdr->residual = (rawhdr->data4 & 0x08) >> 3; rex_hdr->boot = (rawhdr->data4 & 0x04) >> 2; rex_hdr->config_change = (rawhdr->data4 & 0x02) >> 1; rex_hdr->post = rawhdr->data4 & 0x01; parse_rtas_time(&rex_hdr->time, &rawhdr->time); parse_rtas_date(&rex_hdr->date, &rawhdr->date); re->offset += RE_EXT_HDR_SZ; add_re_scn(re, rex_hdr, RTAS_EVENT_EXT_HDR); } /** * parse_v6_rtas_event * @brief parse a version 6 RTAS event * * @param re rtas_event pointer * @return rtas_event pointer on success, NULL on failure */ struct rtas_event * parse_v6_rtas_event(struct rtas_event *re) { struct rtas_v6_hdr_raw *v6hdr; char *ibm; ibm = re->buffer + re->offset; /* Sanity Check for "IBM" string */ if (strncmp(ibm, "IBM", 3) != 0) { cleanup_rtas_event(re); errno = EFAULT; return NULL; } re->offset += 4; /* IBM + NULL */ if (parse_priv_hdr_scn(re) != 0) { cleanup_rtas_event(re); return NULL; } if (parse_usr_hdr_scn(re) != 0) { cleanup_rtas_event(re); return NULL; } while (re->offset < re->event_length) { int scn_id, rc; v6hdr = (struct rtas_v6_hdr_raw *)(re->buffer + re->offset); scn_id = re_scn_id(v6hdr); switch (scn_id) { case RTAS_EPOW_SCN: rc = parse_epow_scn(re); break; case RTAS_IO_SCN: rc = parse_io_scn(re); break; case RTAS_DUMP_SCN: rc = parse_dump_scn(re); break; case RTAS_LRI_SCN: rc = parse_lri_scn(re); break; case RTAS_MT_SCN: rc = parse_mt_scn(re); break; case RTAS_PSRC_SCN: case RTAS_SSRC_SCN: #if __BYTE_ORDER == __LITTLE_ENDIAN fprintf(stderr, "Parsing RTAS SRC Sections on little endian not supported\n"); rc = -1; #else rc = parse_src_scn(re); #endif break; case RTAS_HP_SCN: rc = parse_hotplug_scn(re); break; default: rc = parse_generic_v6_scn(re); break; } if (rc) { cleanup_rtas_event(re); re = NULL; break; } } return re; } /** * parse_rtas_event * @brief parse an rtas event creating a populated rtas_event structure * * @param buf buffer containing the binary RTAS event * @param buflen length of the buffer 'buf' * @return pointer to rtas_event */ struct rtas_event * parse_rtas_event(char *buf, int buflen) { struct rtas_event *re; struct rtas_event_hdr *re_hdr; struct rtas_event_exthdr *rex_hdr; int rc; re = malloc(sizeof(*re)); if (re == NULL) { errno = ENOMEM; return NULL; } memset(re, 0, sizeof(*re)); re->buffer = buf; re->event_no = -1; re_hdr = malloc(sizeof(*re_hdr)); if (re_hdr == NULL) { cleanup_rtas_event(re); errno = ENOMEM; return NULL; } parse_re_hdr(re, re_hdr); /* Validate the length of the buffer passed in. */ re->event_length = re_hdr->ext_log_length + RE_EVENT_HDR_SZ; if (re->event_length > buflen) { cleanup_rtas_event(re); return NULL; } re->version = re_hdr->version; if (re_hdr->extended == 0) return re; rex_hdr = malloc(sizeof(*rex_hdr)); if (rex_hdr == NULL) { cleanup_rtas_event(re); errno = ENOMEM; return NULL; } parse_re_exthdr(re, rex_hdr); if (re_hdr->version == 6) return parse_v6_rtas_event(re); switch (rex_hdr->format_type) { case RTAS_EXTHDR_FMT_CPU: rc = parse_cpu_scn(re); break; case RTAS_EXTHDR_FMT_EPOW: rc = parse_epow_scn(re); break; case RTAS_EXTHDR_FMT_IBM_DIAG: rc = parse_ibm_diag_scn(re); break; case RTAS_EXTHDR_FMT_IO: rc = parse_io_scn(re); break; case RTAS_EXTHDR_FMT_MEMORY: rc = parse_mem_scn(re); break; case RTAS_EXTHDR_FMT_POST: rc = parse_post_scn(re); break; case RTAS_EXTHDR_FMT_IBM_SP: rc = parse_sp_scn(re); break; case RTAS_EXTHDR_FMT_VEND_SPECIFIC_1: case RTAS_EXTHDR_FMT_VEND_SPECIFIC_2: rc = parse_vend_errlog_scn(re); break; default: errno = EFAULT; rc = -1; break; } if ((rc == 0) && (re->offset < re->event_length)) rc = parse_vend_errlog_scn(re); if (rc) { cleanup_rtas_event(re); re = NULL; } return re; } librtas-1.3.10/libofdt_src/0000755000175100001440000000000012313120670014565 5ustar nfontuserslibrtas-1.3.10/libofdt_src/common.h0000644000175100001440000000235012313120670016226 0ustar nfontusers/** * @file common.h * * Copyright (C) 2008/2009 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Manish Ahuja mahuja@us.ibm.com */ #ifndef _COMMON_H_ #define _COMMON_H_ #include "libofdt.h" #define DRC_STR_MAX 48 #define OFDT_BASE "/proc/device-tree" struct delete_struct { struct delete_struct *next; struct node *dnode; struct property *dprop; }; struct dr_connector { char name[DRC_STR_MAX]; char type[DRC_STR_MAX]; unsigned int index; unsigned int powerdomain; struct dr_connector *next; }; struct of_list_prop { char *_data; char *val; int n_entries; }; struct drc_prop_grp { struct of_list_prop drc_names; struct of_list_prop drc_types; struct of_list_prop drc_indexes; struct of_list_prop drc_domains; }; struct dr_connector *get_drc_info(const char *); void free_drc_info(struct dr_connector *); char *of_to_full_path(const char *); struct dr_connector *find_drc_info(const char *); int file_exists(const char *, const char *); void create_drc_properties(struct node *, struct dr_connector *); void add_property(struct node *, const char *, char *); static inline void *zalloc(int sz) { void *tmp = malloc(sz); if (tmp) memset(tmp, 0, sz); return tmp; } #endif /* COMMON_H_ */ librtas-1.3.10/libofdt_src/libofdt.so.1.3.80000755000175100001440000012231112313120670017224 0ustar nfontusersELF@@@8@(%;;> > > h @>P>P>P$$dtP;D;D;DdtR> > > GNUR|?,oJxI %- )+(,#" % ' $*!  & ,R8 !"%&(*,6 #4Xq, |/fEBhOT˅pBG5.2/.zq3 > NR % "fu|0Ym_S@ BAA@@DCDG`C8pCPD8AC A9GPBGXZA@BlB@|__gmon_start___init__cxa_finalize_Jv_RegisterClassestreeheaddelete_listfreefopenfreadfclosestrlenstrncpymallocmemsetadd_propertyfile_existsget_drc_infofree_drc_infocreate_drc_propertiesopendirsprintfreaddirclosedirmemcpysnprintfofdt_getfind_drc_infoofdt_putofdt_get_propertystrncmpofdt_get_property_by_namestrrchrofdt_property_puttraverse_devicetree__libofdt_finistrcpylibc.so.6__xstat_edata__bss_start_endlibofdt.so.1GLIBC_2.4GLIBC_2.3 ii ii@@@(@Ø@ 9@(Ø@8@@Ø@P@XØ@h$@pØ@@Ø@ @Ø@@Ø@@@Ø@!@Ø@"<AØA"AØA(#<A0ØA@$HAHØAX%$A`ØAp&AxØA'AØA'AØA((AØA(AØA)AØB*BØB+B ØB0,\B8ØBH-lBPØB`-BhØBx/(BØB/BØB/BØB18BØB2BØB3BØC4CØC 4C(ØC85C@ØCP6CXØCh8CpØC8PCØCG@C@C>0C>@C>HC>(C:C:C: D:8D:@D:XD :`D(:xD0:D8:D@:DH:DP:DX:D`:Dh;Dp;Dx;(D;0>8*&C&C&C&D(&DDDD,EEE0!EH E` Ex"E E E EEFF F8%FPFhF+FFFFFGG(A(b8}ibHB@N |!/A KA(H`H!`8!p|N A(bX}ibhB`N A(b`}ibpBhN A(b}ibBN A(bh}ibxBpN A(b(}ib8B0N A(b}ib(B N A(b@}ibPBHN A(bp}ibBxN A(b}ibBN A(bH}ibXBPN A(b}ibBN A(b0}ib@B8N A(b }ib0B(N A(bP}ib`BXN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(bx}ibBN A(b}ibBN A(b}ibBN A(b}ib BN A(b}ibBN A(b}ibBN ``|€!q/@/A" iK}A("0뢀(~}=HP})t;@@H```8 x$}=* A(| iIN!A(~@A88!|N `|b8!/A,"@/A A(| iIN!A(8!p|N |!|? x8`H9|`x/@8 H/@8|xH`|`x/A8 Hx 8 x ||xH|`x? ? /AKEA(8 H\肀PKA(|`xxx/@K A(8 H ?)}#Kx8|xxKA(|`xxKA(HK%A(|`xp?p8 ||xH|`x? ? /@KqA(8 H?)p|}#Kx|xKA(?;KA(|`xx|xK]A(KuA(|`xx|xK5A( ` |x8?P|N |!q|? x|`x||xKA(|`xpp/A |p8|xK-A(p|x8?|N |!q|? x?8 |xK|`xp? ?p ?p 8?|N |!Q|? x8`K|`xpp/@8HH?p;KA(|`xx|xKA(?p p`|x8?|N |!|? x肀XKeA(|`x/AKuA(|`xxH x8`K|`x/@,x?HAxKmA(80H肀`KA(|`x/AKA(KaA(|`x/@x?HAxKA(80H@`?9)8|x肀h}&KxKA(89?|x}$KxH`|`x/@x T&/@@<8|xxKy|`xp? ?p ?p HDx T&9 a)H@(?8 |x8KA(H`KA(|`x/@H`KA(x?HAxKA(0`0|x8?P|N |!q|? x8`K|`xpp/A0?p "p ?p "pp H`8?|N |!q|? x8`K-|`xpp/A0?p "p ?p "pp H`8?|N |!q|? x? pH(`px?p pxK-A(p/@`8?|N |!q|? xH`H`? /AL? |xK? /@,? /AKKA(Hp? /A0>@>H>(::: :8:@:X:`:x:::::::;;;(;0GCC: (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]ospWG,$8, Y,\ ,8< Yvadd_property ofdt_get oofdt_put ofdt_get_property ofdt_get_property_by_name yofdt_property_put traverse_devicetree __libofdt_fini ,treehead Bdelete_listm Y hget_drc_info free_drc_info file_exists create_drc_properties find_drc_infoY__stat Uv3$,\$8|QSlint8MM8M)8ii`iiiZ1- b# # # # # #( #0 j#8 ,#@ #H #P ) #X ?"#` $#h &b#p W*b#t W,#x 80F# 1T# [2# Q6,# [?# =H# DI# KJ# RK# YL-# Nb# iP2#    # # :b# ,  B H # #  F# e!?# o"#  DIR <y z# {i#w  /   p# # H #  #  {# 6 # D b#$  p#( _ #0 v #8 #@ D #H  #X $ #h 8#x 8#  8# ^ q ^#  n#  #  # # n  R  q ^#  !n#  "# _ ## $#  %# r)  )# # #p q# g#0 IM#` M#d  #h/$0qB0B8t~rcb~fp&0~sb' ~P<b~,4 Mvsz4b0tmp5`X RW0qWB8WtY`j@ i0iB8Rk@L@!4B08rcbvdvdevRvbufnv+vsb ~ _vM!"< 5%0new)`"<" r%0new)`"#< 0tmpht`c#<$Hh 70tmp`$H%$ I0tmp)h e)`8%$& 70tmp9)h e9)`!Zb&'O YB0Y8sb[ ~rc\b~"|'' o{B0 }nw 1~w 7wrcbw#H'(( 0"(((6 R0qB8 tXlenbP"g() y$dirB0 tw qw nwrcbw#)* 0#*+ 70 t`%+,\j ,tmp)h e)`&3  GP& ) GX %vs3,\8i$8|QSlint8MM8M)8ii`iiiZ1- b# # # # # #( #0 j#8 ,#@ #H #P ) #X ?"#` $#h &b#p W*b#t W,#x 80F# 1T# [2# Q6,# [?# =H# DI# KJ# RK# YL-# Nb# iP2#    # # :b# ,  B Hy} z# {i#w  /24M   p# # H #  #  {# 6 # D b#$  p#( _ #0 v #8 #@ D T#H  T#X $ T#h 8#x 8#  8#  q #  #  #  # #   R  q #  !#  "# _ ## $#  %# p q# g#0 IM#` M#d  #hl  #val!# G"b#`%] &# '# (#0 )#H'b,\-l%B0%B8buf&c&bfp(wrc)bwdir*w Cb-l-YBB0qBB8DvsbE~rcFbvhYb-/(QWB0W8tXrcZbTbZbP,4/(/ sz4b0tmp5`M//=M0ub/188tB0At8rcvbP182A0+b23 bA0Gb8Ubh; b` bXjP Hib@My34 ZB0U~~~b~rcb~O44l Q0b45 B0B8rcbvsbvw56  R0Q8~drc~rcb~E`>68 S=B0sb?nrc@bnyAobufBw]CnUv88L1Q|SlintB;;B;)B^`^^^Zyz#{^#e##H##p#6{# DW#$e#(_#0v#8#@D#H#X$#hB#xB#B#3W88L G 2G buf2R M % : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I : ; : ; I< !I/.: ; ' I@: ; I 4: ; I 4: ; I  U U: ; I .? : ; ' @ .: ; ' @.: ;' @: ;I 4: ;I 4: ;I !.: ;' I@".? : ;' I@#.? : ;' @$: ;I %.? : ;@&4: ; I?  % : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I : ; !I/ : ; I8 .: ; ' I@: ; I : ; I 4: ; I 4: ; I .: ; ' @.? : ; ' I@.? : ; ' @.? : ;' I@: ;I 4: ;I 4: ;I .? : ;' @.? : ;' I@% $ > $ > : ; I$ >  : ;  : ; I8 .? : ; ' I@ : ; I : ; I  I &Ie /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/include/bits/usr/includedtree.ccommon.hstddef.htypes.hstdio.hlibio.hdirent.htime.hstat.hlibofdt.hdirent.h $K=).Y @u=!.a K=.g g==.m LZK= .x /!huu=v!K= K=4>/!  tuh0Y=K>(.[ uLY=K>.f #?[hKKup >K>/! iK?=KF% iK?=KF% h>//=9O iKKK/=#KK//=r< i=/YLYZL=#/r<J i=/YZYZLC/r<JxZ>Y.t u>g6uv=! lg= .y gg=0=/! g/ vZY2z y/! lg= .v u=6>u//! g/ iKKKKgZ;O#KgZ;Ol< [=//KKKY=y< J /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/include/bits/usr/includedrc.ccommon.hstddef.htypes.hstdio.hlibio.htime.hstdint.hstat.hlibofdt.h ,\& .t #uu=4=/! yu/ YuK .v =Y5Z/!Iuu=v!Z\0twZu=<q = <u =Dz =?/! gKYKYKYKY ===>KhgugLq! g4g= .w />==/!g= yuY z?>hKsv#=mvlt3  m fx =nz u==L/! t ../bits../time../sysdeps/unix/sysv/linux/powerpc/bitsstat.ctypes.htime.hstat.h 82/-// xA $$`TA~D $PA~D $ |PA~D $TA~D $@xP A~D $!PA~D $"<PA~D $"|PA~D $#< PA~D $$HPA~D $%$PA~D $&PA~D $'P A~D $'@PA~D $((PA~D $(P A~D $)@PA~D $*PA~D $+PA~D  xA $,\P A~D $-lP A~D $-8PA~D $/(PA~D /8H@D $/PPA~D $18PA~D $2PA~D $3PA~D $4DPA~D $4P A~D $5pPA~D $6PA~D  xA 8 > >0>0>H>H>P>P@@@@CCCCsDDG@D 0D90DDEW]!F;-a;fGkXHT0p_wo 1jPx'l   8 h p  p 9 :;D;X> >0>H>P@@CCDG@ !"#$ @8-@P9>HF> T>0bG@qGH C>H>(;@h`@@@x@@A|&A( 2A@FAXZApntB0BHB`8BxB8BPBB  4 U | Ch<  Ch<  pC h@u>@ 8 `    8 ^ 8q  0  P 2 HX    h x" J>PScAl  @|A@ "GXC8p(:CPHZBi|GPDC A@G`CD&B:NbDiA@{A@Binitfini.ccrtstuff.c__do_global_dtors_auxframe_dummy__JCR_LIST____CTOR_LIST____DTOR_LIST__completed.6751dtor_idx.6753__do_global_ctors_aux__JCR_END____CTOR_END____FRAME_END__dtree.callocate_propertyzallocallocate_nodebuild_nodeadd_node_to_dladd_prop_to_dldelete_propertiesremove_nodedelete_node_from_dldelete_prop_from_dlpath_to_full_dtpathdrc.cget_propertyget_property_sizeget_of_list_propofdt_swap_intget_drc_prop_grpfree_drc_propsbuild_connectors_liststat.c00000014.plt_call.__gmon_start__+000000010.plt_call.find_drc_info+000000010.plt_call.add_property+000000010.plt_call.readdir@@GLIBC_2.3+000000010.plt_call.malloc@@GLIBC_2.3+0__stat00000010.plt_call.strncmp@@GLIBC_2.3+000000010.plt_call.memset@@GLIBC_2.3+0stat00000010.plt_call.get_drc_info+000000010.plt_call.opendir@@GLIBC_2.3+000000010.plt_call.fopen@@GLIBC_2.3+0__dso_handle__DTOR_END__00000010.plt_call.free_drc_info+000000010.plt_call.__xstat@@GLIBC_2.3+000000010.plt_call.file_exists+000000010.plt_call.strrchr@@GLIBC_2.3+000000010.plt_call.strcpy@@GLIBC_2.3+000000010.plt_call.memcpy@@GLIBC_2.3+0__glink_PLTresolve00000010.plt_call.printf@@GLIBC_2.4+000000010.plt_call.free@@GLIBC_2.3+000000010.plt_call.create_drc_properties+000000010.plt_call.closedir@@GLIBC_2.3+000000010.plt_call.fread@@GLIBC_2.3+000000010.plt_call.fclose@@GLIBC_2.3+000000010.plt_call.__cxa_finalize@@GLIBC_2.3+000000010.plt_call.snprintf@@GLIBC_2.4+000000010.plt_call.strlen@@GLIBC_2.3+000000010.plt_call.sprintf@@GLIBC_2.4+000000010.plt_call.strncpy@@GLIBC_2.3+000000010.plt_call.traverse_devicetree+0_DYNAMICfree@@GLIBC_2.3ofdt_getstrrchr@@GLIBC_2.3__gmon_start___Jv_RegisterClassesadd_propertyofdt_get_property_fini__cxa_finalize@@GLIBC_2.3strlen@@GLIBC_2.3delete_listcreate_drc_properties__xstat@@GLIBC_2.3malloc@@GLIBC_2.3find_drc_infomemset@@GLIBC_2.3__libofdt_finistrncmp@@GLIBC_2.3printf@@GLIBC_2.4treeheadfread@@GLIBC_2.3opendir@@GLIBC_2.3__bss_startreaddir@@GLIBC_2.3memcpy@@GLIBC_2.3file_existsofdt_put_endstrcpy@@GLIBC_2.3free_drc_infotraverse_devicetreeclosedir@@GLIBC_2.3snprintf@@GLIBC_2.4_edataofdt_property_putstrncpy@@GLIBC_2.3fclose@@GLIBC_2.3fopen@@GLIBC_2.3ofdt_get_property_by_namesprintf@@GLIBC_2.4_initget_drc_infolibrtas-1.3.10/libofdt_src/drc.c0000644000175100001440000001516112313120670015505 0ustar nfontusers/** * @file drc.c * @brief Common routines for building DRC Info. * @author Borrowed/Adapted code from drmgr authored by "Nathan Fontenont". * @author Manish Ahuja mahuja@us.ibm.com * * Copyright (C) IBM Corporation 2009 */ #include #include #include #include #include #include #include #include "common.h" static inline unsigned int ofdt_swap_int(unsigned int data) { #if __BYTE_ORDER == __LITTLE_ENDIAN return bswap_32(data); #else return data; #endif } /** * get_property * @brief retrieve a device-tree property from /proc * * @param path path to the property to retrieve * @param name name of the property to retrieve * @param prop of_list_prop to retrieve property for * @returns 0 on success, !0 otherwise */ static int get_property(const char *path, const char *property, void *buf, int buf_sz) { FILE *fp; int rc; char dir[OFDT_MAX_PATH]; if ((path == NULL) || (property == NULL)) return -1; sprintf(dir, "%s/%s", path, property); fp = fopen(dir, "r"); if (fp == NULL) return -1; rc = fread(buf, buf_sz, 1, fp); fclose(fp); return 0; } /** * get_proprety_size * @brief Retrieve the size of a device tree property * * @param path full path to property * @param name property name * @returns size of property */ static int get_property_size(const char *path, const char *name) { char file_path[OFDT_MAX_PATH]; struct stat sb; int rc; sprintf(file_path, "%s/%s", path, name); rc = stat(file_path, &sb); return sb.st_size; } /** * get_of_list_prop * @breif retrieve the specified open firmware property list * * @param full_path * @param prop_name * @param prop * @returns 0 on success, !0 otherwise */ static int get_of_list_prop(const char *full_path, char *prop_name, struct of_list_prop *prop) { int rc, size; size = get_property_size(full_path, prop_name); prop->_data = zalloc(size); if (prop->_data == NULL) return -1; rc = get_property(full_path, prop_name, prop->_data, size); if (rc) { free(prop->_data); return -1; } prop->n_entries = ofdt_swap_int(*(uint *)prop->_data); prop->val = prop->_data + sizeof(uint); return 0; } /** * get_drc_prop_grp * * @param full_path * @param group * @returns 0 on success, !0 otherwise */ static int get_drc_prop_grp(const char *full_path, struct drc_prop_grp *group) { int rc; memset(group, 0, sizeof(*group)); rc = get_of_list_prop(full_path, "ibm,drc-names", &group->drc_names); if (rc) return rc; rc = get_of_list_prop(full_path, "ibm,drc-types", &group->drc_types); if (rc) return rc; rc = get_of_list_prop(full_path, "ibm,drc-indexes", &group->drc_indexes); if (rc) return rc; rc = get_of_list_prop(full_path, "ibm,drc-power-domains", &group->drc_domains); if (rc) return rc; return 0; } /** * free_drc_props * @brief free the properties associated with a drc group * * @param group */ static void free_drc_props(struct drc_prop_grp *group) { if (group->drc_names.val) free(group->drc_names._data); if (group->drc_types.val) free(group->drc_types._data); if (group->drc_indexes.val) free(group->drc_indexes._data); if (group->drc_domains.val) free(group->drc_domains._data); } /** * build_connectors_group * * @param group * @param n_entries * @param list * @returns 0 on success, !0 otherwise */ static int build_connectors_list(struct drc_prop_grp *group, int n_entries, struct dr_connector *list) { struct dr_connector *entry; unsigned int *index_ptr; unsigned int *domain_ptr; char *name_ptr; char *type_ptr; int i; index_ptr = (unsigned int *)group->drc_indexes.val; domain_ptr = (unsigned int *)group->drc_domains.val; name_ptr = group->drc_names.val; type_ptr = group->drc_types.val; for (i = 0; i < n_entries; i++) { entry = &list[i]; entry->index = *(index_ptr++); entry->powerdomain = *(domain_ptr++); strncpy(entry->name, name_ptr, DRC_STR_MAX); name_ptr += strlen(name_ptr) + 1; strncpy(entry->type, type_ptr, DRC_STR_MAX); type_ptr += strlen(type_ptr) + 1; if (i == (n_entries - 1)) entry->next = NULL; else entry->next = &list[i+1]; } return 0; } /** * get_dr_connectors * * NOTE:Callers of this function are expected to free drc_list themselves * * @param of_path * @param drc_list * @param n_drcs * @returns 0 on success, !0 otherwise */ struct dr_connector *get_drc_info(const char *of_path) { struct dr_connector *list = NULL; struct of_list_prop *drc_names; struct drc_prop_grp prop_grp; int n_drcs; int rc; rc = get_drc_prop_grp(of_path, &prop_grp); if (rc) return NULL; drc_names = &prop_grp.drc_names; n_drcs = drc_names->n_entries; list = zalloc(n_drcs * sizeof(struct dr_connector)); if (list) rc = build_connectors_list(&prop_grp, n_drcs, list); free_drc_props(&prop_grp); return list; } /** * free_drc_info * * @param drc_list */ void free_drc_info(struct dr_connector *drc_list) { free(drc_list); } /** * file_exists * * @brief Function that checks whether ibm,my-drc-index exists. * * @param path * @returns 0 on success, !0 otherwise */ int file_exists(const char *path, const char *fname) { int rc; struct stat sb; char file_path[OFDT_MAX_PATH]; sprintf(file_path, "%s/%s", path, fname); rc = stat(file_path, &sb); return !rc; } /** * create_drc_props * * @brief Function that creates drc,type/name/powerdomain. * * @param dr_connector * @param parent node * @param path */ void create_drc_properties(struct node *node, struct dr_connector *drc_list) { char powerdomain[OFDT_MAX_NAME]; struct dr_connector *drc; int rc; uint32_t drc_index; if (drc_list == NULL) return; rc = get_property(node->path, "ibm,my-drc-index", &drc_index, sizeof(drc_index)); if (rc) return; drc_index = ofdt_swap_int(drc_index); for (drc = drc_list; drc; drc = drc->next) { if (drc_index == drc->index) break; } if (!drc) return add_property(node, "ibm,drc-name", drc->name); add_property(node, "ibm,drc-type", drc->type); sprintf(powerdomain, "%u", drc->powerdomain); add_property(node, "ibm,drc-powerdomain", powerdomain); } /** * find_drc_info * * @brief Function that parses prev sub-directories until it finds * ibm,drc-index file * * @param path * @returns dr_connector type. */ struct dr_connector *find_drc_info(const char *path) { struct stat sb; int rc; char tmp_path[OFDT_MAX_PATH]; char buf[OFDT_MAX_PATH]; char *slash; sprintf(buf, "%s", path); do { sprintf(tmp_path, "%s/%s", buf, "ibm,drc-indexes"); rc = stat(buf, &sb); if (rc == 0) return get_drc_info(buf); slash = strrchr(buf, '/'); if (slash) *slash = '\0'; } while (slash); return NULL; } librtas-1.3.10/libofdt_src/README0000644000175100001440000000442512313120670015452 0ustar nfontusers In most linux systems, most of the hardware bindings and values are exported through /proc/devic-tree. This needs to be accessed frequently to query values to enable or disable many functions on the system. Here, We attempt to provide an API to read values and parse data that maybe required for many utilities to do commonly required operations. Please note that this API only reads and parses values. It does not modify anything. The API is as follows: 1: void ofdt_get(const char *path) This function accepts a relative path to the deivce-tree. It can also be NULL. If the value is null, the base path to the device-tree /proc/device-tree is assumed. If the value is non null, a relative path is assumed and /proc/device-tree is added to the path to fully qualify it. This function builds a complete tree from the given path. It processes sub-directories and will also parse ibm,indexes file and find appropriate values for "ibm,drc-name", "ibm,drc-type" & "ibm,drc-powerdomain" for the approprate "ibm,my-drc-index" files. It fills these out and sends back a pointer to the the head of the tree. It is always nice to call ofdt_put after this function has been called with the right head pointer. 2: void ofdt_put(struct node *delete) This function takes a node pointer type, normally this is the head of a tree structure that needs to be freed. It is normally a good idea to free the stuff allocated. But just incase you forget, there is a fini_routine that takes care of it. 3: struct property *ofdt_get_property(struct node *prop_node, const char * name); This function takes a path to the property and a node pointer. The node pointer is normally the head of a fully populated tree structure formed by ofdt_get() with appropriate values. The function returns the requested property from the given tree. 4: struct property * ofdt_get_property_by_name(const char * path); This function returns a structure of type property. It builds and returns the property from the given path. It does not build a tree. It will also not return any property that does not exist like for eg: when a ibm,my-drc-index exists and other properties do not, it will return a NULL pointer. 5: void ofdt_property_put(struct property * to_delete); This function frees all properties that are passed in to this function. librtas-1.3.10/libofdt_src/libofdt.h0000644000175100001440000000201512313120670016357 0ustar nfontusers/** * @file libofdt.h * * Copyright (C) 2008/2009 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Manish Ahuja mahuja@us.ibm.com */ #ifndef _LIBOFDT_H_ #define _LIBOFDT_H_ #include #include #include #include #include #include #define OFDT_MAX_NAME 128 /* Max name length */ #define OFDT_MAX_PATH 1024 /* Max Path length */ struct property { char name[OFDT_MAX_NAME]; char path[OFDT_MAX_PATH]; char *value; struct property *next; struct node * parent; }; struct node { char name[OFDT_MAX_NAME]; char path[OFDT_MAX_PATH]; struct property *properties; struct node *child; struct node *parent; struct node *sibling; }; extern struct node *ofdt_get(const char *); extern void ofdt_put(struct node *); extern struct property *ofdt_get_property(struct node *, const char *); extern struct property *ofdt_get_property_by_name(const char *); extern void ofdt_property_put(struct property *); #endif /* _LIBOFDT_H_ */ librtas-1.3.10/libofdt_src/dtree.c0000644000175100001440000002277012313120670016044 0ustar nfontusers/** * @file dtree.c * * Copyright (C) 2008/2009 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author Manish Ahuja mahuja@us.ibm.com */ #include "common.h" struct node *treehead = NULL; struct delete_struct *delete_list = NULL; void __libofdt_fini() __attribute__((destructor)); /** * allocate_property * @brief allocates property * * @param name * @param path * @param value * @param size * @return property */ static struct property *allocate_property(const char *name, const char *path, char *value) { struct property *prop; int rc; prop = zalloc(sizeof(*prop)); if (!prop) return NULL; if (!value) { FILE *fp; struct stat sb; rc = stat(path, &sb); if (rc) return NULL; prop->value = zalloc(sb.st_size + 1); if (prop->value) { free(prop); return NULL; } fp = fopen(path, "r"); if (fp == NULL) { free(prop); return NULL; } rc = fread(prop->value, 1, sb.st_size, fp); fclose(fp); } else { int length = strlen(value); prop->value = zalloc(length + 1); if (!prop->value) { free(prop); return NULL; } strncpy(prop->value, value, length); } /* struct alredy nulled out, not copying last null */ strncpy(prop->path, path, strlen(path)); strncpy(prop->name, name, strlen(name)); return prop; } /** * add_property * @brief adds property to head of queue and then calls allocate_property * * @param name * @param path * @param value * @param size */ void add_property(struct node *node, const char *name, char *value) { struct property *prop; prop = allocate_property(name, node->path, value); prop->next = node->properties; node->properties = prop; } /** * allocate_node * @brief allocates the actual node. * * @param parent * @param path * @returns node */ static struct node *allocate_node(struct node *parent, const char* path) { struct node *node; node = zalloc(sizeof(*node)); if (node == NULL) return NULL; strncpy(node->path, path, strlen(path)); node->parent = parent; return node; } /** * build_node * @brief the heart of this library, that builds and creates the whole tree. * * @param dirname * @param parent_node * @param parent_list * @returns node */ static struct node *build_node(const char *path, struct dr_connector *my_drc_info) { int rc; DIR *d; struct dirent *de; struct node *node; char buf[OFDT_MAX_PATH]; struct dr_connector *child_drc_info; /* Check to see if we need to create drc info for any child nodes */ if (file_exists(path, "ibm,drc-indexes")) child_drc_info = get_drc_info(path); else child_drc_info = my_drc_info; node = allocate_node(NULL, path); if (!node) { if (child_drc_info != my_drc_info) free_drc_info(child_drc_info); return NULL; } if (file_exists(path, "ibm,my-drc-index")) create_drc_properties(node, my_drc_info); d = opendir(path); if (!d) { if (child_drc_info != my_drc_info) free_drc_info(child_drc_info); return NULL; } while((de = readdir(d)) != NULL ) { struct stat sb; sprintf(buf, "%s/%s", path, de->d_name); rc = stat(buf, &sb); if (rc) break; if (S_ISDIR(sb.st_mode)) { struct node *child; child = build_node(buf, child_drc_info); child->sibling = node->child; node->child = child; } else if (S_ISREG(sb.st_mode)) { add_property(node, de->d_name, NULL); } } closedir(d); if (child_drc_info != my_drc_info) free_drc_info(child_drc_info); return node; } /** * add_node_to_dl * @brief Adds nodes to delete list. * * @param node to add */ static void add_node_to_dl(struct node *to_add) { struct delete_struct *new; new = zalloc(sizeof(*new)); if (!new) return; new->dnode = to_add; new->next = delete_list; delete_list = new; } /** * add_prop_to_dl * @brief Adds property to delete list. * * @param prop to add */ static void add_prop_to_dl(struct property *to_add) { struct delete_struct *new; new = zalloc(sizeof(*new)); if (!new) return; new->dprop = to_add; new->next = delete_list; delete_list = new; } /** * delete_properties * @brief deletes chained properties. * * @param prop to add */ static void delete_properties(struct node *to_delete) { struct property *tmp, *prop; prop = to_delete->properties; while (prop != NULL) { tmp = prop; prop = prop->next; free(tmp); } } /** * remove_node * @brief removes sub-nodes and nodes recursively. * * @param node head. */ static void remove_node(struct node *head) { struct node *tmp; while ((head->child) || (head->sibling)) { if (head->child) { remove_node(head->child); if (head->sibling == NULL && (head->properties)) { delete_properties(head); free(head); break; } } if (head->sibling) { if (head->properties) delete_properties(head); tmp = head; head = head->sibling; free(tmp); } } } /** * delete_node_from_dl * @brief removes-any nodes being asked to delete. * * @param delete_node */ static void delete_node_from_dl(struct node *to_delete) { struct delete_struct *tmp, *prev; tmp = delete_list; while (tmp) { if (tmp->dnode == to_delete) { remove_node(tmp->dnode); if (tmp == delete_list) delete_list = tmp->next; else prev->next = tmp->next; free(tmp); break; } prev = tmp; tmp = tmp->next; } } /** * delete_prop_from_dl * @brief removes-any properties being asked to delete. * * @param delete_prop */ static void delete_prop_from_dl(struct property *to_delete) { struct delete_struct *tmp, *prev; tmp = delete_list; while (tmp) { if (tmp->dprop == to_delete) { free(tmp->dprop); if (tmp == delete_list) delete_list = tmp->next; else prev->next = tmp->next; free(tmp); return; } prev = tmp; tmp = tmp->next; } } /** * base_path * @brief builds appropriate path and returns it. * * The path specified can be either a full path to a device tree, or * a relative path to the real device tree at /proc/device-tree. NOTE * that the relative path of NULL implies the base device tree at * /proc/device-tree * * @param dir */ static int path_to_full_dtpath(const char *user_path, char *full_path) { struct stat sb; int rc; memset(full_path, 0, OFDT_MAX_PATH); if (!user_path) { /* NULL implies /proc/device-tree */ sprintf(full_path, "%s", OFDT_BASE); return 0; } rc = stat(user_path, &sb); if (rc == 0) { /* Valid path specified, copy to full path */ snprintf(full_path, OFDT_MAX_PATH, "%s", user_path); return 0; } /* build OFDT_BASE/user_path and validate */ snprintf(full_path, OFDT_MAX_PATH, "%s/%s", OFDT_BASE, user_path); rc = stat(full_path, &sb); return rc; } /** * ofdt_get * @brief builds the device tree from the given path. * * @param path * @returns node */ struct node *ofdt_get(const char * path) { char full_path[OFDT_MAX_PATH]; struct dr_connector *drc_info; struct node *head; int rc; rc = path_to_full_dtpath(path, full_path); if (rc) return NULL; drc_info = find_drc_info(full_path); head = build_node(full_path, drc_info); if (head) add_node_to_dl(head); free_drc_info(drc_info); return head; } /** * ofdt_put * @brief releases the device tree from the given node pointer. * * @param path * @returns node */ void ofdt_put(struct node *delete) { delete_node_from_dl(delete); } /** * ofdt_get_property * @brief returns the appropriate property pointer from given tree. It takes * path. * * @param node * @param path * @returns property */ struct property *ofdt_get_property(struct node *node, const char *name) { struct property *prop; int len = strlen(name); for (prop = node->properties; prop; prop = prop->next) { if (strncmp(prop->name, name, len) == 0) return prop; } return NULL; } /** * ofdt_get_property_by_name * @brief builds and returns the appropriate property pointer from given path. * * @param path * @returns property */ struct property * ofdt_get_property_by_name(const char * dir) { struct property *prop; char *name; char path[OFDT_MAX_PATH]; int rc; rc = path_to_full_dtpath(dir, path); if (rc) return NULL; name = strrchr(path, '/'); if (!name) return NULL; /* move past the '/' character */ name++; prop = allocate_property(name, path, NULL); add_prop_to_dl(prop); return prop; } /** * ofdt_property_put * @brief Deletes properties from delete list. * * @param property */ void ofdt_property_put(struct property *to_delete) { delete_prop_from_dl(to_delete); } #ifdef DEBUG /** * traverse_devicetree * @brief Debug function, that prints nodes and properties. * * @param node_head */ void traverse_devicetree(struct node *head) { struct property *prop; while ((head->child) || (head->sibling)) { if (head->child) { traverse_devicetree(head->child); if (head->sibling == NULL) { printf("NODE name is %s\n", head->path); for (prop = head->properties; prop != NULL; prop = prop->next) { printf("\tProp name is %s path is %s\n", prop->name, prop->path); } break; } } if (head->sibling) { printf("NODE name is %s\n", head->path); for (prop = head->properties; prop != NULL; prop = prop->next) { printf("\tProp name is %s path is %s\n", prop->name, prop->path); } head = head->sibling; } } } #endif /** * __libofdt_fini() * @brief fini routine that cleans everything when library exits. * */ void __libofdt_fini() { struct delete_struct *tmp, *prev; tmp = delete_list; while (tmp) { prev = tmp; if (tmp->dnode) remove_node(tmp->dnode); if (tmp->dprop) free(tmp->dprop); tmp = tmp->next; free(prev); } } librtas-1.3.10/libofdt_src/Makefile0000644000175100001440000000172612313120670016233 0ustar nfontusers # # Makefile for libofdt # # Copyright (C) 2005 IBM Corporation # Common Public License Version 1.0 (see COPYRIGHT) # include ../rules.mk LIBOFDT_SONAME = libofdt.so LIBOFDT = $(LIBOFDT_SONAME).$(VERSION) LIBOFDT_OBJS = dtree.o drc.o LIBOFDT_HDRS = libofdt.h common.h LIBOFDT_SHIP_HDR = libofdt.h CFLAGS += -fPIC -DPIC LDFLAGS += -shared -Wl,-soname -Wl,$(LIBOFDT_SONAME).$(MAJOR_NO) all: $(LIBOFDT_OBJS) $(LIBOFDT_HDRS) @echo "LD $(WORK_DIR)/$(LIBOFDT)..." @$(CC) $(LIBOFDT_OBJS) $(LDFLAGS) -o $(LIBOFDT) install: @$(call install_lib,$(LIBOFDT),$(DESTDIR)) @$(call install_inc,$(LIBOFDT_SHIP_HDR),$(DESTDIR)) @ln -sf $(LIBOFDT) $(DESTDIR)/$(LIB_DIR)$(call is_lib64,$(LIBOFDT))/$(LIBOFDT_SONAME) uninstall: @$(call uninstall_lib,$(LIBOFDT),$(DESTDIR)) @$(call uninstall_inc,$(LIBOFDT_SHIP_HDR),$(DESTDIR)) @rm -f $(DESTDIR)/$(LIB_DIR)$(call is_lib64,$(LIBOFDT))/$(LIBOFDT_SONAME) clean: @echo "Cleaning up $(WORK_DIR) files..." @rm -f $(LIBOFDT_OBJS) $(LIBOFDT) librtas-1.3.10/libofdt_src/libofdt.so.1.3.90000755000175100001440000012231112313120670017225 0ustar nfontusersELF@@@8@(%;;> > > h @>P>P>P$$dtP;D;D;DdtR> > > GNUR|?,oJxI %- )+(,#" % ' $*!  & ,R8 !"%&(*,6 #4Xq, |/fEBhOT˅pBG5.2/.zq3 > NR % "fu|0Ym_S@ BAA@@DCDG`C8pCPD8AC A9GPBGXZA@BlB@|__gmon_start___init__cxa_finalize_Jv_RegisterClassestreeheaddelete_listfreefopenfreadfclosestrlenstrncpymallocmemsetadd_propertyfile_existsget_drc_infofree_drc_infocreate_drc_propertiesopendirsprintfreaddirclosedirmemcpysnprintfofdt_getfind_drc_infoofdt_putofdt_get_propertystrncmpofdt_get_property_by_namestrrchrofdt_property_puttraverse_devicetree__libofdt_finistrcpylibc.so.6__xstat_edata__bss_start_endlibofdt.so.1GLIBC_2.4GLIBC_2.3 ii ii@@@(@Ø@ 9@(Ø@8@@Ø@P@XØ@h$@pØ@@Ø@ @Ø@@Ø@@@Ø@!@Ø@"<AØA"AØA(#<A0ØA@$HAHØAX%$A`ØAp&AxØA'AØA'AØA((AØA(AØA)AØB*BØB+B ØB0,\B8ØBH-lBPØB`-BhØBx/(BØB/BØB/BØB18BØB2BØB3BØC4CØC 4C(ØC85C@ØCP6CXØCh8CpØC8PCØCG@C@C>0C>@C>HC>(C:C:C: D:8D:@D:XD :`D(:xD0:D8:D@:DH:DP:DX:D`:Dh;Dp;Dx;(D;0>8*&C&C&C&D(&DDDD,EEE0!EH E` Ex"E E E EEFF F8%FPFhF+FFFFFGG(A(b8}ibHB@N |!/A KA(H`H!`8!p|N A(bX}ibhB`N A(b`}ibpBhN A(b}ibBN A(bh}ibxBpN A(b(}ib8B0N A(b}ib(B N A(b@}ibPBHN A(bp}ibBxN A(b}ibBN A(bH}ibXBPN A(b}ibBN A(b0}ib@B8N A(b }ib0B(N A(bP}ib`BXN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(bx}ibBN A(b}ibBN A(b}ibBN A(b}ib BN A(b}ibBN A(b}ibBN ``|€!q/@/A" iK}A("0뢀(~}=HP})t;@@H```8 x$}=* A(| iIN!A(~@A88!|N `|b8!/A,"@/A A(| iIN!A(8!p|N |!|? x8`H9|`x/@8 H/@8|xH`|`x/A8 Hx 8 x ||xH|`x? ? /AKEA(8 H\肀PKA(|`xxx/@K A(8 H ?)}#Kx8|xxKA(|`xxKA(HK%A(|`xp?p8 ||xH|`x? ? /@KqA(8 H?)p|}#Kx|xKA(?;KA(|`xx|xK]A(KuA(|`xx|xK5A( ` |x8?P|N |!q|? x|`x||xKA(|`xpp/A |p8|xK-A(p|x8?|N |!q|? x?8 |xK|`xp? ?p ?p 8?|N |!Q|? x8`K|`xpp/@8HH?p;KA(|`xx|xKA(?p p`|x8?|N |!|? x肀XKeA(|`x/AKuA(|`xxH x8`K|`x/@,x?HAxKmA(80H肀`KA(|`x/AKA(KaA(|`x/@x?HAxKA(80H@`?9)8|x肀h}&KxKA(89?|x}$KxH`|`x/@x T&/@@<8|xxKy|`xp? ?p ?p HDx T&9 a)H@(?8 |x8KA(H`KA(|`x/@H`KA(x?HAxKA(0`0|x8?P|N |!q|? x8`K|`xpp/A0?p "p ?p "pp H`8?|N |!q|? x8`K-|`xpp/A0?p "p ?p "pp H`8?|N |!q|? x? pH(`px?p pxK-A(p/@`8?|N |!q|? xH`H`? /AL? |xK? /@,? /AKKA(Hp? /A0>@>H>(::: :8:@:X:`:x:::::::;;;(;0GCC: (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]ospWG,$8, Y,\ ,8< Yvadd_property ofdt_get oofdt_put ofdt_get_property ofdt_get_property_by_name yofdt_property_put traverse_devicetree __libofdt_fini ,treehead Bdelete_listm Y hget_drc_info free_drc_info file_exists create_drc_properties find_drc_infoY__stat Uv3$,\$8|QSlint8MM8M)8ii`iiiZ1- b# # # # # #( #0 j#8 ,#@ #H #P ) #X ?"#` $#h &b#p W*b#t W,#x 80F# 1T# [2# Q6,# [?# =H# DI# KJ# RK# YL-# Nb# iP2#    # # :b# ,  B H # #  F# e!?# o"#  DIR <y z# {i#w  /   p# # H #  #  {# 6 # D b#$  p#( _ #0 v #8 #@ D #H  #X $ #h 8#x 8#  8# ^ q ^#  n#  #  # # n  R  q ^#  !n#  "# _ ## $#  %# r)  )# # #p q# g#0 IM#` M#d  #h/$0qB0B8t~rcb~fp&0~sb' ~P<b~,4 Mvsz4b0tmp5`X RW0qWB8WtY`j@ i0iB8Rk@L@!4B08rcbvdvdevRvbufnv+vsb ~ _vM!"< 5%0new)`"<" r%0new)`"#< 0tmpht`c#<$Hh 70tmp`$H%$ I0tmp)h e)`8%$& 70tmp9)h e9)`!Zb&'O YB0Y8sb[ ~rc\b~"|'' o{B0 }nw 1~w 7wrcbw#H'(( 0"(((6 R0qB8 tXlenbP"g() y$dirB0 tw qw nwrcbw#)* 0#*+ 70 t`%+,\j ,tmp)h e)`&3  GP& ) GX %vs3,\8i$8|QSlint8MM8M)8ii`iiiZ1- b# # # # # #( #0 j#8 ,#@ #H #P ) #X ?"#` $#h &b#p W*b#t W,#x 80F# 1T# [2# Q6,# [?# =H# DI# KJ# RK# YL-# Nb# iP2#    # # :b# ,  B Hy} z# {i#w  /24M   p# # H #  #  {# 6 # D b#$  p#( _ #0 v #8 #@ D T#H  T#X $ T#h 8#x 8#  8#  q #  #  #  # #   R  q #  !#  "# _ ## $#  %# p q# g#0 IM#` M#d  #hl  #val!# G"b#`%] &# '# (#0 )#H'b,\-l%B0%B8buf&c&bfp(wrc)bwdir*w Cb-l-YBB0qBB8DvsbE~rcFbvhYb-/(QWB0W8tXrcZbTbZbP,4/(/ sz4b0tmp5`M//=M0ub/188tB0At8rcvbP182A0+b23 bA0Gb8Ubh; b` bXjP Hib@My34 ZB0U~~~b~rcb~O44l Q0b45 B0B8rcbvsbvw56  R0Q8~drc~rcb~E`>68 S=B0sb?nrc@bnyAobufBw]CnUv88L1Q|SlintB;;B;)B^`^^^Zyz#{^#e##H##p#6{# DW#$e#(_#0v#8#@D#H#X$#hB#xB#B#3W88L G 2G buf2R M % : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I : ; : ; I< !I/.: ; ' I@: ; I 4: ; I 4: ; I  U U: ; I .? : ; ' @ .: ; ' @.: ;' @: ;I 4: ;I 4: ;I !.: ;' I@".? : ;' I@#.? : ;' @$: ;I %.? : ;@&4: ; I?  % : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I : ; !I/ : ; I8 .: ; ' I@: ; I : ; I 4: ; I 4: ; I .: ; ' @.? : ; ' I@.? : ; ' @.? : ;' I@: ;I 4: ;I 4: ;I .? : ;' @.? : ;' I@% $ > $ > : ; I$ >  : ;  : ; I8 .? : ; ' I@ : ; I : ; I  I &Ie /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/include/bits/usr/includedtree.ccommon.hstddef.htypes.hstdio.hlibio.hdirent.htime.hstat.hlibofdt.hdirent.h $K=).Y @u=!.a K=.g g==.m LZK= .x /!huu=v!K= K=4>/!  tuh0Y=K>(.[ uLY=K>.f #?[hKKup >K>/! iK?=KF% iK?=KF% h>//=9O iKKK/=#KK//=r< i=/YLYZL=#/r<J i=/YZYZLC/r<JxZ>Y.t u>g6uv=! lg= .y gg=0=/! g/ vZY2z y/! lg= .v u=6>u//! g/ iKKKKgZ;O#KgZ;Ol< [=//KKKY=y< J /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/include/bits/usr/includedrc.ccommon.hstddef.htypes.hstdio.hlibio.htime.hstdint.hstat.hlibofdt.h ,\& .t #uu=4=/! yu/ YuK .v =Y5Z/!Iuu=v!Z\0twZu=<q = <u =Dz =?/! gKYKYKYKY ===>KhgugLq! g4g= .w />==/!g= yuY z?>hKsv#=mvlt3  m fx =nz u==L/! t ../bits../time../sysdeps/unix/sysv/linux/powerpc/bitsstat.ctypes.htime.hstat.h 82/-// xA $$`TA~D $PA~D $ |PA~D $TA~D $@xP A~D $!PA~D $"<PA~D $"|PA~D $#< PA~D $$HPA~D $%$PA~D $&PA~D $'P A~D $'@PA~D $((PA~D $(P A~D $)@PA~D $*PA~D $+PA~D  xA $,\P A~D $-lP A~D $-8PA~D $/(PA~D /8H@D $/PPA~D $18PA~D $2PA~D $3PA~D $4DPA~D $4P A~D $5pPA~D $6PA~D  xA 8 > >0>0>H>H>P>P@@@@CCCCsDDG@D 0D90DDEW]!F;-a;fGkXHT0p_wo 1jPx'l   8 h p  p 9 :;D;X> >0>H>P@@CCDG@ !"#$ @8-@P9>HF> T>0bG@qGH C>H>(;@h`@@@x@@A|&A( 2A@FAXZApntB0BHB`8BxB8BPBB  4 U | Ch<  Ch<  pC h@u>@ 8 `    8 ^ 8q  0  P 2 HX    h x" J>PScAl  @|A@ "GXC8p(:CPHZBi|GPDC A@G`CD&B:NbDiA@{A@Binitfini.ccrtstuff.c__do_global_dtors_auxframe_dummy__JCR_LIST____CTOR_LIST____DTOR_LIST__completed.6751dtor_idx.6753__do_global_ctors_aux__JCR_END____CTOR_END____FRAME_END__dtree.callocate_propertyzallocallocate_nodebuild_nodeadd_node_to_dladd_prop_to_dldelete_propertiesremove_nodedelete_node_from_dldelete_prop_from_dlpath_to_full_dtpathdrc.cget_propertyget_property_sizeget_of_list_propofdt_swap_intget_drc_prop_grpfree_drc_propsbuild_connectors_liststat.c00000014.plt_call.__gmon_start__+000000010.plt_call.find_drc_info+000000010.plt_call.add_property+000000010.plt_call.readdir@@GLIBC_2.3+000000010.plt_call.malloc@@GLIBC_2.3+0__stat00000010.plt_call.strncmp@@GLIBC_2.3+000000010.plt_call.memset@@GLIBC_2.3+0stat00000010.plt_call.get_drc_info+000000010.plt_call.opendir@@GLIBC_2.3+000000010.plt_call.fopen@@GLIBC_2.3+0__dso_handle__DTOR_END__00000010.plt_call.free_drc_info+000000010.plt_call.__xstat@@GLIBC_2.3+000000010.plt_call.file_exists+000000010.plt_call.strrchr@@GLIBC_2.3+000000010.plt_call.strcpy@@GLIBC_2.3+000000010.plt_call.memcpy@@GLIBC_2.3+0__glink_PLTresolve00000010.plt_call.printf@@GLIBC_2.4+000000010.plt_call.free@@GLIBC_2.3+000000010.plt_call.create_drc_properties+000000010.plt_call.closedir@@GLIBC_2.3+000000010.plt_call.fread@@GLIBC_2.3+000000010.plt_call.fclose@@GLIBC_2.3+000000010.plt_call.__cxa_finalize@@GLIBC_2.3+000000010.plt_call.snprintf@@GLIBC_2.4+000000010.plt_call.strlen@@GLIBC_2.3+000000010.plt_call.sprintf@@GLIBC_2.4+000000010.plt_call.strncpy@@GLIBC_2.3+000000010.plt_call.traverse_devicetree+0_DYNAMICfree@@GLIBC_2.3ofdt_getstrrchr@@GLIBC_2.3__gmon_start___Jv_RegisterClassesadd_propertyofdt_get_property_fini__cxa_finalize@@GLIBC_2.3strlen@@GLIBC_2.3delete_listcreate_drc_properties__xstat@@GLIBC_2.3malloc@@GLIBC_2.3find_drc_infomemset@@GLIBC_2.3__libofdt_finistrncmp@@GLIBC_2.3printf@@GLIBC_2.4treeheadfread@@GLIBC_2.3opendir@@GLIBC_2.3__bss_startreaddir@@GLIBC_2.3memcpy@@GLIBC_2.3file_existsofdt_put_endstrcpy@@GLIBC_2.3free_drc_infotraverse_devicetreeclosedir@@GLIBC_2.3snprintf@@GLIBC_2.4_edataofdt_property_putstrncpy@@GLIBC_2.3fclose@@GLIBC_2.3fopen@@GLIBC_2.3ofdt_get_property_by_namesprintf@@GLIBC_2.4_initget_drc_infolibrtas-1.3.10/rules.mk0000644000175100001440000001323012313120670013755 0ustar nfontusers# # Common Makefile definitions # PWD = $(shell echo `pwd`) INSTALL = /usr/bin/install DOXYGEN = `which doxygen` # Name of the rpm spec file SPECFILENAME = librtas.spec SPECFILENAME_IN = librtas.spec.in # resolves the root directory at which this build is occuring ROOT_DIR = \ $(shell \ while [[ `pwd` != "/" ]]; \ do \ if [[ -f `pwd`/$(SPECFILENAME_IN) ]]; \ then \ echo `pwd`; \ break; \ fi; \ cd ..; \ done;) # Full path to the rpm specfile SPECFILE = $(ROOT_DIR)/$(SPECFILENAME) SPECFILE_IN = $(ROOT_DIR)/$(SPECFILENAME_IN) # Find the correct command to build RPM's RPM = \ $(shell \ if [[ -a /bin/rpmbuild ]]; then \ echo "/bin/rpmbuild"; \ elif [[ -a /usr/bin/rpmbuild ]]; then \ echo "/usr/bin/rpmbuild"; \ elif [[ -a /bin/rpm ]]; then \ echo "/bin/rpm"; \ elif [[ -a /usr/bin/rpm ]]; then \ echo "/usr/bin/rpmbuild"; \ else \ echo "rpm seems to be non-existant"; \ fi;) # Pull the version, release and project name info from the spec file VERSION := $(shell echo `grep "define version" $(SPECFILE_IN) | cut -d' ' -f3`) RELEASE := $(shell echo `grep "define release" $(SPECFILE_IN) | cut -d' ' -f3`) PROJECT := $(shell echo `grep "define name" $(SPECFILE_IN) | cut -d' ' -f3`) # Generate the Major, Minor and Revision numbers from the version VERSION_LIST := $(subst ., ,$(VERSION)) MAJOR_NO := $(word 1,$(VERSION_LIST)) MINOR_NO := $(word 2,$(VERSION_LIST)) REVISION_NO := $(word 3,$(VERSION_LIST)) # Set this if you want to install to a base directory other than / DESTDIR ?= # Standard base directory names BIN_DIR = /usr/bin SBIN_DIR = /usr/sbin LIB_DIR = /usr/lib INC_DIR = /usr/include/ DOC_DIR = /usr/share/doc/packages/$(PROJECT) MAN_DIR = /usr/share/man/man8 # Shipdir is where we put all the files to build an rpm SHIPDIR = /tmp/$(PROJECT)-buildroot # Source tarball name and build directory TARBALL = $(PROJECT)-$(VERSION).tar.gz TARBALL_FILES = Makefile rules.mk $(SPECFILENAME_IN) TB_DIR = $(PROJECT)-$(VERSION) # Build a tarball of the source code BUILD_TARBALL = \ $(shell \ echo CVS > ./ignore; \ mkdir $(TB_DIR); \ cp -R $(SUBDIRS) $(TARBALL_FILES) $(TB_DIR); \ tar -zcf $(TARBALL) -X ./ignore $(TB_DIR); \ rm -rf ./ignore $(TB_DIR);) # Development snapshot builds DEVBALL = $(PROJECT)-$(VERSION)-`date +%Y%m%d`.tar.gz # Build a development snapshot of the source code BUILD_DEVBALL = \ $(shell \ echo CVS > ./ignore; \ mkdir $(TB_DIR); \ cp -R $(SUBDIRS) $(TARBALL_FILES) $(TB_DIR); \ tar -zcf $(DEVBALL) -X ./ignore $(TB_DIR); \ rm -rf ./ignore $(TB_DIR);) # Current build directory WORK_DIR = $(patsubst /%,%,$(subst $(ROOT_DIR),,$(PWD))) # You should always build with -Wall CFLAGS += -Wall # Uncomment this for debug builds CFLAGS += -g -DDEBUG # If you wish to have a log of installed files, define the file here INSTALL_LOG ?= $(ROOT_DIR)/install.log # # is_lib64 - determine if a library is 64-bit # # $1 library to examine define is_lib64 $(findstring 64,$(shell file $(firstword $1))) endef # # install_files - Install file(s) in the given location # # $1 - files to be installed # $2 - permissions to install file with # $3 - directory to install file to define install_files $(INSTALL) -d -m 755 $3; $(foreach f,$1, \ echo "Installing $(patsubst /%,%,$(WORK_DIR)/$f)"; \ $(INSTALL) -m $2 $f $3; \ $(if $(INSTALL_LOG),echo $3/$f >> $(INSTALL_LOG);,)) endef # # The following are wrappers for calls to install_files for # installing files in known locations (i.e. /usr/bin). The args # to each of the wrappers are the same. # # $1 - files to be installed # $2 - prefix to install path for the files # define install_bin $(call install_files,$1,755,$2/$(BIN_DIR)) endef define install_sbin $(call install_files,$1,744,$2/$(SBIN_DIR)) endef define install_lib $(call install_files,$1,755,$2/$(LIB_DIR)$(call is_lib64,$1)) endef define install_inc $(call install_files,$1,644,$2/$(INC_DIR)) endef define install_doc $(call install_files,$1,644,$2/$(DOC_DIR)) endef define install_man $(call install_files,$1,644,$2/$(MAN_DIR)) endef # # uninstall_files - Uninstall file(s) # # $1 - files to be uninstalled # $2 - the directory the files to uninstall live in define uninstall_files $(foreach f,$1, \ echo "Un-installing $(patsubst /%,%,$(WORK_DIR)/$f)"; \ rm -f $2/$f;) endef # # The following are wrappers for calls to uninstall_files for # removing files in known locations (i.e. /usr/bin). The args # to each of the wrappers are the same. # # $1 - files to be uninstalled # $2 - prefix to uninstall path for the files # define uninstall_bin $(call uninstall_files,$1,$2/$(BIN_DIR)) endef define uninstall_sbin $(call uninstall_files,$1,$2/$(SBIN_DIR)) endef define uninstall_lib $(call uninstall_files,$1,$2/$(LIB_DIR)$(call is_lib64,$1)) endef define uninstall_inc $(call uninstall_files,$1,$2/$(INC_DIR)) endef define uninstall_doc $(call uninstall_files,$1,$2/$(DOC_DIR)) endef define uninstall_man $(call uninstall_files,$1,$2/$(MAN_DIR)) endef # Define "CLEAN" as rm plus any files defined in this file that # the actual Makefile may not (or have to) know about CLEAN = /bin/rm -rf $(INSTALL_LOG) $(TB_DIR) *~ # Default target for building object files %.o: %.c @echo "CC $(WORK_DIR)/$@" @$(CC) -c $(CFLAGS) $< librtas-1.3.10/librtas.spec.in0000644000175100001440000000363712313120670015225 0ustar nfontusers%define name librtas %define version 1.3.10 %define release 1 Summary: Libraries to provide access to RTAS calls and RTAS events. Name: %{name} Version: %{version} Release: %{release} License: IBM Common Public License (CPL) v1.0 Source: %{name}-%{version}.tar.gz Group: System Environment/Libraries BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %description The librtas shared library provides userspace with an interface through which certain RTAS calls can be made. The library uses either of the RTAS User Module or the RTAS system call to direct the kernel in making these calls. The librtasevent shared library provides users with a set of definitions and common routines useful in parsing and dumping the contents of RTAS events. %prep %setup -q %build %{__make} %{?_smp_mflags} %install %{__rm} -rf $RPM_BUILD_ROOT %{__make} install DESTDIR=$RPM_BUILD_ROOT %files %defattr(-, root, root) /usr/share/doc/packages/%{name}/COPYRIGHT /usr/share/doc/packages/%{name}/README /usr/include/common.h /usr/include/librtas.h @LIB_DIR@/librtas.so.%{version} @LIB_DIR@/libofdt.so @LIB_DIR@/librtas.so @LIB_DIR@/librtasevent.so @LIB_DIR@/librtasevent.so.1 @LIB_DIR@/librtasevent.so.%{version} /usr/include/librtasevent.h /usr/include/librtasevent_v4.h /usr/include/librtasevent_v6.h @LIB_DIR@/libofdt.so.%{version} /usr/include/libofdt.h %post # Post-install script ------------------------------------------------- ln -sf @LIB_DIR@/librtas.so.%{version} @LIB_DIR@/librtas.so ln -sf @LIB_DIR@/librtas.so.%{version} @LIB_DIR@/librtas.so.1 ln -sf @LIB_DIR@/librtasevent.so.%{version} @LIB_DIR@/librtasevent.so ln -sf @LIB_DIR@/libofdt.so.%{version} @LIB_DIR@/libofdt.so ldconfig %postun # Post-uninstall script ----------------------------------------------- if [ "$1" = "0" ] ; then # last uninstall rm -f @LIB_DIR@/librtas.so rm -f @LIB_DIR@/librtasevent.so rm -f @LIB_DIR@/libofdt.so fi ldconfig librtas-1.3.10/librtas_src/0000755000175100001440000000000012313120670014602 5ustar nfontuserslibrtas-1.3.10/librtas_src/syscall_calls.c0000644000175100001440000007405012313120670017604 0ustar nfontusers/** * @file syscall_calls.c * * Provide user space rtas functions that go through the RTAS system call. * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author John Rose */ #include #include #include #include #include #include #include "common.h" #include "syscall.h" #include "librtas.h" int sc_activate_firmware(int token); int sc_cfg_connector(int token, char *workarea); int sc_delay_timeout(uint64_t timeout_ms); int sc_display_char(int token, char c); int sc_display_msg(int token, char *buf); int sc_errinjct(int token, int etoken, int otoken, char *workarea); int sc_errinjct_close(int token, int otoken); int sc_errinjct_open(int token, int *otoken); int sc_get_dynamic_sensor(int token, int sensor, void *loc_code, int *state); int sc_get_config_addr_info2(int token, uint32_t config_addr, uint64_t phb_id, uint32_t func, uint32_t *info); int sc_get_indices(int token, int is_sensor, int type, char *workarea, size_t size, int start, int *next); int sc_get_power_level(int token, int powerdomain, int *level); int sc_get_sensor(int token, int sensor, int index, int *state); int sc_get_sysparm(int token, unsigned int parameter, unsigned int length, char *data); int sc_get_time(int token, uint32_t *year, uint32_t *month, uint32_t *day, uint32_t *hour, uint32_t *min, uint32_t *sec, uint32_t *nsec); int sc_get_vpd(int token, char *loc_code, char *workarea, size_t size, unsigned int sequence, unsigned int *seq_next, unsigned int *bytes_ret); int sc_lpar_perftools(int token, int subfunc, char *workarea, unsigned int length, unsigned int sequence, unsigned int *seq_next); int sc_platform_dump(int token, uint64_t dump_tag, uint64_t sequence, void *buffer, size_t length, uint64_t * next_seq, uint64_t * bytes_ret); int sc_read_slot_reset(int token, uint32_t cfg_addr, uint64_t phbid, int *state, int *eeh); int sc_scan_log_dump(int token, void *buffer, size_t length); int sc_set_dynamic_indicator(int token, int indicator, int new_value, void *loc_code); int sc_set_eeh_option(int token, uint32_t cfg_addr, uint64_t phbid, int function); int sc_set_indicator(int token, int indicator, int index, int new_value); int sc_set_power_level(int token, int powerdomain, int level, int *setlevel); int sc_set_poweron_time(int token, uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec); int sc_set_sysparm(int token, unsigned int parameter, char *data); int sc_set_time(int token, uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec); int sc_suspend_me(int token, uint64_t streamid); int sc_update_nodes(int token, char *workarea, unsigned int scope); int sc_update_properties(int token, char *workarea, unsigned int scope); struct rtas_operations syscall_rtas_ops = { .activate_firmware = sc_activate_firmware, .cfg_connector = sc_cfg_connector, .delay_timeout = sc_delay_timeout, .display_char = sc_display_char, .display_msg = sc_display_msg, .errinjct = sc_errinjct, .errinjct_close = sc_errinjct_close, .errinjct_open = sc_errinjct_open, .free_rmo_buffer = sc_free_rmo_buffer, .get_config_addr_info2 = sc_get_config_addr_info2, .get_dynamic_sensor = sc_get_dynamic_sensor, .get_indices = sc_get_indices, .get_sensor = sc_get_sensor, .get_power_level = sc_get_power_level, .get_rmo_buffer = sc_get_rmo_buffer, .get_sysparm = sc_get_sysparm, .get_time = sc_get_time, .get_vpd = sc_get_vpd, .lpar_perftools = sc_lpar_perftools, .platform_dump = sc_platform_dump, .read_slot_reset = sc_read_slot_reset, .scan_log_dump = sc_scan_log_dump, .set_dynamic_indicator = sc_set_dynamic_indicator, .set_indicator = sc_set_indicator, .set_eeh_option = sc_set_eeh_option, .set_power_level = sc_set_power_level, .set_poweron_time = sc_set_poweron_time, .set_sysparm = sc_set_sysparm, .set_time = sc_set_time, .suspend_me = sc_suspend_me, .update_nodes = sc_update_nodes, .update_properties = sc_update_properties, .interface_exists = sc_interface_exists, }; /* The original librtas used the _syscall1 interface to get to the rtas * system call. On recent versions of Linux though the _syscall1 * interface was removed from unistd.h so we have moved to using the * syscall() interface instead. The use of _syscall1 is left as the * default to avoid breaking the library on older systems. */ #ifdef _syscall1 _syscall1(int, rtas, void *, args); #endif #define CALL_AGAIN 1 /** * handle_delay * @brief sleep for the specified delay time * * @param status * @param elapsed * @return * 0 if the status isn't delay-related * CALL_AGAIN if the status is delay related * RTAS_TIMEOUT if the requested timeout has been exceeded */ static unsigned int handle_delay(int status, uint64_t * elapsed) { int order = status - EXTENDED_DELAY_MIN; unsigned long ms = 0; uint64_t remaining; if (status >= EXTENDED_DELAY_MIN && status <= EXTENDED_DELAY_MAX) { /* Extended Delay */ for (ms = 1; order > 0; order--) ms = ms * 10; } else if (status == RC_BUSY) { /* Regular Delay */ ms = 1; } else { /* Not a delay return code */ return 0; } if (config.rtas_timeout_ms) { if (*elapsed >= config.rtas_timeout_ms) return RTAS_TIMEOUT; remaining = config.rtas_timeout_ms - *elapsed; if (ms > remaining) ms = remaining; } *elapsed += ms; dbg1("Return status %d, delaying for %ld ms\n", status, ms); usleep(ms * 1000); return 1; } /** * display_rtas_buf * @brief Dump the contents of the rtas call buffer * * @param args * @param after */ static void display_rtas_buf(struct rtas_args *args, int after) { int i, ninputs, nret; if (config.debug < 2) return; ninputs = be32toh(args->ninputs); nret = be32toh(args->nret); /* It doesn't make sense to byte swap the input and return arguments * as we don't know here what they really mean (it could be a 64 bit * value split accross two 32 bit arguments). Printing them as hex * values is enough for debugging purposes. */ if (!after) { printf("RTAS call args.token = %d\n", be32toh(args->token)); printf("RTAS call args.ninputs = %d\n", ninputs); printf("RTAS call args.nret = %d\n", nret); for (i = 0; i < ninputs; i++) printf("RTAS call input[%d] = 0x%x (BE)\n", i, args->args[i]); } else { for (i = ninputs; i < ninputs + nret; i++) printf("RTAS call output[%d] = 0x%x (BE)\n", i - ninputs, args->args[i]); } } /** * sc_rtas_call * @brief Perform the actual system call for the rtas call * * Variable argument list consists of inputs followed by * pointers to outputs. * * @param token * @param ninputs number of inputs * @param nret number of return variables * @return 0 on success, !0 otherwise */ static int sc_rtas_call(int token, int ninputs, int nret, ...) { struct rtas_args args; rtas_arg_t *rets[MAX_ARGS]; va_list ap; int rc; int i; args.token = htobe32(token); args.ninputs = htobe32(ninputs); args.nret = htobe32(nret); va_start(ap, nret); for (i = 0; i < ninputs; i++) args.args[i] = (rtas_arg_t) va_arg(ap, unsigned long); for (i = 0; i < nret; i++) rets[i] = (rtas_arg_t *) va_arg(ap, unsigned long); va_end(ap); display_rtas_buf(&args, 0); #ifdef _syscall1 rc = rtas(&args); #else rc = syscall(__NR_rtas, &args); #endif if (rc != 0) { dbg1("RTAS syscall failure, errno=%d\n", errno); return RTAS_IO_ASSERT; } display_rtas_buf(&args, 1); /* Assign rets */ if (nret) { /* All RTAS calls return a status in rets[0] */ *(rets[0]) = be32toh(args.args[ninputs]); for (i = 1; i < nret; i++) *(rets[i]) = args.args[ninputs + i]; } return 0; } /** * sc_activate_firmware * @brief Set up the activate-firmware rtas system call * * @param token * @return 0 on success, !0 otherwise */ int sc_activate_firmware(int token) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 0, 1, &status); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("() = %d\n", rc ? rc : status); return rc ? rc : status; } #define CFG_RC_DONE 0 #define CFG_RC_MEM 5 /** * sc_cfg_connector * @brief Set up the cfg-connector rtas system call * * @param token * @param workarea * @return 0 on success, !0 otherwise */ int sc_cfg_connector(int token, char *workarea) { uint32_t workarea_pa; uint32_t extent_pa = 0; uint64_t elapsed = 0; void *kernbuf; void *extent; int status; int rc; rc = sc_get_rmo_buffer(PAGE_SIZE, &kernbuf, &workarea_pa); if (rc) return rc; memcpy(kernbuf, workarea, PAGE_SIZE); do { rc = sc_rtas_call(token, 2, 1, htobe32(workarea_pa), htobe32(extent_pa), &status); if (rc < 0) break; if ((rc == 0) && (status == CFG_RC_MEM)) { rc = sc_get_rmo_buffer(PAGE_SIZE, &extent, &extent_pa); if (rc < 0) break; continue; } rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (rc == 0) memcpy(workarea, kernbuf, PAGE_SIZE); (void)sc_free_rmo_buffer(kernbuf, workarea_pa, PAGE_SIZE); if (extent_pa) (void)sc_free_rmo_buffer(extent, extent_pa, PAGE_SIZE); dbg1("(%p) = %d\n", workarea, rc ? rc : status); return rc ? rc : status; } /** * sc_delay_timeout * @brief set the configured timeout value * * @param timeout_ms new timeout in milliseconds * @return 0 on success, !0 otherwise */ int sc_delay_timeout(uint64_t timeout_ms) { config.rtas_timeout_ms = timeout_ms; return 0; } /** * sc_display_char * @brief Set up display-char rtas system call * * @param token * @param c character to display * @return 0 on success, !0 otherwise */ int sc_display_char(int token, char c) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 1, 1, c, &status); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(%d) = %d\n", c, rc ? rc : status); return rc ? rc : status; } /** * sc_display_msg * @brief Set up the display-message rtas system call * * @param token * @param buf message to display * @return 0 on success, !0 otherwise */ int sc_display_msg(int token, char *buf) { uint64_t elapsed = 0; uint32_t kernbuf_pa; void *kernbuf; int str_len; int status; int rc; str_len = strlen(buf); rc = sc_get_rmo_buffer(str_len, &kernbuf, &kernbuf_pa); if (rc) return rc; strcpy(kernbuf, buf); do { rc = sc_rtas_call(token, 1, 1, kernbuf_pa, &status); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while ((rc == CALL_AGAIN)); (void)sc_free_rmo_buffer(kernbuf, kernbuf_pa, str_len); dbg1("(%p) = %d\n", buf, rc ? rc : status); return rc ? rc : status; } #define ERRINJCT_BUF_SIZE 1024 /** * sc_errinjct * @brief Set up the errinjct rtas system call * * @param token * @param etoken error injection token * @param otoken error injection open token * @param workarea additional args to rtas call * @return 0 on success, !0 otherwise */ int sc_errinjct(int token, int etoken, int otoken, char *workarea) { uint64_t elapsed = 0; uint32_t kernbuf_pa; void *kernbuf; int status=0; int rc; rc = sc_get_rmo_buffer(ERRINJCT_BUF_SIZE, &kernbuf, &kernbuf_pa); if (rc) return rc; memcpy(kernbuf, workarea, ERRINJCT_BUF_SIZE); do { rc = sc_rtas_call(token, 3, 1, etoken, otoken, kernbuf_pa, &status); if (rc < 0 ) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (rc == 0) memcpy(workarea, kernbuf, ERRINJCT_BUF_SIZE); (void)sc_free_rmo_buffer(kernbuf, kernbuf_pa, ERRINJCT_BUF_SIZE); dbg1("(%d, %d, %p) = %d\n", etoken, otoken, workarea, rc ? rc : status); return rc ? rc : status; } /** * sc_errinjct_close * @brief Set up the errinjct close rtas system call * * @param token * @param otoken errinjct open token * @return 0 on success, !0 otherwise */ int sc_errinjct_close(int token, int otoken) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 1, 1, otoken, &status); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(%d) = %d\n", otoken, rc ? rc : status); return rc ? rc : status; } /** * sc_errinjct_open * @brief Set up the errinjct open rtas system call * * @param token * @param otoken * @return 0 on success, !0 otherwise */ int sc_errinjct_open(int token, int *otoken) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 0, 2, otoken, &status); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(%p) = %d, %d\n", otoken, rc ? rc : status, *otoken); return rc ? rc : status; } /** * sc_get_config_addr2 * @brief get the pci slot config address * * @param token * @param config_addr * @param phb_unit_id * @param func * @param info * @return 0 on success, !0 otherwise */ int sc_get_config_addr_info2(int token, uint32_t config_addr, uint64_t phb_id, uint32_t func, uint32_t *info) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 4, 2, config_addr, BITS32_HI(phb_id), BITS32_LO(phb_id), func, &status, info); if (rc) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(0x%x, 0x%llx, %d) = %d, 0x%x\n", config_addr, phb_id, func, rc ? rc : status, *info); return rc ? rc : status; } /** * sc_get_dynamic_sensor * @brief Set up the get-dynamic-sensor rtas system call * * @param token * @param sensor * @param loc_code * @param state * @return 0 on success, !0 otherwise */ int sc_get_dynamic_sensor(int token, int sensor, void *loc_code, int *state) { uint32_t loc_pa = 0; uint64_t elapsed = 0; void *locbuf; uint32_t size; int status; int rc; size = *(uint32_t *)loc_code + sizeof(uint32_t); rc = sc_get_rmo_buffer(size, &locbuf, &loc_pa); if (rc) return rc; memcpy(locbuf, loc_code, size); do { rc = sc_rtas_call(token, 2, 2, sensor, loc_pa, &status, state); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); (void) sc_free_rmo_buffer(locbuf, loc_pa, size); dbg1("(%d, %s, %p) = %d, %d\n", sensor, (char *)loc_code, state, rc ? rc : status, *state); return rc ? rc : status; } /** * sc_get_indices * @brief Set up the get-indices rtas system call * * @param token * @param is_sensor * @param type * @param workarea * @param size * @param start * @param next * @return 0 on success, !0 otherwise */ int sc_get_indices(int token, int is_sensor, int type, char *workarea, size_t size, int start, int *next) { uint64_t elapsed = 0; uint32_t kernbuf_pa; void *kernbuf; int status; int rc; rc = sc_get_rmo_buffer(size, &kernbuf, &kernbuf_pa); if (rc) return rc; do { rc = sc_rtas_call(token, 5, 2, is_sensor, type, kernbuf_pa, size, start, &status, next); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (rc == 0) memcpy(workarea, kernbuf, size); (void)sc_free_rmo_buffer(kernbuf, kernbuf_pa, size); dbg1("(%d, %d, %p, %d, %d, %p) = %d, %d\n", is_sensor, type, workarea, size, start, next, rc ? rc : status, *next); return rc ? rc : status; } /** * sc_get_power_level * @brief Set up the get-power-level rtas system call * * @param token * @param powerdomain * @param level * @return 0 on success, !0 otherwise */ int sc_get_power_level(int token, int powerdomain, int *level) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 1, 2, powerdomain, &status, level); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(%d, %p) = %d, %d\n", powerdomain, level, rc ? rc : status, *level); return rc ? rc : status; } /** * sc_get_sensor * @brief Set up the get-sensor rtas system call * * @param token * @param sensor * @param index * @param state * @return 0 on success, !0 otherwise */ int sc_get_sensor(int token, int sensor, int index, int *state) { uint64_t elapsed = 0; uint32_t be_state; int status; int rc; do { rc = sc_rtas_call(token, 2, 2, htobe32(sensor), htobe32(index), &status, &be_state); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); *state = be32toh(be_state); dbg1("(%d, %d, %p) = %d, %d\n", sensor, index, state, rc ? rc : status, *state); return rc ? rc : status; } /** * sc_get_sysparm * @brief Setup the get-system-parameter rtas system call * * @param token * @param parameter * @param length * @param data * @return 0 on success, !0 otherwise */ int sc_get_sysparm(int token, unsigned int parameter, unsigned int length, char *data) { uint64_t elapsed = 0; uint32_t kernbuf_pa; void *kernbuf; int status; int rc; rc = sc_get_rmo_buffer(length, &kernbuf, &kernbuf_pa); if (rc) return rc; do { rc = sc_rtas_call(token, 3, 1, parameter, kernbuf_pa, length, &status); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (rc == 0) memcpy(data, kernbuf, length); (void)sc_free_rmo_buffer(kernbuf, kernbuf_pa, length); dbg1("(%d, %d, %p) = %d\n", parameter, length, data, rc ? rc : status); return rc ? rc : status; } /** * sc_get_time * @brief Set up the get-time rtas system call * * @param token * @param year * @param month * @param day * @param hour * @param min * @param sec * @param nsec * @return 0 on success, !0 otherwise */ int sc_get_time(int token, uint32_t *year, uint32_t *month, uint32_t *day, uint32_t *hour, uint32_t *min, uint32_t *sec, uint32_t *nsec) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 0, 8, &status, year, month, day, hour, min, sec, nsec); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("() = %d, %d, %d, %d, %d, %d, %d, %d\n", rc ? rc : status, *year, *month, *day, *hour, *min, *sec, *nsec); return rc ? rc : status; } /** * sc_get_vpd * * @param token * @param loc_code * @param workarea * @param size * @param sequence * @param seq_next * @param bytes_ret * @return 0 on success, !0 otherwise */ int sc_get_vpd(int token, char *loc_code, char *workarea, size_t size, unsigned int sequence, unsigned int *seq_next, unsigned int *bytes_ret) { uint32_t kernbuf_pa; uint32_t loc_pa = 0; uint32_t rmo_pa = 0; uint64_t elapsed = 0; void *kernbuf; void *rmobuf; void *locbuf; int status; int rc; rc = sc_get_rmo_buffer(size + PAGE_SIZE, &rmobuf, &rmo_pa); if (rc) return rc; kernbuf = rmobuf + PAGE_SIZE; kernbuf_pa = rmo_pa + PAGE_SIZE; locbuf = rmobuf; loc_pa = rmo_pa; /* If user didn't set loc_code, copy a NULL string */ strncpy(locbuf, loc_code ? loc_code : "", PAGE_SIZE); *seq_next = sequence; do { sequence = *seq_next; rc = sc_rtas_call(token, 4, 3, loc_pa, kernbuf_pa, size, sequence, &status, seq_next, bytes_ret); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (rc == 0) memcpy(workarea, kernbuf, size); (void) sc_free_rmo_buffer(rmobuf, rmo_pa, size + PAGE_SIZE); dbg1("(%s, 0x%p, %d, %d) = %d, %d, %d", loc_code ? loc_code : "NULL", workarea, size, sequence, status, *seq_next, *bytes_ret); return rc ? rc : status; } /** * sc_lpar_perftools * * @param token * @param subfunc * @param workarea * @param length * @param sequence * @param seq_next * @return 0 on success, !0 otherwise */ int sc_lpar_perftools(int token, int subfunc, char *workarea, unsigned int length, unsigned int sequence, unsigned int *seq_next) { uint64_t elapsed = 0; uint32_t kernbuf_pa; void *kernbuf; int status; int rc; rc = sc_get_rmo_buffer(length, &kernbuf, &kernbuf_pa); if (rc) return rc; memcpy(kernbuf, workarea, PAGE_SIZE); *seq_next = sequence; do { sequence = *seq_next; rc = sc_rtas_call(token, 5, 2, subfunc, 0, kernbuf_pa, length, sequence, &status, seq_next); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (rc == 0) memcpy(workarea, kernbuf, length); (void)sc_free_rmo_buffer(kernbuf, kernbuf_pa, length); dbg1("(%d, %p, %d, %d, %p) = %d, %d\n", subfunc, workarea, length, sequence, seq_next, rc ? rc : status, *seq_next); return rc ? rc : status; } /** * sc_platform_dump * * @param token * @param dump_tag * @param sequence * @param buffer * @param length * @param seq_next * @param bytes_ret * @return 0 on success, !0 otherwise */ int sc_platform_dump(int token, uint64_t dump_tag, uint64_t sequence, void *buffer, size_t length, uint64_t * seq_next, uint64_t * bytes_ret) { uint64_t elapsed = 0; uint32_t kernbuf_pa = 0; uint32_t next_hi, next_lo; uint32_t bytes_hi, bytes_lo; void *kernbuf; int status; int rc; if (buffer) { rc = sc_get_rmo_buffer(length, &kernbuf, &kernbuf_pa); if (rc) return rc; } *seq_next = sequence; do { sequence = *seq_next; rc = sc_rtas_call(token, 6, 5, BITS32_HI(dump_tag), BITS32_LO(dump_tag), BITS32_HI(sequence), BITS32_LO(sequence), kernbuf_pa, length, &status, &next_hi, &next_lo, &bytes_hi, &bytes_lo); if (rc < 0) break; *seq_next = BITS64(next_hi, next_lo); dbg1("%s: seq_next = 0x%llx\n", __FUNCTION__, *seq_next); rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (buffer && (rc == 0)) memcpy(buffer, kernbuf, length); if (kernbuf) (void)sc_free_rmo_buffer(kernbuf, kernbuf_pa, length); *bytes_ret = BITS64(bytes_hi, bytes_lo); dbg1("(0x%llx, 0x%llx, %p, %d, %p, %p) = %d, 0x%llx, 0x%llx\n", dump_tag, sequence, buffer, length, seq_next, bytes_ret, rc ? rc : status, *seq_next, *bytes_ret); return rc ? rc : status; } /** * sc_read_slot_reset * @brief Set up the read-slot-reset-state rtas system call * * @param token * @param cfg_addr configuration address of slot to read * @param phbid PHB ID of slot to read * @param state * @param eeh * @return 0 on success, !0 otherwise */ int sc_read_slot_reset(int token, uint32_t cfg_addr, uint64_t phbid, int *state, int *eeh) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 3, 3, cfg_addr, BITS32_HI(phbid), BITS32_LO(phbid), &status, state, eeh); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(0x%x, 0x%llx, %p, %p) = %d, %d, %d\n", cfg_addr, phbid, state, eeh, rc ? rc : status, *state, *eeh); return rc ? rc : status; } /** * sc_scan_log_dump * * @param token * @param buffer * @param length * @return 0 on success, !0 otherwise */ int sc_scan_log_dump(int token, void *buffer, size_t length) { uint64_t elapsed = 0; uint32_t kernbuf_pa; void *kernbuf; int status; int rc; rc = sc_get_rmo_buffer(length, &kernbuf, &kernbuf_pa); if (rc) return rc; memcpy(kernbuf, buffer, length); do { rc = sc_rtas_call(token, 2, 1, kernbuf_pa, length, &status); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (rc == 0) memcpy(buffer, kernbuf, length); (void)sc_free_rmo_buffer(kernbuf, kernbuf_pa, length); dbg1("(%p, %d) = %d\n", buffer, length, rc ? rc : status); return rc ? rc : status; } /** * sc_set_dynamic_indicator * * @param token * @param indicator * @param new_value * @param loc_code * @return 0 on success, !0 otherwise */ int sc_set_dynamic_indicator(int token, int indicator, int new_value, void *loc_code) { uint32_t loc_pa = 0; uint64_t elapsed = 0; void *locbuf; uint32_t size; int status; int rc; size = *(uint32_t *)loc_code + sizeof(uint32_t); rc = sc_get_rmo_buffer(size, &locbuf, &loc_pa); if (rc) return rc; memcpy(locbuf, loc_code, size); do { rc = sc_rtas_call(token, 3, 1, indicator, new_value, loc_pa, &status); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); (void) sc_free_rmo_buffer(locbuf, loc_pa, size); dbg1("(%d, %d, %s) = %d\n", indicator, new_value, (char *)loc_code, rc ? rc : status); return rc ? rc : status; } /** * sc_set_eeh_option * * @param token * @param cfg_addr * @param phbid * @param function * @return 0 on success, !0 otherwise */ int sc_set_eeh_option(int token, uint32_t cfg_addr, uint64_t phbid, int function) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 4, 1, cfg_addr, BITS32_HI(phbid), BITS32_LO(phbid), function, &status); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(0x%x, 0x%llx, %d) = %d\n", cfg_addr, phbid, function, rc ? rc : status); return rc ? rc : status; } /** * sc_set_indicator * * @param token * @param indicator * @param index * @param new_value * @return 0 on success, !0 otherwise */ int sc_set_indicator(int token, int indicator, int index, int new_value) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 3, 1, htobe32(indicator), htobe32(index), htobe32(new_value), &status); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(%d, %d, %d) = %d\n", indicator, index, new_value, rc ? rc : status); return rc ? rc : status; } /** * sc_set_power_level * * @param token * @param powerdomain * @param level * @param setlevel * @return 0 on success, !0 otherwise */ int sc_set_power_level(int token, int powerdomain, int level, int *setlevel) { uint64_t elapsed = 0; uint32_t be_setlevel; int status; int rc; do { rc = sc_rtas_call(token, 2, 2, htobe32(powerdomain), htobe32(level), &status, &be_setlevel); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); *setlevel = be32toh(be_setlevel); dbg1("(%d, %d, %p) = %d, %d\n", powerdomain, level, setlevel, rc ? rc : status, *setlevel); return rc ? rc : status; } /** * sc_set_poweron_time * * @param token * @param year * @param month * @param day * @param hour * @param min * @param sec * @param nsec * @return 0 on success, !0 otherwise */ int sc_set_poweron_time(int token, uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 7, 1, year, month, day, hour, min, sec, nsec, &status); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(%d, %d, %d, %d, %d, %d, %d) = %d\n", year, month, day, hour, min, sec, nsec, rc ? rc : status); return rc ? rc : status; } /** * sc_set_sysparm * * @param token * @param parameter * @param data * @return 0 on success, !0 otherwise */ int sc_set_sysparm(int token, unsigned int parameter, char *data) { uint64_t elapsed = 0; uint32_t kernbuf_pa; void *kernbuf; int status; short size; int rc; size = *(short *)data; rc = sc_get_rmo_buffer(size + sizeof(short), &kernbuf, &kernbuf_pa); if (rc) return rc; memcpy(kernbuf, data, size + sizeof(short)); do { rc = sc_rtas_call(token, 2, 1, parameter, kernbuf_pa, &status); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); (void)sc_free_rmo_buffer(kernbuf, kernbuf_pa, size + sizeof(short)); dbg1("(%d, %p) = %d\n", parameter, data, rc ? rc : status); return rc ? rc : status; } /** * sc_set_time * * @param token * @param year * @param month * @param day * @param hour * @param min * @param sec * @param nsec * @return 0 on success, !0 otherwise */ int sc_set_time(int token, uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 7, 1, year, month, day, hour, min, sec, nsec, &status); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("(%d, %d, %d, %d, %d, %d, %d) = %d\n", year, month, day, hour, min, sec, nsec, rc ? rc : status); return rc ? rc : status; } /** * sc_suspend_me * * @param token * @return 0 on success, !0 otherwise */ int sc_suspend_me(int token, uint64_t streamid) { uint64_t elapsed = 0; int status; int rc; do { rc = sc_rtas_call(token, 2, 1, BITS32_HI(streamid), BITS32_LO(streamid), &status); if (rc) return rc; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); dbg1("() = %d\n", rc ? rc : status); return rc ? rc : status; } /** * sc_update_nodes * @brief Set up the ibm,update-nodes rtas system call * * @param token * @param workarea * @param scope * @return 0 on success, !0 otherwise * * Note that the PAPR defines the work area as 4096 bytes (as * opposed to a page), thus we use that rather than PAGE_SIZE below. */ int sc_update_nodes(int token, char *workarea, unsigned int scope) { uint32_t workarea_pa; uint64_t elapsed = 0; void *kernbuf; int status; int rc; rc = sc_get_rmo_buffer(4096, &kernbuf, &workarea_pa); if (rc) return rc; memcpy(kernbuf, workarea, 4096); do { rc = sc_rtas_call(token, 2, 1, workarea_pa, scope, &status); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (rc == 0) memcpy(workarea, kernbuf, 4096); (void)sc_free_rmo_buffer(kernbuf, workarea_pa, PAGE_SIZE); dbg1("(%p) %d = %d\n", workarea, scope, rc ? rc : status); return rc ? rc : status; } /** * sc_update_properties * @brief Set up the ibm,update-properties rtas system call * * @param token * @param workarea * @param scope * @return 0 on success, !0 otherwise * * Note that the PAPR defines the work area as 4096 bytes (as * opposed to a page), thus we use that rather than PAGE_SIZE below. */ int sc_update_properties(int token, char *workarea, unsigned int scope) { uint32_t workarea_pa; uint64_t elapsed = 0; void *kernbuf; int status; int rc; rc = sc_get_rmo_buffer(4096, &kernbuf, &workarea_pa); if (rc) return rc; memcpy(kernbuf, workarea, 4096); do { rc = sc_rtas_call(token, 2, 1, workarea_pa, scope, &status); if (rc < 0) break; rc = handle_delay(status, &elapsed); } while (rc == CALL_AGAIN); if (rc == 0) memcpy(workarea, kernbuf, 4096); (void)sc_free_rmo_buffer(kernbuf, workarea_pa, PAGE_SIZE); dbg1("(%p) %d = %d\n", workarea, scope, rc ? rc : status); return rc ? rc : status; } /* ========================= END OF FILE ================== */ librtas-1.3.10/librtas_src/procfs.h0000644000175100001440000000243612313120670016254 0ustar nfontusers/** * @file procfs.h * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author John Rose */ #ifndef _PROCFS_H_ #define _PROCFS_H_ #define PFS_BUF_SIZE 4096 struct rtas_set_indicator { int indicator; /* Indicator Token */ int index; /* Indicator Index */ int new_value; /* New value or State */ int status; /* Returned status */ }; struct rtas_get_sensor { int sensor; /* Sensor Token */ int index; /* Sensor Index */ int state; /* Returned State of the sensor */ int status; /* Returned status */ }; struct rtas_cfg_connector { char workarea[PFS_BUF_SIZE]; /* Config work area */ int status; /* Returned status */ }; struct rtas_get_power_level { int powerdomain; /* Power Domain Token */ int level; /* Current Power Level */ int status; /* Returned status */ }; struct rtas_set_power_level { int powerdomain; /* Power Domain Token */ int level; /* Power Level Token */ int setlevel; /* Returned Set Power Level */ int status; /* Returned status */ }; struct rtas_get_sysparm { unsigned int parameter; /* System parameter value */ char data[PFS_BUF_SIZE]; /* Parameter data */ unsigned int length; /* Length of data buffer */ int status; /* Returned status */ }; #endif librtas-1.3.10/librtas_src/syscall_rmo.c0000644000175100001440000002034212313120670017276 0ustar nfontusers/** * @file syscall_rmo.c * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author John Rose */ #include #include #include #include #include #include #include "common.h" #include "syscall.h" #include "librtas.h" #define MAX_PAGES 64 struct workarea_config { int init_done; int lockfile_fd; struct region kern_region; uint64_t pages_map; }; static const char *rmo_filename = "rmo_buffer"; static const char *devmem_path = "/dev/mem"; static const char *lockfile_path = "/var/lock/LCK..librtas"; static struct workarea_config wa_config = { .lockfile_fd = -1, .init_done = 0, .pages_map = 0ll, }; /** * read_kregion_bounds * @brief Read the kernel region bounds for RMO memory * * @param kregion * @return 0 on success, !0 otherwise */ static int read_kregion_bounds(struct region *kregion) { char *buf; int fd; int rc; fd = open_proc_rtas_file(rmo_filename, O_RDONLY); if (fd < 0) { dbg1("Could not open workarea file\n"); return RTAS_IO_ASSERT; } rc = read_entire_file(fd, &buf, NULL); close(fd); if (rc) { free(buf); return rc; } sscanf(buf, "%llx %x", &kregion->addr, &kregion->size); free(buf); if (!(kregion->size && kregion->addr) || (kregion->size > (PAGE_SIZE * MAX_PAGES))) { dbg1("Unexpected kregion bounds\n"); return RTAS_IO_ASSERT; } return 0; } /** * get_bits * * @param lobit * @param hibit * @param mask * @return 0 on success, !0 otherwise */ static inline uint64_t get_bits(short lobit, short hibit, uint64_t mask) { short num_bits = hibit - lobit + 1; uint64_t ones_mask = (1ll << (num_bits)) - 1; return ((mask >> lobit) & ones_mask); } /** * set_bits * * @param lobit * @param hibit * @param value * @param mask * @return 0 on success, !0 otherwise */ static inline void set_bits(short lobit, short hibit, uint64_t value, uint64_t * mask) { short num_bits = hibit - lobit + 1; uint64_t ones_mask = (1ll << (num_bits)) - 1; *mask &= ~(ones_mask << lobit); *mask |= value << lobit; } /** * acquire_file_lock * * @param start * @param size * @return 0 on success, !0 otherwise */ static int acquire_file_lock(off_t start, size_t size) { struct flock flock; int rc; /* Lazily open lock file */ if (wa_config.lockfile_fd < 0) { wa_config.lockfile_fd = open(lockfile_path, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); if (wa_config.lockfile_fd < 0) { dbg1("could not open lockfile %s\n", lockfile_path); return RTAS_IO_ASSERT; } } flock.l_start = start; flock.l_type = F_WRLCK; flock.l_whence = SEEK_SET; flock.l_len = size; flock.l_pid = getpid(); rc = fcntl(wa_config.lockfile_fd, F_SETLKW, &flock); if (rc < 0) { /* Expected to fail for regions used by other processes */ dbg1("fcntl failed for [0x%lx, 0x%x]\n", start, size); return RTAS_IO_ASSERT; } return 0; } /** * release_file_lock * * @param start * @param size * @return 0 on success, !0 otherwise */ static int release_file_lock(off_t start, size_t size) { struct flock flock; int rc; flock.l_start = start; flock.l_type = F_UNLCK; flock.l_whence = SEEK_SET; flock.l_len = size; flock.l_pid = getpid(); rc = fcntl(wa_config.lockfile_fd, F_SETLK, &flock); if (rc < 0) { dbg1("fcntl failed for [0x%lx, 0x%x]\n", start, size); return RTAS_IO_ASSERT; } return 0; } /** * get_phys_region * * @param size * @param phys_addr * @return 0 on success, !0 otherwise */ static int get_phys_region(size_t size, uint32_t * phys_addr) { struct region *kregion = &wa_config.kern_region; uint32_t addr = 0; uint64_t bits; int n_pages; int i; if (size > kregion->size) { dbg1("Invalid buffer size 0x%x requested\n", size); return RTAS_IO_ASSERT; } n_pages = size / PAGE_SIZE; for (i = 0; i < MAX_PAGES; i++) { if ((i * PAGE_SIZE) >= kregion->size) break; bits = get_bits(i, i + n_pages - 1, wa_config.pages_map); if (bits == 0ll) { if (acquire_file_lock(i, n_pages) == 0) { set_bits(i, i + n_pages - 1, (1 << n_pages) - 1, &wa_config.pages_map); addr = kregion->addr + (i * PAGE_SIZE); break; } } } if (!addr) { dbg1("Could not find available workarea space\n"); return RTAS_IO_ASSERT; } *phys_addr = addr; return 0; } /** * release_phys_region * * @param phys_addr * @param size * @return 0 on success, !0 otherwise */ static int release_phys_region(uint32_t phys_addr, size_t size) { struct region *kregion = &wa_config.kern_region; int first_page; int n_pages; uint64_t bits; int rc; if (size > kregion->size) { dbg1("Invalid buffer size 0x%x requested\n", size); return RTAS_IO_ASSERT; } first_page = (phys_addr - kregion->addr) / PAGE_SIZE; n_pages = size / PAGE_SIZE; bits = get_bits(first_page, first_page + n_pages - 1, wa_config.pages_map); if (bits != ((1 << n_pages) - 1)) { dbg1("Invalid region [0x%x, 0x%x]\n", phys_addr, size); return RTAS_IO_ASSERT; } set_bits(first_page, first_page + n_pages - 1, 0, &wa_config.pages_map); rc = release_file_lock(first_page, n_pages); return rc; } /** * init_workarea_config * * @return 0 on success, !0 otherwise */ static int init_workarea_config() { int rc; /* Read bounds of reserved kernel region */ rc = read_kregion_bounds(&wa_config.kern_region); if (rc) return rc; wa_config.init_done = 1; return 0; } /** * mmap_dev_mem * * @param phys_addr * @param size * @param buf * @return 0 on success, !0 otherwise */ static int mmap_dev_mem(uint32_t phys_addr, size_t size, void **buf) { void *newbuf; int fd; fd = open(devmem_path, O_RDWR); if (fd < 0) { dbg1("Failed to open %s\n", devmem_path); return RTAS_IO_ASSERT; } newbuf = mmap((void *)0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, phys_addr); close(fd); if (newbuf == MAP_FAILED) { dbg1("mmap failed\n"); return RTAS_IO_ASSERT; } *buf = newbuf; return 0; } /** * munmap_dev_mem * * @param buf * @param size * @return 0 on success, !0 otherwise */ static int munmap_dev_mem(void *buf, size_t size) { int rc; int fd; fd = open(devmem_path, O_RDWR); if (fd < 0) { dbg1("Failed to open %s\n", devmem_path); return RTAS_IO_ASSERT; } rc = munmap(buf, size); close(fd); if (rc < 0) { dbg1("munmap failed\n"); return RTAS_IO_ASSERT; } return 0; } /** * sc_interface_exists * * @return 0 on success, !0 otherwise */ int sc_interface_exists() { int fd = open_proc_rtas_file(rmo_filename, O_RDONLY); int exists; exists = (fd >= 0); if (exists) close(fd); return exists; } /** * sc_free_rmo_buffer * * @param buf virtual address of mmap()'ed buffer * @param phys_addr physical address of low mem buffer * @param size size of buffer * @return 0 on success, !0 otherwise * RTAS_FREE_ERR - Free called before get * RTAS_IO_ASSERT - Unexpected I/O Error */ int sc_free_rmo_buffer(void *buf, uint32_t phys_addr, size_t size) { int n_pages; int rc; n_pages = size / PAGE_SIZE; /* Check for multiple of page size */ if (size % PAGE_SIZE) { /* Round up to multiple of PAGE_SIZE */ n_pages++; size = n_pages * PAGE_SIZE; } if (!wa_config.init_done) { dbg1("Attempting to free before calling get()\n"); return RTAS_FREE_ERR; } rc = munmap_dev_mem(buf, size); if (rc) return rc; rc = release_phys_region(phys_addr, size); return rc; } /** * sc_get_rmo_buffer * * @param size Size of requested region. Must be a multiple of 4096. * @param buf Assigned to mmap'ed buffer of acquired region * @param phys_addr Assigned to physical address of acquired region * @return 0 on success, !0 otherwise * RTAS_NO_MEM - Out of heap memory * RTAS_NO_LOWMEM - Out of rmo memory * RTAS_IO_ASSERT - Unexpected I/O Error */ int sc_get_rmo_buffer(size_t size, void **buf, uint32_t * phys_addr) { uint32_t addr; int n_pages; int rc; dbg1("RMO buffer request, size: %d\n", size); n_pages = size / PAGE_SIZE; /* Check for multiple of page size */ if (size % PAGE_SIZE) { /* Round up to multiple of PAGE_SIZE */ n_pages++; size = n_pages * PAGE_SIZE; } if (!wa_config.init_done) { rc = init_workarea_config(); if (rc) return rc; } rc = get_phys_region(size, &addr); if (rc) return rc; rc = mmap_dev_mem(addr, size, buf); if (rc) return rc; *phys_addr = addr; return 0; } librtas-1.3.10/librtas_src/common.h0000644000175100001440000000742112313120670016247 0ustar nfontusers/** * @file common.h * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author John Rose */ #ifndef _COMMON_H_ #define _COMMON_H_ #include #include #define RC_BUSY -2 #define EXTENDED_DELAY_MIN 9900 #define EXTENDED_DELAY_MAX 9905 #define PAGE_SIZE 4096 /* * When adding an RTAS call, argument list below should * consist of an int token followed by the call arguments * defined in librtas.h */ struct rtas_operations { int (*activate_firmware)(int token); int (*cfg_connector)(int token, char *workarea); int (*delay_timeout)(uint64_t timeout_ms); int (*display_char)(int token, char c); int (*display_msg)(int token, char *buf); int (*errinjct)(int token, int etoken, int otoken, char *workarea); int (*errinjct_close)(int token, int otoken); int (*errinjct_open)(int token, int *otoken); int (*free_rmo_buffer)(void *buf, uint32_t phys_addr, size_t size); int (*get_config_addr_info2)(int token, uint32_t cfg_addr, uint64_t phb_id, uint32_t func, uint32_t *info); int (*get_dynamic_sensor)(int token, int sensor, void *loc_code, int *state); int (*get_indices)(int token, int is_sensor, int type, char *workarea, size_t size, int start, int *next); int (*get_power_level)(int token, int powerdomain, int *level); int (*get_rmo_buffer)(size_t size, void **buf, uint32_t *phys_addr); int (*get_sensor)(int token, int sensor, int index, int *state); int (*get_sysparm)(int token, unsigned int parameter, unsigned int length, char *data); int (*get_time)(int token, uint32_t *year, uint32_t *month, uint32_t *day, uint32_t *hour, uint32_t *min, uint32_t *sec, uint32_t *nsec); int (*get_vpd)(int token, char *loc_code, char *workarea, size_t size, unsigned int sequence, unsigned int *seq_next, unsigned int *bytes_ret); int (*lpar_perftools)(int token, int subfunc, char *workarea, unsigned int length, unsigned int sequence, unsigned int *seq_next); int (*platform_dump)(int token, uint64_t dump_tag, uint64_t sequence, void *buffer, size_t length, uint64_t *next_seq, uint64_t *bytes_ret); int (*read_slot_reset)(int token, uint32_t cfg_addr, uint64_t phbid, int *state, int *eeh); int (*scan_log_dump)(int token, void *buffer, size_t length); int (*set_dynamic_indicator)(int token, int indicator, int new_value, void *loc_code); int (*set_eeh_option)(int token, uint32_t cfg_addr, uint64_t phbid, int function); int (*set_indicator)(int token, int indicator, int index, int new_value); int (*set_power_level)(int token, int powerdomain, int level, int *setlevel); int (*set_poweron_time)(int token, uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec); int (*set_sysparm)(int token, unsigned int parameter, char *data); int (*set_time)(int token, uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec); int (*suspend_me)(int token, uint64_t streamid); int (*update_nodes)(int token, char *workarea, unsigned int scope); int (*update_properties)(int token, char *workarea, unsigned int scope); int (*interface_exists)(); }; struct librtas_config { struct rtas_operations *rtas_ops; uint64_t rtas_timeout_ms; int debug; }; extern int open_proc_rtas_file(const char *name, int mode); extern int rtas_token(const char *call_name); extern int read_entire_file(int fd, char **buf, size_t *len); extern struct librtas_config config; #define dbg(_lvl, _fmt, _args...) \ do { \ if (config.debug >= _lvl) \ printf("librtas %s(): " _fmt, __FUNCTION__, ##_args); \ } while (0) #define dbg1(_fmt, _args...) \ do { \ dbg(1, _fmt, ##_args); \ } while (0) \ #endif librtas-1.3.10/librtas_src/procfs_calls.c0000644000175100001440000001255412313120670017427 0ustar nfontusers/** * @file procfs_calls.c * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author John Rose */ #include #include #include #include "common.h" #include "procfs.h" #include "librtas.h" #define CFG_CONN_FILE "cfg_connector" #define GET_POWER_FILE "get_power" #define GET_SENSOR_FILE "get_sensor" #define GET_SYSPARM_FILE "get_sysparm" #define SET_INDICATOR_FILE "set_indicator" #define SET_POWER_FILE "set_power" int pfs_cfg_connector(int token, char *workarea); int pfs_get_power(int token, int domain, int *level); int pfs_get_sensor(int token, int sensor, int index, int *state); int pfs_get_sysparm(int token, unsigned int parameter, unsigned int length, char *data); int pfs_set_indicator(int token, int indicator, int index, int new_value); int pfs_set_power(int token, int domain, int level, int *setlevel); int procfs_interface_exists(); struct rtas_operations procfs_rtas_ops = { .cfg_connector = pfs_cfg_connector, .get_power_level = pfs_get_power, .get_sensor = pfs_get_sensor, .get_sysparm = pfs_get_sysparm, .set_indicator = pfs_set_indicator, .set_power_level = pfs_set_power, .interface_exists = procfs_interface_exists, }; /** * do_rtas_op * @brief Perform the actual rtas call via the supplied procfs file * * @param proc_filename procfs filename for the rtas call * @param buf buffer to read rtas call results into * @param buf_size size of the buf * @return 0 on success, !0 otherwise */ static int do_rtas_op(const char *proc_filename, void *buf, size_t buf_size) { int rc; int fd; /* Open /proc file */ fd = open_proc_rtas_file(proc_filename, O_RDWR); if (fd <= 0) return RTAS_KERNEL_IMP; /* Write RTAS call args buf */ rc = write(fd, buf, buf_size); if (rc < (int)buf_size) { fprintf(stderr, "Failed to write proc file %s\n", proc_filename); return RTAS_IO_ASSERT; } /* Read results */ rc = read(fd, buf, buf_size); if (rc < (int)buf_size) { fprintf(stderr, "Failed to read proc file %s\n", proc_filename); return RTAS_IO_ASSERT; } /* Close /proc file */ close(fd); return 0; } /** * pfs_cfg_connector * @brief Set up arguments for procfs cfg-connector rtas call * * @param token * @param workarea * @return 0 on success, !0 otherwise */ int pfs_cfg_connector(int token, char *workarea) { struct rtas_cfg_connector args; int rc; memcpy(&args.workarea[0], workarea, PAGE_SIZE); rc = do_rtas_op(CFG_CONN_FILE, &args, sizeof(struct rtas_cfg_connector)); if (rc) return rc; memcpy(workarea, &args.workarea[0], PAGE_SIZE); return args.status; } /** * pfs_get_power * @brief Set up args for procfs get-power-level rtas call * * @param token * @param domain * @param level * @return 0 on success, !0 otherwise */ int pfs_get_power(int token, int domain, int *level) { struct rtas_get_power_level args; int rc; args.powerdomain = domain; rc = do_rtas_op(GET_POWER_FILE, &args, sizeof(struct rtas_get_power_level)); if (rc) return rc; *level = args.level; return args.status; } /** * pfs_get_sensor * @brief Set up args for procfs get-sensor-state rtas call * * @param token * @param sensor * @param index * @param state * @return 0 on success, !0 otherwise */ int pfs_get_sensor(int token, int sensor, int index, int *state) { struct rtas_get_sensor args; int rc; args.sensor = sensor; args.index = index; rc = do_rtas_op(GET_SENSOR_FILE, &args, sizeof(struct rtas_get_sensor)); if (rc) return rc; *state = args.state; return args.status; } /** * pfs_get_sysparm * @brief Set up call to procfs get-system-parameter rtas call * * @param token * @param parameter * @param length * @param data * @return 0 on success, !0 otherwise */ int pfs_get_sysparm(int token, unsigned int parameter, unsigned int length, char *data) { struct rtas_get_sysparm args; int rc; args.parameter = parameter; args.length = length; memcpy(&args.data[0], data, PAGE_SIZE); rc = do_rtas_op(GET_SYSPARM_FILE, &args, sizeof(struct rtas_get_sysparm)); if (args.status == 0) memcpy(data, &args.data[0], PAGE_SIZE); return args.status; } /** * pfs_set_indicator * @brief Set up call to procfs set-indicator rtas call * * @param token * @param indicator * @param index * @param new_value * @return 0 on success, !0 otherwise */ int pfs_set_indicator(int token, int indicator, int index, int new_value) { struct rtas_set_indicator args; int rc; args.indicator = indicator; args.index = index; args.new_value = new_value; rc = do_rtas_op(SET_INDICATOR_FILE, &args, sizeof(struct rtas_set_indicator)); if (rc) return rc; return args.status; } /** * pfs_set_power * * @param token * @param domain * @param level * @param setlevel * @return 0 on success, !0 otherwise */ int pfs_set_power(int token, int domain, int level, int *setlevel) { struct rtas_set_power_level args; int rc; args.powerdomain = domain; args.level = level; rc = do_rtas_op(SET_POWER_FILE, &args, sizeof(struct rtas_set_power_level)); if (rc) return rc; *setlevel = args.setlevel; return args.status; } /** * procfs_interfac_exists * @brief VAlidate that the procfs interface to rtas exists * * @return 0 on success, !0 otherwise */ int procfs_interface_exists() { int fd; int exists; fd = open_proc_rtas_file("get_sensor", O_RDWR); exists = (fd >= 0); if (exists) close(fd); return exists; } librtas-1.3.10/librtas_src/ofdt.c0000644000175100001440000000561012313120670015704 0ustar nfontusers/** * @file ofdt.c * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author John Rose */ #include #include #include #include #include #include #include #include "librtas.h" #include "common.h" static const char *ofdt_rtas_path = "/proc/device-tree/rtas"; /** * open_prop_file * @brief Open the property name located at the specified property path * * @param prop_path path to the property name * @param prop_name property name * @param fd reference to file descriptor * @return 0 on success, -1 on failure */ static int open_prop_file(const char *prop_path, const char *prop_name, int *fd) { char *path; int len; /* allocate enough for two string, a slash and trailing NULL */ len = strlen(prop_path) + strlen(prop_name) + 1 + 1; path = malloc(len); if (path == NULL) { errno = ENOMEM; return -1; } snprintf(path, len, "%s/%s", prop_path, prop_name); *fd = open(path, O_RDONLY); free(path); if (*fd < 0) { errno = ENOSYS; return -1; } return 0; } /** * get_property * @brief Open a property file and read in its contents * * @param prop_path path to the property file * @param prop_name propery name * @param prop_val * @param prop_len * @return 0 on success, !0 otherwise */ static int get_property(const char *prop_path, const char *prop_name, char **prop_val, size_t * prop_len) { int fd; int rc; rc = open_prop_file(prop_path, prop_name, &fd); if (rc) return rc; rc = read_entire_file(fd, prop_val, prop_len); close(fd); return rc; } /** * rtas_token * @brief Retrive a rtas token for a given name * * @param call_name rtas name to retrieve token for * @return 0 on success, !0 otherwise */ int rtas_token(const char *call_name) { char *prop_buf = NULL; size_t len; int rc; rc = get_property(ofdt_rtas_path, call_name, &prop_buf, &len); if (rc < 0) return RTAS_UNKNOWN_OP; #if __BYTE_ORDER == __LITTLE_ENDIAN rc = bswap_32(*(int *)prop_buf); #else rc = *(int *)prop_buf; #endif free(prop_buf); return rc; } #define BLOCK_SIZE 4096 /** * read_entire_file * @brief Read in an entire file into the supplied buffer * * @param fd opened file descriptor for file to read * @param buf buffer to read file into * @param len variable to return amount read into buffer * @return 0 on success, !0 otherwise */ int read_entire_file(int fd, char **buf, size_t * len) { size_t buf_size = 0; size_t off = 0; int rc; *buf = NULL; do { buf_size += BLOCK_SIZE; if (*buf == NULL) *buf = malloc(buf_size); else *buf = realloc(*buf, buf_size); if (*buf == NULL) { errno = ENOMEM; return -1; } rc = read(fd, *buf + off, BLOCK_SIZE); if (rc < 0) { dbg1("read failed\n"); errno = EIO; return -1; } off += rc; } while (rc == BLOCK_SIZE); if (len) *len = off; return 0; } librtas-1.3.10/librtas_src/common.c0000644000175100001440000004234112313120670016242 0ustar nfontusers/** * @file common.c * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author John Rose */ #include #include #include #include #include "librtas.h" #include "common.h" extern struct rtas_operations syscall_rtas_ops; extern struct rtas_operations procfs_rtas_ops; struct librtas_config config = { NULL, 0ll, 0 }; #define SANITY_CHECKS(_name) \ /* Check credentials */ \ if (geteuid() != (uid_t) 0) \ return RTAS_PERM; \ \ /* Check for any kernel RTAS interface */ \ if (config.rtas_ops == NULL) \ if (init_interface()) \ return RTAS_KERNEL_INT; \ \ /* Check for kernel implementation of function */ \ if (config.rtas_ops->_name == NULL) \ return RTAS_KERNEL_IMP #define CALL_RTAS_METHOD(_name, _token, _args...) \ SANITY_CHECKS(_name); \ \ /* Call interface-specific RTAS routine, \ * passing in token */ \ return config.rtas_ops->_name(_token, ##_args) #define CALL_HELPER_METHOD(_name, _args...) \ SANITY_CHECKS(_name); \ \ /* Call interface-specific helper routine */ \ return config.rtas_ops->_name(_args) \ #define MAX_PATH_LEN 80 /** * open_proc_rtas_file * @brief Open the proc rtas file * * @param name filename to open * @param mode mode to open file in * @return results of open() call */ int open_proc_rtas_file(const char *name, int mode) { const char *proc_rtas_paths[] = { "/proc/ppc64/rtas", "/proc/rtas" }; char full_name[MAX_PATH_LEN]; int npaths; int fd; int i; npaths = sizeof(proc_rtas_paths) / sizeof(char *); for (i = 0; i < npaths; i++) { sprintf(full_name, "%s/%s", proc_rtas_paths[i], name); fd = open(full_name, mode, S_IRUSR | S_IWUSR); if (fd >= 0) break; } if (fd < 0) dbg1("Failed to open %s\n", full_name); return fd; } /** * init_interface * @brief Initialize the librtas interface to use * * @return 0 on sucess, 1 on failure */ static int init_interface() { if (syscall_rtas_ops.interface_exists()) config.rtas_ops = &syscall_rtas_ops; else if (procfs_rtas_ops.interface_exists()) config.rtas_ops = &procfs_rtas_ops; else return 1; return 0; } /** * rtas_activate_firmware * @brief Interface for ibm,activate-firmware rtas call * * @return 0 on success, !0 on failure */ int rtas_activate_firmware() { int token = rtas_token("ibm,activate-firmware"); if (token < 0) return token; CALL_RTAS_METHOD(activate_firmware, token); } /** * rtas_cfg_connector * @brief Interface for ibm,configure-connector rtas call * * @param workarea buffer containg args to ibm,configure-connector * @return 0 on success, !0 on failure */ int rtas_cfg_connector(char *workarea) { int token = rtas_token("ibm,configure-connector"); if (token < 0) return token; CALL_RTAS_METHOD(cfg_connector, token, workarea); } /** * rtas_delay_timeout * @brief Interface to retrieve the rtas timeout delay * * @param timeout_ms timeout in milli-seconds * @return delay time */ int rtas_delay_timeout(uint64_t timeout_ms) { CALL_HELPER_METHOD(delay_timeout, timeout_ms); } /** * rtas_diaply_char * @brief Interface for display-character rtas call * * @param c character to display * @return 0 on success, !0 otherwise */ int rtas_display_char(char c) { int token = rtas_token("display-character"); if (token < 0) return token; CALL_RTAS_METHOD(display_char, token, c); } /** * rtas_diaplay_msg * @brief Interface for ibm,display-message rtas call * * @param buf message to display * @return 0 on success, !0 otherwise */ int rtas_display_msg(char *buf) { int token = rtas_token("ibm,display-message"); if (token < 0) return token; CALL_RTAS_METHOD(display_msg, token, buf); } /** * rtas_errinjct * @brief Interface to the ibm,errinjct rtas call * * @param etoken errinjct token * @param otoken errinjct open token * @param workarea additional args to ibm,errinjct * @return 0 on success, !0 otherwise */ int rtas_errinjct(int etoken, int otoken, char *workarea) { int token = rtas_token("ibm,errinjct"); if (token < 0) return token; CALL_RTAS_METHOD(errinjct, token, etoken, otoken, workarea); } /** * rtas_errinjct_close * @brief Inerface to close the ibm,errinjct facility * * @param otoken errinjct open token * @return 0 on success, !0 otherwise */ int rtas_errinjct_close(int otoken) { int token = rtas_token("ibm,close-errinjct"); if (token < 0) return token; CALL_RTAS_METHOD(errinjct_close, token, otoken); } /** * rtas_errinjct_open * @brief Interface to open the ibm,errinjct facility * * This call will set the value refrenced by otoken to the open token * for the ibm,errinjct facility * * @param otoken pointer to open token * @return 0 on success, !0 otherwise */ int rtas_errinjct_open(int *otoken) { int token = rtas_token("ibm,open-errinjct"); if (token < 0) return token; CALL_RTAS_METHOD(errinjct_open, token, otoken); } /** * rtas_free_rmp_buffer * @brief free the rmo buffer used by librtas * * @param buf rmo buffer to free * @param phys_addr physical address of the buffer * @param size buf size * @return 0 on success, !0 otherwise */ int rtas_free_rmo_buffer(void *buf, uint32_t phys_addr, size_t size) { CALL_HELPER_METHOD(free_rmo_buffer, buf, phys_addr, size); } /** * rtas_get_config_addr_info2 * @brief Interface to ibm,get-config-addr-info2 rtas call * * On successful completion the info value is returned. * * @param config_addr * @param PHB_Unit_ID * @param function * @param info * @return 0 on success, !0 otherwise */ int rtas_get_config_addr_info2(uint32_t config_addr, uint64_t phb_id, uint32_t function, uint32_t *info) { int token = rtas_token("ibm,get-config-addr-info2"); if (token < 0) return token; CALL_RTAS_METHOD(get_config_addr_info2, token, config_addr, phb_id, function, info); } /** * rtas_get_dynamic_sensor * @brief Interface to ibm,get-dynamic-sensor-state rtas call * * On success the variable referenced by the state parameter will contain * the state of the sensor * * @param sensor sensor to retrieve * @param loc_code location code of the sensor * @param state reference to state variable * @return 0 on success, !0 otherwise */ int rtas_get_dynamic_sensor(int sensor, void *loc_code, int *state) { int token = rtas_token("ibm,get-dynamic-sensor-state"); if (token < 0) return token; CALL_RTAS_METHOD(get_dynamic_sensor, token, sensor, loc_code, state); } /** * rtas_get_indices * @brief Interface to the ibm,get-indices rtas call * * @param is_sensor is this index a sensor? * @param type * @param workarea additional args to the rtas call * @param size * @param start * @param next * @return 0 on success, !0 otherwise */ int rtas_get_indices(int is_sensor, int type, char *workarea, size_t size, int start, int *next) { int token = rtas_token("ibm,get-indices"); if (token < 0) return token; CALL_RTAS_METHOD(get_indices, token, is_sensor, type, workarea, size, start, next); } /** * rtas_get_power_level * @brief Interface to the get-power-level rtas call * * On success this routine will set the variable referenced by the level * parameter to the power level * * @param powerdomain * @param level reference to the power level variable * @return 0 on success, !0 otherwise */ int rtas_get_power_level(int powerdomain, int *level) { int token = rtas_token("get-power-level"); if (token < 0) return token; CALL_RTAS_METHOD(get_power_level, token, powerdomain, level); } /** * rtas_get_rmo_buffer * @brief Retrive the RMO buffer used by librtas * * On successful completion the buf parameter will reference an allocated * area of RMO memory and the phys_addr parameter will refernce the * physical address of the RMO buffer. * * @param size buffer size to retrieve * @param buf reference to buffer pointer * @param phys_addr reference to the phys_addr variable * @return 0 on success, !0 otherwise */ int rtas_get_rmo_buffer(size_t size, void **buf, uint32_t * phys_addr) { CALL_HELPER_METHOD(get_rmo_buffer, size, buf, phys_addr); } /** * rtas_get_sensor * @brief Interface to the get-sensor-state rtas call * * On successful completion the state parameter will reference the current * state of the sensor * * @param sensor * @param index sensor index * @param state reference to state variable * @return 0 on success, !0 otherwise */ int rtas_get_sensor(int sensor, int index, int *state) { int token = rtas_token("get-sensor-state"); if (token < 0) return token; CALL_RTAS_METHOD(get_sensor, token, sensor, index, state); } /** * rtas_get_sysparm * @brief Interface to the ibm,get-system-parameter rtas call * * On successful completion the data parameter will contain the system * parameter results * * @param parameter system parameter to retrieve * @param length data buffer length * @param data reference to buffer to return parameter in * @return 0 on success, !0 otherwise */ int rtas_get_sysparm(unsigned int parameter, unsigned int length, char *data) { int token = rtas_token("ibm,get-system-parameter"); if (token < 0) return token; CALL_RTAS_METHOD(get_sysparm, token, parameter, length, data); } /** * rtas_get_time * @brief Interface to get-time-of-day rtas call * * On successful completion all of the parameters will be filled with * their respective values for the current time of day. * * @param year * @param month * @param day * @param hour * @param min * @param sec * @param nsec * @return 0 on success, !0 otherwise */ int rtas_get_time(uint32_t *year, uint32_t *month, uint32_t *day, uint32_t *hour, uint32_t *min, uint32_t *sec, uint32_t *nsec) { int token = rtas_token("get-time-of-day"); if (token < 0) return token; CALL_RTAS_METHOD(get_time, token, year, month, day, hour, min, sec, nsec); } /** * rtas_get_vpd * @brief Interface to the ibm,get-vpd rtas call * * @param loc_code location code * @param workarea additional args to rtas call * @param size * @param sequence * @param seq_next * @param bytes_ret * @return 0 on success, !0 otherwise */ int rtas_get_vpd(char *loc_code, char *workarea, size_t size, unsigned int sequence, unsigned int *seq_next, unsigned int *bytes_ret) { int token = rtas_token("ibm,get-vpd"); if (token < 0) return token; CALL_RTAS_METHOD(get_vpd, token, loc_code, workarea, size, sequence, seq_next, bytes_ret); } /** * rtas_lpar_perftools * @brief Interface to the ibm,lpa-perftools rtas call * * @param subfunc * @param workarea additional args to the rtas call * @param length * @param sequence * @param seq_next * @return 0 on success, !0 otherwise */ int rtas_lpar_perftools(int subfunc, char *workarea, unsigned int length, unsigned int sequence, unsigned int *seq_next) { int token = rtas_token("ibm,lpar-perftools"); if (token < 0) return token; CALL_RTAS_METHOD(lpar_perftools, token, subfunc, workarea, length, sequence, seq_next); } /** * rtas_platform_dump * Interface to the ibm,platform-dump rtas call * * @param dump_tag * @param sequence * @param buffer buffer to write dump to * @param length buffer length * @param next_seq * @param bytes_ret * @return 0 on success, !0 othwerwise */ int rtas_platform_dump(uint64_t dump_tag, uint64_t sequence, void *buffer, size_t length, uint64_t * next_seq, uint64_t * bytes_ret) { int token = rtas_token("ibm,platform-dump"); if (token < 0) return token; CALL_RTAS_METHOD(platform_dump, token, dump_tag, sequence, buffer, length, next_seq, bytes_ret); } /** * rtas_read_slot_reset * @brief Interface to the ibm,read-slot-reset-state rtas call * * @param cfg_addr configuration address of slot to read * @param phbid PHB ID of the slot to read * @param state reference to variable to return slot state in * @param eeh * @return 0 on success, !0 otherwise */ int rtas_read_slot_reset(uint32_t cfg_addr, uint64_t phbid, int *state, int *eeh) { int token = rtas_token("ibm,read-slot-reset-state"); if (token < 0) return token; CALL_RTAS_METHOD(read_slot_reset, token, cfg_addr, phbid, state, eeh); } /** * rtas_scan_log_dump * @brief Interface to the ibm,scan-log-dump rtas call * * @param buffer buffer to return scan log dump in * @param length size of buffer * @return 0 on success, !0 otherwise */ int rtas_scan_log_dump(void *buffer, size_t length) { int token = rtas_token("ibm,scan-log-dump"); if (token < 0) return token; CALL_RTAS_METHOD(scan_log_dump, token, buffer, length); } /** * rtas_set_debug * @brief Interface to set librtas debug level * * @param level debug level to set to * @return 0 on success, !0 otherwise */ int rtas_set_debug(int level) { config.debug = level; return 0; } /** * rtas_set_dynamic_indicator * @brief Interface to the ibm,set-dynamic-indicator rtas call * * @param indicator indicator to set * @param new_value value to set the indicator to * @param loc_code * @return 0 on success, !0 otherwise */ int rtas_set_dynamic_indicator(int indicator, int new_value, void *loc_code) { int token = rtas_token("ibm,set-dynamic-indicator"); if (token < 0) return token; CALL_RTAS_METHOD(set_dynamic_indicator, token, indicator, new_value, loc_code); } /** * rtas_set_eeh_option * @brief Inerface to the ibm,set-eeh-option rtas call * * @param cfg_addr configuration address for slot to set eeh option on * @param phbid PHB ID for slot to set option on * @param function * @return 0 on success, !0 otherwise */ int rtas_set_eeh_option(uint32_t cfg_addr, uint64_t phbid, int function) { int token = rtas_token("ibm,set-eeh-option"); if (token < 0) return token; CALL_RTAS_METHOD(set_eeh_option, token, cfg_addr, phbid, function); } /** * rtas_set_indicator * @brief Interface to the set-indicator rtas call * * @param indicator indicator to set * @param index indicator index * @param new_value value to set the indicator to * @return 0 on success, !0 otherwise */ int rtas_set_indicator(int indicator, int index, int new_value) { int token = rtas_token("set-indicator"); if (token < 0) return token; CALL_RTAS_METHOD(set_indicator, token, indicator, index, new_value); } /** * rtas_set_power_level * @brief Interface to the set-power-level rtas call * * @param powerdomain * @param level power level to set to * @param setlevel * @return 0 on success, !0 otherwise */ int rtas_set_power_level(int powerdomain, int level, int *setlevel) { int token = rtas_token("set-power-level"); if (token < 0) return token; CALL_RTAS_METHOD(set_power_level, token, powerdomain, level, setlevel); } /** * rtas_set_poweron_time * @brief interface to the set-time-for-power-on rtas call * * @param year year to power on * @param month month to power on * @param day day to power on * @param hour hour to power on * @param min minute to power on * @param sec second to power on * @param nsec nano-second top power on * @return 0 on success, !0 otherwise */ int rtas_set_poweron_time(uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec) { int token = rtas_token("set-time-for-power-on"); if (token < 0) return token; CALL_RTAS_METHOD(set_poweron_time, token, year, month, day, hour, min, sec, nsec); } /** * rtas_set_sysparm * @brief Interface to the ibm,set-system-parameter rtas call * * @param parameter * @param data * @return 0 on success, !0 otherwise */ int rtas_set_sysparm(unsigned int parameter, char *data) { int token = rtas_token("ibm,set-system-parameter"); if (token < 0) return token; CALL_RTAS_METHOD(set_sysparm, token, parameter, data); } /** * rtas_set_time * @brief Interface to the set-time-of-day rtas call * * @param year year to set time to * @param month month to set time to * @param day day to set time to * @param hour hour to set time to * @param min minute to set time to * @param sec second to set time to * @param nsec nan-second to set time to * @return 0 on success, !0 otherwise */ int rtas_set_time(uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec) { int token = rtas_token("set-time-of-day"); if (token < 0) return token; CALL_RTAS_METHOD(set_time, token, year, month, day, hour, min, sec, nsec); } /** * rtas_suspend_me * @brief Interface for ibm,suspend-me rtas call * * @return 0 on success, !0 on failure */ int rtas_suspend_me(uint64_t streamid) { int token = rtas_token("ibm,suspend-me"); if (token < 0) return token; CALL_RTAS_METHOD(suspend_me, token, streamid); } /** * rtas_update_nodes * @brief Interface for ibm,update-nodes rtas call * * @param workarea input output work area for the rtas call * @param scope of call * @return 0 on success, !0 on failure */ int rtas_update_nodes(char *workarea, unsigned int scope ) { int token = rtas_token("ibm,update-nodes"); if (token < 0) return token; CALL_RTAS_METHOD(update_nodes, token, workarea, scope); } /** * rtas_update_properties * @brief Interface for ibm,update-properties rtas call * * @param workarea input output work area for the rtas call * @param scope of call * @return 0 on success, !0 on failure */ int rtas_update_properties(char *workarea, unsigned int scope ) { int token = rtas_token("ibm,update-properties"); if (token < 0) return token; CALL_RTAS_METHOD(update_properties, token, workarea, scope); } librtas-1.3.10/librtas_src/librtas.so.1.3.90000755000175100001440000035245112313120670017271 0ustar nfontusersELF`@@8@'$ܘܘ@hPPPXXX$$dtRGNUĥ}艣Bdu=as7qWb!)Y5L;_(2k/"Ag:RUh= Kn* '<T?V9B+8>0Era`&F\@%64[. #XCHSp3]d M^I eDJ-1i jNcf,QOlZmoG$PC M!`H0 A$P @z P@(  &l6"! !#&'()*+,./013458:;=?BCDFHIKMNOQSTWXYZ[\^_acdefilor }ԭQ|=fHqz*FN5E!!;iKڐ,?Dx.T aE>e uN߭n:e+v+ i}2x-Q[N\)ƄPu juL3Sѵ~mÛ7y)4.U$&f^Z_g_a 8l})c,ڕ (tPa%EC2k]-? ԗD!4|㺎:Z\ܼ3{;y]b g7sAtl{I8ă ~.=ptcXqK]>g P B 4W + J" ^eRd+ZTXH04WL9PlP  o hH@l8ih@Hx8,1HXhbx}<GHsl`, (4(K8l`YPb0H4,p?`HR?  vHTD@ph%(p@`H0@P vX04HD`dFDD[<-$pXx?h~psX 4{8@}X+ __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesconfigopen_proc_rtas_filesprintfsyscall_rtas_opsprocfs_rtas_opsrtas_activate_firmwarertas_tokengeteuidrtas_cfg_connectorrtas_delay_timeoutrtas_display_charrtas_display_msgrtas_errinjctrtas_errinjct_closertas_errinjct_openrtas_free_rmo_bufferrtas_get_config_addr_info2rtas_get_dynamic_sensorrtas_get_indicesrtas_get_power_levelrtas_get_rmo_bufferrtas_get_sensorrtas_get_sysparmrtas_get_timertas_get_vpdrtas_lpar_perftoolsrtas_platform_dumprtas_read_slot_resetrtas_scan_log_dumprtas_set_debugrtas_set_dynamic_indicatorrtas_set_eeh_optionrtas_set_indicatorrtas_set_power_levelrtas_set_poweron_timertas_set_sysparmrtas_set_timertas_suspend_mertas_update_nodesrtas_update_propertiesstrlenmalloc__errno_locationsnprintffreeread_entire_filereallocreadsc_activate_firmwaresc_cfg_connectorsc_delay_timeoutsc_display_charsc_display_msgsc_errinjctsc_errinjct_closesc_errinjct_opensc_free_rmo_buffersc_get_config_addr_info2sc_get_dynamic_sensorsc_get_indicessc_get_power_levelsc_get_rmo_buffersc_get_sensorsc_get_sysparmsc_get_timesc_get_vpdsc_lpar_perftoolssc_platform_dumpsc_read_slot_resetsc_scan_log_dumpsc_set_dynamic_indicatorsc_set_eeh_optionsc_set_indicatorsc_set_power_levelsc_set_poweron_timesc_set_sysparmsc_set_timesc_suspend_mesc_update_nodessc_update_propertiessc_interface_existsusleepsyscallmemcpystrcpystrncpy__isoc99_sscanfgetpidfcntlmmapmunmappfs_cfg_connectorpfs_get_powerpfs_get_sensorpfs_get_sysparmpfs_set_indicatorpfs_set_powerprocfs_interface_existsstderrwritefprintflibc.so.6_edata__bss_start_endlibrtas.so.1GLIBC_2.4GLIBC_2.7GLIBC_2.3l ii ii ii@H@HP`B8hkx͸kEPkF kFtkGkHkIk J(k8K@kPLXkhMpkO<kPhkQkRkSkUkVk(W0k@XHkXY`kp[8xk\k]k_Hk`kakbkc< k0d8kHePk`g hkxhhkjkk<klkmko0kpdk q(k8r@kPsLXkhupkvkxk{0k||kkDkk(0k@HkX@`kpxklkkkkdkk k08kHTPk`hkxlkhkk`kkkk (k88@kPXkhpkkkkkPkkk(0k@HkXl`kpŒxkk@kŰkkkxk8 k08kHPk`˄hkxkX(08 @ (P h(΀0Θ8ΰ@HPX`0h@pPxhψϘϨ0HXhЀРа( 0X8H@ѐHѰPX`hPp@xҘҀҰ8(`ӐxӰP@ԠԈ (0 8@hHpPxXX`hըpx0֐x `Hנ׈@0`pؐ؀ ذ(@8@HHPPX`Ph٘pـx  8XڐڨH0@x`۰ (80H8X@hHxP܈#&%& 6&(R&0>&8<&@,&H3&Pe&XF&`S&hO&pd&xN&I&9&(&n&!&\&]&g&L&Q&=&)&:&Z&J&@&B&.&j&`b&i&M&V&U& 2&XG&& & &h&h&(h&0h&4&k&&p  e0 H `x$N -8Ph(`@A(b@}ibPBHN |!/A KA(H`H`8!p|N A(b}ibBN A(bx}ibBN A(b}ibBN A(b`}ibpBhN A(b}ibBN A(bH}ibXBPN A(bh}ibxBpN A(b}ibBN A(b}ibBN A(b}ib BN A(b}ibBN A(b}ibBN A(bp}ibBxN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(bX}ibhB`N A(b}ibBN A(bP}ib`BXN A(b}ibBN A(b }ib0B(N A(b}ibBN A(b}ibBN A(b}ib(B N A(b8}ibHB@N A(b(}ib8B0N A(b}ibBN A(b}ibBN A(b0}ib@B8N |€!q/@/A" iKUA("0뢀(~}=HP})t;@@H```8 x$}=* A(| iIN!A(~@A88!|N `|b8!/A,"@/A A(| iIN!A(8!p|N |!|? x |#x("PI)9+K8x8pH`p|x $8p} J9))8|x肀X}%Kx KA(9?(|}#Kx|x8KA(|`xtt/@$?p8 pp?xHAxH`t/@0"` |/@8bh肀p|xKuA(t||x8?|N |!q|? x"x) | A(iIN!A(|`x/A"`x HP") | A(iIN!A(|`x/A"` H8pH8p`p|x8?|N |!a|? xbKA(|`xpp/@p|HK A(|`x/A8H"` /@ K|`x/A8Hd"`) /@8HD"`))p||x | A(iIN!A(|`x`|x8?|N |!a|? xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8Hh"`) /@8HH"`))p||x | A(iIN!A(|`x`|x8?|N |!q|? xKA(|`x/A8pH"` /@ K|`x/A8pH\"`) /@8pH<"`)) | A(iIN!A(|`xp`p|x8?|N |!a|? x|`xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8Hp"`) /@8HP"`))p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!a|? xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ Km|`x/A8Hh"`) /@8HH"`)) p||x | A(iIN!A(|`x`|x8?|N |!a|? x|`x|#xБ?bKqA(|`xpp/@p|HKA(|`x/A8H"` /@ K=|`x/A8H"`) (/@8H`"`))(p| | |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|`xbK5A(|`xpp/@p|HKQA(|`x/A8H"` /@ K|`x/A8Hp"`) 0/@8HP"`))0p| |}c[x|x | A(iIN!A(|`x`|x8?|N |!a|? xbK A(|`xpp/@p|HK)A(|`x/A8H"` /@ K|`x/A8Hh"`) 8/@8HH"`))8p||x | A(iIN!A(|`x`|x8?|N |!q|? x|#xАK-A(|`x/A8pH"` /@ K|`x/A8pHl"`) @/@8pHL"`))@x |x | A(iIN!A(|`xp`p|x8?|N |!a|? x|ix|+x?АbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H"`) H/@8Hd"`))Hp| x x }c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|`xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K]|`x/A8Hx"`) P/@8HX"`))Pp| |}c[x|x | A(iIN!A(|`x`|x8?|N |!a|? x|ix|#x|;x?БؐbKAA(|`xpp/@p|HK]A(|`x/A8H"` /@ K |`x/A8H"`) X/@8Ht"`)IXp| || |}c[x}Cx}%Kx|x? | A(jJN!A(|`x`|x8?|N |!a|? x|`xؐbKA(|`xpp/@p|HK A(|`x/A8H"` /@ K|`x/A8Ht"`) `/@8HT"`))`p| |}c[x|x | A(iIN!A(|`x`|x8?|N |!q|? xKA(|`x/A8pH"` /@ K|`x/A8pHd"`) h/@8pHD"`))h | A(iIN!A(|`xp`p|x8?|N |!a|? x|`x|#xБ?bKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H"`) p/@8H`"`))pp| | |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|`x|#xБ?bKuA(|`xpp/@p|HKA(|`x/A8H"` /@ KA|`x/A8H"`) x/@8H`"`))xp| x x }c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!Q|? x?bK!A(|`xpp/@p|HK=A(|`x/A8H"` /@ K|`x/A8H"`) /@8H`"`)p||x?_| A(}]N!A(|`x`|x8?|N |!a|? x|3xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H"`) /@8Hd"`)Ip| x }#Kx|x? | A(jJN!A(|`x`|x8?|N |!a|? x|`x|+x|3xБ?bKuA(|`xpp/@p|HKA(|`x/A8H"` /@ KA|`x/A8H"`) /@8Hp"`))p| | x x }c[x}DSx}Cx|x | A(iIN!A(|`x`|x8?|N |!a|? xbKA(|`xpp/@p|HK5A(|`x/A8H"` /@ K|`x/A8H|"`) /@8H\"`)Ip||x? | A(jJN!A(|`x`|x8?|N |!a|? x|`xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H|"`) /@8H\"`))p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!a|? xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ Ki|`x/A8Hl"`) /@8HL"`))p||x | A(iIN!A(|`x`|x8?|N !|? x|`xp"`p 8|x8?@N |!a|? x|`x|#xБ?b K)A(|`xpp/@p|HKEA(|`x/A8H"` /@ K|`x/A8H"`) /@8H`"`))p| | |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|ix|+x?Аb(KA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H"`) /@8H`"`))p| x |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|`x|#x|+xБ?ؑb0KޕA(|`xpp/@p|HKޱA(|`x/A8H"` /@ Ka|`x/A8H"`) /@8Hh"`))p| || |}CSx}Cx}e[x|x | A(iIN!A(|`x`|x8?|N |!a|? x|`x|#xБ?b8KEA(|`xpp/@p|HKaA(|`x/A8H"` /@ K|`x/A8H"`) /@8H`"`))Ȁp| | |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!Q|? x|`x|#x|+x_?b@KA(|`xpp/@p|HKA(|`x/A8H"` /@ Kޭ|`x/A8H"`) /@8H"`)Ѐp| x x x x x x x }CSx}Cx|;xx}(Kx}i[x| x| A(}]N!A(|`x`|x8?|N |!a|? x|`xؐbHKeA(|`xpp/@p|HKځA(|`x/A8H"` /@ K1|`x/A8Ht"`) /@8HT"`))؀p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!Q|? x|`x|#x|+x_?bPK A(|`xpp/@p|HK)A(|`x/A8H"` /@ K|`x/A8H"`) /@8H"`)p| x x x x x x x }CSx}Cx|;xx}(Kx}i[x| x| A(}]N!A(|`x`|x8?|N |!a|? xbXKיA(|`xpp/@p|HK׵A(|`x/A8H"` /@ Ke|`x/A8Hh"`) /@8HH"`))p||x | A(iIN!A(|`x`|x8?|N |!a|? x|#xb`KqA(|`xpp/@p|HK֍A(|`x/A8H"` /@ K=|`x/A8Ht"`) /@8HT"`))p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!a|? x|#xbhK=A(|`xpp/@p|HKYA(|`x/A8H"` /@ K |`x/A8Ht"`) /@8HT"`))p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!Q|? xKA(|`xx KA(|`xx |x 8 x pp||xKA(|`xxx/@$KEA(|ix8 8Hp|x|x袁pKA(x8KұA(|`x? xK A(? |/@$KA(|ix8& 8H8`|x8?|N |!a|? x8t|xKm|`xpp/Ap|HLt||xKUA(|`xpt||xKA(p|`|x8?|N |!Q|? x8x"x 9?x9|x}%Kx}f[xK|`xpp/@8H4x| x px|xKMA(p|`|x8?|N |!Q|? x|`x88x?8 H`?8 ? /@ K A(|`x? H(? |xKA(|`x? ? /@$K1A(|ix8 8H?)x})||x}$Kx8KUA(|`xpp/@H" |/@b肁K}A(KϭA(|ix8 8HLp| x|Jxp/A`/A?x 8`|x8?|N |!Q|? x|`x?8 T8x/&@L/&AH8xH `x x?8 /A`H8`H`9 H@8xH8H" /Ap?i" @A(<`x H"i? |XPp?xp@@ px?)x| ? " |/@$|b肁|xxKiA(xx |xK̙A(8`|x8?|N |!q|? x|#x" |/@`? x t? x p/@? x b|xKˡA(t|b|xKˉA(p|b|xKqA(8xHL`x|?xd}) x x|b|x}%KxK)A(?x8 xx?tHAHtxHT`?xt|HP| x|?xd}) x b}d[x|xKʹA(?x8 x?tp| | xHAH`8?|N |!|? x|kx?_|+xx xx |x 8P8pHD`p| ?P8 P x yId8p} J9)i ?p8 pp?HA`8pHD`p| ?P8 P | xyI$8p} J9)`i?p8 pp?HA`8x|x8K8x8`|xKEA(|`xtt/AL" |/@,K%A(|ix |b肁|xKA(8`H8x|x8K/AЀ|x d8p} J9) x 8pH\`p|x $8p} J9)`i?p| |x d8p} J9) x ?p8 pp?HA`8```|x8?|N |!A|? x|`x8xH`|9?|x88}&KxK!|`xpp/Ap|H|9?x|x}$KxKa|`xpp/A`" |/@@p/Ap|H|b肁KA(p/Ap|H|`|x8?|N |!1|? x|`x8x889?t8`|x}%KxK A(|`xpp/Ap|H|x8K A(H`tx xx |9_|x88}&Kx}g[x}HSxKY|`xpp/Ap/@H|/@889?x8`|x}%KxKAA(|`xpp/A@H$|9?|x}$KxKY|`xpp/A8H`H`p/@|x8K A(?tx }#Kx|x8KřA(xx /A$?xy) |x}$Kx8KiA(" |/@Dp/Ap|H|b肂KUA(p/Ap|H|`|x8?|N !|? xp"p 8|x8?@N |!A|? x|`x|#x?8xH`x  |9?|x88}f[x}'KxK|`xpp/Ap|HȀ|9?x|x}$KxK9|`xpp/A`" |/@Px p/Ap|H|b肂K©A(p/Ap|H|`|x8?|N |!1|? x|`x8xKA(|`xtt|9?9|x}$Kx}e[xKA(|`xpp/Ap|HD|xK5A(H`x |9?|x88}f[x}'KxK|`xpp/A4|9?x|x}$KxKm|`xpp/AH`?x t|}#Kx}d[x|xKA(" |/@Dp/Ap|H|b肂KA(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x?8x889?8`|x}%KxKA(|`xpp/Ap|H|x8KA(H`x | | |9_}#Kx88}f[x|x}ISxK|`xpp/A4|9?x|x}$KxKm|`xpp/AH`p/@|x8K%A(?x }#Kx|x8KA(" |/@\p/Ap|H|| |b 肂(}%Kx|xKA(p/Ap|H|`|x8?|N |!A|? x|`x|#x?8xH`| |9}#Kx88|x}g[xKi|`xpp/Ap|HĀ|9?x|x}$KxK|`xpp/A`" |/@Lp/Ap|H||b肂0|xKA(p/Ap|H|`|x8?|N |!A|? x|`x8xH`|9?|x88}'KxK |`xpp/Ap|H̀|9?x|x}$KxKI|`xpp/A`" |/@Tp/Ap|H|? |b8肂@|xKA(p/Ap|H|`|x8?|N |!1|? x|`x|#x|3x ?8H`x"x x | x x ; p}#Kx88}f[x}Cxx}ISxxKM|`x/@4|9?|x}$KxK|`x/AdH`" |/@l/A|H|? x x x bH肂P}%Kx|x}i[xKA(/A|H||x8?|N |!1|? x|`x|#x?8x8? x 8 ttx 9?9x|x}$Kx}e[xKA(|`xpp/Ap|H?ty) |x}%KxKA(H`xx | |9_}#Kx88|x}g[x}HSx?K5|`xpp/A4|9?|x}$KxK|`xpp/AH`?xx tx }#Kx}d[x|xKA(" |/@hp/Ap|H|? | |bX肂`|xKA(p/Ap|H|`|x8?|N |!|? x|kx|#x8@}Cx?P _(0H889?@|x}%KxKA(|`x/A|H`x  | (| 0|H|8pPx}c[x88}FSx}Cx}(Kx?@xK |`x/A4|9?|x}$KxKY|`x/AdH`/@8|x@KA(?x }#Kx|x@KA(" |/@/A|H|?P | (| 0| H|p!xbh肂p}e[x}FSx8@| x_PKMA(/A|H|`|x8?|N |!A|? x|`x|#x?8xH`| |9}#Kx88|x}g[xK!|`xpp/Ap|H؀|9?x|x}$KxKa|`xpp/A`" |/@`p/Ap|H|? | |bx肂|x}(KxKA(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x?8xH`| | |9_;}#Kx88}f[x|x}HSxxK}|`xpp/Ap|H|9?x|x}$KxK|`xpp/Ap`x |? " |/@lp/Ap|H|? | | |b肂}%Kx|x}i[xKA(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x?8xx 9?9|x}$Kx}e[xKA(|`xpp/Ap|H`x | x x 9_}#Kx88}f[x}Cx|x}ISxKq|`xpp/A4|9?x|x}$KxK|`xpp/A|H`p/@$?y) |x}%KxKqA(?x x }#Kx}d[x|xKA(" |/@\p/Ap|H|x x b 肂}%Kx|xKA(p/Ap|H|`|x8?|N |a!|? x|`x8@HPX?`_h08H`0| 9Xp`xh}#Kx88}f[x8@?H_PKq|`x/A|H(|9?|x}$KxK|`x/Ah`" |/@/A|H|?8 x ?@ x ?H x ?P x ?X x ?` x ?h x apxb肂}FSx}CxxxjxKA(/A|H|`|x8?|aN |!|? x|kxHPX|;xh?p@`888?X8 9?9|x}$Kx}e[xKA(|`x/A|H,?8 x 8 H/AHH 8K)A(?h` H`?h `@| x x `x ;hppx}#Kx88}f[x}GSxXxxKu|`x/A4|9?|x}$KxK|`x/A\H`/@PXKA(x ?X8 }c[x}DSx|xK A(" |/@tH/AHH Ȁ| ?h x ?p x `x !pb肂PX|x}i[xKA(/A|H|`|x8?|N |!|? x|kx|#x0|3x|;xH _(8?@88x 9?9|x}$Kx}e[xKA(|`x/A|H|x08KA(?H@ H`?H @x  | (| 8x @x 8pHx}c[x88}FSx8}(KxxxK|`x/A4|9?|x}$KxK%|`x/AXH`/@$?8y) 0|x}%KxKA(?x 8x }#Kx}d[x|xK]A(" |/@|/A|H|?H x (| 8x @x !pb肂}e[x0}GSx|x?H_KA(/A|H|`|x8?|N |!|? x|`xX`hpx?P88h/AD89?p|x}%KxK A(|`x/A|H?x` H`?x `Xx"x Xx `x"x `x x P|pp8x8888}Cx88}&Kx}g[x}HSxxxK|`x/Ax x ƀx } x?x " |/@$?x b肂袂|xKA(|9?|x}$KxK|`x/AH`h/A(/@h|xpKA(/A$ȁ?y) |x}$KxpK1A(x x ƀx } x? " |/@t/A|H|?xi? ?!paxb肂X`hp?x_KA(/A|H|`|x8? |N |!!|? x|`x|#x (0?8H` x"x  x | x 9_0p}#Kx88}f[x}Cxx}ISx_(Km|`x/A|H|9?|x}$KxKխ|`x/A\`" |/@x/A|H|?( | ?0 | x !pb肃|x (0?}j[xKA(/A|H|`|x8?|N |!1|? x|`x8x89?|x}%KxKA(|`xpp/Ap|Hl|xK!A(H`x |9|x88}&Kx}h[xKu|`xpp/A4|9?x|x}$KxK|`xpp/AH`p/@|xK}A(?x }#Kx|xK A(" |/@Hp/Ap|H|b肃KA(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x?8x8? x 8 ttx 9?9x|x}$Kx}e[xKA(|`xpp/Ap|H?ty) |x}%KxKA(H`xx | | |9_}#Kx88}f[x|x}ISxK1|`xpp/A4|9?|x}$KxKс|`xpp/AH`?xx tx }#Kx}d[x|xKA(" |/@dp/Ap|H|| |b肃 }%Kx|xKA(p/Ap|H|`|x8?|N |!1|? x|ix|#x|3x?8xH`x"x x | x |9_}#Kx88}f[x}Cxx| xK]|`xpp/Ap|HԀ|9?x|x}$KxKϝ|`xpp/A``" |/@\p/Ap|H|x |b(肃0}%Kx|xKA(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x|3x?_8xH`| | | |;}#Kx88}f[x}GSx|xxKѱ|`xpp/Ap|H܀|9?x|x}$KxK|`xpp/Al`" |/@dp/Ap|H|| | |b8肃@}%Kx}f[x|xKMA(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x?8xH`| | |9_;}#Kx88}f[x|x}HSxxK|`xpp/Ap|H|9?x|x}$KxKE|`xpp/Ap`x |? " |/@lp/Ap|H|? | | |b肃H}%Kx|x}i[xKA(p/Ap|H|`|x8?|N |!|? x|`x|#x (08@H?P_X8H` | (x 0x 8x @x Hx Px pXx x8}#Kx88}f[x}GSxxxK|`x/A|H |9?|x}$KxK=|`x/A@`" |/@/A|H|(x 0x 8x @x Hx Px Xx pxbP肃X}%Kx}f[x}GSxxxKiA(/A|H|`|x8?|N |!1|? x|`x|#x?8x? tt| 48 9?9|x}$Kx}e[xKqA(|`xpp/Ap|Hpt| 48 }c[x|xKiA(H`x | x 9_}#Kx88|x}g[x}HSxK˵|`xpp/A4|9?x|x}$KxK|`xpp/AH`_x t| 48 }CSx}d[x|xKeA(" |/@Pp/Ap|H|x b`肃h|xKEA(p/Ap|H|`|x8?|N |!|? x|`x|#x (08@H?P_X8H` | (x 0x 8x @x Hx Px pXx x8}#Kx88}f[x}GSxxxK|`x/A|H |9?|x}$KxK|`x/A@`" |/@/A|H|(x 0x 8x @x Hx Px Xx pxbP肃p}%Kx}f[x}GSxxxK-A(/A|H|`|x8?|N |!A|? x|`x8xH`x"x x |9_|x88}&Kx}g[x}HSxK|`xpp/Ap|H|9?x|x}$KxK9|`xpp/At`" |/@@p/Ap|H|b肃xKA(p/Ap|H|`|x8?|N |!A|? x|ix|+x?8x89?t8`|x}%KxKA(|`xpp/Ap|H||x8KA(H`tx | x 9_}#Kx88}f[x|x}HSxK1|`xpp/A4|9?x|x}$KxK|`xpp/AH`p/@|x8K9A(?tx }#Kx|x8KA(" |/@Pp/Ap|H|x b肃|xKA(p/Ap|H|`|x8?|N |!A|? x|ix|+x?8x89?t8`|x}%KxKA(|`xpp/Ap|H||x8KA(H`tx | x 9_}#Kx88}f[x|x}HSxK!|`xpp/A4|9?x|x}$KxKq|`xpp/AH`p/@|x8K)A(?tx }#Kx|x8KA(" |/@Pp/Ap|H|x b肃|xKA(p/Ap|H|`|x8?|N |!a|? x" |x8KA(|`xtt/@4" |/@b肃KA(8H0t|9?x|x}$Kx8K9A(|`xpt||xKA(p/A$x|xKA(p|Hx?9)|x肃}e[x}&KxKYA(x|xKA(?Ѐ x /A0? /A(?Ѐ x <@@DH`H`" |/@b肃KA(8H`8`|x8?|N |!A|? x"Ȁ |/@|" |x8B8KA(|`x"Ȑ "Ȁ |/@@" |/@ " b肃|xKA(8H8x8zK]A(|`x"Ȁ |9?x|x8}%KxKA(|`xpp/@<" |/@b肃K9A(8H8`|x8?|N |!A|? x8x8zKmA(|`x"Ȁ |9?x|x8}%KxKA(|`xpp/@<" |/@b肃KIA(8H8`|x8?|N |!Q|? x8? x | x@@8" |/@b肄KA(8Hxt8pH8`pT`&|x ? x @@ p| 4px  tx | x  8 x | 4" }CSx}d[x|xH]|`xxx/@p| t|}#Kx|xKi|`x/@p| 4px  tx | x  8 x | 49 t} 0| 8 |}CSx}d[x|x„HY? x pT`&|x | H$?p8 pp/?@H`/@4" |/@b肄KA(8H? 8`|x8?|N !|? x|`x|#x?x  x |HPx  8 x 88| 48| H68 0| 4| L60} 8|x8?PN !|? x|`x|#x?x  x |HPx  8 x 88| 48| H68 0?i| 40|H6|}`8? ?i| 4|H6}`x? 8?PN |!Q|? x|`x? x | x@@8" |/@b肄 KA(8HTx ? |XPxx| 4x  x | x  8 x | 4" }CSx}d[x|xK|`xx9 } 0| 8 || xxAD" |/@$x b(肄 |xKA(8Hx| 4x  x | x  8 x |4}c[x|x8„K| |}#Kx|xK|`xpp|`|x8?|N |!a|? xbK|`xpp/Ap|H"8 8`|x8?|N |!a|? x|`x"0 |x8KA(|`xpp/@@" |/@ "0 b8肄@|xKmA(8Hx p|8`88|x}(KxKaA(|`xxp||xKeA(?x8@4" |/@bH肄@KA(8H?x 8`|x8?|N |!a|? x"0 |x8KQA(|`xpp/@@" |/@ "0 b8肄P|xKA(8HxKA(|`xtp||xK5A(t/@4" |/@bX肄PKA(8H8`|x8?|N |!q|? x" |x8KA(|`xtt|Tpp/At||xKaA(p||x8?|N |!a|? x|#xxtx /A ?t8 ttT`&|"Ȁ |/@4" |/@b`肄hKQA(8H`K|`xpp/Ap|H0x |xK|`xpp|`|x8?|N |!a|? x" |/@bp肄xK~yA(xtx /A ?t8 ttT`&|"Ȁ |/@,K|`xpp/Ap|H8x|xK|`xpp/Ap|H\xx |xK|`xpp/Ap|H xx ? 8`|x8?|N |!a|? x8K}A(|`xpp/A8Hp||xK%A(|`xt| tH@," |x肄K}A(8Hp||xK|%A(|`xt| tH@," |x肄K}UA(8H$p||xK}}A(8`|x8?|N |!a|? x|`xؐ8t|x8K}A(8tb|x8Ka|`xpp/Ap|H,8t|x8K}A(t|`|x8?|N |!a|? x|`x|#xБ?؀ؐt8tb|x8 K|`xpp/Ap|H$x|? ||`|x8?|N |!Q|? x|`x|#x|+x?tx8tb|x8K|`xpp/Ap|H$||? |`|x8?|N |!q|? x|`x|#x|+xؐ?ȑЀȐtАx9?t8 |x8K{}A(8tb|x8 K |`xp||/@ 9?t8 |x8K{5A(|||x8?|N |!Q|? x|`x|#x|+x|3x?_tx|8tb|x8KM|`xpp/Ap|H|`|x8?|N |!Q|? x|`x|#x|+x?tx8tb|x8K|`xpp/Ap|H$||? |`|x8?|N |!q|? xb8KwA(|`xtt|Tpp/At||xKxqA(p||x8?|N `|bH!+/A<;``` A(| iIN!A(?/@8!|N `#}B}hK}}ZlL}ilN ```8K8K8K8K8K8K8K8K8K8 K|8 Kt8 Kl8 Kd8 K\8KT8KL8KD8K<8K48K,8K$8K8K8K 8K8K8K8K8K8K8K|!`Kw`8!p|N open_proc_rtas_file/proc/ppc64/rtas/proc/rtas%s/%slibrtas %s(): Failed to open %s ibm,activate-firmwareibm,configure-connectordisplay-characteribm,display-messageibm,errinjctibm,close-errinjctibm,open-errinjctibm,get-config-addr-info2ibm,get-dynamic-sensor-stateibm,get-indicesget-power-levelget-sensor-stateibm,get-system-parameterget-time-of-dayibm,get-vpdibm,lpar-perftoolsibm,platform-dumpibm,read-slot-reset-stateibm,scan-log-dumpibm,set-dynamic-indicatoribm,set-eeh-optionset-indicatorset-power-levelset-time-for-power-onibm,set-system-parameterset-time-of-dayibm,suspend-meibm,update-nodesibm,update-properties/proc/device-tree/rtas%s/%sread_entire_filelibrtas %s(): read failed handle_delaylibrtas %s(): Return status %d, delaying for %ld ms RTAS call args.token = %d RTAS call args.ninputs = %d RTAS call args.nret = %d RTAS call input[%d] = 0x%x (BE) RTAS call output[%d] = 0x%x (BE) sc_rtas_calllibrtas %s(): RTAS syscall failure, errno=%d sc_activate_firmwarelibrtas %s(): () = %d sc_cfg_connectorlibrtas %s(): (%p) = %d sc_display_charlibrtas %s(): (%d) = %d sc_display_msgsc_errinjctlibrtas %s(): (%d, %d, %p) = %d sc_errinjct_closesc_errinjct_openlibrtas %s(): (%p) = %d, %d sc_get_config_addr_info2librtas %s(): (0x%x, 0x%llx, %d) = %d, 0x%x sc_get_dynamic_sensorlibrtas %s(): (%d, %s, %p) = %d, %d sc_get_indiceslibrtas %s(): (%d, %d, %p, %d, %d, %p) = %d, %d sc_get_power_levellibrtas %s(): (%d, %p) = %d, %d sc_get_sensorlibrtas %s(): (%d, %d, %p) = %d, %d sc_get_sysparmsc_get_timelibrtas %s(): () = %d, %d, %d, %d, %d, %d, %d, %d sc_get_vpdNULLlibrtas %s(): (%s, 0x%p, %d, %d) = %d, %d, %dsc_lpar_perftoolslibrtas %s(): (%d, %p, %d, %d, %p) = %d, %d sc_platform_dumplibrtas %s(): %s: seq_next = 0x%llx librtas %s(): (0x%llx, 0x%llx, %p, %d, %p, %p) = %d, 0x%llx, 0x%llx sc_read_slot_resetlibrtas %s(): (0x%x, 0x%llx, %p, %p) = %d, %d, %d sc_scan_log_dumplibrtas %s(): (%p, %d) = %d sc_set_dynamic_indicatorlibrtas %s(): (%d, %d, %s) = %d sc_set_eeh_optionlibrtas %s(): (0x%x, 0x%llx, %d) = %d sc_set_indicatorlibrtas %s(): (%d, %d, %d) = %d sc_set_power_levelsc_set_poweron_timelibrtas %s(): (%d, %d, %d, %d, %d, %d, %d) = %d sc_set_sysparmlibrtas %s(): (%d, %p) = %d sc_set_timesc_suspend_mesc_update_nodeslibrtas %s(): (%p) %d = %d sc_update_propertiesrmo_buffer/dev/mem/var/lock/LCK..librtasread_kregion_boundslibrtas %s(): Could not open workarea file %llx %xlibrtas %s(): Unexpected kregion bounds acquire_file_locklibrtas %s(): could not open lockfile %s librtas %s(): fcntl failed for [0x%lx, 0x%x] release_file_lockget_phys_regionlibrtas %s(): Invalid buffer size 0x%x requested librtas %s(): Could not find available workarea space release_phys_regionlibrtas %s(): Invalid region [0x%x, 0x%x] mmap_dev_memlibrtas %s(): Failed to open %s librtas %s(): mmap failed munmap_dev_memlibrtas %s(): munmap failed sc_free_rmo_bufferlibrtas %s(): Attempting to free before calling get() sc_get_rmo_bufferlibrtas %s(): RMO buffer request, size: %d Failed to write proc file %s Failed to read proc file %s cfg_connectorget_powerget_sensorget_sysparmset_indicatorset_powerl ` xoP  X?8p̠0% ooo oYB8k͸kEPkF kFtkGkHkIkJkKkLkMkO<kPhkQkRkSkUkVkWkXkYk[8k\k]k_Hk`kakbkc<kdkekg khhkjkk<klkmko0kpdkqkrksLkukvkxk{0k||kkDkkkk@kklkkkkdkkkkTkklkhkk`kkkkk8kkkkkkkPkkkkklkŒkk@kŰkkkxk8kkk˄kkkX(08 @ (Ph΀Θΰ0@PhψϘϨ0HXhЀРа(XHѐѰP@ҘҀҰ8(`ӐxӰP@ԠԈ hpxXը0֐x `Hנ׈@0`pؐ؀ذ@HPP٘ـ 8XڐڨH0@x`۰8HXhx܈GCC: (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]ospWG,Ft),pd,u@,?,MŰ\+!open_proc_rtas_filertas_activate_firmware1rtas_cfg_connectorsrtas_delay_timeoutrtas_display_charrtas_display_msg )rtas_errinjct rtas_errinjct_close rtas_errinjct_open rtas_free_rmo_buffer ]rtas_get_config_addr_info2 rtas_get_dynamic_sensor 5rtas_get_indices rtas_get_power_level rtas_get_rmo_buffer rrtas_get_sensor rtas_get_sysparm :rtas_get_time rtas_get_vpdrrtas_lpar_perftoolsrtas_platform_dumprtas_read_slot_resetrtas_scan_log_dumpRrtas_set_debugrtas_set_dynamic_indicatorrtas_set_eeh_optionPrtas_set_indicatorrtas_set_power_levelrtas_set_poweron_timertas_set_sysparmrtas_set_timertas_suspend_mertas_update_nodesMrtas_update_propertiesconfig2 #rtas_token^read_entire_file! Nsc_activate_firmware sc_cfg_connector sc_delay_timeout sc_display_char Gsc_display_msg sc_errinjct sc_errinjct_close Lsc_errinjct_open sc_get_config_addr_info2sc_get_dynamic_sensorasc_get_indicesYsc_get_power_levelsc_get_sensorsc_get_sysparmosc_get_timeWsc_get_vpdsc_lpar_perftoolswsc_platform_dumpsc_read_slot_resetgsc_scan_log_dumpsc_set_dynamic_indicatorsc_set_eeh_optionsc_set_indicatorEsc_set_power_levelsc_set_poweron_timesc_set_sysparmsc_set_timesc_suspend_mesc_update_nodessc_update_properties syscall_rtas_opsS? sc_interface_exists sc_free_rmo_buffer usc_get_rmo_bufferM7 pfs_cfg_connector ypfs_get_power pfs_get_sensor `pfs_get_sysparm pfs_set_indicator Xpfs_set_power procfs_interface_exists procfs_rtas_opsFtpd;6aintJpyB1E4;8Bp e p _ e# # #  #   # !/#( 8"J#0 #k#8 4$#@ r%#H '#P ])#X y+4#` ,Z#h -#p .#x :0# o3# z6F# 9# <# )># '?# A# C9# E# Gr# NJ# KKr# "N# _O# P# Q# WW WWj W W Wp W/WWWj WJWW5 WeWeWP Whwq WW WWWhe WWWWjwWe W4WWe WTwTh: WWWWe` WW;;j WW WWjjw;; WFWWj;; WzWhwzzL WWee WWhw WWWWh WWW W9WWWW WrW? WW;jx WW WWj;WoT )U# V# WW#D<WFtG;0 *;W8=;>K?Wfd@WiAWR  ep eOXWGHMJjWHI1kWP{WIJszj0|WPWJK40WKLcp0WPWLM )bufj0WPWMO< W0W8jWPvWO<Phh W0WP,WPhQ e0WPWQR ]bufh0\8wWRSO 0f8?WPXWSU 5W0h8\eWP4WUV 2W0 2W82j2w3W3e5WPpJWVW6 mIW0Ie8KWPaWWX r`w0buf`T8\`frWXY qW0qW8\qesWP|WY[8 :k;0u;8*jWP W[8\j 08dayminsecW@W\]rj0j8w2;WPHW]_HW0j8u;2;WPSW_H`Q(028 =huwBzzWPW`a08\eeeheWPWabR =h0uw8WP&Wbc<8%W0/5Wc<d34W04W84h6WP.IWdePH0H8HWJWP\Weg 3[W0[W8[W]WPoWg hhlmnW0nW8nepWPWhhj08dayminsecW@Wjk< k;0*j8WPWk<l S08dayminsecW@Wlm 0WPWmo0 Mj0;8WP~Wo0pd :j0;8WP  h! pduy86intJE;a14b88 _ e# # # #   # !#( 8":#0 #[#8 4${#@ r%#H '#P ])#X y+$#` ,J#h -o#p .#x :0# o3# z66# 9p# <# )># '?# A# C)# Eo# Gb# NJ# KKb# "N# _O# P# Q# ? ? ? ? | ?  ? ?  ? ? ? ? | ?: ? ?% ?U ? U?@ ?{ z -a ? ?  ? ? ? z U ? ? ? ? | - ? U ?$ ? ? U ?D - D z* ?o ? ? ? UP ? ? b b |u ? ?        ? ? | | - b  b ?6 ? ? | b b  ?j ? z - j j< ? ? U Uv ? ? z - ? ? ? ? z ? ? ? ?) ? ? ? ? ?b ? / ? ? b |h ? ?  ? ? | b ?oT )U # V# W?#< ?pdq |20T8fdU !|Hlen"?@ E?qr 2C0TC8KCDfdF?TrcG?P|-[?rsL !^Z0\|Hlen]-Prc^?@!z?sLu nfdy?0bufy8leny{-Poff|-Hrc}?@R w ^!u+8GBi-y_6int;aJB B f4~8_ _ e# # # #   # !6#( 8"Q#0 #r#8 4$#@ r%#H '#P ])#X y+;#` ,a#h -#p .#x :0# o3# z6M# 9# <# )># '?# A# C@# E# Gy# NJ# KKy# "N# _O# P# Q# pp pp p ppB p6ppp pQpp< plplpW pTx pp pppl ppppTpl p;ppl! p[T[A pppplg pp~~ pp ppT~~ pMpp~~$ ppTS ppll ppT pppp ppp p@pppp! pypF pp~ pp pp~poT" )U"# V# Wp#=X # # # # ^#P ( f(1Ei~uv (p0C8pPms_H@R  Hvx 0p8iphpdp`3px{0 U >p0p8p3}^ >~apIPrcp}ip}R  @  N fbp{0|| p0C p@rc pR  Ҁ$p|| #p0#8c%&C'()@*pHrc+pR  ҰWpD < V0~fpD Gep0ceB8Cghp@rcipR  p p0buf8Cpp@rcpR  p# p0p8pCp@rcpR  (5p@p Lp0p8Cp@rcpR  `p@ p0l8Cp@rcpR  xo pl  p0 8f   ? C  p@rcpR  Ӱ)plWa(p0(p8(\(l*C+w,-.p@rc/pR  ZYpYWp0Wp8 WpWWTXpXlCZ[\]prc^pR  @vpp0mp8lCp@rcpR  Ԉpd>p0p8p\lCYprcpR | pdop0k~8u~*Cp@rcpR w 7pWp08dayminsecCprcpR r lp% p0 8  T2~Cw~prcp~R m XwIpTrwFp0Fp8FuG~2G~HCJKLMprcNpR X ըzpTxp0(x82x =xuyTyyC{|T}-}~~prcpR S pl gp08\leehlCprcpR N x&plhYp0 =8uTCp@rcpR I $php03p8pCwp@rcpR D &p`%p0%8%%pC'(prc)pR / HCp`@EBp03Bp8BpBpCDEprcFpR  ׈ap`p0m`p8`p`lCbcdprcepR  pp08dayminsecCprcpR Kp'p0k~8*Cp@rcpR 0Hp8tp08dayminsecCprcpR `p8p08Cp@rcpR p\pp08~c C  @ pHrc pR ؀3p[2p0282~c4C56@7pHrc8pR ذ B f B f B f  B f  B f B  f B  f B / f  B D f 4    B m f  ] B f  4    B f   ^!E Ű%;6aintJ ^W XeyB1E  P# P# e# Ke# p#  { 4;8B _" e2# M# c# ~#   M# !#( 8"#0 ##8 4$#@ r%/#H 'T#P ])#X y+#` ,#h -#p .#x :0Q# o3# z6# 9# <# )>># '?c# A# C# E# G# NJ# KK# "N!# _OA# PA# QR#W2W"WMW8Wc*SW~WiWWWWWWWWWWW~W)W*)WTWW~5WWWWWZWWWW)~WWWWWW;;WQW)))))))WW;;WWWW;;WW**~*WW*W>W~$WcWWW~DWW*WiWWWWWWWWW;W!W* WAW;'WRGoT )U# V*# WW#5 `! "*# ## $#( QW# ?W# [# *#  /W .0buf0Xfd1WTrc2WPR  -xWw0w8 yrczWR} ـ WB j08 rcWRx  !WP 0\)8 XP *HWDiW@Rs V*P o UP0 UP8 U* WPh X*` h)  fP0 fP8f* g iPh j*`Wv \08 X WTWP *HrcW@R^ ڐ W rc WP D!Wl 8\ 0 8buf "~Xfd#WPRY  t@WlŒ] buf?~0?8rcAWTfdBWPRD 0 ZWŒ fd[Wd \W` 1qW@ ubufp~0\p8prWTrcsWPR/ ` W@ŰD 0buf8\)XWTrcWPR ۰  {  / {  D { 4 Y { I  s { c    g @ H  P !  ^X3M Ű -;6aintJ ^ ^yB1E {-} W# Q# # # # #( P#0 #8 #@ #H #P  #X "#` ^$#h &W#p !*W#t ,e#x 04# 1I# p2# 96# ?p# H~# I~# J~# K~# L# )NW# P# p  # # W# {} {4;8B_ e# # 1# L#   # !q#( 8"#0 ##8 4$#@ r%#H '"#P ])V#X y+v#` ,#h -#p .#x :0# o3Y# z6# 9# <# )> # '?1# AV# C{# E# G# NJ# KK# "N# _O # P # Q #WWWWW1!WLW7WqWWWRWWWwWWWW~WWW"WW~WVWWWW(WvWW\W~|WWWWWW;;WWWSW;SS;%WWW;;S_WW~WWW W~W1WWW~WVWW7W{WWWW\WWWW;WWW W;W    k 3W# W# W# W# f W# W# \W# W#   # W# { p  # m W# !W# "W# $ h m%W# &W# 'W# (W# | * k+;# *, # u-;# .W#  e6WŰ  >50buf5~85rc7WTfd8WP ^]W y\W0\8^ _rc_W_ zvWx+ uW0ruW8uw TrcxWP /Wx8x `W0W8W\ kDrcW@ W8 W0k;8u;* h_rcW_ >W XW03W8WW &DrcW@ W˄_ W0rW8W #DrcW@ &W˄ fdWd W` " X% $ > $ > $ >   I: ; II !I/ &I  : ;  : ; I8 ' III : ; .? : ; ' I@: ; I 4: ; I 4: ; I 4I4  .: ; I@.? : ; I@: ; I .? : ;' I@: ;I 4: ;I : ;I 4: ; I?  4: ; I? < % : ; I$ > $ > $ >   I&I  : ;  : ; I8 ' I I I : ; .: ; ' I@: ; I : ; I 4: ; I 4: ; I .? : ; ' I@4I4  I!I/ 4: ; I? < % : ; I I$ > $ > $ >   I I !I/  : ;  : ; I8 ' III : ; .: ; ' I@: ; I 4: ; I 4: ; I 4I4  .: ; ' @.? : ;' I@: ;I 4: ;I 4: ;I : ;I &I4: ; I? < 4: ; I?  % $ > $ > : ; I$ >   I : ;  : ; I8 I !I/ &I  : ; ' III.: ; ' I@: ; I 4: ; I 4I4  4: ; I .: ; ' @.: ;I@4: ;I .: ;' I@: ;I : ;I 4: ;I .? : ;I@.? : ;' I@ 4: ; I? < % $ > $ > : ; I$ >   I&I  : ;  : ;I8 : ; : ; I8 I!I/  : ; ' III!I/.: ; ' I@: ; I : ; I 4: ; I .? : ; ' I@4: ; I .? : ; I@4: ; I? < 4: ; I?   /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includecommon.cstddef.hstdint.hcommon.h Ft;l/Kן9#=/ YKL1/! YZ=?uu! gZ=?uu! guu! uZ=?uu!! gZ=?uu! Z=?uuY! uZ=?uu!! gZ=?uu! uu!Z=@vvh"Z=?uu=!Z=@vv"Z=?uu/!uu!Z=?uuY!Z=?uuY!Z=@vvZ"Z=@vvh"Z=@vv"Z=@vvL"Z=?uuK! uZ=?uu! Y>! tZ=@vvZ" Z=?uuY! Z=?uuu! Z=?uuY!Z=@vv#" Z=?uu/!Z=@vv#" gZ=?uu! Z=?uu/! Z=?uu/! ~ /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includeofdt.cstddef.hstdint.hcommon.h pdu=Y .v u=YY2/!u=BZ=! g2= .LL=!/1Jn =KvKY.s =Y .y YL=>/! > /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includesyscall_calls.cstdarg.hstddef.hstdint.hcommon.hsyscall.h u=1hK;rNL?.s Kg w gK0hg/! [KQ=uggKՆKn ==>/KKOw=.t M>K/! u <=CL=!/4=<d ts ?u>#vJ3'=hKK! K>! t <=CLu! 5Z=<r n?G%K!11=<n  tz "?G%=h!  <=CLg!  <=CL! <z ?G%ح /4Z=<p  z ?G%ʻ!4=<v z ?G%=h%!  <=Dz L!  <z "= <x LZػ!4=<w z 0?G%=! <z >=Dz L0!//5=<e =K/1 Jy =v?G%=Z!4=<k h Jy =?G%=#!/5== <c Js =%?ʃzJ(gh=! <z h=Dz L"! 4=<p {?G%=hY! /4Z=<o  z "?G&!  <z Z=Dz L!  <y 1=Dz L!  <z "= <x LZػ! <z =Dz L)! 5==<r ?G%u! <z =Dz L)!  <z =CL=!3=<o |?G%=hu!3=<o |?G%=hu!  /usr/include/bits/usr/include/sys/usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includesyscall_rmo.ctypes.htypes.hstddef.hfcntl.hstdint.hcommon.hsyscall.h .k=.o Y=K <v L02y &/!-yYY.r ////L>2/! x////L=2/! u/3u.g >K/=[u v =3=/!~hg thf4u.q u>06=!\K=A>/! =.u ZK3=/! x= .x gY=2/!YL=Z/ ?L=MY .y Y=Av=!?L=MY== <v g=Dz =@K/! Q /usr/include/bits/usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includeprocfs_calls.ctypes.hstddef.hlibio.hstdio.hstdint.hcommon.hprocfs.h Ű5g=.n Yv.v Yu5Z/! gv=Ah=! 0v=AL=! /0u=AL=!//vwKv/ //0v=?=! /0v=AL=! \gL=Z/  xA $FtDPA~D $GPA~D $HPA~D $I PA~D $JPA~D $K,PA~D $L PA~D $MHPA~D $O<,PA~D $Ph PA~D $QPA~D $RPPA~D $S>>Q>>q>@QqQqDDTQTXqX44DQDHqHQq$Q$(q(Qq  Q q P P `Q ` dq d  Q q  Q q X X hQ h lq l||QqQqXXhQhlq!l!(Q(,q,QqQq!X!XhQhlql$Q$(q(Qq\.symtab.strtab.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.data.rel.ro.dynamic.data.opd.branch_lt.got.bss.comment.comment.SUSE.OPTs.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_locXX$2X.o8  @PPHo  Uo@d00%n?8?8xB B X~BB8͸͸(ܔܔ((88@@PP``` 0sXXXX(0X90 \ ,T:\ FhS0v L^i@ & `XP 0 ?8 B  B ͸ ܔ(8@P`XX !"# -98FT(bXq` x8 ܔ @` ! 3C H Uhbs @  Ҁ Ұ   (  ` x Ӱ" 4 @F ԈX j |   X  ը  x   H  ׈ 0 B 0T ` f px ؀ ذ@HP(  ـ|% 7I [Xkt} ڐ( @X 0X  `  ۰+X6 C] B  B D B D E8D D0t D C( D C C4 DZ0g D Dx E  E Cp) ̈< Bb CX C B B  C ) B O D v DH C@ C P D` 4 - ;@l MpX [@ j x   P     XH  $8, 6 ID ^`H s d P   ( x 4 "$ 5L J" dh y     x h  p p %4 6HT IXh Zx k0H  P   @ HD hH Tp-P >`Vgv<0(p   8(@H80J,^oX{lH(4  ,X<N<_d wH`,D X$54GZ8lhHDh`initfini.ccrtstuff.c__do_global_dtors_auxframe_dummy__JCR_LIST____CTOR_LIST____DTOR_LIST__completed.6751dtor_idx.6753__do_global_ctors_aux__JCR_END____CTOR_END____FRAME_END__common.c__FUNCTION__.2913C.0.2914init_interfaceofdt.cofdt_rtas_pathopen_prop_fileget_property__FUNCTION__.3349syscall_calls.c__FUNCTION__.3111handle_delaydisplay_rtas_buf__FUNCTION__.3183sc_rtas_call__FUNCTION__.3229__FUNCTION__.3262__FUNCTION__.3317__FUNCTION__.3350__FUNCTION__.3392__FUNCTION__.3429__FUNCTION__.3457__FUNCTION__.3489__FUNCTION__.3525__FUNCTION__.3573__FUNCTION__.3611__FUNCTION__.3643__FUNCTION__.3678__FUNCTION__.3723__FUNCTION__.3769__FUNCTION__.3821__FUNCTION__.3872__FUNCTION__.3943__FUNCTION__.3979__FUNCTION__.4021__FUNCTION__.4063__FUNCTION__.4096__FUNCTION__.4127__FUNCTION__.4164__FUNCTION__.4196__FUNCTION__.4243__FUNCTION__.4271__FUNCTION__.4305__FUNCTION__.4345syscall_rmo.crmo_filenamedevmem_pathlockfile_pathwa_config__FUNCTION__.3303read_kregion_bounds__FUNCTION__.3379acquire_file_lock__FUNCTION__.3409release_file_lock__FUNCTION__.3430get_phys_regionget_bitsset_bits__FUNCTION__.3490release_phys_regioninit_workarea_config__FUNCTION__.3545mmap_dev_mem__FUNCTION__.3569munmap_dev_mem__FUNCTION__.3603__FUNCTION__.3629procfs_calls.cdo_rtas_op00000010.plt_call.sc_free_rmo_buffer+000000014.plt_call.__gmon_start__+000000010.plt_call.read@@GLIBC_2.3+000000010.plt_call.__isoc99_sscanf@@GLIBC_2.7+000000010.plt_call.getpid@@GLIBC_2.3+000000010.plt_call.malloc@@GLIBC_2.3+000000010.plt_call.write@@GLIBC_2.3+000000010.plt_call.__errno_location@@GLIBC_2.3+000000010.plt_call.rtas_token+000000010.plt_call.mmap@@GLIBC_2.3+000000010.plt_call.fprintf@@GLIBC_2.4+000000010.plt_call.read_entire_file+0__dso_handle00000010.plt_call.open@@GLIBC_2.3+000000010.plt_call.munmap@@GLIBC_2.3+0__DTOR_END__00000010.plt_call.geteuid@@GLIBC_2.3+000000010.plt_call.strcpy@@GLIBC_2.3+000000010.plt_call.syscall@@GLIBC_2.3+000000010.plt_call.memcpy@@GLIBC_2.3+000000010.plt_call.open_proc_rtas_file+0__glink_PLTresolve00000010.plt_call.printf@@GLIBC_2.4+000000010.plt_call.free@@GLIBC_2.3+000000010.plt_call.realloc@@GLIBC_2.3+000000010.plt_call.sc_get_rmo_buffer+000000010.plt_call.__cxa_finalize@@GLIBC_2.3+000000010.plt_call.snprintf@@GLIBC_2.4+000000010.plt_call.strlen@@GLIBC_2.3+000000010.plt_call.sprintf@@GLIBC_2.4+000000010.plt_call.close@@GLIBC_2.3+000000010.plt_call.usleep@@GLIBC_2.3+000000010.plt_call.strncpy@@GLIBC_2.3+0_DYNAMIC00000010.plt_call.fcntl@@GLIBC_2.3+0rtas_update_propertiessc_get_sensorsc_errinjct_closertas_get_timertas_set_debugrtas_set_timefcntl@@GLIBC_2.3sc_set_eeh_optionusleep@@GLIBC_2.3sc_update_nodesrtas_cfg_connectorfree@@GLIBC_2.3stderr@@GLIBC_2.3munmap@@GLIBC_2.3rtas_get_sysparmpfs_get_sensorrtas_display_charrtas_errinjct_openrtas_read_slot_resetrtas_set_power_level__gmon_start___Jv_RegisterClassesrtas_lpar_perftoolsrtas_get_config_addr_info2__isoc99_sscanf@@GLIBC_2.7realloc@@GLIBC_2.3rtas_get_rmo_buffer_finirtas_get_power_levelsc_free_rmo_buffersc_activate_firmware__cxa_finalize@@GLIBC_2.3sc_update_properties__errno_location@@GLIBC_2.3strlen@@GLIBC_2.3sc_get_timepfs_get_powersc_get_vpdrtas_set_poweron_timesc_get_indicesmmap@@GLIBC_2.3sc_display_charsc_interface_existsrtas_set_sysparmrtas_set_indicatorsc_errinjct_opensc_scan_log_dumprtas_set_eeh_optionsc_set_sysparmread_entire_filertas_suspend_memalloc@@GLIBC_2.3sc_get_dynamic_sensorsc_platform_dumprtas_errinjctrtas_get_vpdsc_get_config_addr_info2write@@GLIBC_2.3rtas_display_msgprocfs_interface_existssc_set_indicatorsc_display_msgrtas_activate_firmwarertas_get_dynamic_sensorsc_lpar_perftoolsprintf@@GLIBC_2.4rtas_scan_log_dumpsc_get_power_levelsc_get_rmo_buffersc_set_timeread@@GLIBC_2.3rtas_tokenrtas_get_sensorpfs_set_indicatorrtas_errinjct_closesc_cfg_connector__bss_startfprintf@@GLIBC_2.4syscall@@GLIBC_2.3rtas_get_indicesrtas_free_rmo_bufferrtas_platform_dumppfs_get_sysparmsc_errinjctsc_set_poweron_timememcpy@@GLIBC_2.3open@@GLIBC_2.3procfs_rtas_opsgetpid@@GLIBC_2.3sc_delay_timeout_endrtas_delay_timeoutstrcpy@@GLIBC_2.3pfs_set_powergeteuid@@GLIBC_2.3sc_read_slot_resetsc_get_sysparmclose@@GLIBC_2.3snprintf@@GLIBC_2.4sc_set_dynamic_indicatorsc_set_power_level_edatasyscall_rtas_opsrtas_update_nodesstrncpy@@GLIBC_2.3sc_suspend_mertas_set_dynamic_indicatoropen_proc_rtas_fileconfigpfs_cfg_connectorsprintf@@GLIBC_2.4_initlibrtas-1.3.10/librtas_src/syscall.h0000644000175100001440000000176012313120670016431 0ustar nfontusers/** * @file syscall.h * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author John Rose */ #ifndef _SYSCALL_H_ #define _SYSCALL_H_ #include /* Syscall number */ #ifndef __NR_rtas #define __NR_rtas 255 #endif #define MAX_ARGS 16 typedef uint32_t rtas_arg_t; /* Based on include/asm-ppc64/rtas.h */ struct rtas_args { uint32_t token; uint32_t ninputs; uint32_t nret; rtas_arg_t args[MAX_ARGS]; rtas_arg_t *rets; /* Pointer to return values in args[]. */ }; struct region { uint64_t addr; uint32_t size; struct region *next; }; extern int sc_get_rmo_buffer(size_t size, void **buf, uint32_t *phys_addr); extern int sc_free_rmo_buffer(void *buf, uint32_t phys_addr, size_t size); extern int sc_interface_exists(); #define BITS32_LO(_num) (uint32_t) (_num & 0xffffffffll) #define BITS32_HI(_num) (uint32_t) (_num >> 32) #define BITS64(_high, _low) (uint64_t) (((uint64_t) _high << 32) | _low) #endif librtas-1.3.10/librtas_src/librtas.so.1.3.80000755000175100001440000035235112313120670017267 0ustar nfontusersELF`@@@8@'$88@hPPPXXX$$dtRGNUX_!)6#R1HXWl&as7qWb!)Y5L;_(2k/"Ag:RUh= Kn* '<T?V9B+8>0Era`&F\@%64[. #XCHSp3]d M^I eDJ-1i jNcf,QOlZmoG$PC M!`H0 A$P @z P@(  &l6"! !#&'()*+,./013458:;=?BCDFHIKMNOQSTWXYZ[\^_acdefilor }ԭQ|=fHqz*FN5E!!;iKڐ,?Dx.T aE>e uN߭n:e+v+ i}2x-Q[N\)ƄPu juL3Sѵ~mÛ7y)4.U$&f^Z_g_a 8l})c,ڕ (tPa%EC2k]-? ԗD!4|㺎:Z\ܼ3{;y]b g7sAtl{I8ă ~.=ptcXqK]>g P B 4W + J" ^eRd+ZTXH04WL9PlP  o hH@l8ih@Hx8,1HXhbx}<GHsl`, (4(K8l`YPb0H4,p?`HR?  vHTD@ph%(p@`H0@P vX04HD`dFDD[<-$pXx?h~psX 4{8@}X+ __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesconfigopen_proc_rtas_filesprintfsyscall_rtas_opsprocfs_rtas_opsrtas_activate_firmwarertas_tokengeteuidrtas_cfg_connectorrtas_delay_timeoutrtas_display_charrtas_display_msgrtas_errinjctrtas_errinjct_closertas_errinjct_openrtas_free_rmo_bufferrtas_get_config_addr_info2rtas_get_dynamic_sensorrtas_get_indicesrtas_get_power_levelrtas_get_rmo_bufferrtas_get_sensorrtas_get_sysparmrtas_get_timertas_get_vpdrtas_lpar_perftoolsrtas_platform_dumprtas_read_slot_resetrtas_scan_log_dumprtas_set_debugrtas_set_dynamic_indicatorrtas_set_eeh_optionrtas_set_indicatorrtas_set_power_levelrtas_set_poweron_timertas_set_sysparmrtas_set_timertas_suspend_mertas_update_nodesrtas_update_propertiesstrlenmalloc__errno_locationsnprintffreeread_entire_filereallocreadsc_activate_firmwaresc_cfg_connectorsc_delay_timeoutsc_display_charsc_display_msgsc_errinjctsc_errinjct_closesc_errinjct_opensc_free_rmo_buffersc_get_config_addr_info2sc_get_dynamic_sensorsc_get_indicessc_get_power_levelsc_get_rmo_buffersc_get_sensorsc_get_sysparmsc_get_timesc_get_vpdsc_lpar_perftoolssc_platform_dumpsc_read_slot_resetsc_scan_log_dumpsc_set_dynamic_indicatorsc_set_eeh_optionsc_set_indicatorsc_set_power_levelsc_set_poweron_timesc_set_sysparmsc_set_timesc_suspend_mesc_update_nodessc_update_propertiessc_interface_existsusleepsyscallmemcpystrcpystrncpy__isoc99_sscanfgetpidfcntlmmapmunmappfs_cfg_connectorpfs_get_powerpfs_get_sensorpfs_get_sysparmpfs_set_indicatorpfs_set_powerprocfs_interface_existsstderrwritefprintflibc.so.6_edata__bss_start_endlibrtas.so.1GLIBC_2.4GLIBC_2.7GLIBC_2.3l ii ii ii@ͨHР@hHxP؈`B8hkxhkEPkF kFtkGkHkIk J(k8K@kPLXkhMpkO<kPhkQkRkSkUkVk(W0k@XHkXY`kp[8xk\k]k_Hk`kakbkc< k0d8kHePk`g hkxhhkjkk<klkmko0kpdk q(k8r@kPsLXkhupkvkxk{$k|pk~k8kk(0k@HkX4`kpxk`kkkk8kdk| k0t8kH(Pk`lhkx@k<kk4kkkk (k8@kPXXkhhpkxk@kkkkkXk(H0k@HkX `kp@xkkkdkƼk|k,k k0ɼ8kHxPk`8hkxkX(08 @͐ (00H8`@pHΈPΠX`hpx8HXpψϨ0P`pЈи 08@@H`PрXѠ`hpx8 hPҘ҈Ҹ0pPӸӠ@(x h(Ԡ08԰@HPX``hHpըxՐ0րh֠@(hט׀0  P(@8ظ@ؠHPX`Ph8p xh٘ ٰ80HHڈxڰhPۘ ۸(08@HP(#&%& 6&(R&0>&8<&@,&H3&Pe&XF&`S&hO&pd&xN&I&9&(&n&!&\&]&g&L&Q&=&)&:&Z&J&@&B&.&j&`b&i&M&V&U& 2&XG&& & &h&h&(h&0h&4&k&&p  e0 H `x$N -8Ph(`@A(b@}ibPBHN |!/A KA(H`Ha`8!p|N A(b}ibBN A(bx}ibBN A(b}ibBN A(b`}ibpBhN A(b}ibBN A(bH}ibXBPN A(bh}ibxBpN A(b}ibBN A(b}ibBN A(b}ib BN A(b}ibBN A(b}ibBN A(bp}ibBxN A(b}ibBN A(b}ibBN A(b}ibBN A(b}ibBN A(bX}ibhB`N A(b}ibBN A(bP}ib`BXN A(b}ibBN A(b }ib0B(N A(b}ibBN A(b}ibBN A(b}ib(B N A(b8}ibHB@N A(b(}ib8B0N A(b}ibBN A(b}ibBN A(b0}ib@B8N |€!q/@/A" iKUA("0뢀(~}=HP})t;@@H```8 x$}=* A(| iIN!A(~@A88!|N `|b8!/A,"@/A A(| iIN!A(8!p|N |!|? x |#x("PI)9+K8x8pH`p|x $8p} J9))8|x肀X}%Kx KA(9?(|}#Kx|x8KA(|`xtt/@$?p8 pp?xHAxH`t/@0"` |/@8bh肀p|xKuA(t||x8?|N |!q|? x"x) | A(iIN!A(|`x/A"`x HP") | A(iIN!A(|`x/A"` H8pH8p`p|x8?|N |!a|? xbKA(|`xpp/@p|HK A(|`x/A8H"` /@ K|`x/A8Hd"`) /@8HD"`))p||x | A(iIN!A(|`x`|x8?|N |!a|? xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8Hh"`) /@8HH"`))p||x | A(iIN!A(|`x`|x8?|N |!q|? xKA(|`x/A8pH"` /@ K|`x/A8pH\"`) /@8pH<"`)) | A(iIN!A(|`xp`p|x8?|N |!a|? x|`xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8Hp"`) /@8HP"`))p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!a|? xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ Km|`x/A8Hh"`) /@8HH"`)) p||x | A(iIN!A(|`x`|x8?|N |!a|? x|`x|#xБ?bKqA(|`xpp/@p|HKA(|`x/A8H"` /@ K=|`x/A8H"`) (/@8H`"`))(p| | |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|`xbK5A(|`xpp/@p|HKQA(|`x/A8H"` /@ K|`x/A8Hp"`) 0/@8HP"`))0p| |}c[x|x | A(iIN!A(|`x`|x8?|N |!a|? xbK A(|`xpp/@p|HK)A(|`x/A8H"` /@ K|`x/A8Hh"`) 8/@8HH"`))8p||x | A(iIN!A(|`x`|x8?|N |!q|? x|#xАK-A(|`x/A8pH"` /@ K|`x/A8pHl"`) @/@8pHL"`))@x |x | A(iIN!A(|`xp`p|x8?|N |!a|? x|ix|+x?АbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H"`) H/@8Hd"`))Hp| x x }c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|`xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K]|`x/A8Hx"`) P/@8HX"`))Pp| |}c[x|x | A(iIN!A(|`x`|x8?|N |!a|? x|ix|#x|;x?БؐbKAA(|`xpp/@p|HK]A(|`x/A8H"` /@ K |`x/A8H"`) X/@8Ht"`)IXp| || |}c[x}Cx}%Kx|x? | A(jJN!A(|`x`|x8?|N |!a|? x|`xؐbKA(|`xpp/@p|HK A(|`x/A8H"` /@ K|`x/A8Ht"`) `/@8HT"`))`p| |}c[x|x | A(iIN!A(|`x`|x8?|N |!q|? xKA(|`x/A8pH"` /@ K|`x/A8pHd"`) h/@8pHD"`))h | A(iIN!A(|`xp`p|x8?|N |!a|? x|`x|#xБ?bKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H"`) p/@8H`"`))pp| | |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|`x|#xБ?bKuA(|`xpp/@p|HKA(|`x/A8H"` /@ KA|`x/A8H"`) x/@8H`"`))xp| x x }c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!Q|? x?bK!A(|`xpp/@p|HK=A(|`x/A8H"` /@ K|`x/A8H"`) /@8H`"`)p||x?_| A(}]N!A(|`x`|x8?|N |!a|? x|3xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H"`) /@8Hd"`)Ip| x }#Kx|x? | A(jJN!A(|`x`|x8?|N |!a|? x|`x|+x|3xБ?bKuA(|`xpp/@p|HKA(|`x/A8H"` /@ KA|`x/A8H"`) /@8Hp"`))p| | x x }c[x}DSx}Cx|x | A(iIN!A(|`x`|x8?|N |!a|? xbKA(|`xpp/@p|HK5A(|`x/A8H"` /@ K|`x/A8H|"`) /@8H\"`)Ip||x? | A(jJN!A(|`x`|x8?|N |!a|? x|`xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H|"`) /@8H\"`))p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!a|? xbKA(|`xpp/@p|HKA(|`x/A8H"` /@ Ki|`x/A8Hl"`) /@8HL"`))p||x | A(iIN!A(|`x`|x8?|N !|? x|`xp"`p 8|x8?@N |!a|? x|`x|#xБ?b K)A(|`xpp/@p|HKEA(|`x/A8H"` /@ K|`x/A8H"`) /@8H`"`))p| | |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|ix|+x?Аb(KA(|`xpp/@p|HKA(|`x/A8H"` /@ K|`x/A8H"`) /@8H`"`))p| x |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!a|? x|`x|#x|+xБ?ؑb0KޕA(|`xpp/@p|HKޱA(|`x/A8H"` /@ Ka|`x/A8H"`) /@8Hh"`))p| || |}CSx}Cx}e[x|x | A(iIN!A(|`x`|x8?|N |!a|? x|`x|#xБ?b8KEA(|`xpp/@p|HKaA(|`x/A8H"` /@ K|`x/A8H"`) /@8H`"`))Ȁp| | |}c[x}DSx|x | A(iIN!A(|`x`|x8?|N |!Q|? x|`x|#x|+x_?b@KA(|`xpp/@p|HKA(|`x/A8H"` /@ Kޭ|`x/A8H"`) /@8H"`)Ѐp| x x x x x x x }CSx}Cx|;xx}(Kx}i[x| x| A(}]N!A(|`x`|x8?|N |!a|? x|`xؐbHKeA(|`xpp/@p|HKځA(|`x/A8H"` /@ K1|`x/A8Ht"`) /@8HT"`))؀p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!Q|? x|`x|#x|+x_?bPK A(|`xpp/@p|HK)A(|`x/A8H"` /@ K|`x/A8H"`) /@8H"`)p| x x x x x x x }CSx}Cx|;xx}(Kx}i[x| x| A(}]N!A(|`x`|x8?|N |!a|? xbXKיA(|`xpp/@p|HK׵A(|`x/A8H"` /@ Ke|`x/A8Hh"`) /@8HH"`))p||x | A(iIN!A(|`x`|x8?|N |!a|? x|#xb`KqA(|`xpp/@p|HK֍A(|`x/A8H"` /@ K=|`x/A8Ht"`) /@8HT"`))p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!a|? x|#xbhK=A(|`xpp/@p|HKYA(|`x/A8H"` /@ K |`x/A8Ht"`) /@8HT"`))p| x }c[x|x | A(iIN!A(|`x`|x8?|N |!Q|? xKA(|`xx KA(|`xx |x 8 x pp||xKA(|`xxx/@$KEA(|ix8 8Hp|x|x袁pKA(x8KұA(|`x? xK A(? |/@$KA(|ix8& 8H8`|x8?|N |!a|? x8t|xKm|`xpp/Ap|HLt||xKUA(|`xpt||xKA(p|`|x8?|N |!Q|? x8x"x 9?x9|x}%Kx}f[xK|`xpp/@8H4x| x px|xKMA(p|`|x8?|N |!Q|? x|`x88x?8 H`?8 ? /@ K A(|`x? H(? |xKA(|`x? ? /@$K1A(|ix8 8H?)x})||x}$Kx8KUA(|`xpp/@H" |/@b肁K}A(KϭA(|ix8 8HLp| x|Jxp/A`/A?x 8`|x8?|N |!Q|? x|`x?8 T8x/&@L/&AH8xH `x x?8 /A`H8`H`9 H@8xH8H" /Ap?i" @A(<`x H"i? |XPp?xp@@ px?)x| ? " |/@$|b肁|xxKiA(xx |xK̙A(8`|x8?|N |!q|? x|#x" |/@|/@? x b|xKA(? x b|xK˥A(? x b|xKˉA(8pHL`p|?xd}) x p|b|x}%KxKAA(?p8 ppx ? x @AH? x pH``px ? x |XPx p|?xd}) x b}d[x|xKʱA(?p8 ppx ? x ? x | x @AxH`8?|N |!|? x|kx?_|+xx xx |x 8P8pHD`p| ?P8 P x yId8p} J9)i ?p8 pp?HA`8pHD`p| ?P8 P | xyI$8p} J9)`i?p8 pp?HA`8x|x8K8x8`|xK)A(|`xtt/AL" |/@,K A(|ix |b肁|xKȱA(8`H8x|x8K}/A|8pH\`p|x $8p} J9)`i?p| |x d8p} J9) x ?p8 pp?HA`8```|x8?|N |!A|? x|`x8xH`|9?|x88}&KxKI|`xpp/Ap|H|9?x|x}$KxKm|`xpp/A`" |/@@p/Ap|H|b肁KA(p/Ap|H|`|x8?|N |!1|? x|`x8x889?t8`|x}%KxKA(|`xpp/Ap|H|x8KA(H`tx xx |9_|x88}&Kx}g[x}HSxK|`xpp/Ap/@H|/@889?x8`|x}%KxKMA(|`xpp/A@H$|9?|x}$KxKe|`xpp/A8H`H`p/@|x8KA(?tx }#Kx|x8KťA(xx /A$?xy) |x}$Kx8KuA(" |/@Dp/Ap|H|b肂KaA(p/Ap|H|`|x8?|N !|? xp"p 8|x8?@N |!A|? x|`x|#x?8xH`x  |9?|x88}f[x}'KxK!|`xpp/Ap|HȀ|9?x|x}$KxKE|`xpp/A`" |/@Px p/Ap|H|b肂KµA(p/Ap|H|`|x8?|N |!1|? x|`x8xKA(|`xtt|9?9|x}$Kx}e[xKA(|`xpp/Ap|HD|xKAA(H`x |9?|x88}f[x}'KxKE|`xpp/A4|9?x|x}$KxKy|`xpp/AH`?x t|}#Kx}d[x|xKA(" |/@Dp/Ap|H|b肂KA(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x?8x889?8`|x}%KxKA(|`xpp/Ap|H|x8KA(H`x | | |9_}#Kx88}f[x|x}ISxKE|`xpp/A4|9?x|x}$KxKy|`xpp/AH`p/@|x8K1A(?x }#Kx|x8KA(" |/@\p/Ap|H|| |b 肂(}%Kx|xKA(p/Ap|H|`|x8?|N |!A|? x|`x|#x?8xH`| |9}#Kx88|x}g[xK|`xpp/Ap|HĀ|9?x|x}$KxK|`xpp/A`" |/@Lp/Ap|H||b肂0|xK)A(p/Ap|H|`|x8?|N |!A|? x|`x8xH`|9?|x88}'KxK1|`xpp/Ap|H̀|9?x|x}$KxKU|`xpp/A`" |/@Tp/Ap|H|? |b8肂@|xKA(p/Ap|H|`|x8?|N |!1|? x|`x|#x|3x ?8H`x"x x | x x ; p}#Kx88}f[x}Cxx}ISxxKu|`x/@4|9?|x}$KxK|`x/AdH`" |/@l/A|H|? x x x bH肂P}%Kx|x}i[xKA(/A|H||x8?|N |!1|? x|`x|#x?8x8? x 8 ttx 9?9x|x}$Kx}e[xKA(|`xpp/Ap|H?ty) |x}%KxKA(H`xx | |9_}#Kx88|x}g[x}HSx?K]|`xpp/A4|9?|x}$KxK|`xpp/AH`?xx tx }#Kx}d[x|xKA(" |/@hp/Ap|H|? | |bX肂`|xKA(p/Ap|H|`|x8?|N |!|? x|kx|#x8@}Cx?P _(0H889?@|x}%KxKA(|`x/A|H`x  | (| 0|H|8pPx}c[x88}FSx}Cx}(Kx?@xK1|`x/A4|9?|x}$KxKe|`x/AdH`/@8|x@KA(?x }#Kx|x@KA(" |/@/A|H|?P | (| 0| H|p!xbh肂p}e[x}FSx8@| x_PKYA(/A|H|`|x8?|N |!A|? x|`x|#x?8xH`| |9}#Kx88|x}g[xKI|`xpp/Ap|H؀|9?x|x}$KxKm|`xpp/A`" |/@`p/Ap|H|? | |bx肂|x}(KxKA(p/Ap|H|`|x8?|N |!A|? x|`x|#x|+x?8xH`| | |9_}#Kx88}f[x|x}HSx?K|`xpp/Ap|H|9?x|x}$KxK|`xpp/At`" |/@lp/Ap|H|? | | |b肂}%Kx|x}i[xK%A(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x?8xx 9?9|x}$Kx}e[xK=A(|`xpp/Ap|H`x | x x 9_}#Kx88}f[x}Cx|x}ISxK|`xpp/A4|9?x|x}$KxK|`xpp/A|H`p/@$?y) |x}%KxKA(?x x }#Kx}d[x|xK%A(" |/@\p/Ap|H|x x b 肂}%Kx|xKA(p/Ap|H|`|x8?|N |a!|? x|`x8@HPX?`_h08H`0| 9Xp`xh}#Kx88}f[x8@?H_PK|`x/A|H(|9?|x}$KxK|`x/Ah`" |/@/A|H|?8 x ?@ x ?H x ?P x ?X x ?` x ?h x apxb肂}FSx}CxxxjxKA(/A|H|`|x8?|aN |!|? x|kxHPX|;xh?p@`888?X8 9?9|x}$Kx}e[xKA(|`x/A|H,?8 x 8 H/AHH 8KUA(?h` H`?h `@| x x `x ;hppx}#Kx88}f[x}GSxXxxK|`x/A4|9?|x}$KxK|`x/A\H`/@PXKA(x ?X8 }c[x}DSx|xK5A(" |/@tH/AHH Ȁ| ?h x ?p x `x !pb肂PX|x}i[xKA(/A|H|`|x8?|N |!|? x|kx|#x0|3x|;xH _(8?@88x 9?9|x}$Kx}e[xKA(|`x/A|H|x08KA(?H@ H`?H @x  | (| 8x @x 8pHx}c[x88}FSx8}(KxxxK|`x/A4|9?|x}$KxKQ|`x/AXH`/@$?8y) 0|x}%KxKA(?x 8x }#Kx}d[x|xKA(" |/@|/A|H|?H x (| 8x @x !pb肂}e[x0}GSx|x?H_K=A(/A|H|`|x8?|N |!|? x|`xX`hpx?P88h/AD89?p|x}%KxK5A(|`x/A|H?x` H`?x `Xx"x Xx `x"x `x x P|pp8x8888}Cx88}&Kx}g[x}HSxxxKM|`x/Ax x ƀx } x?x " |/@$?x b肂袂|xK-A(|9?|x}$KxK-|`x/AH`h/A(/@h|xpKA(/A$ȁ?y) |x}$KxpK]A(x x ƀx } x? " |/@t/A|H|?xi? ?!paxb肂X`hp?x_KA(/A|H|`|x8? |N |!!|? x|`x|#x (0?8H` x"x  x | x 9_0p}#Kx88}f[x}Cxx}ISx_(Kٵ|`x/A|H|9?|x}$KxK|`x/A\`" |/@x/A|H|?( | ?0 | x !pb肃|x (0?}j[xK!A(/A|H|`|x8?|N |!1|? x|`x8x89?|x}%KxKIA(|`xpp/Ap|Hl|xKMA(H`x |9|x88}&Kx}h[xK׽|`xpp/A4|9?x|x}$KxK|`xpp/AH`p/@|xKA(?x }#Kx|xK9A(" |/@Hp/Ap|H|b肃K!A(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x?8x8? x 8 ttx 9?9x|x}$Kx}e[xKA(|`xpp/Ap|H?ty) |x}%KxKA(H`xx | | |9_}#Kx88}f[x|x}ISxKy|`xpp/A4|9?|x}$KxKѭ|`xpp/AH`?xx tx }#Kx}d[x|xKA(" |/@dp/Ap|H|| |b肃 }%Kx|xKA(p/Ap|H|`|x8?|N |!1|? x|ix|#x|3x?8xH`x"x x | x |9_}#Kx88}f[x}Cxx| xKӥ|`xpp/Ap|HԀ|9?x|x}$KxK|`xpp/A``" |/@\p/Ap|H|x |b(肃0}%Kx|xK-A(p/Ap|H|`|x8?|N |!1|? x|`x|#x|+x|3x?_8xH`| | | |;}#Kx88}f[x}GSx|xxK|`xpp/Ap|H܀|9?x|x}$KxK|`xpp/Al`" |/@dp/Ap|H|| | |b8肃@}%Kx}f[x|xKyA(p/Ap|H|`|x8?|N |!A|? x|`x|#x|+x?8xH`| | |9_}#Kx88}f[x|x}HSx?KU|`xpp/Ap|H|9?x|x}$KxKy|`xpp/At`" |/@lp/Ap|H|? | | |b肃H}%Kx|x}i[xKA(p/Ap|H|`|x8?|N |!|? x|`x|#x (08@H?P_X8H` | (x 0x 8x @x Hx Px pXx x8}#Kx88}f[x}GSxxxKe|`x/A|H |9?|x}$KxKʉ|`x/A@`" |/@/A|H|(x 0x 8x @x Hx Px Xx pxbP肃X}%Kx}f[x}GSxxxKA(/A|H|`|x8?|N |!1|? x|`x|#x?8x? tt| 48 9?9|x}$Kx}e[xKA(|`xpp/Ap|Hpt| 48 }c[x|xKA(H`x | x 9_}#Kx88|x}g[x}HSxK|`xpp/A4|9?x|x}$KxKQ|`xpp/AH`_x t| 48 }CSx}d[x|xKA(" |/@Pp/Ap|H|x b`肃h|xKA(p/Ap|H|`|x8?|N |!|? x|`x|#x (08@H?P_X8H` | (x 0x 8x @x Hx Px pXx x8}#Kx88}f[x}GSxxxK)|`x/A|H |9?|x}$KxKM|`x/A@`" |/@/A|H|(x 0x 8x @x Hx Px Xx pxbP肃p}%Kx}f[x}GSxxxKyA(/A|H|`|x8?|N |!A|? x|`x8xH`x"x x |9_|x88}&Kx}g[x}HSxKa|`xpp/Ap|H|9?x|x}$KxKą|`xpp/At`" |/@@p/Ap|H|b肃xKA(p/Ap|H|`|x8?|N |!A|? x|ix|+x?8x89?t8`|x}%KxK-A(|`xpp/Ap|H||x8K1A(H`tx | x 9_}#Kx88}f[x|x}HSxKƙ|`xpp/A4|9?x|x}$KxK|`xpp/AH`p/@|x8KA(?tx }#Kx|x8KA(" |/@Pp/Ap|H|x b肃|xKA(p/Ap|H|`|x8?|N |!A|? x|ix|+x?8x89?t8`|x}%KxKA(|`xpp/Ap|H||x8K!A(H`tx | x 9_}#Kx88}f[x|x}HSxKĉ|`xpp/A4|9?x|x}$KxK|`xpp/AH`p/@|x8KuA(?tx }#Kx|x8KA(" |/@Pp/Ap|H|x b肃|xKA(p/Ap|H|`|x8?|N |!a|? x" |x8KA(|`xtt/@4" |/@b肃K!A(8H0t|9?x|x}$Kx8KA(|`xpt||xK)A(p/A$x|xKA(p|Hx?9)|x肃}e[x}&KxKA(x|xKA(?Ѐ x /A0? /A(?Ѐ x <@@DH`H`" |/@b肃KA(8H`8`|x8?|N |!A|? x"Ȁ |/@|" |x8B8KeA(|`x"Ȑ "Ȁ |/@@" |/@ " b肃|xK%A(8H8x8zKA(|`x"Ȁ |9?x|x8}%KxK-A(|`xpp/@<" |/@b肃KA(8H8`|x8?|N |!A|? x8x8zKA(|`x"Ȁ |9?x|x8}%KxK=A(|`xpp/@<" |/@b肃KA(8H8`|x8?|N |!Q|? x8? x | x@@8" |/@b肄KA(8Hxt8pH8`pT`&|x ? x @@ p| 4px  tx | x  8 x | 4" }CSx}d[x|xH]|`xxx/@p| t|}#Kx|xKi|`x/@p| 4px  tx | x  8 x | 49 t} 0| 8 |}CSx}d[x|x„HY? x pT`&|x | H$?p8 pp/?@H`/@4" |/@b肄KIA(8H? 8`|x8?|N !|? x|`x|#x?x  x |HPx  8 x 88| 48| H68 0| 4| L60} 8|x8?PN !|? x|`x|#x?x  x |HPx  8 x 88| 48| H68 0?i| 40|H6|}`8? ?i| 4|H6}`x? 8?PN |!Q|? x|`x? x | x@@8" |/@b肄 K=A(8HTx ? |XPxx| 4x  x | x  8 x | 4" }CSx}d[x|xK|`xx9 } 0| 8 || xxAD" |/@$x b(肄 |xKaA(8Hx| 4x  x | x  8 x |4}c[x|x8„K| |}#Kx|xK|`xpp|`|x8?|N |!a|? xbK|`xpp/Ap|H"8 8`|x8?|N |!a|? x|`x"0 |x8KA(|`xpp/@@" |/@ "0 b8肄@|xKA(8Hx p|8`88|x}(KxKA(|`xxp||xKA(?x8@4" |/@bH肄@K-A(8H?x 8`|x8?|N |!a|? x"0 |x8KA(|`xpp/@@" |/@ "0 b8肄P|xKiA(8HxKEA(|`xtp||xKA(t/@4" |/@bX肄PKA(8H8`|x8?|N |!q|? x" |x8K A(|`xtt|Tpp/At||xKA(p||x8?|N |!a|? x|#xxtx /A ?t8 ttT`&|"Ȁ |/@4" |/@b`肄hKA(8H`K|`xpp/Ap|H0x |xK|`xpp|`|x8?|N |!a|? x" |/@bp肄xK~A(xtx /A ?t8 ttT`&|"Ȁ |/@,K|`xpp/Ap|H8x|xK|`xpp/Ap|H\xx |xK|`xpp/Ap|H xx ? 8`|x8?|N |!a|? x8K}A(|`xpp/A8Hp||xKqA(|`xt| tH@," |x肄K~A(8Hp||xK|qA(|`xt| tH@," |x肄K}A(8H$p||xK}A(8`|x8?|N |!a|? x|`xؐ8t|x8K~A(8tb|x8Ka|`xpp/Ap|H,8t|x8K}A(t|`|x8?|N |!a|? x|`x|#xБ?؀ؐt8tb|x8 K|`xpp/Ap|H$x|? ||`|x8?|N |!Q|? x|`x|#x|+x?tx8tb|x8K|`xpp/Ap|H$||? |`|x8?|N |!q|? x|`x|#x|+xؐ?ȑЀȐtАx9?t8 |x8K{A(8tb|x8 K |`xp||/@ 9?t8 |x8K{A(|||x8?|N |!Q|? x|`x|#x|+x|3x?_tx|8tb|x8KM|`xpp/Ap|H|`|x8?|N |!Q|? x|`x|#x|+x?tx8tb|x8K|`xpp/Ap|H$||? |`|x8?|N |!q|? xb8KxA(|`xtt|Tpp/At||xKxA(p||x8?|N |bH!+/A<;``` A(| iIN!A(?/@8!|N `$}B}hK}}ZlL}ilN ```8K8K8K8K8K8K8K8K8K8 K|8 Kt8 Kl8 Kd8 K\8KT8KL8KD8K<8K48K,8K$8K8K8K 8K8K8K8K8K8K8K|!`Kw`8!p|N open_proc_rtas_file/proc/ppc64/rtas/proc/rtas%s/%slibrtas %s(): Failed to open %s ibm,activate-firmwareibm,configure-connectordisplay-characteribm,display-messageibm,errinjctibm,close-errinjctibm,open-errinjctibm,get-config-addr-info2ibm,get-dynamic-sensor-stateibm,get-indicesget-power-levelget-sensor-stateibm,get-system-parameterget-time-of-dayibm,get-vpdibm,lpar-perftoolsibm,platform-dumpibm,read-slot-reset-stateibm,scan-log-dumpibm,set-dynamic-indicatoribm,set-eeh-optionset-indicatorset-power-levelset-time-for-power-onibm,set-system-parameterset-time-of-dayibm,suspend-meibm,update-nodesibm,update-properties/proc/device-tree/rtas%s/%sread_entire_filelibrtas %s(): read failed handle_delaylibrtas %s(): Return status %d, delaying for %ld ms RTAS call args.token = %d RTAS call args.ninputs = %d RTAS call args.nret = %d RTAS call input[%d] = 0x%x RTAS call output[%d] = 0x%x sc_rtas_calllibrtas %s(): RTAS syscall failure, errno=%d sc_activate_firmwarelibrtas %s(): () = %d sc_cfg_connectorlibrtas %s(): (%p) = %d sc_display_charlibrtas %s(): (%d) = %d sc_display_msgsc_errinjctlibrtas %s(): (%d, %d, %p) = %d sc_errinjct_closesc_errinjct_openlibrtas %s(): (%p) = %d, %d sc_get_config_addr_info2librtas %s(): (0x%x, 0x%llx, %d) = %d, 0x%x sc_get_dynamic_sensorlibrtas %s(): (%d, %s, %p) = %d, %d sc_get_indiceslibrtas %s(): (%d, %d, %p, %d, %d, %p) = %d, %d sc_get_power_levellibrtas %s(): (%d, %p) = %d, %d sc_get_sensorlibrtas %s(): (%d, %d, %p) = %d, %d sc_get_sysparmsc_get_timelibrtas %s(): () = %d, %d, %d, %d, %d, %d, %d, %d sc_get_vpdNULLlibrtas %s(): (%s, 0x%p, %d, %d) = %d, %d, %dsc_lpar_perftoolslibrtas %s(): (%d, %p, %d, %d, %p) = %d, %d sc_platform_dumplibrtas %s(): %s: seq_next = 0x%llx librtas %s(): (0x%llx, 0x%llx, %p, %d, %p, %p) = %d, 0x%llx, 0x%llx sc_read_slot_resetlibrtas %s(): (0x%x, 0x%llx, %p, %p) = %d, %d, %d sc_scan_log_dumplibrtas %s(): (%p, %d) = %d sc_set_dynamic_indicatorlibrtas %s(): (%d, %d, %s) = %d sc_set_eeh_optionlibrtas %s(): (0x%x, 0x%llx, %d) = %d sc_set_indicatorlibrtas %s(): (%d, %d, %d) = %d sc_set_power_levelsc_set_poweron_timelibrtas %s(): (%d, %d, %d, %d, %d, %d, %d) = %d sc_set_sysparmlibrtas %s(): (%d, %p) = %d sc_set_timesc_suspend_mesc_update_nodeslibrtas %s(): (%p) %d = %d sc_update_propertiesrmo_buffer/dev/mem/var/lock/LCK..librtasread_kregion_boundslibrtas %s(): Could not open workarea file %llx %xlibrtas %s(): Unexpected kregion bounds acquire_file_locklibrtas %s(): could not open lockfile %s librtas %s(): fcntl failed for [0x%lx, 0x%x] release_file_lockget_phys_regionlibrtas %s(): Invalid buffer size 0x%x requested librtas %s(): Could not find available workarea space release_phys_regionlibrtas %s(): Invalid region [0x%x, 0x%x] mmap_dev_memlibrtas %s(): Failed to open %s librtas %s(): mmap failed munmap_dev_memlibrtas %s(): munmap failed sc_free_rmo_bufferlibrtas %s(): Attempting to free before calling get() sc_get_rmo_bufferlibrtas %s(): RMO buffer request, size: %d Failed to write proc file %s Failed to read proc file %s cfg_connectorget_powerget_sensorget_sysparmset_indicatorset_powerͨl ` xoP  X?8pP0% ooo oYРhx؈B8khkEPkF kFtkGkHkIkJkKkLkMkO<kPhkQkRkSkUkVkWkXkYk[8k\k]k_Hk`kakbkc<kdkekg khhkjkk<klkmko0kpdkqkrksLkukvkxk{$k|pk~k8kkkk4kk`kkkk8kdk|ktk(klk@k<kk4kkkkkkXkhkxk@kkkkkXkHkk k@kkkdkƼk|k,kkɼkxk8kkkX(08 @͐0H`pΈΠ8HXpψϨ0P`pЈи@`рѠ8 hPҘ҈Ҹ0pPӸӠ@(xhԠ԰`HըՐ0րh֠@(hט׀0 P@ظؠP8 h٘ ٰ80HHڈxڰhPۘ۸(GCC: (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]ospWG,Ft),pd,u@d,>x,Md\+!open_proc_rtas_filertas_activate_firmware1rtas_cfg_connectorsrtas_delay_timeoutrtas_display_charrtas_display_msg )rtas_errinjct rtas_errinjct_close rtas_errinjct_open rtas_free_rmo_buffer ]rtas_get_config_addr_info2 rtas_get_dynamic_sensor 5rtas_get_indices rtas_get_power_level rtas_get_rmo_buffer rrtas_get_sensor rtas_get_sysparm :rtas_get_time rtas_get_vpdrrtas_lpar_perftoolsrtas_platform_dumprtas_read_slot_resetrtas_scan_log_dumpRrtas_set_debugrtas_set_dynamic_indicatorrtas_set_eeh_optionPrtas_set_indicatorrtas_set_power_levelrtas_set_poweron_timertas_set_sysparmrtas_set_timertas_suspend_mertas_update_nodesMrtas_update_propertiesconfig2 #rtas_token^read_entire_file 2sc_activate_firmware sc_cfg_connector ksc_delay_timeout sc_display_char &sc_display_msg sc_errinjct sc_errinjct_close +sc_errinjct_open sc_get_config_addr_info2isc_get_dynamic_sensor@sc_get_indices8sc_get_power_levelsc_get_sensorvsc_get_sysparm=sc_get_time%sc_get_vpd]sc_lpar_perftoolsEsc_platform_dump}sc_read_slot_reset5sc_scan_log_dumpsc_set_dynamic_indicatorsc_set_eeh_optionksc_set_indicatorsc_set_power_levelsc_set_poweron_timesc_set_sysparmisc_set_timeQsc_suspend_mesc_update_nodessc_update_properties syscall_rtas_opsS> sc_interface_exists sc_free_rmo_buffer usc_get_rmo_bufferM7 pfs_cfg_connector ypfs_get_power pfs_get_sensor `pfs_get_sysparm pfs_set_indicator Xpfs_set_power procfs_interface_exists procfs_rtas_opsFtpd;6aintJpyB1E4;8Bp e p _ _# # # { #  # !/#( ;"J#0 #k#8 .$#@ %#H '#P l)#X +4#` ,Z#h -#p .#x I0# r3# }6F# 9# <# 8># *?# A# C9# E# Gr# ]J# NKr# %N# bO# P# Q# WW WWj W W Wp W/WWWj WJWW5 WeWeWP Whwq WW WWWhe WWWWjwWe W4WWe WTwTh: WWWWe` WW;;j WW WWjjw;; WFWWj;; WzWhwzzL WWee WWhw WWWWh WWW W9WWWW WrW? WW;jx WW WWj;WoT )U# V# WW#J<WFtG;0 $;W8=;>K?Wfd@WiAWR ͐ ep eOXWGHMJjWHI1kWP{WIJszj0|WPWJK40WKLcp0WPWLM )bufj0WPWMO< W0W8jWPvWO<Phh W0WP2WPhQ e0WPWQR ]bufh0\8wWRSO 0f8EWP^WSU 5W0h8,eWP4WUV 2W0 2W82j2w3W3e5WPvJWVW6 mIW0Ie8KWPaWWX r`w0buf`T8\`frWXY qW0qW8,qesWP|WY[8 :k;0u;8*jWP W[8\j 08dayminsecW@W\]rj0j8w2;WPHW]_HW0j8u;2;WPSW_H`Q(028 7huwBzzWPW`a08,eeeheWPWabR 7h0uw8WP&Wbc<8%W0/5Wc<d64W04W84h6WP.IWdePH0H8HWJWP\Weg 6[W0[W8[W]WPoWg hhlmnW0nW8nepWPWhhj08dayminsecW@Wjk< k;0*j8WPWk<l S08dayminsecW@Wlm 0WPWmo0 Mj0;8WP~Wo0pd :j0;8WP  h! pduy86intJE;a14b88 _ _# # # {#  # !#( ;":#0 #[#8 .${#@ %#H '#P l)#X +$#` ,J#h -o#p .#x I0# r3# }66# 9p# <# 8># *?# A# C)# Eo# Gb# ]J# NKb# %N# bO# P# Q# ? ? ? ? | ?  ? ?  ? ? ? ? | ?: ? ?% ?U ? U?@ ?{ z -a ? ?  ? ? ? z U ? ? ? ? | - ? U ?$ ? ? U ?D - D z* ?o ? ? ? UP ? ? b b |u ? ?        ? ? | | - b  b ?6 ? ? | b b  ?j ? z - j j< ? ? U Uv ? ? z - ? ? ? ? z ? ? ? ?) ? ? ? ? ?b ? / ? ? b |h ? ?  ? ? | b ?oT )U # V# W?#K ?pdq |A0c8fdU !|Hlen"?@E?qr AC0cC8ZCDfdF?TrcG?P|-[?rsL !^Z0'\|Hlen]-Prc^?@0z?sLu nfdy?0bufy8leny{-Poff|-Hrc}?@R w  ^ ux&+8JB-i-y_6int;aJB B f4~8_ _ _# # # {#  # !6#( ;"Q#0 #r#8 .$#@ %#H '#P l)#X +;#` ,a#h -#p .#x I0# r3# }6M# 9# <# 8># *?# A# C@# E# Gy# ]J# NKy# %N# bO# P# Q# pp pp p ppB p6ppp pQpp< plplpW pTx pp pppl ppppTpl p;ppl! p[T[A pppplg pp~~ pp ppT~~ pMpp~~$ ppTS ppll ppT pppp ppp p@pppp! pypF pp~ pp pp~poT" )U"# V# Wp#@X # # # "# m#P ( f(1Ex~uv (p0R8pPms_H@R  vx q"q0p8ip`3px{$ U "p0p8p"3}m "~apIPrcp}ip}R    2 f\p{$|p p0Rp@rcpR   p|p~ kp08rR@pHrc pR { PKp~8 < J0xZp8 &Yp0cYB8R[\p@rc]pR v ҈tp sp0bufs8Ruvwxpyp@rczpR q Ҹp# p0p8pRp@rcpR l 8p4p +p0p8Rp@rcpR g  p4 p0l8Rp@rcpR b ~p` ip08f ERp@rcpR ] Pp`W@p0p8,lRq !"p@rc#pR X ӠiMp8Kp0Kp8 KpKKTLpLlRNOPQprcRpR C uptp0mtp8tlRvwp@rcxpR > (p8>vp0p8p,lRp@rcpR 9 hp8d=p0k~8u~*Rp@rcpR 4 ԠFpd|%p08dayminsecRprcpR / ԰op|t%]p08T2~Rq~prc p~R * z9pt(rE6p06p86u7~27~8R:;<=prc>pR  Hjp(l}hp0(h82h 7huiTiiRklWm0mnnopprcqpR  Րpl@ 5p08,leehlRprcpR  5p@<Yp0 78uTRp@rcpR  h'p<p06p8pRqp@rcpR  ֠p4kp08pRprcpR 3p4@2p062p82p2pR45prc6pR (PpOp0mOp8OpOlRQRp@rcSpR hspqp0q8qdayqrminrsecrrRtuprcvpR ׀Zp'ip0k~8*Rp@rcpR KptQp08dayminsecRprcpR "pXp08Rp@rcpR~ _pXhp08~rR@pHrcpRi  phx[Dp08~r R!"@#pHrc$pRT P BT fD Bi fY B~ f n B f  B f B f B f B f B  f B * f  n B X f HYD B f   ^ !E xd;6aintJ ^W XeyB1E  P# P# e# Ee# p#  { 4;8B _" _2# M# c# {~#  M# !#( ;"#0 ##8 .$#@ %/#H 'T#P l)#X +#` ,#h -#p .#x I0Q# r3# }6# 9# <# 8>># *?c# A# C# E# G# ]J# NK# %N!# bOA# PA# QR#W2W"WMW8Wc*SW~WiWWWWWWWWWWW~W)W*)WTWW~5WWWWWZWWWW)~WWWWWW;;WQW)))))))WW;;WWWW;;WW**~*WW*W>W~$WcWWW~DWW*WiWWWWWWWWW;W!W* WAW;'WRGoT )U# V*# WW#5 Z! "*# ## $#( KW# 9W# U# *#  /Wx@ .0buf0Xfd1WTrc2WPR ؠ 'xW@w0w8 yrczWR}   WB j08 rcWRx ٘ W 0\)8 XP *HWDiW@Rs ٰV* o UP0 UP8 U* WPh X*`hX)  fP0 fP8f* g iPh j*`WXHv \08 X WTWP *HrcW@R^ 0 WH rc WP >!W  8\ 0 8buf "~Xfd#WPRY x n@W @] buf?~0?8rcAWTfdBWPRD  ZW@ fd[Wd \W` +qW ubufp~0\p8prWTrcsWPR/  WdD 0buf8\)XWTrcWPR P  {  / {  D { 4 Y { I  s { c    a @ H  P }!  ^X3f d #;6aintJ ^ ^yB1E u-} W# K# # # # #( J#0 #8 #@ #H #P  #X "#` X$#h &W#p *W#t ,e#x 04# 1I# j2# 36# ?p# H~# I~# J~# K~# L# #NW# P# j  # # ~W# {} {4;8B_ _# # 1# {L#  # !q#( ;"#0 ##8 .$#@ %#H '"#P l)V#X +v#` ,#h -#p .#x I0# r3Y# }6# 9# <# 8> # *?1# AV# C{# E# G# ]J# NK# %N# bO # P # Q #WWWWW1!WLW7WqWWWRWWWwWWWW~WWW"WW~WVWWWW(WvWW\W~|WWWWWW;;WWWSW;SS;%WWW;;S_WW~WWW W~W1WWW~WVWW7W{WWWW\WWWW;WWW W;W    k 6W# W# W# W# f W# W# ,W# W#   # W# { v  # m W# !W# "W# $ h m%W# &W# 'W# (W# | * k+;# *, # u-;# .W#  _6WdƼ  850buf5~85rc7WTfd8WP X]WƼ| y\W0\8"^ _rc_W_ tvW|,+ uW0ruW8u"w TrcxWP )W,x `W0W8W," kDrcW@ Wɼ W0k;8u;*" h_rcW_ 8Wɼx XW06W8WW" &DrcW@ Wx8_ W0rW8W" #DrcW@ W8fdWd W` " X% $ > $ > $ >   I: ; II !I/ &I  : ;  : ; I8 ' III : ; .? : ; ' I@: ; I 4: ; I 4: ; I 4I4  .: ; I@.? : ; I@: ; I .? : ;' I@: ;I 4: ;I : ;I 4: ; I?  4: ; I? < % : ; I$ > $ > $ >   I&I  : ;  : ; I8 ' I I I : ; .: ; ' I@: ; I : ; I 4: ; I 4: ; I .? : ; ' I@4I4  I!I/ 4: ; I? < % : ; I I$ > $ > $ >   I I !I/  : ;  : ; I8 ' III : ; .: ; ' I@: ; I 4: ; I 4: ; I 4I4  .: ; ' @.? : ; ' I@.? : ;' I@: ;I 4: ;I 4: ;I : ;I &I4: ; I? < 4: ; I?  % $ > $ > : ; I$ >   I : ;  : ; I8 I !I/ &I  : ; ' III.: ; ' I@: ; I 4: ; I 4I4  4: ; I .: ; ' @.: ;I@4: ;I .: ;' I@: ;I : ;I 4: ;I .? : ;I@.? : ;' I@ 4: ; I? < % $ > $ > : ; I$ >   I&I  : ;  : ;I8 : ; : ; I8 I!I/  : ; ' III!I/.: ; ' I@: ; I : ; I 4: ; I .? : ; ' I@4: ; I .? : ; I@4: ; I? < 4: ; I?   /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includecommon.cstddef.hstdint.hcommon.h Ft;l/Kן9#=/ YKL1/! YZ=?uu! gZ=?uu! guu! uZ=?uu!! gZ=?uu! Z=?uuY! uZ=?uu!! gZ=?uu! uu!Z=@vvh"Z=?uu=!Z=@vv"Z=?uu/!uu!Z=?uuY!Z=?uuY!Z=@vvZ"Z=@vvh"Z=@vv"Z=@vvL"Z=?uuK! uZ=?uu! Y>! tZ=@vvZ" Z=?uuY! Z=?uuu! Z=?uuY!Z=@vv#" Z=?uu/!Z=@vv#" gZ=?uu! Z=?uu/! Z=?uu/! ~ /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includeofdt.cstddef.hstdint.hcommon.h pdu=Y .v u=YY2/!u=BZ=! g2= .LL=!/1Jn =KvKY.s =Y .y YL=>/! 4 /usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includesyscall_calls.cstdarg.hstddef.hstdint.hcommon.hsyscall.h u=1hK;rNL?.s Kg w gK0hg/! [=uuuKհg-v ==>/KKOw= .w M=K/! u <=CL=!/4=<e tt ?u>#vJ3'=hKK! K>! t <=CLu! 5Z=<r n?G%K!11=<n  tz "?G%=h!  <=CLg!  <=CL! <z ?G%ح /4Z=<p  z ?G%ʻ!4=<v z ?G%=h%!  <=Dz L!  <=Dz Lػ!4=<w z 0?G%=! <z >=Dz L0!//5=<e =K/1 Jy =v?G%=Z!4=<k h Jy =?G%=#!/5== <c Js =%?ʃzJ(gh=! <z h=Dz L"! 4=<p {?G%=hY! /4Z=<o  z "?G&!  <z Z=Dz L!  <z 0=Dz L!  <z =Dz Lػ! <z =Dz L)! 5==<r ?G%u! <z =Dz L)!  <z =CL=!3=<o |?G%=hu!3=<o |?G%=hu!  /usr/include/bits/usr/include/sys/usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includesyscall_rmo.ctypes.htypes.hstddef.hfcntl.hstdint.hcommon.hsyscall.h x.k=.o Y=K <v L02y &/!-yYY.r ////L>2/! x////L=2/! u/3u.g >K/=[u v =3=/!~hg thf4u.q u>06=!\K=A>/! =.u ZK3=/! x= .x gY=2/!YL=Z/ ?L=MY .y Y=Av=!?L=MY== <v g=Dz =@K/! Q /usr/include/bits/usr/lib64/gcc/powerpc64-suse-linux/4.3/include/usr/includeprocfs_calls.ctypes.hstddef.hlibio.hstdio.hstdint.hcommon.hprocfs.h d5g=.n Yv.v Yu5Z/! gv=Ah=! 0v=AL=! /0u=AL=!//vwKv/ //0v=?=! /0v=AL=! \gL=Z/  xA $FtDPA~D $GPA~D $HPA~D $I PA~D $JPA~D $K,PA~D $L PA~D $MHPA~D $O<,PA~D $Ph PA~D $QPA~D $RPPA~D $ST>T>dQ>d>hq>h@dQqQqDDTQTXqX44DQDHqHQq$Q$(q(Qq  Q q P P `Q ` dq d  Q q  Q q X X hQ h lq l||QqQqXXhQhlq!l!(Q(,q,QqQq!X!XhQhlql$Q$(q(Qq\.symtab.strtab.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.data.rel.ro.dynamic.data.opd.branch_lt.got.bss.comment.comment.SUSE.OPTs.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_locXX$2X.o8  @PPHo  Uo@d00%n?8?8xB B X~BBhh(͐͐44((88@@PP``` 0sXXXX(0X90 [,Tz:\^ xFgS0v F^i &  XP 0 ?8 B  B h ͐4(8@P`XX !"# -98FT(bXq` x8 4 ͐@` ! 3C Uhbs p  P ҈ Ҹ    P" Ӡ4 F (X hj Ԡ| ԰   H Ր  h ֠   ( h0 ׀B T f x  P@HP( ؠ |% ٘7I ٰ[Xkt} 0( x @X X    P+X6 C] B  B D B D E8D D0t D C( D C C4 DZ0g D Dx E  E Cp) 8< Bb CX C B B  C ) B O D v DH C@ C P D` 4 - ;@l MpX [@ j x   P     XH  $8, 6 ID ^`H s d P   ( x 4 "$ 5L J" dh y     x h  p p %4 6HT IXh Zx k0H  P   @ HD hH Tp-P >`Vgv<0(p   8(@H80J,^oX{lH(4  ,X<N<_d wH`,D X$54GZ8lhHDh`initfini.ccrtstuff.c__do_global_dtors_auxframe_dummy__JCR_LIST____CTOR_LIST____DTOR_LIST__completed.6751dtor_idx.6753__do_global_ctors_aux__JCR_END____CTOR_END____FRAME_END__common.c__FUNCTION__.2913C.0.2914init_interfaceofdt.cofdt_rtas_pathopen_prop_fileget_property__FUNCTION__.3349syscall_calls.c__FUNCTION__.3111handle_delaydisplay_rtas_buf__FUNCTION__.3189sc_rtas_call__FUNCTION__.3232__FUNCTION__.3265__FUNCTION__.3320__FUNCTION__.3353__FUNCTION__.3395__FUNCTION__.3432__FUNCTION__.3460__FUNCTION__.3492__FUNCTION__.3528__FUNCTION__.3576__FUNCTION__.3614__FUNCTION__.3645__FUNCTION__.3678__FUNCTION__.3723__FUNCTION__.3769__FUNCTION__.3821__FUNCTION__.3872__FUNCTION__.3943__FUNCTION__.3979__FUNCTION__.4021__FUNCTION__.4063__FUNCTION__.4096__FUNCTION__.4126__FUNCTION__.4161__FUNCTION__.4193__FUNCTION__.4240__FUNCTION__.4268__FUNCTION__.4302__FUNCTION__.4342syscall_rmo.crmo_filenamedevmem_pathlockfile_pathwa_config__FUNCTION__.3303read_kregion_bounds__FUNCTION__.3379acquire_file_lock__FUNCTION__.3409release_file_lock__FUNCTION__.3430get_phys_regionget_bitsset_bits__FUNCTION__.3490release_phys_regioninit_workarea_config__FUNCTION__.3545mmap_dev_mem__FUNCTION__.3569munmap_dev_mem__FUNCTION__.3603__FUNCTION__.3629procfs_calls.cdo_rtas_op00000010.plt_call.sc_free_rmo_buffer+000000014.plt_call.__gmon_start__+000000010.plt_call.read@@GLIBC_2.3+000000010.plt_call.__isoc99_sscanf@@GLIBC_2.7+000000010.plt_call.getpid@@GLIBC_2.3+000000010.plt_call.malloc@@GLIBC_2.3+000000010.plt_call.write@@GLIBC_2.3+000000010.plt_call.__errno_location@@GLIBC_2.3+000000010.plt_call.rtas_token+000000010.plt_call.mmap@@GLIBC_2.3+000000010.plt_call.fprintf@@GLIBC_2.4+000000010.plt_call.read_entire_file+0__dso_handle00000010.plt_call.open@@GLIBC_2.3+000000010.plt_call.munmap@@GLIBC_2.3+0__DTOR_END__00000010.plt_call.geteuid@@GLIBC_2.3+000000010.plt_call.strcpy@@GLIBC_2.3+000000010.plt_call.syscall@@GLIBC_2.3+000000010.plt_call.memcpy@@GLIBC_2.3+000000010.plt_call.open_proc_rtas_file+0__glink_PLTresolve00000010.plt_call.printf@@GLIBC_2.4+000000010.plt_call.free@@GLIBC_2.3+000000010.plt_call.realloc@@GLIBC_2.3+000000010.plt_call.sc_get_rmo_buffer+000000010.plt_call.__cxa_finalize@@GLIBC_2.3+000000010.plt_call.snprintf@@GLIBC_2.4+000000010.plt_call.strlen@@GLIBC_2.3+000000010.plt_call.sprintf@@GLIBC_2.4+000000010.plt_call.close@@GLIBC_2.3+000000010.plt_call.usleep@@GLIBC_2.3+000000010.plt_call.strncpy@@GLIBC_2.3+0_DYNAMIC00000010.plt_call.fcntl@@GLIBC_2.3+0rtas_update_propertiessc_get_sensorsc_errinjct_closertas_get_timertas_set_debugrtas_set_timefcntl@@GLIBC_2.3sc_set_eeh_optionusleep@@GLIBC_2.3sc_update_nodesrtas_cfg_connectorfree@@GLIBC_2.3stderr@@GLIBC_2.3munmap@@GLIBC_2.3rtas_get_sysparmpfs_get_sensorrtas_display_charrtas_errinjct_openrtas_read_slot_resetrtas_set_power_level__gmon_start___Jv_RegisterClassesrtas_lpar_perftoolsrtas_get_config_addr_info2__isoc99_sscanf@@GLIBC_2.7realloc@@GLIBC_2.3rtas_get_rmo_buffer_finirtas_get_power_levelsc_free_rmo_buffersc_activate_firmware__cxa_finalize@@GLIBC_2.3sc_update_properties__errno_location@@GLIBC_2.3strlen@@GLIBC_2.3sc_get_timepfs_get_powersc_get_vpdrtas_set_poweron_timesc_get_indicesmmap@@GLIBC_2.3sc_display_charsc_interface_existsrtas_set_sysparmrtas_set_indicatorsc_errinjct_opensc_scan_log_dumprtas_set_eeh_optionsc_set_sysparmread_entire_filertas_suspend_memalloc@@GLIBC_2.3sc_get_dynamic_sensorsc_platform_dumprtas_errinjctrtas_get_vpdsc_get_config_addr_info2write@@GLIBC_2.3rtas_display_msgprocfs_interface_existssc_set_indicatorsc_display_msgrtas_activate_firmwarertas_get_dynamic_sensorsc_lpar_perftoolsprintf@@GLIBC_2.4rtas_scan_log_dumpsc_get_power_levelsc_get_rmo_buffersc_set_timeread@@GLIBC_2.3rtas_tokenrtas_get_sensorpfs_set_indicatorrtas_errinjct_closesc_cfg_connector__bss_startfprintf@@GLIBC_2.4syscall@@GLIBC_2.3rtas_get_indicesrtas_free_rmo_bufferrtas_platform_dumppfs_get_sysparmsc_errinjctsc_set_poweron_timememcpy@@GLIBC_2.3open@@GLIBC_2.3procfs_rtas_opsgetpid@@GLIBC_2.3sc_delay_timeout_endrtas_delay_timeoutstrcpy@@GLIBC_2.3pfs_set_powergeteuid@@GLIBC_2.3sc_read_slot_resetsc_get_sysparmclose@@GLIBC_2.3snprintf@@GLIBC_2.4sc_set_dynamic_indicatorsc_set_power_level_edatasyscall_rtas_opsrtas_update_nodesstrncpy@@GLIBC_2.3sc_suspend_mertas_set_dynamic_indicatoropen_proc_rtas_fileconfigpfs_cfg_connectorsprintf@@GLIBC_2.4_initlibrtas-1.3.10/librtas_src/Makefile0000644000175100001440000000230012313120670016235 0ustar nfontusers# # Makefile for librtas # # Copyright (C) 2005 IBM Corporation # Common Public License Version 1.0 (see COPYRIGHT) # include ../rules.mk LIBRTAS_SONAME = librtas.so LIBRTAS_STATIC = librtas.a LIBRTAS = $(LIBRTAS_SONAME).$(VERSION) LIBRTAS_OBJS = common.o ofdt.o syscall_calls.o syscall_rmo.o procfs_calls.o LIBRTAS_HDR = librtas.h HEADERS = $(LIBRTAS_HDR) common.h CFLAGS += -fPIC -DPIC LDFLAGS += -shared -Wl,-soname -Wl,$(LIBRTAS_SONAME).$(MAJOR_NO) all: librtas_shared librtas_static librtas_shared: $(LIBRTAS_OBJS) $(HEADERS) @echo "LD $(WORK_DIR)/$(LIBRTAS)..." @$(CC) $(LIBRTAS_OBJS) $(LDFLAGS) -o $(LIBRTAS) librtas_static: $(LIBRTAS_OBJS) $(HEADERS) @echo "AR $(LIBRTAS_STATIC)..." @ar rcs $(LIBRTAS_STATIC) $(LIBRTAS_OBJS) install: @$(call install_lib,$(LIBRTAS),$(DESTDIR)) @$(call install_inc,$(HEADERS),$(DESTDIR)) @ln -sf $(LIBRTAS) $(DESTDIR)/$(LIB_DIR)$(call is_lib64,$(LIBRTAS))/$(LIBRTAS_SONAME) uninstall: @$(call uninstall_lib,$(LIBRTAS),$(DESTDIR)) @$(call uninstall_inc,$(LIBRTAS_HDR),$(DESTDIR)) @rm -f $(DESTDIR)/$(LIB_DIR)$(call is_lib64,$(LIBRTAS))/$(LIBRTAS_SONAME) clean: @echo "Cleaning up $(WORK_DIR) files..." @rm -f $(LIBRTAS_OBJS) $(LIBRTAS) $(LIBRTAS_STATIC) librtas-1.3.10/librtas_src/librtas.h0000644000175100001440000001013012313120670016406 0ustar nfontusers/** * @file librtas.h * * Copyright (C) 2005 IBM Corporation * Common Public License Version 1.0 (see COPYRIGHT) * * @author John Rose */ #ifndef _LIBRTAS_H_ #define _LIBRTAS_H_ #include #include #define RTAS_KERNEL_INT -1001 /* No Kernel Interface to Firmware */ #define RTAS_KERNEL_IMP -1002 /* No Kernel Implementation of Function */ #define RTAS_PERM -1003 /* Non-root caller */ #define RTAS_NO_MEM -1004 /* Out of heap memory */ #define RTAS_NO_LOWMEM -1005 /* Kernel out of low memory */ #define RTAS_FREE_ERR -1006 /* Attempt to free nonexistant rmo buffer */ #define RTAS_TIMEOUT -1007 /* RTAS delay exceeded specified timeout */ #define RTAS_IO_ASSERT -1098 /* Unexpected I/O Error */ #define RTAS_UNKNOWN_OP -1099 /* No Firmware Implementation of Function */ /* Adding a new RTAS call requires the following: * 1) A function prototype in librtas.h (this file) that roughly matches * the RTAS call name. * 2) An implementation of the new function in common.c. Use the existing * ones as an example. * 3) A function pointer definition in struct rtas_operations in common.h. * Prepend a "token" argument to the argument list. * 4) An implementation-specific version of the RTAS function, in * syscall_calls.c and/or procfs_calls.c. Remember to add your new * function to the rtas_operations struct at the top of the file. */ #ifdef __cplusplus extern "C" { #endif extern int rtas_activate_firmware(); extern int rtas_cfg_connector(char *workarea); extern int rtas_delay_timeout(uint64_t timeout_ms); extern int rtas_display_char(char c); extern int rtas_display_msg(char *buf); extern int rtas_errinjct(int etoken, int otoken, char *workarea); extern int rtas_errinjct_close(int otoken); extern int rtas_errinjct_open(int *otoken); extern int rtas_free_rmo_buffer(void *buf, uint32_t phys_addr, size_t size); extern int rtas_get_config_addr_info2(uint32_t cfg_addr, uint64_t phb_id, uint32_t func, uint32_t *info); extern int rtas_get_dynamic_sensor(int sensor, void *loc_code, int *state); extern int rtas_get_indices(int is_sensor, int type, char *workarea, size_t size, int start, int *next); extern int rtas_get_power_level(int powerdomain, int *level); extern int rtas_get_rmo_buffer(size_t size, void **buf, uint32_t *phys_addr); extern int rtas_get_sensor(int sensor, int index, int *state); extern int rtas_get_sysparm(unsigned int parameter, unsigned int length, char *data); extern int rtas_get_time(uint32_t *year, uint32_t *month, uint32_t *day, uint32_t *hour, uint32_t *min, uint32_t *sec, uint32_t *nsec); extern int rtas_get_vpd(char *loc_code, char *workarea, size_t size, unsigned int sequence, unsigned int *seq_next, unsigned int *bytes_ret); extern int rtas_lpar_perftools(int subfunc, char *workarea, unsigned int length, unsigned int sequence, unsigned int *seq_next); extern int rtas_platform_dump(uint64_t dump_tag, uint64_t sequence, void *buffer, size_t length, uint64_t *next_seq, uint64_t *bytes_ret); extern int rtas_read_slot_reset(uint32_t cfg_addr, uint64_t phbid, int *state, int *eeh); extern int rtas_scan_log_dump(void *buffer, size_t length); extern int rtas_set_debug(int level); extern int rtas_set_dynamic_indicator(int indicator, int new_value, void *loc_code); extern int rtas_set_eeh_option(uint32_t cfg_addr, uint64_t phbid, int function); extern int rtas_set_indicator(int indicator, int index, int new_value); extern int rtas_set_power_level(int powerdomain, int level, int *setlevel); extern int rtas_set_poweron_time(uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec); extern int rtas_set_sysparm(unsigned int parameter, char *data); extern int rtas_set_time(uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t min, uint32_t sec, uint32_t nsec); extern int rtas_suspend_me(uint64_t streamid); extern int rtas_update_nodes(char *workarea, unsigned int scope); extern int rtas_update_properties(char *workarea, unsigned int scope); #ifdef __cplusplus } #endif #endif /* _LIBRTAS_H_ */ librtas-1.3.10/Makefile0000644000175100001440000000275412313120670013743 0ustar nfontusers# # Makefile for librtas # include rules.mk .SILENT: FILES = README COPYRIGHT SUBDIRS = librtas_src librtasevent_src libofdt_src TARBALL_FILES += $(FILES) doc/doxygen.rtas doc/doxygen.rtasevent Changelog all: @$(foreach d,$(SUBDIRS), $(MAKE) -C $d;) # Update spec file for build type @sed "s|\@LIB_DIR\@|$(LIB_DIR)$(call is_lib64,librtas_src/librtas.so.$(VERSION))|g" $(SPECFILE_IN) > $(SPECFILE) install: @$(call install_doc,$(FILES),$(DESTDIR)) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d install;) uninstall: @$(call uninstall_doc,$(FILES),$(DESTDIR)) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d uninstall;) rpm: all @echo "Creating rpm..." @export DESTDIR=$(SHIPDIR); $(MAKE) install @rm $(SHIPDIR)$(LIB_DIR)$(call is_lib64,librtas_src/librtas.so.$(VERSION))/librtas.so @rm $(SHIPDIR)$(LIB_DIR)$(call is_lib64,librtasevent_src/librtasevent.so.$(VERSION))/librtasevent.so @rm $(SHIPDIR)$(LIB_DIR)$(call is_lib64,libofdt_src/libofdt.so.$(VERSION))/libofdt.so @$(RPM) -bb $(SPECFILE) @rm -rf $(SHIPDIR) docs: @echo "Creating doxygen documents..." @mkdir -p doc/librtasevent @mkdir -p doc/librtas @$(DOXYGEN) doc/doxygen.rtas @$(DOXYGEN) doc/doxygen.rtasevent tarball: clean @echo "Creating release tarball..." @$(BUILD_TARBALL) devball: clean @echo "Creating snapshot tarball..." @$(BUILD_DEVBALL) clean: @$(foreach d,$(SUBDIRS), $(MAKE) -C $d clean;) @echo "Cleaning up doxygen files..." @rm -rf doc/librtas doc/librtasevent @$(CLEAN) $(SHIPDIR) $(TARBALL) $(DEVBALL) $(SPECFILE) librtas-1.3.10/Changelog0000644000175100001440000001555312313120670014116 0ustar nfontusersChangelog for librtas-1.3.10 ======================================= commit e0c097d3e0ab65433d4fdc6e18a820c82d909464 Author: Nathan Fontenot Date: Fri Mar 21 15:28:56 2014 -0500 librtasevent: Enable RTAS event parsing on LE systems The librtasevent library does not work in LE environments. The struct's for each rtas event section are defined as a bit field to match layout of the rtas event. This librtasevent library currently functions by mapping these structs directly the raw rtas event that is passed. This works for BE systems because rtas events are in BE by definition. To fix this this patch re-defines the structs that have been used to just contain an int for each value in the rtas event sections, then adds a raw version of the struct that we can map directly onto the passed in rtas event. The raw structs can then be traversed an we can do any neccessary conversions to LE values in the structs that are passed back to the user. This patch updates most of the v6 rtas event sections, most notably src/fru sections have not been updated yet. At this time there are no plans to update pre-v6 rtas events for LE environments. Signed-off-by: Nathan Fontenot commit 7eb810757d8573ef47fdc5bd26aa3d9e9afbfd8a Author: Greg Kurz Date: Fri Mar 21 11:49:13 2014 -0500 librtas: PCI hotplug support vs little endian The goal of this patch is to enable a little endian process to interact with RTAS which is big endian. The rationale is that librtas assumes to be passed cpu endian arguments and do the necessary conversions. The reasons for this choice are: - many arguments are owned by librtas (status, RMO buffer addresses...) - nearly all arguments are being used in cpu endian order by librtas: if they were assumed to be big endian, we would have to byte swap anyway, resulting in an even bigger patch... Of course, all rules have an exception: the RMO buffer content is not seen by librtas, it is up to the caller (drmgr) to do the conversions. It seems that recent kernels don't have the needed procfs files anymore, so this patch only cares about the rtas() syscall based implementation. As requested by Benjamin Herrenschmidt, the byte swapping should be performed in userland AND be careful about corner cases where non 32-bit values are being passed: http://patchwork.ozlabs.org/patch/327089/ We cannot boldly convert all arguments in the sc_rtas_call() function. For an example, let's look at sc_suspend_me() where we pass a 64 bit value split across two arguments. If streamid is ABCDEFGHIJKLMNOP, then it will be reassembled by the kernel as IJKLMNOPABCDEFGH before being passed to the host... As a consequence, we can only convert well known parameters in the sc_rtas_call() function: - token - number of input arguments - number of return arguments - return status (always the first return argument) All other values must be converted in the caller. Please note that we introduce intermediary variables for return values as we do not want big endian values to be written in memory where the code assumes they are cpu endian. As a starter, we focus on the RTAS calls involved in PCI hotplug. According to section 13.5.3 of the PAPR+, we have: - set-power-level - get-sensor-state - set-indicator - ibm,configure-connector (the RMO part is already covered in drmgr) We should cover all the calls, but it requires a huge work and we only want to enable PCI hotplug here. So yes, all other calls are still broken in little endian... some more patching will be needed. Signed-off-by: Greg Kurz Reviewed-by: Laurent Dufour Changelog for librtas-1.3.9 ======================================= commit 9c5bccb93aa734796df111c2e7c051860b8b30de Author: Signed-off-by: Greg Kurz Date: Fri Feb 28 07:49:59 2014 -0600 librtas, libofdt: fix endianness issues when accessing the device tree Signed-off-by: Greg Kurz commit 399a1962534342c1a153445b587d3fd0c95cfc78 Merge: e2de13f a057c98 Author: Nathan Fontenot Date: Wed Feb 26 08:22:33 2014 -0600 Merge branch 'master' of ssh://nfont@git.code.sf.net/p/librtas/code commit e2de13f77b36aff9d55d97ec862261a329262d4a Author: Tyrel Datwyler Date: Tue Feb 25 10:09:54 2014 -0600 librtasevent: Add hotplug event implementation Add event definition and helper functions for hotplug events. This is intended for qemu to notify a pseries guest of a hotplug event. Signed-off-by: Tyrel Datwyler commit a057c984394ac5c0a043ecc250073b8606cd38a1 Author: Tyrel Datwyler Date: Tue Feb 25 10:09:54 2014 -0600 librtasevent: Add hotplug event implementation Add event definition and helper functions for hotplug events. This is intended for qemu to notify a pseries guest of a hotplug event. Signed-off-by: Tyrel Datwyler Changelog for librtas-1.3.8 ======================================= commit cd1868315f728ea5e8399df5fb7689a88870d7da Author: Nathan Fontenot Date: Thu Jan 31 12:27:48 2013 -0600 Identify Platform Resource Reassignment Notifications (PRRN). Signed-off-by: Nathan Fontenot Changelog for librtas-1.3.7 ======================================= commit 0d02142ec36e176694c90ab722aedc75c48801a0 Author: Vasant Hegde Date: Tue Dec 18 13:08:09 2012 -0600 librtas allocates buffer space (required for RTAS call) in the RTAS private memory area through sc_get_rmo_buffer() which internally allocates memory and protects it by acquiring lock on the allocated memory area. Locking function : At present acquire_file_lock() tries to lock the particular memory area. If the memory area is already locked then it returns error without retrying. So when two process executes rtas call simultaneously one fails with "Unknown librtas I/O" error. This patch introduces "Wait for lock to be available" instead of returning with IO error. Signed-off-by: Vasant Hegde commit aea297b24ed0167970732193bbfd206a6c844dec Author: Vasant Hegde Date: Tue Dec 18 13:06:21 2012 -0600 This patch fixes minor memory leak in librtas.so Signed-off-by: Vasant Hegde Signed-off-by: Nathan Fontenot