1/* $NetBSD: aml_parse.c,v 1.6 2022/03/23 13:06:06 andvar Exp $ */ 2 3/*- 4 * Copyright (c) 1999 Doug Rabson 5 * Copyright (c) 1999, 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * Id: aml_parse.c,v 1.32 2000/08/12 15:20:45 iwasaki Exp 30 * $FreeBSD: src/usr.sbin/acpi/amldb/aml/aml_parse.c,v 1.7 2001/10/23 14:54:15 takawata Exp $ 31 */ 32#include <sys/cdefs.h> 33__RCSID("$NetBSD: aml_parse.c,v 1.6 2022/03/23 13:06:06 andvar Exp $"); 34 35#include <sys/param.h> 36 37#include <acpi_common.h> 38#include <aml/aml_amlmem.h> 39#include <aml/aml_common.h> 40#include <aml/aml_env.h> 41#include <aml/aml_evalobj.h> 42#include <aml/aml_name.h> 43#include <aml/aml_obj.h> 44#include <aml/aml_parse.h> 45#include <aml/aml_status.h> 46#include <aml/aml_store.h> 47 48#ifndef _KERNEL 49#include <sys/stat.h> 50#include <sys/mman.h> 51 52#include <assert.h> 53#include <err.h> 54#include <fcntl.h> 55#include <stdio.h> 56#include <stdlib.h> 57#include <string.h> 58#include <unistd.h> 59 60#include "debug.h" 61#else /* _KERNEL */ 62#include <sys/systm.h> 63#include <sys/bus.h> 64#include <dev/acpi/acpireg.h> 65#include <dev/acpi/acpivar.h> 66#ifndef ACPI_NO_OSDFUNC_INLINE 67#include <machine/acpica_osd.h> 68#endif 69#endif /* !_KERNEL */ 70 71static int findsetleftbit(int num); 72static int findsetrightbit(int num); 73static int frombcd(int num); 74static int tobcd(int num); 75 76static u_int32_t aml_parse_pkglength(struct aml_environ *env); 77static u_int8_t aml_parse_bytedata(struct aml_environ *env); 78static u_int16_t aml_parse_worddata(struct aml_environ *env); 79static u_int32_t aml_parse_dworddata(struct aml_environ *env); 80static u_int8_t *aml_parse_namestring(struct aml_environ *env); 81static void aml_parse_defscope(struct aml_environ *env, 82 int indent); 83static union aml_object *aml_parse_defbuffer(struct aml_environ *env, 84 int indent); 85static struct aml_name *aml_parse_concat_number(struct aml_environ *env, 86 int num1, int indent); 87static struct aml_name *aml_parse_concat_buffer(struct aml_environ *env, 88 union aml_object *obj, 89 int indent); 90static struct aml_name *aml_parse_concat_string(struct aml_environ *env, 91 union aml_object *obj, 92 int indent); 93static struct aml_name *aml_parse_concatop(struct aml_environ *env, 94 int indent); 95static union aml_object *aml_parse_defpackage(struct aml_environ *env, 96 int indent); 97static void aml_parse_defmethod(struct aml_environ *env, 98 int indent); 99static void aml_parse_defopregion(struct aml_environ *env, 100 int indent); 101static int aml_parse_field(struct aml_environ *env, 102 struct aml_field *template); 103static void aml_parse_fieldlist(struct aml_environ *env, 104 struct aml_field *template, 105 int indent); 106static void aml_parse_deffield(struct aml_environ *env, 107 int indent); 108static void aml_parse_defindexfield(struct aml_environ *env, 109 int indent); 110static void aml_parse_defbankfield(struct aml_environ *env, 111 int indent); 112static void aml_parse_defdevice(struct aml_environ *env, 113 int indent); 114static void aml_parse_defprocessor(struct aml_environ *env, 115 int indent); 116static void aml_parse_defpowerres(struct aml_environ *env, 117 int indent); 118static void aml_parse_defthermalzone(struct aml_environ *env, 119 int indent); 120static struct aml_name *aml_parse_defelse(struct aml_environ *env, 121 int indent, int num); 122static struct aml_name *aml_parse_defif(struct aml_environ *env, 123 int indent); 124static struct aml_name *aml_parse_defwhile(struct aml_environ *env, 125 int indent); 126static void aml_parse_defmutex(struct aml_environ *env, 127 int indent); 128static void aml_createfield_generic(struct aml_environ *env, 129 union aml_object *srcbuf, 130 int idx, int len, 131 char *newname); 132static void aml_parse_defcreatefield(struct aml_environ *env, 133 int indent); 134 135static int 136findsetleftbit(int num) 137{ 138 int i, filter; 139 140 filter = 0; 141 for (i = 0; i < 32; i++) { 142 filter = filter >> 1; 143 filter |= 1 << 31; 144 if (filter & num) { 145 break; 146 } 147 } 148 i = (i == 32) ? 0 : i + 1; 149 return (i); 150} 151 152static int 153findsetrightbit(int num) 154{ 155 int i, filter; 156 157 filter = 0; 158 for (i = 0; i < 32; i++) { 159 filter = filter << 1; 160 filter |= 1; 161 if (filter & num) { 162 break; 163 } 164 } 165 i = (i == 32) ? 0 : i + 1; 166 return (i); 167} 168 169static int 170frombcd(int num) 171{ 172 int res, factor; 173 174 res = 0; 175 factor = 1; 176 while (num != 0) { 177 res += ((num & 0xf) * factor); 178 num = num / 16; 179 factor *= 10; 180 } 181 return (res); 182} 183 184static int 185tobcd(int num) 186{ 187 int res, factor; 188 189 res = 0; 190 factor = 1; 191 while (num != 0) { 192 res += ((num % 10) * factor); 193 num = num / 10; 194 factor *= 16; 195 } 196 return (res); 197} 198 199static u_int32_t 200aml_parse_pkglength(struct aml_environ *env) 201{ 202 u_int8_t *dp; 203 u_int32_t pkglength; 204 205 dp = env->dp; 206 pkglength = *dp++; 207 switch (pkglength >> 6) { 208 case 0: 209 break; 210 case 1: 211 pkglength = (pkglength & 0xf) + (dp[0] << 4); 212 dp += 1; 213 break; 214 case 2: 215 pkglength = (pkglength & 0xf) + (dp[0] << 4) + (dp[1] << 12); 216 dp += 2; 217 break; 218 case 3: 219 pkglength = (pkglength & 0xf) 220 + (dp[0] << 4) + (dp[1] << 12) + (dp[2] << 20); 221 dp += 3; 222 break; 223 } 224 225 env->dp = dp; 226 return (pkglength); 227} 228 229static u_int8_t 230aml_parse_bytedata(struct aml_environ *env) 231{ 232 u_int8_t data; 233 234 data = env->dp[0]; 235 env->dp++; 236 return (data); 237} 238 239static u_int16_t 240aml_parse_worddata(struct aml_environ *env) 241{ 242 u_int16_t data; 243 244 data = env->dp[0] + (env->dp[1] << 8); 245 env->dp += 2; 246 return (data); 247} 248 249static u_int32_t 250aml_parse_dworddata(struct aml_environ *env) 251{ 252 u_int32_t data; 253 254 data = env->dp[0] + (env->dp[1] << 8) + 255 (env->dp[2] << 16) + (env->dp[3] << 24); 256 env->dp += 4; 257 return (data); 258} 259 260static u_int8_t * 261aml_parse_namestring(struct aml_environ *env) 262{ 263 u_int8_t *name; 264 int segcount; 265 266 name = env->dp; 267 if (env->dp[0] == '\\') 268 env->dp++; 269 else if (env->dp[0] == '^') 270 while (env->dp[0] == '^') 271 env->dp++; 272 if (env->dp[0] == 0x00) /* NullName */ 273 env->dp++; 274 else if (env->dp[0] == 0x2e) /* DualNamePrefix */ 275 env->dp += 1 + 4 + 4; /* NameSeg, NameSeg */ 276 else if (env->dp[0] == 0x2f) { /* MultiNamePrefix */ 277 segcount = env->dp[1]; 278 env->dp += 1 + 1 + segcount * 4; /* segcount * NameSeg */ 279 } else 280 env->dp += 4; /* NameSeg */ 281 282 return (name); 283} 284 285struct aml_name * 286aml_parse_objectlist(struct aml_environ *env, int indent) 287{ 288 union aml_object *obj; 289 290 obj = NULL; 291 while (env->dp < env->end) { 292 aml_print_indent(indent); 293 obj = aml_eval_name(env, aml_parse_termobj(env, indent)); 294 AML_DEBUGPRINT("\n"); 295 if (env->stat == aml_stat_step) { 296 AML_DEBUGGER(env, env); 297 continue; 298 } 299 if (env->stat != aml_stat_none) { 300 env->tempname.property = obj; 301 return (&env->tempname); 302 } 303 } 304 return (NULL); 305} 306 307#define AML_CREATE_NAME(amlname, env, namestr, ret) do { \ 308 amlname = aml_create_name(env, namestr); \ 309 if (env->stat == aml_stat_panic) \ 310 return ret; \ 311} while(0) 312 313#define AML_COPY_OBJECT(dest, env, src, ret) do { \ 314 dest = aml_copy_object(env, src); \ 315 if (dest == NULL) { \ 316 env->stat = aml_stat_panic; \ 317 return ret; \ 318 } \ 319} while(0) 320 321#define AML_ALLOC_OBJECT(dest, env, type, ret) do { \ 322 dest = aml_alloc_object(type, NULL); \ 323 if (dest == NULL) { \ 324 env->stat= aml_stat_panic; \ 325 return ret; \ 326 } \ 327} while(0) 328 329static void 330aml_parse_defscope(struct aml_environ *env, int indent) 331{ 332 u_int8_t *start, *end, *oend; 333 u_int8_t *name; 334 u_int32_t pkglength; 335 struct aml_name *oname; 336 337 start = env->dp; 338 pkglength = aml_parse_pkglength(env); 339 340 AML_DEBUGPRINT("Scope("); 341 name = aml_parse_namestring(env); 342 aml_print_namestring(name); 343 AML_DEBUGPRINT(") {\n"); 344 oname = env->curname; 345 AML_CREATE_NAME(env->curname, env, name,); 346 oend = env->end; 347 env->end = end = start + pkglength; 348 aml_parse_objectlist(env, indent + 1); 349 aml_print_indent(indent); 350 AML_DEBUGPRINT("}"); 351 AML_SYSASSERT(env->dp == env->end); 352 env->dp = end; 353 env->end = oend; 354 env->curname = oname; 355 env->stat = aml_stat_none; 356} 357 358static union aml_object * 359aml_parse_defbuffer(struct aml_environ *env, int indent) 360{ 361 u_int8_t *start; 362 u_int8_t *end; 363 u_int8_t *buffer; 364 u_int32_t pkglength; 365 int size1, size2, size; 366 union aml_object *obj; 367 368 start = env->dp; 369 pkglength = aml_parse_pkglength(env); 370 end = start + pkglength; 371 372 AML_DEBUGPRINT("Buffer("); 373 obj = aml_eval_name(env, aml_parse_termobj(env, indent)); 374 size1 = aml_objtonum(env, obj); 375 size2 = end - env->dp; 376 size = (size1 < size2) ? size1 : size2; 377 if (size1 > 0) { 378 buffer = memman_alloc_flexsize(aml_memman, size1); 379 if (buffer == NULL) { 380 AML_DEBUGPRINT("NO MEMORY\n"); 381 env->stat = aml_stat_panic; 382 return (NULL); 383 } 384 bzero(buffer, size1); 385 bcopy(env->dp, buffer, size); 386 } else { 387 buffer = NULL; 388 } 389 390 obj = &env->tempobject; 391 obj->type = aml_t_buffer; 392 obj->buffer.size = size1; 393 obj->buffer.data = buffer; 394 AML_DEBUGPRINT(") "); 395 env->dp = end; 396 397 return (obj); 398} 399 400static struct aml_name * 401aml_parse_concat_number(struct aml_environ *env, int num1, int indent) 402{ 403 int num2; 404 struct aml_name *destname; 405 union aml_object *obj; 406 407 num2 = aml_objtonum(env, aml_eval_name(env, 408 aml_parse_termobj(env, indent))); 409 AML_DEBUGPRINT(", "); 410 destname = aml_parse_termobj(env, indent); 411 AML_DEBUGPRINT(")"); 412 obj = &env->tempobject; 413 obj->type = aml_t_buffer; 414 obj->buffer.size = 2; 415 obj->buffer.data = memman_alloc_flexsize(aml_memman, 2); 416 if (obj->buffer.data == NULL) { 417 env->stat = aml_stat_panic; 418 return (NULL); 419 } 420 obj->buffer.data[0] = num1 & 0xff; 421 obj->buffer.data[1] = num2 & 0xff; 422 aml_store_to_name(env, obj, destname); 423 return (&env->tempname); 424} 425 426static struct aml_name * 427aml_parse_concat_buffer(struct aml_environ *env, union aml_object *obj, 428 int indent) 429{ 430 union aml_object *tmpobj, *tmpobj2, *resobj; 431 struct aml_name *destname; 432 433 tmpobj = aml_eval_name(env, aml_parse_termobj(env, indent)); 434 AML_DEBUGPRINT(", "); 435 if (tmpobj->type != aml_t_buffer) { 436 env->stat = aml_stat_panic; 437 return (NULL); 438 } 439 AML_COPY_OBJECT(tmpobj2, env, tmpobj, NULL); 440 destname = aml_parse_termobj(env, indent); 441 AML_DEBUGPRINT(")"); 442 resobj = &env->tempobject; 443 env->tempname.property = resobj; 444 resobj->buffer.type = aml_t_buffer; 445 resobj->buffer.size = tmpobj2->buffer.size + obj->buffer.size; 446 if (resobj->buffer.size > 0) { 447 resobj->buffer.data = memman_alloc_flexsize(aml_memman, 448 resobj->buffer.size); 449 if (resobj->buffer.data == NULL) { 450 env->stat = aml_stat_panic; 451 return (NULL); 452 } 453 bcopy(obj->buffer.data, resobj->buffer.data, obj->buffer.size); 454 bcopy(tmpobj2->buffer.data, 455 resobj->buffer.data + obj->buffer.size, 456 tmpobj2->buffer.size); 457 } else { 458 resobj->buffer.data = NULL; 459 } 460 aml_free_object(&tmpobj2); 461 aml_store_to_name(env, resobj, destname); 462 return (&env->tempname); 463} 464 465static struct aml_name * 466aml_parse_concat_string(struct aml_environ *env, union aml_object *obj, 467 int indent) 468{ 469 int len; 470 union aml_object *tmpobj, *tmpobj2, *resobj; 471 struct aml_name *destname; 472 473 tmpobj = aml_eval_name(env, aml_parse_termobj(env, indent)); 474 AML_DEBUGPRINT(", "); 475 if (tmpobj->type != aml_t_string) { 476 env->stat = aml_stat_panic; 477 return (NULL); 478 } 479 AML_COPY_OBJECT(tmpobj2, env, tmpobj, NULL); 480 destname = aml_parse_termobj(env, indent); 481 AML_DEBUGPRINT(")"); 482 resobj = &env->tempobject; 483 env->tempname.property = resobj; 484 resobj->type = aml_t_buffer; 485 resobj->str.needfree = 1; 486 len = strlen((const char *)obj->str.string) + 487 strlen((const char *)tmpobj2->str.string) + 1; 488 if (len > 0) { 489 resobj->str.string = memman_alloc_flexsize(aml_memman, len); 490 if (resobj->str.string == NULL) { 491 env->stat = aml_stat_panic; 492 return (NULL); 493 } 494 strlcpy((char *)resobj->str.string, (const char *)obj->str.string, len); 495 strlcat((char *)resobj->str.string, (const char *)tmpobj->str.string, len); 496 } else { 497 resobj->str.string = NULL; 498 } 499 aml_free_object(&tmpobj2); 500 aml_store_to_name(env, resobj, destname); 501 return (&env->tempname); 502} 503 504static struct aml_name * 505aml_parse_concatop(struct aml_environ *env, int indent) 506{ 507 union aml_object *obj, *tmpobj; 508 struct aml_name *aname; 509 510 AML_DEBUGPRINT("Concat("); 511 obj = aml_eval_name(env, aml_parse_termobj(env, indent)); 512 AML_DEBUGPRINT(", "); 513 switch (obj->type) { 514 case aml_t_num: 515 aname = aml_parse_concat_number(env, aml_objtonum(env, obj), indent); 516 break; 517 518 case aml_t_buffer: 519 /* obj may be temporal object */ 520 AML_COPY_OBJECT(tmpobj, env, obj, NULL); 521 aname = aml_parse_concat_buffer(env, obj, indent); 522 aml_free_object(&tmpobj); 523 break; 524 525 case aml_t_string: 526 /* obj may be temporal object */ 527 AML_COPY_OBJECT(tmpobj, env, obj, NULL); 528 aname = aml_parse_concat_string(env, obj, indent); 529 aml_free_object(&tmpobj); 530 break; 531 532 default: 533 env->stat = aml_stat_panic; 534 aname = NULL; 535 break; 536 } 537 538 AML_DEBUGPRINT("\n"); 539 return (aname); 540} 541 542static union aml_object * 543aml_parse_defpackage(struct aml_environ *env, int indent) 544{ 545 u_int8_t numelements; 546 u_int8_t *start; 547 u_int32_t pkglength; 548 int i; 549 struct aml_environ *copy; 550 struct aml_name *tmpname; 551 union aml_object *obj, **objects; 552 553 start = env->dp; 554 pkglength = aml_parse_pkglength(env); 555 numelements = aml_parse_bytedata(env); 556 copy = memman_alloc(aml_memman, memid_aml_environ); 557 if (copy == NULL) { 558 env->stat = aml_stat_panic; 559 return (NULL); 560 } 561 if (numelements > 0) { 562 objects = memman_alloc_flexsize(aml_memman, 563 numelements * sizeof(union aml_object *)); 564 if (objects == NULL) { 565 env->stat = aml_stat_panic; 566 return (NULL); 567 } else { 568 bzero(objects, numelements * sizeof(union aml_object *)); 569 } 570 } else { 571 objects = NULL; 572 } 573 574 *copy = *env; 575 env->dp = copy->end = start + pkglength; 576 AML_DEBUGPRINT("Package() {\n"); 577 i = 0; 578 while ((copy->dp < copy->end) && (i < numelements)) { 579 aml_print_indent(indent + 1); 580 tmpname = aml_parse_termobj(copy, indent + 1); 581 582 if (tmpname != NULL) { 583 objects[i] = aml_copy_object(copy, tmpname->property); 584 } 585 AML_DEBUGPRINT(",\n"); 586 i++; 587 } 588 aml_free_objectcontent(©->tempobject); 589 590 aml_print_indent(indent); 591 AML_DEBUGPRINT("}"); 592 obj = &env->tempobject; 593 obj->type = aml_t_package; 594 obj->package.elements = numelements; 595 obj->package.objects = objects; 596 597 memman_free(aml_memman, memid_aml_environ, copy); 598 return (obj); 599} 600 601static void 602aml_parse_defmethod(struct aml_environ *env, int indent) 603{ 604 u_int8_t flags; 605 u_int8_t *start; 606 u_int32_t pkglength; 607 char *name; 608 struct aml_environ *copy; 609 struct aml_method *meth; 610 struct aml_name *aname; 611 union aml_object *aobj; 612 613 start = env->dp; 614 pkglength = aml_parse_pkglength(env); 615 copy = memman_alloc(aml_memman, memid_aml_environ); 616 if (copy == NULL) { 617 env->stat = aml_stat_panic; 618 return; 619 } 620 AML_DEBUGPRINT("Method("); 621 name = (char *)aml_parse_namestring(env); 622 aml_print_namestring((unsigned char *)name); 623 AML_CREATE_NAME(aname, env, (unsigned char *)name,); 624 if (aname->property != NULL) { 625 env->stat = aml_stat_panic; 626 AML_DEBUGPRINT("Already Defined \n"); 627 goto out; 628 } 629 AML_ALLOC_OBJECT(aobj, env, aml_t_method,); 630 meth = &aobj->meth; 631 aname->property = aobj; 632 flags = *env->dp++; 633 634 if (flags) { 635 AML_DEBUGPRINT(", %d", flags); 636 } 637 AML_DEBUGPRINT(") {\n"); 638 *copy = *env; 639 meth->argnum = flags; 640 meth->from = env->dp; 641 meth->to = env->dp = copy->end = start + pkglength; 642 aml_print_indent(indent); 643 AML_DEBUGPRINT("}"); 644out: 645 memman_free(aml_memman, memid_aml_environ, copy); 646} 647 648static void 649aml_parse_defopregion(struct aml_environ *env, int indent) 650{ 651 u_int8_t *name; 652 struct aml_name *aname; 653 struct aml_opregion *opregion; 654 union aml_object *obj; 655 const char *regions[] = { 656 "SystemMemory", 657 "SystemIO", 658 "PCI_Config", 659 "EmbeddedControl", 660 "SMBus", 661 }; 662 663 AML_DEBUGPRINT("OperationRegion("); 664 /* Name */ 665 name = aml_parse_namestring(env); 666 aml_print_namestring(name); 667 AML_CREATE_NAME(aname, env, name,); 668 if (aname->property != NULL) { 669 env->stat = aml_stat_panic; 670 AML_DEBUGPRINT("Already Defined \n"); 671 return; 672 } 673 AML_ALLOC_OBJECT(aname->property, env, aml_t_opregion,); 674 opregion = &aname->property->opregion; 675 opregion->space = *env->dp; 676 AML_DEBUGPRINT(", %s, ", regions[*env->dp]); /* Space */ 677 env->dp++; 678 obj = aml_eval_name(env, aml_parse_termobj(env, indent)); /* Offset */ 679 opregion->offset = aml_objtonum(env, obj); 680 AML_DEBUGPRINT(", "); 681 obj = aml_eval_name(env, aml_parse_termobj(env, indent)); /* Length */ 682 opregion->length = aml_objtonum(env, obj); 683 AML_DEBUGPRINT(")"); 684} 685 686static const char *accessnames[] = { 687 "AnyAcc", 688 "ByteAcc", 689 "WordAcc", 690 "DWordAcc", 691 "BlockAcc", 692 "SMBSendRecvAcc", 693 "SMBQuickAcc" 694}; 695 696static int 697aml_parse_field(struct aml_environ *env, struct aml_field *template) 698{ 699 u_int8_t *name; 700 u_int8_t acc, attribute; 701 u_int32_t width; 702 struct aml_name *aname; 703 struct aml_field *prop; 704 705 switch (*env->dp) { 706 case '\\': 707 case '^': 708 case 'A'...'Z': 709 case '_': 710 case '.': 711 case '/': 712 name = aml_parse_namestring(env); 713 width = aml_parse_pkglength(env); 714 template->bitlen = width; 715 aml_print_namestring(name); 716 AML_CREATE_NAME(aname, env, name, 0); 717 /* Alignment */ 718 if (width == 16) { 719 template->bitoffset += 15; 720 template->bitoffset &= (~15); 721 } 722 if (width == 32) { 723 template->bitoffset += 31; 724 template->bitoffset &= (~31); 725 } else if ((width & 7) == 0) { 726 template->bitoffset += 7; 727 template->bitoffset &= (~7); 728 } else if ((width > 32) && (width & 7) != 0) { 729 AML_DEBUGPRINT("??? Can I treat it?\n"); 730 } 731 if (aname->property != NULL) { 732 env->stat = aml_stat_panic; 733 AML_DEBUGPRINT("Already Defined \n"); 734 return (0); 735 } 736 AML_ALLOC_OBJECT(aname->property, env, aml_t_field, 0); 737 prop = &aname->property->field; 738 *prop = *template; 739 template->bitoffset += width; 740 AML_DEBUGPRINT(",\t%d", width); 741 break; 742 case 0x00: 743 env->dp++; 744 width = aml_parse_pkglength(env); 745 template->bitoffset += width; 746 AML_DEBUGPRINT("Offset(0x%x)", template->bitoffset); 747 break; 748 case 0x01: 749 acc = env->dp[1]; 750 attribute = env->dp[2]; 751 env->dp += 3; 752 AML_DEBUGPRINT("AccessAs(%s, %d)", accessnames[acc], attribute); 753 template->bitoffset = attribute; 754 template->flags = (template->flags | 0xf0) | acc; 755 break; 756 } 757 return (template->bitoffset); 758} 759 760static void 761aml_parse_fieldlist(struct aml_environ *env, struct aml_field *template, 762 int indent) 763{ 764 765 while (env->dp < env->end) { 766 aml_print_indent(indent); 767 (void)aml_parse_field(env, template); 768 if (env->dp < env->end) { 769 AML_DEBUGPRINT(",\n"); 770 } else { 771 AML_DEBUGPRINT("\n"); 772 } 773 } 774} 775 776static void 777aml_parse_deffield(struct aml_environ *env, int indent) 778{ 779 u_int8_t flags; 780 u_int8_t *start, *name; 781 u_int32_t pkglength; 782 struct aml_environ *copy; 783 struct aml_field fieldtemplate; 784 static const char *lockrules[] = {"NoLock", "Lock"}; 785 static const char *updaterules[] = {"Preserve", "WriteAsOnes", 786 "WriteAsZeros", "*Error*"}; 787 788 start = env->dp; 789 pkglength = aml_parse_pkglength(env); 790 copy = memman_alloc(aml_memman, memid_aml_environ); 791 if (copy == NULL) { 792 env->stat = aml_stat_panic; 793 return; 794 } 795 AML_DEBUGPRINT("Field("); 796 aml_print_namestring(name = aml_parse_namestring(env)); 797 fieldtemplate.type = aml_t_field; 798 flags = aml_parse_bytedata(env); 799 fieldtemplate.flags = flags; 800 801 *copy = *env; 802 env->dp = copy->end = start + pkglength; 803 fieldtemplate.bitoffset = 0; 804 fieldtemplate.bitlen = 0; 805 fieldtemplate.f.ftype = f_t_field; 806 fieldtemplate.f.fld.regname = name; 807 AML_DEBUGPRINT(", %s, %s, %s) {\n", 808 accessnames[flags & 0xf], 809 lockrules[(flags >> 4) & 1], 810 updaterules[(flags >> 5) & 3]); 811 aml_parse_fieldlist(copy, &fieldtemplate, indent + 1); 812 aml_print_indent(indent); 813 AML_DEBUGPRINT("}"); 814 aml_free_objectcontent(©->tempobject); 815 816 AML_SYSASSERT(copy->dp == copy->end); 817 memman_free(aml_memman, memid_aml_environ, copy); 818} 819 820static void 821aml_parse_defindexfield(struct aml_environ *env, int indent) 822{ 823 u_int8_t flags; 824 u_int8_t *start, *iname, *dname; 825 u_int32_t pkglength; 826 struct aml_environ *copy; 827 struct aml_field template; 828 static const char *lockrules[] = {"NoLock", "Lock"}; 829 static const char *updaterules[] = {"Preserve", "WriteAsOnes", 830 "WriteAsZeros", "*Error*"}; 831 832 start = env->dp; 833 pkglength = aml_parse_pkglength(env); 834 copy = memman_alloc(aml_memman, memid_aml_environ); 835 if (copy == NULL) { 836 env->stat = aml_stat_panic; 837 return; 838 } 839 AML_DEBUGPRINT("IndexField("); 840 aml_print_namestring(iname = aml_parse_namestring(env)); /* Name1 */ 841 AML_DEBUGPRINT(", "); 842 aml_print_namestring(dname = aml_parse_namestring(env)); /* Name2 */ 843 template.type = aml_t_field; 844 template.flags = flags = aml_parse_bytedata(env); 845 template.bitoffset = 0; 846 template.bitlen = 0; 847 template.f.ftype = f_t_index; 848 template.f.ifld.indexname = iname; 849 template.f.ifld.dataname = dname; 850 AML_DEBUGPRINT(", %s, %s, %s) {\n", 851 accessnames[flags & 0xf], 852 lockrules[(flags >> 4) & 1], 853 updaterules[(flags >> 5) & 3]); 854 *copy = *env; 855 env->dp = copy->end = start + pkglength; 856 aml_parse_fieldlist(copy, &template, indent + 1); 857 aml_print_indent(indent); 858 AML_DEBUGPRINT("}"); 859 aml_free_objectcontent(©->tempobject); 860 861 AML_SYSASSERT(copy->dp == copy->end); 862 memman_free(aml_memman, memid_aml_environ, copy); 863} 864 865static void 866aml_parse_defbankfield(struct aml_environ *env, int indent) 867{ 868 u_int8_t flags; 869 u_int8_t *start, *rname, *bname; 870 u_int32_t pkglength, bankvalue; 871 struct aml_environ *copy; 872 struct aml_field template; 873 union aml_object *obj; 874 static const char *lockrules[] = {"NoLock", "Lock"}; 875 static const char *updaterules[] = {"Preserve", "WriteAsOnes", 876 "WriteAsZeros", "*Error*"}; 877 878 start = env->dp; 879 pkglength = aml_parse_pkglength(env); 880 copy = memman_alloc(aml_memman, memid_aml_environ); 881 if (copy == NULL) { 882 env->stat = aml_stat_panic; 883 return; 884 } 885 AML_DEBUGPRINT("BankField("); 886 aml_print_namestring(rname = aml_parse_namestring(env)); /* Name1 */ 887 AML_DEBUGPRINT(", "); 888 aml_print_namestring(bname = aml_parse_namestring(env)); /* Name2 */ 889 AML_DEBUGPRINT(", "); 890 obj = aml_eval_name(env, aml_parse_termobj(env, indent)); /* BankValue */ 891 bankvalue = aml_objtonum(env, obj); 892 template.type = aml_t_field; 893 template.flags = flags = aml_parse_bytedata(env); 894 template.bitoffset = 0; 895 template.bitlen = 0; 896 template.f.ftype = f_t_bank; 897 template.f.bfld.regname = rname; 898 template.f.bfld.bankname = bname; 899 template.f.bfld.bankvalue = bankvalue; 900 *copy = *env; 901 env->dp = copy->end = start + pkglength; 902 AML_DEBUGPRINT(", %s, %s, %s) {\n", 903 accessnames[flags & 0xf], 904 lockrules[(flags >> 4) & 1], 905 updaterules[(flags >> 5) & 3]); 906 aml_parse_fieldlist(copy, &template, indent + 1); 907 aml_print_indent(indent); 908 AML_DEBUGPRINT("}"); 909 910 aml_free_objectcontent(©->tempobject); 911 AML_SYSASSERT(copy->dp == copy->end); 912 memman_free(aml_memman, memid_aml_environ, copy); 913} 914 915static void 916aml_parse_defdevice(struct aml_environ *env, int indent) 917{ 918 u_int8_t *start; 919 u_int8_t *name; 920 u_int32_t pkglength; 921 struct aml_environ *copy; 922 923 start = env->dp; 924 pkglength = aml_parse_pkglength(env); 925 copy = memman_alloc(aml_memman, memid_aml_environ); 926 if (copy == NULL) { 927 env->stat = aml_stat_panic; 928 return; 929 } 930 AML_DEBUGPRINT("Device("); 931 name = aml_parse_namestring(env); 932 aml_print_namestring(name); 933 AML_DEBUGPRINT(") {\n"); 934 *copy = *env; 935 AML_CREATE_NAME(copy->curname, env, name,); 936 if (copy->curname->property != NULL) { 937 env->stat = aml_stat_panic; 938 AML_DEBUGPRINT("Already Defined \n"); 939 goto out; 940 } 941 AML_ALLOC_OBJECT(copy->curname->property, env, aml_t_device,); 942 env->dp = copy->end = start + pkglength; 943 aml_parse_objectlist(copy, indent + 1); 944 aml_print_indent(indent); 945 AML_DEBUGPRINT("}"); 946 aml_free_objectcontent(©->tempobject); 947 948 AML_SYSASSERT(copy->dp == copy->end); 949out: 950 memman_free(aml_memman, memid_aml_environ, copy); 951} 952 953static void 954aml_parse_defprocessor(struct aml_environ *env, int indent) 955{ 956 u_int8_t *start; 957 u_int8_t *name; 958 u_int32_t pkglength; 959 struct aml_environ *copy; 960 struct aml_processor *proc; 961 union aml_object *obj; 962 963 start = env->dp; 964 pkglength = aml_parse_pkglength(env); 965 copy = memman_alloc(aml_memman, memid_aml_environ); 966 if (copy == NULL) { 967 env->stat = aml_stat_panic; 968 return; 969 } 970 AML_ALLOC_OBJECT(obj, env, aml_t_processor,); 971 proc = &obj->proc; 972 AML_DEBUGPRINT("Processor("); 973 name = aml_parse_namestring(env); 974 aml_print_namestring(name); 975 proc->id = aml_parse_bytedata(env); 976 proc->addr = aml_parse_dworddata(env); 977 proc->len = aml_parse_bytedata(env); 978 AML_DEBUGPRINT(", %d, 0x%x, 0x%x) {\n", proc->id, proc->addr, proc->len); 979 *copy = *env; 980 AML_CREATE_NAME(copy->curname, env, name,); 981 if (copy->curname->property != NULL) { 982 env->stat = aml_stat_panic; 983 AML_DEBUGPRINT("Already Defined \n"); 984 goto out; 985 } 986 copy->curname->property = obj; 987 env->dp = copy->end = start + pkglength; 988 aml_parse_objectlist(copy, indent + 1); 989 aml_print_indent(indent); 990 AML_DEBUGPRINT("}"); 991 aml_free_objectcontent(©->tempobject); 992 993 AML_SYSASSERT(copy->dp == copy->end); 994out: 995 memman_free(aml_memman, memid_aml_environ, copy); 996} 997 998static void 999aml_parse_defpowerres(struct aml_environ *env, int indent) 1000{ 1001 u_int8_t *start; 1002 u_int8_t *name; 1003 u_int32_t pkglength; 1004 struct aml_environ *copy; 1005 struct aml_powerres *pres; 1006 union aml_object *obj; 1007 1008 start = env->dp; 1009 pkglength = aml_parse_pkglength(env); 1010 copy = memman_alloc(aml_memman, memid_aml_environ); 1011 if (copy == NULL) { 1012 env->stat = aml_stat_panic; 1013 return; 1014 } 1015 AML_DEBUGPRINT("PowerResource("); 1016 AML_ALLOC_OBJECT(obj, env, aml_t_powerres,); 1017 name = aml_parse_namestring(env); 1018 aml_print_namestring(name); 1019 pres = &obj->pres; 1020 pres->level = aml_parse_bytedata(env); 1021 pres->order = aml_parse_worddata(env); 1022 AML_DEBUGPRINT(", %d, %d) {\n", pres->level, pres->order); 1023 *copy = *env; 1024 AML_CREATE_NAME(copy->curname, env, name,); 1025 if (copy->curname->property != NULL) { 1026 env->stat = aml_stat_panic; 1027 AML_DEBUGPRINT("Already Defined \n"); 1028 goto out; 1029 } 1030 copy->curname->property = obj; 1031 env->dp = copy->end = start + pkglength; 1032 1033 aml_parse_objectlist(copy, indent + 1); 1034 aml_print_indent(indent); 1035 AML_DEBUGPRINT("}"); 1036 aml_free_objectcontent(©->tempobject); 1037 1038 AML_SYSASSERT(copy->dp == copy->end); 1039out: 1040 memman_free(aml_memman, memid_aml_environ, copy); 1041} 1042 1043static void 1044aml_parse_defthermalzone(struct aml_environ *env, int indent) 1045{ 1046 u_int8_t *start; 1047 u_int8_t *name; 1048 u_int32_t pkglength; 1049 struct aml_environ *copy; 1050 1051 start = env->dp; 1052 pkglength = aml_parse_pkglength(env); 1053 copy = memman_alloc(aml_memman, memid_aml_environ); 1054 if (copy == NULL) { 1055 env->stat = aml_stat_panic; 1056 return; 1057 } 1058 AML_DEBUGPRINT("ThermalZone("); 1059 name = aml_parse_namestring(env); 1060 aml_print_namestring(name); 1061 AML_DEBUGPRINT(") {\n"); 1062 *copy = *env; 1063 AML_CREATE_NAME(copy->curname, env, name,); 1064 if (copy->curname->property != NULL) { 1065 env->stat = aml_stat_panic; 1066 AML_DEBUGPRINT("Already Defined \n"); 1067 goto out; 1068 } 1069 AML_ALLOC_OBJECT(copy->curname->property, env, aml_t_therm,); 1070 env->dp = copy->end = start + pkglength; 1071 aml_parse_objectlist(copy, indent + 1); 1072 aml_print_indent(indent); 1073 AML_DEBUGPRINT("}"); 1074 aml_free_objectcontent(©->tempobject); 1075 AML_SYSASSERT(copy->dp == copy->end); 1076out: 1077 memman_free(aml_memman, memid_aml_environ, copy); 1078} 1079 1080static struct aml_name * 1081aml_parse_defelse(struct aml_environ *env, int indent, int num) 1082{ 1083 u_int8_t *start, *end, *oend; 1084 u_int32_t pkglength; 1085 struct aml_name *aname; 1086 1087 start = env->dp; 1088 pkglength = aml_parse_pkglength(env); 1089 oend = env->end; 1090 env->end = end = start + pkglength; 1091 aname = NULL; 1092 1093 AML_DEBUGPRINT("Else {\n"); 1094 if (num == 0) { 1095 aname = aml_parse_objectlist(env, indent + 1); 1096 aml_print_indent(indent); 1097 } 1098 AML_DEBUGPRINT("}"); 1099 1100 env->dp = end; 1101 env->end = oend; 1102 return (aname); 1103} 1104 1105static struct aml_name * 1106aml_parse_defif(struct aml_environ *env, int indent) 1107{ 1108 u_int8_t *start, *end, *oend; 1109 u_int32_t pkglength; 1110 int num; 1111 struct aml_name *aname, *aname1; 1112 1113 start = env->dp; 1114 pkglength = aml_parse_pkglength(env); 1115 aname = NULL; 1116 1117 AML_DEBUGPRINT("If("); 1118 num = aml_objtonum(env, aml_eval_name 1119 (env, aml_parse_termobj(env, indent))); 1120 oend = env->end; 1121 end = start + pkglength; 1122 AML_DEBUGPRINT(")"); 1123 if (num) { 1124 AML_DEBUGPRINT("{\n"); 1125 env->end = end; 1126 aname = aml_parse_objectlist(env, indent + 1); 1127 aml_print_indent(indent); 1128 AML_DEBUGPRINT("}"); 1129 } 1130 env->dp = end; 1131 env->end = oend; 1132 if ((end < oend) && *(env->dp) == 0xa1) { 1133 env->dp++; 1134 aname1 = aml_parse_defelse(env, indent, num); 1135 aname = (num == 0) ? aname1 : aname; 1136 } 1137 return (aname); 1138} 1139 1140static struct aml_name * 1141aml_parse_defwhile(struct aml_environ *env, int indent) 1142{ 1143 u_int8_t *start, *end, *oend; 1144 u_int32_t pkglength; 1145 int num; 1146 struct aml_name *aname; 1147 1148 start = env->dp; 1149 pkglength = aml_parse_pkglength(env); 1150 oend = env->end; 1151 end = start + pkglength; 1152 aname = NULL; 1153 for (;;) { 1154 env->dp = start; 1155 aml_parse_pkglength(env); 1156 AML_DEBUGPRINT("While("); 1157 num = aml_objtonum(env, aml_eval_name 1158 (env, aml_parse_termobj(env, indent))); 1159 AML_DEBUGPRINT(")"); 1160 if (num == 0) { 1161 break; 1162 } 1163 AML_DEBUGPRINT(" {\n"); 1164 env->end = end; 1165 aname = aml_parse_objectlist(env, indent + 1); 1166 if (env->stat == aml_stat_step) { 1167 AML_DEBUGGER(env, env); 1168 continue; 1169 } 1170 if (env->stat != aml_stat_none) 1171 break; 1172 aml_print_indent(indent); 1173 AML_DEBUGPRINT("}"); 1174 } 1175 AML_DEBUGPRINT("\n"); 1176 env->dp = end; 1177 env->end = oend; 1178 if (env->stat == aml_stat_break) { 1179 env->stat = aml_stat_none; 1180 aname = NULL; 1181 } 1182 return (aname); 1183} 1184 1185static void 1186aml_parse_defmutex(struct aml_environ *env, int indent) 1187{ 1188 char *name; 1189 struct aml_name *aname; 1190 struct aml_mutex *mut; 1191 1192 /* MutexOp */ 1193 AML_DEBUGPRINT("Mutex("); 1194 name = (char *)aml_parse_namestring(env); 1195 aml_print_namestring((unsigned char *)name); 1196 AML_CREATE_NAME(aname, env, (unsigned char *)name,); 1197 if (aname->property != NULL) { 1198 env->stat = aml_stat_panic; 1199 AML_DEBUGPRINT("Already Defined \n"); 1200 return; 1201 } 1202 AML_ALLOC_OBJECT(aname->property, env, aml_t_mutex,); 1203 mut = &aname->property->mutex; 1204 mut->level = *env->dp++; 1205 STAILQ_INIT(&mut->queue); 1206 AML_DEBUGPRINT(", %d)", mut->level); 1207} 1208 1209static void 1210aml_createfield_generic(struct aml_environ *env, 1211 union aml_object *srcbuf, int idx, 1212 int len, char *newname) 1213{ 1214 struct aml_bufferfield *field; 1215 struct aml_name *aname; 1216 1217 if (srcbuf == NULL || srcbuf->type != aml_t_buffer) { 1218 AML_DEBUGPRINT("Not Buffer assigned,"); 1219 env->stat = aml_stat_panic; 1220 return; 1221 } 1222 AML_CREATE_NAME(aname, env, (unsigned char *)newname,); 1223 if (aname->property != NULL) { 1224 env->stat = aml_stat_panic; 1225 AML_DEBUGPRINT("Already Defined \n"); 1226 return; 1227 } 1228 AML_ALLOC_OBJECT(aname->property, env, aml_t_bufferfield,); 1229 field = &aname->property->bfld; 1230 field->bitoffset = idx; 1231 field->bitlen = len; 1232 field->origin = srcbuf->buffer.data; 1233} 1234 1235static void 1236aml_parse_defcreatefield(struct aml_environ *env, int indent) 1237{ 1238 int idx, len; 1239 char *newname; 1240 union aml_object *obj, *srcbuf; 1241 1242 /* CreateFieldOp */ 1243 AML_DEBUGPRINT("CreateField("); 1244 srcbuf = aml_eval_name(env, aml_parse_termobj(env, indent)); 1245 if (srcbuf == &env->tempobject) { 1246 AML_DEBUGPRINT("NONAMED BUFFER\n"); 1247 env->stat = aml_stat_panic; 1248 return; 1249 } 1250 AML_DEBUGPRINT(", "); 1251 obj = aml_eval_name(env, aml_parse_termobj(env, indent)); 1252 idx = aml_objtonum(env, obj); 1253 AML_DEBUGPRINT(", "); 1254 obj = aml_eval_name(env, aml_parse_termobj(env, indent)); 1255 len = aml_objtonum(env, obj); 1256 AML_DEBUGPRINT(", "); 1257 newname = (char *)aml_parse_namestring(env); 1258 aml_print_namestring((unsigned char *)newname); 1259 aml_createfield_generic(env, srcbuf, idx, len, newname); 1260 AML_DEBUGPRINT(") "); 1261} 1262 1263/* 1264 * Returns Named object or parser buffer. The object need not be free because 1265 * it returns preallocated buffer in env or Contain of named object. If You 1266 * need to preserve object, create a copy and then store. And The object 1267 * returned from this function is not valid after another call is 1268 * shared, tempolary buffer may be shared. 1269 */ 1270struct aml_name * 1271aml_parse_termobj(struct aml_environ *env, int indent) 1272{ 1273 u_int8_t opcode; 1274 u_int8_t *name; 1275 int value; 1276 int num1, num2; 1277 int len; 1278 int match1, match2, i, pkgval, start; 1279 int widthindex, idx; 1280 char *newname; 1281 struct aml_name *aname; 1282 struct aml_name *destname1, *destname2; 1283 struct aml_name *tmpname, *srcname; 1284 struct aml_name *src; 1285 union aml_object *ret; 1286 union aml_object *tmpobj; 1287 union aml_object anum; 1288 union aml_object *objref; 1289 union aml_object *srcobj; 1290 union aml_object *obj; 1291 union aml_object *srcbuf; 1292 static int widthtbl[4] = {32, 16, 8, 1}; 1293 const char *opname[4] = {"CreateDWordField", "CreateWordField", 1294 "CreateByteField", "CreateBitField"}; 1295 1296 aname = &env->tempname; 1297 ret = &env->tempobject; 1298 anum.type = aml_t_num; 1299 aname->property = ret; 1300 aml_free_objectcontent(ret); 1301 if (env->stat == aml_stat_panic) { 1302 /* 1303 * If previously parser panic , parsing next instruction is 1304 * prohibited. 1305 */ 1306 return (NULL); 1307 } 1308 aname = NULL; 1309 opcode = *env->dp++; 1310 switch (opcode) { 1311 case '\\': 1312 case '^': 1313 case 'A' ... 'Z': 1314 case '_': 1315 case '.': 1316 case '/': 1317 env->dp--; 1318 ret->type = aml_t_namestr; 1319 ret->nstr.dp = aml_parse_namestring(env); 1320 aml_print_namestring(ret->nstr.dp); 1321 aname = &env->tempname; 1322 break; 1323 case 0x0a: /* BytePrefix */ 1324 ret->type = aml_t_num; 1325 value = aml_parse_bytedata(env); 1326 ret->num.number = value; 1327 AML_DEBUGPRINT("0x%x", value); 1328 aname = &env->tempname; 1329 break; 1330 case 0x0b: /* WordPrefix */ 1331 ret->type = aml_t_num; 1332 value = aml_parse_worddata(env); 1333 ret->num.number = value; 1334 AML_DEBUGPRINT("0x%x", value); 1335 aname = &env->tempname; 1336 break; 1337 case 0x0c: /* DWordPrefix */ 1338 ret->type = aml_t_num; 1339 value = aml_parse_dworddata(env); 1340 ret->num.number = value; 1341 AML_DEBUGPRINT("0x%x", value); 1342 aname = &env->tempname; 1343 break; 1344 case 0x0d: /* StringPrefix */ 1345 ret->type = aml_t_string; 1346 ret->str.string = env->dp; 1347 len = strlen((const char *)env->dp); 1348 ret->str.needfree = 0; 1349 AML_DEBUGPRINT("\"%s\"", (const char *)ret->str.string); 1350 env->dp += (len + 1); 1351 aname = &env->tempname; 1352 break; 1353 case 0x00: /* ZeroOp */ 1354 ret->type = aml_t_num; 1355 ret->num.number = 0; 1356 ret->num.constant = 1; 1357 AML_DEBUGPRINT("Zero"); 1358 aname = &env->tempname; 1359 break; 1360 case 0x01: /* OneOp */ 1361 ret->type = aml_t_num; 1362 ret->num.number = 1; 1363 ret->num.constant = 1; 1364 AML_DEBUGPRINT("One"); 1365 aname = &env->tempname; 1366 break; 1367 case 0xff: /* OnesOp */ 1368 ret->type = aml_t_num; 1369 ret->num.number = 0xffffffff; 1370 ret->num.constant = 1; 1371 AML_DEBUGPRINT("Ones"); 1372 aname = &env->tempname; 1373 break; 1374 case 0x06: /* AliasOp */ 1375 AML_DEBUGPRINT("Alias("); 1376 tmpname = aml_parse_termobj(env, indent); 1377 if (env->stat == aml_stat_panic) { 1378 return (NULL); 1379 } 1380 if (tmpname->property == NULL || 1381 tmpname->property->type != aml_t_namestr) { 1382 env->stat = aml_stat_panic; 1383 return (NULL); 1384 } 1385 /* 1386 * XXX if srcname is deleted after this object, what 1387 * shall I do? 1388 */ 1389 srcname = aml_search_name(env, tmpname->property->nstr.dp); 1390 AML_DEBUGPRINT(", "); 1391 name = aml_parse_namestring(env); 1392 aml_print_namestring(name); 1393 AML_CREATE_NAME(aname, env, name, 0); 1394 if (aname->property != NULL) { 1395 env->stat = aml_stat_panic; 1396 AML_DEBUGPRINT("Already Defined \n"); 1397 aml_print_curname(aname); 1398 return (NULL); 1399 } 1400 AML_ALLOC_OBJECT(aname->property, env, aml_t_objref, NULL); 1401 objref = aname->property; 1402 objref->objref.nameref = srcname; 1403 objref->objref.ref = srcname->property; 1404 objref->objref.offset = -1; 1405 objref->objref.alias = 1; /* Yes, this is an alias */ 1406 AML_DEBUGPRINT(")"); 1407 /* shut the interpreter up during the namespace initializing */ 1408 return (NULL); 1409 case 0x08: /* NameOp */ 1410 AML_DEBUGPRINT("Name("); 1411 name = aml_parse_namestring(env); 1412 aml_print_namestring(name); 1413 AML_CREATE_NAME(aname, env, name, 0); 1414 if (env->stat == aml_stat_panic) { 1415 AML_DEBUGPRINT("Already Defined \n"); 1416 aml_print_curname(aname); 1417 return (NULL); 1418 } 1419 AML_DEBUGPRINT(", "); 1420 AML_COPY_OBJECT(aname->property, env, 1421 aml_eval_name(env, 1422 aml_parse_termobj(env, indent)), 1423 NULL); 1424 AML_DEBUGPRINT(")"); 1425 break; 1426 case 0x10: /* ScopeOp */ 1427 aml_parse_defscope(env, indent); 1428 break; 1429 case 0x11: /* BufferOp */ 1430 aname = &env->tempname; 1431 aname->property = aml_parse_defbuffer(env, indent); 1432 break; 1433 case 0x12: /* PackageOp */ 1434 aname = &env->tempname; 1435 aname->property = aml_parse_defpackage(env, indent); 1436 break; 1437 case 0x14: /* MethodOp */ 1438 aml_parse_defmethod(env, indent); 1439 break; 1440 case 0x5b: /* ExtOpPrefix */ 1441 opcode = *env->dp++; 1442 switch (opcode) { 1443 case 0x01: 1444 aml_parse_defmutex(env, indent); 1445 break; 1446 case 0x02: /* EventOp */ 1447 AML_DEBUGPRINT("Event("); 1448 name = aml_parse_namestring(env); 1449 aml_print_namestring(name); 1450 AML_CREATE_NAME(aname, env, name, 0); 1451 if (aname->property != NULL) { 1452 env->stat = aml_stat_panic; 1453 AML_DEBUGPRINT("Already Defined \n"); 1454 return (NULL); 1455 } 1456 AML_ALLOC_OBJECT(aname->property, env, aml_t_event, NULL); 1457 AML_DEBUGPRINT(")"); 1458 return (NULL); 1459 break; 1460 case 0x12: /* CondRefOfOp */ 1461 AML_DEBUGPRINT("CondRefOf("); 1462 src = aml_parse_termobj(env, indent); 1463 AML_DEBUGPRINT(", "); 1464 if (src == &env->tempname || src == NULL) { 1465 aml_parse_termobj(env, indent); 1466 AML_DEBUGPRINT(")"); 1467 anum.num.number = 0xffffffff; 1468 env->tempobject.num = anum.num; 1469 aname = &env->tempname; 1470 break; 1471 } 1472 AML_ALLOC_OBJECT(objref, env, aml_t_objref, NULL); 1473 if (src->property == NULL || 1474 src->property->type != aml_t_namestr) { 1475 objref->objref.nameref = src; 1476 } else { 1477 objref->objref.nameref = aml_create_local_object(); 1478 } 1479 objref->objref.ref = src->property; 1480 objref->objref.offset = -1; /* different from IndexOp */ 1481 1482 destname1 = aml_parse_termobj(env, indent); 1483 aml_store_to_name(env, objref, destname1); 1484 anum.num.number = 0; 1485 env->tempobject.num = anum.num; 1486 aname = &env->tempname; 1487 AML_DEBUGPRINT(")"); 1488 break; 1489 case 0x13: 1490 aml_parse_defcreatefield(env, indent); 1491 break; 1492 case 0x20: /* LoadOp *//* XXX Not Impremented */ 1493 AML_DEBUGPRINT("Load("); 1494 aml_parse_termobj(env, indent); 1495 AML_DEBUGPRINT(", "); 1496 aml_parse_termobj(env, indent); 1497 AML_DEBUGPRINT(")"); 1498 break; 1499 case 0x21: /* StallOp */ 1500 AML_DEBUGPRINT("Stall("); 1501 num1 = aml_objtonum(env, aml_eval_name(env, 1502 aml_parse_termobj(env, indent))); 1503 AML_DEBUGPRINT(")"); 1504 AML_STALL(num1); 1505 break; 1506 case 0x22: /* SleepOp */ 1507 AML_DEBUGPRINT("Sleep("); 1508 num1 = aml_objtonum(env, aml_eval_name(env, 1509 aml_parse_termobj(env, indent))); 1510 AML_SLEEP(0, num1); 1511 AML_DEBUGPRINT(")"); 1512 break; 1513 case 0x23: /* AcquireOp *//* XXX Not yet */ 1514 AML_DEBUGPRINT("Acquire("); 1515 aml_parse_termobj(env, indent); 1516 AML_DEBUGPRINT(", 0x%x)", aml_parse_worddata(env)); 1517 break; 1518 case 0x24: /* SignalOp *//* XXX Not yet */ 1519 AML_DEBUGPRINT("Signal("); 1520 aml_parse_termobj(env, indent); 1521 AML_DEBUGPRINT(")"); 1522 break; 1523 case 0x25: /* WaitOp *//* XXX Not yet impremented */ 1524 AML_DEBUGPRINT("Wait("); 1525 aml_parse_termobj(env, indent); 1526 AML_DEBUGPRINT(", "); 1527 aml_parse_termobj(env, indent); 1528 AML_DEBUGPRINT(")"); 1529 break; 1530 case 0x26: /* ResetOp *//* XXX Not yet impremented */ 1531 AML_DEBUGPRINT("Reset("); 1532 aml_parse_termobj(env, indent); 1533 AML_DEBUGPRINT(")"); 1534 break; 1535 case 0x27: /* ReleaseOp *//* XXX Not yet impremented */ 1536 AML_DEBUGPRINT("Release("); 1537 aml_parse_termobj(env, indent); 1538 AML_DEBUGPRINT(")"); 1539 break; 1540#define NUMOP2(opname, operation) do { \ 1541 AML_DEBUGPRINT(opname); \ 1542 AML_DEBUGPRINT("("); \ 1543 num1 = aml_objtonum(env, aml_eval_name(env, \ 1544 aml_parse_termobj(env, indent))); \ 1545 AML_DEBUGPRINT(", "); \ 1546 anum.num.number = operation (num1); \ 1547 destname1 = aml_parse_termobj(env, indent); \ 1548 AML_DEBUGPRINT(")"); \ 1549 aml_store_to_name(env, &anum, destname1); \ 1550 env->tempobject.num = anum.num; \ 1551 env->tempname.property = &env->tempobject; \ 1552 aname = &env->tempname; \ 1553} while(0) 1554 1555 case 0x28: /* FromBCDOp */ 1556 NUMOP2("FromBCD", frombcd); 1557 break; 1558 case 0x29: /* ToBCDOp */ 1559 NUMOP2("ToBCD", tobcd); 1560 break; 1561 case 0x2a: /* UnloadOp *//* XXX Not yet impremented */ 1562 AML_DEBUGPRINT("Unload("); 1563 aml_parse_termobj(env, indent); 1564 AML_DEBUGPRINT(")"); 1565 break; 1566 case 0x30: 1567 env->tempobject.type = aml_t_num; 1568 env->tempobject.num.number = 0; 1569 env->tempobject.num.constant = 1; 1570 AML_DEBUGPRINT("Revision"); 1571 break; 1572 case 0x31: 1573 env->tempobject.type = aml_t_debug; 1574 aname = &env->tempname; 1575 AML_DEBUGPRINT("Debug"); 1576 break; 1577 case 0x32: /* FatalOp */ 1578 AML_DEBUGPRINT("Fatal("); 1579 AML_DEBUGPRINT("0x%x, ", aml_parse_bytedata(env)); 1580 AML_DEBUGPRINT("0x%x, ", aml_parse_dworddata(env)); 1581 aml_parse_termobj(env, indent); 1582 env->stat = aml_stat_panic; 1583 AML_DEBUGPRINT(")"); 1584 break; 1585 case 0x80: /* OpRegionOp */ 1586 aml_parse_defopregion(env, indent); 1587 break; 1588 case 0x81: /* FieldOp */ 1589 aml_parse_deffield(env, indent); 1590 break; 1591 case 0x82: /* DeviceOp */ 1592 aml_parse_defdevice(env, indent); 1593 break; 1594 case 0x83: /* ProcessorOp */ 1595 aml_parse_defprocessor(env, indent); 1596 break; 1597 case 0x84: /* PowerResOp */ 1598 aml_parse_defpowerres(env, indent); 1599 break; 1600 case 0x85: /* ThermalZoneOp */ 1601 aml_parse_defthermalzone(env, indent); 1602 break; 1603 case 0x86: /* IndexFieldOp */ 1604 aml_parse_defindexfield(env, indent); 1605 break; 1606 case 0x87: /* BankFieldOp */ 1607 aml_parse_defbankfield(env, indent); 1608 break; 1609 default: 1610 AML_SYSERRX(1, "strange opcode 0x5b, 0x%x\n", opcode); 1611 AML_SYSABORT(); 1612 } 1613 break; 1614 case 0x68 ... 0x6e: /* ArgN */ 1615 AML_DEBUGPRINT("Arg%d", opcode - 0x68); 1616 return (aml_local_stack_getArgX(NULL, opcode - 0x68)); 1617 break; 1618 case 0x60 ... 0x67: 1619 AML_DEBUGPRINT("Local%d", opcode - 0x60); 1620 return (aml_local_stack_getLocalX(opcode - 0x60)); 1621 break; 1622 case 0x70: /* StoreOp */ 1623 AML_DEBUGPRINT("Store("); 1624 aname = aml_create_local_object(); 1625 AML_COPY_OBJECT(tmpobj, env, 1626 aml_eval_name(env, aml_parse_termobj(env, indent)), NULL); 1627 aname->property = tmpobj; 1628 AML_DEBUGPRINT(", "); 1629 destname1 = aml_parse_termobj(env, indent); 1630 AML_DEBUGPRINT(")"); 1631 /* XXX 1632 * temporary object may change during aml_store_to_name() 1633 * operation, so we make a copy of it on stack. 1634 */ 1635 if (destname1 == &env->tempname && 1636 destname1->property == &env->tempobject) { 1637 destname1 = aml_create_local_object(); 1638 AML_COPY_OBJECT(destname1->property, env, 1639 &env->tempobject, NULL); 1640 } 1641 aml_store_to_name(env, tmpobj, destname1); 1642 if (env->stat == aml_stat_panic) { 1643 AML_DEBUGPRINT("StoreOp failed"); 1644 return (NULL); 1645 } 1646 aname = aml_create_local_object(); 1647 AML_COPY_OBJECT(tmpobj, env, destname1->property, NULL); 1648 aname->property = tmpobj; 1649 if (tmpobj == NULL) { 1650 printf("???"); 1651 break; 1652 } 1653 break; 1654 case 0x71: /* RefOfOp */ 1655 AML_DEBUGPRINT("RefOf("); 1656 src = aml_parse_termobj(env, indent); 1657 AML_DEBUGPRINT(")"); 1658 1659 aname = aml_create_local_object(); 1660 AML_ALLOC_OBJECT(aname->property, env, aml_t_objref, NULL); 1661 objref = aname->property; 1662 if (src->property == NULL || 1663 src->property->type != aml_t_namestr) { 1664 objref->objref.nameref = src; 1665 } else { 1666 objref->objref.nameref = aml_create_local_object(); 1667 } 1668 objref->objref.ref = src->property; 1669 objref->objref.offset = -1; /* different from IndexOp */ 1670 break; 1671 1672#define NUMOP3_2(opname, oparation, ope2) do { \ 1673 AML_DEBUGPRINT(opname); \ 1674 AML_DEBUGPRINT("("); \ 1675 num1 = aml_objtonum(env, aml_eval_name(env, \ 1676 aml_parse_termobj(env, indent))); \ 1677 AML_DEBUGPRINT(", "); \ 1678 num2 = aml_objtonum(env, aml_eval_name(env, \ 1679 aml_parse_termobj(env, indent))); \ 1680 AML_DEBUGPRINT(", "); \ 1681 anum.num.number = ope2(num1 oparation num2); \ 1682 destname1 = aml_parse_termobj(env, indent); \ 1683 AML_DEBUGPRINT(")"); \ 1684 aml_store_to_name(env, &anum, destname1); \ 1685 env->tempobject.num = anum.num; \ 1686 env->tempname.property = &env->tempobject; \ 1687 aname = &env->tempname; \ 1688} while(0) 1689 1690#define NUMOP3(opname, operation) NUMOP3_2(opname, operation, ) 1691#define NUMOPN3(opname, operation) NUMOP3_2(opname, operation, ~) 1692 1693 case 0x72: /* AddOp */ 1694 NUMOP3("Add", +); 1695 break; 1696 case 0x73: /* ConcatOp */ 1697 aname = aml_parse_concatop(env, indent); 1698 break; 1699 case 0x74: /* SubtractOp */ 1700 NUMOP3("Subtract", -); 1701 break; 1702 case 0x75: /* IncrementOp */ 1703 AML_DEBUGPRINT("Increment("); 1704 aname = aml_parse_termobj(env, indent); 1705 num1 = aml_objtonum(env, aml_eval_name(env, aname)); 1706 num1++; 1707 anum.num.number = num1; 1708 AML_DEBUGPRINT(")"); 1709 aml_store_to_name(env, &anum, aname); 1710 aname = &env->tempname; 1711 env->tempobject.num = anum.num; 1712 break; 1713 case 0x76: /* DecrementOp */ 1714 AML_DEBUGPRINT("Decrement("); 1715 aname = aml_parse_termobj(env, indent); 1716 num1 = aml_objtonum(env, aml_eval_name(env, aname)); 1717 num1--; 1718 anum.num.number = num1; 1719 AML_DEBUGPRINT(")"); 1720 aml_store_to_name(env, &anum, aname); 1721 aname = &env->tempname; 1722 env->tempobject.num = anum.num; 1723 break; 1724 case 0x77: /* MultiplyOp */ 1725 NUMOP3("Multiply", *); 1726 break; 1727 case 0x78: /* DivideOp */ 1728 AML_DEBUGPRINT("Divide("); 1729 num1 = aml_objtonum(env, aml_eval_name(env, 1730 aml_parse_termobj(env, indent))); 1731 AML_DEBUGPRINT(", "); 1732 num2 = aml_objtonum(env, aml_eval_name(env, 1733 aml_parse_termobj(env, indent))); 1734 AML_DEBUGPRINT(", "); 1735 anum.num.number = num1 % num2; 1736 destname1 = aml_parse_termobj(env, indent); 1737 aml_store_to_name(env, &anum, destname1); 1738 AML_DEBUGPRINT(", "); 1739 anum.num.number = num1 / num2; 1740 destname2 = aml_parse_termobj(env, indent); 1741 AML_DEBUGPRINT(")"); 1742 aml_store_to_name(env, &anum, destname2); 1743 env->tempobject.num = anum.num; 1744 aname = &env->tempname; 1745 break; 1746 case 0x79: /* ShiftLeftOp */ 1747 NUMOP3("ShiftLeft", <<); 1748 break; 1749 case 0x7a: /* ShiftRightOp */ 1750 NUMOP3("ShiftRight", >>); 1751 break; 1752 case 0x7b: /* AndOp */ 1753 NUMOP3("And", &); 1754 break; 1755 case 0x7c: /* NAndOp */ 1756 NUMOPN3("NAnd", &); 1757 break; 1758 case 0x7d: /* OrOp */ 1759 NUMOP3("Or", |); 1760 break; 1761 case 0x7e: /* NOrOp */ 1762 NUMOPN3("NOr", |); 1763 break; 1764 case 0x7f: /* XOrOp */ 1765 NUMOP3("XOr", ^); 1766 break; 1767 case 0x80: /* NotOp */ 1768 NUMOP2("Not", ~); 1769 break; 1770 case 0x81: /* FindSetLeftBitOp */ 1771 NUMOP2("FindSetLeftBit", findsetleftbit); 1772 break; 1773 case 0x82: /* FindSetRightBitOp */ 1774 NUMOP2("FindSetRightBit", findsetrightbit); 1775 break; 1776 case 0x83: /* DerefOp */ 1777 AML_DEBUGPRINT("DerefOf("); 1778 objref = aml_eval_name(env, aml_parse_termobj(env, indent)); 1779 AML_DEBUGPRINT(")"); 1780 1781 if (objref->objref.ref == NULL) { 1782 env->tempname.property = objref->objref.ref; 1783 aname = &env->tempname; 1784 break; 1785 } 1786 switch (objref->objref.ref->type) { 1787 case aml_t_package: 1788 case aml_t_buffer: 1789 if (objref->objref.offset < 0) { 1790 env->tempname.property = objref->objref.ref; 1791 } else { 1792 objref->objref.deref = 1; 1793 env->tempname.property = objref; 1794 } 1795 break; 1796 default: 1797 env->tempname.property = objref->objref.ref; 1798 break; 1799 } 1800 1801 aname = &env->tempname; 1802 break; 1803 case 0x86: /* NotifyOp *//* XXX Not yet impremented */ 1804 AML_DEBUGPRINT("Notify("); 1805 aml_parse_termobj(env, indent); 1806 AML_DEBUGPRINT(", "); 1807 aml_parse_termobj(env, indent); 1808 AML_DEBUGPRINT(")"); 1809 break; 1810 case 0x87: /* SizeOfOp */ 1811 AML_DEBUGPRINT("SizeOf("); 1812 aname = aml_parse_termobj(env, indent); 1813 tmpobj = aml_eval_name(env, aname); 1814 1815 AML_DEBUGPRINT(")"); 1816 num1 = 0; 1817 switch (tmpobj->type) { 1818 case aml_t_buffer: 1819 num1 = tmpobj->buffer.size; 1820 break; 1821 case aml_t_string: 1822 num1 = strlen((const char *)tmpobj->str.string); 1823 break; 1824 case aml_t_package: 1825 num1 = tmpobj->package.elements; 1826 break; 1827 default: 1828 AML_DEBUGPRINT("Args of SizeOf should be " 1829 "buffer/string/package only\n"); 1830 break; 1831 } 1832 1833 anum.num.number = num1; 1834 env->tempobject.num = anum.num; 1835 aname = &env->tempname; 1836 break; 1837 case 0x88: /* IndexOp */ 1838 AML_DEBUGPRINT("Index("); 1839 srcobj = aml_eval_name(env, aml_parse_termobj(env, indent)); 1840 AML_DEBUGPRINT(", "); 1841 num1 = aml_objtonum(env, aml_eval_name(env, 1842 aml_parse_termobj(env, indent))); 1843 AML_DEBUGPRINT(", "); 1844 destname1 = aml_parse_termobj(env, indent); 1845 AML_DEBUGPRINT(")"); 1846 aname = aml_create_local_object(); 1847 switch (srcobj->type) { 1848 case aml_t_package: 1849 case aml_t_buffer: 1850 AML_ALLOC_OBJECT(objref, env, aml_t_objref, NULL); 1851 aname->property = objref; 1852 objref->objref.ref = srcobj; 1853 objref->objref.offset = num1; 1854 objref->objref.deref = 0; 1855 break; 1856 default: 1857 AML_DEBUGPRINT("Arg0 of Index should be either " 1858 "buffer or package\n"); 1859 return (aname); 1860 } 1861 1862 aml_store_to_name(env, objref, destname1); 1863 break; 1864 case 0x89: /* MatchOp *//* XXX Not yet Impremented */ 1865 AML_DEBUGPRINT("Match("); 1866 AML_COPY_OBJECT(obj, env, aml_eval_name(env, 1867 aml_parse_termobj(env, indent)), NULL); 1868 if (obj->type != aml_t_package) { 1869 env->stat = aml_stat_panic; 1870 return (NULL); 1871 } 1872 anum.num.number = 0xffffffff; 1873 match1 = *env->dp; 1874 AML_DEBUGPRINT(", %d", *env->dp); 1875 env->dp++; 1876 num1 = aml_objtonum(env, aml_eval_name(env, 1877 aml_parse_termobj(env, indent))); 1878 match2 = *env->dp; 1879 AML_DEBUGPRINT(", %d", *env->dp); 1880 env->dp++; 1881 num2 = aml_objtonum(env, aml_eval_name(env, 1882 aml_parse_termobj(env, indent))); 1883 AML_DEBUGPRINT(", "); 1884 start = aml_objtonum(env, aml_eval_name(env, 1885 aml_parse_termobj(env, indent))); 1886 1887#define MATCHOP(opnum, arg1, arg2) ((opnum == 0) ? (1) : \ 1888 (opnum == 1) ? ((arg1) == (arg2)) : \ 1889 (opnum == 2) ? ((arg1) <= (arg2)) : \ 1890 (opnum == 3) ? ((arg1) < (arg2)) : \ 1891 (opnum == 4) ? ((arg1) >= (arg2)) : \ 1892 (opnum == 5) ? ((arg1) > (arg2)) : 0 ) 1893 1894 for (i = start; i < obj->package.elements; i++) { 1895 pkgval = aml_objtonum(env, obj->package.objects[i]); 1896 if (MATCHOP(match1, pkgval, num1) && 1897 MATCHOP(match2, pkgval, num2)) { 1898 anum.num.number = i; 1899 break; 1900 } 1901 } 1902 AML_DEBUGPRINT(")"); 1903 aml_free_object(&obj); 1904 aname = &env->tempname; 1905 env->tempname.property = &env->tempobject; 1906 env->tempobject.num = anum.num; 1907 break; 1908#undef MATCHOP 1909 case 0x8a ... 0x8d: /* CreateDWordFieldOp */ 1910 widthindex = *(env->dp - 1) - 0x8a; 1911 AML_DEBUGPRINT("%s(", opname[widthindex]); 1912 srcbuf = aml_eval_name(env, aml_parse_termobj(env, indent)); 1913 if (srcbuf == &env->tempobject) { 1914 AML_DEBUGPRINT("NOT NAMEDBUF\n"); 1915 env->stat = aml_stat_panic; 1916 return (NULL); 1917 } 1918 AML_DEBUGPRINT(", "); 1919 idx = aml_objtonum(env, aml_eval_name(env, 1920 aml_parse_termobj(env, indent))); 1921 if (widthindex != 3) { 1922 idx *= 8; 1923 } 1924 AML_DEBUGPRINT(", "); 1925 newname = (char *)aml_parse_namestring(env); 1926 aml_print_namestring((unsigned char *)newname); 1927 aml_createfield_generic(env, srcbuf, idx, 1928 widthtbl[widthindex], newname); 1929 AML_DEBUGPRINT(")"); 1930 break; 1931 case 0x8e: /* ObjectTypeOp */ 1932 AML_DEBUGPRINT("ObjectType("); 1933 aname = aml_parse_termobj(env, indent); 1934 if (aname == NULL) { 1935 env->tempobject.type = aml_t_num; 1936 env->tempobject.num.number = aml_t_null; 1937 } else { 1938 env->tempobject.type = aml_t_num; 1939 env->tempobject.num.number = aname->property->type; 1940 } 1941 aname = &env->tempname; 1942 AML_DEBUGPRINT(")"); 1943 break; 1944 1945#define CMPOP(opname,operation) do { \ 1946 AML_DEBUGPRINT(opname); \ 1947 AML_DEBUGPRINT("("); \ 1948 num1 = aml_objtonum(env, aml_eval_name(env, \ 1949 aml_parse_termobj(env, indent))); \ 1950 AML_DEBUGPRINT(", "); \ 1951 num2 = aml_objtonum(env, aml_eval_name(env, \ 1952 aml_parse_termobj(env, indent))); \ 1953 aname = &env->tempname; \ 1954 env->tempobject.type = aml_t_num; \ 1955 env->tempobject.num.number = (num1 operation num2) ? 0xffffffff : 0; \ 1956 aname->property = &env->tempobject; \ 1957 AML_DEBUGPRINT(")"); \ 1958} while(0) 1959 1960 case 0x90: 1961 CMPOP("LAnd", &&); 1962 break; 1963 case 0x91: 1964 CMPOP("LOr", ||); 1965 break; 1966 case 0x92: 1967 AML_DEBUGPRINT("LNot("); 1968 num1 = aml_objtonum(env, aml_eval_name(env, 1969 aml_parse_termobj(env, indent))); 1970 aname = &env->tempname; 1971 env->tempobject.type = aml_t_num; 1972 env->tempobject.num.number = (!num1) ? 0xffffffff : 0; 1973 aname->property = &env->tempobject; 1974 AML_DEBUGPRINT(")"); 1975 break; 1976 case 0x93: 1977 CMPOP("LEqual", ==); 1978 break; 1979 case 0x94: 1980 CMPOP("LGreater", >); 1981 break; 1982 case 0x95: 1983 CMPOP("LLess", <); 1984 break; 1985 case 0xa0: /* IfOp */ 1986 aname = aml_parse_defif(env, indent); 1987 break; 1988#if 0 1989 1990 case 0xa1: /* ElseOp should not be treated in Main parser 1991 * But If Op */ 1992 aml_parse_defelse(env, indent); 1993 break; 1994#endif 1995 case 0xa2: /* WhileOp */ 1996 aname = aml_parse_defwhile(env, indent); 1997 break; 1998 case 0xa3: /* NoopOp */ 1999 AML_DEBUGPRINT("Noop"); 2000 break; 2001 case 0xa5: /* BreakOp */ 2002 AML_DEBUGPRINT("Break"); 2003 env->stat = aml_stat_break; 2004 break; 2005 case 0xa4: /* ReturnOp */ 2006 AML_DEBUGPRINT("Return("); 2007 AML_COPY_OBJECT(env->tempname.property, env, aml_eval_name(env, 2008 aml_parse_termobj(env, indent)), NULL); 2009 aname = &env->tempname; 2010 env->stat = aml_stat_return; 2011 AML_DEBUGPRINT(")"); 2012 break; 2013 case 0xcc: /* BreakPointOp */ 2014 /* XXX Not Yet Impremented (Not need?) */ 2015 AML_DEBUGPRINT("BreakPoint"); 2016 break; 2017 default: 2018 AML_SYSERRX(1, "strange opcode 0x%x\n", opcode); 2019 AML_SYSABORT(); 2020 } 2021 2022 return (aname); 2023} 2024