Module Name: src Committed By: nakayama Date: Mon May 18 12:15:26 UTC 2009
Modified Files: src/sys/arch/sparc64/include: sparc64.h src/sys/arch/sparc64/sparc64: ofw_machdep.c Log Message: Using OpenFirmware calls properly about 64-bit physical address handling. Old code trancate a physical address to 32-bit width. Idea from OpenBSD. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/arch/sparc64/include/sparc64.h cvs rdiff -u -r1.34 -r1.35 src/sys/arch/sparc64/sparc64/ofw_machdep.c 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/sparc64/include/sparc64.h diff -u src/sys/arch/sparc64/include/sparc64.h:1.9 src/sys/arch/sparc64/include/sparc64.h:1.10 --- src/sys/arch/sparc64/include/sparc64.h:1.9 Sat Feb 11 17:57:31 2006 +++ src/sys/arch/sparc64/include/sparc64.h Mon May 18 12:15:26 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sparc64.h,v 1.9 2006/02/11 17:57:31 cdi Exp $ */ +/* $NetBSD: sparc64.h,v 1.10 2009/05/18 12:15:26 nakayama Exp $ */ /* * Copyright (C) 1996 Wolfgang Solfrank. @@ -38,17 +38,17 @@ uint64_t size; }; -int prom_set_trap_table (vaddr_t); -uint64_t prom_vtop (vaddr_t); -vaddr_t prom_claim_virt (vaddr_t, int); -vaddr_t prom_alloc_virt (int, int); -int prom_free_virt (vaddr_t, int); -int prom_unmap_virt (vaddr_t, int); -int prom_map_phys (uint64_t, off_t, vaddr_t, int); -uint64_t prom_alloc_phys (int , int); -uint64_t prom_claim_phys (paddr_t, int); -int prom_free_phys (paddr_t, int); -uint64_t prom_get_msgbuf (int, int); +int prom_set_trap_table(vaddr_t); +paddr_t prom_vtop(vaddr_t); +vaddr_t prom_claim_virt(vaddr_t, int); +vaddr_t prom_alloc_virt(int, int); +int prom_free_virt(vaddr_t, int); +int prom_unmap_virt(vaddr_t, int); +int prom_map_phys(paddr_t, off_t, vaddr_t, int); +paddr_t prom_alloc_phys(int , int); +paddr_t prom_claim_phys(paddr_t, int); +int prom_free_phys(paddr_t, int); +paddr_t prom_get_msgbuf(int, int); void prom_stopself(void); void prom_startcpu(u_int, void *, u_long); Index: src/sys/arch/sparc64/sparc64/ofw_machdep.c diff -u src/sys/arch/sparc64/sparc64/ofw_machdep.c:1.34 src/sys/arch/sparc64/sparc64/ofw_machdep.c:1.35 --- src/sys/arch/sparc64/sparc64/ofw_machdep.c:1.34 Wed Mar 18 10:22:37 2009 +++ src/sys/arch/sparc64/sparc64/ofw_machdep.c Mon May 18 12:15:26 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: ofw_machdep.c,v 1.34 2009/03/18 10:22:37 cegger Exp $ */ +/* $NetBSD: ofw_machdep.c,v 1.35 2009/05/18 12:15:26 nakayama Exp $ */ /* * Copyright (C) 1996 Wolfgang Solfrank. @@ -34,7 +34,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ofw_machdep.c,v 1.34 2009/03/18 10:22:37 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ofw_machdep.c,v 1.35 2009/05/18 12:15:26 nakayama Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -89,7 +89,7 @@ u_int chosen; if ((chosen = OF_finddevice("/chosen")) == -1) { - prom_printf("get_mmu_handle: cannot get /chosen\r\n"); + prom_printf("get_memory_handle: cannot get /chosen\r\n"); return -1; } if (OF_getprop(chosen, "memory", &memh, sizeof(memh)) == -1) { @@ -152,7 +152,7 @@ args.method = ADR2CELL(&"translate"); args.ihandle = HDL2CELL(mmuh); args.vaddr = ADR2CELL(vaddr); - if(openfirmware(&args) == -1) + if (openfirmware(&args) == -1) return -1; #if 0 prom_printf("Called \"translate\", mmuh=%x, vaddr=%x, status=%x %x,\r\n retaddr=%x %x, mode=%x %x, phys_hi=%x %x, phys_lo=%x %x\r\n", @@ -160,7 +160,7 @@ (int)(args.mode>>32), (int)args.mode, (int)(args.phys_hi>>32), (int)args.phys_hi, (int)(args.phys_lo>>32), (int)args.phys_lo); #endif - return (paddr_t)((((paddr_t)args.phys_hi)<<32)|(uint32_t)args.phys_lo); + return (paddr_t)CELL2HDQ(args.phys_hi, args.phys_lo); } /* @@ -198,7 +198,7 @@ args.vaddr = ADR2CELL(vaddr); if (openfirmware(&args) == -1) return -1; - return (paddr_t)args.retaddr; + return (vaddr_t)args.retaddr; } /* @@ -209,7 +209,6 @@ vaddr_t prom_alloc_virt(int len, int align) { - static int retaddr; struct { cell_t name; cell_t nargs; @@ -233,10 +232,9 @@ args.ihandle = HDL2CELL(mmuh); args.align = align; args.len = len; - args.retaddr = ADR2CELL(&retaddr); if (openfirmware(&args) != 0) return -1; - return retaddr; /* Kluge till we go 64-bit */ + return (vaddr_t)args.retaddr; } /* @@ -339,14 +337,14 @@ args.mode = mode; args.size = size; args.vaddr = ADR2CELL(vaddr); - args.phys_hi = HDL2CELL(paddr>>32); - args.phys_lo = HDL2CELL(paddr); + args.phys_hi = HDQ2CELL_HI(paddr); + args.phys_lo = HDQ2CELL_LO(paddr); if (openfirmware(&args) == -1) return -1; if (args.status) return -1; - return args.retaddr; + return (int)args.retaddr; } @@ -384,7 +382,7 @@ args.len = len; if (openfirmware(&args) != 0) return -1; - return (paddr_t)((((paddr_t)args.phys_hi)<<32)|(uint32_t)args.phys_lo); + return (paddr_t)CELL2HDQ(args.phys_hi, args.phys_lo); } /* @@ -421,11 +419,11 @@ args.ihandle = HDL2CELL(memh); args.align = 0; 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); if (openfirmware(&args) != 0) return -1; - return (paddr_t)((((paddr_t)args.rphys_hi)<<32)|(uint32_t)args.rphys_lo); + return (paddr_t)CELL2HDQ(args.rphys_hi, args.rphys_lo); } /* @@ -457,8 +455,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); } @@ -517,8 +515,7 @@ args.align = align; args.status = -1; if (openfirmware(&args) == 0 && args.status == 0) { - return (((paddr_t)args.phys_hi<<32)| - (uint32_t)args.phys_lo); + return (paddr_t)CELL2HDQ(args.phys_hi, args.phys_lo); } else prom_printf("prom_get_msgbuf: SUNW,retain failed\r\n"); } else prom_printf("prom_get_msgbuf: test-method failed\r\n"); } else prom_printf("prom_get_msgbuf: test failed\r\n");