summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/arch/unix/unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/openbios/arch/unix/unix.c')
-rw-r--r--qemu/roms/openbios/arch/unix/unix.c611
1 files changed, 0 insertions, 611 deletions
diff --git a/qemu/roms/openbios/arch/unix/unix.c b/qemu/roms/openbios/arch/unix/unix.c
deleted file mode 100644
index 1f628eb78..000000000
--- a/qemu/roms/openbios/arch/unix/unix.c
+++ /dev/null
@@ -1,611 +0,0 @@
-/* tag: hosted forth environment, executable code
- *
- * Copyright (C) 2003-2005 Patrick Mauritz, Stefan Reinauer
- *
- * See the file "COPYING" for further information about
- * the copyright and warranty status of this work.
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-#define __USE_LARGEFILE64
-#include <fcntl.h>
-#include <unistd.h>
-#include <termios.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdarg.h>
-
-#ifdef __GLIBC__
-#define _GNU_SOURCE
-#include <getopt.h>
-#endif
-
-#include "sysinclude.h"
-#include "mconfig.h"
-#include "config.h"
-#include "kernel/kernel.h"
-#include "dict.h"
-#include "kernel/stack.h"
-#include "arch/unix/plugins.h"
-#include "libopenbios/bindings.h"
-#include "libopenbios/console.h"
-#include "libopenbios/openbios.h"
-#include "openbios-version.h"
-
-#include "blk.h"
-#include "libopenbios/ofmem.h"
-
-#define MEMORY_SIZE (4*1024*1024) /* 4M ram for hosted system */
-#define DICTIONARY_SIZE (256*1024) /* 256k for the dictionary */
-
-#if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS==64)
-#define lseek lseek64
-#define __LFS O_LARGEFILE
-#else
-#define __LFS 0
-#endif
-
-/* prototypes */
-static void exit_terminal(void);
-void boot(void);
-
-unsigned long virt_offset = 0;
-
-/* local variables */
-
-static ucell *memory;
-
-static int diskemu;
-
-static int segfault = 0;
-static int verbose = 0;
-
-#if defined(CONFIG_PPC) || defined(CONFIG_SPARC64)
-unsigned long isa_io_base;
-#endif
-
-int errno_int; /* implement for fs drivers, needed to build on Mac OS X */
-
-ucell ofmem_claim(ucell addr, ucell size, ucell align)
-{
- return 0;
-}
-
-#ifdef CONFIG_PPC
-extern void flush_icache_range(char *start, char *stop);
-
-void flush_icache_range(char *start, char *stop)
-{
-}
-#endif
-
-#ifdef CONFIG_PPC
-/* Expose system level is_machine helpers to make generic code easier */
-
-#include "drivers/drivers.h"
-int is_apple(void)
-{
- return 0;
-}
-
-int is_oldworld(void)
-{
- return 0;
-}
-
-int is_newworld(void)
-{
- return 0;
-}
-#endif
-
-#if 0
-static void write_dictionary(char *filename)
-{
- FILE *f;
- xt_t initxt;
-
- initxt = findword("initialize-of");
- if (!initxt)
- printk("warning: dictionary needs word called initialize-of\n");
-
- f = fopen(filename, "w");
- if (!f) {
- printk("panic: can't open dictionary.\n");
- exit_terminal();
- exit(1);
- }
-
- fwrite(DICTID, 16, 1, f);
- fwrite(dict, dicthead, 1, f);
-
- /* Write start address and last to relocate on load */
- fwrite(&dict, sizeof(ucell), 1, f);
- fwrite(&last, sizeof(ucell), 1, f);
-
- fclose(f);
-
-#ifdef CONFIG_DEBUG_DICTIONARY
- printk("wrote dictionary to file %s.\n", filename);
-#endif
-}
-#endif
-
-static ucell read_dictionary(char *fil)
-{
- int ilen;
- ucell ret;
- char *mem;
- FILE *f;
- struct stat finfo;
-
- if (stat(fil, &finfo))
- return 0;
-
- ilen = finfo.st_size;
-
- if ((mem = malloc(ilen)) == NULL) {
- printk("panic: not enough memory.\n");
- exit_terminal();
- exit(1);
- }
-
- f = fopen(fil, "r");
- if (!f) {
- printk("panic: can't open dictionary.\n");
- exit_terminal();
- exit(1);
- }
-
- if (fread(mem, ilen, 1, f) != 1) {
- printk("panic: can't read dictionary.\n");
- fclose(f);
- exit_terminal();
- exit(1);
- }
- fclose(f);
-
- ret = load_dictionary(mem, ilen);
-
- free(mem);
- return ret;
-}
-
-
-/*
- * functions used by primitives
- */
-
-static int unix_availchar(void)
-{
- int tmp = getc(stdin);
- if (tmp != EOF) {
- ungetc(tmp, stdin);
- return -1;
- }
- return 0;
-}
-
-static int unix_putchar(int c)
-{
- putc(c, stdout);
- return c;
-}
-
-static int unix_getchar(void)
-{
- return getc(stdin);
-}
-
-static struct _console_ops unix_console_ops = {
- .putchar = unix_putchar,
- .availchar = unix_availchar,
- .getchar = unix_getchar
-};
-
-u8 inb(u32 reg)
-{
-#ifdef CONFIG_PLUGINS
- io_ops_t *ior = find_iorange(reg);
- if (ior)
- return ior->inb(reg);
-#endif
-
- printk("TRAP: io byte read @0x%x", reg);
- return 0xff;
-}
-
-u16 inw(u32 reg)
-{
-#ifdef CONFIG_PLUGINS
- io_ops_t *ior = find_iorange(reg);
- if (ior)
- return ior->inw(reg);
-#endif
-
- printk("TRAP: io word read @0x%x", reg);
- return 0xffff;
-}
-
-u32 inl(u32 reg)
-{
-#ifdef CONFIG_PLUGINS
- io_ops_t *ior = find_iorange(reg);
- if (ior)
- return ior->inl(reg);
-#endif
-
- printk("TRAP: io long read @0x%x", reg);
- return 0xffffffff;
-}
-
-void outb(u32 reg, u8 val)
-{
-#ifdef CONFIG_PLUGINS
- io_ops_t *ior = find_iorange(reg);
- if (ior) {
- ior->outb(reg, val);
- return;
- }
-#endif
-
- printk("TRAP: io byte write 0x%x -> 0x%x", val, reg);
-}
-
-void outw(u32 reg, u16 val)
-{
-#ifdef CONFIG_PLUGINS
- io_ops_t *ior = find_iorange(reg);
- if (ior) {
- ior->outw(reg, val);
- return;
- }
-#endif
- printk("TRAP: io word write 0x%x -> 0x%x", val, reg);
-}
-
-void outl(u32 reg, u32 val)
-{
-#ifdef CONFIG_PLUGINS
- io_ops_t *ior = find_iorange(reg);
- if (ior) {
- ior->outl(reg, val);
- return;
- }
-#endif
- printk("TRAP: io long write 0x%x -> 0x%x", val, reg);
-}
-
-/*
- * terminal initialization and cleanup.
- */
-
-static struct termios saved_termios;
-
-static void init_terminal(void)
-{
- struct termios termios;
-
- tcgetattr(0, &saved_termios);
- tcgetattr(0, &termios);
- termios.c_lflag &= ~(ICANON | ECHO);
- termios.c_cc[VMIN] = 1;
- termios.c_cc[VTIME] = 3; // 300 ms
- tcsetattr(0, 0, &termios);
-}
-
-static void exit_terminal(void)
-{
- tcsetattr(0, 0, &saved_termios);
-}
-
-/*
- * segmentation fault handler. linux specific?
- */
-
-static void
-segv_handler(int signo __attribute__ ((unused)),
- siginfo_t * si, void *context __attribute__ ((unused)))
-{
- static int count = 0;
- ucell addr = 0xdeadbeef;
-
- if (count) {
- printk("Died while dumping forth dictionary core.\n");
- goto out;
- }
-
- count++;
-
- if (PC >= (ucell) dict && PC <= (ucell) dict + dicthead)
- addr = *(ucell *) PC;
-
- printk("panic: segmentation violation at %x\n", (ucell)si->si_addr);
- printk("dict=0x%x here=0x%x(dict+0x%x) pc=0x%x(dict+0x%x)\n",
- (ucell)dict, (ucell)dict + dicthead, dicthead, PC, PC - (ucell) dict);
- printk("dstackcnt=%d rstackcnt=%d instruction=%x\n",
- dstackcnt, rstackcnt, addr);
-
-#ifdef CONFIG_DEBUG_DSTACK
- printdstack();
-#endif
-#ifdef CONFIG_DEBUG_RSTACK
- printrstack();
-#endif
-#if 0
- printk("Writing dictionary core file\n");
- write_dictionary("forth.dict.core");
-#endif
-
- out:
- exit_terminal();
- exit(1);
-}
-
-/*
- * Interrupt handler. linux specific?
- * Restore terminal state on ctrl-C.
- */
-
-static void
-int_handler(int signo __attribute__ ((unused)),
- siginfo_t * si __attribute__ ((unused)),
- void *context __attribute__ ((unused)))
-{
- printk("\n");
- exit_terminal();
- exit(1);
-}
-
-/*
- * allocate memory and prepare engine for memory management.
- */
-
-static void init_memory(void)
-{
- memory = malloc(MEMORY_SIZE);
- if (!memory) {
- printk("panic: not enough memory on host system.\n");
- exit_terminal();
- exit(1);
- }
-
- memset (memory, 0, MEMORY_SIZE);
- /* we push start and end of memory to the stack
- * so that it can be used by the forth word QUIT
- * to initialize the memory allocator
- */
-
- PUSH((ucell) memory);
- PUSH((ucell) memory + MEMORY_SIZE);
-}
-
-void exception(__attribute__((unused)) cell no)
-{
- /*
- * this is a noop since the dictionary has to take care
- * itself of errors it generates outside of the bootstrap
- */
-}
-
-static void
-arch_init( void )
-{
- openbios_init();
- modules_init();
- if(diskemu!=-1)
- blk_init();
-
- device_end();
- bind_func("platform-boot", boot);
-}
-
-int
-read_from_disk( int channel, int unit, int blk, unsigned long mphys, int size )
-{
- // channels and units not supported yet.
- unsigned char *buf=(unsigned char *)mphys;
-
- if(diskemu==-1)
- return -1;
-
- //printk("read: ch=%d, unit=%d, blk=%ld, phys=%lx, size=%d\n",
- // channel, unit, blk, mphys, size);
-
- lseek(diskemu, (ducell)blk*512, SEEK_SET);
- read(diskemu, buf, size);
-
- return 0;
-}
-
-/*
- * main loop
- */
-
-#define BANNER "OpenBIOS core. (C) 2003-2006 Patrick Mauritz, Stefan Reinauer\n"\
- "This software comes with absolutely no warranty. "\
- "All rights reserved.\n\n"
-
-
-#define USAGE "usage: %s [options] [dictionary file|source file]\n\n"
-
-int main(int argc, char *argv[])
-{
- struct sigaction sa;
-#if 0
- unsigned char *dictname = NULL;
-#endif
- int c;
-
- const char *optstring = "VvhsD:P:p:f:?";
-
- while (1) {
-#ifdef __GLIBC__
- int option_index = 0;
- static struct option long_options[] = {
- {"version", 0, NULL, 'V'},
- {"verbose", 0, NULL, 'v'},
- {"help", 0, NULL, 'h'},
-// {"dictionary", 1, NULL, 'D'},
- {"segfault", 0, NULL, 's'},
-#ifdef CONFIG_PLUGINS
- {"plugin-path", 1, NULL, 'P'},
- {"plugin", 1, NULL, 'p'},
-#endif
- {"file", 1, NULL, 'f'}
- };
-
- c = getopt_long(argc, argv, optstring, long_options,
- &option_index);
-#else
- c = getopt(argc, argv, optstring);
-#endif
- if (c == -1)
- break;
-
- switch (c) {
- case 'V':
- printk(BANNER "Version " OPENBIOS_VERSION_STR "\n");
- return 0;
- case 'h':
- case '?':
- printk(BANNER "Version " OPENBIOS_VERSION_STR "\n"
- USAGE, argv[0]);
- return 0;
- case 'v':
- verbose = 1;
- break;
- case 's':
- segfault = 1;
- break;
-#if 0
- case 'D':
- printk("Dumping final dictionary to '%s'\n", optarg);
- dictname = optarg;
- break;
-#endif
-#ifdef CONFIG_PLUGINS
- case 'P':
- printk("Plugin search path is now '%s'\n", optarg);
- plugindir = optarg;
- break;
- case 'p':
- printk("Loading plugin %s\n", optarg);
- load_plugin(optarg);
- break;
-#endif
- case 'f':
- diskemu=open(optarg, O_RDONLY|__LFS);
- if(diskemu!=-1)
- printk("Using %s as harddisk.\n", optarg);
- else
- printk("%s not found. no harddisk node.\n",
- optarg);
- break;
- default:
- return 1;
- }
- }
-
- if (argc < optind + 1) {
- printk(USAGE, argv[0]);
- return 1;
- }
-
- /* Initialise console */
- init_console(unix_console_ops);
-
- if ((dict = (unsigned char *) malloc(DICTIONARY_SIZE)) == NULL) {
- printk("panic: not enough memory.\n");
- return 1;
- }
-
- dictlimit = DICTIONARY_SIZE;
- memset(dict, 0, DICTIONARY_SIZE);
-
- if (!segfault) {
- if (verbose)
- printk("Installing SIGSEGV handler...");
-
- sa.sa_sigaction = segv_handler;
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = SA_SIGINFO | SA_NODEFER;
- sigaction(SIGSEGV, &sa, NULL);
-
- if (verbose)
- printk("done.\n");
- }
-
- /* set terminal to do non blocking reads */
- init_terminal();
-
- if (verbose)
- printk("Installing SIGINT handler...");
-
- sa.sa_sigaction = int_handler;
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = SA_SIGINFO | SA_NODEFER;
- sigaction(SIGINT, &sa, NULL);
-
- if (verbose)
- printk("done.\n");
-
- read_dictionary(argv[optind]);
- forth_init();
-
- PUSH_xt( bind_noname_func(arch_init) );
- fword("PREPOST-initializer");
-
- PC = (cell)findword("initialize-of");
- if (PC) {
- if (verbose) {
- if (optind + 1 != argc)
- printk("Warning: only first dictionary used.\n");
-
- printk("dictionary loaded (%d bytes).\n", dicthead);
- printk("Initializing memory...");
- }
- init_memory();
-
- if (verbose) {
- printk("done\n");
-
- printk("Jumping to dictionary...");
- }
-
- enterforth((xt_t)PC);
-#if 0
- if (dictname != NULL)
- write_dictionary(dictname);
-#endif
-
- free(memory);
-
- } else { /* input file is not a dictionary */
- printk("not supported.\n");
- }
-
- exit_terminal();
- if (diskemu!=-1)
- close(diskemu);
-
- free(dict);
- return 0;
-}
-
-#undef printk
-int
-printk( const char *fmt, ... )
-{
- int i;
-
- va_list args;
- va_start( args, fmt );
- i = vprintf(fmt, args );
- va_end( args );
- return i;
-}