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