Index: kernel/generic/include/lib/rd.h
===================================================================
--- kernel/generic/include/lib/rd.h	(revision 8c19cf2876a406fac783c1b246f2f5a22deab35c)
+++ kernel/generic/include/lib/rd.h	(revision 7c34822e63c6dd1cc781653743cea9cd94f08a18)
@@ -76,5 +76,5 @@
 } rd_header;
 
-extern int init_rd(rd_header * addr);
+extern int init_rd(rd_header * addr, size_t size);
 
 #endif
Index: kernel/generic/src/lib/rd.c
===================================================================
--- kernel/generic/src/lib/rd.c	(revision 8c19cf2876a406fac783c1b246f2f5a22deab35c)
+++ kernel/generic/src/lib/rd.c	(revision 7c34822e63c6dd1cc781653743cea9cd94f08a18)
@@ -40,6 +40,8 @@
 #include <lib/rd.h>
 #include <arch/byteorder.h>
+#include <mm/frame.h>
+#include <sysinfo/sysinfo.h>
 
-int init_rd(rd_header * header)
+int init_rd(rd_header * header, size_t size)
 {
 	/* Identify RAM disk */
@@ -51,16 +53,31 @@
 		return RE_UNSUPPORTED;
 	
-	uint64_t hsize;
+	uint32_t hsize;
+	uint64_t dsize;
 	switch (header->data_type) {
 	case RD_DATA_LSB:
-		hsize = uint64_t_le2host(header->header_size);
+		hsize = uint32_t_le2host(header->header_size);
+		dsize = uint64_t_le2host(header->data_size);
 		break;
-//	case RD_DATA_MSB:
-//		hsize = uint64_t_be2host(header->header_size);
-//		break;
+	case RD_DATA_MSB:
+		hsize = uint32_t_be2host(header->header_size);
+		dsize = uint64_t_le2host(header->data_size);
+		break;
 	default:
 		return RE_UNSUPPORTED;
 	}
-		
+	
+	if ((hsize % FRAME_SIZE) || (dsize % FRAME_SIZE))
+		return RE_UNSUPPORTED;
+	
+	if (hsize > size)
+		return RE_INVALID;
+	
+	if ((uint64_t) hsize + dsize > size)
+		dsize = size - hsize;
+	
+	sysinfo_set_item_val("rd", NULL, true);
+	sysinfo_set_item_val("rd.size", NULL, dsize);
+	sysinfo_set_item_val("rd.address.physical", NULL, (unative_t) KA2PA((void *) header + hsize));
 
 	return RE_OK;
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision 8c19cf2876a406fac783c1b246f2f5a22deab35c)
+++ kernel/generic/src/main/kinit.c	(revision 7c34822e63c6dd1cc781653743cea9cd94f08a18)
@@ -181,5 +181,5 @@
 				ipc_phone_0 = &utask->answerbox;
 		} else {
-			int rd = init_rd((void *) init.tasks[i].addr);
+			int rd = init_rd((rd_header *) init.tasks[i].addr, init.tasks[i].size);
 			
 			if (rd != RE_OK)
Index: uspace/libc/generic/sysinfo.c
===================================================================
--- uspace/libc/generic/sysinfo.c	(revision 8c19cf2876a406fac783c1b246f2f5a22deab35c)
+++ uspace/libc/generic/sysinfo.c	(revision 7c34822e63c6dd1cc781653743cea9cd94f08a18)
@@ -39,9 +39,7 @@
 sysarg_t sysinfo_value(char *name)
 {
-	return __SYSCALL2(SYS_SYSINFO_VALUE, (sysarg_t ) name, (sysarg_t) strlen(name) );
+	return __SYSCALL2(SYS_SYSINFO_VALUE, (sysarg_t ) name, (sysarg_t) strlen(name));
 }
 
 /** @}
  */
- 
- 
Index: uspace/rd/rd.c
===================================================================
--- uspace/rd/rd.c	(revision 8c19cf2876a406fac783c1b246f2f5a22deab35c)
+++ uspace/rd/rd.c	(revision 7c34822e63c6dd1cc781653743cea9cd94f08a18)
@@ -39,4 +39,9 @@
 #include <ipc/services.h>
 #include <ipc/ns.h>
+#include <sysinfo.h>
+#include <as.h>
+#include <ddi.h>
+#include <align.h>
+#include <bool.h>
 #include <errno.h>
 #include <async.h>
@@ -65,18 +70,38 @@
 
 
+static bool rd_init(void)
+{
+	size_t rd_size = sysinfo_value("rd.size");
+	void * rd_ph_addr = (void *) sysinfo_value("rd.address.physical");
+	
+	if (rd_size == 0)
+		return false;
+	
+	void * rd_addr = as_get_mappable_page(rd_size);
+	
+	map_physmem(rd_ph_addr, rd_addr, ALIGN_UP(rd_size, PAGE_SIZE) >> PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE);
+	
+	return true;
+}
+
+
 int main(int argc, char **argv)
 {
-	ipcarg_t phonead;
+	if (rd_init()) {
+		ipcarg_t phonead;
+		
+		async_set_client_connection(rd_connection);
+		
+		/* Register service at nameserver */
+		if (ipc_connect_to_me(PHONE_NS, SERVICE_RD, 0, &phonead) != 0)
+			return -1;
+		
+		async_manager();
+		
+		/* Never reached */
+		return 0;
+	}
 	
-	async_set_client_connection(rd_connection);
-	
-	/* Register service at nameserver */
-	if (ipc_connect_to_me(PHONE_NS, SERVICE_RD, 0, &phonead) != 0)
-		return -1;
-
-	async_manager();
-
-	/* Never reached */
-	return 0;
+	return -1;
 }
 
