Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Mar 2010 04:07:50 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r205508 - in projects/ppc64/sys/powerpc: aim ofw
Message-ID:  <201003230407.o2N47oTH051538@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Tue Mar 23 04:07:49 2010
New Revision: 205508
URL: http://svn.freebsd.org/changeset/base/205508

Log:
  Now that OF command buffers are on the stack (so above 4 GB), we need to
  put them into the real mapping buffer too. As a side effect, this
  eliminates a hack for OF real mode in ofw_machdep.c.

Modified:
  projects/ppc64/sys/powerpc/aim/ofw_machdep.c
  projects/ppc64/sys/powerpc/ofw/ofw_real.c

Modified: projects/ppc64/sys/powerpc/aim/ofw_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/ofw_machdep.c	Tue Mar 23 03:22:16 2010	(r205507)
+++ projects/ppc64/sys/powerpc/aim/ofw_machdep.c	Tue Mar 23 04:07:49 2010	(r205508)
@@ -385,9 +385,6 @@ openfirmware(void *args)
 	 */
 	oldmsr = intr_disable();
 
-	if (pmap_bootstrapped && ofw_real_mode)
-		args = (void *)pmap_kextract((vm_offset_t)args);
-
 	mtx_lock(&ofw_mutex);
 
 	ofw_sprg_prepare();

Modified: projects/ppc64/sys/powerpc/ofw/ofw_real.c
==============================================================================
--- projects/ppc64/sys/powerpc/ofw/ofw_real.c	Tue Mar 23 03:22:16 2010	(r205507)
+++ projects/ppc64/sys/powerpc/ofw/ofw_real.c	Tue Mar 23 04:07:49 2010	(r205508)
@@ -304,6 +304,7 @@ ofw_real_init(ofw_t ofw, void *openfirm)
 static int
 ofw_real_test(ofw_t ofw, const char *name)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -319,10 +320,12 @@ ofw_real_test(ofw_t ofw, const char *nam
 	ofw_real_start();
 
 	args.service = ofw_real_map(name, strlen(name) + 1);
-	if (args.service == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.service == 0 || openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_stop();
 	return (args.missing);
 }
@@ -335,6 +338,7 @@ ofw_real_test(ofw_t ofw, const char *nam
 static phandle_t
 ofw_real_peer(ofw_t ofw, phandle_t node)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -348,8 +352,14 @@ ofw_real_peer(ofw_t ofw, phandle_t node)
 	args.nreturns = 1;
 
 	args.node = node;
-	if (openfirmware(&args) == -1)
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (openfirmware((void *)argsptr) == -1) {
+		ofw_real_stop();
 		return (-1);
+	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
+	ofw_real_stop();
 	return (args.next);
 }
 
@@ -357,6 +367,7 @@ ofw_real_peer(ofw_t ofw, phandle_t node)
 static phandle_t
 ofw_real_child(ofw_t ofw, phandle_t node)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -370,8 +381,14 @@ ofw_real_child(ofw_t ofw, phandle_t node
 	args.nreturns = 1;
 
 	args.node = node;
-	if (openfirmware(&args) == -1)
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (openfirmware((void *)argsptr) == -1) {
+		ofw_real_stop();
 		return (-1);
+	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
+	ofw_real_stop();
 	return (args.child);
 }
 
@@ -379,6 +396,7 @@ ofw_real_child(ofw_t ofw, phandle_t node
 static phandle_t
 ofw_real_parent(ofw_t ofw, phandle_t node)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -392,8 +410,14 @@ ofw_real_parent(ofw_t ofw, phandle_t nod
 	args.nreturns = 1;
 
 	args.node = node;
-	if (openfirmware(&args) == -1)
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (openfirmware((void *)argsptr) == -1) {
+		ofw_real_stop();
 		return (-1);
+	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
+	ofw_real_stop();
 	return (args.parent);
 }
 
@@ -401,6 +425,7 @@ ofw_real_parent(ofw_t ofw, phandle_t nod
 static phandle_t
 ofw_real_instance_to_package(ofw_t ofw, ihandle_t instance)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -414,8 +439,14 @@ ofw_real_instance_to_package(ofw_t ofw, 
 	args.nreturns = 1;
 
 	args.instance = instance;
-	if (openfirmware(&args) == -1)
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (openfirmware((void *)argsptr) == -1) {
+		ofw_real_stop();
 		return (-1);
+	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
+	ofw_real_stop();
 	return (args.package);
 }
 
@@ -423,6 +454,7 @@ ofw_real_instance_to_package(ofw_t ofw, 
 static ssize_t
 ofw_real_getproplen(ofw_t ofw, phandle_t package, const char *propname)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -440,10 +472,12 @@ ofw_real_getproplen(ofw_t ofw, phandle_t
 
 	args.package = package;
 	args.propname = ofw_real_map(propname, strlen(propname) + 1);
-	if (args.propname == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.propname == 0 || openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_stop();
 	return (args.proplen);
 }
@@ -453,6 +487,7 @@ static ssize_t
 ofw_real_getprop(ofw_t ofw, phandle_t package, const char *propname, void *buf, 
     size_t buflen)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -474,10 +509,13 @@ ofw_real_getprop(ofw_t ofw, phandle_t pa
 	args.propname = ofw_real_map(propname, strlen(propname) + 1);
 	args.buf = ofw_real_map(buf, buflen);
 	args.buflen = buflen;
-	if (args.propname == 0 || args.buf == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.propname == 0 || args.buf == 0 ||
+	    openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_unmap(args.buf, buf, buflen);
 
 	ofw_real_stop();
@@ -489,6 +527,7 @@ static int
 ofw_real_nextprop(ofw_t ofw, phandle_t package, const char *previous, 
     char *buf, size_t size)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -508,10 +547,13 @@ ofw_real_nextprop(ofw_t ofw, phandle_t p
 	args.package = package;
 	args.previous = ofw_real_map(previous, strlen(previous) + 1);
 	args.buf = ofw_real_map(buf, size);
-	if (args.previous == 0 || args.buf == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.previous == 0 || args.buf == 0 ||
+	    openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_unmap(args.buf, buf, size);
 
 	ofw_real_stop();
@@ -524,6 +566,7 @@ static int
 ofw_real_setprop(ofw_t ofw, phandle_t package, const char *propname,
     const void *buf, size_t len)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -545,10 +588,13 @@ ofw_real_setprop(ofw_t ofw, phandle_t pa
 	args.propname = ofw_real_map(propname, strlen(propname) + 1);
 	args.buf = ofw_real_map(buf, len);
 	args.len = len;
-	if (args.propname == 0 || args.buf == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.propname == 0 || args.buf == 0 ||
+	    openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_stop();
 	return (args.size);
 }
@@ -557,6 +603,7 @@ ofw_real_setprop(ofw_t ofw, phandle_t pa
 static ssize_t
 ofw_real_canon(ofw_t ofw, const char *device, char *buf, size_t len)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -576,10 +623,13 @@ ofw_real_canon(ofw_t ofw, const char *de
 	args.device = ofw_real_map(device, strlen(device) + 1);
 	args.buf = ofw_real_map(buf, len);
 	args.len = len;
-	if (args.device == 0 || args.buf == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.device == 0 || args.buf == 0 ||
+	    openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_unmap(args.buf, buf, len);
 
 	ofw_real_stop();
@@ -590,6 +640,7 @@ ofw_real_canon(ofw_t ofw, const char *de
 static phandle_t
 ofw_real_finddevice(ofw_t ofw, const char *device)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -605,10 +656,13 @@ ofw_real_finddevice(ofw_t ofw, const cha
 	ofw_real_start();
 
 	args.device = ofw_real_map(device, strlen(device) + 1);
-	if (args.device == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.device == 0 ||
+	    openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_stop();
 	return (args.package);
 }
@@ -617,6 +671,7 @@ ofw_real_finddevice(ofw_t ofw, const cha
 static ssize_t
 ofw_real_instance_to_path(ofw_t ofw, ihandle_t instance, char *buf, size_t len)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -636,10 +691,13 @@ ofw_real_instance_to_path(ofw_t ofw, iha
 	args.instance = instance;
 	args.buf = ofw_real_map(buf, len);
 	args.len = len;
-	if (args.buf == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.buf == 0 ||
+	    openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_unmap(args.buf, buf, len);
 
 	ofw_real_stop();
@@ -650,6 +708,7 @@ ofw_real_instance_to_path(ofw_t ofw, iha
 static ssize_t
 ofw_real_package_to_path(ofw_t ofw, phandle_t package, char *buf, size_t len)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -669,10 +728,13 @@ ofw_real_package_to_path(ofw_t ofw, phan
 	args.package = package;
 	args.buf = ofw_real_map(buf, len);
 	args.len = len;
-	if (args.buf == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.buf == 0 ||
+	    openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_unmap(args.buf, buf, len);
 
 	ofw_real_stop();
@@ -684,6 +746,7 @@ static int
 ofw_real_call_method(ofw_t ofw, ihandle_t instance, const char *method, 
     int nargs, int nreturns, cell_t *args_and_returns)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -711,10 +774,13 @@ ofw_real_call_method(ofw_t ofw, ihandle_
 	ap = args_and_returns;
 	for (cp = args.args_n_results + (n = nargs); --n >= 0;)
 		*--cp = *(ap++);
-	if (args.method == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.method == 0 ||
+	    openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_stop();
 	if (args.args_n_results[nargs])
 		return (args.args_n_results[nargs]);
@@ -727,6 +793,7 @@ static int
 ofw_real_interpret(ofw_t ofw, const char *cmd, int nreturns,
     unsigned long *returns)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -742,14 +809,16 @@ ofw_real_interpret(ofw_t ofw, const char
 	ofw_real_start();
 	args.nreturns = ++nreturns;
 	args.slot[i++] = ofw_real_map(cmd, strlen(cmd) + 1);
-	if (openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
+	ofw_real_stop();
 	status = args.slot[i++];
 	while (i < 1 + nreturns)
 		returns[j++] = args.slot[i++];
-	ofw_real_stop();
 	return (status);
 }
 
@@ -761,6 +830,7 @@ ofw_real_interpret(ofw_t ofw, const char
 static ihandle_t
 ofw_real_open(ofw_t ofw, const char *device)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -776,11 +846,13 @@ ofw_real_open(ofw_t ofw, const char *dev
 	ofw_real_start();
 
 	args.device = ofw_real_map(device, strlen(device) + 1);
-	if (args.device == 0 || openfirmware(&args) == -1 
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.device == 0 || openfirmware((void *)argsptr) == -1 
 	    || args.instance == 0) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_stop();
 	return (args.instance);
 }
@@ -789,6 +861,7 @@ ofw_real_open(ofw_t ofw, const char *dev
 static void
 ofw_real_close(ofw_t ofw, ihandle_t instance)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -800,13 +873,17 @@ ofw_real_close(ofw_t ofw, ihandle_t inst
 	args.nargs = 1;
 
 	args.instance = instance;
-	openfirmware(&args);
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	openfirmware((void *)argsptr);
+	ofw_real_stop();
 }
 
 /* Read from an instance. */
 static ssize_t
 ofw_real_read(ofw_t ofw, ihandle_t instance, void *addr, size_t len)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -826,10 +903,12 @@ ofw_real_read(ofw_t ofw, ihandle_t insta
 	args.instance = instance;
 	args.addr = ofw_real_map(addr, len);
 	args.len = len;
-	if (args.addr == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.addr == 0 || openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_unmap(args.addr, addr, len);
 
 	ofw_real_stop();
@@ -840,6 +919,7 @@ ofw_real_read(ofw_t ofw, ihandle_t insta
 static ssize_t
 ofw_real_write(ofw_t ofw, ihandle_t instance, const void *addr, size_t len)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -859,10 +939,12 @@ ofw_real_write(ofw_t ofw, ihandle_t inst
 	args.instance = instance;
 	args.addr = ofw_real_map(addr, len);
 	args.len = len;
-	if (args.addr == 0 || openfirmware(&args) == -1) {
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (args.addr == 0 || openfirmware((void *)argsptr) == -1) {
 		ofw_real_stop();
 		return (-1);
 	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
 	ofw_real_stop();
 	return (args.actual);
 }
@@ -871,6 +953,7 @@ ofw_real_write(ofw_t ofw, ihandle_t inst
 static int
 ofw_real_seek(ofw_t ofw, ihandle_t instance, u_int64_t pos)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -888,8 +971,14 @@ ofw_real_seek(ofw_t ofw, ihandle_t insta
 	args.instance = instance;
 	args.poshi = pos >> 32;
 	args.poslo = pos;
-	if (openfirmware(&args) == -1)
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (openfirmware((void *)argsptr) == -1) {
+		ofw_real_stop();
 		return (-1);
+	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
+	ofw_real_stop();
 	return (args.status);
 }
 
@@ -901,6 +990,7 @@ ofw_real_seek(ofw_t ofw, ihandle_t insta
 static caddr_t
 ofw_real_claim(ofw_t ofw, void *virt, size_t size, u_int align)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -918,8 +1008,14 @@ ofw_real_claim(ofw_t ofw, void *virt, si
 	args.virt = (cell_t)(uintptr_t)virt;
 	args.size = size;
 	args.align = align;
-	if (openfirmware(&args) == -1)
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	if (openfirmware((void *)argsptr) == -1) {
+		ofw_real_stop();
 		return ((void *)-1);
+	}
+	ofw_real_unmap(argsptr, &args, sizeof(args));
+	ofw_real_stop();
 	return ((void *)(uintptr_t)args.baseaddr);
 }
 
@@ -927,6 +1023,7 @@ ofw_real_claim(ofw_t ofw, void *virt, si
 static void
 ofw_real_release(ofw_t ofw, void *virt, size_t size)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -940,7 +1037,10 @@ ofw_real_release(ofw_t ofw, void *virt, 
 
 	args.virt = (cell_t)(uintptr_t)virt;
 	args.size = size;
-	openfirmware(&args);
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	openfirmware((void *)argsptr);
+	ofw_real_stop();
 }
 
 /*
@@ -951,6 +1051,7 @@ ofw_real_release(ofw_t ofw, void *virt, 
 static void
 ofw_real_enter(ofw_t ofw)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -959,14 +1060,18 @@ ofw_real_enter(ofw_t ofw)
 
 	args.name = (cell_t)(uintptr_t)"enter";
 
-	openfirmware(&args);
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	openfirmware((void *)argsptr);
 	/* We may come back. */
+	ofw_real_stop();
 }
 
 /* Shut down and drop back to the Open Firmware interface. */
 static void
 ofw_real_exit(ofw_t ofw)
 {
+	vm_offset_t argsptr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -975,8 +1080,11 @@ ofw_real_exit(ofw_t ofw)
 
 	args.name = (cell_t)(uintptr_t)"exit";
 
-	openfirmware(&args);
+	ofw_real_start();
+	argsptr = ofw_real_map(&args, sizeof(args));
+	openfirmware((void *)argsptr);
 	for (;;)			/* just in case */
 		;
+	ofw_real_stop();
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003230407.o2N47oTH051538>