diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S
--- a/arch/arm/kernel/calls.S
+++ b/arch/arm/kernel/calls.S
@@ -236,7 +236,7 @@ __syscall_start:
 		.long	sys_mincore
 /* 220 */	.long	sys_madvise
 		.long	sys_fcntl64
-		.long	sys_ni_syscall /* TUX */
+		.long	sys_mhelper
 		.long	sys_ni_syscall
 		.long	sys_gettid
 /* 225 */	.long	sys_readahead
diff --git a/arch/arm/mach-s3c2410/s3c2410.c b/arch/arm/mach-s3c2410/s3c2410.c
--- a/arch/arm/mach-s3c2410/s3c2410.c
+++ b/arch/arm/mach-s3c2410/s3c2410.c
@@ -45,7 +45,7 @@
 
 /* Initial IO mappings */
 
-static struct map_desc s3c2410_iodesc[] __initdata = {
+struct map_desc s3c2410_iodesc[] __initdata = {
 	IODESC_ENT(USBHOST),
 	IODESC_ENT(USBDEV),
 	IODESC_ENT(CLKPWR),
@@ -56,6 +56,8 @@ static struct map_desc s3c2410_iodesc[] 
 	IODESC_ENT(WATCHDOG)
 };
 
+unsigned long s3c2410_iodesc_size = ARRAY_SIZE(s3c2410_iodesc);
+
 static struct resource s3c_uart0_resource[] = {
 	[0] = {
 		.start = S3C2410_PA_UART0,
diff --git a/kernel/Makefile b/kernel/Makefile
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -7,7 +7,7 @@ obj-y     = sched.o fork.o exec_domain.o
 	    sysctl.o capability.o ptrace.o timer.o user.o \
 	    signal.o sys.o kmod.o workqueue.o pid.o \
 	    rcupdate.o intermodule.o extable.o params.o posix-timers.o \
-	    kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o
+	    kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mhelper.o
 
 obj-$(CONFIG_FUTEX) += futex.o
 obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
diff --git a/kernel/mhelper.c b/kernel/mhelper.c
new file mode 100644
--- /dev/null
+++ b/kernel/mhelper.c
@@ -0,0 +1,114 @@
+
+#include <linux/config.h>
+#include <linux/linkage.h>
+#include <asm/errno.h>
+
+#include <asm/io.h>
+#include <asm/hardware.h>
+#include <asm/mach-types.h>
+#include <asm/uaccess.h>
+#include <asm/mach/map.h>
+
+#include "mhelper.h"
+
+
+
+#define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, S3C2410_PA_##x, S3C24XX_SZ_##x, MT_DEVICE }
+
+struct map_desc mhelper_iodesc[] = {
+        IODESC_ENT(IRQ),
+        IODESC_ENT(MEMCTRL),
+        IODESC_ENT(USBHOST),
+        IODESC_ENT(DMA),
+        IODESC_ENT(CLKPWR),
+        IODESC_ENT(LCD),
+        IODESC_ENT(NAND),
+        IODESC_ENT(UART),
+        IODESC_ENT(TIMER),
+        IODESC_ENT(USBDEV),
+        IODESC_ENT(WATCHDOG),
+        IODESC_ENT(IIC),
+        IODESC_ENT(IIS),
+        IODESC_ENT(GPIO),
+        IODESC_ENT(RTC),
+        IODESC_ENT(ADC),
+        IODESC_ENT(SPI),
+        IODESC_ENT(SDI),
+};
+
+#define       IODESC_SIZE     (sizeof(mhelper_iodesc)/sizeof(struct map_desc))
+	
+static inline unsigned long
+map_io_to_va(unsigned long addr)
+{
+	int index;
+
+      for (index=0; index<IODESC_SIZE; index++) {
+               unsigned long phys = mhelper_iodesc[index].physical;
+               unsigned long len = mhelper_iodesc[index].length;
+
+		if ((addr >= phys) & (addr < phys+len))
+			break;
+	}
+      if (index < IODESC_SIZE) {
+               unsigned long phys = mhelper_iodesc[index].physical;
+               unsigned long virt = mhelper_iodesc[index].virtual;
+
+		return (addr - phys + virt);
+	}
+	return 0;
+}
+
+
+extern asmlinkage long
+sys_mhelper(uint32_t cmd, uint32_t addr, uint32_t value)
+{
+	unsigned long vaddr = 0;
+	int verb;
+
+	if (!(vaddr = map_io_to_va(addr)))
+		return -ENXIO;
+
+
+	verb = (cmd & OPT_VERB);	
+	cmd &= ~OPT_VERB;
+
+        switch (cmd) {
+
+	case CMD_READ_B:
+		value = __raw_readb(vaddr);
+		if (verb)
+			printk("0x%08x: 0x%02x (%d)\n", 
+				addr, value, value);
+		break;
+	case CMD_READ_W:
+		value = __raw_readw(vaddr);
+		if (verb)
+			printk("0x%08x: 0x%04x (%d)\n", 
+				addr, value, value);
+		break;
+	case CMD_READ_L:
+		value = __raw_readl(vaddr);
+		if (verb)
+			printk("0x%08x: 0x%08x (%d)\n", 
+				addr, value, value);
+		break;
+
+	case CMD_WRITE_B:
+		__raw_writeb(value, vaddr);
+		break;
+	case CMD_WRITE_W:
+		__raw_writew(value, vaddr);
+		break;
+	case CMD_WRITE_L:
+		__raw_writel(value, vaddr);
+		break;
+
+	default:
+		return -EINVAL;
+		break;
+	}
+
+	return verb?0:value;
+}
+
diff --git a/kernel/mhelper.h b/kernel/mhelper.h
new file mode 100644
--- /dev/null
+++ b/kernel/mhelper.h
@@ -0,0 +1,24 @@
+
+#define CAT_READ	0x10
+#define CAT_WRITE	0x20
+
+#define CAT_BYTE	0x01
+#define CAT_WORD	0x02
+#define CAT_LONG	0x03
+
+#define	OPT_VERB	0x80
+
+
+enum {
+	CMD_VERSION = 0,
+
+	CMD_READ_B  = 0x11,
+	CMD_READ_W,
+	CMD_READ_L,
+
+	CMD_WRITE_B = 0x21,
+	CMD_WRITE_W,
+	CMD_WRITE_L,
+
+};
+
