Index: generic/src/console/cmd.c
===================================================================
--- generic/src/console/cmd.c	(revision 3550c393e4bb2a208392526efafab9cd54dcf5ac)
+++ generic/src/console/cmd.c	(revision 96c939e265b831944227ac791c6cc930f14d0ae3)
@@ -93,4 +93,25 @@
 };
 
+static char set_buf[MAX_CMDLINE+1];
+static int cmd_set4(cmd_arg_t *argv);
+static cmd_arg_t set4_argv[] = {
+	{
+		.type = ARG_TYPE_STRING,
+		.buffer = set_buf,
+		.len = sizeof(set_buf)
+	},
+	{ 
+		.type = ARG_TYPE_INT
+	}
+};
+static cmd_info_t set4_info = {
+	.name = "set4",
+	.description = "set <dest_addr> <value> - 4byte version",
+	.func = cmd_set4,
+	.argc = 2,
+	.argv = set4_argv
+};
+
+
 /** Data and methods for 'call0' command. */
 static char call0_buf[MAX_CMDLINE+1];
@@ -256,4 +277,8 @@
 	if (!cmd_register(&call3_info))
 		panic("could not register command %s\n", call3_info.name);
+
+	cmd_initialize(&set4_info);
+	if (!cmd_register(&set4_info))
+		panic("could not register command %s\n", set4_info.name);
 	
 	cmd_initialize(&halt_info);
@@ -472,2 +497,35 @@
 	return 1;
 }
+
+/** Write 4 byte value to address */
+int cmd_set4(cmd_arg_t *argv)
+{
+	char *symbol;
+	__u32 *addr ;
+	__u32 arg1 = argv[1].intval;
+	bool pointer = false;
+
+	if (((char *)argv->buffer)[0] == '*') {
+		addr = (__u32 *) get_symbol_addr(argv->buffer+1);
+		pointer = true;
+	} else if (((char *)argv->buffer)[0] >= '0' && 
+		   ((char *)argv->buffer)[0] <= '9')
+		addr = (__u32 *)atoi((char *)argv->buffer);
+	else
+		addr = (__u32 *)get_symbol_addr(argv->buffer);
+
+	if (!addr)
+		printf("Symbol %s not found.\n", argv->buffer);
+	else if (addr == (__u32 *) -1) {
+		symtab_print_search(argv->buffer);
+		printf("Duplicate symbol, be more specific.\n");
+	} else {
+		if (pointer)
+			addr = (__u32 *)*addr;
+		printf("Writing 0x%x -> 0x%p\n", arg1, addr);
+		*addr = arg1;
+		
+	}
+	
+	return 1;
+}
Index: generic/src/console/kconsole.c
===================================================================
--- generic/src/console/kconsole.c	(revision 3550c393e4bb2a208392526efafab9cd54dcf5ac)
+++ generic/src/console/kconsole.c	(revision 96c939e265b831944227ac791c6cc930f14d0ae3)
@@ -359,6 +359,8 @@
 		rdln_print_c('\b',curlen-position);
 	} 
-	histposition++;
-	histposition = histposition % KCONSOLE_HISTORY;
+	if (curlen) {
+		histposition++;
+		histposition = histposition % KCONSOLE_HISTORY;
+	}
 	current[curlen] = '\0';
 	return current;
Index: generic/src/lib/func.c
===================================================================
--- generic/src/lib/func.c	(revision 3550c393e4bb2a208392526efafab9cd54dcf5ac)
+++ generic/src/lib/func.c	(revision 96c939e265b831944227ac791c6cc930f14d0ae3)
@@ -141,5 +141,7 @@
 
 	while (*text) {
-		if (base != 16 && *text >= 'A' && *text <= 'F')
+		if (base != 16 && \
+		    ((*text >= 'A' && *text <= 'F' )
+		     || (*text >='a' && *text <='f')))
 			break;
 		if (base == 8 && *text >='8')
@@ -152,4 +154,7 @@
 			result *= base;
 			result += *text - 'A' + 10;
+		} else if (*text >= 'a' && *text <= 'f') {
+			result *= base;
+			result += *text - 'a' + 10;
 		} else
 			break;
