aboutsummaryrefslogtreecommitdiff
path: root/sys/boot/ficl/loader.c
diff options
context:
space:
mode:
authorDaniel C. Sobral <dcs@FreeBSD.org>2000-09-08 17:03:53 +0000
committerDaniel C. Sobral <dcs@FreeBSD.org>2000-09-08 17:03:53 +0000
commitf5da975f8fc404dac0769da922ef5dc7b1e4fd58 (patch)
tree23a7ee0c5d655842e43c9510e62b06e6690a4081 /sys/boot/ficl/loader.c
parentd39b220c77f98bf9c9f3022f3f07b4aaf4fab2ba (diff)
downloadsrc-f5da975f8fc404dac0769da922ef5dc7b1e4fd58.tar.gz
src-f5da975f8fc404dac0769da922ef5dc7b1e4fd58.zip
Add the infrastructure necessary to handle PnP from a Forth script.
Also, export the file_findfile() function. Again, this is taken from work in progress but frozen for the time being. Since it works, I'd rather commit and remove any uglyness later than hide it on my tree.
Notes
Notes: svn path=/head/; revision=65617
Diffstat (limited to 'sys/boot/ficl/loader.c')
-rw-r--r--sys/boot/ficl/loader.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/sys/boot/ficl/loader.c b/sys/boot/ficl/loader.c
index 1444bbcbb4db..34bdb7fee3ee 100644
--- a/sys/boot/ficl/loader.c
+++ b/sys/boot/ficl/loader.c
@@ -45,6 +45,10 @@
* unsetenv ( addr n -- )
* copyin ( addr addr' len -- )
* copyout ( addr addr' len -- )
+ * findfile ( name len type len' -- addr )
+ * pnpdevices ( -- addr )
+ * pnphandlers ( -- addr )
+ * ccall ( [[...[p10] p9] ... p1] n addr -- result )
*/
void
@@ -206,3 +210,94 @@ ficlCopyout(FICL_VM *pVM)
return;
}
+void
+ficlFindfile(FICL_VM *pVM)
+{
+ char *name, *type, *namep, *typep;
+ struct preloaded_file* fp;
+ int names, types;
+
+#if FICL_ROBUST > 1
+ vmCheckStack(pVM, 4, 1);
+#endif
+
+ types = stackPopINT(pVM->pStack);
+ typep = (char*) stackPopPtr(pVM->pStack);
+ names = stackPopINT(pVM->pStack);
+ namep = (char*) stackPopPtr(pVM->pStack);
+ name = (char*) ficlMalloc(names+1);
+ if (!name)
+ vmThrowErr(pVM, "Error: out of memory");
+ strncpy(name, namep, names);
+ name[names] = '\0';
+ type = (char*) ficlMalloc(types+1);
+ if (!type)
+ vmThrowErr(pVM, "Error: out of memory");
+ strncpy(type, typep, types);
+ type[types] = '\0';
+
+ fp = file_findfile(name, type);
+ stackPushPtr(pVM->pStack, fp);
+
+ return;
+}
+
+void
+ficlPnpdevices(FICL_VM *pVM)
+{
+ static int pnp_devices_initted = 0;
+#if FICL_ROBUST > 1
+ vmCheckStack(pVM, 0, 1);
+#endif
+
+ if(!pnp_devices_initted) {
+ STAILQ_INIT(&pnp_devices);
+ pnp_devices_initted = 1;
+ }
+
+ stackPushPtr(pVM->pStack, &pnp_devices);
+
+ return;
+}
+
+void
+ficlPnphandlers(FICL_VM *pVM)
+{
+#if FICL_ROBUST > 1
+ vmCheckStack(pVM, 0, 1);
+#endif
+
+ stackPushPtr(pVM->pStack, pnphandlers);
+
+ return;
+}
+
+void
+ficlCcall(FICL_VM *pVM)
+{
+ int (*func)(int, ...);
+ int result, p[10];
+ int nparam, i;
+
+#if FICL_ROBUST > 1
+ vmCheckStack(pVM, 2, 0);
+#endif
+
+ func = stackPopPtr(pVM->pStack);
+ nparam = stackPopINT(pVM->pStack);
+
+#if FICL_ROBUST > 1
+ vmCheckStack(pVM, nparam, 1);
+#endif
+
+ for (i = 0; i < nparam; i++)
+ p[i] = stackPopINT(pVM->pStack);
+
+ result = func(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8],
+ p[9]);
+
+ stackPushINT(pVM->pStack, result);
+
+ return;
+}
+