From owner-acpi-jp@jp.freebsd.org  Fri Jan  7 21:35:53 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id VAA60332;
	Fri, 7 Jan 2000 21:35:53 +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 VAA60327
	for <acpi-jp@jp.freebsd.org>; Fri, 7 Jan 2000 21:35:53 +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 VAA26111
	for <acpi-jp@jp.freebsd.org>; Fri, 7 Jan 2000 21:35:47 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Message-Id: <200001071235.VAA26111@tasogare.imasy.or.jp>
To: acpi-jp@jp.freebsd.org
In-Reply-To: Your message of "Tue, 04 Jan 2000 01:03:31 +0900"
	<200001031603.BAA03288@tasogare.imasy.or.jp>
References: <200001031603.BAA03288@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: Fri, 07 Jan 2000 21:35:47 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 980905(IM100)
Lines: 320
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+990727
X-Sequence: acpi-jp 220
Subject: [acpi-jp 220] 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

> Store(0x1, Index(BUFF, 0x0, Zero)) $B$N$h$&$J(B Index $B$N8~$3$&$N(B
> $BNN0h$X%"%/%;%9$9$kOC$G$9!#(B

$B$3$l$NJL$NJ}<0$N0F$G$9!#(BObject Reference $B7?$J$k$b$N$r?7$?$KMQ0U$7!"(B
aml_object $B$X$N%]%$%s%?$rJ];}$9$k$H$$$&0F$G$9!#(BPackage/Buffer $B$N(B
$BFCDj$NMWAG(B/$BNN0h$X$N%"%/%;%9$K4X$7$F$O!"(B($BMWAG$=$N$b$N$G$O$J$/(B) 
Package/Buffer $B$X$N%]%$%s%?$H(B offset $B$bF1;~$KJ];}$7$F$*$-!"(B
$B<B:]$K%"%/%;%9$9$kCJ3,$G%]%$%s%?$H(B offset $B$r;H$C$F$=$N@h$NMWAG(B/$BNN0h$X(B
$B$5$o$j$K$$$-$^$9!#(B
$B$^$@(B Store(0x1, Index(BUFF, 0x0, Zero)) $B$0$i$$$7$+<BAu$7$F$$$^$;$s$,(B
$B$H$j$"$($:%5%s%W%k$H$7$FN.$7$F$*$-$^$9!#(B

$B$H$3$m$G!"$3$NJU$C$FEOJU$5$sCe<j$7$F$^$9(B?
$B:#=5Kv$O;~4V$,<h$l5$L#$J46$8$J$N$G!"L$Ce<j$N>l9g$O$3$l$r40@.$5$;$k$+!"(B
$B$=$&$8$c$J$$>l9g$OJL$N$H$3$m$r$d$j$?$$$H;W$$$^$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: 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/07 07:45:08
@@ -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;
@@ -172,4 +175,17 @@
 	acpi_free_objectcontent(*obj);
 	memman_free(aml_memman, memid_unkown, *obj);
 	*obj = NULL;
+}
+
+void
+acpi_add_package_elements(union aml_object *srcobj, enum aml_objtype type, u_int elements)
+{
+	int	i, pos;
+
+	pos = srcobj->package.elements;
+	for (i = 0; i < elements; i++) {
+		srcobj->package.objects[pos] = acpi_alloc_object(type, NULL);
+		pos++;
+	}
+	srcobj->package.elements = pos;
 }
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/07 07:57:13
@@ -46,7 +46,8 @@
 	aml_t_therm,
 	aml_t_bufferfield,
 	aml_t_ddbhandle,
-	aml_t_debug
+	aml_t_debug,
+	aml_t_objref
 };
 struct aml_namestr {
 	enum aml_objtype type;	/* =aml_t_namestr */
@@ -141,6 +142,11 @@
 	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 */
+};
 union aml_object {
 	enum aml_objtype type;
 	struct aml_num  num;
@@ -155,6 +161,7 @@
 	struct aml_bufferfield bfld;
 	struct aml_package package;
 	struct aml_string str;
+	struct aml_objref objref;
 };
 
 
@@ -163,4 +170,7 @@
 void acpi_free_objectcontent(union aml_object * obj);
 void
 acpi_free_object(union aml_object ** obj);
+
+void acpi_add_package_elements(union aml_object *srcobj, enum aml_objtype type, u_int elements);
+
 #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/07 12:10:59
@@ -1393,15 +1393,35 @@
 		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(")");
+		objref = acpi_alloc_object(aml_t_objref, NULL);
+		switch (srcobj->type) {
+		case aml_t_package:
+		case aml_t_buffer:
+			objref->objref.ref = srcobj;
+			objref->objref.offset = num1;
+			break;
+		default:
+			fprintf(stderr,"Index supports package/buffer only for now\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);
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/07 08:10:09
@@ -75,6 +75,115 @@
 	}
 	env->curname=oname;
 }
+
+void
+acpi_store_to_buffer(struct aml_environ *env,union aml_object *obj, union aml_object *buf, int offset)
+{
+	switch (obj->type){
+	case aml_t_num:
+		if (offset * sizeof(obj->num.number) > buf->buffer.size) {
+			goto not_yet;	/* realloc... */
+		}
+		memcpy(&buf->buffer.data[offset * sizeof(obj->num.number)],
+		    &obj->num.number, sizeof(obj->num.number));
+		DPRINT("[Store number 0x%x to buffer]", obj->num.number);
+		break;
+	case aml_t_string:
+		if (buf->buffer.size - offset < strlen(obj->str.string)) {
+			goto not_yet;	/* realloc... */
+		}
+		strcpy(&buf->buffer.data[offset],obj->str.string);
+		DPRINT("[Store string to buffer]");
+		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_add_package_elements(r->objref.ref, obj->type,
+			    offset - r->objref.ref->package.elements);
+		}
+		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)
@@ -152,6 +261,9 @@
 		}
 	}
 	break;
+	case aml_t_objref:
+		acpi_store_to_objref(env, obj, name->property);
+		break;
 	case aml_t_debug:
 		showobject(obj);
 		break;
