From owner-acpi-jp@jp.freebsd.org  Sun Jan  9 06:40:16 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id GAA82759;
	Sun, 9 Jan 2000 06:40:16 +0900 (JST)
	(envelope-from owner-acpi-jp@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id GAA82754
	for <acpi-jp@jp.freebsd.org>; Sun, 9 Jan 2000 06:40:15 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (isdn51.imasy.or.jp [202.227.24.243])
	by tasogare.imasy.or.jp (8.9.3+3.2W/3.7W-tasogare/smtpfeed 1.01) with ESMTP id GAA25109
	for <acpi-jp@jp.freebsd.org>; Sun, 9 Jan 2000 06:40:11 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Message-Id: <200001082140.GAA25109@tasogare.imasy.or.jp>
To: acpi-jp@jp.freebsd.org
In-Reply-To: Your message of "Sun, 09 Jan 2000 02:25:58 +0900"
	<200001081725.CAA06728@tasogare.imasy.or.jp>
References: <200001081725.CAA06728@tasogare.imasy.or.jp>
X-Mailer: Mew version 1.93 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Date: Sun, 09 Jan 2000 06:40:10 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 980905(IM100)
Lines: 818
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+990727
X-Sequence: acpi-jp 224
Subject: [acpi-jp 224] Re: Store to Index implementaion 
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

> > $B$3$NJ}?K$GF,$NCf$K$"$C$?$@$1$G$7$?$N$G!"$*4j$$$7$^$9!#(B
> 
> $BN;2r!#$D$$$G$K(B DerefOf  $B$H(B SizeOf $B$b$d$C$F$_$^$9!#(B
> # TP770ED.dsdt.dat $B$N(B SCMP (strcmp() $B$N(B AML $BHG(B) $B$r%F%9%H$K;H$$$^$9!#(B

$B$=$l$J$j$KF0$/$h$&$K$J$j$^$7$?!#$,!"(Bmethod $B$NLaCM$K4X78$7$F$$$k$h$&$K(B
$B8+$($k(B env->work $B$H(Benv->wobj $B$N;H$$J}!"NN0h2rJ|$N%?%$%_%s%0$,$h$/(B
$BJ,$+$i$J$+$C$?$N$G!"$A$g$C$H8+$F$/$@$5$$$^$;!#(B

SCMP $B$G;n$9$K$O%5%V%k!<%A%s$N(B method $BFb$G:n$i$l$?(B buffer $B$r(B caller $BB&$G(B
$B%3%T!<$9$kI,MW$,$"$k$?$a!"$=$N$"$?$j$b=$@5$7$F$$$^$9!#(B
[acpi-jp 211] $B$GN.$7$?C!$-Bf$bN.MQ$7$F$$$^$9$,4pK\E*$KJQ99$7$F$$$J$$$?$a!"(B
commit $B$9$k:]$K$O$3$NItJ,$r=$@5$9$kM=Dj$G$9!#(B

$B$"$H!"%P%0$i$7$-$H$3$m(B (acpi_parse_defif() $B$J$I$NLaCM$r8+$F$$$J$$(B) $B$r(B
$B=$@5$7$?$b$N$b4^$a$F$$$^$9!#(B

Index: amlmem.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/amlmem.c,v
retrieving revision 1.2
diff -u -r1.2 amlmem.c
--- amlmem.c	2000/01/03 17:57:21	1.2
+++ amlmem.c	2000/01/06 00:25:47
@@ -49,6 +49,7 @@
 MEMMAN_INITIALSTORAGE_DESC(struct aml_bufferfield, _aml_bufferfield_storage);
 MEMMAN_INITIALSTORAGE_DESC(enum aml_objtype, _aml_objtype_storage);
 MEMMAN_INITIALSTORAGE_DESC(struct aml_name, _aml_name_storage);
+MEMMAN_INITIALSTORAGE_DESC(struct aml_objref, _aml_objref_storage);
 
 memman_blockman_t aml_blockman[] = {
 	MEMMAN_MEMBLOCK_DESC(sizeof(struct aml_namestr), _aml_namestr_storage),
@@ -65,11 +66,12 @@
 	MEMMAN_MEMBLOCK_DESC(sizeof(struct aml_bufferfield), _aml_bufferfield_storage),
 	MEMMAN_MEMBLOCK_DESC(sizeof(enum aml_objtype), _aml_objtype_storage),
 	MEMMAN_MEMBLOCK_DESC(sizeof(struct aml_name), _aml_name_storage),
+	MEMMAN_MEMBLOCK_DESC(sizeof(struct aml_objref), _aml_objref_storage),
 };
 
 memman_histogram_t aml_histogram[MEMMAN_HISTOGRAM_SIZE];
 
-static memman_t _aml_memman = MEMMAN_MEMMANAGER_DESC(aml_blockman, 14,
+static memman_t _aml_memman = MEMMAN_MEMMANAGER_DESC(aml_blockman, 15,
 						     aml_histogram, 1);
 
 memman_t *aml_memman = &_aml_memman;
Index: amlmem.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/amlmem.h,v
retrieving revision 1.1
diff -u -r1.1 amlmem.h
--- amlmem.h	1999/12/01 17:46:44	1.1
+++ amlmem.h	2000/01/06 00:26:00
@@ -49,6 +49,7 @@
 	memid_aml_bufferfield,
 	memid_aml_objtype,
 	memid_aml_name,
+	memid_aml_objref,
 };
 
 extern memman_t	*aml_memman;
Index: env.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/env.h,v
retrieving revision 1.2
diff -u -r1.2 env.h
--- env.h	1999/12/27 07:23:53	1.2
+++ env.h	2000/01/08 14:48:24
@@ -36,5 +36,8 @@
 	 struct aml_name argumentvalue[7];
 	 struct aml_name work;
 	 union aml_object wobj;
+	 struct aml_name *created_on_exec[4096];
+	 unsigned	executing;
+	 unsigned	work_needfree;
        };
 
Index: evalobj.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/evalobj.c,v
retrieving revision 1.5
diff -u -r1.5 evalobj.c
--- evalobj.c	2000/01/03 10:16:59	1.5
+++ evalobj.c	2000/01/08 18:24:03
@@ -109,7 +109,7 @@
 	struct aml_name *tmp;
 	int argnum,i;
 	struct aml_environ copy;
-	union aml_object *obj;
+	union aml_object *obj, *ret = NULL;
 	if (aname==NULL||aname->property == NULL)
 		return NULL;
 	if(env->stat==aml_stat_panic){
@@ -137,6 +137,45 @@
 	case aml_t_package:
 		return aname->property;
 		
+	case aml_t_objref:
+		acpi_free_objectcontent(&env->wobj);
+		obj = aname->property;
+		/* Dereference object */
+		if (obj->objref.deref == 1) {
+			int	offset;
+			union aml_object num1;
+
+			num1.type = aml_t_num;
+			offset = obj->objref.offset;
+			switch (obj->objref.ref->type) {
+			case aml_t_package:
+				if (obj->objref.ref->package.elements > offset) {
+					obj = obj->objref.ref->package.objects[offset];
+					acpi_free_object(&aname->property);
+					aname->property = obj;
+				} else {
+					num1.num.number = 0;
+					env->wobj = num1;
+					acpi_free_object(&aname->property);
+					aname->property = &env->wobj;
+				}
+				break;
+			case aml_t_buffer:
+				if (obj->objref.ref->buffer.size > offset) {
+					num1.num.number = obj->objref.ref->buffer.data[offset] & 0xff;
+				} else {
+					num1.num.number = 0;
+				}
+				env->wobj = num1;
+				acpi_free_object(&aname->property);
+				aname->property = &env->wobj;
+				break;
+			default:
+				break;
+			}
+		}
+		return aname->property;
+		
 	case aml_t_field:
 		acpi_free_objectcontent(&env->wobj);
 		return acpi_eval_fieldobject(env,aname);
@@ -170,14 +209,32 @@
 			return NULL;
 		}
 		showobject(obj);
+#if 0
 		env->wobj.type=aml_t_num;/*Temporally*/
 		env->wobj.num.number=0;
+#else
+		if (obj) {
+			ret = acpi_copy_object(env, obj);
+			env->wobj = *ret;
+			memman_free(aml_memman, memid_unkown, ret);
+		} else {
+			env->wobj.type = aml_t_num;
+			env->wobj.num.number = 0;
+		}
+#endif
 		for(i=0;i<argnum;i++){
 			acpi_free_object(&copy.argumentvalue[i].property);
 		}
 		for(i=0;i<8;i++){
 			acpi_free_object(&copy.localvalue[i].property);
 		}
+
+#if 1
+		/* we have a return value in env->wobj already, try to free obj */
+		if (obj == copy.work.property && copy.work_needfree == 1) {
+			acpi_free_object(&obj);
+		}
+#endif
 		return &env->wobj;
 	case aml_t_bufferfield:
 		acpi_free_objectcontent(&env->wobj);
@@ -208,8 +265,16 @@
 struct aml_name 
 *acpi_execute_method(struct aml_environ *env)
 {
-	struct aml_name *name;
+	struct aml_name *name, **created;
+	struct aml_environ orgenv;
 	
+#if 1
+	orgenv.executing = env->executing;
+	memcpy(&orgenv.created_on_exec, env->created_on_exec,
+	    sizeof env->created_on_exec);
+	bzero(env->created_on_exec, sizeof(env->created_on_exec));
+	env->executing = 1;
+#endif
 	DPRINT("[");
 	acpi_print_curname(env->curname);
 	DPRINT(" START]\n");
@@ -219,14 +284,33 @@
 	acpi_print_curname(env->curname);
 	DPRINT(" END]\n");
 
+#if 1
+	created = env->created_on_exec;
+
+	env->work_needfree = 0;
+	while (*created) {
+		if (name->property == (*created)->property) {
+			name = &env->work;
+			name->property = acpi_copy_object(env, (*created)->property);
+			env->work_needfree = 1;
+		}
+		acpi_free_childname_one(get_rootname(), *created);
+		created++;
+	}
+
+	memcpy(env->created_on_exec, &orgenv.created_on_exec,
+	    sizeof env->created_on_exec);
+	env->executing = orgenv.executing;
+#endif
 	return name;
 }
 
-struct aml_name *
+union aml_object *
 acpi_invoke_method_by_name(char *method, int argc, union aml_object *argv)
 {
 	struct aml_name *name;
-	struct aml_name *retval = NULL;
+	union aml_object *retval = NULL;
+	union aml_object *obj;
 	struct aml_environ env;
 	int	i;
 
@@ -241,13 +325,21 @@
 		acpi_dbgr(&env,&env);
 		for (i = 0; i < argc; i++) {
 			env.argumentvalue[i].property = acpi_alloc_object(argv[i].type, &argv[i]);
+		}
+		obj = acpi_eval_name(&env, acpi_execute_method(&env));
+		showtree(name, 0);
+		if (obj) {
+			retval = acpi_copy_object(&env, obj);
 		}
-		retval = acpi_execute_method(&env);
+
 		for (i = 0; i < argc; i++) {
 			acpi_free_object(&env.argumentvalue[i].property);
 		}
 		for (i = 0; i < 8; i++) {
 			acpi_free_object(&env.localvalue[i].property);
+		}
+		if (env.work_needfree == 1) {
+			acpi_free_object(&env.work.property);
 		}
 	}
 	return retval;
Index: evalobj.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/evalobj.h,v
retrieving revision 1.2
diff -u -r1.2 evalobj.h
--- evalobj.h	1999/12/27 14:17:22	1.2
+++ evalobj.h	2000/01/08 17:00:22
@@ -30,6 +30,6 @@
 *acpi_eval_name(struct aml_environ * env, struct aml_name * aname);
 int acpi_objtonum(struct aml_environ *env,union aml_object * obj);
 struct aml_name *acpi_execute_method(struct aml_environ *env);
-struct aml_name *acpi_invoke_method_by_name(char *method,
+union aml_object *acpi_invoke_method_by_name(char *method,
 					    int argc, union aml_object *argv);
 
Index: main.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/main.c,v
retrieving revision 1.6
diff -u -r1.6 main.c
--- main.c	2000/01/04 20:39:54	1.6
+++ main.c	2000/01/08 20:59:29
@@ -87,8 +87,8 @@
 load_dsdt(char *dsdtfile, int sleep_type)
 {
 	struct aml_environ env;
-	union aml_object argv[1];
-	struct aml_name *retval;
+	union aml_object argv[2];
+	union aml_object *retval;
 	u_int8_t       *code;
 	struct stat     sb;
 	int             fd;
@@ -123,8 +123,24 @@
 	}
 	argv[0].type = aml_t_num;
 	argv[0].num.number = sleep_type;
+#if 0
+	argv[0].type = aml_t_string;
+	argv[0].str.needfree = 0;
+	argv[0].str.string = "abcde";
+	argv[1].type = aml_t_string;
+	argv[1].str.needfree = 0;
+	argv[1].str.string = "abcdef";
+	retval = acpi_invoke_method_by_name("SCMP", 2, argv);
+	showobject(retval);
+	acpi_free_object(&retval);
+#else
 	retval = acpi_invoke_method_by_name("_PTS", 1, argv);
+	showobject(retval);
+	acpi_free_object(&retval);
 	retval = acpi_invoke_method_by_name("_WAK", 1, argv);
+	showobject(retval);
+	acpi_free_object(&retval);
+#endif
 	acpi_simulation_regdump("region.dmp");
 #endif
 	acpi_free_childname(get_rootname());
Index: obj.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/obj.c,v
retrieving revision 1.2
diff -u -r1.2 obj.c
--- obj.c	1999/12/26 13:15:04	1.2
+++ obj.c	2000/01/08 20:31:52
@@ -125,6 +125,9 @@
 	case aml_t_device:
 		memid = memid_aml_objtype;
 		break;
+	case aml_t_objref:
+		memid = memid_aml_objref;
+		break;
 	default:
 		memid = memid_aml_objtype;
 		break;
@@ -173,3 +176,49 @@
 	memman_free(aml_memman, memid_unkown, *obj);
 	*obj = NULL;
 }
+
+void
+acpi_realloc_object(union aml_object * obj, int size)
+{
+	enum aml_objtype type = obj->type;
+	union aml_object tmp;
+	int	i;
+
+	switch (type) {
+	case aml_t_buffer:
+		if (obj->buffer.size > size) {
+			return;
+		}
+		tmp.buffer.size = size;
+		tmp.buffer.data = memman_alloc_flexsize(aml_memman, size);
+		bcopy(obj->buffer.data, tmp.buffer.data, obj->buffer.size);
+		acpi_free_objectcontent(obj);
+		*obj = tmp;
+		break;
+
+	case aml_t_string:
+		if (strlen(obj->str.string) > size) {
+			return;
+		}
+		tmp.str.string = memman_alloc_flexsize(aml_memman, size + 1);
+		strcpy(tmp.str.string, obj->str.string);
+		acpi_free_objectcontent(obj);
+		*obj = tmp;
+		break;
+	case aml_t_package:
+		if (obj->package.elements > size) {
+			return;
+		}
+		tmp.package.objects = memman_alloc_flexsize(aml_memman,	
+		    size * sizeof(union aml_object *));
+		for (i = 0; i < size; i++) {
+			tmp.package.objects[i] = obj->package.objects[i];
+		}
+		memman_free_flexsize(aml_memman, obj->package.objects);
+		obj->package.objects = tmp.package.objects;
+		break;
+	default:
+		break;
+	}
+}
+
Index: obj.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/obj.h,v
retrieving revision 1.3
diff -u -r1.3 obj.h
--- obj.h	2000/01/03 10:16:59	1.3
+++ obj.h	2000/01/08 20:39:26
@@ -29,7 +29,8 @@
 #define _OBJ_H_
 struct aml_environ;
 enum aml_objtype {
-	aml_t_namestr = -1,
+	aml_t_namestr = -2,
+	aml_t_objref,
 	aml_t_null = 0,
 	aml_t_num,
 	aml_t_string,
@@ -141,6 +142,13 @@
 	int             level;
 	/* Management data here */
 };
+struct aml_objref {
+	enum aml_objtype type;
+	union aml_object *ref;
+	int             offset;	/* of aml_buffer.data or aml_package.objects. */
+	/* if negative value, not ready to dereference for element access. */
+	unsigned	deref;	/* indicates whether dereffenced or not */
+};
 union aml_object {
 	enum aml_objtype type;
 	struct aml_num  num;
@@ -155,6 +163,7 @@
 	struct aml_bufferfield bfld;
 	struct aml_package package;
 	struct aml_string str;
+	struct aml_objref objref;
 };
 
 
@@ -163,4 +172,5 @@
 void acpi_free_objectcontent(union aml_object * obj);
 void
 acpi_free_object(union aml_object ** obj);
+void acpi_realloc_object(union aml_object * obj, int size);
 #endif
Index: parse.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/parse.c,v
retrieving revision 1.14
diff -u -r1.14 parse.c
--- parse.c	2000/01/03 10:16:59	1.14
+++ parse.c	2000/01/08 19:48:30
@@ -1259,10 +1259,23 @@
 		break;
 
 	case 0x71:		/* RefOfOp */
+	{
+		union aml_object *srcobj, *objref;
+
 		DPRINT("RefOf(");
-		acpi_parse_termobj(env, indent);
+		srcobj = acpi_eval_name(env, acpi_parse_termobj(env, indent));
 		DPRINT(")");
+
+		objref = acpi_alloc_object(aml_t_objref, NULL);
+		objref->objref.ref = srcobj;
+		objref->objref.offset = -1;	/* deferent from IndexOp */
+		objref->objref.deref = 0;
+		env->work.property = objref;
+		aname = &env->work;
 		break;
+	}
+
+
 #define NUMOP3(opname,oparation) {\
 		DPRINT(opname);\
 		DPRINT("(");\
@@ -1373,11 +1386,34 @@
 		NUMOP2("FindSetRightBit",findsetrightbit);
 		break;
 	case 0x83:		/* DerefOp */
+	{
+		union aml_object	*r;
+
 		DPRINT("DerefOf(");
-		acpi_parse_termobj(env, indent);
+		r = acpi_eval_name(env, acpi_parse_termobj(env, indent));
 		DPRINT(")");
-		break;
 
+		switch (r->objref.ref->type) {
+		case aml_t_package:
+		case aml_t_buffer:
+			if (r->objref.offset < 0) {
+				env->work.property = r->objref.ref;
+				acpi_free_object(&r);
+			} else {
+				r->objref.deref = 1;
+				env->work.property = r;
+			}
+			break;
+		default:
+			env->work.property = r->objref.ref;
+			acpi_free_object(&r);
+			break;
+		}
+		
+		aname = &env->work;
+
+		break;
+	}
 	case 0x86:		/* NotifyOp */
 		DPRINT("Notify(");
 		acpi_parse_termobj(env, indent);
@@ -1387,21 +1423,66 @@
 		break;
 
 	case 0x87:		/* SizeOfOp */
-		DPRINT("Sizeof(");
-		acpi_parse_termobj(env, indent);
+		DPRINT("SizeOf(");
+		aname=acpi_parse_termobj(env, indent);
+		tmpobj = aname->property;
+
 		DPRINT(")");
+		num1 = 0;
+		switch (tmpobj->type) {
+		case aml_t_buffer:
+			num1 = tmpobj->buffer.size;
+			break;
+
+		case aml_t_string:
+			num1 = strlen(tmpobj->str.string);
+			break;
+
+		case aml_t_package:
+			num1 = tmpobj->package.elements;
+			break;
+
+		default:
+			fprintf(stderr,"Args of SizeOf should be buffer/string/package only\n");
+			break;
+		}
+
+		anum.num.number = num1;
+		env->wobj.num = anum.num;
+		aname = &env->work;
 		break;
 
 	case 0x88:		/* IndexOp */
+	{
+		union aml_object *srcobj, *objref;
+
 		DPRINT("Index(");
-		acpi_parse_termobj(env, indent);
+		srcobj = acpi_eval_name(env, acpi_parse_termobj(env, indent));
 		DPRINT(", ");
-		acpi_parse_termobj(env, indent);
+		num1 = acpi_objtonum
+		  (env, acpi_eval_name(env, acpi_parse_termobj(env, indent)));
 		DPRINT(", ");
-		acpi_parse_termobj(env, indent);
+		distname1 = acpi_parse_termobj(env, indent);
 		DPRINT(")");
+		switch (srcobj->type) {
+		case aml_t_package:
+		case aml_t_buffer:
+			objref = acpi_alloc_object(aml_t_objref, NULL);
+			objref->objref.ref = srcobj;
+			objref->objref.offset = num1;
+			objref->objref.deref = 0;
+			break;
+		default:
+			fprintf(stderr,"Arg1 of Index should be either buffer or package\n");
+			return aname;
+		}
+		
+		acpi_store_to_name(env, objref, distname1);
+		env->work.property = objref;
+		aname = &env->work;
 		break;
-
+	}
+	
 	case 0x89:		/* MatchOp */
 		DPRINT("Match(");
 		acpi_parse_termobj(env, indent);
@@ -1498,7 +1579,7 @@
 		CMPOP("LLess",<);
 		break;
 	case 0xa0:		/* IfOp */
-		acpi_parse_defif(env, indent);
+		aname = acpi_parse_defif(env, indent);
 		break;
 #if 0
 		
@@ -1510,7 +1591,7 @@
 #endif
 
 	case 0xa2:		/* WhileOp */
-		acpi_parse_defwhile(env, indent);
+		aname = acpi_parse_defwhile(env, indent);
 		break;
 
 	case 0xa3:		/* NoopOp */
@@ -1555,4 +1636,34 @@
     acpi_free_childname(curname);
     memman_free(aml_memman,memid_aml_name,curname);
   }
+}
+
+void
+acpi_free_childname_one(struct aml_name *aname, struct aml_name *child)
+{
+	struct aml_name *ptr, *curname, *bigbrother;
+
+	ptr = aname->child;
+
+	while (ptr != NULL) {
+		curname = ptr;
+		ptr = ptr->brother;
+		if (curname == child) {
+			/* I'm going to die, say good bye to my family... */
+			if (curname->parent->child == curname) {
+				curname->parent->child = NULL;
+			} else {
+				for (bigbrother = curname->parent->child;
+				     bigbrother->brother != curname;
+				     bigbrother = bigbrother->brother) ;
+				bigbrother->brother = curname->brother;
+			}
+			
+			acpi_free_object(&curname->property);
+			acpi_free_childname(curname);
+			memman_free(aml_memman, memid_aml_name, curname);
+			return;
+		}
+		acpi_free_childname_one(curname, child);
+	}
 }
Index: parse.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/parse.h,v
retrieving revision 1.1
diff -u -r1.1 parse.h
--- parse.h	1999/12/26 06:38:03	1.1
+++ parse.h	2000/01/04 22:12:15
@@ -30,3 +30,6 @@
 struct aml_name *acpi_parse_objectlist(struct aml_environ * env, int indent);
 struct aml_name *acpi_parse_termobj(struct aml_environ * env, int indent);
 void acpi_free_childname(struct aml_name *aname);
+void acpi_free_childname_one(struct aml_name *aname,
+			     struct aml_name *child);
+
Index: search.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/search.c,v
retrieving revision 1.1
diff -u -r1.1 search.c
--- search.c	1999/12/26 06:36:25	1.1
+++ search.c	2000/01/04 21:33:04
@@ -57,7 +57,16 @@
 struct aml_name *
 acpi_create_name(struct aml_environ * env, u_int8_t * dp)
 {
-	return acpi_nameman(env, dp, ACPI_CREATE_NAME);
+	struct aml_name *newname, **created;
+
+	newname = acpi_nameman(env, dp, ACPI_CREATE_NAME);
+
+	if (env->executing == 1) {
+		for (created = env->created_on_exec; *created; created++) ;
+		*created = newname;
+	}
+
+	return newname;
 }
 static struct aml_name *
 acpi_nameman(struct aml_environ * env, u_int8_t * dp, int flag)
Index: store.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/store.c,v
retrieving revision 1.4
diff -u -r1.4 store.c
--- store.c	2000/01/03 10:17:00	1.4
+++ store.c	2000/01/08 21:09:18
@@ -28,6 +28,7 @@
 
 #include <sys/param.h>
 #include <stdio.h>
+#include <string.h>
 #include <assert.h>
 #include <sys/types.h>
 #include "name.h"
@@ -75,6 +76,128 @@
 	}
 	env->curname=oname;
 }
+
+void
+acpi_store_to_buffer(struct aml_environ *env,union aml_object *obj, union aml_object *buf, int offset)
+{
+	int	size;
+
+	switch (obj->type){
+	case aml_t_num:
+		if (offset > buf->buffer.size) {
+			acpi_realloc_object(buf, offset);
+		}
+		buf->buffer.data[offset] = obj->num.number & 0xff;
+		DPRINT("[Store number 0x%x to buffer]", obj->num.number & 0xff);
+		break;
+
+	case aml_t_string:
+		size = strlen(obj->str.string);
+		if (buf->buffer.size - offset < size) {
+			acpi_realloc_object(buf, offset + size + 1);
+		}
+		strcpy(&buf->buffer.data[offset],obj->str.string);
+		DPRINT("[Store string to buffer]");
+		break;
+
+	case aml_t_buffer:
+		bzero(buf->buffer.data, buf->buffer.size);
+		if (obj->buffer.size > buf->buffer.size) {
+			size = buf->buffer.size;
+		} else {
+			size = obj->buffer.size;
+		}
+		bcopy(obj->buffer.data, buf->buffer.data, size);
+		break;
+
+	default:
+		goto not_yet;
+	}
+	return;
+not_yet:
+	DPRINT("[XXX not supported yet]");
+}
+
+
+void
+acpi_store_to_object(struct aml_environ *env,union aml_object *src, union aml_object *dist)
+{
+	switch(dist->type){
+	case aml_t_num:
+		if(src->type==aml_t_num){
+			dist->num=src->num;
+			DPRINT("[Store number 0x%x]", src->num.number);
+		}
+		else{
+			env->stat=aml_stat_panic;
+		}
+		break;
+#if 0
+	case aml_t_field:
+		acpi_store_to_fieldname(env,obj,name);
+		break;
+#endif
+	case aml_t_string:
+	case aml_t_buffer:
+	case aml_t_package:
+		break;
+	case aml_t_bufferfield:
+	{
+		char *buffer=dist->bfld.origin;
+		int offset=dist->bfld.bitoffset;
+		int bitlen=dist->bfld.bitlen;
+		buffer+=offset/8;
+		DPRINT("WRITE BFLD\n");
+		if(src->type==aml_t_num){
+			if((offset&7)==0||(bitlen&7)==0){
+				*buffer|=((src->num.number&((1<<bitlen)-1))
+				    <<(offset%7));
+			}else if(bitlen==8){
+				*buffer=src->num.number;
+			}else if(bitlen==16){
+				*(short*)buffer=src->num.number;
+			}else if(bitlen==32){
+				*(long *)buffer=src->num.number;
+			}else{
+				DPRINT("ERROR\n");
+			}
+		}
+	}
+	break;
+	case aml_t_debug:
+		showobject(src);
+		break;
+	default:
+		DPRINT("[Unimplemented %d]",dist->type);
+		break;
+	}
+}
+
+void
+acpi_store_to_objref(struct aml_environ *env,union aml_object *obj, union aml_object *r)
+{
+	int	offset;
+
+	switch(r->objref.ref->type){
+	case aml_t_buffer:
+		offset = r->objref.offset;
+		acpi_store_to_buffer(env, obj, r, r->objref.offset);
+		break;
+
+	case aml_t_package:
+		offset = r->objref.offset;
+		if (r->objref.ref->package.elements < offset) {
+			acpi_realloc_object(r->objref.ref, offset);
+		}
+		acpi_store_to_object(env, obj, r->objref.ref->package.objects[offset]);
+		break;
+	default:
+		acpi_store_to_object(env, obj, r->objref.ref);
+		break;
+	}
+	acpi_free_object(&r);	/* XXX */
+}
+
 /*Store to Named object */
 void 
 acpi_store_to_name(struct aml_environ *env,union aml_object *obj,struct aml_name *name)
@@ -126,7 +249,10 @@
 		acpi_store_to_fieldname(env,obj,name);
 		break;
 	case aml_t_string:
+		break;
 	case aml_t_buffer:
+		acpi_store_to_buffer(env, obj, name->property, 0);
+		break;
 	case aml_t_package:
 		break;
 	case aml_t_bufferfield:
@@ -152,6 +278,9 @@
 		}
 	}
 	break;
+	case aml_t_objref:
+		acpi_store_to_objref(env, obj, name->property);
+		break;
 	case aml_t_debug:
 		showobject(obj);
 		break;
