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