Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Aug 2008 13:01:52 GMT
From:      Przemek Witaszczyk <vi0@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 148109 for review
Message-ID:  <200808221301.m7MD1qe8057309@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=148109

Change 148109 by vi0@vi0_gilgamesh.semihalf.com on 2008/08/22 13:01:19

	Bootable kernel, panics  at no PIC found. Fixed some basic routines
	from OF_xxx() family.

Affected files ...

.. //depot/projects/soc2008/vi0/efika/sys/dev/ofw/openfirm.c#5 edit

Differences ...

==== //depot/projects/soc2008/vi0/efika/sys/dev/ofw/openfirm.c#5 (text+ko) ====

@@ -67,10 +67,18 @@
 
 #include <dev/ofw/openfirm.h>
 
+#define NBPG            4096            /* bytes/page */
+#define PGOFSET         (NBPG-1)        /* byte offset into page */
+#define PGSHIFT         12              /* LOG2(NBPG) */
+
 MALLOC_DEFINE(M_OFWPROP, "openfirm", "Open Firmware properties");
 
 static ihandle_t stdout;
 
+char *OF_buf;
+
+void ofw_stack(void);
+
 /* Initialiser */
 
 void
@@ -116,7 +124,7 @@
 		1,
 		1,
 	};
-
+	ofw_stack();
 	args.service = (cell_t)name;
 	if (openfirmware(&args) == -1)
 		return (-1);
@@ -136,6 +144,7 @@
 		(cell_t)"interpret",
 		1,
 	};
+	ofw_stack();
 	cell_t status;
 	int i = 0;
 
@@ -169,7 +178,7 @@
 		0,
 		1,
 	};
-
+	ofw_stack();
 	openfirmware(&args);
 	return (args.ms);
 }
@@ -179,9 +188,10 @@
  */
 
 /* Return the next sibling of this node or 0. */
+	
 phandle_t
 OF_peer(phandle_t node)
-{
+{	
 	static struct {
 		cell_t name;
 		cell_t nargs;
@@ -193,7 +203,7 @@
 		1,
 		1,
 	};
-
+	ofw_stack();
 	args.node = node;
 	if (openfirmware(&args) == -1)
 		return (-1);
@@ -215,7 +225,7 @@
 		1,
 		1,
 	};
-
+	ofw_stack();
 	args.node = node;
 	if (openfirmware(&args) == -1)
 		return (-1);
@@ -237,7 +247,7 @@
 		1,
 		1,
 	};
-
+	ofw_stack();
 	args.node = node;
 	if (openfirmware(&args) == -1)
 		return (-1);
@@ -259,7 +269,7 @@
 		1,
 		1,
 	};
-
+	ofw_stack();
 	args.instance = instance;
 	if (openfirmware(&args) == -1)
 		return (-1);
@@ -282,7 +292,7 @@
 		2,
 		1,
 	};
-
+	ofw_stack();
 	args.package = package;
 	args.propname = (cell_t)propname;
 	if (openfirmware(&args) == -1)
@@ -308,13 +318,29 @@
 		4,
 		1,
 	};
-
+	int flag = 0;
+	
+	ofw_stack();
+	
+	if (buflen > PAGE_SIZE)
+		return (-1);
 	args.package = package;
 	args.propname = (cell_t)propname;
-	args.buf = (cell_t)buf;
+	
+	if(OF_buf == NULL)	
+		args.buf = (cell_t)buf;
+	else{
+		flag = 1;
+		args.buf = (cell_t)OF_buf;
+	}
 	args.buflen = buflen;
 	if (openfirmware(&args) == -1)
 		return (-1);
+	if(args.size > buflen)
+			args.size = buflen;
+	if (flag == 1 && args.size > 0){
+		bcopy(OF_buf, buf, args.size);
+	}
 	return (args.size);
 }
 
@@ -359,12 +385,13 @@
 		3,
 		1,
 	};
-
+	ofw_stack();
 	args.package = package;
 	args.previous = (cell_t)previous;
-	args.buf = (cell_t)buf;
+	args.buf = (cell_t) OF_buf;
 	if (openfirmware(&args) == -1)
 		return (-1);
+	strncpy(buf, OF_buf, 32);
 	return (args.flag);
 }
 
@@ -387,10 +414,15 @@
 		4,
 		1,
 	};
+	ofw_stack();
+	
+	if (len > NBPG)
+		return -1;
 
+  	bcopy(buf, OF_buf, len);
 	args.package = package;
 	args.propname = (cell_t)propname;
-	args.buf = (cell_t)buf;
+	args.buf = (cell_t) OF_buf;
 	args.len = len;
 	if (openfirmware(&args) == -1)
 		return (-1);
@@ -414,7 +446,7 @@
 		3,
 		1,
 	};
-
+	ofw_stack();
 	args.device = (cell_t)device;
 	args.buf = (cell_t)buf;
 	args.len = len;
@@ -438,7 +470,7 @@
 		1,
 		1,
 	};
-
+	ofw_stack();
 	args.device = (cell_t)device;
 	if (openfirmware(&args) == -1)
 		return (-1);
@@ -462,12 +494,17 @@
 		3,
 		1,
 	};
-
+	if (len > PAGE_SIZE)
+		return -1;
 	args.instance = instance;
-	args.buf = (cell_t)buf;
+	args.buf = (cell_t) OF_buf;
 	args.len = len;
 	if (openfirmware(&args) == -1)
 		return (-1);
+	if (args.len > len)
+		args.len = len;
+	if (args.len > 0)
+		bcopy(OF_buf, buf, args.len);
 	return (args.size);
 }
 
@@ -488,12 +525,18 @@
 		3,
 		1,
 	};
-
+	ofw_stack();
+	if (len > PAGE_SIZE)
+		return -1;
 	args.package = package;
-	args.buf = (cell_t)buf;
+	args.buf = (cell_t) OF_buf;
 	args.len = len;
 	if (openfirmware(&args) == -1)
 		return (-1);
+	if (args.len > len)
+                args.len = len;
+	if (args.len > 0)
+                bcopy(OF_buf, buf, args.len);
 	return (args.size);
 }
 
@@ -555,8 +598,13 @@
 		1,
 		1,
 	};
-
-	args.device = (cell_t)device;
+	int l;
+	
+	ofw_stack();
+	if ((l = strlen(device)) >= PAGE_SIZE)
+		return -1;
+	bcopy(device, OF_buf, l + 1);
+		args.device = (cell_t) OF_buf;
 	if (openfirmware(&args) == -1 || args.instance == 0) {
 		return (-1);
 	}
@@ -576,7 +624,7 @@
 		(cell_t)"close",
 		1,
 	};
-
+	ofw_stack();
 	args.instance = instance;
 	openfirmware(&args);
 }
@@ -599,12 +647,15 @@
 		1,
 	};
 
+	ofw_stack();
 	args.instance = instance;
-	args.addr = (cell_t)addr;
+	args.addr = (cell_t)OF_buf;
 	args.len = len;
 	if (openfirmware(&args) == -1)
 		return (-1);
 
+	bcopy(OF_buf, addr, len);
+
 	return (args.actual);
 }
 
@@ -625,10 +676,13 @@
 		3,
 		1,
 	};
-
+	
+	ofw_stack();
 	args.instance = instance;
-	args.addr = (cell_t)addr;
+	bcopy(addr, OF_buf, len);
+	args.addr = (cell_t)OF_buf;	
 	args.len = len;
+
 	if (openfirmware(&args) == -1)
 		return (-1);
 	return (args.actual);
@@ -651,7 +705,7 @@
 		3,
 		1,
 	};
-
+	ofw_stack();
 	args.instance = instance;
 	args.poshi = pos >> 32;
 	args.poslo = pos;
@@ -681,7 +735,7 @@
 		3,
 		1,
 	};
-
+	ofw_stack();
 	args.virt = (cell_t)virt;
 	args.size = size;
 	args.align = align;
@@ -704,7 +758,7 @@
 		(cell_t)"release",
 		2,
 	};
-
+	ofw_stack();
 	args.virt = (cell_t)virt;
 	args.size = size;
 	openfirmware(&args);
@@ -727,8 +781,13 @@
 		(cell_t)"boot",
 		1,
 	};
+	int l;
 
-	args.bootspec = (cell_t)bootspec;
+	if ((l = strlen(bootspec)) >= PAGE_SIZE)
+			panic("OF_boot");
+	ofw_stack();
+	bcopy(bootspec, OF_buf, l + 1);
+		args.bootspec = (cell_t)  OF_buf;
 	openfirmware(&args);
 	for (;;)			/* just in case */
 		;
@@ -745,7 +804,7 @@
 	} args = {
 		(cell_t)"enter",
 	};
-
+	ofw_stack();
 	openfirmware(&args);
 	/* We may come back. */
 }
@@ -761,7 +820,7 @@
 	} args = {
 		(cell_t)"exit",
 	};
-
+	ofw_stack();
 	openfirmware(&args);
 	for (;;)			/* just in case */
 		;
@@ -807,4 +866,27 @@
 #endif
 	entry(0, 0, openfirmware, arg, len);
 }
+
+/*
+void
+(*OF_set_callback (void (*newfunc)(void *))) (void *)
+	 {
+	         static struct {
+                 const char *name;
+		                 int nargs;
+		                 int nreturns;
+		                 void (*newfunc)(void *);
+		                 void (*oldfunc)(void *);
+		         } args = {
+	                 "set-callback",
+	                 1,
+	                 1,
+		         };
+ 
+         ofw_stack();
+         args.newfunc = newfunc;
+         if (openfirmware(&args) == -1)
+                 return 0;
+	return args.oldfunc;
+}*/
 #endif



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