1 diff -urN linux-2.4.20/arch/alpha/kernel/setup.c linux-2.4.20-initrdfix/arch/alpha/kernel/setup.c
2 --- linux-2.4.20/arch/alpha/kernel/setup.c 2002-08-02 20:39:42.000000000 -0400
3 +++ linux-2.4.20-initrdfix/arch/alpha/kernel/setup.c 2003-06-18 13:53:12.000000000 -0400
5 return end >> PAGE_SHIFT; /* Return the PFN of the limit. */
8 +#ifdef CONFIG_BLK_DEV_INITRD
10 +move_initrd(unsigned long mem_limit)
15 + size = initrd_end - initrd_start;
16 + start = __alloc_bootmem(PAGE_ALIGN(size), PAGE_SIZE, 0);
17 + if (!start || __pa(start) + size > mem_limit) {
18 + initrd_start = initrd_end = 0;
21 + memmove(start, (void *)initrd_start, size);
22 + initrd_start = (unsigned long)start;
23 + initrd_end = initrd_start + size;
24 + printk(KERN_INFO "initrd moved to %p\n", start);
29 #ifndef CONFIG_DISCONTIGMEM
31 setup_memory(void *kernel_end)
33 (void *) initrd_start, INITRD_SIZE);
35 if ((void *)initrd_end > phys_to_virt(PFN_PHYS(max_low_pfn))) {
36 - printk("initrd extends beyond end of memory "
37 - "(0x%08lx > 0x%p)\ndisabling initrd\n",
39 - phys_to_virt(PFN_PHYS(max_low_pfn)));
40 - initrd_start = initrd_end = 0;
41 + if (!move_initrd(PFN_PHYS(max_low_pfn)))
42 + printk("initrd extends beyond end of memory "
43 + "(0x%08lx > 0x%p)\ndisabling initrd\n",
45 + phys_to_virt(PFN_PHYS(max_low_pfn)));
47 reserve_bootmem(virt_to_phys((void *)initrd_start),
49 diff -urN linux-2.4.20/arch/alpha/mm/init.c linux-2.4.20-initrdfix/arch/alpha/mm/init.c
50 --- linux-2.4.20/arch/alpha/mm/init.c 2002-08-02 20:39:42.000000000 -0400
51 +++ linux-2.4.20-initrdfix/arch/alpha/mm/init.c 2003-06-18 13:53:09.000000000 -0400
53 #endif /* CONFIG_DISCONTIGMEM */
57 +free_reserved_mem(void *start, void *end)
59 - extern char __init_begin, __init_end;
62 - addr = (unsigned long)(&__init_begin);
63 - for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
64 - ClearPageReserved(virt_to_page(addr));
65 - set_page_count(virt_to_page(addr), 1);
67 + void *__start = start;
68 + for (; __start < end; __start += PAGE_SIZE) {
69 + ClearPageReserved(virt_to_page(__start));
70 + set_page_count(virt_to_page(__start), 1);
71 + free_page((long)__start);
79 + extern char __init_begin, __init_end;
81 + free_reserved_mem(&__init_begin, &__init_end);
82 printk (KERN_INFO "Freeing unused kernel memory: %ldk freed\n",
83 (&__init_end - &__init_begin) >> 10);
87 free_initrd_mem(unsigned long start, unsigned long end)
89 - unsigned long __start = start;
90 - for (; start < end; start += PAGE_SIZE) {
91 - ClearPageReserved(virt_to_page(start));
92 - set_page_count(virt_to_page(start), 1);
96 - printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - __start) >> 10);
97 + free_reserved_mem((void *)start, (void *)end);
98 + printk(KERN_INFO "Freeing initrd memory: %ldk freed\n",
99 + (end - start) >> 10);
103 diff -urN linux-2.4.20/arch/alpha/mm/numa.c linux-2.4.20-initrdfix/arch/alpha/mm/numa.c
104 --- linux-2.4.20/arch/alpha/mm/numa.c 2002-08-02 20:39:42.000000000 -0400
105 +++ linux-2.4.20-initrdfix/arch/alpha/mm/numa.c 2003-06-18 13:53:09.000000000 -0400
106 @@ -249,16 +249,18 @@
107 #ifdef CONFIG_BLK_DEV_INITRD
108 initrd_start = INITRD_START;
110 + extern void *move_initrd(unsigned long);
112 initrd_end = initrd_start+INITRD_SIZE;
113 printk("Initial ramdisk at: 0x%p (%lu bytes)\n",
114 (void *) initrd_start, INITRD_SIZE);
116 if ((void *)initrd_end > phys_to_virt(PFN_PHYS(max_low_pfn))) {
117 - printk("initrd extends beyond end of memory "
118 - "(0x%08lx > 0x%p)\ndisabling initrd\n",
120 - phys_to_virt(PFN_PHYS(max_low_pfn)));
121 - initrd_start = initrd_end = 0;
122 + if (!move_initrd(PFN_PHYS(max_low_pfn)))
123 + printk("initrd extends beyond end of memory "
124 + "(0x%08lx > 0x%p)\ndisabling initrd\n",
126 + phys_to_virt(PFN_PHYS(max_low_pfn)));
128 reserve_bootmem_node(NODE_DATA(KVADDR_TO_NID(initrd_start)),
129 virt_to_phys((void *)initrd_start),