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