diff -Nur linux-2.6.9-rc2-bk6/arch/arm/kernel/calls.S linux-2.6.9-rc2-bk6-h1940/arch/arm/kernel/calls.S
--- linux-2.6.9-rc2-bk6/arch/arm/kernel/calls.S	2004-08-14 12:56:24.000000000 +0200
+++ linux-2.6.9-rc2-bk6-h1940/arch/arm/kernel/calls.S	2004-09-20 19:06:05.000000000 +0200
@@ -236,7 +236,7 @@
 		.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 -Nur linux-2.6.9-rc2-bk6/kernel/Makefile linux-2.6.9-rc2-bk6-h1940/kernel/Makefile
--- linux-2.6.9-rc2-bk6/kernel/Makefile	2004-09-20 18:28:24.000000000 +0200
+++ linux-2.6.9-rc2-bk6-h1940/kernel/Makefile	2004-09-20 19:06:15.000000000 +0200
@@ -7,7 +7,7 @@
 	    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
+	    kthread.o wait.o kfifo.o sys_ni.o mhelper.o
 
 obj-$(CONFIG_FUTEX) += futex.o
 obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
diff -Nur linux-2.6.9-rc2-bk6/kernel/mhelper.c linux-2.6.9-rc2-bk6-h1940/kernel/mhelper.c
--- linux-2.6.9-rc2-bk6/kernel/mhelper.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.9-rc2-bk6-h1940/kernel/mhelper.c	2004-09-20 19:06:15.000000000 +0200
@@ -0,0 +1,83 @@
+
+#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) { S3C2410_VA_##x, S3C2410_PA_##x, S3C2410_SZ_##x, MT_DEVICE }
+
+extern struct map_desc s3c2410_iodesc[];
+extern unsigned long s3c2410_iodesc_size;
+
+static inline unsigned long
+map_io_to_va(unsigned long addr)
+{
+	int index;
+
+	for (index=0; index<s3c2410_iodesc_size; index++) {
+		unsigned long phys = s3c2410_iodesc[index].physical;
+		unsigned long len = s3c2410_iodesc[index].length;
+
+		if ((addr >= phys) & (addr < phys+len))
+			break;
+	}
+	if (index < s3c2410_iodesc_size) {
+		unsigned long phys = s3c2410_iodesc[index].physical;
+		unsigned long virt = s3c2410_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;
+
+	if (!(vaddr = map_io_to_va(addr)))
+		return -ENXIO;
+
+        switch (cmd) {
+
+	case CMD_READ_B:
+		value = __raw_readb(vaddr);
+		printk("0x%08x: 0x%02x (%d)\n", addr, value, value);
+		break;
+	case CMD_READ_W:
+		value = __raw_readw(vaddr);
+		printk("0x%08x: 0x%04x (%d)\n", addr, value, value);
+		break;
+	case CMD_READ_L:
+		value = __raw_readl(vaddr);
+		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 0;
+}
+
diff -Nur linux-2.6.9-rc2-bk6/kernel/mhelper.h linux-2.6.9-rc2-bk6-h1940/kernel/mhelper.h
--- linux-2.6.9-rc2-bk6/kernel/mhelper.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.9-rc2-bk6-h1940/kernel/mhelper.h	2004-09-20 19:06:15.000000000 +0200
@@ -0,0 +1,22 @@
+
+#define CAT_READ	0x10
+#define CAT_WRITE	0x20
+
+#define CAT_BYTE	0x01
+#define CAT_WORD	0x02
+#define CAT_LONG	0x03
+
+
+enum {
+	CMD_VERSION = 0,
+
+	CMD_READ_B  = 0x11,
+	CMD_READ_W,
+	CMD_READ_L,
+
+	CMD_WRITE_B = 0x21,
+	CMD_WRITE_W,
+	CMD_WRITE_L,
+
+};
+

--- linux-2.6.9-rc2-bk6/arch/arm/mach-s3c2410/s3c2410.c.orig	2004-10-31 20:43:06.000000000 +0100
+++ linux-2.6.9-rc2-bk6/arch/arm/mach-s3c2410/s3c2410.c	2004-10-31 20:44:46.000000000 +0100
@@ -49,7 +49,7 @@
 
 /* Initial IO mappings */
 
-static struct map_desc s3c2410_iodesc[] __initdata = {
+struct map_desc s3c2410_iodesc[] __initdata = {
 	IODESC_ENT(USBHOST),
 	IODESC_ENT(CLKPWR),
 	IODESC_ENT(LCD),
@@ -59,6 +59,8 @@
 	IODESC_ENT(WATCHDOG)
 };
 
+unsigned long s3c2410_iodesc_size = ARRAY_SIZE(s3c2410_iodesc);
+
 static struct resource s3c_uart0_resource[] = {
 	[0] = {
 		.start = S3C2410_PA_UART0,
