needs tests/harness mem/cons emul/aml testbegin : parsehex# parsehex not ?abort"bad hex" ; : bin< begin word c@+ parsehex# c, eol? until ; : #int ( obj -- hi lo ) cdrcar t"int" #eq cdrcar ; : #intlo ( obj -- lo ) #int 0 rot #eq ; : #string ( obj -- zstr ) cdrcar t"string" #eq ; : #buffer ( obj -- lenobj a u ) cdrcar t"buffer" #eq carcdr carcdr ; : #name ( obj -- subobj name ) cdrcar t"name" #eq cdrcar ; : #scope ( obj type -- objs name ) over car #eq bi scopeobjs | objname ; : #device ( obj -- objs name ) t"device" #scope ; : #thermz ( obj -- objs name ) t"thermz" #scope ; : #pwrres ( obj -- cdr name ) cdrcar t"pwrres" #eq cdrcar ; : #package ( obj -- objs ) cdrcar t"package" #eq ; : #ref ( obj -- a u ) cdrcar t"ref" #eq carcdr ; : #oregion ( obj -- cdr name ) cdrcar t"oregion" #eq cdrcar ; : #ofield ( obj -- cdr name ) cdrcar t"ofield" #eq cdrcar ; : #method ( obj -- cdr name ) cdrcar t"method" #eq cdrcar ; : #bfield ( obj -- cdr name ) cdrcar t"bfield" #eq cdrcar ; \ The code below has been compiled with "iasl" from Debian's acpica-tools. \test simple Name() \ Name(OBJ1, 0x1234) \ Name(OBJ2, "Hello!") \ Name(OBJ3, Buffer() {42, 54, 122}) create aml bin< 08 4F 42 4A 31 0B 34 12 08 4F 42 4A 32 0D 48 65 6C 6C 6F 21 00 08 4F 42 \ 4A 33 11 06 0A 03 2A 36 7A aml 33 getamlns dup .obj scopeobjs cdrcar ( list obj1 ) #name n"OBJ1" #eq #intlo $1234 #eq ( list ) cdrcar ( list obj2 ) #name n"OBJ2" #eq #string "Hello!" swap z[] #s[]= ( 0 ) cdrcar ( 0 obj3 ) create expected 42 c, 54 c, 122 c, #name n"OBJ3" #eq #buffer expected 3 #c[]= #intlo 3 #eq ( 0 ) 0 #eq \test with a Device() and inner/outer scope references \ Name(OBJ1, 0x1234) \ Device (DEV1) { \ Name(_HID, 0xcafebabe) \ Name(PKG1, Package() {OBJ1,_HID}) } create aml bin< 08 4F 42 4A 31 0B 34 12 5B 82 1F 44 45 56 31 08 5F 48 49 44 0C BE BA FE \ CA 08 50 4B 47 31 12 0A 02 4F 42 4A 31 5F 48 49 44 aml 41 getamlns dup .obj scopeobjs cdrcar ( list obj1 ) drop cdrcar ( list dev1 ) #device n"DEV1" #eq ( 0 objs ) cdrcar ( 0 devobjs _hid ) #name n"_HID" #eq #intlo $cafebabe #eq ( 0 devobjs ) cdrcar ( 0 0 pkg1 ) #name n"PKG1" #eq #package ( 0 0 pkgobjs ) cdrcar ( 0 0 pkgobjs obj1ref ) #ref "OBJ1" #[]s= cdrcar ( 0 0 0 _hidref ) #ref "_HID" #[]s= 0 #eq 0 #eq 0 #eq \test Packages contain heterogenous elements \ Name(OBJ1, 0x1234) \ Name(PKG1, Package() {OBJ1,0x2345, "Hello!"}) create aml bin< 08 4F 42 4A 31 0B 34 12 08 50 4B 47 31 12 11 03 4F 42 4A 31 0B 45 23 0D \ 48 65 6C 6C 6F 21 00 aml 31 getamlns dup .obj scopeobjs cdrcar ( list obj1 ) #name n"OBJ1" #eq #intlo $1234 #eq ( list ) cdrcar ( 0 pkg1 ) #name n"PKG1" #eq #package ( 0 pkgobjs ) cdrcar ( 0 pkgobjs obj1ref ) #ref "OBJ1" #[]s= cdrcar ( 0 pkgobjs integer ) #intlo $2345 #eq cdrcar ( 0 0 string ) #string "Hello!" swap z[] #s[]= ( 0 0 ) 0 #eq 0 #eq \test OperationRegion and Fields \ OperationRegion(OPR1, SystemMemory, 0x1234, 42) \ Field(OPR1) { FLD1, 8, Offset(3), FLD2, 12 } create aml bin< 5B 80 4F 50 52 31 00 0B 34 12 0A 2A 5B 81 12 4F 50 52 31 00 46 4C 44 31 \ 08 00 10 46 4C 44 32 0C aml 32 getamlns dup .obj scopeobjs cdrcar ( list opr1 ) #oregion n"OPR1" #eq ( list cdr ) cdrcar SystemMemory #eq cdrcar #intlo $1234 #eq #intlo 42 #eq ( list ) cdrcar ( list fld1 ) #ofield n"FLD1" #eq ( list fld1cdr ) cdrcar #ref "OPR1" #[]s= cdrcar 0 #eq cdrcar 0 #eq 8 #eq ( list ) cdrcar ( 0 fld2 ) #ofield n"FLD2" #eq ( list fld2cdr ) cdrcar #ref "OPR1" #[]s= cdrcar 0 #eq cdrcar 24 #eq 12 #eq ( 0 ) 0 #eq \test Method \ Name(OBJ1, 0x1234) \ Method(MTH1) { OBJ1 = 42 } create aml bin< 08 4F 42 4A 31 0B 34 12 14 0D 4D 54 48 31 00 70 0A 2A 4F 42 4A 31 aml 22 getamlns dup .obj scopeobjs cdrcar ( list obj1 ) #name n"OBJ1" #eq #intlo $1234 #eq ( list ) cdrcar ( 0 mth1 ) #method n"MTH1" #eq drop 0 #eq \test big pkglen \ A way to test big pkglen values that doesn't involve big data is to use \ fields which have pkglen bytecode for their bit offset/length fields. \ OperationRegion(OPR1, SystemMemory, 0x1234, 42) \ Field(OPR1) {FLD1, 0x3e, FLD2, 0x3f, FLD3, 0x1234, FLD4, 0x1234567} create aml bin< 5B 80 4F 50 52 31 00 0B 34 12 0C 00 00 00 10 5B 81 20 4F 50 52 31 00 46 \ 4C 44 31 3E 46 4C 44 32 4F 03 46 4C 44 33 84 23 01 46 4C 44 34 C7 56 34 \ 12 aml 49 getamlns dup .obj scopeobjs cdrcar ( list opr1 ) #oregion n"OPR1" #eq drop ( list ) cdrcar ( list fld1 ) #ofield n"FLD1" #eq cdr cdr cdr $3e #eq cdrcar ( list fld2 ) #ofield n"FLD2" #eq cdr cdr cdr $3f #eq cdrcar ( list fld3 ) #ofield n"FLD3" #eq cdr cdr cdr $1234 #eq cdrcar ( list fld4 ) #ofield n"FLD4" #eq cdr cdr cdr $1234567 #eq 0 #eq \test support the short 0 and 1 constant ops \ Name(OBJ1, 0); \ Name(OBJ2, 1); create aml bin< 08 4F 42 4A 31 00 08 4F 42 4A 32 01 aml 12 getamlns dup .obj scopeobjs cdrcar ( list obj1 ) #name n"OBJ1" #eq #intlo 0 #eq ( list ) cdrcar ( 0 obj2 ) #name n"OBJ2" #eq #intlo 1 #eq ( list ) 0 #eq \test support PowerResOp \ PowerResource(PWR1, 1, 2) { \ Name(OBJ1, 0); } create aml bin< 5B 84 0E 50 57 52 31 01 02 00 08 4F 42 4A 31 00 aml 16 getamlns dup .obj scopeobjs cdrcar ( 0 pwr1 ) #pwrres n"PWR1" #eq carcdr cdrcar 1 #eq 2 #eq ( 0 subobjs ) cdrcar ( 0 obj1 ) #name n"OBJ1" #eq #intlo 0 #eq ( 0 0 ) 0 #eq 0 #eq \test support ThermalZoneOp \ ThermalZone(THZ1) { \ Name(OBJ1, 0); } create aml bin< 5B 85 0B 54 48 5A 31 08 4F 42 4A 31 00 aml 13 getamlns dup .obj scopeobjs cdrcar ( 0 thz1 ) #thermz n"THZ1" #eq ( 0 subobjs ) cdrcar ( 0 obj1 ) #name n"OBJ1" #eq #intlo 0 #eq ( 0 0 ) 0 #eq 0 #eq \test support Mutex \ Mutex(MUT1, 9) create aml bin< 5B 01 4D 55 54 31 09 aml 7 getamlns dup .obj scopeobjs cdrcar ( 0 mut1 ) cdrcar t"mutex" #eq cdrcar n"MUT1" #eq 9 #eq 0 #eq \test fancy namepaths \ Name(OBJ1, 42) \ Device(DEV1) { \ Name(_HID, 54) \ Name(REF1, Package() {_HID,OBJ1,^DEV2._HID,\DEV2._HID}) } \ Device(DEV2) { \ Name(_HID, 122) } \ Note that "REF1" contains a forward reference... create aml bin< 08 4F 42 4A 31 0A 2A 5B 82 30 44 45 56 31 08 5F 48 49 44 0A 36 08 52 45 \ 46 31 12 1E 04 5F 48 49 44 4F 42 4A 31 5E 2E 44 45 56 32 5F 48 49 44 5C \ 2E 44 45 56 32 5F 48 49 44 5B 82 0C 44 45 56 32 08 5F 48 49 44 0A 7A aml 71 getamlns dup .obj scopeobjs cdrcar ( list obj1 ) #name n"OBJ1" #eq #intlo 42 #eq ( list ) cdrcar ( 0 dev1 ) #device n"DEV1" #eq ( list objs ) cdrcar ( list devobjs _hid ) #name n"_HID" #eq #intlo 54 #eq ( 0 devobjs ) cdrcar ( list 0 ref1 ) #name n"REF1" #eq #package ( list 0 pkgobjs ) cdrcar ( list 0 pkgobjs ref ) #ref "_HID" #[]s= cdrcar ( list 0 pkgobjs ref ) #ref "OBJ1" #[]s= cdrcar ( list 0 pkgobjs ref ) #ref "^.DEV2_HID" #[]s= cdrcar ( list 0 0 ref ) #ref "\\.DEV2_HID" #[]s= 0 #eq 0 #eq ( list ) drop \test Scope \ Device(DEV1) { Name(_HID, 54) } \ Device(DEV2) { \ Scope(^DEV1) { Name(FOO1, Package() {_HID}) } } create aml bin< 5B 82 0C 44 45 56 31 08 5F 48 49 44 0A 36 5B 82 18 44 45 56 32 10 12 5E \ 44 45 56 31 08 46 4F 4F 31 12 06 01 5F 48 49 44 aml 40 getamlns dup .obj scopeobjs cdr car scopeobjs car ( scope ) cdr car #ref "^DEV1" #[]s= \test buffer field \ Name(BUF1, Buffer() {42, 54, 122}) \ CreateByteField(BUF1, 2, FLD1) create aml bin< 08 42 55 46 31 11 06 0A 03 2A 36 7A 8C 42 55 46 31 0A 02 46 4C 44 31 aml 23 getamlns dup .obj scopeobjs cdr car ( fld1 ) #bfield n"FLD1" #eq ( cdr ) cdrcar #ref "BUF1" #[]s= cdrcar 8 #eq cdrcar #intlo 2 #eq 1 #eq \test buffers larger than their data pad with zeroes \ Name(BUF1, Buffer(8) {42, 54, 122}) create expected 42 c, 54 c, 122 c, create aml bin< 08 42 55 46 31 11 06 0A 08 2A 36 7A aml 12 getamlns dup .obj scopeobjs car ( buf1 ) #name n"BUF1" #eq #buffer expected 3 #c[]= #intlo 8 #eq ( 0 ) testend