Module Name: src
Committed By: nakayama
Date: Mon May 18 11:39:30 UTC 2009
Modified Files:
src/sys/arch/sparc/include: openfirm.h
src/sys/arch/sparc/stand/ofwboot: Locore.c loadfile_machdep.c
openfirm.h
Log Message:
Make ofwboot can handle over 4GB physical memory by using OpenFirmware
calls properly, and some cosmetic changes. Idea from OpenBSD.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/sparc/include/openfirm.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/sparc/stand/ofwboot/Locore.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/sparc/stand/ofwboot/openfirm.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc/include/openfirm.h
diff -u src/sys/arch/sparc/include/openfirm.h:1.6 src/sys/arch/sparc/include/openfirm.h:1.7
--- src/sys/arch/sparc/include/openfirm.h:1.6 Sat Mar 4 02:56:21 2006
+++ src/sys/arch/sparc/include/openfirm.h Mon May 18 11:39:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: openfirm.h,v 1.6 2006/03/04 02:56:21 uwe Exp $ */
+/* $NetBSD: openfirm.h,v 1.7 2009/05/18 11:39:30 nakayama Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -49,6 +49,9 @@
#define HDL2CELL(x) (cell_t)(u_int)(int)(x)
#define ADR2CELL(x) (cell_t)(u_int)(int)(x)
#endif
+#define HDQ2CELL_HI(x) (cell_t)(0)
+#define HDQ2CELL_LO(x) (cell_t)(x)
+#define CELL2HDQ(hi,lo) (lo)
#else /* SUN4U */
/* All cells are 4 byte slots */
typedef uint32_t cell_t;
Index: src/sys/arch/sparc/stand/ofwboot/Locore.c
diff -u src/sys/arch/sparc/stand/ofwboot/Locore.c:1.10 src/sys/arch/sparc/stand/ofwboot/Locore.c:1.11
--- src/sys/arch/sparc/stand/ofwboot/Locore.c:1.10 Wed Oct 17 19:57:16 2007
+++ src/sys/arch/sparc/stand/ofwboot/Locore.c Mon May 18 11:39:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: Locore.c,v 1.10 2007/10/17 19:57:16 garbled Exp $ */
+/* $NetBSD: Locore.c,v 1.11 2009/05/18 11:39:30 nakayama Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -36,15 +36,6 @@
#include <machine/cpu.h>
-vaddr_t OF_claim_virt(vaddr_t, int);
-vaddr_t OF_alloc_virt(int, int);
-int OF_free_virt(vaddr_t, int);
-int OF_unmap_virt(vaddr_t, int);
-vaddr_t OF_map_phys(paddr_t, off_t, vaddr_t, int);
-paddr_t OF_alloc_phys(int, int);
-paddr_t OF_claim_phys(paddr_t, int);
-int OF_free_phys(paddr_t, int);
-
extern int openfirmware(void *);
@@ -450,9 +441,9 @@
args.align = 0;
args.len = len;
args.vaddr = ADR2CELL(vaddr);
- if(openfirmware(&args) != 0)
+ if (openfirmware(&args) != 0)
return -1LL;
- return args.retaddr; /* Kluge till we go 64-bit */
+ return (vaddr_t)args.retaddr;
}
/*
@@ -486,13 +477,13 @@
args.nargs = 4;
args.nreturns = 2;
args.method = ADR2CELL("claim");
- args.ihandle = mmuh;
+ args.ihandle = HDL2CELL(mmuh);
args.align = align;
args.len = len;
args.retaddr = ADR2CELL(&retaddr);
- if(openfirmware(&args) != 0)
+ if (openfirmware(&args) != 0)
return -1LL;
- return (vaddr_t)args.retaddr; /* Kluge till we go 64-bit */
+ return (vaddr_t)args.retaddr;
}
/*
@@ -601,8 +592,8 @@
args.mode = mode;
args.size = size;
args.vaddr = ADR2CELL(vaddr);
- args.paddr_hi = ADR2CELL(paddr>>32);
- args.paddr_lo = ADR2CELL(paddr);
+ args.paddr_hi = HDQ2CELL_HI(paddr);
+ args.paddr_lo = HDQ2CELL_LO(paddr);
if (openfirmware(&args) == -1)
return -1;
@@ -620,7 +611,6 @@
paddr_t
OF_alloc_phys(int len, int align)
{
- paddr_t paddr;
struct {
cell_t name;
cell_t nargs;
@@ -647,10 +637,9 @@
args.ihandle = HDL2CELL(memh);
args.align = align;
args.len = len;
- if(openfirmware(&args) != 0)
+ if (openfirmware(&args) != 0)
return -1LL;
- paddr = (paddr_t)(args.phys_hi<<32)|((unsigned int)(args.phys_lo));
- return paddr; /* Kluge till we go 64-bit */
+ return (paddr_t)CELL2HDQ(args.phys_hi, args.phys_lo);
}
/*
@@ -661,7 +650,6 @@
paddr_t
OF_claim_phys(paddr_t phys, int len)
{
- paddr_t paddr;
struct {
cell_t name;
cell_t nargs;
@@ -691,12 +679,11 @@
args.ihandle = HDL2CELL(memh);
args.align = 0;
args.len = len;
- args.phys_hi = HDL2CELL(phys>>32);
- args.phys_lo = HDL2CELL(phys);
- if(openfirmware(&args) != 0)
+ args.phys_hi = HDQ2CELL_HI(phys);
+ args.phys_lo = HDQ2CELL_LO(phys);
+ if (openfirmware(&args) != 0)
return 0LL;
- paddr = (paddr_t)(args.rphys_hi<<32)|((unsigned int)(args.rphys_lo));
- return paddr;
+ return (paddr_t)CELL2HDQ(args.rphys_hi, args.rphys_lo);
}
/*
@@ -730,8 +717,8 @@
args.method = ADR2CELL("release");
args.ihandle = HDL2CELL(memh);
args.len = len;
- args.phys_hi = HDL2CELL(phys>>32);
- args.phys_lo = HDL2CELL(phys);
+ args.phys_hi = HDQ2CELL_HI(phys);
+ args.phys_lo = HDQ2CELL_LO(phys);
return openfirmware(&args);
}
@@ -786,7 +773,7 @@
return (void *)-1;
}
}
- if ((paddr = OF_alloc_phys(size, align)) == -1) {
+ if ((paddr = OF_alloc_phys(size, align)) == (paddr_t)-1) {
printf("OF_alloc_phys(%d,%d) failed\n", size, align);
OF_free_virt((vaddr_t)virt, size);
return (void *)-1;
Index: src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c
diff -u src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c:1.6 src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c:1.7
--- src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c:1.6 Mon Aug 25 22:31:12 2008
+++ src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c Mon May 18 11:39:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: loadfile_machdep.c,v 1.6 2008/08/25 22:31:12 martin Exp $ */
+/* $NetBSD: loadfile_machdep.c,v 1.7 2009/05/18 11:39:30 nakayama Exp $ */
/*-
* Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -181,22 +181,22 @@
if (_prom_getprop(child, "upa-portid", &cpu,
sizeof(cpu)) == -1 && _prom_getprop(child, "portid",
&cpu, sizeof(cpu)) == -1)
- panic("main: prom_getprop");
+ panic("tlb_init: prom_getprop");
if (cpu == bootcpu)
break;
}
}
if (cpu != bootcpu)
- panic("init_tlb: no node for bootcpu?!?!");
+ panic("tlb_init: no node for bootcpu?!?!");
if (_prom_getprop(child, "#dtlb-entries", &dtlb_slot_max,
sizeof(dtlb_slot_max)) == -1 ||
_prom_getprop(child, "#itlb-entries", &itlb_slot_max,
sizeof(itlb_slot_max)) == -1)
- panic("init_tlb: prom_getprop");
+ panic("tlb_init: prom_getprop");
dtlb_store = alloc(dtlb_slot_max * sizeof(*dtlb_store));
itlb_store = alloc(itlb_slot_max * sizeof(*itlb_store));
if (dtlb_store == NULL || itlb_store == NULL) {
- panic("init_tlb: malloc");
+ panic("tlb_init: malloc");
}
dtlb_slot = itlb_slot = 0;
@@ -208,14 +208,15 @@
static int
mmu_mapin(vaddr_t rva, vsize_t len)
{
- int64_t data;
- vaddr_t va, pa, mva;
+ uint64_t data;
+ paddr_t pa;
+ vaddr_t va, mva;
len = roundup2(len + (rva & PAGE_MASK_4M), PAGE_SIZE_4M);
rva &= ~PAGE_MASK_4M;
tlb_init();
- for (pa = (vaddr_t)-1; len > 0; rva = va) {
+ for (pa = (paddr_t)-1; len > 0; rva = va) {
if ( (len = kvamap_extract(rva, len, &va)) == 0) {
/* The rest is already mapped */
break;
@@ -224,13 +225,11 @@
if (dtlb_va_to_pa(va) == (u_long)-1 ||
itlb_va_to_pa(va) == (u_long)-1) {
/* Allocate a physical page, claim the virtual area */
- if (pa == (vaddr_t)-1) {
- pa = (vaddr_t)OF_alloc_phys(PAGE_SIZE_4M,
- PAGE_SIZE_4M);
- if (pa == (vaddr_t)-1)
+ if (pa == (paddr_t)-1) {
+ pa = OF_alloc_phys(PAGE_SIZE_4M, PAGE_SIZE_4M);
+ if (pa == (paddr_t)-1)
panic("out of memory");
- mva = (vaddr_t)OF_claim_virt(va,
- PAGE_SIZE_4M, 0);
+ mva = OF_claim_virt(va, PAGE_SIZE_4M);
if (mva != va) {
panic("can't claim virtual page "
"(wanted %#lx, got %#lx)",
@@ -249,7 +248,7 @@
if (itlb_slot >= itlb_slot_max)
panic("mmu_mapin: out of itlb_slots");
- DPRINTF(("mmu_mapin: %p:%p\n", va, pa));
+ DPRINTF(("mmu_mapin: %p:%p.%p\n", va, hi(pa), lo(pa)));
data = TSB_DATA(0, /* global */
PGSZ_4M, /* 4mb page */
@@ -267,7 +266,7 @@
dtlb_store[dtlb_slot].te_va = va;
dtlb_slot++;
dtlb_enter(va, hi(data), lo(data));
- pa = (vaddr_t)-1;
+ pa = (paddr_t)-1;
}
kvamap_enter(va, PAGE_SIZE_4M);
@@ -276,7 +275,7 @@
va += PAGE_SIZE_4M;
}
- if (pa != (vaddr_t)-1) {
+ if (pa != (paddr_t)-1) {
OF_free_phys(pa, PAGE_SIZE_4M);
}
Index: src/sys/arch/sparc/stand/ofwboot/openfirm.h
diff -u src/sys/arch/sparc/stand/ofwboot/openfirm.h:1.3 src/sys/arch/sparc/stand/ofwboot/openfirm.h:1.4
--- src/sys/arch/sparc/stand/ofwboot/openfirm.h:1.3 Thu Jul 13 20:03:34 2006
+++ src/sys/arch/sparc/stand/ofwboot/openfirm.h Mon May 18 11:39:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: openfirm.h,v 1.3 2006/07/13 20:03:34 uwe Exp $ */
+/* $NetBSD: openfirm.h,v 1.4 2009/05/18 11:39:30 nakayama Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -61,5 +61,12 @@
void OF_chain(void *, u_int, void (*)(), void *, u_int);
int OF_peer(int);
int OF_child(int);
+vaddr_t OF_claim_virt(vaddr_t, int);
+vaddr_t OF_alloc_virt(int, int);
+int OF_free_virt(vaddr_t, int);
+int OF_unmap_virt(vaddr_t, int);
+vaddr_t OF_map_phys(paddr_t, off_t, vaddr_t, int);
paddr_t OF_alloc_phys(int, int);
+paddr_t OF_claim_phys(paddr_t, int);
+int OF_free_phys(paddr_t, int);
void OF_initialize(void);