Hi, 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 :( James
signature.asc
Description: OpenPGP digital signature