Module Name: src Committed By: msaitoh Date: Sun Apr 19 06:11:17 UTC 2015
Modified Files: src/sys/arch/sparc/include [netbsd-5]: openfirm.h src/sys/arch/sparc/stand/ofwboot [netbsd-5]: Locore.c loadfile_machdep.c openfirm.h Log Message: Pullup another commit for ticket #1958 requested by martin: sys/arch/sparc/include/openfirm.h 1.7 sys/arch/sparc/stand/ofwboot/Locore.c 1.11 sys/arch/sparc/stand/ofwboot/loadfile_machdep.c 1.7 sys/arch/sparc/stand/ofwboot/openfirm.h 1.4 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.6.82.1 src/sys/arch/sparc/include/openfirm.h cvs rdiff -u -r1.10.30.1 -r1.10.30.2 \ src/sys/arch/sparc/stand/ofwboot/Locore.c cvs rdiff -u -r1.6 -r1.6.4.1 \ src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c cvs rdiff -u -r1.3 -r1.3.72.1 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.6.82.1 --- src/sys/arch/sparc/include/openfirm.h:1.6 Sat Mar 4 02:56:21 2006 +++ src/sys/arch/sparc/include/openfirm.h Sun Apr 19 06:11:17 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: openfirm.h,v 1.6 2006/03/04 02:56:21 uwe Exp $ */ +/* $NetBSD: openfirm.h,v 1.6.82.1 2015/04/19 06:11:17 msaitoh Exp $ */ /* * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -49,6 +49,9 @@ typedef uint64_t cell_t; #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.30.1 src/sys/arch/sparc/stand/ofwboot/Locore.c:1.10.30.2 --- src/sys/arch/sparc/stand/ofwboot/Locore.c:1.10.30.1 Fri Apr 17 10:49:16 2015 +++ src/sys/arch/sparc/stand/ofwboot/Locore.c Sun Apr 19 06:11:17 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: Locore.c,v 1.10.30.1 2015/04/17 10:49:16 msaitoh Exp $ */ +/* $NetBSD: Locore.c,v 1.10.30.2 2015/04/19 06:11:17 msaitoh 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 @@ OF_claim_virt(vaddr_t vaddr, int len) 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 @@ OF_alloc_virt(int len, int align) 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 @@ OF_map_phys(paddr_t paddr, off_t size, v 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 @@ OF_map_phys(paddr_t paddr, off_t size, v paddr_t OF_alloc_phys(int len, int align) { - paddr_t paddr; struct { cell_t name; cell_t nargs; @@ -647,10 +637,9 @@ OF_alloc_phys(int len, int align) 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 @@ OF_alloc_phys(int len, int align) paddr_t OF_claim_phys(paddr_t phys, int len) { - paddr_t paddr; struct { cell_t name; cell_t nargs; @@ -691,12 +679,11 @@ OF_claim_phys(paddr_t phys, int len) 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 @@ OF_free_phys(paddr_t phys, int len) 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 @@ OF_claim(void *virt, u_int size, u_int a 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.6.4.1 --- 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 Sun Apr 19 06:11:17 2015 @@ -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.6.4.1 2015/04/19 06:11:17 msaitoh Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. @@ -181,22 +181,22 @@ tlb_init(void) 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 @@ tlb_init(void) 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 @@ mmu_mapin(vaddr_t rva, vsize_t len) 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 @@ mmu_mapin(vaddr_t rva, vsize_t len) 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 @@ mmu_mapin(vaddr_t rva, vsize_t len) 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 @@ mmu_mapin(vaddr_t rva, vsize_t len) 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.3.72.1 --- 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 Sun Apr 19 06:11:17 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: openfirm.h,v 1.3 2006/07/13 20:03:34 uwe Exp $ */ +/* $NetBSD: openfirm.h,v 1.3.72.1 2015/04/19 06:11:17 msaitoh Exp $ */ /* * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -61,5 +61,12 @@ int OF_milliseconds(void); 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);