Home | History | Annotate | Line # | Download | only in service_layers
      1 /******************************************************************************
      2  *
      3  * Module Name: osunixxf - UNIX OSL interfaces
      4  *
      5  *****************************************************************************/
      6 
      7 /******************************************************************************
      8  *
      9  * 1. Copyright Notice
     10  *
     11  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * 2. License
     15  *
     16  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  * rights. You may have additional license terms from the party that provided
     18  * you this software, covering your right to use that party's intellectual
     19  * property rights.
     20  *
     21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  * copy of the source code appearing in this file ("Covered Code") an
     23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  * make derivatives, distribute, use and display any portion of the Covered
     26  * Code in any form, with the right to sublicense such rights; and
     27  *
     28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  * license (with the right to sublicense), under only those claims of Intel
     30  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  * offer to sell, and import the Covered Code and derivative works thereof
     32  * solely to the minimum extent necessary to exercise the above copyright
     33  * license, and in no event shall the patent license extend to any additions
     34  * to or modifications of the Original Intel Code. No other license or right
     35  * is granted directly or by implication, estoppel or otherwise;
     36  *
     37  * The above copyright and patent license is granted only if the following
     38  * conditions are met:
     39  *
     40  * 3. Conditions
     41  *
     42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  * Redistribution of source code of any substantial portion of the Covered
     44  * Code or modification with rights to further distribute source must include
     45  * the above Copyright Notice, the above License, this list of Conditions,
     46  * and the following Disclaimer and Export Compliance provision. In addition,
     47  * Licensee must cause all Covered Code to which Licensee contributes to
     48  * contain a file documenting the changes Licensee made to create that Covered
     49  * Code and the date of any change. Licensee must include in that file the
     50  * documentation of any changes made by any predecessor Licensee. Licensee
     51  * must include a prominent statement that the modification is derived,
     52  * directly or indirectly, from Original Intel Code.
     53  *
     54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  * Redistribution of source code of any substantial portion of the Covered
     56  * Code or modification without rights to further distribute source must
     57  * include the following Disclaimer and Export Compliance provision in the
     58  * documentation and/or other materials provided with distribution. In
     59  * addition, Licensee may not authorize further sublicense of source of any
     60  * portion of the Covered Code, and must include terms to the effect that the
     61  * license from Licensee to its licensee is limited to the intellectual
     62  * property embodied in the software Licensee provides to its licensee, and
     63  * not to intellectual property embodied in modifications its licensee may
     64  * make.
     65  *
     66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  * substantial portion of the Covered Code or modification must reproduce the
     68  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  * provision in the documentation and/or other materials provided with the
     70  * distribution.
     71  *
     72  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  * Intel Code.
     74  *
     75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  * other dealings in products derived from or relating to the Covered Code
     78  * without prior written authorization from Intel.
     79  *
     80  * 4. Disclaimer and Export Compliance
     81  *
     82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  * PARTICULAR PURPOSE.
     89  *
     90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  * LIMITED REMEDY.
     98  *
     99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  * software or system incorporating such software without first obtaining any
    101  * required license or other approval from the U. S. Department of Commerce or
    102  * any other agency or department of the United States Government. In the
    103  * event Licensee exports any such software from the United States or
    104  * re-exports any such software from a foreign destination, Licensee shall
    105  * ensure that the distribution and export/re-export of the software is in
    106  * compliance with all laws, regulations, orders, or other restrictions of the
    107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  * any of its subsidiaries will export/re-export any technical data, process,
    109  * software, or service, directly or indirectly, to any country for which the
    110  * United States government or any agency thereof requires an export license,
    111  * other governmental approval, or letter of assurance, without first obtaining
    112  * such license, approval or letter.
    113  *
    114  *****************************************************************************
    115  *
    116  * Alternatively, you may choose to be licensed under the terms of the
    117  * following license:
    118  *
    119  * Redistribution and use in source and binary forms, with or without
    120  * modification, are permitted provided that the following conditions
    121  * are met:
    122  * 1. Redistributions of source code must retain the above copyright
    123  *    notice, this list of conditions, and the following disclaimer,
    124  *    without modification.
    125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    126  *    substantially similar to the "NO WARRANTY" disclaimer below
    127  *    ("Disclaimer") and any redistribution must be conditioned upon
    128  *    including a substantially similar Disclaimer requirement for further
    129  *    binary redistribution.
    130  * 3. Neither the names of the above-listed copyright holders nor the names
    131  *    of any contributors may be used to endorse or promote products derived
    132  *    from this software without specific prior written permission.
    133  *
    134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  *
    146  * Alternatively, you may choose to be licensed under the terms of the
    147  * GNU General Public License ("GPL") version 2 as published by the Free
    148  * Software Foundation.
    149  *
    150  *****************************************************************************/
    151 
    152 /*
    153  * These interfaces are required in order to compile the ASL compiler and the
    154  * various ACPICA tools under Linux or other Unix-like system.
    155  */
    156 #include "acpi.h"
    157 #include "accommon.h"
    158 #include "amlcode.h"
    159 #include "acparser.h"
    160 #include "acdebug.h"
    161 
    162 #include <stdio.h>
    163 #include <stdlib.h>
    164 #include <stdarg.h>
    165 #include <unistd.h>
    166 #include <sys/time.h>
    167 #include <semaphore.h>
    168 #include <pthread.h>
    169 #include <errno.h>
    170 
    171 #define _COMPONENT          ACPI_OS_SERVICES
    172         ACPI_MODULE_NAME    ("osunixxf")
    173 
    174 
    175 /* Upcalls to AcpiExec */
    176 
    177 void
    178 AeTableOverride (
    179     ACPI_TABLE_HEADER       *ExistingTable,
    180     ACPI_TABLE_HEADER       **NewTable);
    181 
    182 typedef void* (*PTHREAD_CALLBACK) (void *);
    183 
    184 /* Buffer used by AcpiOsVprintf */
    185 
    186 #define ACPI_VPRINTF_BUFFER_SIZE    512
    187 #define _ASCII_NEWLINE              '\n'
    188 
    189 /* Terminal support for AcpiExec only */
    190 
    191 #ifdef ACPI_EXEC_APP
    192 #include <termios.h>
    193 
    194 struct termios              OriginalTermAttributes;
    195 int                         TermAttributesWereSet = 0;
    196 
    197 ACPI_STATUS
    198 AcpiUtReadLine (
    199     char                    *Buffer,
    200     UINT32                  BufferLength,
    201     UINT32                  *BytesRead);
    202 
    203 static void
    204 OsEnterLineEditMode (
    205     void);
    206 
    207 static void
    208 OsExitLineEditMode (
    209     void);
    210 
    211 
    212 /******************************************************************************
    213  *
    214  * FUNCTION:    OsEnterLineEditMode, OsExitLineEditMode
    215  *
    216  * PARAMETERS:  None
    217  *
    218  * RETURN:      None
    219  *
    220  * DESCRIPTION: Enter/Exit the raw character input mode for the terminal.
    221  *
    222  * Interactive line-editing support for the AML debugger. Used with the
    223  * common/acgetline module.
    224  *
    225  * readline() is not used because of non-portability. It is not available
    226  * on all systems, and if it is, often the package must be manually installed.
    227  *
    228  * Therefore, we use the POSIX tcgetattr/tcsetattr and do the minimal line
    229  * editing that we need in AcpiOsGetLine.
    230  *
    231  * If the POSIX tcgetattr/tcsetattr interfaces are unavailable, these
    232  * calls will also work:
    233  *     For OsEnterLineEditMode: system ("stty cbreak -echo")
    234  *     For OsExitLineEditMode:  system ("stty cooked echo")
    235  *
    236  *****************************************************************************/
    237 
    238 static void
    239 OsEnterLineEditMode (
    240     void)
    241 {
    242     struct termios          LocalTermAttributes;
    243 
    244 
    245     TermAttributesWereSet = 0;
    246 
    247     /* STDIN must be a terminal */
    248 
    249     if (!isatty (STDIN_FILENO))
    250     {
    251         return;
    252     }
    253 
    254     /* Get and keep the original attributes */
    255 
    256     if (tcgetattr (STDIN_FILENO, &OriginalTermAttributes))
    257     {
    258         fprintf (stderr, "Could not get terminal attributes!\n");
    259         return;
    260     }
    261 
    262     /* Set the new attributes to enable raw character input */
    263 
    264     memcpy (&LocalTermAttributes, &OriginalTermAttributes,
    265         sizeof (struct termios));
    266 
    267     LocalTermAttributes.c_lflag &= ~(ICANON | ECHO);
    268     LocalTermAttributes.c_cc[VMIN] = 1;
    269     LocalTermAttributes.c_cc[VTIME] = 0;
    270 
    271     if (tcsetattr (STDIN_FILENO, TCSANOW, &LocalTermAttributes))
    272     {
    273         fprintf (stderr, "Could not set terminal attributes!\n");
    274         return;
    275     }
    276 
    277     TermAttributesWereSet = 1;
    278 }
    279 
    280 
    281 static void
    282 OsExitLineEditMode (
    283     void)
    284 {
    285 
    286     if (!TermAttributesWereSet)
    287     {
    288         return;
    289     }
    290 
    291     /* Set terminal attributes back to the original values */
    292 
    293     if (tcsetattr (STDIN_FILENO, TCSANOW, &OriginalTermAttributes))
    294     {
    295         fprintf (stderr, "Could not restore terminal attributes!\n");
    296     }
    297 }
    298 
    299 
    300 #else
    301 
    302 /* These functions are not needed for other ACPICA utilities */
    303 
    304 #define OsEnterLineEditMode()
    305 #define OsExitLineEditMode()
    306 #endif
    307 
    308 
    309 /******************************************************************************
    310  *
    311  * FUNCTION:    AcpiOsInitialize, AcpiOsTerminate
    312  *
    313  * PARAMETERS:  None
    314  *
    315  * RETURN:      Status
    316  *
    317  * DESCRIPTION: Initialize and terminate this module.
    318  *
    319  *****************************************************************************/
    320 
    321 ACPI_STATUS
    322 AcpiOsInitialize (
    323     void)
    324 {
    325     ACPI_STATUS            Status;
    326 
    327 
    328     AcpiGbl_OutputFile = stdout;
    329 
    330     OsEnterLineEditMode ();
    331 
    332     Status = AcpiOsCreateLock (&AcpiGbl_PrintLock);
    333     if (ACPI_FAILURE (Status))
    334     {
    335         return (Status);
    336     }
    337 
    338     return (AE_OK);
    339 }
    340 
    341 ACPI_STATUS
    342 AcpiOsTerminate (
    343     void)
    344 {
    345 
    346     OsExitLineEditMode ();
    347     return (AE_OK);
    348 }
    349 
    350 
    351 #ifndef ACPI_USE_NATIVE_RSDP_POINTER
    352 /******************************************************************************
    353  *
    354  * FUNCTION:    AcpiOsGetRootPointer
    355  *
    356  * PARAMETERS:  None
    357  *
    358  * RETURN:      RSDP physical address
    359  *
    360  * DESCRIPTION: Gets the ACPI root pointer (RSDP)
    361  *
    362  *****************************************************************************/
    363 
    364 ACPI_PHYSICAL_ADDRESS
    365 AcpiOsGetRootPointer (
    366     void)
    367 {
    368 
    369     return (0);
    370 }
    371 #endif
    372 
    373 
    374 /******************************************************************************
    375  *
    376  * FUNCTION:    AcpiOsPredefinedOverride
    377  *
    378  * PARAMETERS:  InitVal             - Initial value of the predefined object
    379  *              NewVal              - The new value for the object
    380  *
    381  * RETURN:      Status, pointer to value. Null pointer returned if not
    382  *              overriding.
    383  *
    384  * DESCRIPTION: Allow the OS to override predefined names
    385  *
    386  *****************************************************************************/
    387 
    388 ACPI_STATUS
    389 AcpiOsPredefinedOverride (
    390     const ACPI_PREDEFINED_NAMES *InitVal,
    391     ACPI_STRING                 *NewVal)
    392 {
    393 
    394     if (!InitVal || !NewVal)
    395     {
    396         return (AE_BAD_PARAMETER);
    397     }
    398 
    399     *NewVal = NULL;
    400     return (AE_OK);
    401 }
    402 
    403 
    404 /******************************************************************************
    405  *
    406  * FUNCTION:    AcpiOsTableOverride
    407  *
    408  * PARAMETERS:  ExistingTable       - Header of current table (probably
    409  *                                    firmware)
    410  *              NewTable            - Where an entire new table is returned.
    411  *
    412  * RETURN:      Status, pointer to new table. Null pointer returned if no
    413  *              table is available to override
    414  *
    415  * DESCRIPTION: Return a different version of a table if one is available
    416  *
    417  *****************************************************************************/
    418 
    419 ACPI_STATUS
    420 AcpiOsTableOverride (
    421     ACPI_TABLE_HEADER       *ExistingTable,
    422     ACPI_TABLE_HEADER       **NewTable)
    423 {
    424 
    425     if (!ExistingTable || !NewTable)
    426     {
    427         return (AE_BAD_PARAMETER);
    428     }
    429 
    430     *NewTable = NULL;
    431 
    432 #ifdef ACPI_EXEC_APP
    433 
    434     AeTableOverride (ExistingTable, NewTable);
    435     return (AE_OK);
    436 #else
    437 
    438     return (AE_NO_ACPI_TABLES);
    439 #endif
    440 }
    441 
    442 
    443 /******************************************************************************
    444  *
    445  * FUNCTION:    AcpiOsPhysicalTableOverride
    446  *
    447  * PARAMETERS:  ExistingTable       - Header of current table (probably firmware)
    448  *              NewAddress          - Where new table address is returned
    449  *                                    (Physical address)
    450  *              NewTableLength      - Where new table length is returned
    451  *
    452  * RETURN:      Status, address/length of new table. Null pointer returned
    453  *              if no table is available to override.
    454  *
    455  * DESCRIPTION: Returns AE_SUPPORT, function not used in user space.
    456  *
    457  *****************************************************************************/
    458 
    459 ACPI_STATUS
    460 AcpiOsPhysicalTableOverride (
    461     ACPI_TABLE_HEADER       *ExistingTable,
    462     ACPI_PHYSICAL_ADDRESS   *NewAddress,
    463     UINT32                  *NewTableLength)
    464 {
    465 
    466     return (AE_SUPPORT);
    467 }
    468 
    469 
    470 /******************************************************************************
    471  *
    472  * FUNCTION:    AcpiOsEnterSleep
    473  *
    474  * PARAMETERS:  SleepState          - Which sleep state to enter
    475  *              RegaValue           - Register A value
    476  *              RegbValue           - Register B value
    477  *
    478  * RETURN:      Status
    479  *
    480  * DESCRIPTION: A hook before writing sleep registers to enter the sleep
    481  *              state. Return AE_CTRL_TERMINATE to skip further sleep register
    482  *              writes.
    483  *
    484  *****************************************************************************/
    485 
    486 ACPI_STATUS
    487 AcpiOsEnterSleep (
    488     UINT8                   SleepState,
    489     UINT32                  RegaValue,
    490     UINT32                  RegbValue)
    491 {
    492 
    493     return (AE_OK);
    494 }
    495 
    496 
    497 /******************************************************************************
    498  *
    499  * FUNCTION:    AcpiOsRedirectOutput
    500  *
    501  * PARAMETERS:  Destination         - An open file handle/pointer
    502  *
    503  * RETURN:      None
    504  *
    505  * DESCRIPTION: Causes redirect of AcpiOsPrintf and AcpiOsVprintf
    506  *
    507  *****************************************************************************/
    508 
    509 void
    510 AcpiOsRedirectOutput (
    511     void                    *Destination)
    512 {
    513 
    514     AcpiGbl_OutputFile = Destination;
    515 }
    516 
    517 
    518 /******************************************************************************
    519  *
    520  * FUNCTION:    AcpiOsPrintf
    521  *
    522  * PARAMETERS:  fmt, ...            - Standard printf format
    523  *
    524  * RETURN:      None
    525  *
    526  * DESCRIPTION: Formatted output. Note: very similar to AcpiOsVprintf
    527  *              (performance), changes should be tracked in both functions.
    528  *
    529  *****************************************************************************/
    530 
    531 void ACPI_INTERNAL_VAR_XFACE
    532 AcpiOsPrintf (
    533     const char              *Fmt,
    534     ...)
    535 {
    536     va_list                 Args;
    537     UINT8                   Flags;
    538 
    539 
    540     Flags = AcpiGbl_DbOutputFlags;
    541     if (Flags & ACPI_DB_REDIRECTABLE_OUTPUT)
    542     {
    543         /* Output is directable to either a file (if open) or the console */
    544 
    545         if (AcpiGbl_DebugFile)
    546         {
    547             /* Output file is open, send the output there */
    548 
    549             va_start (Args, Fmt);
    550             vfprintf (AcpiGbl_DebugFile, Fmt, Args);
    551             va_end (Args);
    552         }
    553         else
    554         {
    555             /* No redirection, send output to console (once only!) */
    556 
    557             Flags |= ACPI_DB_CONSOLE_OUTPUT;
    558         }
    559     }
    560 
    561     if (Flags & ACPI_DB_CONSOLE_OUTPUT)
    562     {
    563         va_start (Args, Fmt);
    564         vfprintf (AcpiGbl_OutputFile, Fmt, Args);
    565         va_end (Args);
    566     }
    567 }
    568 
    569 
    570 /******************************************************************************
    571  *
    572  * FUNCTION:    AcpiOsVprintf
    573  *
    574  * PARAMETERS:  fmt                 - Standard printf format
    575  *              args                - Argument list
    576  *
    577  * RETURN:      None
    578  *
    579  * DESCRIPTION: Formatted output with argument list pointer. Note: very
    580  *              similar to AcpiOsPrintf, changes should be tracked in both
    581  *              functions.
    582  *
    583  *****************************************************************************/
    584 
    585 void
    586 AcpiOsVprintf (
    587     const char              *Fmt,
    588     va_list                 Args)
    589 {
    590     UINT8                   Flags;
    591     char                    Buffer[ACPI_VPRINTF_BUFFER_SIZE];
    592 
    593 
    594     /*
    595      * We build the output string in a local buffer because we may be
    596      * outputting the buffer twice. Using vfprintf is problematic because
    597      * some implementations modify the args pointer/structure during
    598      * execution. Thus, we use the local buffer for portability.
    599      *
    600      * Note: Since this module is intended for use by the various ACPICA
    601      * utilities/applications, we can safely declare the buffer on the stack.
    602      * Also, This function is used for relatively small error messages only.
    603      */
    604     vsnprintf (Buffer, ACPI_VPRINTF_BUFFER_SIZE, Fmt, Args);
    605 
    606     Flags = AcpiGbl_DbOutputFlags;
    607     if (Flags & ACPI_DB_REDIRECTABLE_OUTPUT)
    608     {
    609         /* Output is directable to either a file (if open) or the console */
    610 
    611         if (AcpiGbl_DebugFile)
    612         {
    613             /* Output file is open, send the output there */
    614 
    615             fputs (Buffer, AcpiGbl_DebugFile);
    616         }
    617         else
    618         {
    619             /* No redirection, send output to console (once only!) */
    620 
    621             Flags |= ACPI_DB_CONSOLE_OUTPUT;
    622         }
    623     }
    624 
    625     if (Flags & ACPI_DB_CONSOLE_OUTPUT)
    626     {
    627         fputs (Buffer, AcpiGbl_OutputFile);
    628     }
    629 }
    630 
    631 
    632 #ifndef ACPI_EXEC_APP
    633 /******************************************************************************
    634  *
    635  * FUNCTION:    AcpiOsGetLine
    636  *
    637  * PARAMETERS:  Buffer              - Where to return the command line
    638  *              BufferLength        - Maximum length of Buffer
    639  *              BytesRead           - Where the actual byte count is returned
    640  *
    641  * RETURN:      Status and actual bytes read
    642  *
    643  * DESCRIPTION: Get the next input line from the terminal. NOTE: For the
    644  *              AcpiExec utility, we use the acgetline module instead to
    645  *              provide line-editing and history support.
    646  *
    647  *****************************************************************************/
    648 
    649 ACPI_STATUS
    650 AcpiOsGetLine (
    651     char                    *Buffer,
    652     UINT32                  BufferLength,
    653     UINT32                  *BytesRead)
    654 {
    655     int                     InputChar;
    656     UINT32                  EndOfLine;
    657 
    658 
    659     /* Standard AcpiOsGetLine for all utilities except AcpiExec */
    660 
    661     for (EndOfLine = 0; ; EndOfLine++)
    662     {
    663         if (EndOfLine >= BufferLength)
    664         {
    665             return (AE_BUFFER_OVERFLOW);
    666         }
    667 
    668         if ((InputChar = getchar ()) == EOF)
    669         {
    670             return (AE_ERROR);
    671         }
    672 
    673         if (!InputChar || InputChar == _ASCII_NEWLINE)
    674         {
    675             break;
    676         }
    677 
    678         Buffer[EndOfLine] = (char) InputChar;
    679     }
    680 
    681     /* Null terminate the buffer */
    682 
    683     Buffer[EndOfLine] = 0;
    684 
    685     /* Return the number of bytes in the string */
    686 
    687     if (BytesRead)
    688     {
    689         *BytesRead = EndOfLine;
    690     }
    691 
    692     return (AE_OK);
    693 }
    694 #endif
    695 
    696 
    697 #ifndef ACPI_USE_NATIVE_MEMORY_MAPPING
    698 /******************************************************************************
    699  *
    700  * FUNCTION:    AcpiOsMapMemory
    701  *
    702  * PARAMETERS:  where               - Physical address of memory to be mapped
    703  *              length              - How much memory to map
    704  *
    705  * RETURN:      Pointer to mapped memory. Null on error.
    706  *
    707  * DESCRIPTION: Map physical memory into caller's address space
    708  *
    709  *****************************************************************************/
    710 
    711 void *
    712 AcpiOsMapMemory (
    713     ACPI_PHYSICAL_ADDRESS   where,
    714     ACPI_SIZE               length)
    715 {
    716 
    717     return (ACPI_TO_POINTER ((ACPI_SIZE) where));
    718 }
    719 
    720 
    721 /******************************************************************************
    722  *
    723  * FUNCTION:    AcpiOsUnmapMemory
    724  *
    725  * PARAMETERS:  where               - Logical address of memory to be unmapped
    726  *              length              - How much memory to unmap
    727  *
    728  * RETURN:      None.
    729  *
    730  * DESCRIPTION: Delete a previously created mapping. Where and Length must
    731  *              correspond to a previous mapping exactly.
    732  *
    733  *****************************************************************************/
    734 
    735 void
    736 AcpiOsUnmapMemory (
    737     void                    *where,
    738     ACPI_SIZE               length)
    739 {
    740 
    741     return;
    742 }
    743 #endif
    744 
    745 
    746 /******************************************************************************
    747  *
    748  * FUNCTION:    AcpiOsAllocate
    749  *
    750  * PARAMETERS:  Size                - Amount to allocate, in bytes
    751  *
    752  * RETURN:      Pointer to the new allocation. Null on error.
    753  *
    754  * DESCRIPTION: Allocate memory. Algorithm is dependent on the OS.
    755  *
    756  *****************************************************************************/
    757 
    758 void *
    759 AcpiOsAllocate (
    760     ACPI_SIZE               size)
    761 {
    762     void                    *Mem;
    763 
    764 
    765     Mem = (void *) malloc ((size_t) size);
    766     return (Mem);
    767 }
    768 
    769 
    770 #ifdef USE_NATIVE_ALLOCATE_ZEROED
    771 /******************************************************************************
    772  *
    773  * FUNCTION:    AcpiOsAllocateZeroed
    774  *
    775  * PARAMETERS:  Size                - Amount to allocate, in bytes
    776  *
    777  * RETURN:      Pointer to the new allocation. Null on error.
    778  *
    779  * DESCRIPTION: Allocate and zero memory. Algorithm is dependent on the OS.
    780  *
    781  *****************************************************************************/
    782 
    783 void *
    784 AcpiOsAllocateZeroed (
    785     ACPI_SIZE               size)
    786 {
    787     void                    *Mem;
    788 
    789 
    790     Mem = (void *) calloc (1, (size_t) size);
    791     return (Mem);
    792 }
    793 #endif
    794 
    795 
    796 /******************************************************************************
    797  *
    798  * FUNCTION:    AcpiOsFree
    799  *
    800  * PARAMETERS:  mem                 - Pointer to previously allocated memory
    801  *
    802  * RETURN:      None.
    803  *
    804  * DESCRIPTION: Free memory allocated via AcpiOsAllocate
    805  *
    806  *****************************************************************************/
    807 
    808 void
    809 AcpiOsFree (
    810     void                    *mem)
    811 {
    812 
    813     free (mem);
    814 }
    815 
    816 
    817 #ifdef ACPI_SINGLE_THREADED
    818 /******************************************************************************
    819  *
    820  * FUNCTION:    Semaphore stub functions
    821  *
    822  * DESCRIPTION: Stub functions used for single-thread applications that do
    823  *              not require semaphore synchronization. Full implementations
    824  *              of these functions appear after the stubs.
    825  *
    826  *****************************************************************************/
    827 
    828 ACPI_STATUS
    829 AcpiOsCreateSemaphore (
    830     UINT32              MaxUnits,
    831     UINT32              InitialUnits,
    832     ACPI_HANDLE         *OutHandle)
    833 {
    834     *OutHandle = (ACPI_HANDLE) 1;
    835     return (AE_OK);
    836 }
    837 
    838 ACPI_STATUS
    839 AcpiOsDeleteSemaphore (
    840     ACPI_HANDLE         Handle)
    841 {
    842     return (AE_OK);
    843 }
    844 
    845 ACPI_STATUS
    846 AcpiOsWaitSemaphore (
    847     ACPI_HANDLE         Handle,
    848     UINT32              Units,
    849     UINT16              Timeout)
    850 {
    851     return (AE_OK);
    852 }
    853 
    854 ACPI_STATUS
    855 AcpiOsSignalSemaphore (
    856     ACPI_HANDLE         Handle,
    857     UINT32              Units)
    858 {
    859     return (AE_OK);
    860 }
    861 
    862 #else
    863 /******************************************************************************
    864  *
    865  * FUNCTION:    AcpiOsCreateSemaphore
    866  *
    867  * PARAMETERS:  InitialUnits        - Units to be assigned to the new semaphore
    868  *              OutHandle           - Where a handle will be returned
    869  *
    870  * RETURN:      Status
    871  *
    872  * DESCRIPTION: Create an OS semaphore
    873  *
    874  *****************************************************************************/
    875 
    876 ACPI_STATUS
    877 AcpiOsCreateSemaphore (
    878     UINT32              MaxUnits,
    879     UINT32              InitialUnits,
    880     ACPI_HANDLE         *OutHandle)
    881 {
    882     sem_t               *Sem;
    883 
    884 
    885     if (!OutHandle)
    886     {
    887         return (AE_BAD_PARAMETER);
    888     }
    889 
    890 #ifdef __APPLE__
    891     {
    892         static int      SemaphoreCount = 0;
    893         char            SemaphoreName[32];
    894 
    895         snprintf (SemaphoreName, sizeof (SemaphoreName), "acpi_sem_%d",
    896             SemaphoreCount++);
    897         printf ("%s\n", SemaphoreName);
    898         Sem = sem_open (SemaphoreName, O_EXCL|O_CREAT, 0755, InitialUnits);
    899         if (!Sem)
    900         {
    901             return (AE_NO_MEMORY);
    902         }
    903         sem_unlink (SemaphoreName); /* This just deletes the name */
    904     }
    905 
    906 #else
    907     Sem = AcpiOsAllocate (sizeof (sem_t));
    908     if (!Sem)
    909     {
    910         return (AE_NO_MEMORY);
    911     }
    912 
    913     if (sem_init (Sem, 0, InitialUnits) == -1)
    914     {
    915         AcpiOsFree (Sem);
    916         return (AE_BAD_PARAMETER);
    917     }
    918 #endif
    919 
    920     *OutHandle = (ACPI_HANDLE) Sem;
    921     return (AE_OK);
    922 }
    923 
    924 
    925 /******************************************************************************
    926  *
    927  * FUNCTION:    AcpiOsDeleteSemaphore
    928  *
    929  * PARAMETERS:  Handle              - Handle returned by AcpiOsCreateSemaphore
    930  *
    931  * RETURN:      Status
    932  *
    933  * DESCRIPTION: Delete an OS semaphore
    934  *
    935  *****************************************************************************/
    936 
    937 ACPI_STATUS
    938 AcpiOsDeleteSemaphore (
    939     ACPI_HANDLE         Handle)
    940 {
    941     sem_t               *Sem = (sem_t *) Handle;
    942 
    943 
    944     if (!Sem)
    945     {
    946         return (AE_BAD_PARAMETER);
    947     }
    948 
    949 #ifdef __APPLE__
    950     if (sem_close (Sem) == -1)
    951     {
    952         return (AE_BAD_PARAMETER);
    953     }
    954 #else
    955     if (sem_destroy (Sem) == -1)
    956     {
    957         return (AE_BAD_PARAMETER);
    958     }
    959 #endif
    960 
    961     return (AE_OK);
    962 }
    963 
    964 
    965 /******************************************************************************
    966  *
    967  * FUNCTION:    AcpiOsWaitSemaphore
    968  *
    969  * PARAMETERS:  Handle              - Handle returned by AcpiOsCreateSemaphore
    970  *              Units               - How many units to wait for
    971  *              MsecTimeout         - How long to wait (milliseconds)
    972  *
    973  * RETURN:      Status
    974  *
    975  * DESCRIPTION: Wait for units
    976  *
    977  *****************************************************************************/
    978 
    979 ACPI_STATUS
    980 AcpiOsWaitSemaphore (
    981     ACPI_HANDLE         Handle,
    982     UINT32              Units,
    983     UINT16              MsecTimeout)
    984 {
    985     ACPI_STATUS         Status = AE_OK;
    986     sem_t               *Sem = (sem_t *) Handle;
    987     int                 RetVal;
    988 #ifndef ACPI_USE_ALTERNATE_TIMEOUT
    989     struct timespec     Time;
    990 #endif
    991 
    992 
    993     if (!Sem)
    994     {
    995         return (AE_BAD_PARAMETER);
    996     }
    997 
    998     switch (MsecTimeout)
    999     {
   1000     /*
   1001      * No Wait:
   1002      * --------
   1003      * A zero timeout value indicates that we shouldn't wait - just
   1004      * acquire the semaphore if available otherwise return AE_TIME
   1005      * (a.k.a. 'would block').
   1006      */
   1007     case 0:
   1008 
   1009         if (sem_trywait(Sem) == -1)
   1010         {
   1011             Status = (AE_TIME);
   1012         }
   1013         break;
   1014 
   1015     /* Wait Indefinitely */
   1016 
   1017     case ACPI_WAIT_FOREVER:
   1018 
   1019         while (((RetVal = sem_wait (Sem)) == -1) && (errno == EINTR))
   1020         {
   1021             continue;   /* Restart if interrupted */
   1022         }
   1023         if (RetVal != 0)
   1024         {
   1025             Status = (AE_TIME);
   1026         }
   1027         break;
   1028 
   1029 
   1030     /* Wait with MsecTimeout */
   1031 
   1032     default:
   1033 
   1034 #ifdef ACPI_USE_ALTERNATE_TIMEOUT
   1035         /*
   1036          * Alternate timeout mechanism for environments where
   1037          * sem_timedwait is not available or does not work properly.
   1038          */
   1039         while (MsecTimeout)
   1040         {
   1041             if (sem_trywait (Sem) == 0)
   1042             {
   1043                 /* Got the semaphore */
   1044                 return (AE_OK);
   1045             }
   1046 
   1047             if (MsecTimeout >= 10)
   1048             {
   1049                 MsecTimeout -= 10;
   1050                 usleep (10 * ACPI_USEC_PER_MSEC); /* ten milliseconds */
   1051             }
   1052             else
   1053             {
   1054                 MsecTimeout--;
   1055                 usleep (ACPI_USEC_PER_MSEC); /* one millisecond */
   1056             }
   1057         }
   1058         Status = (AE_TIME);
   1059 #else
   1060         /*
   1061          * The interface to sem_timedwait is an absolute time, so we need to
   1062          * get the current time, then add in the millisecond Timeout value.
   1063          */
   1064         if (clock_gettime (CLOCK_REALTIME, &Time) == -1)
   1065         {
   1066             perror ("clock_gettime");
   1067             return (AE_TIME);
   1068         }
   1069 
   1070         Time.tv_sec += (MsecTimeout / ACPI_MSEC_PER_SEC);
   1071         Time.tv_nsec += ((MsecTimeout % ACPI_MSEC_PER_SEC) * ACPI_NSEC_PER_MSEC);
   1072 
   1073         /* Handle nanosecond overflow (field must be less than one second) */
   1074 
   1075         if (Time.tv_nsec >= ACPI_NSEC_PER_SEC)
   1076         {
   1077             Time.tv_sec += (Time.tv_nsec / ACPI_NSEC_PER_SEC);
   1078             Time.tv_nsec = (Time.tv_nsec % ACPI_NSEC_PER_SEC);
   1079         }
   1080 
   1081         while (((RetVal = sem_timedwait (Sem, &Time)) == -1) && (errno == EINTR))
   1082         {
   1083             continue;   /* Restart if interrupted */
   1084 
   1085         }
   1086 
   1087         if (RetVal != 0)
   1088         {
   1089             if (errno != ETIMEDOUT)
   1090             {
   1091                 perror ("sem_timedwait");
   1092             }
   1093             Status = (AE_TIME);
   1094         }
   1095 #endif
   1096         break;
   1097     }
   1098 
   1099     return (Status);
   1100 }
   1101 
   1102 
   1103 /******************************************************************************
   1104  *
   1105  * FUNCTION:    AcpiOsSignalSemaphore
   1106  *
   1107  * PARAMETERS:  Handle              - Handle returned by AcpiOsCreateSemaphore
   1108  *              Units               - Number of units to send
   1109  *
   1110  * RETURN:      Status
   1111  *
   1112  * DESCRIPTION: Send units
   1113  *
   1114  *****************************************************************************/
   1115 
   1116 ACPI_STATUS
   1117 AcpiOsSignalSemaphore (
   1118     ACPI_HANDLE         Handle,
   1119     UINT32              Units)
   1120 {
   1121     sem_t               *Sem = (sem_t *)Handle;
   1122 
   1123 
   1124     if (!Sem)
   1125     {
   1126         return (AE_BAD_PARAMETER);
   1127     }
   1128 
   1129     if (sem_post (Sem) == -1)
   1130     {
   1131         return (AE_LIMIT);
   1132     }
   1133 
   1134     return (AE_OK);
   1135 }
   1136 
   1137 #endif /* ACPI_SINGLE_THREADED */
   1138 
   1139 
   1140 /******************************************************************************
   1141  *
   1142  * FUNCTION:    Spinlock interfaces
   1143  *
   1144  * DESCRIPTION: Map these interfaces to semaphore interfaces
   1145  *
   1146  *****************************************************************************/
   1147 
   1148 ACPI_STATUS
   1149 AcpiOsCreateLock (
   1150     ACPI_SPINLOCK           *OutHandle)
   1151 {
   1152 
   1153     return (AcpiOsCreateSemaphore (1, 1, OutHandle));
   1154 }
   1155 
   1156 
   1157 void
   1158 AcpiOsDeleteLock (
   1159     ACPI_SPINLOCK           Handle)
   1160 {
   1161     AcpiOsDeleteSemaphore (Handle);
   1162 }
   1163 
   1164 
   1165 ACPI_CPU_FLAGS
   1166 AcpiOsAcquireLock (
   1167     ACPI_HANDLE             Handle)
   1168 {
   1169     AcpiOsWaitSemaphore (Handle, 1, 0xFFFF);
   1170     return (0);
   1171 }
   1172 
   1173 
   1174 void
   1175 AcpiOsReleaseLock (
   1176     ACPI_SPINLOCK           Handle,
   1177     ACPI_CPU_FLAGS          Flags)
   1178 {
   1179     AcpiOsSignalSemaphore (Handle, 1);
   1180 }
   1181 
   1182 
   1183 /******************************************************************************
   1184  *
   1185  * FUNCTION:    AcpiOsInstallInterruptHandler
   1186  *
   1187  * PARAMETERS:  InterruptNumber     - Level handler should respond to.
   1188  *              Isr                 - Address of the ACPI interrupt handler
   1189  *              ExceptPtr           - Where status is returned
   1190  *
   1191  * RETURN:      Handle to the newly installed handler.
   1192  *
   1193  * DESCRIPTION: Install an interrupt handler. Used to install the ACPI
   1194  *              OS-independent handler.
   1195  *
   1196  *****************************************************************************/
   1197 
   1198 UINT32
   1199 AcpiOsInstallInterruptHandler (
   1200     UINT32                  InterruptNumber,
   1201     ACPI_OSD_HANDLER        ServiceRoutine,
   1202     void                    *Context)
   1203 {
   1204 
   1205     return (AE_OK);
   1206 }
   1207 
   1208 
   1209 /******************************************************************************
   1210  *
   1211  * FUNCTION:    AcpiOsRemoveInterruptHandler
   1212  *
   1213  * PARAMETERS:  Handle              - Returned when handler was installed
   1214  *
   1215  * RETURN:      Status
   1216  *
   1217  * DESCRIPTION: Uninstalls an interrupt handler.
   1218  *
   1219  *****************************************************************************/
   1220 
   1221 ACPI_STATUS
   1222 AcpiOsRemoveInterruptHandler (
   1223     UINT32                  InterruptNumber,
   1224     ACPI_OSD_HANDLER        ServiceRoutine)
   1225 {
   1226 
   1227     return (AE_OK);
   1228 }
   1229 
   1230 
   1231 /******************************************************************************
   1232  *
   1233  * FUNCTION:    AcpiOsStall
   1234  *
   1235  * PARAMETERS:  microseconds        - Time to sleep
   1236  *
   1237  * RETURN:      Blocks until sleep is completed.
   1238  *
   1239  * DESCRIPTION: Sleep at microsecond granularity
   1240  *
   1241  *****************************************************************************/
   1242 
   1243 void
   1244 AcpiOsStall (
   1245     UINT32                  microseconds)
   1246 {
   1247 
   1248     if (microseconds)
   1249     {
   1250         usleep (microseconds);
   1251     }
   1252 }
   1253 
   1254 
   1255 /******************************************************************************
   1256  *
   1257  * FUNCTION:    AcpiOsSleep
   1258  *
   1259  * PARAMETERS:  milliseconds        - Time to sleep
   1260  *
   1261  * RETURN:      Blocks until sleep is completed.
   1262  *
   1263  * DESCRIPTION: Sleep at millisecond granularity
   1264  *
   1265  *****************************************************************************/
   1266 
   1267 void
   1268 AcpiOsSleep (
   1269     UINT64                  milliseconds)
   1270 {
   1271 
   1272     /* Sleep for whole seconds */
   1273 
   1274     sleep (milliseconds / ACPI_MSEC_PER_SEC);
   1275 
   1276     /*
   1277      * Sleep for remaining microseconds.
   1278      * Arg to usleep() is in usecs and must be less than 1,000,000 (1 second).
   1279      */
   1280     usleep ((milliseconds % ACPI_MSEC_PER_SEC) * ACPI_USEC_PER_MSEC);
   1281 }
   1282 
   1283 
   1284 /******************************************************************************
   1285  *
   1286  * FUNCTION:    AcpiOsGetTimer
   1287  *
   1288  * PARAMETERS:  None
   1289  *
   1290  * RETURN:      Current time in 100 nanosecond units
   1291  *
   1292  * DESCRIPTION: Get the current system time
   1293  *
   1294  *****************************************************************************/
   1295 
   1296 UINT64
   1297 AcpiOsGetTimer (
   1298     void)
   1299 {
   1300     struct timeval          time;
   1301 
   1302 
   1303     /* This timer has sufficient resolution for user-space application code */
   1304 
   1305     gettimeofday (&time, NULL);
   1306 
   1307     /* (Seconds * 10^7 = 100ns(10^-7)) + (Microseconds(10^-6) * 10^1 = 100ns) */
   1308 
   1309     return (((UINT64) time.tv_sec * ACPI_100NSEC_PER_SEC) +
   1310             ((UINT64) time.tv_usec * ACPI_100NSEC_PER_USEC));
   1311 }
   1312 
   1313 
   1314 /******************************************************************************
   1315  *
   1316  * FUNCTION:    AcpiOsReadPciConfiguration
   1317  *
   1318  * PARAMETERS:  PciId               - Seg/Bus/Dev
   1319  *              PciRegister         - Device Register
   1320  *              Value               - Buffer where value is placed
   1321  *              Width               - Number of bits
   1322  *
   1323  * RETURN:      Status
   1324  *
   1325  * DESCRIPTION: Read data from PCI configuration space
   1326  *
   1327  *****************************************************************************/
   1328 
   1329 ACPI_STATUS
   1330 AcpiOsReadPciConfiguration (
   1331     ACPI_PCI_ID             *PciId,
   1332     UINT32                  PciRegister,
   1333     UINT64                  *Value,
   1334     UINT32                  Width)
   1335 {
   1336 
   1337     *Value = 0;
   1338     return (AE_OK);
   1339 }
   1340 
   1341 
   1342 /******************************************************************************
   1343  *
   1344  * FUNCTION:    AcpiOsWritePciConfiguration
   1345  *
   1346  * PARAMETERS:  PciId               - Seg/Bus/Dev
   1347  *              PciRegister         - Device Register
   1348  *              Value               - Value to be written
   1349  *              Width               - Number of bits
   1350  *
   1351  * RETURN:      Status.
   1352  *
   1353  * DESCRIPTION: Write data to PCI configuration space
   1354  *
   1355  *****************************************************************************/
   1356 
   1357 ACPI_STATUS
   1358 AcpiOsWritePciConfiguration (
   1359     ACPI_PCI_ID             *PciId,
   1360     UINT32                  PciRegister,
   1361     UINT64                  Value,
   1362     UINT32                  Width)
   1363 {
   1364 
   1365     return (AE_OK);
   1366 }
   1367 
   1368 
   1369 /******************************************************************************
   1370  *
   1371  * FUNCTION:    AcpiOsReadPort
   1372  *
   1373  * PARAMETERS:  Address             - Address of I/O port/register to read
   1374  *              Value               - Where value is placed
   1375  *              Width               - Number of bits
   1376  *
   1377  * RETURN:      Value read from port
   1378  *
   1379  * DESCRIPTION: Read data from an I/O port or register
   1380  *
   1381  *****************************************************************************/
   1382 
   1383 ACPI_STATUS
   1384 AcpiOsReadPort (
   1385     ACPI_IO_ADDRESS         Address,
   1386     UINT32                  *Value,
   1387     UINT32                  Width)
   1388 {
   1389 
   1390     switch (Width)
   1391     {
   1392     case 8:
   1393 
   1394         *Value = 0xFF;
   1395         break;
   1396 
   1397     case 16:
   1398 
   1399         *Value = 0xFFFF;
   1400         break;
   1401 
   1402     case 32:
   1403 
   1404         *Value = 0xFFFFFFFF;
   1405         break;
   1406 
   1407     default:
   1408 
   1409         return (AE_BAD_PARAMETER);
   1410     }
   1411 
   1412     return (AE_OK);
   1413 }
   1414 
   1415 
   1416 /******************************************************************************
   1417  *
   1418  * FUNCTION:    AcpiOsWritePort
   1419  *
   1420  * PARAMETERS:  Address             - Address of I/O port/register to write
   1421  *              Value               - Value to write
   1422  *              Width               - Number of bits
   1423  *
   1424  * RETURN:      None
   1425  *
   1426  * DESCRIPTION: Write data to an I/O port or register
   1427  *
   1428  *****************************************************************************/
   1429 
   1430 ACPI_STATUS
   1431 AcpiOsWritePort (
   1432     ACPI_IO_ADDRESS         Address,
   1433     UINT32                  Value,
   1434     UINT32                  Width)
   1435 {
   1436 
   1437     return (AE_OK);
   1438 }
   1439 
   1440 
   1441 /******************************************************************************
   1442  *
   1443  * FUNCTION:    AcpiOsReadMemory
   1444  *
   1445  * PARAMETERS:  Address             - Physical Memory Address to read
   1446  *              Value               - Where value is placed
   1447  *              Width               - Number of bits (8,16,32, or 64)
   1448  *
   1449  * RETURN:      Value read from physical memory address. Always returned
   1450  *              as a 64-bit integer, regardless of the read width.
   1451  *
   1452  * DESCRIPTION: Read data from a physical memory address
   1453  *
   1454  *****************************************************************************/
   1455 
   1456 ACPI_STATUS
   1457 AcpiOsReadMemory (
   1458     ACPI_PHYSICAL_ADDRESS   Address,
   1459     UINT64                  *Value,
   1460     UINT32                  Width)
   1461 {
   1462 
   1463     switch (Width)
   1464     {
   1465     case 8:
   1466     case 16:
   1467     case 32:
   1468     case 64:
   1469 
   1470         *Value = 0;
   1471         break;
   1472 
   1473     default:
   1474 
   1475         return (AE_BAD_PARAMETER);
   1476     }
   1477     return (AE_OK);
   1478 }
   1479 
   1480 
   1481 /******************************************************************************
   1482  *
   1483  * FUNCTION:    AcpiOsWriteMemory
   1484  *
   1485  * PARAMETERS:  Address             - Physical Memory Address to write
   1486  *              Value               - Value to write
   1487  *              Width               - Number of bits (8,16,32, or 64)
   1488  *
   1489  * RETURN:      None
   1490  *
   1491  * DESCRIPTION: Write data to a physical memory address
   1492  *
   1493  *****************************************************************************/
   1494 
   1495 ACPI_STATUS
   1496 AcpiOsWriteMemory (
   1497     ACPI_PHYSICAL_ADDRESS   Address,
   1498     UINT64                  Value,
   1499     UINT32                  Width)
   1500 {
   1501 
   1502     return (AE_OK);
   1503 }
   1504 
   1505 
   1506 /******************************************************************************
   1507  *
   1508  * FUNCTION:    AcpiOsReadable
   1509  *
   1510  * PARAMETERS:  Pointer             - Area to be verified
   1511  *              Length              - Size of area
   1512  *
   1513  * RETURN:      TRUE if readable for entire length
   1514  *
   1515  * DESCRIPTION: Verify that a pointer is valid for reading
   1516  *
   1517  *****************************************************************************/
   1518 
   1519 BOOLEAN
   1520 AcpiOsReadable (
   1521     void                    *Pointer,
   1522     ACPI_SIZE               Length)
   1523 {
   1524 
   1525     return (TRUE);
   1526 }
   1527 
   1528 
   1529 /******************************************************************************
   1530  *
   1531  * FUNCTION:    AcpiOsWritable
   1532  *
   1533  * PARAMETERS:  Pointer             - Area to be verified
   1534  *              Length              - Size of area
   1535  *
   1536  * RETURN:      TRUE if writable for entire length
   1537  *
   1538  * DESCRIPTION: Verify that a pointer is valid for writing
   1539  *
   1540  *****************************************************************************/
   1541 
   1542 BOOLEAN
   1543 AcpiOsWritable (
   1544     void                    *Pointer,
   1545     ACPI_SIZE               Length)
   1546 {
   1547 
   1548     return (TRUE);
   1549 }
   1550 
   1551 
   1552 /******************************************************************************
   1553  *
   1554  * FUNCTION:    AcpiOsSignal
   1555  *
   1556  * PARAMETERS:  Function            - ACPI A signal function code
   1557  *              Info                - Pointer to function-dependent structure
   1558  *
   1559  * RETURN:      Status
   1560  *
   1561  * DESCRIPTION: Miscellaneous functions. Example implementation only.
   1562  *
   1563  *****************************************************************************/
   1564 
   1565 ACPI_STATUS
   1566 AcpiOsSignal (
   1567     UINT32                  Function,
   1568     void                    *Info)
   1569 {
   1570 
   1571     switch (Function)
   1572     {
   1573     case ACPI_SIGNAL_FATAL:
   1574 
   1575         break;
   1576 
   1577     case ACPI_SIGNAL_BREAKPOINT:
   1578 
   1579         break;
   1580 
   1581     default:
   1582 
   1583         break;
   1584     }
   1585 
   1586     return (AE_OK);
   1587 }
   1588 
   1589 /* Optional multi-thread support */
   1590 
   1591 #ifndef ACPI_SINGLE_THREADED
   1592 /******************************************************************************
   1593  *
   1594  * FUNCTION:    AcpiOsGetThreadId
   1595  *
   1596  * PARAMETERS:  None
   1597  *
   1598  * RETURN:      Id of the running thread
   1599  *
   1600  * DESCRIPTION: Get the ID of the current (running) thread
   1601  *
   1602  *****************************************************************************/
   1603 
   1604 ACPI_THREAD_ID
   1605 AcpiOsGetThreadId (
   1606     void)
   1607 {
   1608     pthread_t               thread;
   1609 
   1610 
   1611     thread = pthread_self();
   1612     return (ACPI_CAST_PTHREAD_T (thread));
   1613 }
   1614 
   1615 
   1616 /******************************************************************************
   1617  *
   1618  * FUNCTION:    AcpiOsExecute
   1619  *
   1620  * PARAMETERS:  Type                - Type of execution
   1621  *              Function            - Address of the function to execute
   1622  *              Context             - Passed as a parameter to the function
   1623  *
   1624  * RETURN:      Status.
   1625  *
   1626  * DESCRIPTION: Execute a new thread
   1627  *
   1628  *****************************************************************************/
   1629 
   1630 ACPI_STATUS
   1631 AcpiOsExecute (
   1632     ACPI_EXECUTE_TYPE       Type,
   1633     ACPI_OSD_EXEC_CALLBACK  Function,
   1634     void                    *Context)
   1635 {
   1636     pthread_t               thread;
   1637     int                     ret;
   1638 
   1639 
   1640     ret = pthread_create (&thread, NULL, (PTHREAD_CALLBACK) Function, Context);
   1641     if (ret)
   1642     {
   1643         AcpiOsPrintf("Create thread failed");
   1644     }
   1645     return (0);
   1646 }
   1647 
   1648 #else /* ACPI_SINGLE_THREADED */
   1649 ACPI_THREAD_ID
   1650 AcpiOsGetThreadId (
   1651     void)
   1652 {
   1653     return (1);
   1654 }
   1655 
   1656 ACPI_STATUS
   1657 AcpiOsExecute (
   1658     ACPI_EXECUTE_TYPE       Type,
   1659     ACPI_OSD_EXEC_CALLBACK  Function,
   1660     void                    *Context)
   1661 {
   1662 
   1663     Function (Context);
   1664 
   1665     return (AE_OK);
   1666 }
   1667 
   1668 #endif /* ACPI_SINGLE_THREADED */
   1669 
   1670 
   1671 /******************************************************************************
   1672  *
   1673  * FUNCTION:    AcpiOsWaitEventsComplete
   1674  *
   1675  * PARAMETERS:  None
   1676  *
   1677  * RETURN:      None
   1678  *
   1679  * DESCRIPTION: Wait for all asynchronous events to complete. This
   1680  *              implementation does nothing.
   1681  *
   1682  *****************************************************************************/
   1683 
   1684 void
   1685 AcpiOsWaitEventsComplete (
   1686     void)
   1687 {
   1688     return;
   1689 }
   1690