PERFORCE change 148109 for review
Przemek Witaszczyk
vi0 at FreeBSD.org
Fri Aug 22 13:01:53 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=148109
Change 148109 by vi0 at 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
More information about the p4-projects
mailing list