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