Index: generic/include/console/kconsole.h
===================================================================
--- generic/include/console/kconsole.h	(revision 5bb20ecae2584df196d27b8acf4d0342e275dfd6)
+++ generic/include/console/kconsole.h	(revision 91c78c9c94e66242e7a59d1070420b5347b9eaee)
@@ -37,5 +37,6 @@
 	ARG_TYPE_INVALID = 0,
 	ARG_TYPE_INT,
-	ARG_TYPE_STRING
+	ARG_TYPE_STRING,
+	ARG_TYPE_VAR      /**< Variable type - either symbol or string */
 };
 
@@ -46,4 +47,5 @@
 	size_t len;			/**< Size of the buffer. */
 	__native intval;                /**< Integer value */
+	cmd_arg_type_t vartype;         /**< Resulting type of variable arg */
 };
 
Index: generic/src/console/kconsole.c
===================================================================
--- generic/src/console/kconsole.c	(revision 5bb20ecae2584df196d27b8acf4d0342e275dfd6)
+++ generic/src/console/kconsole.c	(revision 91c78c9c94e66242e7a59d1070420b5347b9eaee)
@@ -117,4 +117,6 @@
 /** Call0 - call function with no parameters */
 static char call0_buf[MAX_CMDLINE+1];
+static char carg1_buf[MAX_CMDLINE+1];
+static char carg2_buf[MAX_CMDLINE+1];
 
 static int cmd_call0(cmd_arg_t *argv);
@@ -139,5 +141,9 @@
 		.len = sizeof(call0_buf)
 	},
-	{ .type = ARG_TYPE_INT }
+	{ 
+		.type = ARG_TYPE_VAR,
+		.buffer = carg1_buf,
+		.len = sizeof(carg1_buf)
+	}
 };
 static cmd_info_t call1_info = {
@@ -156,6 +162,14 @@
 		.len = sizeof(call0_buf)
 	},
-	{ .type = ARG_TYPE_INT },
-	{ .type = ARG_TYPE_INT }
+	{ 
+		.type = ARG_TYPE_VAR,
+		.buffer = carg1_buf,
+		.len = sizeof(carg1_buf)
+	},
+	{ 
+		.type = ARG_TYPE_VAR,
+		.buffer = carg2_buf,
+		.len = sizeof(carg2_buf)
+	}
 };
 static cmd_info_t call2_info = {
@@ -306,4 +320,36 @@
 }
 
+static int parse_int_arg(char *text, size_t len, __native *result)
+{
+	char symname[MAX_SYMBOL_NAME];
+	__address symaddr;
+	bool isaddr = false;
+	
+	/* If we get a name, try to find it in symbol table */
+	if (text[0] < '0' | text[0] > '9') {
+		if (text[0] == '&') {
+			isaddr = true;
+			text++;len--;
+		}
+		strncpy(symname, text, min(len+1, MAX_SYMBOL_NAME));
+		symaddr = get_symbol_addr(symname);
+		if (!symaddr) {
+			printf("Symbol %s not found.\n",symname);
+			return -1;
+		}
+		if (symaddr == (__address) -1) {
+			printf("Duplicate symbol %s.\n",symname);
+			symtab_print_search(symname);
+			return -1;
+		}
+		if (isaddr)
+			*result = (__native)symaddr;
+		else
+			*result = *((__native *)symaddr);
+	} else /* It's a number - convert it */
+		*result = atoi(text);
+	return 0;
+}
+
 /** Parse command line.
  *
@@ -371,29 +417,28 @@
 		case ARG_TYPE_STRING:
 		    	buf = cmd->argv[i].buffer;
-		    	strncpy(buf, (const char *) &cmdline[start], min((end - start) + 1, cmd->argv[i].len - 1));
+		    	strncpy(buf, (const char *) &cmdline[start], min((end - start) + 2, cmd->argv[i].len));
 			buf[min((end - start) + 1, cmd->argv[i].len - 1)] = '\0';
 			break;
-		case ARG_TYPE_INT: {
-			char symname[MAX_SYMBOL_NAME];
-			__address symaddr;
-
-			/* If we get a name, try to find it in symbol table */
-			if (cmdline[start] < '0' | cmdline[start] > '9') {
-				strncpy(symname, cmdline+start, min((end-start) + 1, MAX_SYMBOL_NAME -1 ));
-				symaddr = get_symbol_addr(symname);
-				if (!symaddr) {
-					printf("Symbol %s not found.\n",symname);
-					return NULL;
-				}
-				if (symaddr == (__address) -1) {
-					printf("Duplicate symbol %s.\n",symname);
-					symtab_print_search(symname);
-					return NULL;
-				}
-				cmd->argv[i].intval = *((__native *)symaddr);
-			} else /* It's a number - convert it */
-				cmd->argv[i].intval = atoi(cmdline+start);
+		case ARG_TYPE_INT: 
+			if (parse_int_arg(cmdline+start, end-start+1, 
+					  &cmd->argv[i].intval))
+				return NULL;
 			break;
+		case ARG_TYPE_VAR:
+			if (start != end && cmdline[start] == '"' && cmdline[end] == '"') {
+				buf = cmd->argv[i].buffer;
+				strncpy(buf, (const char *) &cmdline[start+1], 
+					min((end-start), cmd->argv[i].len));
+				buf[min((end - start), cmd->argv[i].len - 1)] = '\0';
+				cmd->argv[i].intval = (__native) buf;
+				cmd->argv[i].vartype = ARG_TYPE_STRING;
+			} else if (!parse_int_arg(cmdline+start, end-start+1, 
+						 &cmd->argv[i].intval))
+				cmd->argv[i].vartype = ARG_TYPE_INT;
+			else {
+				printf("Unrecognized variable argument.\n");
+				return NULL;
 			}
+			break;
 		case ARG_TYPE_INVALID:
 		default:
@@ -538,5 +583,5 @@
 	symaddr = get_symbol_addr(argv->buffer);
 	if (!symaddr)
-		printf("Symbol not found.\n");
+		printf("Symbol %s not found.\n", argv->buffer);
 	else if (symaddr == (__address) -1) {
 		symtab_print_search(argv->buffer);
@@ -562,5 +607,5 @@
 	symaddr = get_symbol_addr(argv->buffer);
 	if (!symaddr)
-		printf("Symbol not found.\n");
+		printf("Symbol %s not found.\n", argv->buffer);
 	else if (symaddr == (__address) -1) {
 		symtab_print_search(argv->buffer);
@@ -581,5 +626,5 @@
 	__address symaddr;
 	char *symbol;
-	__native (*f)(__native);
+	__native (*f)(__native,__native);
 	__native arg1 = argv[1].intval;
 	__native arg2 = argv[2].intval;
@@ -587,5 +632,5 @@
 	symaddr = get_symbol_addr(argv->buffer);
 	if (!symaddr)
-		printf("Symbol not found.\n");
+		printf("Symbol %s not found.\n", argv->buffer);
 	else if (symaddr == (__address) -1) {
 		symtab_print_search(argv->buffer);
@@ -595,6 +640,6 @@
 		printf("Calling f(0x%x,0x%x): 0x%p: %s\n", 
 		       arg1, arg2, symaddr, symbol);
-		f =  (__native (*)(__native)) symaddr;
-		printf("Result: 0x%x\n", f(arg1));
+		f =  (__native (*)(__native,__native)) symaddr;
+		printf("Result: 0x%x\n", f(arg1, arg2));
 	}
 	
Index: generic/src/lib/func.c
===================================================================
--- generic/src/lib/func.c	(revision 5bb20ecae2584df196d27b8acf4d0342e275dfd6)
+++ generic/src/lib/func.c	(revision 91c78c9c94e66242e7a59d1070420b5347b9eaee)
@@ -113,4 +113,5 @@
 			return;
 	}
+	dest[i-1] = '\0';
 }
 
