PERFORCE change 152962 for review

Nathan Whitehorn nwhitehorn at FreeBSD.org
Thu Nov 13 20:57:25 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=152962

Change 152962 by nwhitehorn at nwhitehorn_trantor on 2008/11/14 04:57:24

	Provide a pluggable OFW client interface mechanism using KOBJ, like
	the PowerPC PMAP layer. This (temporarily) destroys the previously
	added ability to use real mode Open Firmware on PowerPC, but
	accomplishes the following:
	
	1. Allow implementing a better, less hackish real mode firmware 
	   interface.
	2. Provide support for more complicated hacks we will need later. As
	   an example, PPC64 systems still have 32-bit firmware, so all
	   data will have have to be copied to bounce pages before we make
	   firmware calls.
	3. This should also make implementing support for Flattened Device
	   Trees trivial, and support has been added to PPC locore and
	   ofw_machdep to facilitate this.
	
	This breaks sparc64 for the time being, as a few changes are needed
	to the OF initialization mechanisms.

Affected files ...

.. //depot/projects/ppc-g5/sys/conf/files.powerpc#9 edit
.. //depot/projects/ppc-g5/sys/dev/ofw/ofw_if.m#1 add
.. //depot/projects/ppc-g5/sys/dev/ofw/ofw_standard.c#1 add
.. //depot/projects/ppc-g5/sys/dev/ofw/ofwvar.h#1 add
.. //depot/projects/ppc-g5/sys/dev/ofw/openfirm.c#3 edit
.. //depot/projects/ppc-g5/sys/dev/ofw/openfirm.h#3 edit
.. //depot/projects/ppc-g5/sys/dev/ofw/openfirmio.c#2 edit
.. //depot/projects/ppc-g5/sys/powerpc/aim/locore.S#3 edit
.. //depot/projects/ppc-g5/sys/powerpc/aim/machdep.c#6 edit
.. //depot/projects/ppc-g5/sys/powerpc/aim/ofw_machdep.c#6 edit
.. //depot/projects/ppc-g5/sys/powerpc/include/ofw_machdep.h#2 edit

Differences ...

==== //depot/projects/ppc-g5/sys/conf/files.powerpc#9 (text+ko) ====

@@ -40,10 +40,12 @@
 dev/ofw/openfirm.c		optional	aim
 dev/ofw/openfirmio.c		optional	aim
 dev/ofw/ofw_bus_if.m		optional	aim
+dev/ofw/ofw_if.m		optional	aim
 dev/ofw/ofw_bus_subr.c		optional	aim
 dev/ofw/ofw_console.c		optional	aim
 dev/ofw/ofw_disk.c		optional	ofwd aim
 dev/ofw/ofw_imap.c		optional	aim
+dev/ofw/ofw_standard.c		optional	aim
 dev/powermac_nvram/powermac_nvram.c optional	powermac_nvram powermac
 dev/quicc/quicc_bfe_ocp.c	optional	quicc mpc85xx
 dev/scc/scc_bfe_macio.c		optional	scc powermac

==== //depot/projects/ppc-g5/sys/dev/ofw/openfirm.c#3 (text+ko) ====

@@ -66,23 +66,70 @@
 #include <machine/stdarg.h>
 
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofwvar.h>
+
+#include "ofw_if.h"
 
 MALLOC_DEFINE(M_OFWPROP, "openfirm", "Open Firmware properties");
 
 static ihandle_t stdout;
 
+static ofw_def_t	*ofw_def_impl;
+static ofw_t		ofw_obj;
+static struct ofw_kobj	ofw_kernel_obj;
+static struct kobj_ops	ofw_kernel_kops;
+
+/*
+ * OFW install routines. Highest priority wins, equal priority also
+ * overrides allowing last-set to win.
+ */
+SET_DECLARE(ofw_set, ofw_def_t);
+
+boolean_t
+OF_install(char *name, int prio)
+{
+	ofw_def_t	**ofwpp, *ofwp;
+	static int	curr_prio = 0;
+
+	/*
+	* Try and locate the OFW kobj corresponding to the name
+	*/
+	SET_FOREACH(ofwpp, ofw_set) {
+		ofwp = *ofwpp;
+
+		if (ofwp->name &&
+		    !strcmp(ofwp->name, name) &&
+		    prio >= curr_prio) {
+			curr_prio = prio;
+			ofw_def_impl = ofwp;
+			return (TRUE);
+		}
+	}
+
+	return (FALSE);
+}
+
 /* Initialiser */
 
 void
-OF_init(int (*openfirm)(void *))
+OF_init(void *cookie)
 {
 	phandle_t chosen;
 
-	set_openfirm_callback(openfirm);
+	ofw_obj = &ofw_kernel_obj;
+	/*
+	 * Take care of compiling the selected class, and
+	 * then statically initialise the OFW object
+	 */
+	kobj_class_compile_static(ofw_def_impl, &ofw_kernel_kops);
+	kobj_init((kobj_t)ofw_obj, ofw_def_impl);
+
+	OFW_INIT(ofw_obj, cookie);
+
 	if ((chosen = OF_finddevice("/chosen")) == -1)
 		OF_exit();
 	if (OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) == -1)
-		OF_exit();
+		stdout = -1;
 }
 
 void
@@ -103,77 +150,29 @@
 
 /* Test to see if a service exists. */
 int
-OF_test(char *name)
+OF_test(const char *name)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t service;
-		cell_t missing;
-	} args = {
-		(cell_t)"test",
-		1,
-		1,
-	};
-
-	args.service = openfirm_mapptr(name);
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.missing);
+	return (OFW_TEST(ofw_obj,name));
 }
 
 int
-OF_interpret(char *cmd, int nreturns, ...)
+OF_interpret(const char *cmd, int nreturns, ...)
 {
 	va_list ap;
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t slot[16];
-	} args = {
-		(cell_t)"interpret",
-		1,
-	};
-	cell_t status;
+	unsigned long slots[16];
 	int i = 0;
+	int status;
 
+	status = OFW_INTERPRET(ofw_obj,cmd,nreturns,slots);
+
 	va_start(ap, nreturns);
-	args.nreturns = ++nreturns;
-	args.slot[i++] = openfirm_mapptr(cmd);
-	while (i < 1)
-		args.slot[i++] = va_arg(ap, cell_t);
-	if (openfirmware(&args) == -1) {
-		va_end(ap);
-		return (-1);
-	}
-	status = args.slot[i++];
 	while (i < 1 + nreturns)
-		*va_arg(ap, cell_t *) = args.slot[i++];
+		*va_arg(ap, cell_t *) = slots[i++];
 	va_end(ap);
+
 	return (status);
 }
 
-/* Return firmware millisecond count. */
-int
-OF_milliseconds()
-{
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t ms;
-	} args = {
-		(cell_t)"milliseconds",
-		0,
-		1,
-	};
-
-	openfirmware(&args);
-	return (args.ms);
-}
-
 /*
  * Device tree functions
  */
@@ -182,140 +181,42 @@
 phandle_t
 OF_peer(phandle_t node)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t node;
-		cell_t next;
-	} args = {
-		(cell_t)"peer",
-		1,
-		1,
-	};
-
-	args.node = node;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.next);
+	return (OFW_PEER(ofw_obj,node));
 }
 
 /* Return the first child of this node or 0. */
 phandle_t
 OF_child(phandle_t node)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t node;
-		cell_t child;
-	} args = {
-		(cell_t)"child",
-		1,
-		1,
-	};
-
-	args.node = node;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.child);
+	return (OFW_CHILD(ofw_obj,node));
 }
 
 /* Return the parent of this node or 0. */
 phandle_t
 OF_parent(phandle_t node)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t node;
-		cell_t parent;
-	} args = {
-		(cell_t)"parent",
-		1,
-		1,
-	};
-
-	args.node = node;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.parent);
+	return (OFW_PARENT(ofw_obj,node));
 }
 
 /* Return the package handle that corresponds to an instance handle. */
 phandle_t
 OF_instance_to_package(ihandle_t instance)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t instance;
-		cell_t package;
-	} args = {
-		(cell_t)"instance-to-package",
-		1,
-		1,
-	};
-
-	args.instance = instance;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.package);
+	return (OFW_INSTANCE_TO_PACKAGE(ofw_obj,instance));
 }
 
 /* Get the length of a property of a package. */
-int
-OF_getproplen(phandle_t package, char *propname)
+ssize_t
+OF_getproplen(phandle_t package, const char *propname)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t package;
-		cell_t propname;
-		cell_t proplen;
-	} args = {
-		(cell_t)"getproplen",
-		2,
-		1,
-	};
-
-	args.package = package;
-	args.propname = openfirm_mapptr(propname);
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.proplen);
+	return (OFW_GETPROPLEN(ofw_obj,package,propname));
 }
 
 /* Get the value of a property of a package. */
-int
-OF_getprop(phandle_t package, char *propname, void *buf, int buflen)
+ssize_t
+OF_getprop(phandle_t package, const char *propname, void *buf, size_t buflen)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t package;
-		cell_t propname;
-		cell_t buf;
-		cell_t buflen;
-		cell_t size;
-	} args = {
-		(cell_t)"getprop",
-		4,
-		1,
-	};
-
-	args.package = package;
-	args.propname = openfirm_mapptr(propname);
-	args.buf = openfirm_mapptr(buf);
-	args.buflen = buflen;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.size);
+	return (OFW_GETPROP(ofw_obj,package,propname,buf,buflen));
 }
 
 /*
@@ -323,8 +224,8 @@
  * (using the M_OFWPROP malloc pool and M_WAITOK). elsz is the size of a
  * single element, the number of elements is return in number.
  */
-int
-OF_getprop_alloc(phandle_t package, char *propname, int elsz, void **buf)
+ssize_t
+OF_getprop_alloc(phandle_t package, const char *propname, int elsz, void **buf)
 {
 	int len;
 
@@ -344,194 +245,69 @@
 
 /* Get the next property of a package. */
 int
-OF_nextprop(phandle_t package, char *previous, char *buf)
+OF_nextprop(phandle_t package, const char *previous, char *buf, size_t size)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t package;
-		cell_t previous;
-		cell_t buf;
-		cell_t flag;
-	} args = {
-		(cell_t)"nextprop",
-		3,
-		1,
-	};
-
-	args.package = package;
-	args.previous = openfirm_mapptr(previous);
-	args.buf = openfirm_mapptr(buf);
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.flag);
+	return (OFW_NEXTPROP(ofw_obj,package,previous,buf,size));
 }
 
 /* Set the value of a property of a package. */
-/* XXX Has a bug on FirePower */
 int
-OF_setprop(phandle_t package, char *propname, void *buf, int len)
+OF_setprop(phandle_t package, const char *propname, const void *buf, size_t len)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t package;
-		cell_t propname;
-		cell_t buf;
-		cell_t len;
-		cell_t size;
-	} args = {
-		(cell_t)"setprop",
-		4,
-		1,
-	};
-
-	args.package = package;
-	args.propname = openfirm_mapptr(propname);
-	args.buf = openfirm_mapptr(buf);
-	args.len = len;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.size);
+	return (OFW_SETPROP(ofw_obj,package,propname,buf,len));
 }
 
 /* Convert a device specifier to a fully qualified pathname. */
-int
-OF_canon(const char *device, char *buf, int len)
+ssize_t
+OF_canon(const char *device, char *buf, size_t len)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t device;
-		cell_t buf;
-		cell_t len;
-		cell_t size;
-	} args = {
-		(cell_t)"canon",
-		3,
-		1,
-	};
-
-	args.device = openfirm_mapptr(device);
-	args.buf = openfirm_mapptr(buf);
-	args.len = len;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.size);
+	return (OFW_CANON(ofw_obj,device,buf,len));
 }
 
 /* Return a package handle for the specified device. */
 phandle_t
 OF_finddevice(const char *device)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t device;
-		cell_t package;
-	} args = {
-		(cell_t)"finddevice",
-		1,
-		1,
-	};
-
-	args.device = openfirm_mapptr(device);
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.package);
+	return (OFW_FINDDEVICE(ofw_obj,device));
 }
 
 /* Return the fully qualified pathname corresponding to an instance. */
-int
-OF_instance_to_path(ihandle_t instance, char *buf, int len)
+ssize_t
+OF_instance_to_path(ihandle_t instance, char *buf, size_t len)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t instance;
-		cell_t buf;
-		cell_t len;
-		cell_t size;
-	} args = {
-		(cell_t)"instance-to-path",
-		3,
-		1,
-	};
-
-	args.instance = instance;
-	args.buf = openfirm_mapptr(buf);
-	args.len = len;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.size);
+	return (OFW_INSTANCE_TO_PATH(ofw_obj,instance,buf,len));
 }
 
 /* Return the fully qualified pathname corresponding to a package. */
-int
-OF_package_to_path(phandle_t package, char *buf, int len)
+ssize_t
+OF_package_to_path(phandle_t package, char *buf, size_t len)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t package;
-		cell_t buf;
-		cell_t len;
-		cell_t size;
-	} args = {
-		(cell_t)"package-to-path",
-		3,
-		1,
-	};
-
-	args.package = package;
-	args.buf = openfirm_mapptr(buf);
-	args.len = len;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.size);
+	return (OFW_PACKAGE_TO_PATH(ofw_obj,package,buf,len));
 }
 
 /*  Call the method in the scope of a given instance. */
 int
-OF_call_method(char *method, ihandle_t instance, int nargs, int nreturns, ...)
+OF_call_method(const char *method, ihandle_t instance, int nargs, int nreturns,
+    ...)
 {
 	va_list ap;
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t method;
-		cell_t instance;
-		cell_t args_n_results[12];
-	} args = {
-		(cell_t)"call-method",
-		2,
-		1,
-	};
-	cell_t *cp;
-	int n;
+	unsigned long args_n_results[12];
+	int n, status;
 
 	if (nargs > 6)
 		return (-1);
-	args.nargs = nargs + 2;
-	args.nreturns = nreturns + 1;
-	args.method = openfirm_mapptr(method);
-	args.instance = instance;
 	va_start(ap, nreturns);
-	for (cp = args.args_n_results + (n = nargs); --n >= 0;)
-		*--cp = va_arg(ap, cell_t);
-	if (openfirmware(&args) == -1)
-		return (-1);
-	if (args.args_n_results[nargs])
-		return (args.args_n_results[nargs]);
-	for (cp = args.args_n_results + nargs + (n = args.nreturns); --n > 0;)
-		*va_arg(ap, cell_t *) = *--cp;
+	for (n = 0; n < nargs; n++)
+		args_n_results[n] = va_arg(ap, unsigned long);
+	
+	status = OFW_CALL_METHOD(ofw_obj, instance, method, nargs, nreturns, 
+	    args_n_results);
+
+	if (status != 0)
+		return (status);
+
+	for (; n < nargs + nreturns; n++)
+		*va_arg(ap, unsigned long *) = args_n_results[n];
 	va_end(ap);
 	return (0);
 }
@@ -542,122 +318,37 @@
 
 /* Open an instance for a device. */
 ihandle_t
-OF_open(char *device)
+OF_open(const char *device)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t device;
-		cell_t instance;
-	} args = {
-		(cell_t)"open",
-		1,
-		1,
-	};
-
-	args.device = openfirm_mapptr(device);
-	if (openfirmware(&args) == -1 || args.instance == 0) {
-		return (-1);
-	}
-	return (args.instance);
+	return (OFW_OPEN(ofw_obj, device));
 }
 
 /* Close an instance. */
 void
 OF_close(ihandle_t instance)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t instance;
-	} args = {
-		(cell_t)"close",
-		1,
-	};
-
-	args.instance = instance;
-	openfirmware(&args);
+	OFW_CLOSE(ofw_obj, instance);
 }
 
 /* Read from an instance. */
-int
-OF_read(ihandle_t instance, void *addr, int len)
+ssize_t
+OF_read(ihandle_t instance, void *addr, size_t len)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t instance;
-		cell_t addr;
-		cell_t len;
-		cell_t actual;
-	} args = {
-		(cell_t)"read",
-		3,
-		1,
-	};
-
-	args.instance = instance;
-	args.addr = openfirm_mapptr(addr);
-	args.len = len;
-	if (openfirmware(&args) == -1)
-		return (-1);
-
-	return (args.actual);
+	return (OFW_READ(ofw_obj, instance, addr, len));
 }
 
 /* Write to an instance. */
-int
-OF_write(ihandle_t instance, void *addr, int len)
+ssize_t
+OF_write(ihandle_t instance, void *addr, size_t len)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t instance;
-		cell_t addr;
-		cell_t len;
-		cell_t actual;
-	} args = {
-		(cell_t)"write",
-		3,
-		1,
-	};
-
-	args.instance = instance;
-	args.addr = openfirm_mapptr(addr);
-	args.len = len;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.actual);
+	return (OFW_WRITE(ofw_obj, instance, addr, len));
 }
 
 /* Seek to a position. */
 int
 OF_seek(ihandle_t instance, u_int64_t pos)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t instance;
-		cell_t poshi;
-		cell_t poslo;
-		cell_t status;
-	} args = {
-		(cell_t)"seek",
-		3,
-		1,
-	};
-
-	args.instance = instance;
-	args.poshi = pos >> 32;
-	args.poslo = pos;
-	if (openfirmware(&args) == -1)
-		return (-1);
-	return (args.status);
+	return (OFW_SEEK(ofw_obj, instance, pos));
 }
 
 /*
@@ -668,143 +359,35 @@
 void *
 OF_claim(void *virt, u_int size, u_int align)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t virt;
-		cell_t size;
-		cell_t align;
-		cell_t baseaddr;
-	} args = {
-		(cell_t)"claim",
-		3,
-		1,
-	};
-
-	args.virt = (cell_t)virt;
-	args.size = size;
-	args.align = align;
-	if (openfirmware(&args) == -1)
-		return ((void *)-1);
-	return ((void *)args.baseaddr);
+	return (OFW_CLAIM(ofw_obj, virt, size, align));
 }
 
 /* Release an area of memory. */
 void
 OF_release(void *virt, u_int size)
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t virt;
-		cell_t size;
-	} args = {
-		(cell_t)"release",
-		2,
-	};
-
-	args.virt = (cell_t)virt;
-	args.size = size;
-	openfirmware(&args);
+	OFW_RELEASE(ofw_obj, virt, size);
 }
 
 /*
  * Control transfer functions
  */
 
-/* Reset the system and call "boot <bootspec>". */
-void
-OF_boot(char *bootspec)
-{
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t bootspec;
-	} args = {
-		(cell_t)"boot",
-		1,
-	};
-
-	args.bootspec = openfirm_mapptr(bootspec);
-	openfirmware(&args);
-	for (;;)			/* just in case */
-		;
-}
-
 /* Suspend and drop back to the Open Firmware interface. */
 void
 OF_enter()
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-	} args = {
-		(cell_t)"enter",
-	};
-
-	openfirmware(&args);
-	/* We may come back. */
+	OFW_ENTER(ofw_obj);
 }
 
 /* Shut down and drop back to the Open Firmware interface. */
 void
 OF_exit()
 {
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-	} args = {
-		(cell_t)"exit",
-	};
+	/* Should not return */
+	OFW_EXIT(ofw_obj);
 
-	openfirmware(&args);
 	for (;;)			/* just in case */
 		;
 }
 
-/* Free <size> bytes starting at <virt>, then call <entry> with <arg>. */
-#if 0
-void
-OF_chain(void *virt, u_int size, void (*entry)(), void *arg, u_int len)
-{
-	static struct {
-		cell_t name;
-		cell_t nargs;
-		cell_t nreturns;
-		cell_t virt;
-		cell_t size;
-		cell_t entry;
-		cell_t arg;
-		cell_t len;
-	} args = {
-		(cell_t)"chain",
-		5,
-	};
-
-	args.virt = (cell_t)virt;
-	args.size = size;
-	args.entry = (cell_t)entry;
-	args.arg = (cell_t)arg;
-	args.len = len;
-	openfirmware(&args);
-}
-#else
-void
-OF_chain(void *virt, u_int size,
-    void (*entry)(void *, u_int, void *, void *, u_int), void *arg, u_int len)
-{
-	/*
-	 * This is a REALLY dirty hack till the firmware gets this going
-	 */
-#if 0
-	if (size > 0)
-		OF_release(virt, size);
-#endif
-	entry(0, 0, openfirmware, arg, len);
-}
-#endif

==== //depot/projects/ppc-g5/sys/dev/ofw/openfirm.h#3 (text+ko) ====

@@ -64,8 +64,6 @@
  * Prototypes for Open Firmware Interface Routines
  */
 
-typedef unsigned long cell_t;
-
 typedef	unsigned int	ihandle_t;
 typedef unsigned int	phandle_t;
 
@@ -74,23 +72,27 @@
 #include <sys/types.h>
 #include <sys/malloc.h>
 
+#include <machine/ofw_machdep.h>
+
 MALLOC_DECLARE(M_OFWPROP);
 
 /*
- * Stuff that is used by the Open Firmware code.
+ * Open Firmware interface initialization. OF_install installs the named
+ * interface as the Open Firmware access mechanism, OF_init initializes it.
  */
-void	set_openfirm_callback(int (*)(void *));
-int	openfirmware(void *);
-cell_t	openfirm_mapptr(const void *);
+boolean_t	OF_install(char *name, int prio);
+void		OF_init(void *cookie);
 
 /*
- * This isn't actually an Open Firmware function, but it seemed like the right
- * place for it to go.
+ * Known Open Firmware interface names
  */
-void		OF_init(int (*openfirm)(void *));
+
+#define	OFW_STD_DIRECT	"ofw_std"	/* Standard OF interface */
+#define	OFW_STD_REAL	"ofw_real"	/* Real-mode OF interface */
+#define	OFW_FDT		"ofw_fdt"	/* Flattened Device Tree */
 
 /* Generic functions */
-int		OF_test(char *);
+int		OF_test(const char *);
 void		OF_printf(const char *, ...);
 
 /* Device tree functions */
@@ -98,23 +100,24 @@
 phandle_t	OF_child(phandle_t);
 phandle_t	OF_parent(phandle_t);
 phandle_t	OF_instance_to_package(ihandle_t);
-int		OF_getproplen(phandle_t, char *);
-int		OF_getprop(phandle_t, char *, void *, int);
-int		OF_getprop_alloc(phandle_t package, char *propname, int elsz,
-    void **buf);
-int		OF_nextprop(phandle_t, char *, char *);
-int		OF_setprop(phandle_t, char *, void *, int);
-int		OF_canon(const char *, char *, int);
+ssize_t		OF_getproplen(phandle_t, const char *);
+ssize_t		OF_getprop(phandle_t, const char *, void *, size_t);
+ssize_t		OF_getprop_alloc(phandle_t package, const char *propname, 
+		    int elsz, void **buf);
+int		OF_nextprop(phandle_t, const char *name, char *, size_t);
+int		OF_setprop(phandle_t, const char *name, const void *, size_t);
+ssize_t		OF_canon(const char *, char *, size_t);
 phandle_t	OF_finddevice(const char *);
-int		OF_instance_to_path(ihandle_t, char *, int);
-int		OF_package_to_path(phandle_t, char *, int);
-int		OF_call_method(char *, ihandle_t, int, int, ...);
+ssize_t		OF_instance_to_path(ihandle_t, char *, size_t);
+ssize_t		OF_package_to_path(phandle_t, char *, size_t);
+int		OF_call_method(const char *, ihandle_t, int nargs, 
+		    int nreturns, ...);
 
 /* Device I/O functions */
-ihandle_t	OF_open(char *);
+ihandle_t	OF_open(const char *);
 void		OF_close(ihandle_t);
-int		OF_read(ihandle_t, void *, int);
-int		OF_write(ihandle_t, void *, int);
+ssize_t		OF_read(ihandle_t, void *, size_t);
+ssize_t		OF_write(ihandle_t, void *, size_t);
 int		OF_seek(ihandle_t, u_quad_t);
 
 /* Memory functions */
@@ -122,17 +125,11 @@
 void		OF_release(void *, u_int);
 
 /* Control transfer functions */
-void		OF_boot(char *);
 void		OF_enter(void);
 void		OF_exit(void) __attribute__((noreturn));
-void		OF_chain(void *, u_int,
-    void (*)(void *, u_int, void *, void *, u_int), void *, u_int);
 
 /* User interface functions */
-int		OF_interpret(char *, int, ...);
-
-/* Time function */
-int		OF_milliseconds(void);
+int		OF_interpret(const char *cmd, int nreturns, ...);
 
 #endif /* _KERNEL */
 #endif /* _OPENFIRM_H_ */

==== //depot/projects/ppc-g5/sys/dev/ofw/openfirmio.c#2 (text+ko) ====

@@ -221,7 +221,7 @@
 			if (error)
 				break;
 		}
-		ok = OF_nextprop(node, name, newname);
+		ok = OF_nextprop(node, name, newname, sizeof(newname));
 		if (ok == 0) {
 			error = ENOENT;
 			break;

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list