Hi,

On Sun, 18 Feb 2007, Kars de Jong wrote:

> ABCGHIJK
> Linux version 2.6.20-m68k-hp300 ([EMAIL PROTECTED]) (gcc version 4.1.2 
> 20061115 (prerelease) (Debian 4.1.1-21)) #8 Sun Feb 18 20:03:35 CET 2007
> Detected HP9000 model 425t
> HP300: early console registered
> start of paging_init (00001000, fc252000)
> block 0: 0xfc000000:0x4000000 (max_addr=0x0)
> Unable to handle kernel access at virtual address 00400000
> Oops: 00000000

Could you try the patch below?

bye, Roman

Index: arch/m68k/mm/motorola.c
===================================================================
RCS file: /home/linux-m68k/cvsroot/linux/arch/m68k/mm/motorola.c,v
retrieving revision 1.20
diff -u -p -r1.20 motorola.c
--- arch/m68k/mm/motorola.c     1 Jan 2007 14:30:54 -0000       1.20
+++ arch/m68k/mm/motorola.c     19 Feb 2007 01:21:39 -0000
@@ -170,8 +170,10 @@ static void __init map_node(int node)
                                for (i = 1; i < 64; physaddr += PAGE_SIZE, i++)
                                        pte_val(*pte_dir++) = physaddr;
                        }
-                       size -= PTRTREESIZE;
                        virtaddr += PTRTREESIZE;
+                       if (size < PTRTREESIZE)
+                               break;
+                       size -= PTRTREESIZE;
                } else {
                        if (!pmd_present(*pmd_dir)) {
 #ifdef DEBUG
@@ -187,11 +189,12 @@ static void __init map_node(int node)
                                        pte_val(*pte_dir) = physaddr;
                        } else
                                pte_val(*pte_dir) = 0;
-                       size -= PAGE_SIZE;
                        virtaddr += PAGE_SIZE;
                        physaddr += PAGE_SIZE;
+                       if (size < PAGE_SIZE)
+                               break;
+                       size -= PAGE_SIZE;
                }
-
        }
 #ifdef DEBUG
        printk("\n");
@@ -224,7 +227,7 @@ void __init paging_init(void)
        }
 
        min_addr = m68k_memory[0].addr;
-       max_addr = min_addr + m68k_memory[0].size;
+       max_addr = min_addr + m68k_memory[0].size - 1;
        for (i = 1; i < m68k_num_memory;) {
                if (m68k_memory[i].addr < min_addr) {
                        printk("Ignoring memory chunk at 0x%lx:0x%lx before the 
first chunk\n",
@@ -235,31 +238,30 @@ void __init paging_init(void)
                                (m68k_num_memory - i) * sizeof(struct 
mem_info));
                        continue;
                }
-               addr = m68k_memory[i].addr + m68k_memory[i].size;
+               addr = m68k_memory[i].addr + m68k_memory[i].size - 1;
                if (addr > max_addr)
                        max_addr = addr;
                i++;
        }
        m68k_memoffset = min_addr - PAGE_OFFSET;
-       m68k_virt_to_node_shift = fls(max_addr - min_addr - 1) - 6;
+       m68k_virt_to_node_shift = fls(max_addr - min_addr) - 6;
 
        module_fixup(NULL, __start_fixup, __stop_fixup);
        flush_icache();
 
-       high_memory = phys_to_virt(max_addr);
+       high_memory = phys_to_virt(max_addr) + 1;
 
        min_low_pfn = availmem >> PAGE_SHIFT;
-       max_low_pfn = max_addr >> PAGE_SHIFT;
+       max_low_pfn = (max_addr >> PAGE_SHIFT) + 1;
 
        for (i = 0; i < m68k_num_memory; i++) {
-               addr = m68k_memory[i].addr;
-               end = addr + m68k_memory[i].size;
+               addr = m68k_memory[i].addr >> PAGE_SHIFT;
+               end = addr + (m68k_memory[i].size >> PAGE_SHIFT);
                m68k_setup_node(i);
                availmem = PAGE_ALIGN(availmem);
                availmem += init_bootmem_node(NODE_DATA(i),
                                              availmem >> PAGE_SHIFT,
-                                             addr >> PAGE_SHIFT,
-                                             end >> PAGE_SHIFT);
+                                             addr, end);
        }
 
        /*
-
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to