xref: /titanic_54/usr/src/common/ficl/loader.c (revision a1bf3f785ae05c419b339c3a2061f2b18c024f61)
1*a1bf3f78SToomas Soome /*
2*a1bf3f78SToomas Soome  * Copyright (c) 2000 Daniel Capo Sobral
3*a1bf3f78SToomas Soome  * All rights reserved.
4*a1bf3f78SToomas Soome  *
5*a1bf3f78SToomas Soome  * Redistribution and use in source and binary forms, with or without
6*a1bf3f78SToomas Soome  * modification, are permitted provided that the following conditions
7*a1bf3f78SToomas Soome  * are met:
8*a1bf3f78SToomas Soome  * 1. Redistributions of source code must retain the above copyright
9*a1bf3f78SToomas Soome  *    notice, this list of conditions and the following disclaimer.
10*a1bf3f78SToomas Soome  * 2. Redistributions in binary form must reproduce the above copyright
11*a1bf3f78SToomas Soome  *    notice, this list of conditions and the following disclaimer in the
12*a1bf3f78SToomas Soome  *    documentation and/or other materials provided with the distribution.
13*a1bf3f78SToomas Soome  *
14*a1bf3f78SToomas Soome  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*a1bf3f78SToomas Soome  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*a1bf3f78SToomas Soome  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*a1bf3f78SToomas Soome  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*a1bf3f78SToomas Soome  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*a1bf3f78SToomas Soome  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*a1bf3f78SToomas Soome  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*a1bf3f78SToomas Soome  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*a1bf3f78SToomas Soome  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*a1bf3f78SToomas Soome  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*a1bf3f78SToomas Soome  * SUCH DAMAGE.
25*a1bf3f78SToomas Soome  *
26*a1bf3f78SToomas Soome  *	$FreeBSD$
27*a1bf3f78SToomas Soome  */
28*a1bf3f78SToomas Soome 
29*a1bf3f78SToomas Soome /*
30*a1bf3f78SToomas Soome  * l o a d e r . c
31*a1bf3f78SToomas Soome  * Additional FICL words designed for FreeBSD's loader
32*a1bf3f78SToomas Soome  */
33*a1bf3f78SToomas Soome 
34*a1bf3f78SToomas Soome #ifndef STAND
35*a1bf3f78SToomas Soome #include <sys/types.h>
36*a1bf3f78SToomas Soome #include <sys/stat.h>
37*a1bf3f78SToomas Soome #include <dirent.h>
38*a1bf3f78SToomas Soome #include <fcntl.h>
39*a1bf3f78SToomas Soome #include <stdio.h>
40*a1bf3f78SToomas Soome #include <stdlib.h>
41*a1bf3f78SToomas Soome #include <unistd.h>
42*a1bf3f78SToomas Soome #include <strings.h>
43*a1bf3f78SToomas Soome #include <termios.h>
44*a1bf3f78SToomas Soome #else
45*a1bf3f78SToomas Soome #include <stand.h>
46*a1bf3f78SToomas Soome #ifdef __i386__
47*a1bf3f78SToomas Soome #include <machine/cpufunc.h>
48*a1bf3f78SToomas Soome #endif
49*a1bf3f78SToomas Soome #include "bootstrap.h"
50*a1bf3f78SToomas Soome #endif
51*a1bf3f78SToomas Soome #include <string.h>
52*a1bf3f78SToomas Soome #include "ficl.h"
53*a1bf3f78SToomas Soome 
54*a1bf3f78SToomas Soome extern int biospci_count_device_type(uint32_t);
55*a1bf3f78SToomas Soome extern int biospci_write_config(uint32_t, int, int, uint32_t);
56*a1bf3f78SToomas Soome extern int biospci_read_config(uint32_t, int, int, uint32_t *);
57*a1bf3f78SToomas Soome extern int biospci_find_devclass(uint32_t, int, uint32_t *);
58*a1bf3f78SToomas Soome extern int biospci_find_device(uint32_t, int, uint32_t *);
59*a1bf3f78SToomas Soome extern uint32_t biospci_locator(uint8_t, uint8_t, uint8_t);
60*a1bf3f78SToomas Soome 
61*a1bf3f78SToomas Soome /*
62*a1bf3f78SToomas Soome  *		FreeBSD's loader interaction words and extras
63*a1bf3f78SToomas Soome  *
64*a1bf3f78SToomas Soome  *		setenv      ( value n name n' -- )
65*a1bf3f78SToomas Soome  *		setenv?     ( value n name n' flag -- )
66*a1bf3f78SToomas Soome  *		getenv      ( addr n -- addr' n' | -1 )
67*a1bf3f78SToomas Soome  *		unsetenv    ( addr n -- )
68*a1bf3f78SToomas Soome  *		copyin      ( addr addr' len -- )
69*a1bf3f78SToomas Soome  *		copyout     ( addr addr' len -- )
70*a1bf3f78SToomas Soome  *		findfile    ( name len type len' -- addr )
71*a1bf3f78SToomas Soome  *		pnpdevices  ( -- addr )
72*a1bf3f78SToomas Soome  *		pnphandlers ( -- addr )
73*a1bf3f78SToomas Soome  *		ccall       ( [[...[p10] p9] ... p1] n addr -- result )
74*a1bf3f78SToomas Soome  *		.#	    ( value -- )
75*a1bf3f78SToomas Soome  */
76*a1bf3f78SToomas Soome 
77*a1bf3f78SToomas Soome void
78*a1bf3f78SToomas Soome ficlSetenv(ficlVm *pVM)
79*a1bf3f78SToomas Soome {
80*a1bf3f78SToomas Soome 	char *name, *value;
81*a1bf3f78SToomas Soome 	char *namep, *valuep;
82*a1bf3f78SToomas Soome 	int names, values;
83*a1bf3f78SToomas Soome 
84*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 4, 0);
85*a1bf3f78SToomas Soome 
86*a1bf3f78SToomas Soome 	names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
87*a1bf3f78SToomas Soome 	namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
88*a1bf3f78SToomas Soome 	values = ficlStackPopInteger(ficlVmGetDataStack(pVM));
89*a1bf3f78SToomas Soome 	valuep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
90*a1bf3f78SToomas Soome 
91*a1bf3f78SToomas Soome 	name = (char *)ficlMalloc(names+1);
92*a1bf3f78SToomas Soome 	if (!name)
93*a1bf3f78SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
94*a1bf3f78SToomas Soome 	strncpy(name, namep, names);
95*a1bf3f78SToomas Soome 	name[names] = '\0';
96*a1bf3f78SToomas Soome 	value = (char *)ficlMalloc(values+1);
97*a1bf3f78SToomas Soome 	if (!value)
98*a1bf3f78SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
99*a1bf3f78SToomas Soome 	strncpy(value, valuep, values);
100*a1bf3f78SToomas Soome 	value[values] = '\0';
101*a1bf3f78SToomas Soome 
102*a1bf3f78SToomas Soome 	setenv(name, value, 1);
103*a1bf3f78SToomas Soome 	ficlFree(name);
104*a1bf3f78SToomas Soome 	ficlFree(value);
105*a1bf3f78SToomas Soome }
106*a1bf3f78SToomas Soome 
107*a1bf3f78SToomas Soome void
108*a1bf3f78SToomas Soome ficlSetenvq(ficlVm *pVM)
109*a1bf3f78SToomas Soome {
110*a1bf3f78SToomas Soome 	char *name, *value;
111*a1bf3f78SToomas Soome 	char *namep, *valuep;
112*a1bf3f78SToomas Soome 	int names, values, overwrite;
113*a1bf3f78SToomas Soome 
114*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 5, 0);
115*a1bf3f78SToomas Soome 
116*a1bf3f78SToomas Soome 	overwrite = ficlStackPopInteger(ficlVmGetDataStack(pVM));
117*a1bf3f78SToomas Soome 	names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
118*a1bf3f78SToomas Soome 	namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
119*a1bf3f78SToomas Soome 	values = ficlStackPopInteger(ficlVmGetDataStack(pVM));
120*a1bf3f78SToomas Soome 	valuep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
121*a1bf3f78SToomas Soome 
122*a1bf3f78SToomas Soome 	name = (char *)ficlMalloc(names+1);
123*a1bf3f78SToomas Soome 	if (!name)
124*a1bf3f78SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
125*a1bf3f78SToomas Soome 	strncpy(name, namep, names);
126*a1bf3f78SToomas Soome 	name[names] = '\0';
127*a1bf3f78SToomas Soome 	value = (char *)ficlMalloc(values+1);
128*a1bf3f78SToomas Soome 	if (!value)
129*a1bf3f78SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
130*a1bf3f78SToomas Soome 	strncpy(value, valuep, values);
131*a1bf3f78SToomas Soome 	value[values] = '\0';
132*a1bf3f78SToomas Soome 
133*a1bf3f78SToomas Soome 	setenv(name, value, overwrite);
134*a1bf3f78SToomas Soome 	ficlFree(name);
135*a1bf3f78SToomas Soome 	ficlFree(value);
136*a1bf3f78SToomas Soome }
137*a1bf3f78SToomas Soome 
138*a1bf3f78SToomas Soome void
139*a1bf3f78SToomas Soome ficlGetenv(ficlVm *pVM)
140*a1bf3f78SToomas Soome {
141*a1bf3f78SToomas Soome 	char *name, *value;
142*a1bf3f78SToomas Soome 	char *namep;
143*a1bf3f78SToomas Soome 	int names;
144*a1bf3f78SToomas Soome 
145*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 2);
146*a1bf3f78SToomas Soome 
147*a1bf3f78SToomas Soome 	names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
148*a1bf3f78SToomas Soome 	namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
149*a1bf3f78SToomas Soome 
150*a1bf3f78SToomas Soome 	name = (char *)ficlMalloc(names+1);
151*a1bf3f78SToomas Soome 	if (!name)
152*a1bf3f78SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
153*a1bf3f78SToomas Soome 	strncpy(name, namep, names);
154*a1bf3f78SToomas Soome 	name[names] = '\0';
155*a1bf3f78SToomas Soome 
156*a1bf3f78SToomas Soome 	value = getenv(name);
157*a1bf3f78SToomas Soome 	ficlFree(name);
158*a1bf3f78SToomas Soome 
159*a1bf3f78SToomas Soome 	if (value != NULL) {
160*a1bf3f78SToomas Soome 		ficlStackPushPointer(ficlVmGetDataStack(pVM), value);
161*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), strlen(value));
162*a1bf3f78SToomas Soome 	} else
163*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
164*a1bf3f78SToomas Soome }
165*a1bf3f78SToomas Soome 
166*a1bf3f78SToomas Soome void
167*a1bf3f78SToomas Soome ficlUnsetenv(ficlVm *pVM)
168*a1bf3f78SToomas Soome {
169*a1bf3f78SToomas Soome 	char *name;
170*a1bf3f78SToomas Soome 	char *namep;
171*a1bf3f78SToomas Soome 	int names;
172*a1bf3f78SToomas Soome 
173*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 0);
174*a1bf3f78SToomas Soome 
175*a1bf3f78SToomas Soome 	names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
176*a1bf3f78SToomas Soome 	namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
177*a1bf3f78SToomas Soome 
178*a1bf3f78SToomas Soome 	name = (char *)ficlMalloc(names+1);
179*a1bf3f78SToomas Soome 	if (!name)
180*a1bf3f78SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
181*a1bf3f78SToomas Soome 	strncpy(name, namep, names);
182*a1bf3f78SToomas Soome 	name[names] = '\0';
183*a1bf3f78SToomas Soome 
184*a1bf3f78SToomas Soome 	unsetenv(name);
185*a1bf3f78SToomas Soome 	ficlFree(name);
186*a1bf3f78SToomas Soome }
187*a1bf3f78SToomas Soome 
188*a1bf3f78SToomas Soome void
189*a1bf3f78SToomas Soome ficlCopyin(ficlVm *pVM)
190*a1bf3f78SToomas Soome {
191*a1bf3f78SToomas Soome #ifdef STAND
192*a1bf3f78SToomas Soome 	void*		src;
193*a1bf3f78SToomas Soome 	vm_offset_t	dest;
194*a1bf3f78SToomas Soome 	size_t		len;
195*a1bf3f78SToomas Soome #endif
196*a1bf3f78SToomas Soome 
197*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 0);
198*a1bf3f78SToomas Soome 
199*a1bf3f78SToomas Soome #ifdef STAND
200*a1bf3f78SToomas Soome 	len = ficlStackPopInteger(ficlVmGetDataStack(pVM));
201*a1bf3f78SToomas Soome 	dest = ficlStackPopInteger(ficlVmGetDataStack(pVM));
202*a1bf3f78SToomas Soome 	src = ficlStackPopPointer(ficlVmGetDataStack(pVM));
203*a1bf3f78SToomas Soome 	archsw.arch_copyin(src, dest, len);
204*a1bf3f78SToomas Soome #else
205*a1bf3f78SToomas Soome 	(void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
206*a1bf3f78SToomas Soome 	(void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
207*a1bf3f78SToomas Soome 	(void) ficlStackPopPointer(ficlVmGetDataStack(pVM));
208*a1bf3f78SToomas Soome #endif
209*a1bf3f78SToomas Soome }
210*a1bf3f78SToomas Soome 
211*a1bf3f78SToomas Soome void
212*a1bf3f78SToomas Soome ficlCopyout(ficlVm *pVM)
213*a1bf3f78SToomas Soome {
214*a1bf3f78SToomas Soome #ifdef STAND
215*a1bf3f78SToomas Soome 	void*		dest;
216*a1bf3f78SToomas Soome 	vm_offset_t	src;
217*a1bf3f78SToomas Soome 	size_t		len;
218*a1bf3f78SToomas Soome #endif
219*a1bf3f78SToomas Soome 
220*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 0);
221*a1bf3f78SToomas Soome 
222*a1bf3f78SToomas Soome #ifdef STAND
223*a1bf3f78SToomas Soome 	len = ficlStackPopInteger(ficlVmGetDataStack(pVM));
224*a1bf3f78SToomas Soome 	dest = ficlStackPopPointer(ficlVmGetDataStack(pVM));
225*a1bf3f78SToomas Soome 	src = ficlStackPopInteger(ficlVmGetDataStack(pVM));
226*a1bf3f78SToomas Soome 	archsw.arch_copyout(src, dest, len);
227*a1bf3f78SToomas Soome #else
228*a1bf3f78SToomas Soome 	(void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
229*a1bf3f78SToomas Soome 	(void) ficlStackPopPointer(ficlVmGetDataStack(pVM));
230*a1bf3f78SToomas Soome 	(void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
231*a1bf3f78SToomas Soome #endif
232*a1bf3f78SToomas Soome }
233*a1bf3f78SToomas Soome 
234*a1bf3f78SToomas Soome void
235*a1bf3f78SToomas Soome ficlFindfile(ficlVm *pVM)
236*a1bf3f78SToomas Soome {
237*a1bf3f78SToomas Soome #ifdef STAND
238*a1bf3f78SToomas Soome 	char	*name, *type;
239*a1bf3f78SToomas Soome 	char	*namep, *typep;
240*a1bf3f78SToomas Soome 	int	names, types;
241*a1bf3f78SToomas Soome #endif
242*a1bf3f78SToomas Soome 	struct	preloaded_file *fp;
243*a1bf3f78SToomas Soome 
244*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 4, 1);
245*a1bf3f78SToomas Soome 
246*a1bf3f78SToomas Soome #ifdef STAND
247*a1bf3f78SToomas Soome 	types = ficlStackPopInteger(ficlVmGetDataStack(pVM));
248*a1bf3f78SToomas Soome 	typep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
249*a1bf3f78SToomas Soome 	names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
250*a1bf3f78SToomas Soome 	namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
251*a1bf3f78SToomas Soome 
252*a1bf3f78SToomas Soome 	name = (char *)ficlMalloc(names+1);
253*a1bf3f78SToomas Soome 	if (!name)
254*a1bf3f78SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
255*a1bf3f78SToomas Soome 	strncpy(name, namep, names);
256*a1bf3f78SToomas Soome 	name[names] = '\0';
257*a1bf3f78SToomas Soome 	type = (char *)ficlMalloc(types+1);
258*a1bf3f78SToomas Soome 	if (!type)
259*a1bf3f78SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
260*a1bf3f78SToomas Soome 	strncpy(type, typep, types);
261*a1bf3f78SToomas Soome 	type[types] = '\0';
262*a1bf3f78SToomas Soome 
263*a1bf3f78SToomas Soome 	fp = file_findfile(name, type);
264*a1bf3f78SToomas Soome #else
265*a1bf3f78SToomas Soome 	(void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
266*a1bf3f78SToomas Soome 	(void) ficlStackPopPointer(ficlVmGetDataStack(pVM));
267*a1bf3f78SToomas Soome 	(void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
268*a1bf3f78SToomas Soome 	(void) ficlStackPopPointer(ficlVmGetDataStack(pVM));
269*a1bf3f78SToomas Soome 
270*a1bf3f78SToomas Soome 	fp = NULL;
271*a1bf3f78SToomas Soome #endif
272*a1bf3f78SToomas Soome 	ficlStackPushPointer(ficlVmGetDataStack(pVM), fp);
273*a1bf3f78SToomas Soome }
274*a1bf3f78SToomas Soome 
275*a1bf3f78SToomas Soome #ifdef STAND
276*a1bf3f78SToomas Soome #ifdef HAVE_PNP
277*a1bf3f78SToomas Soome 
278*a1bf3f78SToomas Soome void
279*a1bf3f78SToomas Soome ficlPnpdevices(ficlVm *pVM)
280*a1bf3f78SToomas Soome {
281*a1bf3f78SToomas Soome 	static int pnp_devices_initted = 0;
282*a1bf3f78SToomas Soome 
283*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
284*a1bf3f78SToomas Soome 
285*a1bf3f78SToomas Soome 	if (!pnp_devices_initted) {
286*a1bf3f78SToomas Soome 		STAILQ_INIT(&pnp_devices);
287*a1bf3f78SToomas Soome 		pnp_devices_initted = 1;
288*a1bf3f78SToomas Soome 	}
289*a1bf3f78SToomas Soome 
290*a1bf3f78SToomas Soome 	ficlStackPushPointer(ficlVmGetDataStack(pVM), &pnp_devices);
291*a1bf3f78SToomas Soome }
292*a1bf3f78SToomas Soome 
293*a1bf3f78SToomas Soome void
294*a1bf3f78SToomas Soome ficlPnphandlers(ficlVm *pVM)
295*a1bf3f78SToomas Soome {
296*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
297*a1bf3f78SToomas Soome 
298*a1bf3f78SToomas Soome 	ficlStackPushPointer(ficlVmGetDataStack(pVM), pnphandlers);
299*a1bf3f78SToomas Soome }
300*a1bf3f78SToomas Soome 
301*a1bf3f78SToomas Soome #endif
302*a1bf3f78SToomas Soome #endif /* ifdef STAND */
303*a1bf3f78SToomas Soome 
304*a1bf3f78SToomas Soome void
305*a1bf3f78SToomas Soome ficlCcall(ficlVm *pVM)
306*a1bf3f78SToomas Soome {
307*a1bf3f78SToomas Soome 	int (*func)(int, ...);
308*a1bf3f78SToomas Soome 	int result, p[10];
309*a1bf3f78SToomas Soome 	int nparam, i;
310*a1bf3f78SToomas Soome 
311*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 0);
312*a1bf3f78SToomas Soome 
313*a1bf3f78SToomas Soome 	func = (int (*)(int, ...))ficlStackPopPointer(ficlVmGetDataStack(pVM));
314*a1bf3f78SToomas Soome 	nparam = ficlStackPopInteger(ficlVmGetDataStack(pVM));
315*a1bf3f78SToomas Soome 
316*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), nparam, 1);
317*a1bf3f78SToomas Soome 
318*a1bf3f78SToomas Soome 	for (i = 0; i < nparam; i++)
319*a1bf3f78SToomas Soome 		p[i] = ficlStackPopInteger(ficlVmGetDataStack(pVM));
320*a1bf3f78SToomas Soome 
321*a1bf3f78SToomas Soome 	result = func(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8],
322*a1bf3f78SToomas Soome 	    p[9]);
323*a1bf3f78SToomas Soome 
324*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), result);
325*a1bf3f78SToomas Soome }
326*a1bf3f78SToomas Soome 
327*a1bf3f78SToomas Soome /*
328*a1bf3f78SToomas Soome  * f i c l E x e c F D
329*a1bf3f78SToomas Soome  * reads in text from file fd and passes it to ficlExec()
330*a1bf3f78SToomas Soome  * returns FICL_VM_STATUS_OUT_OF_TEXT on success or the ficlExec() error
331*a1bf3f78SToomas Soome  * code on failure.
332*a1bf3f78SToomas Soome  */
333*a1bf3f78SToomas Soome #define	nLINEBUF	256
334*a1bf3f78SToomas Soome int
335*a1bf3f78SToomas Soome ficlExecFD(ficlVm *pVM, int fd)
336*a1bf3f78SToomas Soome {
337*a1bf3f78SToomas Soome 	char cp[nLINEBUF];
338*a1bf3f78SToomas Soome 	int nLine = 0, rval = FICL_VM_STATUS_OUT_OF_TEXT;
339*a1bf3f78SToomas Soome 	char ch;
340*a1bf3f78SToomas Soome 	ficlCell id;
341*a1bf3f78SToomas Soome 	ficlString s;
342*a1bf3f78SToomas Soome 
343*a1bf3f78SToomas Soome 	id = pVM->sourceId;
344*a1bf3f78SToomas Soome 	pVM->sourceId.i = fd+1; /* in loader we can get 0, there is no stdin */
345*a1bf3f78SToomas Soome 
346*a1bf3f78SToomas Soome 	/* feed each line to ficlExec */
347*a1bf3f78SToomas Soome 	while (1) {
348*a1bf3f78SToomas Soome 		int status, i;
349*a1bf3f78SToomas Soome 
350*a1bf3f78SToomas Soome 		i = 0;
351*a1bf3f78SToomas Soome 		while ((status = read(fd, &ch, 1)) > 0 && ch != '\n')
352*a1bf3f78SToomas Soome 			cp[i++] = ch;
353*a1bf3f78SToomas Soome 		nLine++;
354*a1bf3f78SToomas Soome 		if (!i) {
355*a1bf3f78SToomas Soome 			if (status < 1)
356*a1bf3f78SToomas Soome 				break;
357*a1bf3f78SToomas Soome 			continue;
358*a1bf3f78SToomas Soome 		}
359*a1bf3f78SToomas Soome 		if (cp[i] == '\n')
360*a1bf3f78SToomas Soome 			cp[i] = '\0';
361*a1bf3f78SToomas Soome 
362*a1bf3f78SToomas Soome 		FICL_STRING_SET_POINTER(s, cp);
363*a1bf3f78SToomas Soome 		FICL_STRING_SET_LENGTH(s, i);
364*a1bf3f78SToomas Soome 
365*a1bf3f78SToomas Soome 		rval = ficlVmExecuteString(pVM, s);
366*a1bf3f78SToomas Soome 		if (rval != FICL_VM_STATUS_QUIT &&
367*a1bf3f78SToomas Soome 		    rval != FICL_VM_STATUS_USER_EXIT &&
368*a1bf3f78SToomas Soome 		    rval != FICL_VM_STATUS_OUT_OF_TEXT) {
369*a1bf3f78SToomas Soome 			pVM->sourceId = id;
370*a1bf3f78SToomas Soome 			(void) ficlVmEvaluate(pVM, "");
371*a1bf3f78SToomas Soome 			return (rval);
372*a1bf3f78SToomas Soome 		}
373*a1bf3f78SToomas Soome 	}
374*a1bf3f78SToomas Soome 	pVM->sourceId = id;
375*a1bf3f78SToomas Soome 
376*a1bf3f78SToomas Soome 	/*
377*a1bf3f78SToomas Soome 	 * Pass an empty line with SOURCE-ID == -1 to flush
378*a1bf3f78SToomas Soome 	 * any pending REFILLs (as required by FILE wordset)
379*a1bf3f78SToomas Soome 	 */
380*a1bf3f78SToomas Soome 	(void) ficlVmEvaluate(pVM, "");
381*a1bf3f78SToomas Soome 
382*a1bf3f78SToomas Soome 	if (rval == FICL_VM_STATUS_USER_EXIT)
383*a1bf3f78SToomas Soome 		ficlVmThrow(pVM, FICL_VM_STATUS_USER_EXIT);
384*a1bf3f78SToomas Soome 
385*a1bf3f78SToomas Soome 	return (rval);
386*a1bf3f78SToomas Soome }
387*a1bf3f78SToomas Soome 
388*a1bf3f78SToomas Soome static void displayCellNoPad(ficlVm *pVM)
389*a1bf3f78SToomas Soome {
390*a1bf3f78SToomas Soome 	ficlCell c;
391*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
392*a1bf3f78SToomas Soome 
393*a1bf3f78SToomas Soome 	c = ficlStackPop(ficlVmGetDataStack(pVM));
394*a1bf3f78SToomas Soome 	ficlLtoa((c).i, pVM->pad, pVM->base);
395*a1bf3f78SToomas Soome 	ficlVmTextOut(pVM, pVM->pad);
396*a1bf3f78SToomas Soome }
397*a1bf3f78SToomas Soome 
398*a1bf3f78SToomas Soome /*
399*a1bf3f78SToomas Soome  * isdir? - Return whether an fd corresponds to a directory.
400*a1bf3f78SToomas Soome  *
401*a1bf3f78SToomas Soome  * isdir? ( fd -- bool )
402*a1bf3f78SToomas Soome  */
403*a1bf3f78SToomas Soome static void
404*a1bf3f78SToomas Soome isdirQuestion(ficlVm *pVM)
405*a1bf3f78SToomas Soome {
406*a1bf3f78SToomas Soome 	struct stat sb;
407*a1bf3f78SToomas Soome 	ficlInteger flag;
408*a1bf3f78SToomas Soome 	int fd;
409*a1bf3f78SToomas Soome 
410*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 1);
411*a1bf3f78SToomas Soome 
412*a1bf3f78SToomas Soome 	fd = ficlStackPopInteger(ficlVmGetDataStack(pVM));
413*a1bf3f78SToomas Soome 	flag = FICL_FALSE;
414*a1bf3f78SToomas Soome 	do {
415*a1bf3f78SToomas Soome 		if (fd < 0)
416*a1bf3f78SToomas Soome 			break;
417*a1bf3f78SToomas Soome 		if (fstat(fd, &sb) < 0)
418*a1bf3f78SToomas Soome 			break;
419*a1bf3f78SToomas Soome 		if (!S_ISDIR(sb.st_mode))
420*a1bf3f78SToomas Soome 			break;
421*a1bf3f78SToomas Soome 		flag = FICL_TRUE;
422*a1bf3f78SToomas Soome 	} while (0);
423*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
424*a1bf3f78SToomas Soome }
425*a1bf3f78SToomas Soome 
426*a1bf3f78SToomas Soome /*
427*a1bf3f78SToomas Soome  * fopen - open a file and return new fd on stack.
428*a1bf3f78SToomas Soome  *
429*a1bf3f78SToomas Soome  * fopen ( ptr count mode -- fd )
430*a1bf3f78SToomas Soome  */
431*a1bf3f78SToomas Soome extern char *get_dev(const char *);
432*a1bf3f78SToomas Soome 
433*a1bf3f78SToomas Soome static void
434*a1bf3f78SToomas Soome pfopen(ficlVm *pVM)
435*a1bf3f78SToomas Soome {
436*a1bf3f78SToomas Soome 	int mode, fd, count;
437*a1bf3f78SToomas Soome 	char *ptr, *name;
438*a1bf3f78SToomas Soome #ifndef STAND
439*a1bf3f78SToomas Soome 	char *tmp;
440*a1bf3f78SToomas Soome #endif
441*a1bf3f78SToomas Soome 
442*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 1);
443*a1bf3f78SToomas Soome 
444*a1bf3f78SToomas Soome 	mode = ficlStackPopInteger(ficlVmGetDataStack(pVM));	/* get mode */
445*a1bf3f78SToomas Soome 	count = ficlStackPopInteger(ficlVmGetDataStack(pVM));	/* get count */
446*a1bf3f78SToomas Soome 	ptr = ficlStackPopPointer(ficlVmGetDataStack(pVM));	/* get ptr */
447*a1bf3f78SToomas Soome 
448*a1bf3f78SToomas Soome 	if ((count < 0) || (ptr == NULL)) {
449*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
450*a1bf3f78SToomas Soome 		return;
451*a1bf3f78SToomas Soome 	}
452*a1bf3f78SToomas Soome 
453*a1bf3f78SToomas Soome 	/* ensure that the string is null terminated */
454*a1bf3f78SToomas Soome 	name = (char *)malloc(count+1);
455*a1bf3f78SToomas Soome 	bcopy(ptr, name, count);
456*a1bf3f78SToomas Soome 	name[count] = 0;
457*a1bf3f78SToomas Soome #ifndef STAND
458*a1bf3f78SToomas Soome 	tmp = get_dev(name);
459*a1bf3f78SToomas Soome 	free(name);
460*a1bf3f78SToomas Soome 	name = tmp;
461*a1bf3f78SToomas Soome #endif
462*a1bf3f78SToomas Soome 
463*a1bf3f78SToomas Soome 	/* open the file */
464*a1bf3f78SToomas Soome 	fd = open(name, mode);
465*a1bf3f78SToomas Soome 	free(name);
466*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), fd);
467*a1bf3f78SToomas Soome }
468*a1bf3f78SToomas Soome 
469*a1bf3f78SToomas Soome /*
470*a1bf3f78SToomas Soome  * fclose - close a file who's fd is on stack.
471*a1bf3f78SToomas Soome  * fclose ( fd -- )
472*a1bf3f78SToomas Soome  */
473*a1bf3f78SToomas Soome static void
474*a1bf3f78SToomas Soome pfclose(ficlVm *pVM)
475*a1bf3f78SToomas Soome {
476*a1bf3f78SToomas Soome 	int fd;
477*a1bf3f78SToomas Soome 
478*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
479*a1bf3f78SToomas Soome 
480*a1bf3f78SToomas Soome 	fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
481*a1bf3f78SToomas Soome 	if (fd != -1)
482*a1bf3f78SToomas Soome 		close(fd);
483*a1bf3f78SToomas Soome }
484*a1bf3f78SToomas Soome 
485*a1bf3f78SToomas Soome /*
486*a1bf3f78SToomas Soome  * fread - read file contents
487*a1bf3f78SToomas Soome  * fread  ( fd buf nbytes  -- nread )
488*a1bf3f78SToomas Soome  */
489*a1bf3f78SToomas Soome static void
490*a1bf3f78SToomas Soome pfread(ficlVm *pVM)
491*a1bf3f78SToomas Soome {
492*a1bf3f78SToomas Soome 	int fd, len;
493*a1bf3f78SToomas Soome 	char *buf;
494*a1bf3f78SToomas Soome 
495*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 1);
496*a1bf3f78SToomas Soome 
497*a1bf3f78SToomas Soome 	len = ficlStackPopInteger(ficlVmGetDataStack(pVM));
498*a1bf3f78SToomas Soome 	buf = ficlStackPopPointer(ficlVmGetDataStack(pVM)); /* get buffer */
499*a1bf3f78SToomas Soome 	fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
500*a1bf3f78SToomas Soome 	if (len > 0 && buf && fd != -1)
501*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM),
502*a1bf3f78SToomas Soome 		    read(fd, buf, len));
503*a1bf3f78SToomas Soome 	else
504*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
505*a1bf3f78SToomas Soome }
506*a1bf3f78SToomas Soome 
507*a1bf3f78SToomas Soome /*
508*a1bf3f78SToomas Soome  * fopendir - open directory
509*a1bf3f78SToomas Soome  *
510*a1bf3f78SToomas Soome  * fopendir ( addr len -- ptr TRUE | FALSE )
511*a1bf3f78SToomas Soome  */
512*a1bf3f78SToomas Soome static void pfopendir(ficlVm *pVM)
513*a1bf3f78SToomas Soome {
514*a1bf3f78SToomas Soome #ifndef STAND
515*a1bf3f78SToomas Soome 	DIR *dir;
516*a1bf3f78SToomas Soome 	char *tmp;
517*a1bf3f78SToomas Soome #else
518*a1bf3f78SToomas Soome 	struct stat sb;
519*a1bf3f78SToomas Soome 	int fd;
520*a1bf3f78SToomas Soome #endif
521*a1bf3f78SToomas Soome 	int count;
522*a1bf3f78SToomas Soome 	char *ptr, *name;
523*a1bf3f78SToomas Soome 	ficlInteger flag = FICL_FALSE;
524*a1bf3f78SToomas Soome 
525*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 1);
526*a1bf3f78SToomas Soome 
527*a1bf3f78SToomas Soome 	count = ficlStackPopInteger(ficlVmGetDataStack(pVM));
528*a1bf3f78SToomas Soome 	ptr = ficlStackPopPointer(ficlVmGetDataStack(pVM));	/* get ptr */
529*a1bf3f78SToomas Soome 
530*a1bf3f78SToomas Soome 	if ((count < 0) || (ptr == NULL)) {
531*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
532*a1bf3f78SToomas Soome 		return;
533*a1bf3f78SToomas Soome 	}
534*a1bf3f78SToomas Soome 	/* ensure that the string is null terminated */
535*a1bf3f78SToomas Soome 	name = (char *)malloc(count+1);
536*a1bf3f78SToomas Soome 	bcopy(ptr, name, count);
537*a1bf3f78SToomas Soome 	name[count] = 0;
538*a1bf3f78SToomas Soome #ifndef STAND
539*a1bf3f78SToomas Soome 	tmp = get_dev(name);
540*a1bf3f78SToomas Soome 	free(name);
541*a1bf3f78SToomas Soome 	name = tmp;
542*a1bf3f78SToomas Soome #else
543*a1bf3f78SToomas Soome 	fd = open(name, O_RDONLY);
544*a1bf3f78SToomas Soome 	free(name);
545*a1bf3f78SToomas Soome 	do {
546*a1bf3f78SToomas Soome 		if (fd < 0)
547*a1bf3f78SToomas Soome 			break;
548*a1bf3f78SToomas Soome 		if (fstat(fd, &sb) < 0)
549*a1bf3f78SToomas Soome 			break;
550*a1bf3f78SToomas Soome 		if (!S_ISDIR(sb.st_mode))
551*a1bf3f78SToomas Soome 			break;
552*a1bf3f78SToomas Soome 		flag = FICL_TRUE;
553*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), fd);
554*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
555*a1bf3f78SToomas Soome 		return;
556*a1bf3f78SToomas Soome 	} while (0);
557*a1bf3f78SToomas Soome 
558*a1bf3f78SToomas Soome 	if (fd >= 0)
559*a1bf3f78SToomas Soome 		close(fd);
560*a1bf3f78SToomas Soome 
561*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
562*a1bf3f78SToomas Soome 		return;
563*a1bf3f78SToomas Soome #endif
564*a1bf3f78SToomas Soome #ifndef STAND
565*a1bf3f78SToomas Soome 	dir = opendir(name);
566*a1bf3f78SToomas Soome 	if (dir == NULL) {
567*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
568*a1bf3f78SToomas Soome 		return;
569*a1bf3f78SToomas Soome 	} else
570*a1bf3f78SToomas Soome 		flag = FICL_TRUE;
571*a1bf3f78SToomas Soome 
572*a1bf3f78SToomas Soome 	ficlStackPushPointer(ficlVmGetDataStack(pVM), dir);
573*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
574*a1bf3f78SToomas Soome #endif
575*a1bf3f78SToomas Soome }
576*a1bf3f78SToomas Soome 
577*a1bf3f78SToomas Soome /*
578*a1bf3f78SToomas Soome  * freaddir - read directory contents
579*a1bf3f78SToomas Soome  * freaddir ( fd -- ptr len TRUE | FALSE )
580*a1bf3f78SToomas Soome  */
581*a1bf3f78SToomas Soome static void
582*a1bf3f78SToomas Soome pfreaddir(ficlVm *pVM)
583*a1bf3f78SToomas Soome {
584*a1bf3f78SToomas Soome #ifndef STAND
585*a1bf3f78SToomas Soome 	static DIR *dir = NULL;
586*a1bf3f78SToomas Soome #else
587*a1bf3f78SToomas Soome 	int fd;
588*a1bf3f78SToomas Soome #endif
589*a1bf3f78SToomas Soome 	struct dirent *d = NULL;
590*a1bf3f78SToomas Soome 
591*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 3);
592*a1bf3f78SToomas Soome 	/*
593*a1bf3f78SToomas Soome 	 * libstand readdir does not always return . nor .. so filter
594*a1bf3f78SToomas Soome 	 * them out to have consistent behaviour.
595*a1bf3f78SToomas Soome 	 */
596*a1bf3f78SToomas Soome #ifndef STAND
597*a1bf3f78SToomas Soome 	dir = ficlStackPopPointer(ficlVmGetDataStack(pVM));
598*a1bf3f78SToomas Soome 	if (dir != NULL)
599*a1bf3f78SToomas Soome 		do {
600*a1bf3f78SToomas Soome 			d = readdir(dir);
601*a1bf3f78SToomas Soome 			if (d != NULL && strcmp(d->d_name, ".") == 0)
602*a1bf3f78SToomas Soome 				continue;
603*a1bf3f78SToomas Soome 			if (d != NULL && strcmp(d->d_name, "..") == 0)
604*a1bf3f78SToomas Soome 				continue;
605*a1bf3f78SToomas Soome 			break;
606*a1bf3f78SToomas Soome 		} while (d != NULL);
607*a1bf3f78SToomas Soome #else
608*a1bf3f78SToomas Soome 	fd = ficlStackPopInteger(ficlVmGetDataStack(pVM));
609*a1bf3f78SToomas Soome 	if (fd != -1)
610*a1bf3f78SToomas Soome 		do {
611*a1bf3f78SToomas Soome 			d = readdirfd(fd);
612*a1bf3f78SToomas Soome 			if (d != NULL && strcmp(d->d_name, ".") == 0)
613*a1bf3f78SToomas Soome 				continue;
614*a1bf3f78SToomas Soome 			if (d != NULL && strcmp(d->d_name, "..") == 0)
615*a1bf3f78SToomas Soome 				continue;
616*a1bf3f78SToomas Soome 			break;
617*a1bf3f78SToomas Soome 		} while (d != NULL);
618*a1bf3f78SToomas Soome #endif
619*a1bf3f78SToomas Soome 	if (d != NULL) {
620*a1bf3f78SToomas Soome 		ficlStackPushPointer(ficlVmGetDataStack(pVM), d->d_name);
621*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM),
622*a1bf3f78SToomas Soome 		    strlen(d->d_name));
623*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), FICL_TRUE);
624*a1bf3f78SToomas Soome 	} else {
625*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), FICL_FALSE);
626*a1bf3f78SToomas Soome 	}
627*a1bf3f78SToomas Soome }
628*a1bf3f78SToomas Soome 
629*a1bf3f78SToomas Soome /*
630*a1bf3f78SToomas Soome  * fclosedir - close a dir on stack.
631*a1bf3f78SToomas Soome  *
632*a1bf3f78SToomas Soome  * fclosedir ( fd -- )
633*a1bf3f78SToomas Soome  */
634*a1bf3f78SToomas Soome static void
635*a1bf3f78SToomas Soome pfclosedir(ficlVm *pVM)
636*a1bf3f78SToomas Soome {
637*a1bf3f78SToomas Soome #ifndef STAND
638*a1bf3f78SToomas Soome 	DIR *dir;
639*a1bf3f78SToomas Soome #else
640*a1bf3f78SToomas Soome 	int fd;
641*a1bf3f78SToomas Soome #endif
642*a1bf3f78SToomas Soome 
643*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
644*a1bf3f78SToomas Soome 
645*a1bf3f78SToomas Soome #ifndef STAND
646*a1bf3f78SToomas Soome 	dir = ficlStackPopPointer(ficlVmGetDataStack(pVM)); /* get dir */
647*a1bf3f78SToomas Soome 	if (dir != NULL)
648*a1bf3f78SToomas Soome 		closedir(dir);
649*a1bf3f78SToomas Soome #else
650*a1bf3f78SToomas Soome 	fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
651*a1bf3f78SToomas Soome 	if (fd != -1)
652*a1bf3f78SToomas Soome 		close(fd);
653*a1bf3f78SToomas Soome #endif
654*a1bf3f78SToomas Soome }
655*a1bf3f78SToomas Soome 
656*a1bf3f78SToomas Soome /*
657*a1bf3f78SToomas Soome  * fload - interpret file contents
658*a1bf3f78SToomas Soome  *
659*a1bf3f78SToomas Soome  * fload  ( fd -- )
660*a1bf3f78SToomas Soome  */
661*a1bf3f78SToomas Soome static void pfload(ficlVm *pVM)
662*a1bf3f78SToomas Soome {
663*a1bf3f78SToomas Soome 	int fd;
664*a1bf3f78SToomas Soome 
665*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
666*a1bf3f78SToomas Soome 
667*a1bf3f78SToomas Soome 	fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
668*a1bf3f78SToomas Soome 	if (fd != -1)
669*a1bf3f78SToomas Soome 		ficlExecFD(pVM, fd);
670*a1bf3f78SToomas Soome }
671*a1bf3f78SToomas Soome 
672*a1bf3f78SToomas Soome /*
673*a1bf3f78SToomas Soome  * fwrite - write file contents
674*a1bf3f78SToomas Soome  *
675*a1bf3f78SToomas Soome  * fwrite  ( fd buf nbytes  -- nwritten )
676*a1bf3f78SToomas Soome  */
677*a1bf3f78SToomas Soome static void
678*a1bf3f78SToomas Soome pfwrite(ficlVm *pVM)
679*a1bf3f78SToomas Soome {
680*a1bf3f78SToomas Soome 	int fd, len;
681*a1bf3f78SToomas Soome 	char *buf;
682*a1bf3f78SToomas Soome 
683*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 1);
684*a1bf3f78SToomas Soome 
685*a1bf3f78SToomas Soome 	len = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* bytes to read */
686*a1bf3f78SToomas Soome 	buf = ficlStackPopPointer(ficlVmGetDataStack(pVM)); /* get buffer */
687*a1bf3f78SToomas Soome 	fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
688*a1bf3f78SToomas Soome 	if (len > 0 && buf && fd != -1)
689*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM),
690*a1bf3f78SToomas Soome 		    write(fd, buf, len));
691*a1bf3f78SToomas Soome 	else
692*a1bf3f78SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
693*a1bf3f78SToomas Soome }
694*a1bf3f78SToomas Soome 
695*a1bf3f78SToomas Soome /*
696*a1bf3f78SToomas Soome  * fseek - seek to a new position in a file
697*a1bf3f78SToomas Soome  *
698*a1bf3f78SToomas Soome  * fseek  ( fd ofs whence  -- pos )
699*a1bf3f78SToomas Soome  */
700*a1bf3f78SToomas Soome static void
701*a1bf3f78SToomas Soome pfseek(ficlVm *pVM)
702*a1bf3f78SToomas Soome {
703*a1bf3f78SToomas Soome 	int fd, pos, whence;
704*a1bf3f78SToomas Soome 
705*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 1);
706*a1bf3f78SToomas Soome 
707*a1bf3f78SToomas Soome 	whence = ficlStackPopInteger(ficlVmGetDataStack(pVM));
708*a1bf3f78SToomas Soome 	pos = ficlStackPopInteger(ficlVmGetDataStack(pVM));
709*a1bf3f78SToomas Soome 	fd = ficlStackPopInteger(ficlVmGetDataStack(pVM));
710*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), lseek(fd, pos, whence));
711*a1bf3f78SToomas Soome }
712*a1bf3f78SToomas Soome 
713*a1bf3f78SToomas Soome /*
714*a1bf3f78SToomas Soome  * key - get a character from stdin
715*a1bf3f78SToomas Soome  *
716*a1bf3f78SToomas Soome  * key ( -- char )
717*a1bf3f78SToomas Soome  */
718*a1bf3f78SToomas Soome static void
719*a1bf3f78SToomas Soome key(ficlVm *pVM)
720*a1bf3f78SToomas Soome {
721*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
722*a1bf3f78SToomas Soome 
723*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), getchar());
724*a1bf3f78SToomas Soome }
725*a1bf3f78SToomas Soome 
726*a1bf3f78SToomas Soome /*
727*a1bf3f78SToomas Soome  * key? - check for a character from stdin (FACILITY)
728*a1bf3f78SToomas Soome  * key? ( -- flag )
729*a1bf3f78SToomas Soome  */
730*a1bf3f78SToomas Soome static void
731*a1bf3f78SToomas Soome keyQuestion(ficlVm *pVM)
732*a1bf3f78SToomas Soome {
733*a1bf3f78SToomas Soome #ifndef STAND
734*a1bf3f78SToomas Soome 	char ch = -1;
735*a1bf3f78SToomas Soome 	struct termios oldt;
736*a1bf3f78SToomas Soome 	struct termios newt;
737*a1bf3f78SToomas Soome #endif
738*a1bf3f78SToomas Soome 
739*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
740*a1bf3f78SToomas Soome 
741*a1bf3f78SToomas Soome #ifndef STAND
742*a1bf3f78SToomas Soome 	tcgetattr(STDIN_FILENO, &oldt);
743*a1bf3f78SToomas Soome 	newt = oldt;
744*a1bf3f78SToomas Soome 	newt.c_lflag &= ~(ICANON | ECHO);
745*a1bf3f78SToomas Soome 	newt.c_cc[VMIN] = 0;
746*a1bf3f78SToomas Soome 	newt.c_cc[VTIME] = 0;
747*a1bf3f78SToomas Soome 	tcsetattr(STDIN_FILENO, TCSANOW, &newt);
748*a1bf3f78SToomas Soome 	ch = getchar();
749*a1bf3f78SToomas Soome 	tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
750*a1bf3f78SToomas Soome 
751*a1bf3f78SToomas Soome 	if (ch != -1)
752*a1bf3f78SToomas Soome 		(void) ungetc(ch, stdin);
753*a1bf3f78SToomas Soome 
754*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM),
755*a1bf3f78SToomas Soome 	    ch != -1? FICL_TRUE : FICL_FALSE);
756*a1bf3f78SToomas Soome #else
757*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM),
758*a1bf3f78SToomas Soome 	    ischar()? FICL_TRUE : FICL_FALSE);
759*a1bf3f78SToomas Soome #endif
760*a1bf3f78SToomas Soome }
761*a1bf3f78SToomas Soome 
762*a1bf3f78SToomas Soome /*
763*a1bf3f78SToomas Soome  * seconds - gives number of seconds since beginning of time
764*a1bf3f78SToomas Soome  *
765*a1bf3f78SToomas Soome  * beginning of time is defined as:
766*a1bf3f78SToomas Soome  *
767*a1bf3f78SToomas Soome  *	BTX	- number of seconds since midnight
768*a1bf3f78SToomas Soome  *	FreeBSD	- number of seconds since Jan 1 1970
769*a1bf3f78SToomas Soome  *
770*a1bf3f78SToomas Soome  * seconds ( -- u )
771*a1bf3f78SToomas Soome  */
772*a1bf3f78SToomas Soome static void
773*a1bf3f78SToomas Soome pseconds(ficlVm *pVM)
774*a1bf3f78SToomas Soome {
775*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
776*a1bf3f78SToomas Soome 
777*a1bf3f78SToomas Soome 	ficlStackPushUnsigned(ficlVmGetDataStack(pVM),
778*a1bf3f78SToomas Soome 	    (ficlUnsigned) time(NULL));
779*a1bf3f78SToomas Soome }
780*a1bf3f78SToomas Soome 
781*a1bf3f78SToomas Soome /*
782*a1bf3f78SToomas Soome  * ms - wait at least that many milliseconds (FACILITY)
783*a1bf3f78SToomas Soome  * ms ( u -- )
784*a1bf3f78SToomas Soome  */
785*a1bf3f78SToomas Soome static void
786*a1bf3f78SToomas Soome ms(ficlVm *pVM)
787*a1bf3f78SToomas Soome {
788*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
789*a1bf3f78SToomas Soome 
790*a1bf3f78SToomas Soome #ifndef STAND
791*a1bf3f78SToomas Soome 	usleep(ficlStackPopUnsigned(ficlVmGetDataStack(pVM)) * 1000);
792*a1bf3f78SToomas Soome #else
793*a1bf3f78SToomas Soome 	delay(ficlStackPopUnsigned(ficlVmGetDataStack(pVM)) * 1000);
794*a1bf3f78SToomas Soome #endif
795*a1bf3f78SToomas Soome }
796*a1bf3f78SToomas Soome 
797*a1bf3f78SToomas Soome /*
798*a1bf3f78SToomas Soome  * fkey - get a character from a file
799*a1bf3f78SToomas Soome  * fkey ( file -- char )
800*a1bf3f78SToomas Soome  */
801*a1bf3f78SToomas Soome static void
802*a1bf3f78SToomas Soome fkey(ficlVm *pVM)
803*a1bf3f78SToomas Soome {
804*a1bf3f78SToomas Soome 	int i, fd;
805*a1bf3f78SToomas Soome 	char ch;
806*a1bf3f78SToomas Soome 
807*a1bf3f78SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 1);
808*a1bf3f78SToomas Soome 
809*a1bf3f78SToomas Soome 	fd = ficlStackPopInteger(ficlVmGetDataStack(pVM));
810*a1bf3f78SToomas Soome 	i = read(fd, &ch, 1);
811*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), i > 0 ? ch : -1);
812*a1bf3f78SToomas Soome }
813*a1bf3f78SToomas Soome 
814*a1bf3f78SToomas Soome 
815*a1bf3f78SToomas Soome #ifdef STAND
816*a1bf3f78SToomas Soome #ifdef __i386__
817*a1bf3f78SToomas Soome 
818*a1bf3f78SToomas Soome /*
819*a1bf3f78SToomas Soome  * outb ( port# c -- )
820*a1bf3f78SToomas Soome  * Store a byte to I/O port number port#
821*a1bf3f78SToomas Soome  */
822*a1bf3f78SToomas Soome void
823*a1bf3f78SToomas Soome ficlOutb(ficlVm *pVM)
824*a1bf3f78SToomas Soome {
825*a1bf3f78SToomas Soome 	uint8_t c;
826*a1bf3f78SToomas Soome 	uint32_t port;
827*a1bf3f78SToomas Soome 
828*a1bf3f78SToomas Soome 	port = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
829*a1bf3f78SToomas Soome 	c = ficlStackPopInteger(ficlVmGetDataStack(pVM));
830*a1bf3f78SToomas Soome 	outb(port, c);
831*a1bf3f78SToomas Soome }
832*a1bf3f78SToomas Soome 
833*a1bf3f78SToomas Soome /*
834*a1bf3f78SToomas Soome  * inb ( port# -- c )
835*a1bf3f78SToomas Soome  * Fetch a byte from I/O port number port#
836*a1bf3f78SToomas Soome  */
837*a1bf3f78SToomas Soome void
838*a1bf3f78SToomas Soome ficlInb(ficlVm *pVM)
839*a1bf3f78SToomas Soome {
840*a1bf3f78SToomas Soome 	uint8_t c;
841*a1bf3f78SToomas Soome 	uint32_t port;
842*a1bf3f78SToomas Soome 
843*a1bf3f78SToomas Soome 	port = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
844*a1bf3f78SToomas Soome 	c = inb(port);
845*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), c);
846*a1bf3f78SToomas Soome }
847*a1bf3f78SToomas Soome 
848*a1bf3f78SToomas Soome /*
849*a1bf3f78SToomas Soome  * pcibios-device-count (devid -- count)
850*a1bf3f78SToomas Soome  *
851*a1bf3f78SToomas Soome  * Returns the PCI BIOS' count of how many devices matching devid are
852*a1bf3f78SToomas Soome  * in the system. devid is the 32-bit vendor + device.
853*a1bf3f78SToomas Soome  */
854*a1bf3f78SToomas Soome static void
855*a1bf3f78SToomas Soome ficlPciBiosCountDevices(ficlVm *pVM)
856*a1bf3f78SToomas Soome {
857*a1bf3f78SToomas Soome 	uint32_t devid;
858*a1bf3f78SToomas Soome 	int i;
859*a1bf3f78SToomas Soome 
860*a1bf3f78SToomas Soome 	devid = ficlStackPopInteger(ficlVmGetDataStack(pVM));
861*a1bf3f78SToomas Soome 
862*a1bf3f78SToomas Soome 	i = biospci_count_device_type(devid);
863*a1bf3f78SToomas Soome 
864*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), i);
865*a1bf3f78SToomas Soome }
866*a1bf3f78SToomas Soome 
867*a1bf3f78SToomas Soome /*
868*a1bf3f78SToomas Soome  * pcibios-write-config (locator offset width value -- )
869*a1bf3f78SToomas Soome  *
870*a1bf3f78SToomas Soome  * Writes the specified config register.
871*a1bf3f78SToomas Soome  * Locator is bus << 8 | device << 3 | fuction
872*a1bf3f78SToomas Soome  * offset is the pci config register
873*a1bf3f78SToomas Soome  * width is 0 for byte, 1 for word, 2 for dword
874*a1bf3f78SToomas Soome  * value is the value to write
875*a1bf3f78SToomas Soome  */
876*a1bf3f78SToomas Soome static void
877*a1bf3f78SToomas Soome ficlPciBiosWriteConfig(ficlVm *pVM)
878*a1bf3f78SToomas Soome {
879*a1bf3f78SToomas Soome 	uint32_t value, width, offset, locator;
880*a1bf3f78SToomas Soome 
881*a1bf3f78SToomas Soome 	value = ficlStackPopInteger(ficlVmGetDataStack(pVM));
882*a1bf3f78SToomas Soome 	width = ficlStackPopInteger(ficlVmGetDataStack(pVM));
883*a1bf3f78SToomas Soome 	offset = ficlStackPopInteger(ficlVmGetDataStack(pVM));
884*a1bf3f78SToomas Soome 	locator = ficlStackPopInteger(ficlVmGetDataStack(pVM));
885*a1bf3f78SToomas Soome 
886*a1bf3f78SToomas Soome 	biospci_write_config(locator, offset, width, value);
887*a1bf3f78SToomas Soome }
888*a1bf3f78SToomas Soome 
889*a1bf3f78SToomas Soome /*
890*a1bf3f78SToomas Soome  * pcibios-read-config (locator offset width -- value)
891*a1bf3f78SToomas Soome  *
892*a1bf3f78SToomas Soome  * Reads the specified config register.
893*a1bf3f78SToomas Soome  * Locator is bus << 8 | device << 3 | fuction
894*a1bf3f78SToomas Soome  * offset is the pci config register
895*a1bf3f78SToomas Soome  * width is 0 for byte, 1 for word, 2 for dword
896*a1bf3f78SToomas Soome  * value is the value to read from the register
897*a1bf3f78SToomas Soome  */
898*a1bf3f78SToomas Soome static void
899*a1bf3f78SToomas Soome ficlPciBiosReadConfig(ficlVm *pVM)
900*a1bf3f78SToomas Soome {
901*a1bf3f78SToomas Soome 	uint32_t value, width, offset, locator;
902*a1bf3f78SToomas Soome 
903*a1bf3f78SToomas Soome 	width = ficlStackPopInteger(ficlVmGetDataStack(pVM));
904*a1bf3f78SToomas Soome 	offset = ficlStackPopInteger(ficlVmGetDataStack(pVM));
905*a1bf3f78SToomas Soome 	locator = ficlStackPopInteger(ficlVmGetDataStack(pVM));
906*a1bf3f78SToomas Soome 
907*a1bf3f78SToomas Soome 	biospci_read_config(locator, offset, width, &value);
908*a1bf3f78SToomas Soome 
909*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), value);
910*a1bf3f78SToomas Soome }
911*a1bf3f78SToomas Soome 
912*a1bf3f78SToomas Soome /*
913*a1bf3f78SToomas Soome  * pcibios-find-devclass (class index -- locator)
914*a1bf3f78SToomas Soome  *
915*a1bf3f78SToomas Soome  * Finds the index'th instance of class in the pci tree.
916*a1bf3f78SToomas Soome  * must be an exact match.
917*a1bf3f78SToomas Soome  * class is the class to search for.
918*a1bf3f78SToomas Soome  * index 0..N (set to 0, increment until error)
919*a1bf3f78SToomas Soome  *
920*a1bf3f78SToomas Soome  * Locator is bus << 8 | device << 3 | fuction (or -1 on error)
921*a1bf3f78SToomas Soome  */
922*a1bf3f78SToomas Soome static void
923*a1bf3f78SToomas Soome ficlPciBiosFindDevclass(ficlVm *pVM)
924*a1bf3f78SToomas Soome {
925*a1bf3f78SToomas Soome 	uint32_t index, class, locator;
926*a1bf3f78SToomas Soome 
927*a1bf3f78SToomas Soome 	index = ficlStackPopInteger(ficlVmGetDataStack(pVM));
928*a1bf3f78SToomas Soome 	class = ficlStackPopInteger(ficlVmGetDataStack(pVM));
929*a1bf3f78SToomas Soome 
930*a1bf3f78SToomas Soome 	if (biospci_find_devclass(class, index, &locator))
931*a1bf3f78SToomas Soome 		locator = 0xffffffff;
932*a1bf3f78SToomas Soome 
933*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), locator);
934*a1bf3f78SToomas Soome }
935*a1bf3f78SToomas Soome 
936*a1bf3f78SToomas Soome /*
937*a1bf3f78SToomas Soome  * pcibios-find-device(devid index -- locator)
938*a1bf3f78SToomas Soome  *
939*a1bf3f78SToomas Soome  * Finds the index'th instance of devid in the pci tree.
940*a1bf3f78SToomas Soome  * must be an exact match.
941*a1bf3f78SToomas Soome  * class is the class to search for.
942*a1bf3f78SToomas Soome  * index 0..N (set to 0, increment until error)
943*a1bf3f78SToomas Soome  *
944*a1bf3f78SToomas Soome  * Locator is bus << 8 | device << 3 | fuction (or -1 on error)
945*a1bf3f78SToomas Soome  */
946*a1bf3f78SToomas Soome static void
947*a1bf3f78SToomas Soome ficlPciBiosFindDevice(ficlVm *pVM)
948*a1bf3f78SToomas Soome {
949*a1bf3f78SToomas Soome 	uint32_t index, devid, locator;
950*a1bf3f78SToomas Soome 
951*a1bf3f78SToomas Soome 	index = ficlStackPopInteger(ficlVmGetDataStack(pVM));
952*a1bf3f78SToomas Soome 	devid = ficlStackPopInteger(ficlVmGetDataStack(pVM));
953*a1bf3f78SToomas Soome 
954*a1bf3f78SToomas Soome 	if (biospci_find_device(devid, index, &locator))
955*a1bf3f78SToomas Soome 		locator = 0xffffffff;
956*a1bf3f78SToomas Soome 
957*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), locator);
958*a1bf3f78SToomas Soome }
959*a1bf3f78SToomas Soome 
960*a1bf3f78SToomas Soome /*
961*a1bf3f78SToomas Soome  * pcibios-find-device(bus device function -- locator)
962*a1bf3f78SToomas Soome  *
963*a1bf3f78SToomas Soome  * converts bus, device, function to locator.
964*a1bf3f78SToomas Soome  *
965*a1bf3f78SToomas Soome  * Locator is bus << 8 | device << 3 | fuction
966*a1bf3f78SToomas Soome  */
967*a1bf3f78SToomas Soome static void
968*a1bf3f78SToomas Soome ficlPciBiosLocator(ficlVm *pVM)
969*a1bf3f78SToomas Soome {
970*a1bf3f78SToomas Soome 	uint32_t bus, device, function, locator;
971*a1bf3f78SToomas Soome 
972*a1bf3f78SToomas Soome 	function = ficlStackPopInteger(ficlVmGetDataStack(pVM));
973*a1bf3f78SToomas Soome 	device = ficlStackPopInteger(ficlVmGetDataStack(pVM));
974*a1bf3f78SToomas Soome 	bus = ficlStackPopInteger(ficlVmGetDataStack(pVM));
975*a1bf3f78SToomas Soome 
976*a1bf3f78SToomas Soome 	locator = biospci_locator(bus, device, function);
977*a1bf3f78SToomas Soome 
978*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM), locator);
979*a1bf3f78SToomas Soome }
980*a1bf3f78SToomas Soome #endif
981*a1bf3f78SToomas Soome #endif
982*a1bf3f78SToomas Soome 
983*a1bf3f78SToomas Soome /*
984*a1bf3f78SToomas Soome  * Retrieves free space remaining on the dictionary
985*a1bf3f78SToomas Soome  */
986*a1bf3f78SToomas Soome static void
987*a1bf3f78SToomas Soome freeHeap(ficlVm *pVM)
988*a1bf3f78SToomas Soome {
989*a1bf3f78SToomas Soome 	ficlStackPushInteger(ficlVmGetDataStack(pVM),
990*a1bf3f78SToomas Soome 	    ficlDictionaryCellsAvailable(ficlVmGetDictionary(pVM)));
991*a1bf3f78SToomas Soome }
992*a1bf3f78SToomas Soome 
993*a1bf3f78SToomas Soome /*
994*a1bf3f78SToomas Soome  * f i c l C o m p i l e P l a t f o r m
995*a1bf3f78SToomas Soome  * Build FreeBSD platform extensions into the system dictionary
996*a1bf3f78SToomas Soome  */
997*a1bf3f78SToomas Soome void
998*a1bf3f78SToomas Soome ficlSystemCompilePlatform(ficlSystem *pSys)
999*a1bf3f78SToomas Soome {
1000*a1bf3f78SToomas Soome 	ficlDictionary *dp = ficlSystemGetDictionary(pSys);
1001*a1bf3f78SToomas Soome 	ficlDictionary *env = ficlSystemGetEnvironment(pSys);
1002*a1bf3f78SToomas Soome 
1003*a1bf3f78SToomas Soome 	FICL_SYSTEM_ASSERT(pSys, dp);
1004*a1bf3f78SToomas Soome 	FICL_SYSTEM_ASSERT(pSys, env);
1005*a1bf3f78SToomas Soome 
1006*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, ".#", displayCellNoPad,
1007*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1008*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "isdir?", isdirQuestion,
1009*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1010*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "fopen", pfopen, FICL_WORD_DEFAULT);
1011*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "fclose", pfclose, FICL_WORD_DEFAULT);
1012*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "fread", pfread, FICL_WORD_DEFAULT);
1013*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "fopendir", pfopendir,
1014*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1015*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "freaddir", pfreaddir,
1016*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1017*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "fclosedir", pfclosedir,
1018*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1019*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "fload", pfload, FICL_WORD_DEFAULT);
1020*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "fkey", fkey, FICL_WORD_DEFAULT);
1021*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "fseek", pfseek, FICL_WORD_DEFAULT);
1022*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "fwrite", pfwrite, FICL_WORD_DEFAULT);
1023*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "key", key, FICL_WORD_DEFAULT);
1024*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "key?", keyQuestion, FICL_WORD_DEFAULT);
1025*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "ms", ms, FICL_WORD_DEFAULT);
1026*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "seconds", pseconds, FICL_WORD_DEFAULT);
1027*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "heap?", freeHeap, FICL_WORD_DEFAULT);
1028*a1bf3f78SToomas Soome 
1029*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "setenv", ficlSetenv, FICL_WORD_DEFAULT);
1030*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "setenv?", ficlSetenvq,
1031*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1032*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "getenv", ficlGetenv, FICL_WORD_DEFAULT);
1033*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "unsetenv", ficlUnsetenv,
1034*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1035*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "copyin", ficlCopyin, FICL_WORD_DEFAULT);
1036*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "copyout", ficlCopyout,
1037*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1038*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "findfile", ficlFindfile,
1039*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1040*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "ccall", ficlCcall, FICL_WORD_DEFAULT);
1041*a1bf3f78SToomas Soome #ifdef STAND
1042*a1bf3f78SToomas Soome #ifdef __i386__
1043*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "outb", ficlOutb, FICL_WORD_DEFAULT);
1044*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "inb", ficlInb, FICL_WORD_DEFAULT);
1045*a1bf3f78SToomas Soome #endif
1046*a1bf3f78SToomas Soome #ifdef HAVE_PNP
1047*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "pnpdevices", ficlPnpdevices,
1048*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1049*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "pnphandlers", ficlPnphandlers,
1050*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1051*a1bf3f78SToomas Soome #endif
1052*a1bf3f78SToomas Soome #ifdef __i386__
1053*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "pcibios-device-count",
1054*a1bf3f78SToomas Soome 	    ficlPciBiosCountDevices, FICL_WORD_DEFAULT);
1055*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "pcibios-read-config",
1056*a1bf3f78SToomas Soome 	    ficlPciBiosReadConfig, FICL_WORD_DEFAULT);
1057*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "pcibios-write-config",
1058*a1bf3f78SToomas Soome 	    ficlPciBiosWriteConfig, FICL_WORD_DEFAULT);
1059*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "pcibios-find-devclass",
1060*a1bf3f78SToomas Soome 	    ficlPciBiosFindDevclass, FICL_WORD_DEFAULT);
1061*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "pcibios-find-device",
1062*a1bf3f78SToomas Soome 	    ficlPciBiosFindDevice, FICL_WORD_DEFAULT);
1063*a1bf3f78SToomas Soome 	ficlDictionarySetPrimitive(dp, "pcibios-locator", ficlPciBiosLocator,
1064*a1bf3f78SToomas Soome 	    FICL_WORD_DEFAULT);
1065*a1bf3f78SToomas Soome #endif
1066*a1bf3f78SToomas Soome #endif
1067*a1bf3f78SToomas Soome 
1068*a1bf3f78SToomas Soome #if defined(__i386__) || defined(__amd64__)
1069*a1bf3f78SToomas Soome 	ficlDictionarySetConstant(env, "arch-i386", FICL_TRUE);
1070*a1bf3f78SToomas Soome 	ficlDictionarySetConstant(env, "arch-sparc", FICL_FALSE);
1071*a1bf3f78SToomas Soome #endif
1072*a1bf3f78SToomas Soome #ifdef __sparc
1073*a1bf3f78SToomas Soome 	ficlDictionarySetConstant(env, "arch-i386", FICL_FALSE);
1074*a1bf3f78SToomas Soome 	ficlDictionarySetConstant(env, "arch-sparc", FICL_TRUE);
1075*a1bf3f78SToomas Soome #endif
1076*a1bf3f78SToomas Soome }
1077