From owner-acpi-jp@jp.freebsd.org  Tue Sep 12 10:49:12 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id KAA77795;
	Tue, 12 Sep 2000 10:49:12 +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 KAA77785
	for <acpi-jp@jp.freebsd.org>; Tue, 12 Sep 2000 10:49:11 +0900 (JST)
	(envelope-from iwasaki@jp.freebsd.org)
Received: from localhost (iwasaki.imasy.or.jp [202.227.24.92])
	by tasogare.imasy.or.jp (8.10.2+3.3W/3.7W-tasogare/smtpfeed 1.07) with ESMTP id e8C1n9r31126
	for <acpi-jp@jp.freebsd.org>; Tue, 12 Sep 2000 10:49:09 +0900 (JST)
	(envelope-from iwasaki@jp.freebsd.org)
To: acpi-jp@jp.freebsd.org
In-Reply-To: <20000912092720B.iwasaki@jp.freebsd.org>
References: <20000907140550L.yokoyama@o3.otc.ogis-ri.co.jp>
	<20000908220335L.iwasaki@jp.freebsd.org>
	<20000912092720B.iwasaki@jp.freebsd.org>
X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Message-Id: <20000912104907H.iwasaki@jp.freebsd.org>
Date: Tue, 12 Sep 2000 10:49:07 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 20000228(IM140)
Lines: 131
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: acpi-jp 630
Subject: [acpi-jp 630] Re: zzz and ACPI (was: Re: acpi_send_pm_event())
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

> > $B$3$l$d$j$?$$$s$G$9$,!"=q$-9~$`CM$rJd@5$9$k=hM}$r6&DL4X?t$_$?$$$K$7$F!"(B
> > aml_region_XXX() $B$b0l=o$K$d$j$?$$$J$!$H;W$$$J$,$i$J$+$J$+;~4V$,$H$l$:(B...
> > $B$H$$$C$?>u67$G$9!#(Bflags, bitoffset, bitlen, orgvalue, value $B$rEO$9$H!"(B
> > $BJd@5:Q$_$NCM$rJV$7$F$/$l$k$d$D$G$9!#(B
> 
> $B$H$j$"$($:!"C!$-Bf$r:n$C$F$_$^$7$?!#(B
> AccessType $B$O(B ANY, BYTE, WORD, DWORD $B$7$+9MN8$7$F$$$^$;$s!#(B
> $B%3%a%s%H$h$m$7$/$*4j$$$7$^$9!#(B

$B$3$l$r;HMQ$7$?(B IndexField $B$X$N(B StoreOp $B4XO"$N(B Fix $B$r$^$H$a$^$7$?!#(B
# region $B4X78$b$d$i$J$-$c$G$9$M$'(B...

[acpi-jp 625] $B$N(B
> $B$=$m$=$m(B env->tempobject $B$r%9%?%C%/$_$?$$$K07$($k$h$&$K$7$J$$$H(B
> $B$&$C$+$j%(%s%P%0$7$A$c$&860x$K$J$j$=$&$J$s$G$9$,!"$$$$9M$($OL5$$$G$9$+$M(B?
$B$N7o$b!":,K\2r7h$G$O$J$$$G$9$,!"$H$j$"$($:(B StoreOp $B$NCf$G(B stack $B>e$K(B 
copy $B$9$k$h$&$K$7$^$7$?!#B>$K$bF1MM$K9MN8$9$Y$-2U=j$,$"$k$+$b$7$l$^$;$s$,!"(B
$B$$$/$D$+8+$D$+$C$?;~E@$G%^%/%m$K$7$F=q$-49$($l$P$$$$$+$J$H;W$C$F$$$^$9!#(B

$B$3$s$J$b$s$G$H$j$"$($:$I$&$G$7$g$&(B?

Index: aml_evalobj.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpi/aml/aml_evalobj.c,v
retrieving revision 1.1
diff -u -r1.1 aml_evalobj.c
--- aml_evalobj.c	2000/08/24 09:33:08	1.1
+++ aml_evalobj.c	2000/09/10 03:10:29
@@ -65,11 +65,13 @@
 static union aml_object *
 aml_eval_fieldobject(struct aml_environ *env, struct aml_name *name)
 {
+	int	num;
 	struct	aml_name *oname,*wname;
 	struct	aml_field *field;
 	struct	aml_opregion *or;
 	union	aml_object tobj;
 
+	num = 0;
 	/* CANNOT OCCUR! */
 	if (name == NULL || name->property == NULL ||
 	    name->property->type != aml_t_field) {
@@ -116,7 +118,10 @@
 		tobj.num.number = field->bitoffset / 8;/* AccessType Boundary */
 		aml_store_to_name(env, &tobj, wname);
 		wname = aml_search_name(env, field->f.ifld.dataname);
-		aml_eval_name(env, wname);
+		num = aml_objtonum(env, aml_eval_name(env, wname));
+		env->tempobject.type = aml_t_num;
+		env->tempobject.num.number = (num >> (field->bitoffset & 7)) &
+		    ((1 << field->bitlen) - 1);
 	}
 	env->curname = oname;
 	return (&env->tempobject);
Index: aml_parse.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpi/aml/aml_parse.c,v
retrieving revision 1.1
diff -u -r1.1 aml_parse.c
--- aml_parse.c	2000/08/24 09:33:08	1.1
+++ aml_parse.c	2000/09/12 01:32:12
@@ -1613,6 +1613,16 @@
 		AML_DEBUGPRINT(", ");
 		destname1 = aml_parse_termobj(env, indent);
 		AML_DEBUGPRINT(")");
+		/* XXX
+		 * temporary object may change during aml_store_to_name()
+		 * operation, so we make a copy of it on stack.
+		 */
+		if (destname1 == &env->tempname &&
+		    destname1->property == &env->tempobject) {
+			destname1 = aml_create_local_object();
+			AML_COPY_OBJECT(destname1->property, env,
+			    &env->tempobject, NULL);
+		}
 		aml_store_to_name(env, tmpobj, destname1);
 		if (env->stat == aml_stat_panic) {
 			AML_DEBUGPRINT("StoreOp failed");
Index: aml_store.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpi/aml/aml_store.c,v
retrieving revision 1.1
diff -u -r1.1 aml_store.c
--- aml_store.c	2000/08/24 09:33:08	1.1
+++ aml_store.c	2000/09/12 00:59:29
@@ -55,13 +55,14 @@
     struct aml_name *name)
 {
 	char	*buffer;
-	struct	aml_name *wname, *oname;
+	struct	aml_name *wname, *oname, *iname;
 	struct	aml_field *field;
 	struct	aml_opregion *or;
-	union	aml_object tobj;
+	union	aml_object tobj, iobj, *tmpobj;
 
 	field = &name->property->field;
 	oname = env->curname;
+	iname = NULL;
 	env->curname = name->parent;
 	if (field->f.ftype == f_t_field) {
 		wname = aml_search_name(env, field->f.fld.regname);
@@ -113,13 +114,23 @@
 			break;
 		}
 	} else if (field->f.ftype == f_t_index) {
-		wname = aml_search_name(env, field->f.ifld.indexname);
-		tobj.type = aml_t_num;
-		tobj.num.number = field->bitoffset / 8;	/* AccessType Boundary */
-		aml_store_to_name(env, &tobj, wname);
+		iname = aml_search_name(env, field->f.ifld.indexname);
 		wname = aml_search_name(env, field->f.ifld.dataname);
+		iobj.type = aml_t_num;
+		iobj.num.number = field->bitoffset / 8;	/* AccessType Boundary */
+
+		/* read whole values of IndexField */
+		aml_store_to_name(env, &iobj, iname);
+		tmpobj = aml_eval_name(env, wname);
+
+		/* make the values to be written */
 		tobj.num = obj->num;
-		tobj.num.number = tobj.num.number << (field->bitoffset & 7);
+		tobj.num.number = aml_adjust_updatevalue(field->flags,
+		    field->bitoffset & 7, field->bitlen,
+		    tmpobj->num.number, obj->num.number);
+
+		/* write the values to IndexField */
+		aml_store_to_name(env, &iobj, iname);
 		aml_store_to_name(env, &tobj, wname);
 	}
 	env->curname = oname;
