From owner-acpi-jp@jp.freebsd.org  Wed Jan 12 04:59:23 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id EAA82849;
	Wed, 12 Jan 2000 04:59:23 +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 EAA82843
	for <acpi-jp@jp.freebsd.org>; Wed, 12 Jan 2000 04:59:23 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (isdn13.imasy.or.jp [202.227.24.205])
	by tasogare.imasy.or.jp (8.9.3+3.2W/3.7W-tasogare/smtpfeed 1.01) with ESMTP id EAA12906
	for <acpi-jp@jp.freebsd.org>; Wed, 12 Jan 2000 04:59:20 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Message-Id: <200001111959.EAA12906@tasogare.imasy.or.jp>
To: acpi-jp@jp.freebsd.org
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: Wed, 12 Jan 2000 04:59:19 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 980905(IM100)
Lines: 298
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+990727
X-Sequence: acpi-jp 231
Subject: [acpi-jp 231] AML debugger: r command
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

> $B$$$$K:$l$F$^$7$?$,!"%G%P%C%,$KG$0U$N(B method $B$r5/F0$G$-$k5!G=$rDI2C$7$^$7$?!#(B
> $B%Q%C%A$r:n$m$&$H;W$$$^$7$?$,!"$$$m$$$mJQ99$7$F$4$A$c$4$A$c$7$F$$$k$N$G!"(B
> $B<!2s(B commit $B$7$?8e$K@0M}$7$?$$$H;W$$$^$9!#(B

Buffer $B$d(B Object reference $B4X78$N(B interpreter $B$N%3!<%I$r(B commit $B$7$?$N$G!"(B
$B@0M}$7$^$7$?!#L@F|$"$?$j(B commit $BM=Dj$G$9!#(B
# $B$U$H(B GDB $B$G(B acpiconf $B$r%G%P%C%0$7$F$?$i!"(B'e' $B$K0cOB46$r46$8$?$N$G(B
# 'r' $B$KJQ99$7$^$7$?!#(B

Index: debug.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/debug.c,v
retrieving revision 1.5
diff -u -r1.5 debug.c
--- debug.c	2000/01/04 03:28:31	1.5
+++ debug.c	2000/01/11 19:43:39
@@ -117,6 +117,7 @@
 	while(1){
 		fputs("AML>",stderr);
 		fgets(commandline,512,stdin);
+		commandline[512-1] = '\n';	/* safty */
 		if(feof(stdin)){
 			commandline[0]='q';
 		}
@@ -140,7 +141,40 @@
 			env1->stat=aml_stat_panic;
 			return;
 		case 't':
-			showtree(env1->curname,0);
+		{
+			struct aml_name	*name;
+			char	*ptr;
+
+			/* NULL terminate */
+			ptr = &commandline[1];
+			while (ptr[0] != '\n')	ptr++;
+			ptr[0] = '\0';
+
+			/* move pointer to object name */
+			ptr = &commandline[1];
+			while (ptr[0] == ' ')	ptr++;
+
+			/* show current tree if no argument */
+			if (ptr[0] == '\0') {
+				showtree(env1->curname, 0);
+				goto show_variables;
+			}
+
+			/* start from root? */
+			if (ptr[0] == '\\') {
+				if (ptr[1] == '\0') {
+					showtree(get_rootname(), 0);
+					goto show_variables;
+				}
+				if ((name = search_aml_name_recursive(get_rootname(), ptr))) {
+					showtree(name, 0);
+					goto show_variables;
+				}
+			}
+			if ((name = search_aml_name_recursive(env1->curname, ptr))) {
+				showtree(name, 0);
+			}
+		show_variables:
 			for (i = 0; i < 7; i++) {
 				if (env2->argumentvalue[i].property == NULL) {
 					break;
@@ -156,6 +190,7 @@
 				showobject(env2->localvalue[i].property);
 			}
 			break;
+		}
 		case 'i':
 			acpi_debug_prompt_reginput=
 			    (acpi_debug_prompt_reginput==0)?1:0;
@@ -175,15 +210,127 @@
 		case 'm':
 			memman_statistics(aml_memman);
 			break;
+		case 'r':
+		{
+			union aml_object argv[7], *retval;
+			struct aml_name	*name;
+			char	*ptr, *method;
+#define BUFLEN	64
+			char	argbuf[7][BUFLEN];
+			char	*np, *ep;
+			int	i;
+
+			/* NULL terminate */
+			ptr = &commandline[1];
+			while (ptr[0] != '\n')	ptr++;
+			ptr[0] = '\0';
+
+			/* move pointer to method name */
+			ptr = &commandline[1];
+			while (ptr[0] == ' ')	ptr++;
+
+			if (ptr[0] == '\0') {
+				break;
+			}
+			name = search_aml_name_recursive(get_rootname(), ptr);
+			if (name == NULL) {
+				break;
+			}
+			if (name->property == NULL ||
+			    name->property->type != aml_t_method) {
+				break;
+			}
+
+			showobject(name->property);
+			method = ptr;
+
+			if (name->property->meth.argnum) {
+				fputs("  Enter argument values "
+				    "(ex. number 1 / string foo). "
+				    "'q' to quit.\n",stderr);
+			}
+			/* get and parse argument values */
+			for (i = 0; i < name->property->meth.argnum; i++) {
+			retry:
+				fprintf(stderr, "  Arg%d ? ", i);
+				if (read(0, argbuf[i], BUFLEN) == 0) {
+					fputs("\n", stderr);
+					goto retry;
+				}
+				argbuf[i][BUFLEN-1] = '\n';
+				if (argbuf[i][0] == 'q') {
+					goto finish_execution;
+				}
+				if (argbuf[i][0] == '\n') {
+					goto retry;
+				}
+
+				/* move pointer to the value */
+				ptr = &argbuf[i][0];
+				while (ptr[0] != ' ' && ptr[0] != '\n') {
+					ptr++;
+				}
+				while (ptr[0] == ' ') {
+					ptr++;
+				}
+				if (ptr[0] == '\n') {
+					goto retry;
+				}
+
+				switch (argbuf[i][0]) {
+				case 'n':
+					argv[i].type = aml_t_num;
+					np = ptr;
+					if (ptr[0] == '0' &&
+					    ptr[1] == 'x') {
+						argv[i].num.number = strtoq(ptr, &ep, 16);
+					} else {
+						argv[i].num.number = strtoq(ptr, &ep, 10);
+					}
+					if (np == ep) {
+						fputs("Wrong value for number.\n"
+						    , stderr);
+						goto retry;
+					}
+					break;
+				case 's':
+					argv[i].type = aml_t_string;
+					argv[i].str.needfree = 0;
+					argv[i].str.string = ptr;
+					/* NULL ternimate */
+					while (ptr[0] != '\n') {
+						ptr++;
+					}
+					ptr[0] = '\0';
+					break;
+				default:
+					fputs("Invalid data type "
+					    "(supports number or string only)\n"
+					    , stderr);
+					goto retry;
+				}
+			}
+			bzero(lastcommand, sizeof lastcommand);
+			fprintf(stderr, "==== Running %s. ====\n", method);
+			retval = acpi_invoke_method_by_name(method,
+			    name->property->meth.argnum, argv);
+			showobject(retval);
+			acpi_free_object(&retval);
+			fprintf(stderr, "==== %s finished. ====\n", method);
+		finish_execution:
+			break;
+#undef BUFLEN
+		}
 		case 'h':
 			fputs("s	Single step\n"
 			      "n	Step program\n"
 			      "c	Continue program being debugged\n"
 			      "q	Quit method execution\n"
-			      "t	Show local name space tree\n"
+			      "t	Show local name space tree and variables\n"
 			      "i	Toggle region input prompt\n"
 			      "o	Toggle region output prompt\n"
 			      "m	Show memory management statistics\n"
+			      "r	Run specified method\n"
 			      "h	Show this messsage\n"
 			    , stderr);
 			break;
@@ -280,6 +427,14 @@
 		break;
 	case aml_t_ddbhandle:
 		printf("DDBHANDLE\n");
+		break;
+	case aml_t_objref:
+		printf("Object reference");
+		if (obj->objref.offset >= 0) {
+			printf(" (offset %d)", obj->objref.offset);
+		}
+		printf(" of ");
+		showobject(obj->objref.ref);
 		break;
 	default:
 		printf("UNK ID=%d\n", obj->type);
Index: evalobj.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/evalobj.c,v
retrieving revision 1.6
diff -u -r1.6 evalobj.c
--- evalobj.c	2000/01/11 11:33:41	1.6
+++ evalobj.c	2000/01/11 14:14:19
@@ -333,8 +333,8 @@
 	int	i;
 
 	bzero(&env, sizeof(env));
-	name = search_aml_name(get_rootname(), method);
-	
+	name = search_aml_name_recursive(get_rootname(), method);
+
 	if (name != NULL && name->property != NULL &&
 	    name->property->type == aml_t_method) {
 		env.curname = name;
Index: name.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/name.c,v
retrieving revision 1.3
diff -u -r1.3 name.c
--- name.c	1999/12/01 17:46:44	1.3
+++ name.c	2000/01/11 06:59:10
@@ -24,6 +24,40 @@
 }
 
 struct aml_name *
+search_aml_name_recursive(struct aml_name *start, char *name)
+{
+	char	*ptr = name;
+	int	len;
+	/* assert(parent) */
+	struct aml_name *parent, *result;
+	
+	parent = start;
+	if (ptr[0] == '\\') {
+		ptr++;
+		parent = get_rootname();
+	}
+
+	for (len = 0; ptr[len] != '.' && ptr[len] != '\0'; len++)
+		;
+
+	for (result = parent->child; result; result = result->brother) {
+		if (!strncmp(result->name, ptr, len)) {
+			if (ptr[len] == '\0' || ptr[len + 1] == '\0') {
+				return result;
+			}
+			ptr += len;
+			if (ptr[0] != '.') {
+				return NULL;
+			}
+			ptr++;
+			return search_aml_name_recursive(result, ptr);
+		}
+	}
+
+	return NULL;
+}
+
+struct aml_name *
 set_aml_name(struct aml_name * parent, char *name)
 {
 	struct aml_name *newname;
Index: name.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/name.h,v
retrieving revision 1.5
diff -u -r1.5 name.h
--- name.h	2000/01/11 11:33:41	1.5
+++ name.h	2000/01/11 14:14:20
@@ -19,5 +19,6 @@
 
 struct aml_name *get_rootname();
 struct aml_name *search_aml_name(struct aml_name * parent, char *name);
+struct aml_name *search_aml_name_recursive(struct aml_name * parent, char *name);
 struct aml_name *set_aml_name(struct aml_name * parent, char *name);
 #endif
