Re: Kernels > 2.6.16 no longer work on HP9000/300

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Video for Linux]     [Yosemite News]     [Linux S/390]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux