Index: kernel/generic/include/time/clock.h
===================================================================
--- kernel/generic/include/time/clock.h	(revision cc85fb9f57fb5f9af22419eb0ee58d9548d3c7d1)
+++ kernel/generic/include/time/clock.h	(revision 4b662f8c01914a3c25af983f9e3510fca9cbc9b9)
@@ -36,5 +36,16 @@
 #define KERN_CLOCK_H_
 
+#include <arch/types.h>
+
 #define HZ		100
+
+/** Uptime structure */
+typedef struct {
+	unative_t seconds1;
+	unative_t useconds;
+	unative_t seconds2;
+} uptime_t;
+
+extern uptime_t *uptime;
 
 extern void clock(void);
Index: kernel/generic/src/console/cmd.c
===================================================================
--- kernel/generic/src/console/cmd.c	(revision cc85fb9f57fb5f9af22419eb0ee58d9548d3c7d1)
+++ kernel/generic/src/console/cmd.c	(revision 4b662f8c01914a3c25af983f9e3510fca9cbc9b9)
@@ -93,4 +93,12 @@
 };
 
+static int cmd_uptime(cmd_arg_t *argv);
+static cmd_info_t uptime_info = {
+	.name = "uptime",
+	.description = "Print uptime information.",
+	.func = cmd_uptime,
+	.argc = 0
+};
+
 static int cmd_continue(cmd_arg_t *argv);
 static cmd_info_t continue_info = {
@@ -440,4 +448,5 @@
 	&exit_info,
 	&reboot_info,
+	&uptime_info,
 	&halt_info,
 	&help_info,
@@ -530,4 +539,24 @@
 }
 
+
+/** Print system uptime information.
+ *
+ * @param argv Argument vector.
+ *
+ * @return 0 on failure, 1 on success.
+ */
+int cmd_uptime(cmd_arg_t *argv)
+{
+	ASSERT(uptime);
+	
+	/* This doesn't have to be very accurate */
+	unative_t sec = uptime->seconds1;
+	
+	printf("Up %u days, %u hours, %u minutes, %u seconds\n",
+		sec / 86400, (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60);
+	
+	return 1;
+}
+
 /** Describe specified command.
  *
Index: kernel/generic/src/time/clock.c
===================================================================
--- kernel/generic/src/time/clock.c	(revision cc85fb9f57fb5f9af22419eb0ee58d9548d3c7d1)
+++ kernel/generic/src/time/clock.c	(revision 4b662f8c01914a3c25af983f9e3510fca9cbc9b9)
@@ -42,5 +42,4 @@
 #include <time/clock.h>
 #include <time/timeout.h>
-#include <arch/types.h>
 #include <config.h>
 #include <synch/spinlock.h>
@@ -58,14 +57,10 @@
 #include <ddi/ddi.h>
 
-/** Physical memory area of the real time clock. */
+/* Pointer to variable with uptime */
+uptime_t *uptime;
+
+/** Physical memory area of the real time clock */
 static parea_t clock_parea;
 
-/* Pointers to public variables with time */
-struct ptime {
-	unative_t seconds1;
-	unative_t useconds;
-	unative_t seconds2;
-};
-struct ptime *public_time;
 /* Variable holding fragment of second, so that we would update
  * seconds correctly
@@ -87,13 +82,12 @@
 		panic("Cannot allocate page for clock");
 	
-	public_time = (struct ptime *) PA2KA(faddr);
-
-        /* TODO: We would need some arch dependent settings here */
-	public_time->seconds1 = 0;
-	public_time->seconds2 = 0;
-	public_time->useconds = 0; 
+	uptime = (uptime_t *) PA2KA(faddr);
+	
+	uptime->seconds1 = 0;
+	uptime->seconds2 = 0;
+	uptime->useconds = 0; 
 
 	clock_parea.pbase = (uintptr_t) faddr;
-	clock_parea.vbase = (uintptr_t) public_time;
+	clock_parea.vbase = (uintptr_t) uptime;
 	clock_parea.frames = 1;
 	clock_parea.cacheable = true;
@@ -117,14 +111,14 @@
 {
 	if (CPU->id == 0) {
-		secfrag += 1000000/HZ;
+		secfrag += 1000000 / HZ;
 		if (secfrag >= 1000000) {
 			secfrag -= 1000000;
-			public_time->seconds1++;
+			uptime->seconds1++;
 			write_barrier();
-			public_time->useconds = secfrag;
+			uptime->useconds = secfrag;
 			write_barrier();
-			public_time->seconds2 = public_time->seconds1;
+			uptime->seconds2 = uptime->seconds1;
 		} else
-			public_time->useconds += 1000000/HZ;
+			uptime->useconds += 1000000 / HZ;
 	}
 }
