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