From owner-acpi-jp@jp.freebsd.org  Tue Nov 21 10:37:38 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id KAA85183;
	Tue, 21 Nov 2000 10:37:38 +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 KAA85171
	for <acpi-jp@jp.freebsd.org>; Tue, 21 Nov 2000 10:37:37 +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 eAL1bYq62541
	for <acpi-jp@jp.freebsd.org>; Tue, 21 Nov 2000 10:37:34 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
To: acpi-jp@jp.freebsd.org
In-Reply-To: <200011181635.BAA46850@shidahara1.planet.sci.kobe-u.ac.jp>
References: <200011181439.eAIEdOF04987@mass.osd.bsdi.com>
	<200011181635.BAA46850@shidahara1.planet.sci.kobe-u.ac.jp>
X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20001121103733Q.iwasaki@jp.FreeBSD.org>
Date: Tue, 21 Nov 2000 10:37:33 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 20000228(IM140)
Lines: 274
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: acpi-jp 909
Subject: [acpi-jp 909] Parser BUG FIX? (Re: FYI: ACPICA new version. )
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

> >> If the bug is not fixed, I cannot get battery status correctly.
> >
> >Can you be more specific about the problem(s)?
> >
> As I mentioned before, I don't investigate the problem completely.
> But I think this problem is occur in following ASL code.
> Actual ASL code is TP240.asl's UPBS(UPdateBatteryStatus?) and GBFE method .
> (http://www.jp.freebsd.org/cgi/cvsweb.cgi/ACPI/data/TP240.asl?rev=1.1&cvsroot=freebsd-jp)
> 
> Method(GBFE,3)  // GetByteFieldEntry?
> {
>         CreateByteField(Arg0, Arg1, TIDX)
>         Store(TIDX, Arg2)
> }
> 
> Method(AAAA)
> {
> 	Store(Buffer(){1 , 2 , 3, 4},Local0)
> 	Store(3,Local1)
> 	While(Local1){
> 		GBFE(Local0,Local1,RefOf(Local2))
> 		Decrement(Local1)
> 		(*)
> 	}
> }
> 
> In this method the problem is that Local2 is always 4 at (*) point,
> though it is expected to be vary in 4 , 3 ,2 ,1 sequence.

I've made patches for this.  Please try this.

--- Parser/psparse.c-	Tue Nov 21 09:58:04 2000
+++ Parser/psparse.c	Tue Nov 21 09:59:41 2000
@@ -1185,6 +1185,7 @@
     ACPI_PARSE_DOWNWARDS    DescendingCallback,
     ACPI_PARSE_UPWARDS      AscendingCallback)
 {
+    UINT32                  i;
     ACPI_STATUS             Status;
     ACPI_PARSE_STATE        *ParserState;
     ACPI_WALK_STATE         *WalkState;
@@ -1375,6 +1376,11 @@
 
             AcpiDsRestartControlMethod (WalkState, ReturnDesc);
             WalkState->WalkType |= WALK_METHOD_RESTART;
+            for (i = 0; i < MTH_NUM_LOCALS; i++) {
+                if (WalkState->LocalVariables[i].Type != INTERNAL_TYPE_METHOD_LOCAL_VAR) {
+                    WalkState->LocalVariables[i].Type = INTERNAL_TYPE_METHOD_LOCAL_VAR;
+                }
+            }
         }
 
         /*

The problem was that reference of local variable was passed to the
method (GBFE) as a argument and type of the variable was overwritten
by source value.
>         CreateByteField(Arg0, Arg1, TIDX)
>         Store(TIDX, Arg2)
At this point, type of local variable of the caller became NUMBER, not 
INTERNAL_TYPE_METHOD_LOCAL_VAR. As the result the NUMBER object passed
to the method from second time (Local2 never be updated).

I attached debugger trace to this mail.

It seems that this happened at AcpiAmlExecStore -> AcpiDsMethodDataSetValue ->
AcpiNsAttachObject sequence, but I could be wrong.  Maybe better fix
would be made in AcpiNsAttachObject, I think.

% ./acpicadb test.aml
ACPI Subsystem version [Nov 21 2000]
Parsing Methods:..
2 Control Methods found and parsed (10 nodes total)
ACPI Namespace successfully loaded at root 0x0x808d2e4
- debug AAAA
Executing \AAAA
00000 #0070 [00]  Store
            [00]  (
00001 #0011 [01]  ....Buffer
            [01]  ....(
00003 #000A [02]  ........(UINT8)  0x04,
00005 #0033 [02]  ........ByteList      (Length 0x00000004)  
            [02]  ....)
00009 #0060 [01]  ....Local0
            [01]  }

% 
ArgObj:    0x8091e00 <Obj>             Number 0x00000004
ArgObj:    0x8091d80 <Obj>             Buffer 
ArgObj:    0x8091e00 <Obj> [Local0]
ResultObj: 0x8091d80 <Obj>             Buffer 

0000A #0070 [00]  Store
            [00]  (
0000B #000A [01]  ....(UINT8)  0x03,
0000D #0061 [01]  ....Local1
            [01]  }

% 
ArgObj:    0x8091e00 <Obj>             Number 0x00000003
ArgObj:    0x8091ec0 <Obj> [Local1]
ResultObj: 0x8091e00 <Obj>             Number 0x00000003

ArgObj:    0x8091ec0 <Obj> [Local1]    Number 0x00000003
ResultObj: 0x8091e00 <Obj>             Number 0x00000003

00017 #0071 [00]  RefOf
            [00]  (
00018 #0062 [01]  ....Local2
            [01]  }

% 
ArgObj:    0x8091ec0 <Obj> [Local2]
ResultObj: 0x8095160 <Node>            Name __L2 Type MethodLcl

0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
00011 #0035 [01]  ....MethodCall
            [01]  ....(
00000 #002D [02]  ........GBFE,  (Path \GBFE)
00015 #0060 [02]  ........Local0
00016 #0061 [02]  ........Local1
00000 #0036 [02]  ........[Return Value] MethodLcl	<- this seems OK.
            [02]  ....}
            [01]  }

% 
***Break*** at AML offset 0x1A
0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
00019 #0076 [01]  ....Decrement
            [01]  ....(
0001A #0061 [02]  ........Local1
            [02]  ....}
            [01]  }

% locals
Local Variables for method [AAAA]:
Local0: 0x8091d80 <Obj>             Buffer 
Local1: 0x8091e00 <Obj>             Number 0x00000003
Local2: 0x8099300 <Obj>             Number 0x00000004	<- updated.
Local3: 0x0 <NullObj>
Local4: 0x0 <NullObj>
Local5: 0x0 <NullObj>
Local6: 0x0 <NullObj>
Local7: 0x0 <NullObj>
% 
ArgObj:    0x8091f80 <Obj> [Local1]    Number 0x00000003
ResultObj: 0x8091e00 <Obj>             Number 0x00000002

0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
            [01]  }
Predicate was TRUE, executed block

% 
ArgObj:    0x8091f80 <Obj> [Local1]    Number 0x00000002
ResultObj: 0x8091e00 <Obj>             Number 0x00000002

00017 #0071 [00]  RefOf
            [00]  (
00018 #0062 [01]  ....Local2
            [01]  }

% 
ArgObj:    0x8091f80 <Obj> [Local2]    Number 0x00000004
ResultObj: 0x8095160 <Node>            Name __L2 Type Number

0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
00011 #0035 [01]  ....MethodCall
            [01]  ....(
00000 #002D [02]  ........GBFE,  (Path \GBFE)
00015 #0060 [02]  ........Local0
00016 #0061 [02]  ........Local1
00000 #0036 [02]  ........[Return Value]    Number 0x08099300	<- Wrong!
            [02]  ....}
            [01]  }

% 
***Break*** at AML offset 0x1A
0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
00019 #0076 [01]  ....Decrement
            [01]  ....(
0001A #0061 [02]  ........Local1
            [02]  ....}
            [01]  }

% locals
Local Variables for method [AAAA]:
Local0: 0x8091d80 <Obj>             Buffer 
Local1: 0x8091e00 <Obj>             Number 0x00000002
Local2: 0x8099300 <Obj>             Number 0x00000004	<- Wrong, should be 3!
Local3: 0x0 <NullObj>
Local4: 0x0 <NullObj>
Local5: 0x0 <NullObj>
Local6: 0x0 <NullObj>
Local7: 0x0 <NullObj>
% 
ArgObj:    0x8091ec0 <Obj> [Local1]    Number 0x00000002
ResultObj: 0x8091e00 <Obj>             Number 0x00000001

0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
            [01]  }
Predicate was TRUE, executed block

% 
ArgObj:    0x8091ec0 <Obj> [Local1]    Number 0x00000001
ResultObj: 0x8091e00 <Obj>             Number 0x00000001

00017 #0071 [00]  RefOf
            [00]  (
00018 #0062 [01]  ....Local2
            [01]  }

% 
ArgObj:    0x8091ec0 <Obj> [Local2]    Number 0x00000004
ResultObj: 0x8095160 <Node>            Name __L2 Type Number

0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
00011 #0035 [01]  ....MethodCall
            [01]  ....(
00000 #002D [02]  ........GBFE,  (Path \GBFE)
00015 #0060 [02]  ........Local0
00016 #0061 [02]  ........Local1
00000 #0036 [02]  ........[Return Value]    Number 0x08099300
            [02]  ....}
            [01]  }

% 
***Break*** at AML offset 0x1A
0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
00019 #0076 [01]  ....Decrement
            [01]  ....(
0001A #0061 [02]  ........Local1
            [02]  ....}
            [01]  }

% 
ArgObj:    0x8091f80 <Obj> [Local1]    Number 0x00000001
ResultObj: 0x8091e00 <Obj>             Number 0x00000000

0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
            [01]  }
Predicate was TRUE, executed block

% 
ArgObj:    0x8091f80 <Obj> [Local1]    Number 0x00000000
ResultObj: 0x8091e00 <Obj>             Number 0x00000000

0000E #00A2 [00]  While
            [00]  (
00010 #0061 [01]  ....Local1
            [01]  }
Predicate is FALSE, skipping block

% 
Outstanding: 12 allocations of total size 432 after execution
- 
- q
