Control: tags -1 patch

Hi,

On 23/11/17 18:01, James Cowgill wrote:
> On 21/11/17 07:28, Adrian Bunk wrote:
>> Begin compiling test package: [operand]
>> Begin compiling test package: [tests]
>> Begin compiling test package: [oarg]
>> Test path: 
>> /<<PKGBUILDDIR>>/tests/aslts/src/runtime/collections/complex/operand/tests/oarg
>>     Type: nopt/32 Compile => Removing filesrm: cannot remove 'MAIN.asm': No 
>> such file or directory
>> rm: cannot remove 'MAIN.c': No such file or directory
>> rm: cannot remove 'MAIN.h': No such file or directory
>> rm: cannot remove 'MAIN.i': No such file or directory
>> rm: cannot remove 'MAIN.hex': No such file or directory
>> rm: cannot remove 'MAIN.lst': No such file or directory
>> rm: cannot remove 'MAIN.map': No such file or directory
>> rm: cannot remove 'MAIN.nsp': No such file or directory
>> rm: cannot remove 'MAIN.offset.h': No such file or directory
>> rm: cannot remove 'MAIN.src': No such file or directory
>>  => Done 
>> ls: cannot access 'oarg.aml': No such file or directory
>> mv: cannot stat 'oarg.aml': No such file or directory
>> Compiled test package: [oarg]
>> ...
>> WARNING: some test cases dont have AML code! (168)
>> ...
>> iASL: Segmentation Fault
> 
> I think this is caused by this in aslrules.y:
>> String
>>     : PARSEOP_STRING_LITERAL        {$$ = TrCreateValuedLeafOp 
>> (PARSEOP_STRING_LITERAL,
>>                                         (ACPI_NATIVE_INT) 
>> AslCompilerlval.s);}
>>     ;
> 
> Here we cast a (char*) to uint64.
> 
> In aslparseop.c we assign this uint64 into a union:
>> ACPI_PARSE_OBJECT *
>> TrCreateValuedLeafOp (
>>     UINT32                  ParseOpcode,
>>     UINT64                  Value)
>> {
>>     ACPI_PARSE_OBJECT       *Op;
>>
>>
>>     Op = TrAllocateOp (ParseOpcode);
>>     Op->Asl.Value.Integer = Value;
> 
> This union us defined like this (aclocal.h):
>> typedef union acpi_parse_value
>> {
>>     UINT64                          Integer;        /* Integer constant (Up 
>> to 64 bits) */
>>     UINT32                          Size;           /* bytelist or field 
>> size */
>>     char                            *String;        /* NULL terminated 
>> string */
>>     UINT8                           *Buffer;        /* buffer or string */
>>     char                            *Name;          /* NULL terminated 
>> string */
>>     union acpi_parse_object         *Arg;           /* arguments and 
>> contained ops */
>>     ACPI_TAG_INFO                   Tag;            /* Resource descriptor 
>> tag info  */
>>
>> } ACPI_PARSE_VALUE;
> 
> On 32-bit big endian we end up putting the pointer into the _lower_ half
> of "Integer" which does not work when later reading from "String" (which
> will read from the _upper_ half).
> 
> I might have a go at getting a patch working for this. These bad casts
> make me despair :(

The attached patch works on mips. I didn't test the other failing
architectures.

Thanks,
James
--- a/source/compiler/aslparseop.c
+++ b/source/compiler/aslparseop.c
@@ -283,7 +283,16 @@ TrCreateValuedLeafOp (
 
 
     Op = TrAllocateOp (ParseOpcode);
-    Op->Asl.Value.Integer = Value;
+    if (ParseOpcode == PARSEOP_NAMESTRING ||
+        ParseOpcode == PARSEOP_NAMESEG ||
+        ParseOpcode == PARSEOP_STRING_LITERAL)
+    {
+        Op->Asl.Value.String = (char *) Value;
+    }
+    else
+    {
+        Op->Asl.Value.Integer = Value;
+    }
 
     DbgPrint (ASL_PARSE_OUTPUT,
         "\nCreateValuedLeafOp  Ln/Col %u/%u NewOp %p  "
--- a/source/include/platform/aclinux.h
+++ b/source/include/platform/aclinux.h
@@ -225,10 +225,8 @@
 #endif
 
 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-#if defined(__PPC64__) || defined(__s390x__)
 #define ACPI_BIG_ENDIAN
 #endif
-#endif
 
 #endif /* __KERNEL__ */
 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to