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