afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Copyright (c) 2000 Daniel Capo Sobral
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * All rights reserved.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Redistribution and use in source and binary forms, with or without
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * modification, are permitted provided that the following conditions
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * are met:
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * 1. Redistributions of source code must retain the above copyright
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * notice, this list of conditions and the following disclaimer.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * 2. Redistributions in binary form must reproduce the above copyright
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * notice, this list of conditions and the following disclaimer in the
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * documentation and/or other materials provided with the distribution.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * SUCH DAMAGE.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * $FreeBSD$
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * l o a d e r . c
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Additional FICL words designed for FreeBSD's loader
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <sys/types.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <sys/stat.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <dirent.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <fcntl.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <stdio.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <stdlib.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <unistd.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <strings.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <termios.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <stand.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef __i386__
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <machine/cpufunc.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include "bootstrap.h"
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include <string.h>
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#include "ficl.h"
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeextern int biospci_count_device_type(uint32_t);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeextern int biospci_write_config(uint32_t, int, int, uint32_t);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeextern int biospci_read_config(uint32_t, int, int, uint32_t *);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeextern int biospci_find_devclass(uint32_t, int, uint32_t *);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeextern int biospci_find_device(uint32_t, int, uint32_t *);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeextern uint32_t biospci_locator(uint8_t, uint8_t, uint8_t);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * FreeBSD's loader interaction words and extras
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * setenv ( value n name n' -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * setenv? ( value n name n' flag -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * getenv ( addr n -- addr' n' | -1 )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * unsetenv ( addr n -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * copyin ( addr addr' len -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * copyout ( addr addr' len -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * findfile ( name len type len' -- addr )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * pnpdevices ( -- addr )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * pnphandlers ( -- addr )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * ccall ( [[...[p10] p9] ... p1] n addr -- result )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * .# ( value -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlSetenv(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *name, *value;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *namep, *valuep;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int names, values;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 4, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome values = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome valuep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name = (char *)ficlMalloc(names+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!name)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmThrowError(pVM, "Error: out of memory");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome strncpy(name, namep, names);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name[names] = '\0';
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome value = (char *)ficlMalloc(values+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!value)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmThrowError(pVM, "Error: out of memory");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome strncpy(value, valuep, values);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome value[values] = '\0';
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome setenv(name, value, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlFree(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlFree(value);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlSetenvq(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *name, *value;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *namep, *valuep;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int names, values, overwrite;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 5, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome overwrite = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome values = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome valuep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name = (char *)ficlMalloc(names+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!name)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmThrowError(pVM, "Error: out of memory");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome strncpy(name, namep, names);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name[names] = '\0';
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome value = (char *)ficlMalloc(values+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!value)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmThrowError(pVM, "Error: out of memory");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome strncpy(value, valuep, values);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome value[values] = '\0';
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome setenv(name, value, overwrite);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlFree(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlFree(value);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlGetenv(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *name, *value;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *namep;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int names;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 2);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name = (char *)ficlMalloc(names+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!name)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmThrowError(pVM, "Error: out of memory");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome strncpy(name, namep, names);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name[names] = '\0';
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome value = getenv(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlFree(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (value != NULL) {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushPointer(ficlVmGetDataStack(pVM), value);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), strlen(value));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome } else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlUnsetenv(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *name;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *namep;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int names;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name = (char *)ficlMalloc(names+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!name)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmThrowError(pVM, "Error: out of memory");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome strncpy(name, namep, names);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name[names] = '\0';
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome unsetenv(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlFree(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlCopyin(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome void* src;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome vm_offset_t dest;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome size_t len;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome len = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome dest = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome src = ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome archsw.arch_copyin(src, dest, len);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlCopyout(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome void* dest;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome vm_offset_t src;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome size_t len;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome len = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome dest = ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome src = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome archsw.arch_copyout(src, dest, len);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlFindfile(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *name, *type;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *namep, *typep;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int names, types;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome struct preloaded_file *fp;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 4, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome types = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome typep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name = (char *)ficlMalloc(names+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!name)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmThrowError(pVM, "Error: out of memory");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome strncpy(name, namep, names);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name[names] = '\0';
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome type = (char *)ficlMalloc(types+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!type)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmThrowError(pVM, "Error: out of memory");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome strncpy(type, typep, types);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome type[types] = '\0';
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fp = file_findfile(name, type);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fp = NULL;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushPointer(ficlVmGetDataStack(pVM), fp);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef HAVE_PNP
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlPnpdevices(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome static int pnp_devices_initted = 0;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!pnp_devices_initted) {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome STAILQ_INIT(&pnp_devices);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome pnp_devices_initted = 1;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushPointer(ficlVmGetDataStack(pVM), &pnp_devices);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlPnphandlers(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushPointer(ficlVmGetDataStack(pVM), pnphandlers);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif /* ifdef STAND */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlCcall(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int (*func)(int, ...);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int result, p[10];
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int nparam, i;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome func = (int (*)(int, ...))ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome nparam = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), nparam, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome for (i = 0; i < nparam; i++)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome p[i] = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome result = func(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8],
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome p[9]);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), result);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * f i c l E x e c F D
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * reads in text from file fd and passes it to ficlExec()
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * returns FICL_VM_STATUS_OUT_OF_TEXT on success or the ficlExec() error
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * code on failure.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#define nLINEBUF 256
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeint
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlExecFD(ficlVm *pVM, int fd)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char cp[nLINEBUF];
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int nLine = 0, rval = FICL_VM_STATUS_OUT_OF_TEXT;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char ch;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlCell id;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlString s;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome id = pVM->sourceId;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome pVM->sourceId.i = fd+1; /* in loader we can get 0, there is no stdin */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome /* feed each line to ficlExec */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome while (1) {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int status, i;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome i = 0;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome while ((status = read(fd, &ch, 1)) > 0 && ch != '\n')
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome cp[i++] = ch;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome nLine++;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!i) {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (status < 1)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome break;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome continue;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (cp[i] == '\n')
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome cp[i] = '\0';
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STRING_SET_POINTER(s, cp);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STRING_SET_LENGTH(s, i);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome rval = ficlVmExecuteString(pVM, s);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (rval != FICL_VM_STATUS_QUIT &&
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome rval != FICL_VM_STATUS_USER_EXIT &&
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome rval != FICL_VM_STATUS_OUT_OF_TEXT) {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome pVM->sourceId = id;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlVmEvaluate(pVM, "");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome return (rval);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome pVM->sourceId = id;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome /*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Pass an empty line with SOURCE-ID == -1 to flush
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * any pending REFILLs (as required by FILE wordset)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ficlVmEvaluate(pVM, "");
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (rval == FICL_VM_STATUS_USER_EXIT)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmThrow(pVM, FICL_VM_STATUS_USER_EXIT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome return (rval);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void displayCellNoPad(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlCell c;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome c = ficlStackPop(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlLtoa((c).i, pVM->pad, pVM->base);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlVmTextOut(pVM, pVM->pad);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * isdir? - Return whether an fd corresponds to a directory.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * isdir? ( fd -- bool )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeisdirQuestion(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome struct stat sb;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlInteger flag;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int fd;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flag = FICL_FALSE;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome do {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (fd < 0)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome break;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (fstat(fd, &sb) < 0)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome break;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!S_ISDIR(sb.st_mode))
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome break;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flag = FICL_TRUE;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome } while (0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fopen - open a file and return new fd on stack.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fopen ( ptr count mode -- fd )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeextern char *get_dev(const char *);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomepfopen(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int mode, fd, count;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *ptr, *name;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *tmp;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome mode = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get mode */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome count = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get count */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ptr = ficlStackPopPointer(ficlVmGetDataStack(pVM)); /* get ptr */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if ((count < 0) || (ptr == NULL)) {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome return;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome /* ensure that the string is null terminated */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name = (char *)malloc(count+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome bcopy(ptr, name, count);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name[count] = 0;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome tmp = get_dev(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome free(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name = tmp;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome /* open the file */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = open(name, mode);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome free(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), fd);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fclose - close a file who's fd is on stack.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fclose ( fd -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomepfclose(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int fd;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (fd != -1)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome close(fd);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fread - read file contents
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fread ( fd buf nbytes -- nread )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomepfread(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int fd, len;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *buf;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome len = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome buf = ficlStackPopPointer(ficlVmGetDataStack(pVM)); /* get buffer */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (len > 0 && buf && fd != -1)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM),
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome read(fd, buf, len));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fopendir - open directory
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fopendir ( addr len -- ptr TRUE | FALSE )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void pfopendir(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome DIR *dir;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *tmp;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome struct stat sb;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int fd;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int count;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *ptr, *name;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlInteger flag = FICL_FALSE;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome count = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ptr = ficlStackPopPointer(ficlVmGetDataStack(pVM)); /* get ptr */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if ((count < 0) || (ptr == NULL)) {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome return;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome /* ensure that the string is null terminated */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name = (char *)malloc(count+1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome bcopy(ptr, name, count);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name[count] = 0;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome tmp = get_dev(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome free(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome name = tmp;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = open(name, O_RDONLY);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome free(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome do {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (fd < 0)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome break;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (fstat(fd, &sb) < 0)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome break;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (!S_ISDIR(sb.st_mode))
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome break;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flag = FICL_TRUE;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), fd);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome return;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome } while (0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (fd >= 0)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome close(fd);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome return;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome dir = opendir(name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (dir == NULL) {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome return;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome } else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flag = FICL_TRUE;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushPointer(ficlVmGetDataStack(pVM), dir);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), flag);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * freaddir - read directory contents
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * freaddir ( fd -- ptr len TRUE | FALSE )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomepfreaddir(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome static DIR *dir = NULL;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int fd;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome struct dirent *d = NULL;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 3);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome /*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * libstand readdir does not always return . nor .. so filter
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * them out to have consistent behaviour.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome dir = ficlStackPopPointer(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (dir != NULL)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome do {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome d = readdir(dir);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (d != NULL && strcmp(d->d_name, ".") == 0)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome continue;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (d != NULL && strcmp(d->d_name, "..") == 0)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome continue;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome break;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome } while (d != NULL);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (fd != -1)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome do {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome d = readdirfd(fd);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (d != NULL && strcmp(d->d_name, ".") == 0)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome continue;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (d != NULL && strcmp(d->d_name, "..") == 0)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome continue;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome break;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome } while (d != NULL);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (d != NULL) {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushPointer(ficlVmGetDataStack(pVM), d->d_name);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM),
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome strlen(d->d_name));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), FICL_TRUE);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome } else {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), FICL_FALSE);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fclosedir - close a dir on stack.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fclosedir ( fd -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomepfclosedir(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome DIR *dir;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int fd;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome dir = ficlStackPopPointer(ficlVmGetDataStack(pVM)); /* get dir */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (dir != NULL)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome closedir(dir);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (fd != -1)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome close(fd);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fload - interpret file contents
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fload ( fd -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void pfload(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int fd;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (fd != -1)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlExecFD(pVM, fd);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fwrite - write file contents
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fwrite ( fd buf nbytes -- nwritten )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomepfwrite(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int fd, len;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char *buf;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome len = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* bytes to read */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome buf = ficlStackPopPointer(ficlVmGetDataStack(pVM)); /* get buffer */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = ficlStackPopInteger(ficlVmGetDataStack(pVM)); /* get fd */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (len > 0 && buf && fd != -1)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM),
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome write(fd, buf, len));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fseek - seek to a new position in a file
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fseek ( fd ofs whence -- pos )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomepfseek(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int fd, pos, whence;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 3, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome whence = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome pos = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), lseek(fd, pos, whence));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * key - get a character from stdin
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * key ( -- char )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomekey(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), getchar());
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * key? - check for a character from stdin (FACILITY)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * key? ( -- flag )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomekeyQuestion(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char ch = -1;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome struct termios oldt;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome struct termios newt;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome tcgetattr(STDIN_FILENO, &oldt);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome newt = oldt;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome newt.c_lflag &= ~(ICANON | ECHO);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome newt.c_cc[VMIN] = 0;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome newt.c_cc[VTIME] = 0;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome tcsetattr(STDIN_FILENO, TCSANOW, &newt);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ch = getchar();
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (ch != -1)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (void) ungetc(ch, stdin);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM),
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ch != -1? FICL_TRUE : FICL_FALSE);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM),
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ischar()? FICL_TRUE : FICL_FALSE);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * seconds - gives number of seconds since beginning of time
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * beginning of time is defined as:
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * BTX - number of seconds since midnight
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * FreeBSD - number of seconds since Jan 1 1970
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * seconds ( -- u )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomepseconds(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 0, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushUnsigned(ficlVmGetDataStack(pVM),
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (ficlUnsigned) time(NULL));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * ms - wait at least that many milliseconds (FACILITY)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * ms ( u -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomems(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 0);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifndef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome usleep(ficlStackPopUnsigned(ficlVmGetDataStack(pVM)) * 1000);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome delay(ficlStackPopUnsigned(ficlVmGetDataStack(pVM)) * 1000);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fkey - get a character from a file
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * fkey ( file -- char )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomefkey(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int i, fd;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome char ch;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 1, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome fd = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome i = read(fd, &ch, 1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), i > 0 ? ch : -1);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef __i386__
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * outb ( port# c -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Store a byte to I/O port number port#
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlOutb(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint8_t c;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint32_t port;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome port = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome c = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome outb(port, c);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * inb ( port# -- c )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Fetch a byte from I/O port number port#
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlInb(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint8_t c;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint32_t port;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome port = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome c = inb(port);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), c);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * pcibios-device-count (devid -- count)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Returns the PCI BIOS' count of how many devices matching devid are
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * in the system. devid is the 32-bit vendor + device.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlPciBiosCountDevices(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint32_t devid;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome int i;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome devid = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome i = biospci_count_device_type(devid);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), i);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * pcibios-write-config (locator offset width value -- )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Writes the specified config register.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Locator is bus << 8 | device << 3 | fuction
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * offset is the pci config register
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * width is 0 for byte, 1 for word, 2 for dword
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * value is the value to write
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlPciBiosWriteConfig(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint32_t value, width, offset, locator;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome value = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome width = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome offset = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome locator = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome biospci_write_config(locator, offset, width, value);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * pcibios-read-config (locator offset width -- value)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Reads the specified config register.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Locator is bus << 8 | device << 3 | fuction
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * offset is the pci config register
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * width is 0 for byte, 1 for word, 2 for dword
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * value is the value to read from the register
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlPciBiosReadConfig(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint32_t value, width, offset, locator;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome width = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome offset = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome locator = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome biospci_read_config(locator, offset, width, &value);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), value);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * pcibios-find-devclass (class index -- locator)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Finds the index'th instance of class in the pci tree.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * must be an exact match.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * class is the class to search for.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * index 0..N (set to 0, increment until error)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Locator is bus << 8 | device << 3 | fuction (or -1 on error)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlPciBiosFindDevclass(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint32_t index, class, locator;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome index = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome class = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (biospci_find_devclass(class, index, &locator))
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome locator = 0xffffffff;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), locator);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * pcibios-find-device(devid index -- locator)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Finds the index'th instance of devid in the pci tree.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * must be an exact match.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * class is the class to search for.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * index 0..N (set to 0, increment until error)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Locator is bus << 8 | device << 3 | fuction (or -1 on error)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlPciBiosFindDevice(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint32_t index, devid, locator;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome index = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome devid = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if (biospci_find_device(devid, index, &locator))
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome locator = 0xffffffff;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), locator);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * pcibios-find-device(bus device function -- locator)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * converts bus, device, function to locator.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome *
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Locator is bus << 8 | device << 3 | fuction
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlPciBiosLocator(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome uint32_t bus, device, function, locator;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome function = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome device = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome bus = ficlStackPopInteger(ficlVmGetDataStack(pVM));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome locator = biospci_locator(bus, device, function);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM), locator);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Retrieves free space remaining on the dictionary
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomestatic void
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomefreeHeap(ficlVm *pVM)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlStackPushInteger(ficlVmGetDataStack(pVM),
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionaryCellsAvailable(ficlVmGetDictionary(pVM)));
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome/*
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * f i c l C o m p i l e P l a t f o r m
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome * Build FreeBSD platform extensions into the system dictionary
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome */
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomevoid
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeficlSystemCompilePlatform(ficlSystem *pSys)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome{
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionary *dp = ficlSystemGetDictionary(pSys);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionary *env = ficlSystemGetEnvironment(pSys);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_SYSTEM_ASSERT(pSys, dp);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_SYSTEM_ASSERT(pSys, env);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, ".#", displayCellNoPad,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "isdir?", isdirQuestion,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "fopen", pfopen, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "fclose", pfclose, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "fread", pfread, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "fopendir", pfopendir,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "freaddir", pfreaddir,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "fclosedir", pfclosedir,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "fload", pfload, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "fkey", fkey, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "fseek", pfseek, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "fwrite", pfwrite, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "key", key, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "key?", keyQuestion, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "ms", ms, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "seconds", pseconds, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "heap?", freeHeap, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "setenv", ficlSetenv, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "setenv?", ficlSetenvq,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "getenv", ficlGetenv, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "unsetenv", ficlUnsetenv,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "copyin", ficlCopyin, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "copyout", ficlCopyout,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "findfile", ficlFindfile,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "ccall", ficlCcall, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef STAND
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef __i386__
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "outb", ficlOutb, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "inb", ficlInb, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef HAVE_PNP
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "pnpdevices", ficlPnpdevices,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "pnphandlers", ficlPnphandlers,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef __i386__
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "pcibios-device-count",
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlPciBiosCountDevices, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "pcibios-read-config",
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlPciBiosReadConfig, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "pcibios-write-config",
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlPciBiosWriteConfig, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "pcibios-find-devclass",
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlPciBiosFindDevclass, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "pcibios-find-device",
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlPciBiosFindDevice, FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetPrimitive(dp, "pcibios-locator", ficlPciBiosLocator,
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome FICL_WORD_DEFAULT);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#if defined(__i386__) || defined(__amd64__)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetConstant(env, "arch-i386", FICL_TRUE);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetConstant(env, "arch-sparc", FICL_FALSE);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#ifdef __sparc
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetConstant(env, "arch-i386", FICL_FALSE);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ficlDictionarySetConstant(env, "arch-sparc", FICL_TRUE);
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome#endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome}