linux/tools/power/acpi/os_specific/service_layers/osunixxf.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Module Name: osunixxf - UNIX OSL interfaces
   4 *
   5 *****************************************************************************/
   6
   7/*
   8 * Copyright (C) 2000 - 2016, Intel Corp.
   9 * All rights reserved.
  10 *
  11 * Redistribution and use in source and binary forms, with or without
  12 * modification, are permitted provided that the following conditions
  13 * are met:
  14 * 1. Redistributions of source code must retain the above copyright
  15 *    notice, this list of conditions, and the following disclaimer,
  16 *    without modification.
  17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  18 *    substantially similar to the "NO WARRANTY" disclaimer below
  19 *    ("Disclaimer") and any redistribution must be conditioned upon
  20 *    including a substantially similar Disclaimer requirement for further
  21 *    binary redistribution.
  22 * 3. Neither the names of the above-listed copyright holders nor the names
  23 *    of any contributors may be used to endorse or promote products derived
  24 *    from this software without specific prior written permission.
  25 *
  26 * Alternatively, this software may be distributed under the terms of the
  27 * GNU General Public License ("GPL") version 2 as published by the Free
  28 * Software Foundation.
  29 *
  30 * NO WARRANTY
  31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  41 * POSSIBILITY OF SUCH DAMAGES.
  42 */
  43
  44/*
  45 * These interfaces are required in order to compile the ASL compiler and the
  46 * various ACPICA tools under Linux or other Unix-like system.
  47 */
  48#include <acpi/acpi.h>
  49#include "accommon.h"
  50#include "amlcode.h"
  51#include "acparser.h"
  52#include "acdebug.h"
  53
  54#include <stdio.h>
  55#include <stdlib.h>
  56#include <stdarg.h>
  57#include <unistd.h>
  58#include <sys/time.h>
  59#include <semaphore.h>
  60#include <pthread.h>
  61#include <errno.h>
  62
  63#define _COMPONENT          ACPI_OS_SERVICES
  64ACPI_MODULE_NAME("osunixxf")
  65
  66u8 acpi_gbl_debug_timeout = FALSE;
  67
  68/* Upcalls to acpi_exec */
  69
  70void
  71ae_table_override(struct acpi_table_header *existing_table,
  72                  struct acpi_table_header **new_table);
  73
  74typedef void *(*PTHREAD_CALLBACK) (void *);
  75
  76/* Buffer used by acpi_os_vprintf */
  77
  78#define ACPI_VPRINTF_BUFFER_SIZE    512
  79#define _ASCII_NEWLINE              '\n'
  80
  81/* Terminal support for acpi_exec only */
  82
  83#ifdef ACPI_EXEC_APP
  84#include <termios.h>
  85
  86struct termios original_term_attributes;
  87int term_attributes_were_set = 0;
  88
  89acpi_status acpi_ut_read_line(char *buffer, u32 buffer_length, u32 *bytes_read);
  90
  91static void os_enter_line_edit_mode(void);
  92
  93static void os_exit_line_edit_mode(void);
  94
  95/******************************************************************************
  96 *
  97 * FUNCTION:    os_enter_line_edit_mode, os_exit_line_edit_mode
  98 *
  99 * PARAMETERS:  None
 100 *
 101 * RETURN:      None
 102 *
 103 * DESCRIPTION: Enter/Exit the raw character input mode for the terminal.
 104 *
 105 * Interactive line-editing support for the AML debugger. Used with the
 106 * common/acgetline module.
 107 *
 108 * readline() is not used because of non-portability. It is not available
 109 * on all systems, and if it is, often the package must be manually installed.
 110 *
 111 * Therefore, we use the POSIX tcgetattr/tcsetattr and do the minimal line
 112 * editing that we need in acpi_os_get_line.
 113 *
 114 * If the POSIX tcgetattr/tcsetattr interfaces are unavailable, these
 115 * calls will also work:
 116 *     For os_enter_line_edit_mode: system ("stty cbreak -echo")
 117 *     For os_exit_line_edit_mode: system ("stty cooked echo")
 118 *
 119 *****************************************************************************/
 120
 121static void os_enter_line_edit_mode(void)
 122{
 123        struct termios local_term_attributes;
 124
 125        term_attributes_were_set = 0;
 126
 127        /* STDIN must be a terminal */
 128
 129        if (!isatty(STDIN_FILENO)) {
 130                return;
 131        }
 132
 133        /* Get and keep the original attributes */
 134
 135        if (tcgetattr(STDIN_FILENO, &original_term_attributes)) {
 136                fprintf(stderr, "Could not get terminal attributes!\n");
 137                return;
 138        }
 139
 140        /* Set the new attributes to enable raw character input */
 141
 142        memcpy(&local_term_attributes, &original_term_attributes,
 143               sizeof(struct termios));
 144
 145        local_term_attributes.c_lflag &= ~(ICANON | ECHO);
 146        local_term_attributes.c_cc[VMIN] = 1;
 147        local_term_attributes.c_cc[VTIME] = 0;
 148
 149        if (tcsetattr(STDIN_FILENO, TCSANOW, &local_term_attributes)) {
 150                fprintf(stderr, "Could not set terminal attributes!\n");
 151                return;
 152        }
 153
 154        term_attributes_were_set = 1;
 155}
 156
 157static void os_exit_line_edit_mode(void)
 158{
 159
 160        if (!term_attributes_were_set) {
 161                return;
 162        }
 163
 164        /* Set terminal attributes back to the original values */
 165
 166        if (tcsetattr(STDIN_FILENO, TCSANOW, &original_term_attributes)) {
 167                fprintf(stderr, "Could not restore terminal attributes!\n");
 168        }
 169}
 170
 171#else
 172
 173/* These functions are not needed for other ACPICA utilities */
 174
 175#define os_enter_line_edit_mode()
 176#define os_exit_line_edit_mode()
 177#endif
 178
 179/******************************************************************************
 180 *
 181 * FUNCTION:    acpi_os_initialize, acpi_os_terminate
 182 *
 183 * PARAMETERS:  None
 184 *
 185 * RETURN:      Status
 186 *
 187 * DESCRIPTION: Initialize and terminate this module.
 188 *
 189 *****************************************************************************/
 190
 191acpi_status acpi_os_initialize(void)
 192{
 193        acpi_status status;
 194
 195        acpi_gbl_output_file = stdout;
 196
 197        os_enter_line_edit_mode();
 198
 199        status = acpi_os_create_lock(&acpi_gbl_print_lock);
 200        if (ACPI_FAILURE(status)) {
 201                return (status);
 202        }
 203
 204        return (AE_OK);
 205}
 206
 207acpi_status acpi_os_terminate(void)
 208{
 209
 210        os_exit_line_edit_mode();
 211        return (AE_OK);
 212}
 213
 214#ifndef ACPI_USE_NATIVE_RSDP_POINTER
 215/******************************************************************************
 216 *
 217 * FUNCTION:    acpi_os_get_root_pointer
 218 *
 219 * PARAMETERS:  None
 220 *
 221 * RETURN:      RSDP physical address
 222 *
 223 * DESCRIPTION: Gets the ACPI root pointer (RSDP)
 224 *
 225 *****************************************************************************/
 226
 227acpi_physical_address acpi_os_get_root_pointer(void)
 228{
 229
 230        return (0);
 231}
 232#endif
 233
 234/******************************************************************************
 235 *
 236 * FUNCTION:    acpi_os_predefined_override
 237 *
 238 * PARAMETERS:  init_val            - Initial value of the predefined object
 239 *              new_val             - The new value for the object
 240 *
 241 * RETURN:      Status, pointer to value. Null pointer returned if not
 242 *              overriding.
 243 *
 244 * DESCRIPTION: Allow the OS to override predefined names
 245 *
 246 *****************************************************************************/
 247
 248acpi_status
 249acpi_os_predefined_override(const struct acpi_predefined_names * init_val,
 250                            acpi_string * new_val)
 251{
 252
 253        if (!init_val || !new_val) {
 254                return (AE_BAD_PARAMETER);
 255        }
 256
 257        *new_val = NULL;
 258        return (AE_OK);
 259}
 260
 261/******************************************************************************
 262 *
 263 * FUNCTION:    acpi_os_table_override
 264 *
 265 * PARAMETERS:  existing_table      - Header of current table (probably
 266 *                                    firmware)
 267 *              new_table           - Where an entire new table is returned.
 268 *
 269 * RETURN:      Status, pointer to new table. Null pointer returned if no
 270 *              table is available to override
 271 *
 272 * DESCRIPTION: Return a different version of a table if one is available
 273 *
 274 *****************************************************************************/
 275
 276acpi_status
 277acpi_os_table_override(struct acpi_table_header * existing_table,
 278                       struct acpi_table_header ** new_table)
 279{
 280
 281        if (!existing_table || !new_table) {
 282                return (AE_BAD_PARAMETER);
 283        }
 284
 285        *new_table = NULL;
 286
 287#ifdef ACPI_EXEC_APP
 288
 289        ae_table_override(existing_table, new_table);
 290        return (AE_OK);
 291#else
 292
 293        return (AE_NO_ACPI_TABLES);
 294#endif
 295}
 296
 297/******************************************************************************
 298 *
 299 * FUNCTION:    acpi_os_physical_table_override
 300 *
 301 * PARAMETERS:  existing_table      - Header of current table (probably firmware)
 302 *              new_address         - Where new table address is returned
 303 *                                    (Physical address)
 304 *              new_table_length    - Where new table length is returned
 305 *
 306 * RETURN:      Status, address/length of new table. Null pointer returned
 307 *              if no table is available to override.
 308 *
 309 * DESCRIPTION: Returns AE_SUPPORT, function not used in user space.
 310 *
 311 *****************************************************************************/
 312
 313acpi_status
 314acpi_os_physical_table_override(struct acpi_table_header * existing_table,
 315                                acpi_physical_address * new_address,
 316                                u32 *new_table_length)
 317{
 318
 319        return (AE_SUPPORT);
 320}
 321
 322/******************************************************************************
 323 *
 324 * FUNCTION:    acpi_os_redirect_output
 325 *
 326 * PARAMETERS:  destination         - An open file handle/pointer
 327 *
 328 * RETURN:      None
 329 *
 330 * DESCRIPTION: Causes redirect of acpi_os_printf and acpi_os_vprintf
 331 *
 332 *****************************************************************************/
 333
 334void acpi_os_redirect_output(void *destination)
 335{
 336
 337        acpi_gbl_output_file = destination;
 338}
 339
 340/******************************************************************************
 341 *
 342 * FUNCTION:    acpi_os_printf
 343 *
 344 * PARAMETERS:  fmt, ...            - Standard printf format
 345 *
 346 * RETURN:      None
 347 *
 348 * DESCRIPTION: Formatted output. Note: very similar to acpi_os_vprintf
 349 *              (performance), changes should be tracked in both functions.
 350 *
 351 *****************************************************************************/
 352
 353void ACPI_INTERNAL_VAR_XFACE acpi_os_printf(const char *fmt, ...)
 354{
 355        va_list args;
 356        u8 flags;
 357
 358        flags = acpi_gbl_db_output_flags;
 359        if (flags & ACPI_DB_REDIRECTABLE_OUTPUT) {
 360
 361                /* Output is directable to either a file (if open) or the console */
 362
 363                if (acpi_gbl_debug_file) {
 364
 365                        /* Output file is open, send the output there */
 366
 367                        va_start(args, fmt);
 368                        vfprintf(acpi_gbl_debug_file, fmt, args);
 369                        va_end(args);
 370                } else {
 371                        /* No redirection, send output to console (once only!) */
 372
 373                        flags |= ACPI_DB_CONSOLE_OUTPUT;
 374                }
 375        }
 376
 377        if (flags & ACPI_DB_CONSOLE_OUTPUT) {
 378                va_start(args, fmt);
 379                vfprintf(acpi_gbl_output_file, fmt, args);
 380                va_end(args);
 381        }
 382}
 383
 384/******************************************************************************
 385 *
 386 * FUNCTION:    acpi_os_vprintf
 387 *
 388 * PARAMETERS:  fmt                 - Standard printf format
 389 *              args                - Argument list
 390 *
 391 * RETURN:      None
 392 *
 393 * DESCRIPTION: Formatted output with argument list pointer. Note: very
 394 *              similar to acpi_os_printf, changes should be tracked in both
 395 *              functions.
 396 *
 397 *****************************************************************************/
 398
 399void acpi_os_vprintf(const char *fmt, va_list args)
 400{
 401        u8 flags;
 402        char buffer[ACPI_VPRINTF_BUFFER_SIZE];
 403
 404        /*
 405         * We build the output string in a local buffer because we may be
 406         * outputting the buffer twice. Using vfprintf is problematic because
 407         * some implementations modify the args pointer/structure during
 408         * execution. Thus, we use the local buffer for portability.
 409         *
 410         * Note: Since this module is intended for use by the various ACPICA
 411         * utilities/applications, we can safely declare the buffer on the stack.
 412         * Also, This function is used for relatively small error messages only.
 413         */
 414        vsnprintf(buffer, ACPI_VPRINTF_BUFFER_SIZE, fmt, args);
 415
 416        flags = acpi_gbl_db_output_flags;
 417        if (flags & ACPI_DB_REDIRECTABLE_OUTPUT) {
 418
 419                /* Output is directable to either a file (if open) or the console */
 420
 421                if (acpi_gbl_debug_file) {
 422
 423                        /* Output file is open, send the output there */
 424
 425                        fputs(buffer, acpi_gbl_debug_file);
 426                } else {
 427                        /* No redirection, send output to console (once only!) */
 428
 429                        flags |= ACPI_DB_CONSOLE_OUTPUT;
 430                }
 431        }
 432
 433        if (flags & ACPI_DB_CONSOLE_OUTPUT) {
 434                fputs(buffer, acpi_gbl_output_file);
 435        }
 436}
 437
 438#ifndef ACPI_EXEC_APP
 439/******************************************************************************
 440 *
 441 * FUNCTION:    acpi_os_get_line
 442 *
 443 * PARAMETERS:  buffer              - Where to return the command line
 444 *              buffer_length       - Maximum length of Buffer
 445 *              bytes_read          - Where the actual byte count is returned
 446 *
 447 * RETURN:      Status and actual bytes read
 448 *
 449 * DESCRIPTION: Get the next input line from the terminal. NOTE: For the
 450 *              acpi_exec utility, we use the acgetline module instead to
 451 *              provide line-editing and history support.
 452 *
 453 *****************************************************************************/
 454
 455acpi_status acpi_os_get_line(char *buffer, u32 buffer_length, u32 *bytes_read)
 456{
 457        int input_char;
 458        u32 end_of_line;
 459
 460        /* Standard acpi_os_get_line for all utilities except acpi_exec */
 461
 462        for (end_of_line = 0;; end_of_line++) {
 463                if (end_of_line >= buffer_length) {
 464                        return (AE_BUFFER_OVERFLOW);
 465                }
 466
 467                if ((input_char = getchar()) == EOF) {
 468                        return (AE_ERROR);
 469                }
 470
 471                if (!input_char || input_char == _ASCII_NEWLINE) {
 472                        break;
 473                }
 474
 475                buffer[end_of_line] = (char)input_char;
 476        }
 477
 478        /* Null terminate the buffer */
 479
 480        buffer[end_of_line] = 0;
 481
 482        /* Return the number of bytes in the string */
 483
 484        if (bytes_read) {
 485                *bytes_read = end_of_line;
 486        }
 487
 488        return (AE_OK);
 489}
 490#endif
 491
 492#ifndef ACPI_USE_NATIVE_MEMORY_MAPPING
 493/******************************************************************************
 494 *
 495 * FUNCTION:    acpi_os_map_memory
 496 *
 497 * PARAMETERS:  where               - Physical address of memory to be mapped
 498 *              length              - How much memory to map
 499 *
 500 * RETURN:      Pointer to mapped memory. Null on error.
 501 *
 502 * DESCRIPTION: Map physical memory into caller's address space
 503 *
 504 *****************************************************************************/
 505
 506void *acpi_os_map_memory(acpi_physical_address where, acpi_size length)
 507{
 508
 509        return (ACPI_TO_POINTER((acpi_size) where));
 510}
 511
 512/******************************************************************************
 513 *
 514 * FUNCTION:    acpi_os_unmap_memory
 515 *
 516 * PARAMETERS:  where               - Logical address of memory to be unmapped
 517 *              length              - How much memory to unmap
 518 *
 519 * RETURN:      None.
 520 *
 521 * DESCRIPTION: Delete a previously created mapping. Where and Length must
 522 *              correspond to a previous mapping exactly.
 523 *
 524 *****************************************************************************/
 525
 526void acpi_os_unmap_memory(void *where, acpi_size length)
 527{
 528
 529        return;
 530}
 531#endif
 532
 533/******************************************************************************
 534 *
 535 * FUNCTION:    acpi_os_allocate
 536 *
 537 * PARAMETERS:  size                - Amount to allocate, in bytes
 538 *
 539 * RETURN:      Pointer to the new allocation. Null on error.
 540 *
 541 * DESCRIPTION: Allocate memory. Algorithm is dependent on the OS.
 542 *
 543 *****************************************************************************/
 544
 545void *acpi_os_allocate(acpi_size size)
 546{
 547        void *mem;
 548
 549        mem = (void *)malloc((size_t) size);
 550        return (mem);
 551}
 552
 553#ifdef USE_NATIVE_ALLOCATE_ZEROED
 554/******************************************************************************
 555 *
 556 * FUNCTION:    acpi_os_allocate_zeroed
 557 *
 558 * PARAMETERS:  size                - Amount to allocate, in bytes
 559 *
 560 * RETURN:      Pointer to the new allocation. Null on error.
 561 *
 562 * DESCRIPTION: Allocate and zero memory. Algorithm is dependent on the OS.
 563 *
 564 *****************************************************************************/
 565
 566void *acpi_os_allocate_zeroed(acpi_size size)
 567{
 568        void *mem;
 569
 570        mem = (void *)calloc(1, (size_t) size);
 571        return (mem);
 572}
 573#endif
 574
 575/******************************************************************************
 576 *
 577 * FUNCTION:    acpi_os_free
 578 *
 579 * PARAMETERS:  mem                 - Pointer to previously allocated memory
 580 *
 581 * RETURN:      None.
 582 *
 583 * DESCRIPTION: Free memory allocated via acpi_os_allocate
 584 *
 585 *****************************************************************************/
 586
 587void acpi_os_free(void *mem)
 588{
 589
 590        free(mem);
 591}
 592
 593#ifdef ACPI_SINGLE_THREADED
 594/******************************************************************************
 595 *
 596 * FUNCTION:    Semaphore stub functions
 597 *
 598 * DESCRIPTION: Stub functions used for single-thread applications that do
 599 *              not require semaphore synchronization. Full implementations
 600 *              of these functions appear after the stubs.
 601 *
 602 *****************************************************************************/
 603
 604acpi_status
 605acpi_os_create_semaphore(u32 max_units,
 606                         u32 initial_units, acpi_handle * out_handle)
 607{
 608        *out_handle = (acpi_handle) 1;
 609        return (AE_OK);
 610}
 611
 612acpi_status acpi_os_delete_semaphore(acpi_handle handle)
 613{
 614        return (AE_OK);
 615}
 616
 617acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout)
 618{
 619        return (AE_OK);
 620}
 621
 622acpi_status acpi_os_signal_semaphore(acpi_handle handle, u32 units)
 623{
 624        return (AE_OK);
 625}
 626
 627#else
 628/******************************************************************************
 629 *
 630 * FUNCTION:    acpi_os_create_semaphore
 631 *
 632 * PARAMETERS:  initial_units       - Units to be assigned to the new semaphore
 633 *              out_handle          - Where a handle will be returned
 634 *
 635 * RETURN:      Status
 636 *
 637 * DESCRIPTION: Create an OS semaphore
 638 *
 639 *****************************************************************************/
 640
 641acpi_status
 642acpi_os_create_semaphore(u32 max_units,
 643                         u32 initial_units, acpi_handle * out_handle)
 644{
 645        sem_t *sem;
 646
 647        if (!out_handle) {
 648                return (AE_BAD_PARAMETER);
 649        }
 650#ifdef __APPLE__
 651        {
 652                char *semaphore_name = tmpnam(NULL);
 653
 654                sem =
 655                    sem_open(semaphore_name, O_EXCL | O_CREAT, 0755,
 656                             initial_units);
 657                if (!sem) {
 658                        return (AE_NO_MEMORY);
 659                }
 660                sem_unlink(semaphore_name);     /* This just deletes the name */
 661        }
 662
 663#else
 664        sem = acpi_os_allocate(sizeof(sem_t));
 665        if (!sem) {
 666                return (AE_NO_MEMORY);
 667        }
 668
 669        if (sem_init(sem, 0, initial_units) == -1) {
 670                acpi_os_free(sem);
 671                return (AE_BAD_PARAMETER);
 672        }
 673#endif
 674
 675        *out_handle = (acpi_handle) sem;
 676        return (AE_OK);
 677}
 678
 679/******************************************************************************
 680 *
 681 * FUNCTION:    acpi_os_delete_semaphore
 682 *
 683 * PARAMETERS:  handle              - Handle returned by acpi_os_create_semaphore
 684 *
 685 * RETURN:      Status
 686 *
 687 * DESCRIPTION: Delete an OS semaphore
 688 *
 689 *****************************************************************************/
 690
 691acpi_status acpi_os_delete_semaphore(acpi_handle handle)
 692{
 693        sem_t *sem = (sem_t *) handle;
 694
 695        if (!sem) {
 696                return (AE_BAD_PARAMETER);
 697        }
 698
 699        if (sem_destroy(sem) == -1) {
 700                return (AE_BAD_PARAMETER);
 701        }
 702
 703        return (AE_OK);
 704}
 705
 706/******************************************************************************
 707 *
 708 * FUNCTION:    acpi_os_wait_semaphore
 709 *
 710 * PARAMETERS:  handle              - Handle returned by acpi_os_create_semaphore
 711 *              units               - How many units to wait for
 712 *              msec_timeout        - How long to wait (milliseconds)
 713 *
 714 * RETURN:      Status
 715 *
 716 * DESCRIPTION: Wait for units
 717 *
 718 *****************************************************************************/
 719
 720acpi_status
 721acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 msec_timeout)
 722{
 723        acpi_status status = AE_OK;
 724        sem_t *sem = (sem_t *) handle;
 725#ifndef ACPI_USE_ALTERNATE_TIMEOUT
 726        struct timespec time;
 727        int ret_val;
 728#endif
 729
 730        if (!sem) {
 731                return (AE_BAD_PARAMETER);
 732        }
 733
 734        switch (msec_timeout) {
 735                /*
 736                 * No Wait:
 737                 * --------
 738                 * A zero timeout value indicates that we shouldn't wait - just
 739                 * acquire the semaphore if available otherwise return AE_TIME
 740                 * (a.k.a. 'would block').
 741                 */
 742        case 0:
 743
 744                if (sem_trywait(sem) == -1) {
 745                        status = (AE_TIME);
 746                }
 747                break;
 748
 749                /* Wait Indefinitely */
 750
 751        case ACPI_WAIT_FOREVER:
 752
 753                if (sem_wait(sem)) {
 754                        status = (AE_TIME);
 755                }
 756                break;
 757
 758                /* Wait with msec_timeout */
 759
 760        default:
 761
 762#ifdef ACPI_USE_ALTERNATE_TIMEOUT
 763                /*
 764                 * Alternate timeout mechanism for environments where
 765                 * sem_timedwait is not available or does not work properly.
 766                 */
 767                while (msec_timeout) {
 768                        if (sem_trywait(sem) == 0) {
 769
 770                                /* Got the semaphore */
 771                                return (AE_OK);
 772                        }
 773
 774                        if (msec_timeout >= 10) {
 775                                msec_timeout -= 10;
 776                                usleep(10 * ACPI_USEC_PER_MSEC);        /* ten milliseconds */
 777                        } else {
 778                                msec_timeout--;
 779                                usleep(ACPI_USEC_PER_MSEC);     /* one millisecond */
 780                        }
 781                }
 782                status = (AE_TIME);
 783#else
 784                /*
 785                 * The interface to sem_timedwait is an absolute time, so we need to
 786                 * get the current time, then add in the millisecond Timeout value.
 787                 */
 788                if (clock_gettime(CLOCK_REALTIME, &time) == -1) {
 789                        perror("clock_gettime");
 790                        return (AE_TIME);
 791                }
 792
 793                time.tv_sec += (msec_timeout / ACPI_MSEC_PER_SEC);
 794                time.tv_nsec +=
 795                    ((msec_timeout % ACPI_MSEC_PER_SEC) * ACPI_NSEC_PER_MSEC);
 796
 797                /* Handle nanosecond overflow (field must be less than one second) */
 798
 799                if (time.tv_nsec >= ACPI_NSEC_PER_SEC) {
 800                        time.tv_sec += (time.tv_nsec / ACPI_NSEC_PER_SEC);
 801                        time.tv_nsec = (time.tv_nsec % ACPI_NSEC_PER_SEC);
 802                }
 803
 804                while (((ret_val = sem_timedwait(sem, &time)) == -1)
 805                       && (errno == EINTR)) {
 806                        continue;
 807                }
 808
 809                if (ret_val != 0) {
 810                        if (errno != ETIMEDOUT) {
 811                                perror("sem_timedwait");
 812                        }
 813                        status = (AE_TIME);
 814                }
 815#endif
 816                break;
 817        }
 818
 819        return (status);
 820}
 821
 822/******************************************************************************
 823 *
 824 * FUNCTION:    acpi_os_signal_semaphore
 825 *
 826 * PARAMETERS:  handle              - Handle returned by acpi_os_create_semaphore
 827 *              units               - Number of units to send
 828 *
 829 * RETURN:      Status
 830 *
 831 * DESCRIPTION: Send units
 832 *
 833 *****************************************************************************/
 834
 835acpi_status acpi_os_signal_semaphore(acpi_handle handle, u32 units)
 836{
 837        sem_t *sem = (sem_t *) handle;
 838
 839        if (!sem) {
 840                return (AE_BAD_PARAMETER);
 841        }
 842
 843        if (sem_post(sem) == -1) {
 844                return (AE_LIMIT);
 845        }
 846
 847        return (AE_OK);
 848}
 849
 850#endif                          /* ACPI_SINGLE_THREADED */
 851
 852/******************************************************************************
 853 *
 854 * FUNCTION:    Spinlock interfaces
 855 *
 856 * DESCRIPTION: Map these interfaces to semaphore interfaces
 857 *
 858 *****************************************************************************/
 859
 860acpi_status acpi_os_create_lock(acpi_spinlock * out_handle)
 861{
 862
 863        return (acpi_os_create_semaphore(1, 1, out_handle));
 864}
 865
 866void acpi_os_delete_lock(acpi_spinlock handle)
 867{
 868        acpi_os_delete_semaphore(handle);
 869}
 870
 871acpi_cpu_flags acpi_os_acquire_lock(acpi_handle handle)
 872{
 873        acpi_os_wait_semaphore(handle, 1, 0xFFFF);
 874        return (0);
 875}
 876
 877void acpi_os_release_lock(acpi_spinlock handle, acpi_cpu_flags flags)
 878{
 879        acpi_os_signal_semaphore(handle, 1);
 880}
 881
 882/******************************************************************************
 883 *
 884 * FUNCTION:    acpi_os_install_interrupt_handler
 885 *
 886 * PARAMETERS:  interrupt_number    - Level handler should respond to.
 887 *              isr                 - Address of the ACPI interrupt handler
 888 *              except_ptr          - Where status is returned
 889 *
 890 * RETURN:      Handle to the newly installed handler.
 891 *
 892 * DESCRIPTION: Install an interrupt handler. Used to install the ACPI
 893 *              OS-independent handler.
 894 *
 895 *****************************************************************************/
 896
 897u32
 898acpi_os_install_interrupt_handler(u32 interrupt_number,
 899                                  acpi_osd_handler service_routine,
 900                                  void *context)
 901{
 902
 903        return (AE_OK);
 904}
 905
 906/******************************************************************************
 907 *
 908 * FUNCTION:    acpi_os_remove_interrupt_handler
 909 *
 910 * PARAMETERS:  handle              - Returned when handler was installed
 911 *
 912 * RETURN:      Status
 913 *
 914 * DESCRIPTION: Uninstalls an interrupt handler.
 915 *
 916 *****************************************************************************/
 917
 918acpi_status
 919acpi_os_remove_interrupt_handler(u32 interrupt_number,
 920                                 acpi_osd_handler service_routine)
 921{
 922
 923        return (AE_OK);
 924}
 925
 926/******************************************************************************
 927 *
 928 * FUNCTION:    acpi_os_stall
 929 *
 930 * PARAMETERS:  microseconds        - Time to sleep
 931 *
 932 * RETURN:      Blocks until sleep is completed.
 933 *
 934 * DESCRIPTION: Sleep at microsecond granularity
 935 *
 936 *****************************************************************************/
 937
 938void acpi_os_stall(u32 microseconds)
 939{
 940
 941        if (microseconds) {
 942                usleep(microseconds);
 943        }
 944}
 945
 946/******************************************************************************
 947 *
 948 * FUNCTION:    acpi_os_sleep
 949 *
 950 * PARAMETERS:  milliseconds        - Time to sleep
 951 *
 952 * RETURN:      Blocks until sleep is completed.
 953 *
 954 * DESCRIPTION: Sleep at millisecond granularity
 955 *
 956 *****************************************************************************/
 957
 958void acpi_os_sleep(u64 milliseconds)
 959{
 960
 961        /* Sleep for whole seconds */
 962
 963        sleep(milliseconds / ACPI_MSEC_PER_SEC);
 964
 965        /*
 966         * Sleep for remaining microseconds.
 967         * Arg to usleep() is in usecs and must be less than 1,000,000 (1 second).
 968         */
 969        usleep((milliseconds % ACPI_MSEC_PER_SEC) * ACPI_USEC_PER_MSEC);
 970}
 971
 972/******************************************************************************
 973 *
 974 * FUNCTION:    acpi_os_get_timer
 975 *
 976 * PARAMETERS:  None
 977 *
 978 * RETURN:      Current time in 100 nanosecond units
 979 *
 980 * DESCRIPTION: Get the current system time
 981 *
 982 *****************************************************************************/
 983
 984u64 acpi_os_get_timer(void)
 985{
 986        struct timeval time;
 987
 988        /* This timer has sufficient resolution for user-space application code */
 989
 990        gettimeofday(&time, NULL);
 991
 992        /* (Seconds * 10^7 = 100ns(10^-7)) + (Microseconds(10^-6) * 10^1 = 100ns) */
 993
 994        return (((u64)time.tv_sec * ACPI_100NSEC_PER_SEC) +
 995                ((u64)time.tv_usec * ACPI_100NSEC_PER_USEC));
 996}
 997
 998/******************************************************************************
 999 *
1000 * FUNCTION:    acpi_os_read_pci_configuration
1001 *
1002 * PARAMETERS:  pci_id              - Seg/Bus/Dev
1003 *              pci_register        - Device Register
1004 *              value               - Buffer where value is placed
1005 *              width               - Number of bits
1006 *
1007 * RETURN:      Status
1008 *
1009 * DESCRIPTION: Read data from PCI configuration space
1010 *
1011 *****************************************************************************/
1012
1013acpi_status
1014acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id,
1015                               u32 pci_register, u64 *value, u32 width)
1016{
1017
1018        *value = 0;
1019        return (AE_OK);
1020}
1021
1022/******************************************************************************
1023 *
1024 * FUNCTION:    acpi_os_write_pci_configuration
1025 *
1026 * PARAMETERS:  pci_id              - Seg/Bus/Dev
1027 *              pci_register        - Device Register
1028 *              value               - Value to be written
1029 *              width               - Number of bits
1030 *
1031 * RETURN:      Status.
1032 *
1033 * DESCRIPTION: Write data to PCI configuration space
1034 *
1035 *****************************************************************************/
1036
1037acpi_status
1038acpi_os_write_pci_configuration(struct acpi_pci_id * pci_id,
1039                                u32 pci_register, u64 value, u32 width)
1040{
1041
1042        return (AE_OK);
1043}
1044
1045/******************************************************************************
1046 *
1047 * FUNCTION:    acpi_os_read_port
1048 *
1049 * PARAMETERS:  address             - Address of I/O port/register to read
1050 *              value               - Where value is placed
1051 *              width               - Number of bits
1052 *
1053 * RETURN:      Value read from port
1054 *
1055 * DESCRIPTION: Read data from an I/O port or register
1056 *
1057 *****************************************************************************/
1058
1059acpi_status acpi_os_read_port(acpi_io_address address, u32 *value, u32 width)
1060{
1061
1062        switch (width) {
1063        case 8:
1064
1065                *value = 0xFF;
1066                break;
1067
1068        case 16:
1069
1070                *value = 0xFFFF;
1071                break;
1072
1073        case 32:
1074
1075                *value = 0xFFFFFFFF;
1076                break;
1077
1078        default:
1079
1080                return (AE_BAD_PARAMETER);
1081        }
1082
1083        return (AE_OK);
1084}
1085
1086/******************************************************************************
1087 *
1088 * FUNCTION:    acpi_os_write_port
1089 *
1090 * PARAMETERS:  address             - Address of I/O port/register to write
1091 *              value               - Value to write
1092 *              width               - Number of bits
1093 *
1094 * RETURN:      None
1095 *
1096 * DESCRIPTION: Write data to an I/O port or register
1097 *
1098 *****************************************************************************/
1099
1100acpi_status acpi_os_write_port(acpi_io_address address, u32 value, u32 width)
1101{
1102
1103        return (AE_OK);
1104}
1105
1106/******************************************************************************
1107 *
1108 * FUNCTION:    acpi_os_read_memory
1109 *
1110 * PARAMETERS:  address             - Physical Memory Address to read
1111 *              value               - Where value is placed
1112 *              width               - Number of bits (8,16,32, or 64)
1113 *
1114 * RETURN:      Value read from physical memory address. Always returned
1115 *              as a 64-bit integer, regardless of the read width.
1116 *
1117 * DESCRIPTION: Read data from a physical memory address
1118 *
1119 *****************************************************************************/
1120
1121acpi_status
1122acpi_os_read_memory(acpi_physical_address address, u64 *value, u32 width)
1123{
1124
1125        switch (width) {
1126        case 8:
1127        case 16:
1128        case 32:
1129        case 64:
1130
1131                *value = 0;
1132                break;
1133
1134        default:
1135
1136                return (AE_BAD_PARAMETER);
1137        }
1138        return (AE_OK);
1139}
1140
1141/******************************************************************************
1142 *
1143 * FUNCTION:    acpi_os_write_memory
1144 *
1145 * PARAMETERS:  address             - Physical Memory Address to write
1146 *              value               - Value to write
1147 *              width               - Number of bits (8,16,32, or 64)
1148 *
1149 * RETURN:      None
1150 *
1151 * DESCRIPTION: Write data to a physical memory address
1152 *
1153 *****************************************************************************/
1154
1155acpi_status
1156acpi_os_write_memory(acpi_physical_address address, u64 value, u32 width)
1157{
1158
1159        return (AE_OK);
1160}
1161
1162/******************************************************************************
1163 *
1164 * FUNCTION:    acpi_os_readable
1165 *
1166 * PARAMETERS:  pointer             - Area to be verified
1167 *              length              - Size of area
1168 *
1169 * RETURN:      TRUE if readable for entire length
1170 *
1171 * DESCRIPTION: Verify that a pointer is valid for reading
1172 *
1173 *****************************************************************************/
1174
1175u8 acpi_os_readable(void *pointer, acpi_size length)
1176{
1177
1178        return (TRUE);
1179}
1180
1181/******************************************************************************
1182 *
1183 * FUNCTION:    acpi_os_writable
1184 *
1185 * PARAMETERS:  pointer             - Area to be verified
1186 *              length              - Size of area
1187 *
1188 * RETURN:      TRUE if writable for entire length
1189 *
1190 * DESCRIPTION: Verify that a pointer is valid for writing
1191 *
1192 *****************************************************************************/
1193
1194u8 acpi_os_writable(void *pointer, acpi_size length)
1195{
1196
1197        return (TRUE);
1198}
1199
1200/******************************************************************************
1201 *
1202 * FUNCTION:    acpi_os_signal
1203 *
1204 * PARAMETERS:  function            - ACPI A signal function code
1205 *              info                - Pointer to function-dependent structure
1206 *
1207 * RETURN:      Status
1208 *
1209 * DESCRIPTION: Miscellaneous functions. Example implementation only.
1210 *
1211 *****************************************************************************/
1212
1213acpi_status acpi_os_signal(u32 function, void *info)
1214{
1215
1216        switch (function) {
1217        case ACPI_SIGNAL_FATAL:
1218
1219                break;
1220
1221        case ACPI_SIGNAL_BREAKPOINT:
1222
1223                break;
1224
1225        default:
1226
1227                break;
1228        }
1229
1230        return (AE_OK);
1231}
1232
1233/* Optional multi-thread support */
1234
1235#ifndef ACPI_SINGLE_THREADED
1236/******************************************************************************
1237 *
1238 * FUNCTION:    acpi_os_get_thread_id
1239 *
1240 * PARAMETERS:  None
1241 *
1242 * RETURN:      Id of the running thread
1243 *
1244 * DESCRIPTION: Get the ID of the current (running) thread
1245 *
1246 *****************************************************************************/
1247
1248acpi_thread_id acpi_os_get_thread_id(void)
1249{
1250        pthread_t thread;
1251
1252        thread = pthread_self();
1253        return (ACPI_CAST_PTHREAD_T(thread));
1254}
1255
1256/******************************************************************************
1257 *
1258 * FUNCTION:    acpi_os_execute
1259 *
1260 * PARAMETERS:  type                - Type of execution
1261 *              function            - Address of the function to execute
1262 *              context             - Passed as a parameter to the function
1263 *
1264 * RETURN:      Status.
1265 *
1266 * DESCRIPTION: Execute a new thread
1267 *
1268 *****************************************************************************/
1269
1270acpi_status
1271acpi_os_execute(acpi_execute_type type,
1272                acpi_osd_exec_callback function, void *context)
1273{
1274        pthread_t thread;
1275        int ret;
1276
1277        ret =
1278            pthread_create(&thread, NULL, (PTHREAD_CALLBACK) function, context);
1279        if (ret) {
1280                acpi_os_printf("Create thread failed");
1281        }
1282        return (0);
1283}
1284
1285#else                           /* ACPI_SINGLE_THREADED */
1286acpi_thread_id acpi_os_get_thread_id(void)
1287{
1288        return (1);
1289}
1290
1291acpi_status
1292acpi_os_execute(acpi_execute_type type,
1293                acpi_osd_exec_callback function, void *context)
1294{
1295
1296        function(context);
1297
1298        return (AE_OK);
1299}
1300
1301#endif                          /* ACPI_SINGLE_THREADED */
1302
1303/******************************************************************************
1304 *
1305 * FUNCTION:    acpi_os_wait_events_complete
1306 *
1307 * PARAMETERS:  None
1308 *
1309 * RETURN:      None
1310 *
1311 * DESCRIPTION: Wait for all asynchronous events to complete. This
1312 *              implementation does nothing.
1313 *
1314 *****************************************************************************/
1315
1316void acpi_os_wait_events_complete(void)
1317{
1318        return;
1319}
1320