From patchwork Sun Jul 4 04:43:35 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mattia Dongili X-Patchwork-Id: 110087 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.4/8.14.3) with ESMTP id o644p9A0023105 for ; Sun, 4 Jul 2010 04:51:11 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752603Ab0GDEvJ (ORCPT ); Sun, 4 Jul 2010 00:51:09 -0400 Received: from static-220-247-10-204.b-man.svips.gol.ne.jp ([220.247.10.204]:49570 "EHLO smtp.kamineko.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752474Ab0GDEvB (ORCPT ); Sun, 4 Jul 2010 00:51:01 -0400 X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Sun, 04 Jul 2010 04:51:11 +0000 (UTC) X-Greylist: delayed 367 seconds by postgrey-1.27 at vger.kernel.org; Sun, 04 Jul 2010 00:51:00 EDT Received: from caligola.kamineko.org (caligola.kamineko.org [192.168.1.36]) by smtp.kamineko.org (Postfix) with ESMTPSA id 581786B800; Sun, 4 Jul 2010 13:44:51 +0900 (JST) Received: by caligola.kamineko.org (Postfix, from userid 1000) id 405C015E8F; Sun, 4 Jul 2010 13:44:51 +0900 (JST) Message-Id: <20100704044451.040004599@linux.it> User-Agent: quilt/0.48-1 Date: Sun, 04 Jul 2010 13:43:35 +0900 From: malattia@linux.it To: Robert Moore Cc: Len Brown , linux-acpi@vger.kernel.org, Mattia Dongili Subject: [patch 3/5] Support compiling DSDT tables on big endian architectures References: <20100704044332.573836359@linux.it> Content-Disposition: inline; filename=big_endian.patch Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org Index: b/include/platform/aclinux.h =================================================================== --- a/include/platform/aclinux.h 2010-07-02 21:42:26.833348957 +0900 +++ b/include/platform/aclinux.h 2010-07-04 11:18:19.486018564 +0900 @@ -156,13 +156,14 @@ #include #include #include +#include /* Host-dependent types and defines for user-space ACPICA */ #define ACPI_FLUSH_CPU_CACHE() #define ACPI_THREAD_ID pthread_t -#if defined(__ia64__) || defined(__x86_64__) +#if defined(__ia64__) || defined(__x86_64__) || defined(__alpha__) #define ACPI_MACHINE_WIDTH 64 #define COMPILER_DEPENDENT_INT64 long #define COMPILER_DEPENDENT_UINT64 unsigned long @@ -173,6 +174,10 @@ #define ACPI_USE_NATIVE_DIVIDE #endif +#if __BYTE_ORDER == __BIG_ENDIAN +#define ACPI_BIG_ENDIAN +#endif + #ifndef __cdecl #define __cdecl #endif Index: b/compiler/aslcodegen.c =================================================================== --- a/compiler/aslcodegen.c 2010-07-02 21:42:26.601348618 +0900 +++ b/compiler/aslcodegen.c 2010-07-04 11:18:19.490018083 +0900 @@ -311,16 +311,12 @@ ACPI_PARSE_OBJECT *Op) { UINT8 PkgLenFirstByte; - UINT32 i; - union { - UINT16 Opcode; - UINT8 OpcodeBytes[2]; - } Aml; - union { - UINT32 Len; - UINT8 LenBytes[4]; - } PkgLen; - + UINT8 Byte; + UINT16 Word; + UINT32 DWord; + UINT64 QWord; + UINT16 AmlOpcode; + UINT32 PkgLen; /* We expect some DEFAULT_ARGs, just ignore them */ @@ -343,45 +339,46 @@ /* Special opcodes for within a field definition */ - Aml.Opcode = 0x00; + AmlOpcode = 0x00; break; case AML_INT_ACCESSFIELD_OP: - Aml.Opcode = 0x01; + AmlOpcode = 0x01; break; default: - Aml.Opcode = Op->Asl.AmlOpcode; + AmlOpcode = Op->Asl.AmlOpcode; break; } - switch (Aml.Opcode) + switch (AmlOpcode) { case AML_PACKAGE_LENGTH: /* Value is the length to be encoded (Used in field definitions) */ - PkgLen.Len = (UINT32) Op->Asl.Value.Integer; + PkgLen = (UINT32) Op->Asl.Value.Integer; break; default: /* Check for two-byte opcode */ - if (Aml.Opcode > 0x00FF) + if (AmlOpcode > 0x00FF) { /* Write the high byte first */ - - CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[1], 1); + Byte = ACPI_HIBYTE(AmlOpcode); + CgLocalWriteAmlData (Op, &Byte, 1); } - CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[0], 1); + Byte = ACPI_LOBYTE(AmlOpcode); + CgLocalWriteAmlData (Op, &Byte, 1); /* Subtreelength doesn't include length of package length bytes */ - PkgLen.Len = Op->Asl.AmlSubtreeLength + Op->Asl.AmlPkgLenBytes; + PkgLen = Op->Asl.AmlSubtreeLength + Op->Asl.AmlPkgLenBytes; break; } @@ -392,8 +389,8 @@ if (Op->Asl.AmlPkgLenBytes == 1) { /* Simplest case -- no bytes to follow, just write the count */ - - CgLocalWriteAmlData (Op, &PkgLen.LenBytes[0], 1); + Byte = ACPI_LOBYTE(PkgLen); + CgLocalWriteAmlData (Op, &Byte, 1); } else if (Op->Asl.AmlPkgLenBytes != 0) { @@ -403,7 +400,7 @@ */ PkgLenFirstByte = (UINT8) (((UINT32) (Op->Asl.AmlPkgLenBytes - 1) << 6) | - (PkgLen.LenBytes[0] & 0x0F)); + (PkgLen & 0x0F)); CgLocalWriteAmlData (Op, &PkgLenFirstByte, 1); @@ -411,37 +408,44 @@ * Shift the length over by the 4 bits we just stuffed * in the first byte */ - PkgLen.Len >>= 4; + PkgLen >>= 4; /* Now we can write the remaining bytes - either 1, 2, or 3 bytes */ - - for (i = 0; i < (UINT32) (Op->Asl.AmlPkgLenBytes - 1); i++) + Byte = ACPI_LOBYTE(PkgLen); + CgLocalWriteAmlData (Op, &Byte, 1); + if (Op->Asl.AmlPkgLenBytes >= 3) + { + Byte = ACPI_HIBYTE(PkgLen); + CgLocalWriteAmlData (Op, &Byte, 1); + } + if (Op->Asl.AmlPkgLenBytes >= 4) { - CgLocalWriteAmlData (Op, &PkgLen.LenBytes[i], 1); + Byte = ACPI_LOBYTE(ACPI_HIWORD(PkgLen)); + CgLocalWriteAmlData (Op, &Byte, 1); } } } - switch (Aml.Opcode) + switch (AmlOpcode) { case AML_BYTE_OP: - - CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 1); + Byte = (UINT8) Op->Asl.Value.Integer; + CgLocalWriteAmlData (Op, &Byte, 1); break; case AML_WORD_OP: - - CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 2); + ACPI_MOVE_64_TO_16(&Word, &Op->Asl.Value.Integer); + CgLocalWriteAmlData (Op, &Word, 2); break; case AML_DWORD_OP: - - CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 4); + ACPI_MOVE_64_TO_32(&DWord, &Op->Asl.Value.Integer); + CgLocalWriteAmlData (Op, &DWord, 4); break; case AML_QWORD_OP: - - CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 8); + ACPI_MOVE_64_TO_64(&QWord, &Op->Asl.Value.Integer); + CgLocalWriteAmlData (Op, &QWord, 8); break; case AML_STRING_OP: @@ -473,6 +477,7 @@ ACPI_PARSE_OBJECT *Op) { ACPI_PARSE_OBJECT *Child; + UINT32 DWord; /* AML filename */ @@ -509,19 +514,19 @@ /* OEM Revision */ Child = Child->Asl.Next; - TableHeader.OemRevision = (UINT32) Child->Asl.Value.Integer; + ACPI_MOVE_64_TO_32(&TableHeader.OemRevision, &Child->Asl.Value.Integer); /* Compiler ID */ strncpy (TableHeader.AslCompilerId, CompilerCreatorId, 4); /* Compiler version */ - - TableHeader.AslCompilerRevision = CompilerCreatorRevision; + DWord = CompilerCreatorRevision; + ACPI_MOVE_32_TO_32(&TableHeader.AslCompilerRevision, &DWord); /* Table length. Checksum zero for now, will rewrite later */ - TableHeader.Length = Gbl_TableLength; + ACPI_MOVE_32_TO_32(&TableHeader.Length, &Gbl_TableLength); TableHeader.Checksum = 0; CgLocalWriteAmlData (Op, &TableHeader, sizeof (ACPI_TABLE_HEADER)); @@ -585,7 +590,10 @@ ACPI_PARSE_OBJECT *Op) { ASL_RESOURCE_NODE *Rnode; - + UINT8 Byte; + UINT16 Word; + UINT32 DWord; + UINT64 QWord; /* Always check for DEFAULT_ARG and other "Noop" nodes */ /* TBD: this may not be the best place for this check */ @@ -603,13 +611,24 @@ switch (Op->Asl.AmlOpcode) { case AML_RAW_DATA_BYTE: + Byte = (UINT8) Op->Asl.Value.Integer; + CgLocalWriteAmlData (Op, &Byte, 1); + return; + case AML_RAW_DATA_WORD: - case AML_RAW_DATA_DWORD: - case AML_RAW_DATA_QWORD: + ACPI_MOVE_64_TO_16(&Word, &Op->Asl.Value.Integer); + CgLocalWriteAmlData (Op, &Word, 2); + return; - CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, Op->Asl.AmlLength); + case AML_RAW_DATA_DWORD: + ACPI_MOVE_64_TO_32(&DWord, &Op->Asl.Value.Integer); + CgLocalWriteAmlData (Op, &DWord, 4); return; + case AML_RAW_DATA_QWORD: + ACPI_MOVE_64_TO_64(&QWord, &Op->Asl.Value.Integer); + CgLocalWriteAmlData (Op, &QWord, 8); + return; case AML_RAW_DATA_BUFFER: Index: b/compiler/aslopcodes.c =================================================================== --- a/compiler/aslopcodes.c 2010-07-02 21:42:26.613360661 +0900 +++ b/compiler/aslopcodes.c 2010-07-04 11:18:19.490018083 +0900 @@ -449,6 +449,7 @@ UINT32 i; UINT8 *AsciiString; UINT16 *UnicodeString; + UINT16 UChar; ACPI_PARSE_OBJECT *BufferLengthOp; @@ -475,7 +476,8 @@ for (i = 0; i < Count; i++) { - UnicodeString[i] = (UINT16) AsciiString[i]; + UChar = (UINT16) AsciiString[i]; + ACPI_MOVE_16_TO_16(&UnicodeString[i], &UChar); } /* Index: b/compiler/aslrestype1.c =================================================================== --- a/compiler/aslrestype1.c 2010-07-02 21:42:26.661349406 +0900 +++ b/compiler/aslrestype1.c 2010-07-04 11:18:19.490018083 +0900 @@ -226,6 +226,11 @@ ACPI_PARSE_OBJECT *LengthOp = NULL; ACPI_PARSE_OBJECT *AlignOp = NULL; ASL_RESOURCE_NODE *Rnode; + UINT16 Minimum = 0; + UINT16 Maximum = 0; + UINT16 AddressLength = 0; + UINT16 Alignment = 0; + UINT16 ResourceLength; UINT32 i; @@ -234,7 +239,8 @@ Descriptor = Rnode->Buffer; Descriptor->Memory24.DescriptorType = ACPI_RESOURCE_NAME_MEMORY24; - Descriptor->Memory24.ResourceLength = 9; + ResourceLength = 9; + ACPI_MOVE_16_TO_16(&Descriptor->Memory24.ResourceLength, &ResourceLength); /* Process all child initialization nodes */ @@ -251,7 +257,7 @@ case 1: /* Min Address */ - Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum)); MinOp = InitializerOp; @@ -259,7 +265,7 @@ case 2: /* Max Address */ - Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum)); MaxOp = InitializerOp; @@ -267,7 +273,7 @@ case 3: /* Alignment */ - Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer; + Alignment = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT, CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment)); AlignOp = InitializerOp; @@ -275,7 +281,7 @@ case 4: /* Length */ - Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength)); LengthOp = InitializerOp; @@ -298,12 +304,17 @@ /* Validate the Min/Max/Len/Align values (Alignment==0 means 64K) */ RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY24, - Descriptor->Memory24.Minimum, - Descriptor->Memory24.Maximum, - Descriptor->Memory24.AddressLength, - Descriptor->Memory24.Alignment, + Minimum, + Maximum, + AddressLength, + Alignment, MinOp, MaxOp, LengthOp, NULL); + ACPI_MOVE_16_TO_16(&Descriptor->Memory24.Minimum, &Minimum); + ACPI_MOVE_16_TO_16(&Descriptor->Memory24.Maximum, &Maximum); + ACPI_MOVE_16_TO_16(&Descriptor->Memory24.AddressLength, &AddressLength); + ACPI_MOVE_16_TO_16(&Descriptor->Memory24.Alignment, &Alignment); + return (Rnode); } @@ -334,6 +345,11 @@ ACPI_PARSE_OBJECT *LengthOp = NULL; ACPI_PARSE_OBJECT *AlignOp = NULL; ASL_RESOURCE_NODE *Rnode; + UINT32 Minimum = 0; + UINT32 Maximum = 0; + UINT32 AddressLength = 0; + UINT32 Alignment = 0; + UINT16 ResourceLength; UINT32 i; @@ -342,7 +358,8 @@ Descriptor = Rnode->Buffer; Descriptor->Memory32.DescriptorType = ACPI_RESOURCE_NAME_MEMORY32; - Descriptor->Memory32.ResourceLength = 17; + ResourceLength = 17; + ACPI_MOVE_16_TO_16(&Descriptor->Memory32.ResourceLength, &ResourceLength); /* Process all child initialization nodes */ @@ -359,7 +376,7 @@ case 1: /* Min Address */ - Descriptor->Memory32.Minimum = (UINT32) InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Minimum)); MinOp = InitializerOp; @@ -367,7 +384,7 @@ case 2: /* Max Address */ - Descriptor->Memory32.Maximum = (UINT32) InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Maximum)); MaxOp = InitializerOp; @@ -375,7 +392,7 @@ case 3: /* Alignment */ - Descriptor->Memory32.Alignment = (UINT32) InitializerOp->Asl.Value.Integer; + Alignment = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT, CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Alignment)); AlignOp = InitializerOp; @@ -383,7 +400,7 @@ case 4: /* Length */ - Descriptor->Memory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.AddressLength)); LengthOp = InitializerOp; @@ -406,12 +423,17 @@ /* Validate the Min/Max/Len/Align values */ RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY32, - Descriptor->Memory32.Minimum, - Descriptor->Memory32.Maximum, - Descriptor->Memory32.AddressLength, - Descriptor->Memory32.Alignment, + Minimum, + Maximum, + AddressLength, + Alignment, MinOp, MaxOp, LengthOp, AlignOp); + ACPI_MOVE_32_TO_32(&Descriptor->Memory32.Minimum, &Minimum); + ACPI_MOVE_32_TO_32(&Descriptor->Memory32.Maximum, &Maximum); + ACPI_MOVE_32_TO_32(&Descriptor->Memory32.AddressLength, &AddressLength); + ACPI_MOVE_32_TO_32(&Descriptor->Memory32.Alignment, &Alignment); + return (Rnode); } @@ -438,6 +460,7 @@ AML_RESOURCE *Descriptor; ACPI_PARSE_OBJECT *InitializerOp; ASL_RESOURCE_NODE *Rnode; + UINT16 ResourceLength; UINT32 i; @@ -446,7 +469,8 @@ Descriptor = Rnode->Buffer; Descriptor->FixedMemory32.DescriptorType = ACPI_RESOURCE_NAME_FIXED_MEMORY32; - Descriptor->FixedMemory32.ResourceLength = 9; + ResourceLength = 9; + ACPI_MOVE_16_TO_16(&Descriptor->FixedMemory32.ResourceLength, &ResourceLength); /* Process all child initialization nodes */ @@ -463,14 +487,16 @@ case 1: /* Address */ - Descriptor->FixedMemory32.Address = (UINT32) InitializerOp->Asl.Value.Integer; + ACPI_MOVE_64_TO_32(&Descriptor->FixedMemory32.Address, + &InitializerOp->Asl.Value.Integer); RsCreateByteField (InitializerOp, ACPI_RESTAG_BASEADDRESS, CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Address)); break; case 2: /* Length */ - Descriptor->FixedMemory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer; + ACPI_MOVE_64_TO_32(&Descriptor->FixedMemory32.AddressLength, + &InitializerOp->Asl.Value.Integer); RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength)); break; Index: b/compiler/aslrestype1i.c =================================================================== --- a/compiler/aslrestype1i.c 2010-07-02 21:42:26.649349305 +0900 +++ b/compiler/aslrestype1i.c 2010-07-04 11:18:19.494017882 +0900 @@ -275,6 +275,7 @@ ACPI_PARSE_OBJECT *InitializerOp; ACPI_PARSE_OBJECT *AddressOp = NULL; ASL_RESOURCE_NODE *Rnode; + UINT16 Address = 0; UINT32 i; @@ -293,8 +294,7 @@ { case 0: /* Base Address */ - Descriptor->FixedIo.Address = - (UINT16) InitializerOp->Asl.Value.Integer; + Address = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_BASEADDRESS, CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.Address)); AddressOp = InitializerOp; @@ -324,11 +324,13 @@ /* Error checks */ - if (Descriptor->FixedIo.Address > 0x03FF) + if (Address > 0x03FF) { AslError (ASL_WARNING, ASL_MSG_ISA_ADDRESS, AddressOp, NULL); } + ACPI_MOVE_16_TO_16(&Descriptor->FixedIo.Address, &Address); + return (Rnode); } @@ -359,6 +361,8 @@ ACPI_PARSE_OBJECT *LengthOp = NULL; ACPI_PARSE_OBJECT *AlignOp = NULL; ASL_RESOURCE_NODE *Rnode; + UINT16 Minimum = 0; + UINT16 Maximum = 0; UINT32 i; @@ -384,8 +388,7 @@ case 1: /* Min Address */ - Descriptor->Io.Minimum = - (UINT16) InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Minimum)); MinOp = InitializerOp; @@ -393,8 +396,7 @@ case 2: /* Max Address */ - Descriptor->Io.Maximum = - (UINT16) InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Maximum)); MaxOp = InitializerOp; @@ -435,12 +437,15 @@ /* Validate the Min/Max/Len/Align values */ RsSmallAddressCheck (ACPI_RESOURCE_NAME_IO, - Descriptor->Io.Minimum, - Descriptor->Io.Maximum, + Minimum, + Maximum, Descriptor->Io.AddressLength, Descriptor->Io.Alignment, MinOp, MaxOp, LengthOp, AlignOp); + ACPI_MOVE_16_TO_16(&Descriptor->Io.Minimum, &Minimum); + ACPI_MOVE_16_TO_16(&Descriptor->Io.Maximum, &Maximum); + return (Rnode); } @@ -561,9 +566,9 @@ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); } - /* Now we can set the channel mask */ + /* Now we can set the interrupt mask */ - Descriptor->Irq.IrqMask = IrqMask; + ACPI_MOVE_16_TO_16(&Descriptor->Irq.IrqMask, &IrqMask); return (Rnode); } @@ -663,6 +668,6 @@ /* Now we can set the interrupt mask */ - Descriptor->Irq.IrqMask = IrqMask; + ACPI_MOVE_16_TO_16(&Descriptor->Irq.IrqMask, &IrqMask); return (Rnode); } Index: b/compiler/aslrestype2.c =================================================================== --- a/compiler/aslrestype2.c 2010-07-02 21:42:26.625349241 +0900 +++ b/compiler/aslrestype2.c 2010-07-04 11:18:19.494017882 +0900 @@ -152,6 +152,7 @@ AML_RESOURCE *Descriptor; ACPI_PARSE_OBJECT *InitializerOp; ASL_RESOURCE_NODE *Rnode; + UINT16 ResourceLength; UINT32 i; @@ -160,7 +161,9 @@ Descriptor = Rnode->Buffer; Descriptor->GenericReg.DescriptorType = ACPI_RESOURCE_NAME_GENERIC_REGISTER; - Descriptor->GenericReg.ResourceLength = 12; + ResourceLength = 12; + ACPI_MOVE_16_TO_16(&Descriptor->GenericReg.ResourceLength, + &ResourceLength); /* Process all child initialization nodes */ @@ -191,7 +194,8 @@ case 3: /* Register Address */ - Descriptor->GenericReg.Address = InitializerOp->Asl.Value.Integer; + ACPI_MOVE_64_TO_64(&Descriptor->GenericReg.Address, + &InitializerOp->Asl.Value.Integer); RsCreateByteField (InitializerOp, ACPI_RESTAG_ADDRESS, CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.Address)); break; @@ -249,6 +253,7 @@ AML_RESOURCE *Rover = NULL; ACPI_PARSE_OBJECT *InitializerOp; ASL_RESOURCE_NODE *Rnode; + UINT16 ResourceLength = 0; UINT16 StringLength = 0; UINT32 OptionIndex = 0; UINT32 i; @@ -295,7 +300,7 @@ * Initial descriptor length -- may be enlarged if there are * optional fields present */ - Descriptor->ExtendedIrq.ResourceLength = 2; /* Flags and table length byte */ + ResourceLength = 2; /* Flags and table length byte */ Descriptor->ExtendedIrq.InterruptCount = 0; Rover = ACPI_CAST_PTR (AML_RESOURCE, @@ -403,10 +408,11 @@ /* Save the integer and move pointer to the next one */ - Rover->DwordItem = (UINT32) InitializerOp->Asl.Value.Integer; + ACPI_MOVE_64_TO_32(&Rover->DwordItem, + &InitializerOp->Asl.Value.Integer); Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->DwordItem), 4); Descriptor->ExtendedIrq.InterruptCount++; - Descriptor->ExtendedIrq.ResourceLength += 4; + ResourceLength += 4; /* Case 7: First interrupt number in list */ @@ -442,7 +448,7 @@ { Rover->ByteItem = ResSourceIndex; Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->ByteItem), 1); - Descriptor->ExtendedIrq.ResourceLength += 1; + ResourceLength += 1; } /* Add optional ResSource string if present */ @@ -454,13 +460,14 @@ Rover = ACPI_ADD_PTR ( AML_RESOURCE, &(Rover->ByteItem), StringLength); - Descriptor->ExtendedIrq.ResourceLength = (UINT16) - (Descriptor->ExtendedIrq.ResourceLength + StringLength); + ResourceLength = (UINT16) (ResourceLength + StringLength); } Rnode->BufferLength = (ASL_RESDESC_OFFSET (ExtendedIrq.Interrupts[0]) - ASL_RESDESC_OFFSET (ExtendedIrq.DescriptorType)) + OptionIndex + StringLength; + ACPI_MOVE_16_TO_16(&Descriptor->ExtendedIrq.ResourceLength, + &ResourceLength); return (Rnode); } @@ -511,7 +518,7 @@ Descriptor = Rnode->Buffer; Descriptor->VendorLarge.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_LARGE; - Descriptor->VendorLarge.ResourceLength = (UINT16) i; + ACPI_MOVE_32_TO_16(&Descriptor->VendorLarge.ResourceLength, &i); /* Point to end-of-descriptor for vendor data */ Index: b/compiler/aslrestype2d.c =================================================================== --- a/compiler/aslrestype2d.c 2010-07-02 21:42:26.585349064 +0900 +++ b/compiler/aslrestype2d.c 2010-07-04 11:18:19.494017882 +0900 @@ -156,7 +156,13 @@ ACPI_PARSE_OBJECT *GranOp = NULL; ASL_RESOURCE_NODE *Rnode; UINT16 StringLength = 0; + UINT16 ResourceLength = 0; UINT32 OptionIndex = 0; + UINT32 Minimum = 0; + UINT32 Maximum = 0; + UINT32 AddressLength = 0; + UINT32 Granularity = 0; + UINT32 TranslationOffset = 0; UINT8 *OptionalFields; UINT32 i; BOOLEAN ResSourceIndex = FALSE; @@ -177,8 +183,7 @@ * optional fields present */ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32); - Descriptor->Address32.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_ADDRESS32) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS32) - sizeof (AML_RESOURCE_LARGE_HEADER)); /* Process all child initialization nodes */ @@ -222,8 +227,7 @@ case 5: /* Address Granularity */ - Descriptor->Address32.Granularity = - (UINT32) InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); GranOp = InitializerOp; @@ -231,8 +235,7 @@ case 6: /* Address Min */ - Descriptor->Address32.Minimum = - (UINT32) InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); MinOp = InitializerOp; @@ -240,8 +243,7 @@ case 7: /* Address Max */ - Descriptor->Address32.Maximum = - (UINT32) InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); MaxOp = InitializerOp; @@ -249,16 +251,14 @@ case 8: /* Translation Offset */ - Descriptor->Address32.TranslationOffset = - (UINT32) InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); break; case 9: /* Address Length */ - Descriptor->Address32.AddressLength = - (UINT32) InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); LengthOp = InitializerOp; @@ -272,7 +272,7 @@ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; OptionIndex++; - Descriptor->Address32.ResourceLength++; + ResourceLength++; ResSourceIndex = TRUE; } break; @@ -286,8 +286,7 @@ { /* Found a valid ResourceSource */ - Descriptor->Address32.ResourceLength = (UINT16) - (Descriptor->Address32.ResourceLength + StringLength); + ResourceLength = (UINT16) (ResourceLength + StringLength); strcpy ((char *) &OptionalFields[OptionIndex], @@ -347,13 +346,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->Address32.Minimum, - Descriptor->Address32.Maximum, - Descriptor->Address32.AddressLength, - Descriptor->Address32.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->Address32.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_16_TO_16(&Descriptor->Address32.ResourceLength, &ResourceLength); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.Minimum, &Minimum); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.Maximum, &Maximum); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.AddressLength, &AddressLength); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.Granularity, &Granularity); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.TranslationOffset, &TranslationOffset); + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + OptionIndex + StringLength; return (Rnode); @@ -388,7 +394,13 @@ ASL_RESOURCE_NODE *Rnode; UINT8 *OptionalFields; UINT16 StringLength = 0; + UINT16 ResourceLength = 0; UINT32 OptionIndex = 0; + UINT32 Minimum = 0; + UINT32 Maximum = 0; + UINT32 AddressLength = 0; + UINT32 Granularity = 0; + UINT32 TranslationOffset = 0; UINT32 i; BOOLEAN ResSourceIndex = FALSE; @@ -408,11 +420,9 @@ * optional fields present */ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32); - Descriptor->Address32.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_ADDRESS32) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS32) - sizeof (AML_RESOURCE_LARGE_HEADER)); - /* Process all child initialization nodes */ for (i = 0; InitializerOp; i++) @@ -461,8 +471,7 @@ case 6: /* Address Granularity */ - Descriptor->Address32.Granularity = - (UINT32) InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); GranOp = InitializerOp; @@ -470,8 +479,7 @@ case 7: /* Min Address */ - Descriptor->Address32.Minimum = - (UINT32) InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); MinOp = InitializerOp; @@ -479,8 +487,7 @@ case 8: /* Max Address */ - Descriptor->Address32.Maximum = - (UINT32) InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); MaxOp = InitializerOp; @@ -488,16 +495,14 @@ case 9: /* Translation Offset */ - Descriptor->Address32.TranslationOffset = - (UINT32) InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); break; case 10: /* Address Length */ - Descriptor->Address32.AddressLength = - (UINT32) InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); LengthOp = InitializerOp; @@ -509,7 +514,7 @@ { OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; OptionIndex++; - Descriptor->Address32.ResourceLength++; + ResourceLength++; ResSourceIndex = TRUE; } break; @@ -521,8 +526,8 @@ { if (StringLength) { - Descriptor->Address32.ResourceLength = (UINT16) - (Descriptor->Address32.ResourceLength + StringLength); + + ResourceLength = (UINT16) (ResourceLength + StringLength); strcpy ((char *) &OptionalFields[OptionIndex], @@ -583,13 +588,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->Address32.Minimum, - Descriptor->Address32.Maximum, - Descriptor->Address32.AddressLength, - Descriptor->Address32.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->Address32.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_16_TO_16(&Descriptor->Address32.ResourceLength, &ResourceLength); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.Minimum, &Minimum); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.Maximum, &Maximum); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.AddressLength, &AddressLength); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.Granularity, &Granularity); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.TranslationOffset, &TranslationOffset); + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + OptionIndex + StringLength; return (Rnode); @@ -624,7 +636,13 @@ ASL_RESOURCE_NODE *Rnode; UINT8 *OptionalFields; UINT16 StringLength = 0; + UINT16 ResourceLength = 0; UINT32 OptionIndex = 0; + UINT32 Minimum = 0; + UINT32 Maximum = 0; + UINT32 AddressLength = 0; + UINT32 Granularity = 0; + UINT32 TranslationOffset = 0; UINT32 i; BOOLEAN ResSourceIndex = FALSE; @@ -643,8 +661,7 @@ * optional fields present */ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32); - Descriptor->Address32.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_ADDRESS32) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS32) - sizeof (AML_RESOURCE_LARGE_HEADER)); /* Process all child initialization nodes */ @@ -693,8 +710,7 @@ case 6: /* Address Granularity */ - Descriptor->Address32.Granularity = - (UINT32) InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); GranOp = InitializerOp; @@ -702,8 +718,7 @@ case 7: /* Min Address */ - Descriptor->Address32.Minimum = - (UINT32) InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); MinOp = InitializerOp; @@ -711,8 +726,7 @@ case 8: /* Max Address */ - Descriptor->Address32.Maximum = - (UINT32) InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); MaxOp = InitializerOp; @@ -720,16 +734,14 @@ case 9: /* Translation Offset */ - Descriptor->Address32.TranslationOffset = - (UINT32) InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); break; case 10: /* Address Length */ - Descriptor->Address32.AddressLength = - (UINT32) InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); LengthOp = InitializerOp; @@ -741,7 +753,7 @@ { OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; OptionIndex++; - Descriptor->Address32.ResourceLength++; + ResourceLength++; ResSourceIndex = TRUE; } break; @@ -753,8 +765,7 @@ { if (StringLength) { - Descriptor->Address32.ResourceLength = (UINT16) - (Descriptor->Address32.ResourceLength + StringLength); + ResourceLength = (UINT16) (ResourceLength + StringLength); strcpy ((char *) &OptionalFields[OptionIndex], @@ -801,13 +812,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->Address32.Minimum, - Descriptor->Address32.Maximum, - Descriptor->Address32.AddressLength, - Descriptor->Address32.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->Address32.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_16_TO_16(&Descriptor->Address32.ResourceLength, &ResourceLength); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.Minimum, &Minimum); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.Maximum, &Maximum); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.AddressLength, &AddressLength); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.Granularity, &Granularity); + ACPI_MOVE_32_TO_32(&Descriptor->Address32.TranslationOffset, &TranslationOffset); + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + OptionIndex + StringLength; return (Rnode); Index: b/compiler/aslrestype2e.c =================================================================== --- a/compiler/aslrestype2e.c 2010-07-02 21:42:26.637349971 +0900 +++ b/compiler/aslrestype2e.c 2010-07-04 11:18:19.498018099 +0900 @@ -156,6 +156,13 @@ ACPI_PARSE_OBJECT *GranOp = NULL; ASL_RESOURCE_NODE *Rnode; UINT16 StringLength = 0; + UINT16 ResourceLength = 0; + UINT64 Minimum = 0; + UINT64 Maximum = 0; + UINT64 AddressLength = 0; + UINT64 Granularity = 0; + UINT64 TranslationOffset = 0; + UINT64 TypeSpecific = 0; UINT32 i; @@ -170,9 +177,10 @@ Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE; Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; - Descriptor->ExtAddress64.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - sizeof (AML_RESOURCE_LARGE_HEADER)); + ACPI_MOVE_16_TO_16(&Descriptor->ExtAddress64.ResourceLength, + &ResourceLength); /* Process all child initialization nodes */ @@ -215,7 +223,7 @@ case 5: /* Address Granularity */ - Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); GranOp = InitializerOp; @@ -223,7 +231,7 @@ case 6: /* Address Min */ - Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); MinOp = InitializerOp; @@ -231,7 +239,7 @@ case 7: /* Address Max */ - Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); MaxOp = InitializerOp; @@ -239,14 +247,14 @@ case 8: /* Translation Offset */ - Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); break; case 9: /* Address Length */ - Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); LengthOp = InitializerOp; @@ -254,7 +262,7 @@ case 10: /* Type-Specific Attributes */ - Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; + TypeSpecific = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); break; @@ -290,13 +298,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->ExtAddress64.Minimum, - Descriptor->ExtAddress64.Maximum, - Descriptor->ExtAddress64.AddressLength, - Descriptor->ExtAddress64.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->ExtAddress64.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Minimum, &Minimum); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Maximum, &Maximum); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.AddressLength, &AddressLength); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Granularity, &Granularity); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TranslationOffset, &TranslationOffset); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TypeSpecific, &TypeSpecific); + Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength; return (Rnode); } @@ -329,6 +344,13 @@ ACPI_PARSE_OBJECT *GranOp = NULL; ASL_RESOURCE_NODE *Rnode; UINT16 StringLength = 0; + UINT16 ResourceLength = 0; + UINT64 Minimum = 0; + UINT64 Maximum = 0; + UINT64 AddressLength = 0; + UINT64 Granularity = 0; + UINT64 TranslationOffset = 0; + UINT64 TypeSpecific = 0; UINT32 i; @@ -343,9 +365,10 @@ Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; - Descriptor->ExtAddress64.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - sizeof (AML_RESOURCE_LARGE_HEADER)); + ACPI_MOVE_16_TO_16(&Descriptor->ExtAddress64.ResourceLength, + &ResourceLength); /* Process all child initialization nodes */ @@ -395,7 +418,7 @@ case 6: /* Address Granularity */ - Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); GranOp = InitializerOp; @@ -403,7 +426,7 @@ case 7: /* Min Address */ - Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); MinOp = InitializerOp; @@ -411,7 +434,7 @@ case 8: /* Max Address */ - Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); MaxOp = InitializerOp; @@ -419,14 +442,14 @@ case 9: /* Translation Offset */ - Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); break; case 10: /* Address Length */ - Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); LengthOp = InitializerOp; @@ -434,7 +457,7 @@ case 11: /* Type-Specific Attributes */ - Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; + TypeSpecific = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); break; @@ -471,13 +494,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->ExtAddress64.Minimum, - Descriptor->ExtAddress64.Maximum, - Descriptor->ExtAddress64.AddressLength, - Descriptor->ExtAddress64.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->ExtAddress64.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Minimum, &Minimum); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Maximum, &Maximum); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.AddressLength, &AddressLength); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Granularity, &Granularity); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TranslationOffset, &TranslationOffset); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TypeSpecific, &TypeSpecific); + Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength; return (Rnode); } @@ -510,6 +540,13 @@ ACPI_PARSE_OBJECT *GranOp = NULL; ASL_RESOURCE_NODE *Rnode; UINT16 StringLength = 0; + UINT16 ResourceLength = 0; + UINT64 Minimum = 0; + UINT64 Maximum = 0; + UINT64 AddressLength = 0; + UINT64 Granularity = 0; + UINT64 TranslationOffset = 0; + UINT64 TypeSpecific = 0; UINT32 i; @@ -523,9 +560,10 @@ Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; - Descriptor->ExtAddress64.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - sizeof (AML_RESOURCE_LARGE_HEADER)); + ACPI_MOVE_16_TO_16(&Descriptor->ExtAddress64.ResourceLength, + &ResourceLength); /* Process all child initialization nodes */ @@ -573,7 +611,7 @@ case 6: /* Address Granularity */ - Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); GranOp = InitializerOp; @@ -581,7 +619,7 @@ case 7: /* Min Address */ - Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); MinOp = InitializerOp; @@ -589,7 +627,7 @@ case 8: /* Max Address */ - Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); MaxOp = InitializerOp; @@ -597,14 +635,14 @@ case 9: /* Translation Offset */ - Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); break; case 10: /* Address Length */ - Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); LengthOp = InitializerOp; @@ -612,7 +650,7 @@ case 11: /* Type-Specific Attributes */ - Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; + TypeSpecific = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); break; @@ -634,13 +672,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->ExtAddress64.Minimum, - Descriptor->ExtAddress64.Maximum, - Descriptor->ExtAddress64.AddressLength, - Descriptor->ExtAddress64.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->ExtAddress64.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Minimum, &Minimum); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Maximum, &Maximum); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.AddressLength, &AddressLength); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Granularity, &Granularity); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TranslationOffset, &TranslationOffset); + ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TypeSpecific, &TypeSpecific); + Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength; return (Rnode); } Index: b/compiler/aslrestype2q.c =================================================================== --- a/compiler/aslrestype2q.c 2010-07-02 21:42:26.673349159 +0900 +++ b/compiler/aslrestype2q.c 2010-07-04 11:18:19.498018099 +0900 @@ -157,7 +157,13 @@ ASL_RESOURCE_NODE *Rnode; UINT8 *OptionalFields; UINT16 StringLength = 0; + UINT16 ResourceLength = 0; UINT32 OptionIndex = 0; + UINT64 Minimum = 0; + UINT64 Maximum = 0; + UINT64 AddressLength = 0; + UINT64 Granularity = 0; + UINT64 TranslationOffset = 0; UINT32 i; BOOLEAN ResSourceIndex = FALSE; @@ -177,8 +183,7 @@ * optional fields present */ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); - Descriptor->Address64.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_ADDRESS64) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS64) - sizeof (AML_RESOURCE_LARGE_HEADER)); /* Process all child initialization nodes */ @@ -222,7 +227,7 @@ case 5: /* Address Granularity */ - Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); GranOp = InitializerOp; @@ -230,7 +235,7 @@ case 6: /* Address Min */ - Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); MinOp = InitializerOp; @@ -238,7 +243,7 @@ case 7: /* Address Max */ - Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); MaxOp = InitializerOp; @@ -246,14 +251,14 @@ case 8: /* Translation Offset */ - Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); break; case 9: /* Address Length */ - Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); LengthOp = InitializerOp; @@ -265,7 +270,7 @@ { OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; OptionIndex++; - Descriptor->Address64.ResourceLength++; + ResourceLength++; ResSourceIndex = TRUE; } break; @@ -277,8 +282,7 @@ { if (StringLength) { - Descriptor->Address64.ResourceLength = (UINT16) - (Descriptor->Address64.ResourceLength + StringLength); + ResourceLength = (UINT16) (ResourceLength + StringLength); strcpy ((char *) &OptionalFields[OptionIndex], @@ -338,13 +342,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->Address64.Minimum, - Descriptor->Address64.Maximum, - Descriptor->Address64.AddressLength, - Descriptor->Address64.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->Address64.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_16_TO_16(&Descriptor->Address64.ResourceLength, &ResourceLength); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.Minimum, &Minimum); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.Maximum, &Maximum); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.AddressLength, &AddressLength); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.Granularity, &Granularity); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.TranslationOffset, &TranslationOffset); + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + OptionIndex + StringLength; return (Rnode); @@ -379,7 +390,13 @@ ASL_RESOURCE_NODE *Rnode; UINT8 *OptionalFields; UINT16 StringLength = 0; + UINT16 ResourceLength = 0; UINT32 OptionIndex = 0; + UINT64 Minimum = 0; + UINT64 Maximum = 0; + UINT64 AddressLength = 0; + UINT64 Granularity = 0; + UINT64 TranslationOffset = 0; UINT32 i; BOOLEAN ResSourceIndex = FALSE; @@ -399,8 +416,7 @@ * optional fields present */ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); - Descriptor->Address64.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_ADDRESS64) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS64) - sizeof (AML_RESOURCE_LARGE_HEADER)); /* Process all child initialization nodes */ @@ -451,7 +467,7 @@ case 6: /* Address Granularity */ - Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); GranOp = InitializerOp; @@ -459,7 +475,7 @@ case 7: /* Min Address */ - Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); MinOp = InitializerOp; @@ -467,7 +483,7 @@ case 8: /* Max Address */ - Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); MaxOp = InitializerOp; @@ -475,14 +491,14 @@ case 9: /* Translation Offset */ - Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); break; case 10: /* Address Length */ - Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); LengthOp = InitializerOp; @@ -494,7 +510,7 @@ { OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; OptionIndex++; - Descriptor->Address64.ResourceLength++; + ResourceLength++; ResSourceIndex = TRUE; } break; @@ -506,8 +522,7 @@ { if (StringLength) { - Descriptor->Address64.ResourceLength = (UINT16) - (Descriptor->Address64.ResourceLength + StringLength); + ResourceLength = (UINT16) (ResourceLength + StringLength); strcpy ((char *) &OptionalFields[OptionIndex], @@ -568,13 +583,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->Address64.Minimum, - Descriptor->Address64.Maximum, - Descriptor->Address64.AddressLength, - Descriptor->Address64.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->Address64.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_16_TO_16(&Descriptor->Address64.ResourceLength, &ResourceLength); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.Minimum, &Minimum); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.Maximum, &Maximum); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.AddressLength, &AddressLength); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.Granularity, &Granularity); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.TranslationOffset, &TranslationOffset); + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + OptionIndex + StringLength; return (Rnode); @@ -609,8 +631,14 @@ ASL_RESOURCE_NODE *Rnode; UINT8 *OptionalFields; UINT16 StringLength = 0; + UINT16 ResourceLength = 0; UINT32 OptionIndex = 0; UINT32 i; + UINT64 Minimum = 0; + UINT64 Maximum = 0; + UINT64 AddressLength = 0; + UINT64 Granularity = 0; + UINT64 TranslationOffset = 0; BOOLEAN ResSourceIndex = FALSE; @@ -628,8 +656,7 @@ * optional fields present */ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); - Descriptor->Address64.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_ADDRESS64) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS64) - sizeof (AML_RESOURCE_LARGE_HEADER)); /* Process all child initialization nodes */ @@ -678,7 +705,7 @@ case 6: /* Address Granularity */ - Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); GranOp = InitializerOp; @@ -686,7 +713,7 @@ case 7: /* Min Address */ - Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); MinOp = InitializerOp; @@ -694,7 +721,7 @@ case 8: /* Max Address */ - Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); MaxOp = InitializerOp; @@ -702,14 +729,14 @@ case 9: /* Translation Offset */ - Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); break; case 10: /* Address Length */ - Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); LengthOp = InitializerOp; @@ -721,7 +748,7 @@ { OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; OptionIndex++; - Descriptor->Address64.ResourceLength++; + ResourceLength++; ResSourceIndex = TRUE; } break; @@ -733,8 +760,7 @@ { if (StringLength) { - Descriptor->Address64.ResourceLength = (UINT16) - (Descriptor->Address64.ResourceLength + StringLength); + ResourceLength = (UINT16) (ResourceLength + StringLength); strcpy ((char *) &OptionalFields[OptionIndex], @@ -780,13 +806,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->Address64.Minimum, - Descriptor->Address64.Maximum, - Descriptor->Address64.AddressLength, - Descriptor->Address64.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->Address64.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_16_TO_16(&Descriptor->Address64.ResourceLength, &ResourceLength); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.Minimum, &Minimum); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.Maximum, &Maximum); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.AddressLength, &AddressLength); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.Granularity, &Granularity); + ACPI_MOVE_64_TO_64(&Descriptor->Address64.TranslationOffset, &TranslationOffset); + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + OptionIndex + StringLength; return (Rnode); Index: b/compiler/aslrestype2w.c =================================================================== --- a/compiler/aslrestype2w.c 2010-07-02 21:42:26.689348992 +0900 +++ b/compiler/aslrestype2w.c 2010-07-04 11:18:19.502017898 +0900 @@ -158,6 +158,12 @@ UINT8 *OptionalFields; UINT16 StringLength = 0; UINT32 OptionIndex = 0; + UINT16 ResourceLength = 0; + UINT16 Minimum = 0; + UINT16 Maximum = 0; + UINT16 AddressLength = 0; + UINT16 Granularity = 0; + UINT16 TranslationOffset = 0; UINT32 i; BOOLEAN ResSourceIndex = FALSE; @@ -177,8 +183,7 @@ * optional fields present */ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16); - Descriptor->Address16.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_ADDRESS16) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS16) - sizeof (AML_RESOURCE_LARGE_HEADER)); /* Process all child initialization nodes */ @@ -222,7 +227,7 @@ case 5: /* Address Granularity */ - Descriptor->Address16.Granularity = (UINT16) InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity)); GranOp = InitializerOp; @@ -230,7 +235,7 @@ case 6: /* Address Min */ - Descriptor->Address16.Minimum = (UINT16) InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum)); MinOp = InitializerOp; @@ -238,7 +243,7 @@ case 7: /* Address Max */ - Descriptor->Address16.Maximum = (UINT16) InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum)); MaxOp = InitializerOp; @@ -246,14 +251,14 @@ case 8: /* Translation Offset */ - Descriptor->Address16.TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset)); break; case 9: /* Address Length */ - Descriptor->Address16.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength)); LengthOp = InitializerOp; @@ -265,7 +270,7 @@ { OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; OptionIndex++; - Descriptor->Address16.ResourceLength++; + ResourceLength++; ResSourceIndex = TRUE; } break; @@ -277,8 +282,7 @@ { if (StringLength) { - Descriptor->Address16.ResourceLength = (UINT16) - (Descriptor->Address16.ResourceLength + StringLength); + ResourceLength = (UINT16) (ResourceLength + StringLength); strcpy ((char *) &OptionalFields[OptionIndex], @@ -338,13 +342,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->Address16.Minimum, - Descriptor->Address16.Maximum, - Descriptor->Address16.AddressLength, - Descriptor->Address16.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->Address16.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.ResourceLength, &ResourceLength); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.Minimum, &Minimum); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.Maximum, &Maximum); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.AddressLength, &AddressLength); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.Granularity, &Granularity); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.TranslationOffset, &TranslationOffset); + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) + OptionIndex + StringLength; return (Rnode); @@ -380,6 +391,12 @@ UINT8 *OptionalFields; UINT16 StringLength = 0; UINT32 OptionIndex = 0; + UINT16 ResourceLength = 0; + UINT16 Minimum = 0; + UINT16 Maximum = 0; + UINT16 AddressLength = 0; + UINT16 Granularity = 0; + UINT16 TranslationOffset = 0; UINT32 i; BOOLEAN ResSourceIndex = FALSE; @@ -399,8 +416,7 @@ * optional fields present */ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16); - Descriptor->Address16.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_ADDRESS16) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS16) - sizeof (AML_RESOURCE_LARGE_HEADER)); /* Process all child initialization nodes */ @@ -437,8 +453,7 @@ case 4: /* Address Granularity */ - Descriptor->Address16.Granularity = - (UINT16) InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity)); GranOp = InitializerOp; @@ -446,8 +461,7 @@ case 5: /* Min Address */ - Descriptor->Address16.Minimum = - (UINT16) InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum)); MinOp = InitializerOp; @@ -455,8 +469,7 @@ case 6: /* Max Address */ - Descriptor->Address16.Maximum = - (UINT16) InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum)); MaxOp = InitializerOp; @@ -464,16 +477,14 @@ case 7: /* Translation Offset */ - Descriptor->Address16.TranslationOffset = - (UINT16) InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset)); break; case 8: /* Address Length */ - Descriptor->Address16.AddressLength = - (UINT16) InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength)); LengthOp = InitializerOp; @@ -485,7 +496,7 @@ { OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; OptionIndex++; - Descriptor->Address16.ResourceLength++; + ResourceLength++; ResSourceIndex = TRUE; } break; @@ -497,8 +508,7 @@ { if (StringLength) { - Descriptor->Address16.ResourceLength = (UINT16) - (Descriptor->Address16.ResourceLength + StringLength); + ResourceLength = (UINT16) (ResourceLength + StringLength); strcpy ((char *) &OptionalFields[OptionIndex], @@ -544,13 +554,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->Address16.Minimum, - Descriptor->Address16.Maximum, - Descriptor->Address16.AddressLength, - Descriptor->Address16.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->Address16.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.ResourceLength, &ResourceLength); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.Minimum, &Minimum); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.Maximum, &Maximum); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.AddressLength, &AddressLength); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.Granularity, &Granularity); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.TranslationOffset, &TranslationOffset); + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) + OptionIndex + StringLength; return (Rnode); @@ -586,6 +603,12 @@ UINT8 *OptionalFields; UINT16 StringLength = 0; UINT32 OptionIndex = 0; + UINT16 Minimum = 0; + UINT16 Maximum = 0; + UINT16 AddressLength = 0; + UINT16 Granularity = 0; + UINT16 TranslationOffset = 0; + UINT16 ResourceLength = 0; UINT32 i; BOOLEAN ResSourceIndex = FALSE; @@ -604,8 +627,7 @@ * optional fields present */ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16); - Descriptor->Address16.ResourceLength = (UINT16) - (sizeof (AML_RESOURCE_ADDRESS16) - + ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS16) - sizeof (AML_RESOURCE_LARGE_HEADER)); /* Process all child initialization nodes */ @@ -654,8 +676,7 @@ case 6: /* Address Granularity */ - Descriptor->Address16.Granularity = - (UINT16) InitializerOp->Asl.Value.Integer; + Granularity = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity)); GranOp = InitializerOp; @@ -663,8 +684,7 @@ case 7: /* Min Address */ - Descriptor->Address16.Minimum = - (UINT16) InitializerOp->Asl.Value.Integer; + Minimum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum)); MinOp = InitializerOp; @@ -672,8 +692,7 @@ case 8: /* Max Address */ - Descriptor->Address16.Maximum = - (UINT16) InitializerOp->Asl.Value.Integer; + Maximum = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum)); MaxOp = InitializerOp; @@ -681,16 +700,14 @@ case 9: /* Translation Offset */ - Descriptor->Address16.TranslationOffset = - (UINT16) InitializerOp->Asl.Value.Integer; + TranslationOffset = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset)); break; case 10: /* Address Length */ - Descriptor->Address16.AddressLength = - (UINT16) InitializerOp->Asl.Value.Integer; + AddressLength = InitializerOp->Asl.Value.Integer; RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength)); LengthOp = InitializerOp; @@ -702,7 +719,7 @@ { OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; OptionIndex++; - Descriptor->Address16.ResourceLength++; + ResourceLength++; ResSourceIndex = TRUE; } break; @@ -714,8 +731,7 @@ { if (StringLength) { - Descriptor->Address16.ResourceLength = (UINT16) - (Descriptor->Address16.ResourceLength + StringLength); + ResourceLength = (UINT16) (ResourceLength + StringLength); strcpy ((char *) &OptionalFields[OptionIndex], @@ -761,13 +777,20 @@ /* Validate the Min/Max/Len/Gran values */ RsLargeAddressCheck ( - Descriptor->Address16.Minimum, - Descriptor->Address16.Maximum, - Descriptor->Address16.AddressLength, - Descriptor->Address16.Granularity, + Minimum, + Maximum, + AddressLength, + Granularity, Descriptor->Address16.Flags, MinOp, MaxOp, LengthOp, GranOp); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.ResourceLength, &ResourceLength); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.Minimum, &Minimum); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.Maximum, &Maximum); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.AddressLength, &AddressLength); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.Granularity, &Granularity); + ACPI_MOVE_16_TO_16(&Descriptor->Address16.TranslationOffset, &TranslationOffset); + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) + OptionIndex + StringLength; return (Rnode); Index: b/include/acmacros.h =================================================================== --- a/include/acmacros.h 2010-07-02 21:42:26.573348963 +0900 +++ b/include/acmacros.h 2010-07-04 11:18:19.502017898 +0900 @@ -175,7 +175,8 @@ /* 32-bit source, 16/32/64 destination */ -#define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ +#define ACPI_MOVE_32_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\ + (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];} #define ACPI_MOVE_32_TO_32(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];\ @@ -190,9 +191,13 @@ /* 64-bit source, 16/32/64 destination */ -#define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ +#define ACPI_MOVE_64_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\ + (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];} -#define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ +#define ACPI_MOVE_64_TO_32(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\ + (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\ + (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[5];\ + (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[4];} #define ACPI_MOVE_64_TO_64(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\ @@ -219,7 +224,9 @@ /* 32-bit source, 16/32/64 destination */ -#define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ +#define ACPI_MOVE_32_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\ + (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];} + #define ACPI_MOVE_32_TO_32(d, s) *(UINT32 *)(void *)(d) = *(UINT32 *)(void *)(s) #define ACPI_MOVE_32_TO_64(d, s) *(UINT64 *)(void *)(d) = *(UINT32 *)(void *)(s)