(e820.map[i].addr + e820.map[i].size));
                switch (e820.map[i].type) {
                case E820_RAM:
+               case E820_RESERVED_KERN:
                        printk(KERN_CONT "(usable)\n");
                        break;
                case E820_RESERVED:
                        register_nosave_region(pfn, PFN_UP(ei->addr));
 
                pfn = PFN_DOWN(ei->addr + ei->size);
-               if (ei->type != E820_RAM)
+               if (ei->type != E820_RAM && ei->type != E820_RESERVED_KERN)
                        register_nosave_region(PFN_UP(ei->addr), pfn);
 
                if (pfn >= limit_pfn)
        res = alloc_bootmem_low(sizeof(struct resource) * e820.nr_map);
        for (i = 0; i < e820.nr_map; i++) {
                switch (e820.map[i].type) {
+               case E820_RESERVED_KERN:
                case E820_RAM:  res->name = "System RAM"; break;
                case E820_ACPI: res->name = "ACPI Tables"; break;
                case E820_NVS:  res->name = "ACPI Non-volatile Storage"; break;
 
        /* reserve all memory between lowmem and the 1MB mark */
        reserve_early_overlap_ok(lowmem, 0x100000, "BIOS reserved");
 }
-
-void __init reserve_setup_data(void)
-{
-       struct setup_data *data;
-       u64 pa_data;
-       char buf[32];
-
-       if (boot_params.hdr.version < 0x0209)
-               return;
-       pa_data = boot_params.hdr.setup_data;
-       while (pa_data) {
-               data = early_ioremap(pa_data, sizeof(*data));
-               sprintf(buf, "setup data %x", data->type);
-               reserve_early(pa_data, pa_data+sizeof(*data)+data->len, buf);
-               pa_data = data->next;
-               early_iounmap(data, sizeof(*data));
-       }
-}
 
 #endif
 
        reserve_ebda_region();
-       reserve_setup_data();
 
        /*
         * At this point everything still needed from the boot loader
 
                default:
                        break;
                }
-#ifndef CONFIG_DEBUG_BOOT_PARAMS
-               free_early(pa_data, pa_data+sizeof(*data)+data->len);
-#endif
                pa_data = data->next;
                early_iounmap(data, PAGE_SIZE);
        }
 }
 
+static void __init reserve_setup_data(void)
+{
+       struct setup_data *data;
+       u64 pa_data;
+       char buf[32];
+
+       if (boot_params.hdr.version < 0x0209)
+               return;
+       pa_data = boot_params.hdr.setup_data;
+       while (pa_data) {
+               data = early_ioremap(pa_data, sizeof(*data));
+               sprintf(buf, "setup data %x", data->type);
+               reserve_early(pa_data, pa_data+sizeof(*data)+data->len, buf);
+               e820_update_range(pa_data, sizeof(*data)+data->len,
+                        E820_RAM, E820_RESERVED_KERN);
+               pa_data = data->next;
+               early_iounmap(data, sizeof(*data));
+       }
+       sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
+       printk(KERN_INFO "extended physical RAM map:\n");
+       e820_print_map("reserve setup_data");
+}
+
 /*
  * --------- Crashkernel reservation ------------------------------
  */
        memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
        pre_setup_arch_hook();
        early_cpu_init();
-       reserve_setup_data();
 #else
        printk(KERN_INFO "Command line: %s\n", boot_command_line);
 #endif
        ARCH_SETUP
 
        setup_memory_map();
+       parse_setup_data();
+
        copy_edd();
 
        if (!boot_params.hdr.root_flags)
        strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
        *cmdline_p = command_line;
 
-       parse_setup_data();
-
        parse_early_param();
 
+       /* after early param, so could get panic from serial */
+       reserve_setup_data();
+
        if (acpi_mps_check()) {
 #ifdef CONFIG_X86_LOCAL_APIC
                disable_apic = 1;
 
        __u8  _pad9[276];                               /* 0xeec */
 } __attribute__((packed));
 
-void reserve_setup_data(void);
-
 #endif /* _ASM_BOOTPARAM_H */
 
 #define E820_ACPI      3
 #define E820_NVS       4
 
+/* reserved RAM used by kernel itself */
+#define E820_RESERVED_KERN        128
+
 #ifndef __ASSEMBLY__
 struct e820entry {
        __u64 addr;     /* start of memory segment */