Hi, On Sun, 18 Feb 2007, Kars de Jong wrote:
ABCGHIJK Linux version 2.6.20-m68k-hp300 (turrican@kars) (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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html