Index: kernel/arch/ia32/src/ia32.c
===================================================================
--- kernel/arch/ia32/src/ia32.c	(revision add04f7e0e3352fd9691d3bf5b84b887766fc27b)
+++ kernel/arch/ia32/src/ia32.c	(revision 5d8d71ebf89df6dbc2bd7f5a55aa3d4c73a286cd)
@@ -41,4 +41,5 @@
 #include <arch/pm.h>
 
+#include <genarch/multiboot/multiboot.h>
 #include <genarch/drivers/legacy/ia32/io.h>
 #include <genarch/drivers/ega/ega.h>
@@ -67,6 +68,4 @@
 #include <sysinfo/sysinfo.h>
 #include <arch/boot/boot.h>
-#include <string.h>
-#include <macros.h>
 
 #ifdef CONFIG_SMP
@@ -74,104 +73,13 @@
 #endif
 
-/** Extract command name from the multiboot module command line.
- *
- * @param buf      Destination buffer (will always null-terminate).
- * @param n        Size of destination buffer.
- * @param cmd_line Input string (the command line).
- *
- */
-static void extract_command(char *buf, size_t n, const char *cmd_line)
-{
-	const char *start, *end, *cp;
-	size_t max_len;
-	
-	/* Find the first space. */
-	end = strchr(cmd_line, ' ');
-	if (end == NULL)
-		end = cmd_line + strlen(cmd_line);
-	
-	/*
-	 * Find last occurence of '/' before 'end'. If found, place start at
-	 * next character. Otherwise, place start at beginning of buffer.
-	 */
-	cp = end;
-	start = buf;
-	while (cp != start) {
-		if (*cp == '/') {
-			start = cp + 1;
-			break;
-		}
-		--cp;
-	}
-	
-	/* Copy the command and null-terminate the string. */
-	max_len = min(n - 1, (size_t) (end - start));
-	strncpy(buf, start, max_len + 1);
-	buf[max_len] = '\0';
-}
-
-/** C part of ia32 boot sequence.
+/** Perform ia32-specific initialization before main_bsp() is called.
  *
  * @param signature Should contain the multiboot signature.
  * @param mi        Pointer to the multiboot information structure.
  */
-void arch_pre_main(uint32_t signature, const mb_info_t *mi)
-{
-	uint32_t flags;
-	mb_mod_t *mods;
-	uint32_t i;
-	
-	if (signature == MULTIBOOT_LOADER_MAGIC)
-		flags = mi->flags;
-	else {
-		/* No multiboot info available. */
-		flags = 0;
-	}
-	
-	/* Copy module information. */
-	
-	if ((flags & MBINFO_FLAGS_MODS) != 0) {
-		init.cnt = mi->mods_count;
-		mods = mi->mods_addr;
-		
-		for (i = 0; i < init.cnt; i++) {
-			init.tasks[i].addr = mods[i].start + 0x80000000;
-			init.tasks[i].size = mods[i].end - mods[i].start;
-			
-			/* Copy command line, if available. */
-			if (mods[i].string) {
-				extract_command(init.tasks[i].name,
-				    CONFIG_TASK_NAME_BUFLEN,
-				    mods[i].string);
-			} else
-				init.tasks[i].name[0] = '\0';
-		}
-	} else
-		init.cnt = 0;
-	
-	/* Copy memory map. */
-	
-	int32_t mmap_length;
-	mb_mmap_t *mme;
-	uint32_t size;
-	
-	if ((flags & MBINFO_FLAGS_MMAP) != 0) {
-		mmap_length = mi->mmap_length;
-		mme = mi->mmap_addr;
-		e820counter = 0;
-		
-		i = 0;
-		while (mmap_length > 0) {
-			e820table[i++] = mme->mm_info;
-			
-			/* Compute address of next structure. */
-			size = sizeof(mme->size) + mme->size;
-			mme = ((void *) mme) + size;
-			mmap_length -= size;
-		}
-		
-		e820counter = i;
-	} else
-		e820counter = 0;
+void arch_pre_main(uint32_t signature, const multiboot_info_t *mi)
+{
+	/* Parse multiboot information obtained from the bootloader. */
+	multiboot_info_parse(signature, mi);	
 	
 #ifdef CONFIG_SMP
