1/*	$NetBSD: aml_parse.c,v 1.2 2011/05/30 01:15:30 dyoung 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.2 2011/05/30 01:15:30 dyoung 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(&copy->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		/* Allignment */
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	u_int32_t	offset;
765
766	offset = 0;
767	while (env->dp < env->end) {
768		aml_print_indent(indent);
769		offset = aml_parse_field(env, template);
770		if (env->dp < env->end) {
771			AML_DEBUGPRINT(",\n");
772		} else {
773			AML_DEBUGPRINT("\n");
774		}
775	}
776}
777
778static void
779aml_parse_deffield(struct aml_environ *env, int indent)
780{
781	u_int8_t	flags;
782	u_int8_t	*start, *name;
783	u_int32_t	pkglength;
784	struct	aml_environ *copy;
785	struct	aml_field fieldtemplate;
786	static	const char *lockrules[] = {"NoLock", "Lock"};
787	static	const char *updaterules[] = {"Preserve", "WriteAsOnes",
788					     "WriteAsZeros", "*Error*"};
789
790	start = env->dp;
791	pkglength = aml_parse_pkglength(env);
792	copy = memman_alloc(aml_memman, memid_aml_environ);
793	if (copy == NULL) {
794		env->stat = aml_stat_panic;
795		return;
796	}
797	AML_DEBUGPRINT("Field(");
798	aml_print_namestring(name = aml_parse_namestring(env));
799	fieldtemplate.type = aml_t_field;
800	flags = aml_parse_bytedata(env);
801	fieldtemplate.flags = flags;
802
803	*copy = *env;
804	env->dp = copy->end = start + pkglength;
805	fieldtemplate.bitoffset = 0;
806	fieldtemplate.bitlen = 0;
807	fieldtemplate.f.ftype = f_t_field;
808	fieldtemplate.f.fld.regname = name;
809	AML_DEBUGPRINT(", %s, %s, %s) {\n",
810	    accessnames[flags & 0xf],
811	    lockrules[(flags >> 4) & 1],
812	    updaterules[(flags >> 5) & 3]);
813	aml_parse_fieldlist(copy, &fieldtemplate, indent + 1);
814	aml_print_indent(indent);
815	AML_DEBUGPRINT("}");
816	aml_free_objectcontent(&copy->tempobject);
817
818	AML_SYSASSERT(copy->dp == copy->end);
819	memman_free(aml_memman, memid_aml_environ, copy);
820}
821
822static void
823aml_parse_defindexfield(struct aml_environ *env, int indent)
824{
825	u_int8_t	flags;
826	u_int8_t	*start, *iname, *dname;
827	u_int32_t	pkglength;
828	struct	aml_environ *copy;
829	struct	aml_field template;
830	static	const char *lockrules[] = {"NoLock", "Lock"};
831	static	const char *updaterules[] = {"Preserve", "WriteAsOnes",
832					     "WriteAsZeros", "*Error*"};
833
834	start = env->dp;
835	pkglength = aml_parse_pkglength(env);
836	copy = memman_alloc(aml_memman, memid_aml_environ);
837	if (copy == NULL) {
838		env->stat = aml_stat_panic;
839		return;
840	}
841	AML_DEBUGPRINT("IndexField(");
842	aml_print_namestring(iname = aml_parse_namestring(env));	/* Name1 */
843	AML_DEBUGPRINT(", ");
844	aml_print_namestring(dname = aml_parse_namestring(env));	/* Name2 */
845	template.type = aml_t_field;
846	template.flags = flags = aml_parse_bytedata(env);
847	template.bitoffset = 0;
848	template.bitlen = 0;
849	template.f.ftype = f_t_index;
850	template.f.ifld.indexname = iname;
851	template.f.ifld.dataname = dname;
852	AML_DEBUGPRINT(", %s, %s, %s) {\n",
853	    accessnames[flags & 0xf],
854	    lockrules[(flags >> 4) & 1],
855	    updaterules[(flags >> 5) & 3]);
856	*copy = *env;
857	env->dp = copy->end = start + pkglength;
858	aml_parse_fieldlist(copy, &template, indent + 1);
859	aml_print_indent(indent);
860	AML_DEBUGPRINT("}");
861	aml_free_objectcontent(&copy->tempobject);
862
863	AML_SYSASSERT(copy->dp == copy->end);
864	memman_free(aml_memman, memid_aml_environ, copy);
865}
866
867static void
868aml_parse_defbankfield(struct aml_environ *env, int indent)
869{
870	u_int8_t	flags;
871	u_int8_t	*start, *rname, *bname;
872	u_int32_t	pkglength, bankvalue;
873	struct	aml_environ *copy;
874	struct	aml_field template;
875	union	aml_object *obj;
876	static	const char *lockrules[] = {"NoLock", "Lock"};
877	static	const char *updaterules[] = {"Preserve", "WriteAsOnes",
878					     "WriteAsZeros", "*Error*"};
879
880	start = env->dp;
881	pkglength = aml_parse_pkglength(env);
882	copy = memman_alloc(aml_memman, memid_aml_environ);
883	if (copy == NULL) {
884		env->stat = aml_stat_panic;
885		return;
886	}
887	AML_DEBUGPRINT("BankField(");
888	aml_print_namestring(rname = aml_parse_namestring(env));	/* Name1 */
889	AML_DEBUGPRINT(", ");
890	aml_print_namestring(bname = aml_parse_namestring(env));	/* Name2 */
891	AML_DEBUGPRINT(", ");
892	obj = aml_eval_name(env, aml_parse_termobj(env, indent));	/* BankValue */
893	bankvalue = aml_objtonum(env, obj);
894	template.type = aml_t_field;
895	template.flags = flags = aml_parse_bytedata(env);
896	template.bitoffset = 0;
897	template.bitlen = 0;
898	template.f.ftype = f_t_bank;
899	template.f.bfld.regname = rname;
900	template.f.bfld.bankname = bname;
901	template.f.bfld.bankvalue = bankvalue;
902	*copy = *env;
903	env->dp = copy->end = start + pkglength;
904	AML_DEBUGPRINT(", %s, %s, %s) {\n",
905	    accessnames[flags & 0xf],
906	    lockrules[(flags >> 4) & 1],
907	    updaterules[(flags >> 5) & 3]);
908	aml_parse_fieldlist(copy, &template, indent + 1);
909	aml_print_indent(indent);
910	AML_DEBUGPRINT("}");
911
912	aml_free_objectcontent(&copy->tempobject);
913	AML_SYSASSERT(copy->dp == copy->end);
914	memman_free(aml_memman, memid_aml_environ, copy);
915}
916
917static void
918aml_parse_defdevice(struct aml_environ *env, int indent)
919{
920	u_int8_t	*start;
921	u_int8_t	*name;
922	u_int32_t	pkglength;
923	struct	aml_environ *copy;
924
925	start = env->dp;
926	pkglength = aml_parse_pkglength(env);
927	copy = memman_alloc(aml_memman, memid_aml_environ);
928	if (copy == NULL) {
929		env->stat = aml_stat_panic;
930		return;
931	}
932	AML_DEBUGPRINT("Device(");
933	name = aml_parse_namestring(env);
934	aml_print_namestring(name);
935	AML_DEBUGPRINT(") {\n");
936	*copy = *env;
937	AML_CREATE_NAME(copy->curname, env, name,);
938	if (copy->curname->property != NULL) {
939		env->stat = aml_stat_panic;
940		AML_DEBUGPRINT("Already Defined \n");
941		goto out;
942	}
943	AML_ALLOC_OBJECT(copy->curname->property, env, aml_t_device,);
944	env->dp = copy->end = start + pkglength;
945	aml_parse_objectlist(copy, indent + 1);
946	aml_print_indent(indent);
947	AML_DEBUGPRINT("}");
948	aml_free_objectcontent(&copy->tempobject);
949
950	AML_SYSASSERT(copy->dp == copy->end);
951out:
952	memman_free(aml_memman, memid_aml_environ, copy);
953}
954
955static void
956aml_parse_defprocessor(struct aml_environ *env, int indent)
957{
958	u_int8_t	*start;
959	u_int8_t	*name;
960	u_int32_t	pkglength;
961	struct	aml_environ *copy;
962	struct	aml_processor *proc;
963	union	aml_object *obj;
964
965	start = env->dp;
966	pkglength = aml_parse_pkglength(env);
967	copy = memman_alloc(aml_memman, memid_aml_environ);
968	if (copy == NULL) {
969		env->stat = aml_stat_panic;
970		return;
971	}
972	AML_ALLOC_OBJECT(obj, env, aml_t_processor,);
973	proc = &obj->proc;
974	AML_DEBUGPRINT("Processor(");
975	name = aml_parse_namestring(env);
976	aml_print_namestring(name);
977	proc->id = aml_parse_bytedata(env);
978	proc->addr = aml_parse_dworddata(env);
979	proc->len = aml_parse_bytedata(env);
980	AML_DEBUGPRINT(", %d, 0x%x, 0x%x) {\n", proc->id, proc->addr, proc->len);
981	*copy = *env;
982	AML_CREATE_NAME(copy->curname, env, name,);
983	if (copy->curname->property != NULL) {
984		env->stat = aml_stat_panic;
985		AML_DEBUGPRINT("Already Defined \n");
986		goto out;
987	}
988	copy->curname->property = obj;
989	env->dp = copy->end = start + pkglength;
990	aml_parse_objectlist(copy, indent + 1);
991	aml_print_indent(indent);
992	AML_DEBUGPRINT("}");
993	aml_free_objectcontent(&copy->tempobject);
994
995	AML_SYSASSERT(copy->dp == copy->end);
996out:
997	memman_free(aml_memman, memid_aml_environ, copy);
998}
999
1000static void
1001aml_parse_defpowerres(struct aml_environ *env, int indent)
1002{
1003	u_int8_t	*start;
1004	u_int8_t	*name;
1005	u_int32_t	pkglength;
1006	struct	aml_environ *copy;
1007	struct	aml_powerres *pres;
1008	union	aml_object *obj;
1009
1010	start = env->dp;
1011	pkglength = aml_parse_pkglength(env);
1012	copy = memman_alloc(aml_memman, memid_aml_environ);
1013	if (copy == NULL) {
1014		env->stat = aml_stat_panic;
1015		return;
1016	}
1017	AML_DEBUGPRINT("PowerResource(");
1018	AML_ALLOC_OBJECT(obj, env, aml_t_powerres,);
1019	name = aml_parse_namestring(env);
1020	aml_print_namestring(name);
1021	pres = &obj->pres;
1022	pres->level = aml_parse_bytedata(env);
1023	pres->order = aml_parse_worddata(env);
1024	AML_DEBUGPRINT(", %d, %d) {\n", pres->level, pres->order);
1025	*copy = *env;
1026	AML_CREATE_NAME(copy->curname, env, name,);
1027	if (copy->curname->property != NULL) {
1028		env->stat = aml_stat_panic;
1029		AML_DEBUGPRINT("Already Defined \n");
1030		goto out;
1031	}
1032	copy->curname->property = obj;
1033	env->dp = copy->end = start + pkglength;
1034
1035	aml_parse_objectlist(copy, indent + 1);
1036	aml_print_indent(indent);
1037	AML_DEBUGPRINT("}");
1038	aml_free_objectcontent(&copy->tempobject);
1039
1040	AML_SYSASSERT(copy->dp == copy->end);
1041out:
1042	memman_free(aml_memman, memid_aml_environ, copy);
1043}
1044
1045static void
1046aml_parse_defthermalzone(struct aml_environ *env, int indent)
1047{
1048	u_int8_t	*start;
1049	u_int8_t	*name;
1050	u_int32_t	pkglength;
1051	struct	aml_environ *copy;
1052
1053	start = env->dp;
1054	pkglength = aml_parse_pkglength(env);
1055	copy = memman_alloc(aml_memman, memid_aml_environ);
1056	if (copy == NULL) {
1057		env->stat = aml_stat_panic;
1058		return;
1059	}
1060	AML_DEBUGPRINT("ThermalZone(");
1061	name = aml_parse_namestring(env);
1062	aml_print_namestring(name);
1063	AML_DEBUGPRINT(") {\n");
1064	*copy = *env;
1065	AML_CREATE_NAME(copy->curname, env, name,);
1066	if (copy->curname->property != NULL) {
1067		env->stat = aml_stat_panic;
1068		AML_DEBUGPRINT("Already Defined \n");
1069		goto out;
1070	}
1071	AML_ALLOC_OBJECT(copy->curname->property, env, aml_t_therm,);
1072	env->dp = copy->end = start + pkglength;
1073	aml_parse_objectlist(copy, indent + 1);
1074	aml_print_indent(indent);
1075	AML_DEBUGPRINT("}");
1076	aml_free_objectcontent(&copy->tempobject);
1077	AML_SYSASSERT(copy->dp == copy->end);
1078out:
1079	memman_free(aml_memman, memid_aml_environ, copy);
1080}
1081
1082static struct aml_name *
1083aml_parse_defelse(struct aml_environ *env, int indent, int num)
1084{
1085	u_int8_t	*start, *end, *oend;
1086	u_int32_t	pkglength;
1087	struct	aml_name *aname;
1088
1089	start = env->dp;
1090	pkglength = aml_parse_pkglength(env);
1091	oend = env->end;
1092	env->end = end = start + pkglength;
1093	aname = NULL;
1094
1095	AML_DEBUGPRINT("Else {\n");
1096	if (num == 0) {
1097		aname = aml_parse_objectlist(env, indent + 1);
1098		aml_print_indent(indent);
1099	}
1100	AML_DEBUGPRINT("}");
1101
1102	env->dp = end;
1103	env->end = oend;
1104	return (aname);
1105}
1106
1107static struct aml_name *
1108aml_parse_defif(struct aml_environ *env, int indent)
1109{
1110	u_int8_t	*start, *end, *oend;
1111	u_int32_t	pkglength;
1112	int	num;
1113	struct	aml_name *aname, *aname1;
1114
1115	start = env->dp;
1116	pkglength = aml_parse_pkglength(env);
1117	aname = NULL;
1118
1119	AML_DEBUGPRINT("If(");
1120	num = aml_objtonum(env, aml_eval_name
1121	    (env, aml_parse_termobj(env, indent)));
1122	oend = env->end;
1123	end = start + pkglength;
1124	AML_DEBUGPRINT(")");
1125	if (num) {
1126		AML_DEBUGPRINT("{\n");
1127		env->end = end;
1128		aname = aml_parse_objectlist(env, indent + 1);
1129		aml_print_indent(indent);
1130		AML_DEBUGPRINT("}");
1131	}
1132	env->dp = end;
1133	env->end = oend;
1134	if ((end < oend) && *(env->dp) == 0xa1) {
1135		env->dp++;
1136		aname1 = aml_parse_defelse(env, indent, num);
1137		aname = (num == 0) ? aname1 : aname;
1138	}
1139	return (aname);
1140}
1141
1142static struct aml_name *
1143aml_parse_defwhile(struct aml_environ *env, int indent)
1144{
1145	u_int8_t	*start, *end, *oend;
1146	u_int32_t	pkglength;
1147	int	num;
1148	struct	aml_name *aname;
1149
1150	start = env->dp;
1151	pkglength = aml_parse_pkglength(env);
1152	oend = env->end;
1153	end = start + pkglength;
1154	aname = NULL;
1155	for (;;) {
1156		env->dp = start;
1157		aml_parse_pkglength(env);
1158		AML_DEBUGPRINT("While(");
1159		num = aml_objtonum(env, aml_eval_name
1160		    (env, aml_parse_termobj(env, indent)));
1161		AML_DEBUGPRINT(")");
1162		if (num == 0) {
1163			break;
1164		}
1165		AML_DEBUGPRINT(" {\n");
1166		env->end = end;
1167		aname = aml_parse_objectlist(env, indent + 1);
1168		if (env->stat == aml_stat_step) {
1169			AML_DEBUGGER(env, env);
1170			continue;
1171		}
1172		if (env->stat != aml_stat_none)
1173			break;
1174		aml_print_indent(indent);
1175		AML_DEBUGPRINT("}");
1176	}
1177	AML_DEBUGPRINT("\n");
1178	env->dp = end;
1179	env->end = oend;
1180	if (env->stat == aml_stat_break) {
1181		env->stat = aml_stat_none;
1182		aname = NULL;
1183	}
1184	return (aname);
1185}
1186
1187static void
1188aml_parse_defmutex(struct aml_environ *env, int indent)
1189{
1190	char	*name;
1191	struct	aml_name *aname;
1192	struct	aml_mutex *mut;
1193
1194	/* MutexOp */
1195	AML_DEBUGPRINT("Mutex(");
1196	name = (char *)aml_parse_namestring(env);
1197	aml_print_namestring((unsigned char *)name);
1198	AML_CREATE_NAME(aname, env, (unsigned char *)name,);
1199	if (aname->property != NULL) {
1200		env->stat = aml_stat_panic;
1201		AML_DEBUGPRINT("Already Defined \n");
1202		return;
1203	}
1204	AML_ALLOC_OBJECT(aname->property, env, aml_t_mutex,);
1205	mut = &aname->property->mutex;
1206	mut->level = *env->dp++;
1207	STAILQ_INIT(&mut->queue);
1208	AML_DEBUGPRINT(", %d)", mut->level);
1209}
1210
1211static void
1212aml_createfield_generic(struct aml_environ *env,
1213    union aml_object *srcbuf, int idx,
1214    int len, char *newname)
1215{
1216	struct	aml_bufferfield *field;
1217	struct	aml_name *aname;
1218
1219	if (srcbuf == NULL || srcbuf->type != aml_t_buffer) {
1220		AML_DEBUGPRINT("Not Buffer assigned,");
1221		env->stat = aml_stat_panic;
1222		return;
1223	}
1224	AML_CREATE_NAME(aname, env, (unsigned char *)newname,);
1225	if (aname->property != NULL) {
1226		env->stat = aml_stat_panic;
1227		AML_DEBUGPRINT("Already Defined \n");
1228		return;
1229	}
1230	AML_ALLOC_OBJECT(aname->property, env, aml_t_bufferfield,);
1231	field = &aname->property->bfld;
1232	field->bitoffset = idx;
1233	field->bitlen = len;
1234	field->origin = srcbuf->buffer.data;
1235}
1236
1237static void
1238aml_parse_defcreatefield(struct aml_environ *env, int indent)
1239{
1240	int	idx, len;
1241	char	*newname;
1242	union	aml_object *obj, *srcbuf;
1243
1244	/* CreateFieldOp */
1245	AML_DEBUGPRINT("CreateField(");
1246	srcbuf = aml_eval_name(env, aml_parse_termobj(env, indent));
1247	if (srcbuf == &env->tempobject) {
1248		AML_DEBUGPRINT("NONAMED BUFFER\n");
1249		env->stat = aml_stat_panic;
1250		return;
1251	}
1252	AML_DEBUGPRINT(", ");
1253	obj = aml_eval_name(env, aml_parse_termobj(env, indent));
1254	idx = aml_objtonum(env, obj);
1255	AML_DEBUGPRINT(", ");
1256	obj = aml_eval_name(env, aml_parse_termobj(env, indent));
1257	len = aml_objtonum(env, obj);
1258	AML_DEBUGPRINT(", ");
1259	newname = (char *)aml_parse_namestring(env);
1260	aml_print_namestring((unsigned char *)newname);
1261	aml_createfield_generic(env, srcbuf, idx, len, newname);
1262	AML_DEBUGPRINT(") ");
1263}
1264
1265/*
1266 * Returns Named object or parser buffer. The object need not be free because
1267 * it returns preallocated buffer in env or Contain of named object.  If You
1268 * need to preserve object, create a copy and then store.  And The object
1269 * returned from this function is not valid after another call is
1270 * shared, tempolary buffer may be shared.
1271 */
1272struct aml_name *
1273aml_parse_termobj(struct aml_environ *env, int indent)
1274{
1275	u_int8_t	opcode;
1276	u_int8_t	*name;
1277	int	value;
1278	int	num1, num2;
1279	int	len;
1280	int	match1, match2, i, pkgval, start;
1281	int	widthindex, idx;
1282	char	*newname;
1283	struct	aml_name *aname;
1284	struct	aml_name *destname1, *destname2;
1285	struct	aml_name *tmpname, *srcname;
1286	struct	aml_name *src;
1287	union	aml_object *ret;
1288	union	aml_object *tmpobj;
1289	union	aml_object anum;
1290	union	aml_object *objref;
1291	union	aml_object *srcobj;
1292	union	aml_object *obj;
1293	union	aml_object *srcbuf;
1294	static int	widthtbl[4] = {32, 16, 8, 1};
1295	const char	*opname[4] = {"CreateDWordField", "CreateWordField",
1296				      "CreateByteField", "CreateBitField"};
1297
1298	aname = &env->tempname;
1299	ret = &env->tempobject;
1300	anum.type = aml_t_num;
1301	aname->property = ret;
1302	aml_free_objectcontent(ret);
1303	if (env->stat == aml_stat_panic) {
1304		/*
1305		 * If previosuly parser panic , parsing next instruction is
1306		 * prohibited.
1307		 */
1308		return (NULL);
1309	}
1310	aname = NULL;
1311	opcode = *env->dp++;
1312	switch (opcode) {
1313	case '\\':
1314	case '^':
1315	case 'A' ... 'Z':
1316	case '_':
1317	case '.':
1318	case '/':
1319		env->dp--;
1320		ret->type = aml_t_namestr;
1321		ret->nstr.dp = aml_parse_namestring(env);
1322		aml_print_namestring(ret->nstr.dp);
1323		aname = &env->tempname;
1324		break;
1325	case 0x0a:		/* BytePrefix */
1326		ret->type = aml_t_num;
1327		value = aml_parse_bytedata(env);
1328		ret->num.number = value;
1329		AML_DEBUGPRINT("0x%x", value);
1330		aname = &env->tempname;
1331		break;
1332	case 0x0b:		/* WordPrefix */
1333		ret->type = aml_t_num;
1334		value = aml_parse_worddata(env);
1335		ret->num.number = value;
1336		AML_DEBUGPRINT("0x%x", value);
1337		aname = &env->tempname;
1338		break;
1339	case 0x0c:		/* DWordPrefix */
1340		ret->type = aml_t_num;
1341		value = aml_parse_dworddata(env);
1342		ret->num.number = value;
1343		AML_DEBUGPRINT("0x%x", value);
1344		aname = &env->tempname;
1345		break;
1346	case 0x0d:		/* StringPrefix */
1347		ret->type = aml_t_string;
1348		ret->str.string = env->dp;
1349		len = strlen((const char *)env->dp);
1350		ret->str.needfree = 0;
1351		AML_DEBUGPRINT("\"%s\"", (const char *)ret->str.string);
1352		env->dp += (len + 1);
1353		aname = &env->tempname;
1354		break;
1355	case 0x00:		/* ZeroOp */
1356		ret->type = aml_t_num;
1357		ret->num.number = 0;
1358		ret->num.constant = 1;
1359		AML_DEBUGPRINT("Zero");
1360		aname = &env->tempname;
1361		break;
1362	case 0x01:		/* OneOp */
1363		ret->type = aml_t_num;
1364		ret->num.number = 1;
1365		ret->num.constant = 1;
1366		AML_DEBUGPRINT("One");
1367		aname = &env->tempname;
1368		break;
1369	case 0xff:		/* OnesOp */
1370		ret->type = aml_t_num;
1371		ret->num.number = 0xffffffff;
1372		ret->num.constant = 1;
1373		AML_DEBUGPRINT("Ones");
1374		aname = &env->tempname;
1375		break;
1376	case 0x06:		/* AliasOp */
1377		AML_DEBUGPRINT("Alias(");
1378		tmpname = aml_parse_termobj(env, indent);
1379		if (env->stat == aml_stat_panic) {
1380			return (NULL);
1381		}
1382		if (tmpname->property == NULL ||
1383		    tmpname->property->type != aml_t_namestr) {
1384			env->stat = aml_stat_panic;
1385			return (NULL);
1386		}
1387		/*
1388		 * XXX if srcname is deleted after this object, what
1389		 * shall I do?
1390		 */
1391		srcname = aml_search_name(env, tmpname->property->nstr.dp);
1392		AML_DEBUGPRINT(", ");
1393		name = aml_parse_namestring(env);
1394		aml_print_namestring(name);
1395		AML_CREATE_NAME(aname, env, name, 0);
1396		if (aname->property != NULL) {
1397			env->stat = aml_stat_panic;
1398			AML_DEBUGPRINT("Already Defined \n");
1399			aml_print_curname(aname);
1400			return (NULL);
1401		}
1402		AML_ALLOC_OBJECT(aname->property, env, aml_t_objref, NULL);
1403		objref = aname->property;
1404		objref->objref.nameref = srcname;
1405		objref->objref.ref = srcname->property;
1406		objref->objref.offset = -1;
1407		objref->objref.alias = 1;	/* Yes, this is an alias */
1408		AML_DEBUGPRINT(")");
1409		/* shut the interpreter up during the namespace initializing */
1410		return (NULL);
1411	case 0x08:		/* NameOp */
1412		AML_DEBUGPRINT("Name(");
1413		name = aml_parse_namestring(env);
1414		aml_print_namestring(name);
1415		AML_CREATE_NAME(aname, env, name, 0);
1416		if (env->stat == aml_stat_panic) {
1417			AML_DEBUGPRINT("Already Defined \n");
1418			aml_print_curname(aname);
1419			return (NULL);
1420		}
1421		AML_DEBUGPRINT(", ");
1422		AML_COPY_OBJECT(aname->property, env,
1423		    aml_eval_name(env,
1424			aml_parse_termobj(env, indent)),
1425		    NULL);
1426		AML_DEBUGPRINT(")");
1427		break;
1428	case 0x10:		/* ScopeOp */
1429		aml_parse_defscope(env, indent);
1430		break;
1431	case 0x11:		/* BufferOp */
1432		aname = &env->tempname;
1433		aname->property = aml_parse_defbuffer(env, indent);
1434		break;
1435	case 0x12:		/* PackageOp */
1436		aname = &env->tempname;
1437		aname->property = aml_parse_defpackage(env, indent);
1438		break;
1439	case 0x14:		/* MethodOp */
1440		aml_parse_defmethod(env, indent);
1441		break;
1442	case 0x5b:		/* ExtOpPrefix */
1443		opcode = *env->dp++;
1444		switch (opcode) {
1445		case 0x01:
1446			aml_parse_defmutex(env, indent);
1447			break;
1448		case 0x02:	/* EventOp */
1449			AML_DEBUGPRINT("Event(");
1450			name = aml_parse_namestring(env);
1451			aml_print_namestring(name);
1452			AML_CREATE_NAME(aname, env, name, 0);
1453			if (aname->property != NULL) {
1454				env->stat = aml_stat_panic;
1455				AML_DEBUGPRINT("Already Defined \n");
1456				return (NULL);
1457			}
1458			AML_ALLOC_OBJECT(aname->property, env, aml_t_event, NULL);
1459			AML_DEBUGPRINT(")");
1460			return (NULL);
1461			break;
1462		case 0x12:	/* CondRefOfOp */
1463			AML_DEBUGPRINT("CondRefOf(");
1464			src = aml_parse_termobj(env, indent);
1465			AML_DEBUGPRINT(", ");
1466			if (src == &env->tempname || src == NULL) {
1467				aml_parse_termobj(env, indent);
1468				AML_DEBUGPRINT(")");
1469				anum.num.number = 0xffffffff;
1470				env->tempobject.num = anum.num;
1471				aname = &env->tempname;
1472				break;
1473			}
1474			AML_ALLOC_OBJECT(objref, env, aml_t_objref, NULL);
1475			if (src->property == NULL ||
1476			    src->property->type != aml_t_namestr) {
1477				objref->objref.nameref = src;
1478			} else {
1479				objref->objref.nameref = aml_create_local_object();
1480			}
1481			objref->objref.ref = src->property;
1482			objref->objref.offset = -1;	/* different from IndexOp */
1483
1484			destname1 = aml_parse_termobj(env, indent);
1485			aml_store_to_name(env, objref, destname1);
1486			anum.num.number = 0;
1487			env->tempobject.num = anum.num;
1488			aname = &env->tempname;
1489			AML_DEBUGPRINT(")");
1490			break;
1491		case 0x13:
1492			aml_parse_defcreatefield(env, indent);
1493			break;
1494		case 0x20:	/* LoadOp *//* XXX Not Impremented */
1495			AML_DEBUGPRINT("Load(");
1496			aml_parse_termobj(env, indent);
1497			AML_DEBUGPRINT(", ");
1498			aml_parse_termobj(env, indent);
1499			AML_DEBUGPRINT(")");
1500			break;
1501		case 0x21:	/* StallOp */
1502			AML_DEBUGPRINT("Stall(");
1503			num1 = aml_objtonum(env, aml_eval_name(env,
1504			    aml_parse_termobj(env, indent)));
1505			AML_DEBUGPRINT(")");
1506			AML_STALL(num1);
1507			break;
1508		case 0x22:	/* SleepOp */
1509			AML_DEBUGPRINT("Sleep(");
1510			num1 = aml_objtonum(env, aml_eval_name(env,
1511			    aml_parse_termobj(env, indent)));
1512			AML_SLEEP(0, num1);
1513			AML_DEBUGPRINT(")");
1514			break;
1515		case 0x23:	/* AcquireOp *//* XXX Not yet */
1516			AML_DEBUGPRINT("Acquire(");
1517			aml_parse_termobj(env, indent);
1518			AML_DEBUGPRINT(", 0x%x)", aml_parse_worddata(env));
1519			break;
1520		case 0x24:	/* SignalOp *//* XXX Not yet */
1521			AML_DEBUGPRINT("Signal(");
1522			aml_parse_termobj(env, indent);
1523			AML_DEBUGPRINT(")");
1524			break;
1525		case 0x25:	/* WaitOp *//* XXX Not yet impremented */
1526			AML_DEBUGPRINT("Wait(");
1527			aml_parse_termobj(env, indent);
1528			AML_DEBUGPRINT(", ");
1529			aml_parse_termobj(env, indent);
1530			AML_DEBUGPRINT(")");
1531			break;
1532		case 0x26:	/* ResetOp *//* XXX Not yet impremented */
1533			AML_DEBUGPRINT("Reset(");
1534			aml_parse_termobj(env, indent);
1535			AML_DEBUGPRINT(")");
1536			break;
1537		case 0x27:	/* ReleaseOp *//* XXX Not yet impremented */
1538			AML_DEBUGPRINT("Release(");
1539			aml_parse_termobj(env, indent);
1540			AML_DEBUGPRINT(")");
1541			break;
1542#define NUMOP2(opname, operation) do {					\
1543	AML_DEBUGPRINT(opname);						\
1544	AML_DEBUGPRINT("(");						\
1545	num1 = aml_objtonum(env, aml_eval_name(env,			\
1546	    aml_parse_termobj(env, indent)));				\
1547	AML_DEBUGPRINT(", ");						\
1548	anum.num.number = operation (num1);				\
1549	destname1 = aml_parse_termobj(env, indent);			\
1550	AML_DEBUGPRINT(")");						\
1551	aml_store_to_name(env, &anum, destname1);			\
1552	env->tempobject.num = anum.num;					\
1553	env->tempname.property = &env->tempobject;			\
1554	aname = &env->tempname;						\
1555} while(0)
1556
1557		case 0x28:	/* FromBCDOp */
1558			NUMOP2("FromBCD", frombcd);
1559			break;
1560		case 0x29:	/* ToBCDOp */
1561			NUMOP2("ToBCD", tobcd);
1562			break;
1563		case 0x2a:	/* UnloadOp *//* XXX Not yet impremented */
1564			AML_DEBUGPRINT("Unload(");
1565			aml_parse_termobj(env, indent);
1566			AML_DEBUGPRINT(")");
1567			break;
1568		case 0x30:
1569			env->tempobject.type = aml_t_num;
1570			env->tempobject.num.number = 0;
1571			env->tempobject.num.constant = 1;
1572			AML_DEBUGPRINT("Revision");
1573			break;
1574		case 0x31:
1575			env->tempobject.type = aml_t_debug;
1576			aname = &env->tempname;
1577			AML_DEBUGPRINT("Debug");
1578			break;
1579		case 0x32:	/* FatalOp */
1580			AML_DEBUGPRINT("Fatal(");
1581			AML_DEBUGPRINT("0x%x, ", aml_parse_bytedata(env));
1582			AML_DEBUGPRINT("0x%x, ", aml_parse_dworddata(env));
1583			aml_parse_termobj(env, indent);
1584			env->stat = aml_stat_panic;
1585			AML_DEBUGPRINT(")");
1586			break;
1587		case 0x80:	/* OpRegionOp */
1588			aml_parse_defopregion(env, indent);
1589			break;
1590		case 0x81:	/* FieldOp */
1591			aml_parse_deffield(env, indent);
1592			break;
1593		case 0x82:	/* DeviceOp */
1594			aml_parse_defdevice(env, indent);
1595			break;
1596		case 0x83:	/* ProcessorOp */
1597			aml_parse_defprocessor(env, indent);
1598			break;
1599		case 0x84:	/* PowerResOp */
1600			aml_parse_defpowerres(env, indent);
1601			break;
1602		case 0x85:	/* ThermalZoneOp */
1603			aml_parse_defthermalzone(env, indent);
1604			break;
1605		case 0x86:	/* IndexFieldOp */
1606			aml_parse_defindexfield(env, indent);
1607			break;
1608		case 0x87:	/* BankFieldOp */
1609			aml_parse_defbankfield(env, indent);
1610			break;
1611		default:
1612			AML_SYSERRX(1, "strange opcode 0x5b, 0x%x\n", opcode);
1613			AML_SYSABORT();
1614		}
1615		break;
1616	case 0x68 ... 0x6e:	/* ArgN */
1617		AML_DEBUGPRINT("Arg%d", opcode - 0x68);
1618		return (aml_local_stack_getArgX(NULL, opcode - 0x68));
1619		break;
1620	case 0x60 ... 0x67:
1621		AML_DEBUGPRINT("Local%d", opcode - 0x60);
1622		return (aml_local_stack_getLocalX(opcode - 0x60));
1623		break;
1624	case 0x70:		/* StoreOp */
1625		AML_DEBUGPRINT("Store(");
1626		aname = aml_create_local_object();
1627		AML_COPY_OBJECT(tmpobj, env,
1628		    aml_eval_name(env,	aml_parse_termobj(env, indent)), NULL);
1629		aname->property = tmpobj;
1630		AML_DEBUGPRINT(", ");
1631		destname1 = aml_parse_termobj(env, indent);
1632		AML_DEBUGPRINT(")");
1633		/* XXX
1634		 * temporary object may change during aml_store_to_name()
1635		 * operation, so we make a copy of it on stack.
1636		 */
1637		if (destname1 == &env->tempname &&
1638		    destname1->property == &env->tempobject) {
1639			destname1 = aml_create_local_object();
1640			AML_COPY_OBJECT(destname1->property, env,
1641			    &env->tempobject, NULL);
1642		}
1643		aml_store_to_name(env, tmpobj, destname1);
1644		if (env->stat == aml_stat_panic) {
1645			AML_DEBUGPRINT("StoreOp failed");
1646			return (NULL);
1647		}
1648		aname = aml_create_local_object();
1649		AML_COPY_OBJECT(tmpobj, env, destname1->property, NULL);
1650		aname->property = tmpobj;
1651		if (tmpobj == NULL) {
1652			printf("???");
1653			break;
1654		}
1655		break;
1656	case 0x71:		/* RefOfOp */
1657		AML_DEBUGPRINT("RefOf(");
1658		src = aml_parse_termobj(env, indent);
1659		AML_DEBUGPRINT(")");
1660
1661		aname = aml_create_local_object();
1662		AML_ALLOC_OBJECT(aname->property, env, aml_t_objref, NULL);
1663		objref = aname->property;
1664		if (src->property == NULL ||
1665		    src->property->type != aml_t_namestr) {
1666			objref->objref.nameref = src;
1667		} else {
1668			objref->objref.nameref = aml_create_local_object();
1669		}
1670		objref->objref.ref = src->property;
1671		objref->objref.offset = -1;	/* different from IndexOp */
1672		break;
1673
1674#define NUMOP3_2(opname, oparation, ope2) do {				\
1675	AML_DEBUGPRINT(opname);						\
1676	AML_DEBUGPRINT("(");						\
1677	num1 = aml_objtonum(env, aml_eval_name(env,			\
1678	    aml_parse_termobj(env, indent)));				\
1679	AML_DEBUGPRINT(", ");						\
1680	num2 = aml_objtonum(env, aml_eval_name(env,			\
1681	    aml_parse_termobj(env, indent)));				\
1682	AML_DEBUGPRINT(", ");						\
1683	anum.num.number = ope2(num1 oparation num2);			\
1684	destname1 = aml_parse_termobj(env, indent);			\
1685	AML_DEBUGPRINT(")");						\
1686	aml_store_to_name(env, &anum, destname1);			\
1687	env->tempobject.num = anum.num;					\
1688	env->tempname.property = &env->tempobject;			\
1689	aname = &env->tempname;						\
1690} while(0)
1691
1692#define NUMOP3(opname, operation)	NUMOP3_2(opname, operation, )
1693#define NUMOPN3(opname, operation)	NUMOP3_2(opname, operation, ~)
1694
1695	case 0x72:		/* AddOp */
1696		NUMOP3("Add", +);
1697		break;
1698	case 0x73:		/* ConcatOp  */
1699		aname = aml_parse_concatop(env, indent);
1700		break;
1701	case 0x74:		/* SubtractOp */
1702		NUMOP3("Subtract", -);
1703		break;
1704	case 0x75:		/* IncrementOp */
1705		AML_DEBUGPRINT("Increment(");
1706		aname = aml_parse_termobj(env, indent);
1707		num1 = aml_objtonum(env, aml_eval_name(env, aname));
1708		num1++;
1709		anum.num.number = num1;
1710		AML_DEBUGPRINT(")");
1711		aml_store_to_name(env, &anum, aname);
1712		aname = &env->tempname;
1713		env->tempobject.num = anum.num;
1714		break;
1715	case 0x76:		/* DecrementOp */
1716		AML_DEBUGPRINT("Decrement(");
1717		aname = aml_parse_termobj(env, indent);
1718		num1 = aml_objtonum(env, aml_eval_name(env, aname));
1719		num1--;
1720		anum.num.number = num1;
1721		AML_DEBUGPRINT(")");
1722		aml_store_to_name(env, &anum, aname);
1723		aname = &env->tempname;
1724		env->tempobject.num = anum.num;
1725		break;
1726	case 0x77:		/* MultiplyOp */
1727		NUMOP3("Multiply", *);
1728		break;
1729	case 0x78:		/* DivideOp */
1730		AML_DEBUGPRINT("Divide(");
1731		num1 = aml_objtonum(env, aml_eval_name(env,
1732		    aml_parse_termobj(env, indent)));
1733		AML_DEBUGPRINT(", ");
1734		num2 = aml_objtonum(env, aml_eval_name(env,
1735		    aml_parse_termobj(env, indent)));
1736		AML_DEBUGPRINT(", ");
1737		anum.num.number = num1 % num2;
1738		destname1 = aml_parse_termobj(env, indent);
1739		aml_store_to_name(env, &anum, destname1);
1740		AML_DEBUGPRINT(", ");
1741		anum.num.number = num1 / num2;
1742		destname2 = aml_parse_termobj(env, indent);
1743		AML_DEBUGPRINT(")");
1744		aml_store_to_name(env, &anum, destname2);
1745		env->tempobject.num = anum.num;
1746		aname = &env->tempname;
1747		break;
1748	case 0x79:		/* ShiftLeftOp */
1749		NUMOP3("ShiftLeft", <<);
1750		break;
1751	case 0x7a:		/* ShiftRightOp */
1752		NUMOP3("ShiftRight", >>);
1753		break;
1754	case 0x7b:		/* AndOp */
1755		NUMOP3("And", &);
1756		break;
1757	case 0x7c:		/* NAndOp */
1758		NUMOPN3("NAnd", &);
1759		break;
1760	case 0x7d:		/* OrOp */
1761		NUMOP3("Or", |);
1762		break;
1763	case 0x7e:		/* NOrOp */
1764		NUMOPN3("NOr", |);
1765		break;
1766	case 0x7f:		/* XOrOp */
1767		NUMOP3("XOr", ^);
1768		break;
1769	case 0x80:		/* NotOp */
1770		NUMOP2("Not", ~);
1771		break;
1772	case 0x81:		/* FindSetLeftBitOp */
1773		NUMOP2("FindSetLeftBit", findsetleftbit);
1774		break;
1775	case 0x82:		/* FindSetRightBitOp */
1776		NUMOP2("FindSetRightBit", findsetrightbit);
1777		break;
1778	case 0x83:		/* DerefOp */
1779		AML_DEBUGPRINT("DerefOf(");
1780		objref = aml_eval_name(env, aml_parse_termobj(env, indent));
1781		AML_DEBUGPRINT(")");
1782
1783		if (objref->objref.ref == NULL) {
1784			env->tempname.property = objref->objref.ref;
1785			aname = &env->tempname;
1786			break;
1787		}
1788		switch (objref->objref.ref->type) {
1789		case aml_t_package:
1790		case aml_t_buffer:
1791			if (objref->objref.offset < 0) {
1792				env->tempname.property = objref->objref.ref;
1793			} else {
1794				objref->objref.deref = 1;
1795				env->tempname.property = objref;
1796			}
1797			break;
1798		default:
1799			env->tempname.property = objref->objref.ref;
1800			break;
1801		}
1802
1803		aname = &env->tempname;
1804		break;
1805	case 0x86:		/* NotifyOp *//* XXX Not yet impremented */
1806		AML_DEBUGPRINT("Notify(");
1807		aml_parse_termobj(env, indent);
1808		AML_DEBUGPRINT(", ");
1809		aml_parse_termobj(env, indent);
1810		AML_DEBUGPRINT(")");
1811		break;
1812	case 0x87:		/* SizeOfOp */
1813		AML_DEBUGPRINT("SizeOf(");
1814		aname = aml_parse_termobj(env, indent);
1815		tmpobj = aml_eval_name(env, aname);
1816
1817		AML_DEBUGPRINT(")");
1818		num1 = 0;
1819		switch (tmpobj->type) {
1820		case aml_t_buffer:
1821			num1 = tmpobj->buffer.size;
1822			break;
1823		case aml_t_string:
1824			num1 = strlen((const char *)tmpobj->str.string);
1825			break;
1826		case aml_t_package:
1827			num1 = tmpobj->package.elements;
1828			break;
1829		default:
1830			AML_DEBUGPRINT("Args of SizeOf should be "
1831				       "buffer/string/package only\n");
1832			break;
1833		}
1834
1835		anum.num.number = num1;
1836		env->tempobject.num = anum.num;
1837		aname = &env->tempname;
1838		break;
1839	case 0x88:		/* IndexOp */
1840		AML_DEBUGPRINT("Index(");
1841		srcobj = aml_eval_name(env, aml_parse_termobj(env, indent));
1842		AML_DEBUGPRINT(", ");
1843		num1 = aml_objtonum(env, aml_eval_name(env,
1844		    aml_parse_termobj(env, indent)));
1845		AML_DEBUGPRINT(", ");
1846		destname1 = aml_parse_termobj(env, indent);
1847		AML_DEBUGPRINT(")");
1848		aname = aml_create_local_object();
1849		switch (srcobj->type) {
1850		case aml_t_package:
1851		case aml_t_buffer:
1852			AML_ALLOC_OBJECT(objref, env, aml_t_objref, NULL);
1853			aname->property = objref;
1854			objref->objref.ref = srcobj;
1855			objref->objref.offset = num1;
1856			objref->objref.deref = 0;
1857			break;
1858		default:
1859			AML_DEBUGPRINT("Arg0 of Index should be either "
1860				       "buffer or package\n");
1861			return (aname);
1862		}
1863
1864		aml_store_to_name(env, objref, destname1);
1865		break;
1866	case 0x89:		/* MatchOp *//* XXX Not yet Impremented */
1867		AML_DEBUGPRINT("Match(");
1868		AML_COPY_OBJECT(obj, env, aml_eval_name(env,
1869		    aml_parse_termobj(env, indent)), NULL);
1870		if (obj->type != aml_t_package) {
1871			env->stat = aml_stat_panic;
1872			return (NULL);
1873		}
1874		anum.num.number = 0xffffffff;
1875		match1 = *env->dp;
1876		AML_DEBUGPRINT(", %d", *env->dp);
1877		env->dp++;
1878		num1 = aml_objtonum(env, aml_eval_name(env,
1879		    aml_parse_termobj(env, indent)));
1880		match2 = *env->dp;
1881		AML_DEBUGPRINT(", %d", *env->dp);
1882		env->dp++;
1883		num2 = aml_objtonum(env, aml_eval_name(env,
1884		    aml_parse_termobj(env, indent)));
1885		AML_DEBUGPRINT(", ");
1886		start = aml_objtonum(env, aml_eval_name(env,
1887		    aml_parse_termobj(env, indent)));
1888
1889#define MATCHOP(opnum, arg1, arg2)	((opnum == 0) ? (1) :		\
1890    (opnum == 1) ? ((arg1) == (arg2))	:				\
1891    (opnum == 2) ? ((arg1) <= (arg2))	:				\
1892    (opnum == 3) ? ((arg1) <  (arg2))	:				\
1893    (opnum == 4) ? ((arg1) >= (arg2))	:				\
1894    (opnum == 5) ? ((arg1) >  (arg2))	: 0 )
1895
1896		for (i = start; i < obj->package.elements; i++) {
1897			pkgval = aml_objtonum(env, obj->package.objects[i]);
1898			if (MATCHOP(match1, pkgval, num1) &&
1899			    MATCHOP(match2, pkgval, num2)) {
1900				anum.num.number = i;
1901				break;
1902			}
1903		}
1904		AML_DEBUGPRINT(")");
1905		aml_free_object(&obj);
1906		aname = &env->tempname;
1907		env->tempname.property = &env->tempobject;
1908		env->tempobject.num = anum.num;
1909		break;
1910#undef MATCHOP
1911	case 0x8a ... 0x8d:	/* CreateDWordFieldOp */
1912		widthindex = *(env->dp - 1) - 0x8a;
1913		AML_DEBUGPRINT("%s(", opname[widthindex]);
1914		srcbuf = aml_eval_name(env, aml_parse_termobj(env, indent));
1915		if (srcbuf == &env->tempobject) {
1916			AML_DEBUGPRINT("NOT NAMEDBUF\n");
1917			env->stat = aml_stat_panic;
1918			return (NULL);
1919		}
1920		AML_DEBUGPRINT(", ");
1921		idx = aml_objtonum(env, aml_eval_name(env,
1922		    aml_parse_termobj(env, indent)));
1923		if (widthindex != 3) {
1924			idx *= 8;
1925		}
1926		AML_DEBUGPRINT(", ");
1927		newname = (char *)aml_parse_namestring(env);
1928		aml_print_namestring((unsigned char *)newname);
1929		aml_createfield_generic(env, srcbuf, idx,
1930		    widthtbl[widthindex], newname);
1931		AML_DEBUGPRINT(")");
1932		break;
1933	case 0x8e:		/* ObjectTypeOp */
1934		AML_DEBUGPRINT("ObjectType(");
1935		aname = aml_parse_termobj(env, indent);
1936		if (aname == NULL) {
1937			env->tempobject.type = aml_t_num;
1938			env->tempobject.num.number = aml_t_null;
1939		} else {
1940			env->tempobject.type = aml_t_num;
1941			env->tempobject.num.number = aname->property->type;
1942		}
1943		aname = &env->tempname;
1944		AML_DEBUGPRINT(")");
1945		break;
1946
1947#define CMPOP(opname,operation) do {					\
1948	AML_DEBUGPRINT(opname);						\
1949	AML_DEBUGPRINT("(");						\
1950	num1 = aml_objtonum(env, aml_eval_name(env,			\
1951	    aml_parse_termobj(env, indent)));				\
1952	AML_DEBUGPRINT(", ");						\
1953	num2 = aml_objtonum(env, aml_eval_name(env,			\
1954	    aml_parse_termobj(env, indent)));				\
1955	aname = &env->tempname;						\
1956	env->tempobject.type = aml_t_num;				\
1957	env->tempobject.num.number = (num1 operation num2) ? 0xffffffff : 0;	\
1958	aname->property = &env->tempobject;				\
1959	AML_DEBUGPRINT(")");						\
1960} while(0)
1961
1962	case 0x90:
1963		CMPOP("LAnd", &&);
1964		break;
1965	case 0x91:
1966		CMPOP("LOr", ||);
1967		break;
1968	case 0x92:
1969		AML_DEBUGPRINT("LNot(");
1970		num1 = aml_objtonum(env, aml_eval_name(env,
1971		    aml_parse_termobj(env, indent)));
1972		aname = &env->tempname;
1973		env->tempobject.type = aml_t_num;
1974		env->tempobject.num.number = (!num1) ? 0xffffffff : 0;
1975		aname->property = &env->tempobject;
1976		AML_DEBUGPRINT(")");
1977		break;
1978	case 0x93:
1979		CMPOP("LEqual", ==);
1980		break;
1981	case 0x94:
1982		CMPOP("LGreater", >);
1983		break;
1984	case 0x95:
1985		CMPOP("LLess", <);
1986		break;
1987	case 0xa0:		/* IfOp */
1988		aname = aml_parse_defif(env, indent);
1989		break;
1990#if 0
1991
1992	case 0xa1:		/* ElseOp should not be treated in Main parser
1993				 * But If Op */
1994		aml_parse_defelse(env, indent);
1995		break;
1996#endif
1997	case 0xa2:		/* WhileOp */
1998		aname = aml_parse_defwhile(env, indent);
1999		break;
2000	case 0xa3:		/* NoopOp */
2001		AML_DEBUGPRINT("Noop");
2002		break;
2003	case 0xa5:		/* BreakOp */
2004		AML_DEBUGPRINT("Break");
2005		env->stat = aml_stat_break;
2006		break;
2007	case 0xa4:		/* ReturnOp */
2008		AML_DEBUGPRINT("Return(");
2009		AML_COPY_OBJECT(env->tempname.property, env, aml_eval_name(env,
2010		    aml_parse_termobj(env, indent)), NULL);
2011		aname = &env->tempname;
2012		env->stat = aml_stat_return;
2013		AML_DEBUGPRINT(")");
2014		break;
2015	case 0xcc:		/* BreakPointOp */
2016		/* XXX Not Yet Impremented (Not need?) */
2017		AML_DEBUGPRINT("BreakPoint");
2018		break;
2019	default:
2020		AML_SYSERRX(1, "strange opcode 0x%x\n", opcode);
2021		AML_SYSABORT();
2022	}
2023
2024	return (aname);
2025}
2026