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");

Reply via email to