--- linux-2.6.11-rc4/./init/initramfs.c.bak	2005-02-23 00:42:19.000000000 +0100
+++ linux-2.6.11-rc4/./init/initramfs.c	2005-02-23 00:53:42.000000000 +0100
@@ -468,6 +468,31 @@ extern char __initramfs_start[], __initr
 #include <linux/initrd.h>
 #endif
 
+#ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD
+/*
+ * Locates the beginning of the acpi dsdt in the init image
+ * - returns NULL if it's not found
+ */
+static unsigned char* __init find_dsdt(void)
+{
+	unsigned char start_signature[] = "INITRDDSDT123DSDT123";
+	unsigned char *data = (unsigned char*)initrd_start;
+
+	if (!initrd_start)
+		return NULL;
+
+	//find the start signature:
+	for (; data < (unsigned char*)initrd_end && 
+		strncmp(data, start_signature, sizeof(start_signature) - 1); 
+		data++); 
+
+	//was the signature found?
+	return (data < (unsigned char*)initrd_end) ? data : NULL;
+}
+#else
+static inline unsigned char* find_dsdt(void) {return NULL;}
+#endif
+
 void __init populate_rootfs(void)
 {
 	char *err = unpack_to_rootfs(__initramfs_start,
@@ -477,13 +502,22 @@ void __init populate_rootfs(void)
 #ifdef CONFIG_BLK_DEV_INITRD
 	if (initrd_start) {
 		int fd;
+		unsigned long initramfs_len;
+		unsigned char* acpi_dsdt_start = find_dsdt();
+
+		//check to see if there's a DSDT in the image:
+		if (acpi_dsdt_start)
+			initramfs_len = (unsigned long)acpi_dsdt_start - initrd_start;
+		else
+			initramfs_len = initrd_end - initrd_start;
+
 		printk(KERN_INFO "checking if image is initramfs...");
 		err = unpack_to_rootfs((char *)initrd_start,
-			initrd_end - initrd_start, 1);
+			initramfs_len, 1);
 		if (!err) {
 			printk(" it is\n");
 			unpack_to_rootfs((char *)initrd_start,
-				initrd_end - initrd_start, 0);
+				initramfs_len, 0);
 			free_initrd_mem(initrd_start, initrd_end);
 			return;
 		}
