Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenutosi.c
Go to the documentation of this file.
00001 /****************************************************************************** 00002 * 00003 * Module Name: utosi - Support for the _OSI predefined control method 00004 * 00005 *****************************************************************************/ 00006 00007 /****************************************************************************** 00008 * 00009 * 1. Copyright Notice 00010 * 00011 * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. 00012 * All rights reserved. 00013 * 00014 * 2. License 00015 * 00016 * 2.1. This is your license from Intel Corp. under its intellectual property 00017 * rights. You may have additional license terms from the party that provided 00018 * you this software, covering your right to use that party's intellectual 00019 * property rights. 00020 * 00021 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 00022 * copy of the source code appearing in this file ("Covered Code") an 00023 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 00024 * base code distributed originally by Intel ("Original Intel Code") to copy, 00025 * make derivatives, distribute, use and display any portion of the Covered 00026 * Code in any form, with the right to sublicense such rights; and 00027 * 00028 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 00029 * license (with the right to sublicense), under only those claims of Intel 00030 * patents that are infringed by the Original Intel Code, to make, use, sell, 00031 * offer to sell, and import the Covered Code and derivative works thereof 00032 * solely to the minimum extent necessary to exercise the above copyright 00033 * license, and in no event shall the patent license extend to any additions 00034 * to or modifications of the Original Intel Code. No other license or right 00035 * is granted directly or by implication, estoppel or otherwise; 00036 * 00037 * The above copyright and patent license is granted only if the following 00038 * conditions are met: 00039 * 00040 * 3. Conditions 00041 * 00042 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 00043 * Redistribution of source code of any substantial portion of the Covered 00044 * Code or modification with rights to further distribute source must include 00045 * the above Copyright Notice, the above License, this list of Conditions, 00046 * and the following Disclaimer and Export Compliance provision. In addition, 00047 * Licensee must cause all Covered Code to which Licensee contributes to 00048 * contain a file documenting the changes Licensee made to create that Covered 00049 * Code and the date of any change. Licensee must include in that file the 00050 * documentation of any changes made by any predecessor Licensee. Licensee 00051 * must include a prominent statement that the modification is derived, 00052 * directly or indirectly, from Original Intel Code. 00053 * 00054 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 00055 * Redistribution of source code of any substantial portion of the Covered 00056 * Code or modification without rights to further distribute source must 00057 * include the following Disclaimer and Export Compliance provision in the 00058 * documentation and/or other materials provided with distribution. In 00059 * addition, Licensee may not authorize further sublicense of source of any 00060 * portion of the Covered Code, and must include terms to the effect that the 00061 * license from Licensee to its licensee is limited to the intellectual 00062 * property embodied in the software Licensee provides to its licensee, and 00063 * not to intellectual property embodied in modifications its licensee may 00064 * make. 00065 * 00066 * 3.3. Redistribution of Executable. Redistribution in executable form of any 00067 * substantial portion of the Covered Code or modification must reproduce the 00068 * above Copyright Notice, and the following Disclaimer and Export Compliance 00069 * provision in the documentation and/or other materials provided with the 00070 * distribution. 00071 * 00072 * 3.4. Intel retains all right, title, and interest in and to the Original 00073 * Intel Code. 00074 * 00075 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 00076 * Intel shall be used in advertising or otherwise to promote the sale, use or 00077 * other dealings in products derived from or relating to the Covered Code 00078 * without prior written authorization from Intel. 00079 * 00080 * 4. Disclaimer and Export Compliance 00081 * 00082 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 00083 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 00084 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 00085 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 00086 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 00087 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 00088 * PARTICULAR PURPOSE. 00089 * 00090 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 00091 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 00092 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 00093 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 00094 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 00095 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 00096 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 00097 * LIMITED REMEDY. 00098 * 00099 * 4.3. Licensee shall not export, either directly or indirectly, any of this 00100 * software or system incorporating such software without first obtaining any 00101 * required license or other approval from the U. S. Department of Commerce or 00102 * any other agency or department of the United States Government. In the 00103 * event Licensee exports any such software from the United States or 00104 * re-exports any such software from a foreign destination, Licensee shall 00105 * ensure that the distribution and export/re-export of the software is in 00106 * compliance with all laws, regulations, orders, or other restrictions of the 00107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 00108 * any of its subsidiaries will export/re-export any technical data, process, 00109 * software, or service, directly or indirectly, to any country for which the 00110 * United States government or any agency thereof requires an export license, 00111 * other governmental approval, or letter of assurance, without first obtaining 00112 * such license, approval or letter. 00113 * 00114 *****************************************************************************/ 00115 00116 #define __UTOSI_C__ 00117 00118 #include "acpi.h" 00119 #include "accommon.h" 00120 00121 00122 #define _COMPONENT ACPI_UTILITIES 00123 ACPI_MODULE_NAME ("utosi") 00124 00125 /* 00126 * Strings supported by the _OSI predefined control method (which is 00127 * implemented internally within this module.) 00128 * 00129 * March 2009: Removed "Linux" as this host no longer wants to respond true 00130 * for this string. Basically, the only safe OS strings are windows-related 00131 * and in many or most cases represent the only test path within the 00132 * BIOS-provided ASL code. 00133 * 00134 * The last element of each entry is used to track the newest version of 00135 * Windows that the BIOS has requested. 00136 */ 00137 static ACPI_INTERFACE_INFO AcpiDefaultSupportedInterfaces[] = 00138 { 00139 /* Operating System Vendor Strings */ 00140 00141 {"Windows 2000", NULL, 0, ACPI_OSI_WIN_2000}, /* Windows 2000 */ 00142 {"Windows 2001", NULL, 0, ACPI_OSI_WIN_XP}, /* Windows XP */ 00143 {"Windows 2001 SP1", NULL, 0, ACPI_OSI_WIN_XP_SP1}, /* Windows XP SP1 */ 00144 {"Windows 2001.1", NULL, 0, ACPI_OSI_WINSRV_2003}, /* Windows Server 2003 */ 00145 {"Windows 2001 SP2", NULL, 0, ACPI_OSI_WIN_XP_SP2}, /* Windows XP SP2 */ 00146 {"Windows 2001.1 SP1", NULL, 0, ACPI_OSI_WINSRV_2003_SP1}, /* Windows Server 2003 SP1 - Added 03/2006 */ 00147 {"Windows 2006", NULL, 0, ACPI_OSI_WIN_VISTA}, /* Windows Vista - Added 03/2006 */ 00148 {"Windows 2006.1", NULL, 0, ACPI_OSI_WINSRV_2008}, /* Windows Server 2008 - Added 09/2009 */ 00149 {"Windows 2006 SP1", NULL, 0, ACPI_OSI_WIN_VISTA_SP1}, /* Windows Vista SP1 - Added 09/2009 */ 00150 {"Windows 2006 SP2", NULL, 0, ACPI_OSI_WIN_VISTA_SP2}, /* Windows Vista SP2 - Added 09/2010 */ 00151 {"Windows 2009", NULL, 0, ACPI_OSI_WIN_7}, /* Windows 7 and Server 2008 R2 - Added 09/2009 */ 00152 00153 /* Feature Group Strings */ 00154 00155 {"Extended Address Space Descriptor", NULL, 0, 0} 00156 00157 /* 00158 * All "optional" feature group strings (features that are implemented 00159 * by the host) should be dynamically added by the host via 00160 * AcpiInstallInterface and should not be manually added here. 00161 * 00162 * Examples of optional feature group strings: 00163 * 00164 * "Module Device" 00165 * "Processor Device" 00166 * "3.0 Thermal Model" 00167 * "3.0 _SCP Extensions" 00168 * "Processor Aggregator Device" 00169 */ 00170 }; 00171 00172 00173 /******************************************************************************* 00174 * 00175 * FUNCTION: AcpiUtInitializeInterfaces 00176 * 00177 * PARAMETERS: None 00178 * 00179 * RETURN: Status 00180 * 00181 * DESCRIPTION: Initialize the global _OSI supported interfaces list 00182 * 00183 ******************************************************************************/ 00184 00185 ACPI_STATUS 00186 AcpiUtInitializeInterfaces ( 00187 void) 00188 { 00189 UINT32 i; 00190 00191 00192 (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); 00193 AcpiGbl_SupportedInterfaces = AcpiDefaultSupportedInterfaces; 00194 00195 /* Link the static list of supported interfaces */ 00196 00197 for (i = 0; i < (ACPI_ARRAY_LENGTH (AcpiDefaultSupportedInterfaces) - 1); i++) 00198 { 00199 AcpiDefaultSupportedInterfaces[i].Next = 00200 &AcpiDefaultSupportedInterfaces[(ACPI_SIZE) i + 1]; 00201 } 00202 00203 AcpiOsReleaseMutex (AcpiGbl_OsiMutex); 00204 return (AE_OK); 00205 } 00206 00207 00208 /******************************************************************************* 00209 * 00210 * FUNCTION: AcpiUtInterfaceTerminate 00211 * 00212 * PARAMETERS: None 00213 * 00214 * RETURN: None 00215 * 00216 * DESCRIPTION: Delete all interfaces in the global list. Sets 00217 * AcpiGbl_SupportedInterfaces to NULL. 00218 * 00219 ******************************************************************************/ 00220 00221 void 00222 AcpiUtInterfaceTerminate ( 00223 void) 00224 { 00225 ACPI_INTERFACE_INFO *NextInterface; 00226 00227 00228 (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); 00229 NextInterface = AcpiGbl_SupportedInterfaces; 00230 00231 while (NextInterface) 00232 { 00233 AcpiGbl_SupportedInterfaces = NextInterface->Next; 00234 00235 /* Only interfaces added at runtime can be freed */ 00236 00237 if (NextInterface->Flags & ACPI_OSI_DYNAMIC) 00238 { 00239 ACPI_FREE (NextInterface->Name); 00240 ACPI_FREE (NextInterface); 00241 } 00242 00243 NextInterface = AcpiGbl_SupportedInterfaces; 00244 } 00245 00246 AcpiOsReleaseMutex (AcpiGbl_OsiMutex); 00247 } 00248 00249 00250 /******************************************************************************* 00251 * 00252 * FUNCTION: AcpiUtInstallInterface 00253 * 00254 * PARAMETERS: InterfaceName - The interface to install 00255 * 00256 * RETURN: Status 00257 * 00258 * DESCRIPTION: Install the interface into the global interface list. 00259 * Caller MUST hold AcpiGbl_OsiMutex 00260 * 00261 ******************************************************************************/ 00262 00263 ACPI_STATUS 00264 AcpiUtInstallInterface ( 00265 ACPI_STRING InterfaceName) 00266 { 00267 ACPI_INTERFACE_INFO *InterfaceInfo; 00268 00269 00270 /* Allocate info block and space for the name string */ 00271 00272 InterfaceInfo = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_INTERFACE_INFO)); 00273 if (!InterfaceInfo) 00274 { 00275 return (AE_NO_MEMORY); 00276 } 00277 00278 InterfaceInfo->Name = ACPI_ALLOCATE_ZEROED (ACPI_STRLEN (InterfaceName) + 1); 00279 if (!InterfaceInfo->Name) 00280 { 00281 ACPI_FREE (InterfaceInfo); 00282 return (AE_NO_MEMORY); 00283 } 00284 00285 /* Initialize new info and insert at the head of the global list */ 00286 00287 ACPI_STRCPY (InterfaceInfo->Name, InterfaceName); 00288 InterfaceInfo->Flags = ACPI_OSI_DYNAMIC; 00289 InterfaceInfo->Next = AcpiGbl_SupportedInterfaces; 00290 00291 AcpiGbl_SupportedInterfaces = InterfaceInfo; 00292 return (AE_OK); 00293 } 00294 00295 00296 /******************************************************************************* 00297 * 00298 * FUNCTION: AcpiUtRemoveInterface 00299 * 00300 * PARAMETERS: InterfaceName - The interface to remove 00301 * 00302 * RETURN: Status 00303 * 00304 * DESCRIPTION: Remove the interface from the global interface list. 00305 * Caller MUST hold AcpiGbl_OsiMutex 00306 * 00307 ******************************************************************************/ 00308 00309 ACPI_STATUS 00310 AcpiUtRemoveInterface ( 00311 ACPI_STRING InterfaceName) 00312 { 00313 ACPI_INTERFACE_INFO *PreviousInterface; 00314 ACPI_INTERFACE_INFO *NextInterface; 00315 00316 00317 PreviousInterface = NextInterface = AcpiGbl_SupportedInterfaces; 00318 while (NextInterface) 00319 { 00320 if (!ACPI_STRCMP (InterfaceName, NextInterface->Name)) 00321 { 00322 /* Found: name is in either the static list or was added at runtime */ 00323 00324 if (NextInterface->Flags & ACPI_OSI_DYNAMIC) 00325 { 00326 /* Interface was added dynamically, remove and free it */ 00327 00328 if (PreviousInterface == NextInterface) 00329 { 00330 AcpiGbl_SupportedInterfaces = NextInterface->Next; 00331 } 00332 else 00333 { 00334 PreviousInterface->Next = NextInterface->Next; 00335 } 00336 00337 ACPI_FREE (NextInterface->Name); 00338 ACPI_FREE (NextInterface); 00339 } 00340 else 00341 { 00342 /* 00343 * Interface is in static list. If marked invalid, then it 00344 * does not actually exist. Else, mark it invalid. 00345 */ 00346 if (NextInterface->Flags & ACPI_OSI_INVALID) 00347 { 00348 return (AE_NOT_EXIST); 00349 } 00350 00351 NextInterface->Flags |= ACPI_OSI_INVALID; 00352 } 00353 00354 return (AE_OK); 00355 } 00356 00357 PreviousInterface = NextInterface; 00358 NextInterface = NextInterface->Next; 00359 } 00360 00361 /* Interface was not found */ 00362 00363 return (AE_NOT_EXIST); 00364 } 00365 00366 00367 /******************************************************************************* 00368 * 00369 * FUNCTION: AcpiUtGetInterface 00370 * 00371 * PARAMETERS: InterfaceName - The interface to find 00372 * 00373 * RETURN: ACPI_INTERFACE_INFO if found. NULL if not found. 00374 * 00375 * DESCRIPTION: Search for the specified interface name in the global list. 00376 * Caller MUST hold AcpiGbl_OsiMutex 00377 * 00378 ******************************************************************************/ 00379 00380 ACPI_INTERFACE_INFO * 00381 AcpiUtGetInterface ( 00382 ACPI_STRING InterfaceName) 00383 { 00384 ACPI_INTERFACE_INFO *NextInterface; 00385 00386 00387 NextInterface = AcpiGbl_SupportedInterfaces; 00388 while (NextInterface) 00389 { 00390 if (!ACPI_STRCMP (InterfaceName, NextInterface->Name)) 00391 { 00392 return (NextInterface); 00393 } 00394 00395 NextInterface = NextInterface->Next; 00396 } 00397 00398 return (NULL); 00399 } 00400 00401 00402 /******************************************************************************* 00403 * 00404 * FUNCTION: AcpiUtOsiImplementation 00405 * 00406 * PARAMETERS: WalkState - Current walk state 00407 * 00408 * RETURN: Status 00409 * 00410 * DESCRIPTION: Implementation of the _OSI predefined control method. When 00411 * an invocation of _OSI is encountered in the system AML, 00412 * control is transferred to this function. 00413 * 00414 ******************************************************************************/ 00415 00416 ACPI_STATUS 00417 AcpiUtOsiImplementation ( 00418 ACPI_WALK_STATE *WalkState) 00419 { 00420 ACPI_OPERAND_OBJECT *StringDesc; 00421 ACPI_OPERAND_OBJECT *ReturnDesc; 00422 ACPI_INTERFACE_INFO *InterfaceInfo; 00423 ACPI_INTERFACE_HANDLER InterfaceHandler; 00424 UINT32 ReturnValue; 00425 00426 00427 ACPI_FUNCTION_TRACE (UtOsiImplementation); 00428 00429 00430 /* Validate the string input argument (from the AML caller) */ 00431 00432 StringDesc = WalkState->Arguments[0].Object; 00433 if (!StringDesc || 00434 (StringDesc->Common.Type != ACPI_TYPE_STRING)) 00435 { 00436 return_ACPI_STATUS (AE_TYPE); 00437 } 00438 00439 /* Create a return object */ 00440 00441 ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); 00442 if (!ReturnDesc) 00443 { 00444 return_ACPI_STATUS (AE_NO_MEMORY); 00445 } 00446 00447 /* Default return value is 0, NOT SUPPORTED */ 00448 00449 ReturnValue = 0; 00450 (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); 00451 00452 /* Lookup the interface in the global _OSI list */ 00453 00454 InterfaceInfo = AcpiUtGetInterface (StringDesc->String.Pointer); 00455 if (InterfaceInfo && 00456 !(InterfaceInfo->Flags & ACPI_OSI_INVALID)) 00457 { 00458 /* 00459 * The interface is supported. 00460 * Update the OsiData if necessary. We keep track of the latest 00461 * version of Windows that has been requested by the BIOS. 00462 */ 00463 if (InterfaceInfo->Value > AcpiGbl_OsiData) 00464 { 00465 AcpiGbl_OsiData = InterfaceInfo->Value; 00466 } 00467 00468 ReturnValue = ACPI_UINT32_MAX; 00469 } 00470 00471 AcpiOsReleaseMutex (AcpiGbl_OsiMutex); 00472 00473 /* 00474 * Invoke an optional _OSI interface handler. The host OS may wish 00475 * to do some interface-specific handling. For example, warn about 00476 * certain interfaces or override the true/false support value. 00477 */ 00478 InterfaceHandler = AcpiGbl_InterfaceHandler; 00479 if (InterfaceHandler) 00480 { 00481 ReturnValue = InterfaceHandler ( 00482 StringDesc->String.Pointer, ReturnValue); 00483 } 00484 00485 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, 00486 "ACPI: BIOS _OSI(\"%s\") is %ssupported\n", 00487 StringDesc->String.Pointer, ReturnValue == 0 ? "not " : "")); 00488 00489 /* Complete the return object */ 00490 00491 ReturnDesc->Integer.Value = ReturnValue; 00492 WalkState->ReturnDesc = ReturnDesc; 00493 return_ACPI_STATUS (AE_OK); 00494 } Generated on Sat May 26 2012 04:25:57 for ReactOS by
1.7.6.1
|