1ae115bc7Smrj /******************************************************************************* 2ae115bc7Smrj * 3ae115bc7Smrj * Module Name: dmresrc.c - Resource Descriptor disassembly 4ae115bc7Smrj * 5ae115bc7Smrj ******************************************************************************/ 6ae115bc7Smrj 726f3cdf0SGordon Ross /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9ae115bc7Smrj * All rights reserved. 10ae115bc7Smrj * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 25ae115bc7Smrj * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 29ae115bc7Smrj * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 43ae115bc7Smrj 44ae115bc7Smrj #include "acpi.h" 45aa2aa9a6SDana Myers #include "accommon.h" 46ae115bc7Smrj #include "amlcode.h" 47ae115bc7Smrj #include "acdisasm.h" 48ae115bc7Smrj 49ae115bc7Smrj 50ae115bc7Smrj #define _COMPONENT ACPI_CA_DEBUGGER 51ae115bc7Smrj ACPI_MODULE_NAME ("dbresrc") 52ae115bc7Smrj 53ae115bc7Smrj 54ae115bc7Smrj /* Dispatch tables for Resource disassembly functions */ 55ae115bc7Smrj 56db2bae30SDana Myers static ACPI_RESOURCE_HANDLER AcpiGbl_DmResourceDispatch [] = 57ae115bc7Smrj { 58ae115bc7Smrj /* Small descriptors */ 59ae115bc7Smrj 60ae115bc7Smrj NULL, /* 0x00, Reserved */ 61ae115bc7Smrj NULL, /* 0x01, Reserved */ 62ae115bc7Smrj NULL, /* 0x02, Reserved */ 63ae115bc7Smrj NULL, /* 0x03, Reserved */ 64ae115bc7Smrj AcpiDmIrqDescriptor, /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */ 65ae115bc7Smrj AcpiDmDmaDescriptor, /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */ 66ae115bc7Smrj AcpiDmStartDependentDescriptor, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */ 67ae115bc7Smrj AcpiDmEndDependentDescriptor, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */ 68ae115bc7Smrj AcpiDmIoDescriptor, /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */ 69ae115bc7Smrj AcpiDmFixedIoDescriptor, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */ 70*385cc6b4SJerry Jelinek AcpiDmFixedDmaDescriptor, /* 0x0A, ACPI_RESOURCE_NAME_FIXED_DMA */ 71ae115bc7Smrj NULL, /* 0x0B, Reserved */ 72ae115bc7Smrj NULL, /* 0x0C, Reserved */ 73ae115bc7Smrj NULL, /* 0x0D, Reserved */ 74ae115bc7Smrj AcpiDmVendorSmallDescriptor, /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */ 75ae115bc7Smrj NULL, /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */ 76ae115bc7Smrj 77ae115bc7Smrj /* Large descriptors */ 78ae115bc7Smrj 79ae115bc7Smrj NULL, /* 0x00, Reserved */ 80ae115bc7Smrj AcpiDmMemory24Descriptor, /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */ 81ae115bc7Smrj AcpiDmGenericRegisterDescriptor,/* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */ 82ae115bc7Smrj NULL, /* 0x03, Reserved */ 83ae115bc7Smrj AcpiDmVendorLargeDescriptor, /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */ 84ae115bc7Smrj AcpiDmMemory32Descriptor, /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */ 85ae115bc7Smrj AcpiDmFixedMemory32Descriptor, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */ 86ae115bc7Smrj AcpiDmDwordDescriptor, /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */ 87ae115bc7Smrj AcpiDmWordDescriptor, /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */ 88ae115bc7Smrj AcpiDmInterruptDescriptor, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */ 89ae115bc7Smrj AcpiDmQwordDescriptor, /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */ 90*385cc6b4SJerry Jelinek AcpiDmExtendedDescriptor, /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */ 91*385cc6b4SJerry Jelinek AcpiDmGpioDescriptor, /* 0x0C, ACPI_RESOURCE_NAME_GPIO */ 92*385cc6b4SJerry Jelinek NULL, /* 0x0D, Reserved */ 93*385cc6b4SJerry Jelinek AcpiDmSerialBusDescriptor /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS */ 94ae115bc7Smrj }; 95ae115bc7Smrj 96ae115bc7Smrj 97ae115bc7Smrj /* Only used for single-threaded applications */ 98ae115bc7Smrj /* TBD: remove when name is passed as parameter to the dump functions */ 99ae115bc7Smrj 100ae115bc7Smrj static UINT32 ResourceName; 101ae115bc7Smrj 102ae115bc7Smrj 103ae115bc7Smrj /******************************************************************************* 104ae115bc7Smrj * 105ae115bc7Smrj * FUNCTION: AcpiDmDescriptorName 106ae115bc7Smrj * 107ae115bc7Smrj * PARAMETERS: None 108ae115bc7Smrj * 109ae115bc7Smrj * RETURN: None 110ae115bc7Smrj * 111ae115bc7Smrj * DESCRIPTION: Emit a name for the descriptor if one is present (indicated 112ae115bc7Smrj * by the name being changed from the default name.) A name is only 113ae115bc7Smrj * emitted if a reference to the descriptor has been made somewhere 114ae115bc7Smrj * in the original ASL code. 115ae115bc7Smrj * 116ae115bc7Smrj ******************************************************************************/ 117ae115bc7Smrj 118ae115bc7Smrj void 119ae115bc7Smrj AcpiDmDescriptorName ( 120ae115bc7Smrj void) 121ae115bc7Smrj { 122ae115bc7Smrj 123ae115bc7Smrj if (ResourceName == ACPI_DEFAULT_RESNAME) 124ae115bc7Smrj { 125ae115bc7Smrj return; 126ae115bc7Smrj } 127ae115bc7Smrj 128ae115bc7Smrj AcpiOsPrintf ("%4.4s", (char *) &ResourceName); 129ae115bc7Smrj } 130ae115bc7Smrj 131ae115bc7Smrj 132ae115bc7Smrj /******************************************************************************* 133ae115bc7Smrj * 134ae115bc7Smrj * FUNCTION: AcpiDmDumpInteger* 135ae115bc7Smrj * 136ae115bc7Smrj * PARAMETERS: Value - Value to emit 137ae115bc7Smrj * Name - Associated name (emitted as a comment) 138ae115bc7Smrj * 139ae115bc7Smrj * RETURN: None 140ae115bc7Smrj * 141ae115bc7Smrj * DESCRIPTION: Integer output helper functions 142ae115bc7Smrj * 143ae115bc7Smrj ******************************************************************************/ 144ae115bc7Smrj 145ae115bc7Smrj void 146ae115bc7Smrj AcpiDmDumpInteger8 ( 147ae115bc7Smrj UINT8 Value, 148*385cc6b4SJerry Jelinek const char *Name) 149ae115bc7Smrj { 150ae115bc7Smrj AcpiOsPrintf ("0x%2.2X, // %s\n", Value, Name); 151ae115bc7Smrj } 152ae115bc7Smrj 153ae115bc7Smrj void 154ae115bc7Smrj AcpiDmDumpInteger16 ( 155ae115bc7Smrj UINT16 Value, 156*385cc6b4SJerry Jelinek const char *Name) 157ae115bc7Smrj { 158ae115bc7Smrj AcpiOsPrintf ("0x%4.4X, // %s\n", Value, Name); 159ae115bc7Smrj } 160ae115bc7Smrj 161ae115bc7Smrj void 162ae115bc7Smrj AcpiDmDumpInteger32 ( 163ae115bc7Smrj UINT32 Value, 164*385cc6b4SJerry Jelinek const char *Name) 165ae115bc7Smrj { 166ae115bc7Smrj AcpiOsPrintf ("0x%8.8X, // %s\n", Value, Name); 167ae115bc7Smrj } 168ae115bc7Smrj 169ae115bc7Smrj void 170ae115bc7Smrj AcpiDmDumpInteger64 ( 171ae115bc7Smrj UINT64 Value, 172*385cc6b4SJerry Jelinek const char *Name) 173ae115bc7Smrj { 174db2bae30SDana Myers AcpiOsPrintf ("0x%8.8X%8.8X, // %s\n", ACPI_FORMAT_UINT64 (Value), Name); 175ae115bc7Smrj } 176ae115bc7Smrj 177ae115bc7Smrj 178ae115bc7Smrj /******************************************************************************* 179ae115bc7Smrj * 180ae115bc7Smrj * FUNCTION: AcpiDmBitList 181ae115bc7Smrj * 182ae115bc7Smrj * PARAMETERS: Mask - 16-bit value corresponding to 16 interrupt 183ae115bc7Smrj * or DMA values 184ae115bc7Smrj * 185ae115bc7Smrj * RETURN: None 186ae115bc7Smrj * 187ae115bc7Smrj * DESCRIPTION: Dump a bit mask as a list of individual interrupt/DMA levels. 188ae115bc7Smrj * 189ae115bc7Smrj ******************************************************************************/ 190ae115bc7Smrj 191ae115bc7Smrj void 192ae115bc7Smrj AcpiDmBitList ( 193ae115bc7Smrj UINT16 Mask) 194ae115bc7Smrj { 195ae115bc7Smrj UINT32 i; 196ae115bc7Smrj BOOLEAN Previous = FALSE; 197ae115bc7Smrj 198ae115bc7Smrj 199ae115bc7Smrj /* Open the initializer list */ 200ae115bc7Smrj 201ae115bc7Smrj AcpiOsPrintf ("{"); 202ae115bc7Smrj 203ae115bc7Smrj /* Examine each bit */ 204ae115bc7Smrj 205ae115bc7Smrj for (i = 0; i < 16; i++) 206ae115bc7Smrj { 207ae115bc7Smrj /* Only interested in bits that are set to 1 */ 208ae115bc7Smrj 209ae115bc7Smrj if (Mask & 1) 210ae115bc7Smrj { 211ae115bc7Smrj if (Previous) 212ae115bc7Smrj { 213ae115bc7Smrj AcpiOsPrintf (","); 214ae115bc7Smrj } 215*385cc6b4SJerry Jelinek 216ae115bc7Smrj Previous = TRUE; 21726f3cdf0SGordon Ross AcpiOsPrintf ("%u", i); 218ae115bc7Smrj } 219ae115bc7Smrj 220ae115bc7Smrj Mask >>= 1; 221ae115bc7Smrj } 222ae115bc7Smrj 223ae115bc7Smrj /* Close list */ 224ae115bc7Smrj 225ae115bc7Smrj AcpiOsPrintf ("}\n"); 226ae115bc7Smrj } 227ae115bc7Smrj 228ae115bc7Smrj 229ae115bc7Smrj /******************************************************************************* 230ae115bc7Smrj * 231ae115bc7Smrj * FUNCTION: AcpiDmResourceTemplate 232ae115bc7Smrj * 233ae115bc7Smrj * PARAMETERS: Info - Curent parse tree walk info 234ae115bc7Smrj * ByteData - Pointer to the byte list data 235ae115bc7Smrj * ByteCount - Length of the byte list 236ae115bc7Smrj * 237ae115bc7Smrj * RETURN: None 238ae115bc7Smrj * 239ae115bc7Smrj * DESCRIPTION: Dump the contents of a Resource Template containing a set of 240ae115bc7Smrj * Resource Descriptors. 241ae115bc7Smrj * 242ae115bc7Smrj ******************************************************************************/ 243ae115bc7Smrj 244ae115bc7Smrj void 245ae115bc7Smrj AcpiDmResourceTemplate ( 246ae115bc7Smrj ACPI_OP_WALK_INFO *Info, 247ae115bc7Smrj ACPI_PARSE_OBJECT *Op, 248ae115bc7Smrj UINT8 *ByteData, 249ae115bc7Smrj UINT32 ByteCount) 250ae115bc7Smrj { 251ae115bc7Smrj ACPI_STATUS Status; 252db2bae30SDana Myers UINT32 CurrentByteOffset; 253ae115bc7Smrj UINT8 ResourceType; 254ae115bc7Smrj UINT32 ResourceLength; 255ae115bc7Smrj void *Aml; 256ae115bc7Smrj UINT32 Level; 257ae115bc7Smrj BOOLEAN DependentFns = FALSE; 258ae115bc7Smrj UINT8 ResourceIndex; 259ae115bc7Smrj ACPI_NAMESPACE_NODE *Node; 260ae115bc7Smrj 261ae115bc7Smrj 262*385cc6b4SJerry Jelinek if (Op->Asl.AmlOpcode != AML_FIELD_OP) 263*385cc6b4SJerry Jelinek { 264*385cc6b4SJerry Jelinek Info->MappingOp = Op; 265*385cc6b4SJerry Jelinek } 266*385cc6b4SJerry Jelinek 267ae115bc7Smrj Level = Info->Level; 268ae115bc7Smrj ResourceName = ACPI_DEFAULT_RESNAME; 269ae115bc7Smrj Node = Op->Common.Node; 270ae115bc7Smrj if (Node) 271ae115bc7Smrj { 272ae115bc7Smrj Node = Node->Child; 273ae115bc7Smrj } 274ae115bc7Smrj 275ae115bc7Smrj for (CurrentByteOffset = 0; CurrentByteOffset < ByteCount;) 276ae115bc7Smrj { 277ae115bc7Smrj Aml = &ByteData[CurrentByteOffset]; 278ae115bc7Smrj 279ae115bc7Smrj /* Get the descriptor type and length */ 280ae115bc7Smrj 281ae115bc7Smrj ResourceType = AcpiUtGetResourceType (Aml); 282ae115bc7Smrj ResourceLength = AcpiUtGetResourceLength (Aml); 283ae115bc7Smrj 284ae115bc7Smrj /* Validate the Resource Type and Resource Length */ 285ae115bc7Smrj 286*385cc6b4SJerry Jelinek Status = AcpiUtValidateResource (NULL, Aml, &ResourceIndex); 287ae115bc7Smrj if (ACPI_FAILURE (Status)) 288ae115bc7Smrj { 289*385cc6b4SJerry Jelinek AcpiOsPrintf ( 290*385cc6b4SJerry Jelinek "/*** Could not validate Resource, type (%X) %s***/\n", 291ae115bc7Smrj ResourceType, AcpiFormatException (Status)); 292ae115bc7Smrj return; 293ae115bc7Smrj } 294ae115bc7Smrj 295ae115bc7Smrj /* Point to next descriptor */ 296ae115bc7Smrj 297ae115bc7Smrj CurrentByteOffset += AcpiUtGetDescriptorLength (Aml); 298ae115bc7Smrj 299ae115bc7Smrj /* Descriptor pre-processing */ 300ae115bc7Smrj 301ae115bc7Smrj switch (ResourceType) 302ae115bc7Smrj { 303ae115bc7Smrj case ACPI_RESOURCE_NAME_START_DEPENDENT: 304ae115bc7Smrj 305ae115bc7Smrj /* Finish a previous StartDependentFns */ 306ae115bc7Smrj 307ae115bc7Smrj if (DependentFns) 308ae115bc7Smrj { 309ae115bc7Smrj Level--; 310ae115bc7Smrj AcpiDmIndent (Level); 311ae115bc7Smrj AcpiOsPrintf ("}\n"); 312ae115bc7Smrj } 313ae115bc7Smrj break; 314ae115bc7Smrj 315ae115bc7Smrj case ACPI_RESOURCE_NAME_END_DEPENDENT: 316ae115bc7Smrj 317ae115bc7Smrj Level--; 318ae115bc7Smrj DependentFns = FALSE; 319ae115bc7Smrj break; 320ae115bc7Smrj 321ae115bc7Smrj case ACPI_RESOURCE_NAME_END_TAG: 322ae115bc7Smrj 323ae115bc7Smrj /* Normal exit, the resource list is finished */ 324ae115bc7Smrj 325ae115bc7Smrj if (DependentFns) 326ae115bc7Smrj { 327ae115bc7Smrj /* 328ae115bc7Smrj * Close an open StartDependentDescriptor. This indicates a 329ae115bc7Smrj * missing EndDependentDescriptor. 330ae115bc7Smrj */ 331ae115bc7Smrj Level--; 332ae115bc7Smrj DependentFns = FALSE; 333ae115bc7Smrj 334ae115bc7Smrj /* Go ahead and insert EndDependentFn() */ 335ae115bc7Smrj 336*385cc6b4SJerry Jelinek AcpiDmEndDependentDescriptor (Info, Aml, ResourceLength, Level); 337ae115bc7Smrj 338ae115bc7Smrj AcpiDmIndent (Level); 339ae115bc7Smrj AcpiOsPrintf ( 340*385cc6b4SJerry Jelinek "/*** Disassembler: inserted " 341*385cc6b4SJerry Jelinek "missing EndDependentFn () ***/\n"); 342ae115bc7Smrj } 343ae115bc7Smrj return; 344ae115bc7Smrj 345ae115bc7Smrj default: 346*385cc6b4SJerry Jelinek 347ae115bc7Smrj break; 348ae115bc7Smrj } 349ae115bc7Smrj 350ae115bc7Smrj /* Disassemble the resource structure */ 351ae115bc7Smrj 352ae115bc7Smrj if (Node) 353ae115bc7Smrj { 354ae115bc7Smrj ResourceName = Node->Name.Integer; 355ae115bc7Smrj Node = Node->Peer; 356ae115bc7Smrj } 357ae115bc7Smrj 358db2bae30SDana Myers AcpiGbl_DmResourceDispatch [ResourceIndex] ( 359*385cc6b4SJerry Jelinek Info, Aml, ResourceLength, Level); 360ae115bc7Smrj 361ae115bc7Smrj /* Descriptor post-processing */ 362ae115bc7Smrj 363ae115bc7Smrj if (ResourceType == ACPI_RESOURCE_NAME_START_DEPENDENT) 364ae115bc7Smrj { 365ae115bc7Smrj DependentFns = TRUE; 366ae115bc7Smrj Level++; 367ae115bc7Smrj } 368ae115bc7Smrj } 369ae115bc7Smrj } 370ae115bc7Smrj 371ae115bc7Smrj 372ae115bc7Smrj /******************************************************************************* 373ae115bc7Smrj * 374ae115bc7Smrj * FUNCTION: AcpiDmIsResourceTemplate 375ae115bc7Smrj * 376*385cc6b4SJerry Jelinek * PARAMETERS: WalkState - Current walk info 377*385cc6b4SJerry Jelinek * Op - Buffer Op to be examined 378ae115bc7Smrj * 379db2bae30SDana Myers * RETURN: Status. AE_OK if valid template 380ae115bc7Smrj * 381ae115bc7Smrj * DESCRIPTION: Walk a byte list to determine if it consists of a valid set 382ae115bc7Smrj * of resource descriptors. Nothing is output. 383ae115bc7Smrj * 384ae115bc7Smrj ******************************************************************************/ 385ae115bc7Smrj 386db2bae30SDana Myers ACPI_STATUS 387ae115bc7Smrj AcpiDmIsResourceTemplate ( 388*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState, 389ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 390ae115bc7Smrj { 391ae115bc7Smrj ACPI_STATUS Status; 392ae115bc7Smrj ACPI_PARSE_OBJECT *NextOp; 393ae115bc7Smrj UINT8 *Aml; 394ae115bc7Smrj UINT8 *EndAml; 395ae115bc7Smrj ACPI_SIZE Length; 396ae115bc7Smrj 397ae115bc7Smrj 398ae115bc7Smrj /* This op must be a buffer */ 399ae115bc7Smrj 400ae115bc7Smrj if (Op->Common.AmlOpcode != AML_BUFFER_OP) 401ae115bc7Smrj { 402db2bae30SDana Myers return (AE_TYPE); 403ae115bc7Smrj } 404ae115bc7Smrj 405ae115bc7Smrj /* Get the ByteData list and length */ 406ae115bc7Smrj 407ae115bc7Smrj NextOp = Op->Common.Value.Arg; 408*385cc6b4SJerry Jelinek if (!NextOp) 409*385cc6b4SJerry Jelinek { 410*385cc6b4SJerry Jelinek AcpiOsPrintf ("NULL byte list in buffer\n"); 411*385cc6b4SJerry Jelinek return (AE_TYPE); 412*385cc6b4SJerry Jelinek } 413*385cc6b4SJerry Jelinek 414ae115bc7Smrj NextOp = NextOp->Common.Next; 415ae115bc7Smrj if (!NextOp) 416ae115bc7Smrj { 417db2bae30SDana Myers return (AE_TYPE); 418ae115bc7Smrj } 419ae115bc7Smrj 420ae115bc7Smrj Aml = NextOp->Named.Data; 421ae115bc7Smrj Length = (ACPI_SIZE) NextOp->Common.Value.Integer; 422ae115bc7Smrj 423ae115bc7Smrj /* Walk the byte list, abort on any invalid descriptor type or length */ 424ae115bc7Smrj 425*385cc6b4SJerry Jelinek Status = AcpiUtWalkAmlResources (WalkState, Aml, Length, 426*385cc6b4SJerry Jelinek NULL, ACPI_CAST_INDIRECT_PTR (void, &EndAml)); 427ae115bc7Smrj if (ACPI_FAILURE (Status)) 428ae115bc7Smrj { 429db2bae30SDana Myers return (AE_TYPE); 430ae115bc7Smrj } 431ae115bc7Smrj 432ae115bc7Smrj /* 433ae115bc7Smrj * For the resource template to be valid, one EndTag must appear 434ae115bc7Smrj * at the very end of the ByteList, not before. (For proper disassembly 435ae115bc7Smrj * of a ResourceTemplate, the buffer must not have any extra data after 436ae115bc7Smrj * the EndTag.) 437ae115bc7Smrj */ 438ae115bc7Smrj if ((Aml + Length - sizeof (AML_RESOURCE_END_TAG)) != EndAml) 439ae115bc7Smrj { 440db2bae30SDana Myers return (AE_AML_NO_RESOURCE_END_TAG); 441ae115bc7Smrj } 442ae115bc7Smrj 443ae115bc7Smrj /* 444ae115bc7Smrj * All resource descriptors are valid, therefore this list appears 445ae115bc7Smrj * to be a valid resource template 446ae115bc7Smrj */ 447db2bae30SDana Myers return (AE_OK); 448ae115bc7Smrj } 449