summaryrefslogtreecommitdiff
path: root/gpxe/src/core
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2016-02-09 18:08:47 -0800
committerH. Peter Anvin <hpa@zytor.com>2016-02-09 18:08:47 -0800
commitf2f897a1762fab84d2905f32b1c15dd7b42abb56 (patch)
treea38f51d3f1fcbf44afddb4736d549c12eaf491be /gpxe/src/core
parent72d2959272b4616f17a97667e6dfa9d06bf109a3 (diff)
downloadsyslinux-f2f897a1762fab84d2905f32b1c15dd7b42abb56.tar.gz
gpxe: delete long since obsolete snapshot of gPXE
gPXE has been deprecated in favor of iPXE for many, many years now. It is much better than users get it directly from the iPXE project, since we should no longer need any special modifications for Syslinux use. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'gpxe/src/core')
-rw-r--r--gpxe/src/core/acpi.c42
-rw-r--r--gpxe/src/core/ansiesc.c116
-rw-r--r--gpxe/src/core/asprintf.c49
-rw-r--r--gpxe/src/core/base64.c68
-rw-r--r--gpxe/src/core/basename.c64
-rw-r--r--gpxe/src/core/bitmap.c101
-rw-r--r--gpxe/src/core/bitops.c13
-rw-r--r--gpxe/src/core/btext.c5039
-rw-r--r--gpxe/src/core/console.c130
-rw-r--r--gpxe/src/core/cpio.c42
-rw-r--r--gpxe/src/core/ctype.c48
-rw-r--r--gpxe/src/core/cwuri.c46
-rw-r--r--gpxe/src/core/debug.c196
-rw-r--r--gpxe/src/core/device.c107
-rw-r--r--gpxe/src/core/downloader.c291
-rw-r--r--gpxe/src/core/errno.c18
-rw-r--r--gpxe/src/core/exec.c251
-rw-r--r--gpxe/src/core/filter.c74
-rw-r--r--gpxe/src/core/gdbserial.c46
-rw-r--r--gpxe/src/core/gdbstub.c397
-rw-r--r--gpxe/src/core/gdbudp.c257
-rw-r--r--gpxe/src/core/getkey.c83
-rw-r--r--gpxe/src/core/getopt.c273
-rw-r--r--gpxe/src/core/hw.c74
-rw-r--r--gpxe/src/core/i82365.c656
-rw-r--r--gpxe/src/core/image.c328
-rw-r--r--gpxe/src/core/init.c98
-rw-r--r--gpxe/src/core/interface.c62
-rw-r--r--gpxe/src/core/iobuf.c96
-rw-r--r--gpxe/src/core/job.c97
-rw-r--r--gpxe/src/core/linebuf.c111
-rw-r--r--gpxe/src/core/main.c91
-rw-r--r--gpxe/src/core/malloc.c386
-rw-r--r--gpxe/src/core/misc.c80
-rw-r--r--gpxe/src/core/monojob.c103
-rw-r--r--gpxe/src/core/null_nap.c3
-rw-r--r--gpxe/src/core/nvo.c263
-rw-r--r--gpxe/src/core/open.c197
-rw-r--r--gpxe/src/core/pc_kbd.c112
-rw-r--r--gpxe/src/core/pcmcia.c267
-rw-r--r--gpxe/src/core/posix_io.c355
-rw-r--r--gpxe/src/core/process.c106
-rw-r--r--gpxe/src/core/proto_eth_slow.c406
-rw-r--r--gpxe/src/core/random.c41
-rw-r--r--gpxe/src/core/refcnt.c78
-rw-r--r--gpxe/src/core/resolv.c415
-rw-r--r--gpxe/src/core/serial.c254
-rw-r--r--gpxe/src/core/serial_console.c31
-rw-r--r--gpxe/src/core/settings.c1456
-rw-r--r--gpxe/src/core/string.c355
-rw-r--r--gpxe/src/core/stringextra.c273
-rw-r--r--gpxe/src/core/timer.c42
-rw-r--r--gpxe/src/core/uri.c492
-rw-r--r--gpxe/src/core/uuid.c50
-rw-r--r--gpxe/src/core/vsprintf.c423
-rw-r--r--gpxe/src/core/xfer.c417
56 files changed, 0 insertions, 15969 deletions
diff --git a/gpxe/src/core/acpi.c b/gpxe/src/core/acpi.c
deleted file mode 100644
index b65f4d48..00000000
--- a/gpxe/src/core/acpi.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <gpxe/acpi.h>
-
-/** @file
- *
- * ACPI support functions
- *
- */
-
-/**
- * Fix up ACPI table checksum
- *
- * @v acpi ACPI table header
- */
-void acpi_fix_checksum ( struct acpi_description_header *acpi ) {
- unsigned int i = 0;
- uint8_t sum = 0;
-
- for ( i = 0 ; i < acpi->length ; i++ ) {
- sum += *( ( ( uint8_t * ) acpi ) + i );
- }
- acpi->checksum -= sum;
-}
diff --git a/gpxe/src/core/ansiesc.c b/gpxe/src/core/ansiesc.c
deleted file mode 100644
index 31306e2a..00000000
--- a/gpxe/src/core/ansiesc.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <string.h>
-#include <assert.h>
-#include <gpxe/ansiesc.h>
-
-/** @file
- *
- * ANSI escape sequences
- *
- */
-
-/**
- * Call ANSI escape sequence handler
- *
- * @v handlers List of escape sequence handlers
- * @v function Control function identifier
- * @v count Parameter count
- * @v params Parameter list
- */
-static void ansiesc_call_handler ( struct ansiesc_handler *handlers,
- unsigned int function, int count,
- int params[] ) {
- struct ansiesc_handler *handler;
-
- for ( handler = handlers ; handler->function ; handler++ ) {
- if ( handler->function == function ) {
- handler->handle ( count, params );
- break;
- }
- }
-}
-
-/**
- * Process character that may be part of ANSI escape sequence
- *
- * @v ctx ANSI escape sequence context
- * @v c Character
- * @ret c Original character if not part of escape sequence
- * @ret <0 Character was part of escape sequence
- *
- * ANSI escape sequences will be plucked out of the character stream
- * and interpreted; once complete they will be passed to the
- * appropriate handler if one exists in this ANSI escape sequence
- * context.
- *
- * In the interests of code size, we are rather liberal about the
- * sequences we are prepared to accept as valid.
- */
-int ansiesc_process ( struct ansiesc_context *ctx, int c ) {
- if ( ctx->count == 0 ) {
- if ( c == ESC ) {
- /* First byte of CSI : begin escape sequence */
- ctx->count = 1;
- memset ( ctx->params, 0xff, sizeof ( ctx->params ) );
- ctx->function = 0;
- return -1;
- } else {
- /* Normal character */
- return c;
- }
- } else {
- if ( c == '[' ) {
- /* Second byte of CSI : do nothing */
- } else if ( ( c >= '0' ) && ( c <= '9' ) ) {
- /* Parameter Byte : part of a parameter value */
- int *param = &ctx->params[ctx->count - 1];
- if ( *param < 0 )
- *param = 0;
- *param = ( ( *param * 10 ) + ( c - '0' ) );
- } else if ( c == ';' ) {
- /* Parameter Byte : parameter delimiter */
- ctx->count++;
- if ( ctx->count > ( sizeof ( ctx->params ) /
- sizeof ( ctx->params[0] ) ) ) {
- /* Excessive parameters : abort sequence */
- ctx->count = 0;
- DBG ( "Too many parameters in ANSI escape "
- "sequence\n" );
- }
- } else if ( ( c >= 0x20 ) && ( c <= 0x2f ) ) {
- /* Intermediate Byte */
- ctx->function <<= 8;
- ctx->function |= c;
- } else {
- /* Treat as Final Byte. Zero ctx->count before
- * calling handler to avoid potential infinite loops.
- */
- int count = ctx->count;
- ctx->count = 0;
- ctx->function <<= 8;
- ctx->function |= c;
- ansiesc_call_handler ( ctx->handlers, ctx->function,
- count, ctx->params );
- }
- return -1;
- }
-}
diff --git a/gpxe/src/core/asprintf.c b/gpxe/src/core/asprintf.c
deleted file mode 100644
index 03cf45cf..00000000
--- a/gpxe/src/core/asprintf.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include <stdint.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-/**
- * Write a formatted string to newly allocated memory.
- *
- * @v strp Pointer to hold allocated string
- * @v fmt Format string
- * @v args Arguments corresponding to the format string
- * @ret len Length of formatted string
- */
-int vasprintf ( char **strp, const char *fmt, va_list args ) {
- size_t len;
- va_list args_tmp;
-
- /* Calculate length needed for string */
- va_copy ( args_tmp, args );
- len = ( vsnprintf ( NULL, 0, fmt, args_tmp ) + 1 );
- va_end ( args_tmp );
-
- /* Allocate and fill string */
- *strp = malloc ( len );
- if ( ! *strp )
- return -ENOMEM;
- return vsnprintf ( *strp, len, fmt, args );
-}
-
-/**
- * Write a formatted string to newly allocated memory.
- *
- * @v strp Pointer to hold allocated string
- * @v fmt Format string
- * @v ... Arguments corresponding to the format string
- * @ret len Length of formatted string
- */
-int asprintf ( char **strp, const char *fmt, ... ) {
- va_list args;
- int len;
-
- va_start ( args, fmt );
- len = vasprintf ( strp, fmt, args );
- va_end ( args );
- return len;
-}
diff --git a/gpxe/src/core/base64.c b/gpxe/src/core/base64.c
deleted file mode 100644
index 5619ef7b..00000000
--- a/gpxe/src/core/base64.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdint.h>
-#include <string.h>
-#include <assert.h>
-#include <gpxe/base64.h>
-
-/** @file
- *
- * Base64 encoding
- *
- */
-
-static const char base64[64] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-/**
- * Base64-encode a string
- *
- * @v raw Raw string
- * @v encoded Buffer for encoded string
- *
- * The buffer must be the correct length for the encoded string. Use
- * something like
- *
- * char buf[ base64_encoded_len ( strlen ( raw ) ) + 1 ];
- *
- * (the +1 is for the terminating NUL) to provide a buffer of the
- * correct size.
- */
-void base64_encode ( const char *raw, char *encoded ) {
- const uint8_t *raw_bytes = ( ( const uint8_t * ) raw );
- uint8_t *encoded_bytes = ( ( uint8_t * ) encoded );
- size_t raw_bit_len = ( 8 * strlen ( raw ) );
- unsigned int bit;
- unsigned int tmp;
-
- for ( bit = 0 ; bit < raw_bit_len ; bit += 6 ) {
- tmp = ( ( raw_bytes[ bit / 8 ] << ( bit % 8 ) ) |
- ( raw_bytes[ bit / 8 + 1 ] >> ( 8 - ( bit % 8 ) ) ) );
- tmp = ( ( tmp >> 2 ) & 0x3f );
- *(encoded_bytes++) = base64[tmp];
- }
- for ( ; ( bit % 8 ) != 0 ; bit += 6 )
- *(encoded_bytes++) = '=';
- *(encoded_bytes++) = '\0';
-
- DBG ( "Base64-encoded \"%s\" as \"%s\"\n", raw, encoded );
- assert ( strlen ( encoded ) == base64_encoded_len ( strlen ( raw ) ) );
-}
diff --git a/gpxe/src/core/basename.c b/gpxe/src/core/basename.c
deleted file mode 100644
index a481c54f..00000000
--- a/gpxe/src/core/basename.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-/**
- * @file
- *
- * Get base name of path
- *
- */
-
-#include <string.h>
-#include <libgen.h>
-
-/**
- * Return base name from path
- *
- * @v path Full path
- * @ret basename Base name
- */
-char * basename ( char *path ) {
- char *basename;
-
- basename = strrchr ( path, '/' );
- return ( basename ? ( basename + 1 ) : path );
-}
-
-/**
- * Return directory name from path
- *
- * @v path Full path
- * @ret dirname Directory name
- *
- * Note that this function may modify its argument.
- */
-char * dirname ( char *path ) {
- char *separator;
-
- separator = strrchr ( path, '/' );
- if ( separator == path ) {
- return "/";
- } else if ( separator ) {
- *separator = 0;
- return path;
- } else {
- return ".";
- }
-}
diff --git a/gpxe/src/core/bitmap.c b/gpxe/src/core/bitmap.c
deleted file mode 100644
index bbe9cbaa..00000000
--- a/gpxe/src/core/bitmap.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <errno.h>
-#include <gpxe/bitmap.h>
-
-/** @file
- *
- * Bitmaps for multicast downloads
- *
- */
-
-/**
- * Resize bitmap
- *
- * @v bitmap Bitmap
- * @v new_length New length of bitmap, in bits
- * @ret rc Return status code
- */
-int bitmap_resize ( struct bitmap *bitmap, unsigned int new_length ) {
- unsigned int old_num_blocks;
- unsigned int new_num_blocks;
- size_t new_size;
- bitmap_block_t *new_blocks;
-
- old_num_blocks = BITMAP_INDEX ( bitmap->length + BITMAP_BLKSIZE - 1 );
- new_num_blocks = BITMAP_INDEX ( new_length + BITMAP_BLKSIZE - 1 );
-
- if ( old_num_blocks != new_num_blocks ) {
- new_size = ( new_num_blocks * sizeof ( bitmap->blocks[0] ) );
- new_blocks = realloc ( bitmap->blocks, new_size );
- if ( ! new_blocks ) {
- DBGC ( bitmap, "Bitmap %p could not resize to %d "
- "bits\n", bitmap, new_length );
- return -ENOMEM;
- }
- bitmap->blocks = new_blocks;
- }
- bitmap->length = new_length;
-
- while ( old_num_blocks < new_num_blocks ) {
- bitmap->blocks[old_num_blocks++] = 0;
- }
-
- DBGC ( bitmap, "Bitmap %p resized to %d bits\n", bitmap, new_length );
- return 0;
-}
-
-/**
- * Test bit in bitmap
- *
- * @v bitmap Bitmap
- * @v bit Bit index
- * @ret is_set Bit is set
- */
-int bitmap_test ( struct bitmap *bitmap, unsigned int bit ) {
- unsigned int index = BITMAP_INDEX ( bit );
- bitmap_block_t mask = BITMAP_MASK ( bit );
-
- if ( bit >= bitmap->length )
- return 0;
- return ( bitmap->blocks[index] & mask );
-}
-
-/**
- * Set bit in bitmap
- *
- * @v bitmap Bitmap
- * @v bit Bit index
- */
-void bitmap_set ( struct bitmap *bitmap, unsigned int bit ) {
- unsigned int index = BITMAP_INDEX ( bit );
- bitmap_block_t mask = BITMAP_MASK ( bit );
-
- DBGC ( bitmap, "Bitmap %p setting bit %d\n", bitmap, bit );
-
- /* Update bitmap */
- bitmap->blocks[index] |= mask;
-
- /* Update first gap counter */
- while ( bitmap_test ( bitmap, bitmap->first_gap ) ) {
- bitmap->first_gap++;
- }
-}
diff --git a/gpxe/src/core/bitops.c b/gpxe/src/core/bitops.c
deleted file mode 100644
index 1bca9e47..00000000
--- a/gpxe/src/core/bitops.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <strings.h>
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-int __flsl ( long x ) {
- unsigned long value = x;
- int ls = 0;
-
- for ( ls = 0 ; value ; ls++ ) {
- value >>= 1;
- }
- return ls;
-}
diff --git a/gpxe/src/core/btext.c b/gpxe/src/core/btext.c
deleted file mode 100644
index 122d89fb..00000000
--- a/gpxe/src/core/btext.c
+++ /dev/null
@@ -1,5039 +0,0 @@
-#if 0
-
-/*
- * Procedures for drawing on the screen early on in the boot process.
- *
- * Benjamin Herrenschmidt <benh@kernel.crashing.org>
- *
- * move to LinuxBIOS by LYH yhlu@tyan.com
- * move to Etherboot by LYH
- */
-
-#include "console.h"
-#include <gpxe/init.h>
-#include <gpxe/pci.h>
-
-#undef __BIG_ENDIAN
-#if 0
-#define __LITTLE_ENDIAN
-#endif
-
-#include "btext.h"
-
-//#define NO_SCROLL
-
-#ifndef NO_SCROLL
-static void scrollscreen(void);
-#endif
-
-static void draw_byte(const unsigned char c, u32 locX, u32 locY);
-#if 0
-static void draw_byte_32(const unsigned char *bits, u32 *base, u32 rb);
-static void draw_byte_16(const unsigned char *bits, u32 *base, u32 rb);
-#endif
-static void draw_byte_8(const unsigned char *bits, u32 *base, u32 rb);
-
-static u32 g_loc_X;
-static u32 g_loc_Y;
-static u32 g_max_loc_X;
-static u32 g_max_loc_Y;
-
-#define CHAR_256 0
-
-#if CHAR_256==1
-#define cmapsz (16*256)
-#else
-#define cmapsz (16*96)
-#endif
-
-static const unsigned char vga_font[cmapsz];
-
-u32 boot_text_mapped;
-
-boot_infos_t disp_bi;
-
-#define BTEXT
-#define BTDATA
-
-
-/* This function will enable the early boot text when doing OF booting. This
- * way, xmon output should work too
- */
-static void
-btext_setup_display(u32 width, u32 height, u32 depth, u32 pitch,
- unsigned long address)
-{
- boot_infos_t* bi = &disp_bi;
-
- g_loc_X = 0;
- g_loc_Y = 0;
- g_max_loc_X = width / 8;
- g_max_loc_Y = height / 16;
-// bi->logicalDisplayBase = (unsigned char *)address;
- bi->dispDeviceBase = address;
- bi->dispDeviceRowBytes = pitch;
- bi->dispDeviceDepth = depth;
- bi->dispDeviceRect[0] = bi->dispDeviceRect[1] = 0;
- bi->dispDeviceRect[2] = width;
- bi->dispDeviceRect[3] = height;
- boot_text_mapped = 0;
-}
-
-/* Here's a small text engine to use during early boot
- * or for debugging purposes
- *
- * todo:
- *
- * - build some kind of vgacon with it to enable early printk
- * - move to a separate file
- * - add a few video driver hooks to keep in sync with display
- * changes.
- */
-
-static void
-map_boot_text(void)
-{
- boot_infos_t *bi = &disp_bi;
-
- if (bi->dispDeviceBase == 0)
- return;
-
- boot_text_mapped = 0;
-
- bi->logicalDisplayBase = phys_to_virt(bi->dispDeviceBase);
-
- boot_text_mapped = 1;
-}
-
-/* Calc the base address of a given point (x,y) */
-static unsigned char * BTEXT
-calc_base(boot_infos_t *bi, u32 x, u32 y)
-{
- unsigned char *base;
- base = bi->logicalDisplayBase;
-#if 0
- /* Ummm... which moron wrote this? */
- if (base == 0)
- base = bi->dispDeviceBase;
-#endif
- base += (x + bi->dispDeviceRect[0]) * (bi->dispDeviceDepth >> 3);
- base += (y + bi->dispDeviceRect[1]) * bi->dispDeviceRowBytes;
- return base;
-}
-
-
-static void BTEXT btext_clearscreen(void)
-{
- boot_infos_t* bi = &disp_bi;
- u32 *base = (u32 *)calc_base(bi, 0, 0);
- u32 width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
- (bi->dispDeviceDepth >> 3)) >> 2;
- u32 i,j;
-
- for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1]); i++)
- {
- u32 *ptr = base;
- for(j=width; j; --j)
- *(ptr++) = 0;
- base += (bi->dispDeviceRowBytes >> 2);
- }
-}
-
-#if 0
-__inline__ void dcbst(const void* addr)
-{
- __asm__ __volatile__ ("dcbst 0,%0" :: "r" (addr));
-}
-
-static void BTEXT btext_flushscreen(void)
-{
- boot_infos_t* bi = &disp_bi;
- u32 *base = (unsigned long *)calc_base(bi, 0, 0);
- u32 width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
- (bi->dispDeviceDepth >> 3)) >> 2;
- u32 i,j;
-
- for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1]); i++)
- {
- u32 *ptr = base;
- for(j=width; j>0; j-=8) {
- dcbst(ptr);
- ptr += 8;
- }
- base += (bi->dispDeviceRowBytes >> 2);
- }
-}
-#endif
-
-
-#ifndef NO_SCROLL
-static BTEXT void
-scrollscreen(void)
-{
- boot_infos_t* bi = &disp_bi;
- u32 *src = (u32 *)calc_base(bi,0,16);
- u32 *dst = (u32 *)calc_base(bi,0,0);
- u32 width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
- (bi->dispDeviceDepth >> 3)) >> 2;
- u32 i,j;
-
- for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1] - 16); i++)
- {
- u32 *src_ptr = src;
- u32 *dst_ptr = dst;
- for(j=width; j; --j)
- *(dst_ptr++) = *(src_ptr++);
- src += (bi->dispDeviceRowBytes >> 2);
- dst += (bi->dispDeviceRowBytes >> 2);
- }
- for (i=0; i<16; i++)
- {
- u32 *dst_ptr = dst;
- for(j=width; j; --j)
- *(dst_ptr++) = 0;
- dst += (bi->dispDeviceRowBytes >> 2);
- }
-}
-#endif /* ndef NO_SCROLL */
-
-static void BTEXT btext_drawchar(char c)
-{
- u32 cline = 0;
-
- if (!boot_text_mapped)
- return;
-
- switch (c) {
- case '\b':
- if (g_loc_X > 0)
- --g_loc_X;
- break;
- case '\t':
- g_loc_X = (g_loc_X & -8) + 8;
- break;
- case '\r':
- g_loc_X = 0;
- break;
- case '\n':
- g_loc_X = 0;
- g_loc_Y++;
- cline = 1;
- break;
- default:
- draw_byte(c, g_loc_X++, g_loc_Y);
- }
- if (g_loc_X >= g_max_loc_X) {
- g_loc_X = 0;
- g_loc_Y++;
- cline = 1;
- }
-#ifndef NO_SCROLL
- while (g_loc_Y >= g_max_loc_Y) {
- scrollscreen();
- g_loc_Y--;
- }
-#else
- /* wrap around from bottom to top of screen so we don't
- waste time scrolling each line. -- paulus. */
- if (g_loc_Y >= g_max_loc_Y)
- g_loc_Y = 0;
- if (cline) {
- for (x = 0; x < g_max_loc_X; ++x)
- draw_byte(' ', x, g_loc_Y);
- }
-#endif
-}
-#if 0
-static void BTEXT
-btext_drawstring(const char *c)
-{
- if (!boot_text_mapped)
- return;
- while (*c)
- btext_drawchar(*c++);
-}
-static void BTEXT
-btext_drawhex(u32 v)
-{
- static char hex_table[] = "0123456789abcdef";
-
- if (!boot_text_mapped)
- return;
- btext_drawchar(hex_table[(v >> 28) & 0x0000000FUL]);
- btext_drawchar(hex_table[(v >> 24) & 0x0000000FUL]);
- btext_drawchar(hex_table[(v >> 20) & 0x0000000FUL]);
- btext_drawchar(hex_table[(v >> 16) & 0x0000000FUL]);
- btext_drawchar(hex_table[(v >> 12) & 0x0000000FUL]);
- btext_drawchar(hex_table[(v >> 8) & 0x0000000FUL]);
- btext_drawchar(hex_table[(v >> 4) & 0x0000000FUL]);
- btext_drawchar(hex_table[(v >> 0) & 0x0000000FUL]);
- btext_drawchar(' ');
-}
-#endif
-
-static void BTEXT
-draw_byte(const unsigned char c, u32 locX, u32 locY)
-{
- boot_infos_t* bi = &disp_bi;
- unsigned char *base = calc_base(bi, locX << 3, locY << 4);
-#if CHAR_256==1
- unsigned const char *font = &vga_font[(((u32)c)) * 16];
-#else
- unsigned const char *font = &vga_font[(((u32)c-0x20)) * 16];
-#endif
-
- u32 rb = bi->dispDeviceRowBytes;
-
- switch(bi->dispDeviceDepth) {
-#if 0
- case 24:
- case 32:
- draw_byte_32(font, (u32 *)base, rb);
- break;
- case 15:
- case 16:
- draw_byte_16(font, (u32 *)base, rb);
- break;
-#endif
- case 8:
- draw_byte_8(font, (u32 *)base, rb);
- break;
- }
-}
-static u32 expand_bits_8[16] BTDATA = {
-#if defined(__BIG_ENDIAN)
- 0x00000000,0x000000ff,0x0000ff00,0x0000ffff,
- 0x00ff0000,0x00ff00ff,0x00ffff00,0x00ffffff,
- 0xff000000,0xff0000ff,0xff00ff00,0xff00ffff,
- 0xffff0000,0xffff00ff,0xffffff00,0xffffffff
-#elif defined(__LITTLE_ENDIAN)
- 0x00000000,0xff000000,0x00ff0000,0xffff0000,
- 0x0000ff00,0xff00ff00,0x00ffff00,0xffffff00,
- 0x000000ff,0xff0000ff,0x00ff00ff,0xffff00ff,
- 0x0000ffff,0xff00ffff,0x00ffffff,0xffffffff
-#else
-#error FIXME: No endianness??
-#endif
-};
-#if 0
-static const u32 expand_bits_16[4] BTDATA = {
-#if defined(__BIG_ENDIAN)
- 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff
-#elif defined(__LITTLE_ENDIAN)
- 0x00000000, 0xffff0000, 0x0000ffff, 0xffffffff
-#else
-#error FIXME: No endianness??
-#endif
-};
-#endif
-#if 0
-static void BTEXT
-draw_byte_32(const unsigned char *font, u32 *base, u32 rb)
-{
- u32 l, bits;
- u32 fg = 0xFFFFFFFF;
- u32 bg = 0x00000000;
-
- for (l = 0; l < 16; ++l)
- {
- bits = *font++;
- base[0] = (-(bits >> 7) & fg) ^ bg;
- base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
- base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
- base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
- base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
- base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
- base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
- base[7] = (-(bits & 1) & fg) ^ bg;
- base = (u32 *) ((char *)base + rb);
- }
-}
-
-static void BTEXT
-draw_byte_16(const unsigned char *font, u32 *base, u32 rb)
-{
- u32 l, bits;
- u32 fg = 0xFFFFFFFF;
- u32 bg = 0x00000000;
- u32 *eb = expand_bits_16;
-
- for (l = 0; l < 16; ++l)
- {
- bits = *font++;
- base[0] = (eb[bits >> 6] & fg) ^ bg;
- base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
- base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
- base[3] = (eb[bits & 3] & fg) ^ bg;
- base = (u32 *) ((char *)base + rb);
- }
-}
-#endif
-static void BTEXT
-draw_byte_8(const unsigned char *font, u32 *base, u32 rb)
-{
- u32 l, bits;
- u32 fg = 0x0F0F0F0F;
- u32 bg = 0x00000000;
- u32 *eb = expand_bits_8;
-
- for (l = 0; l < 16; ++l)
- {
- bits = *font++;
- base[0] = (eb[bits >> 4] & fg) ^ bg;
- base[1] = (eb[bits & 0xf] & fg) ^ bg;
- base = (u32 *) ((char *)base + rb);
- }
-}
-
-static void btext_init(void)
-{
-#if 0
-// for debug
-#define frame_buffer 0xfc000000
-#else
- uint32_t frame_buffer;// 0xfc000000
-
- struct pci_device dev;
-
- #warning "pci_find_device_x no longer exists; use find_pci_device instead"
- /* pci_find_device_x(0x1002, 0x4752, 0, &dev); */
- if(dev.vendor==0) return; // no fb
-
- frame_buffer = (uint32_t)dev.membase;
-#endif
-
- btext_setup_display(640, 480, 8, 640,frame_buffer);
- btext_clearscreen();
- map_boot_text();
-}
-static void btext_putc(int c)
-{
- btext_drawchar((unsigned char)c);
-}
-
-struct console_driver btext_console __console_driver = {
- .putchar = btext_putc,
- .disabled = 1,
-};
-
-//come from linux/drivers/video/font-8x16.c
-/**********************************************/
-/* */
-/* Font file generated by cpi2fnt */
-/* */
-/**********************************************/
-
-
-static const unsigned char vga_font[cmapsz] BTDATA = {
-#if CHAR_256==1
- /* 0 0x00 '^@' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 1 0x01 '^A' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x81, /* 10000001 */
- 0xa5, /* 10100101 */
- 0x81, /* 10000001 */
- 0x81, /* 10000001 */
- 0xbd, /* 10111101 */
- 0x99, /* 10011001 */
- 0x81, /* 10000001 */
- 0x81, /* 10000001 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 2 0x02 '^B' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0xff, /* 11111111 */
- 0xdb, /* 11011011 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xc3, /* 11000011 */
- 0xe7, /* 11100111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 3 0x03 '^C' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x6c, /* 01101100 */
- 0xfe, /* 11111110 */
- 0xfe, /* 11111110 */
- 0xfe, /* 11111110 */
- 0xfe, /* 11111110 */
- 0x7c, /* 01111100 */
- 0x38, /* 00111000 */
- 0x10, /* 00010000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 4 0x04 '^D' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x7c, /* 01111100 */
- 0xfe, /* 11111110 */
- 0x7c, /* 01111100 */
- 0x38, /* 00111000 */
- 0x10, /* 00010000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 5 0x05 '^E' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x3c, /* 00111100 */
- 0xe7, /* 11100111 */
- 0xe7, /* 11100111 */
- 0xe7, /* 11100111 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 6 0x06 '^F' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x7e, /* 01111110 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 7 0x07 '^G' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 8 0x08 '^H' */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xe7, /* 11100111 */
- 0xc3, /* 11000011 */
- 0xc3, /* 11000011 */
- 0xe7, /* 11100111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
-
- /* 9 0x09 '^I' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x66, /* 01100110 */
- 0x42, /* 01000010 */
- 0x42, /* 01000010 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 10 0x0a '^J' */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xc3, /* 11000011 */
- 0x99, /* 10011001 */
- 0xbd, /* 10111101 */
- 0xbd, /* 10111101 */
- 0x99, /* 10011001 */
- 0xc3, /* 11000011 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
-
- /* 11 0x0b '^K' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x1e, /* 00011110 */
- 0x0e, /* 00001110 */
- 0x1a, /* 00011010 */
- 0x32, /* 00110010 */
- 0x78, /* 01111000 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x78, /* 01111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 12 0x0c '^L' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 13 0x0d '^M' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3f, /* 00111111 */
- 0x33, /* 00110011 */
- 0x3f, /* 00111111 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x70, /* 01110000 */
- 0xf0, /* 11110000 */
- 0xe0, /* 11100000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 14 0x0e '^N' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7f, /* 01111111 */
- 0x63, /* 01100011 */
- 0x7f, /* 01111111 */
- 0x63, /* 01100011 */
- 0x63, /* 01100011 */
- 0x63, /* 01100011 */
- 0x63, /* 01100011 */
- 0x67, /* 01100111 */
- 0xe7, /* 11100111 */
- 0xe6, /* 11100110 */
- 0xc0, /* 11000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 15 0x0f '^O' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xdb, /* 11011011 */
- 0x3c, /* 00111100 */
- 0xe7, /* 11100111 */
- 0x3c, /* 00111100 */
- 0xdb, /* 11011011 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 16 0x10 '^P' */
- 0x00, /* 00000000 */
- 0x80, /* 10000000 */
- 0xc0, /* 11000000 */
- 0xe0, /* 11100000 */
- 0xf0, /* 11110000 */
- 0xf8, /* 11111000 */
- 0xfe, /* 11111110 */
- 0xf8, /* 11111000 */
- 0xf0, /* 11110000 */
- 0xe0, /* 11100000 */
- 0xc0, /* 11000000 */
- 0x80, /* 10000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 17 0x11 '^Q' */
- 0x00, /* 00000000 */
- 0x02, /* 00000010 */
- 0x06, /* 00000110 */
- 0x0e, /* 00001110 */
- 0x1e, /* 00011110 */
- 0x3e, /* 00111110 */
- 0xfe, /* 11111110 */
- 0x3e, /* 00111110 */
- 0x1e, /* 00011110 */
- 0x0e, /* 00001110 */
- 0x06, /* 00000110 */
- 0x02, /* 00000010 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 18 0x12 '^R' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 19 0x13 '^S' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x00, /* 00000000 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 20 0x14 '^T' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7f, /* 01111111 */
- 0xdb, /* 11011011 */
- 0xdb, /* 11011011 */
- 0xdb, /* 11011011 */
- 0x7b, /* 01111011 */
- 0x1b, /* 00011011 */
- 0x1b, /* 00011011 */
- 0x1b, /* 00011011 */
- 0x1b, /* 00011011 */
- 0x1b, /* 00011011 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 21 0x15 '^U' */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0x60, /* 01100000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x0c, /* 00001100 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 22 0x16 '^V' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0xfe, /* 11111110 */
- 0xfe, /* 11111110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 23 0x17 '^W' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 24 0x18 '^X' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 25 0x19 '^Y' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 26 0x1a '^Z' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x0c, /* 00001100 */
- 0xfe, /* 11111110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 27 0x1b '^[' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0xfe, /* 11111110 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 28 0x1c '^\' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 29 0x1d '^]' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x28, /* 00101000 */
- 0x6c, /* 01101100 */
- 0xfe, /* 11111110 */
- 0x6c, /* 01101100 */
- 0x28, /* 00101000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 30 0x1e '^^' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x38, /* 00111000 */
- 0x7c, /* 01111100 */
- 0x7c, /* 01111100 */
- 0xfe, /* 11111110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 31 0x1f '^_' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0xfe, /* 11111110 */
- 0x7c, /* 01111100 */
- 0x7c, /* 01111100 */
- 0x38, /* 00111000 */
- 0x38, /* 00111000 */
- 0x10, /* 00010000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-#endif
- /* 32 0x20 ' ' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 33 0x21 '!' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x3c, /* 00111100 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 34 0x22 '"' */
- 0x00, /* 00000000 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x24, /* 00100100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 35 0x23 '#' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0xfe, /* 11111110 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0xfe, /* 11111110 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 36 0x24 '$' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc2, /* 11000010 */
- 0xc0, /* 11000000 */
- 0x7c, /* 01111100 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x86, /* 10000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 37 0x25 '%' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc2, /* 11000010 */
- 0xc6, /* 11000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0xc6, /* 11000110 */
- 0x86, /* 10000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 38 0x26 '&' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x76, /* 01110110 */
- 0xdc, /* 11011100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 39 0x27 ''' */
- 0x00, /* 00000000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 40 0x28 '(' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x0c, /* 00001100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 41 0x29 ')' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 42 0x2a '*' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0xff, /* 11111111 */
- 0x3c, /* 00111100 */
- 0x66, /* 01100110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 43 0x2b '+' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 44 0x2c ',' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 45 0x2d '-' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 46 0x2e '.' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 47 0x2f '/' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x02, /* 00000010 */
- 0x06, /* 00000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0xc0, /* 11000000 */
- 0x80, /* 10000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 48 0x30 '0' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xd6, /* 11010110 */
- 0xd6, /* 11010110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 49 0x31 '1' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x38, /* 00111000 */
- 0x78, /* 01111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 50 0x32 '2' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0x06, /* 00000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 51 0x33 '3' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x3c, /* 00111100 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 52 0x34 '4' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x0c, /* 00001100 */
- 0x1c, /* 00011100 */
- 0x3c, /* 00111100 */
- 0x6c, /* 01101100 */
- 0xcc, /* 11001100 */
- 0xfe, /* 11111110 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x1e, /* 00011110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 53 0x35 '5' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xfc, /* 11111100 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 54 0x36 '6' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x60, /* 01100000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xfc, /* 11111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 55 0x37 '7' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0xc6, /* 11000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 56 0x38 '8' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 57 0x39 '9' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7e, /* 01111110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x0c, /* 00001100 */
- 0x78, /* 01111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 58 0x3a ':' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 59 0x3b ';' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 60 0x3c '<' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x06, /* 00000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x0c, /* 00001100 */
- 0x06, /* 00000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 61 0x3d '=' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 62 0x3e '>' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x0c, /* 00001100 */
- 0x06, /* 00000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 63 0x3f '?' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 64 0x40 '@' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xde, /* 11011110 */
- 0xde, /* 11011110 */
- 0xde, /* 11011110 */
- 0xdc, /* 11011100 */
- 0xc0, /* 11000000 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 65 0x41 'A' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 66 0x42 'B' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfc, /* 11111100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x7c, /* 01111100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0xfc, /* 11111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 67 0x43 'C' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x66, /* 01100110 */
- 0xc2, /* 11000010 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc2, /* 11000010 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 68 0x44 'D' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xf8, /* 11111000 */
- 0x6c, /* 01101100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x6c, /* 01101100 */
- 0xf8, /* 11111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 69 0x45 'E' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x66, /* 01100110 */
- 0x62, /* 01100010 */
- 0x68, /* 01101000 */
- 0x78, /* 01111000 */
- 0x68, /* 01101000 */
- 0x60, /* 01100000 */
- 0x62, /* 01100010 */
- 0x66, /* 01100110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 70 0x46 'F' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x66, /* 01100110 */
- 0x62, /* 01100010 */
- 0x68, /* 01101000 */
- 0x78, /* 01111000 */
- 0x68, /* 01101000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0xf0, /* 11110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 71 0x47 'G' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x66, /* 01100110 */
- 0xc2, /* 11000010 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xde, /* 11011110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x66, /* 01100110 */
- 0x3a, /* 00111010 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 72 0x48 'H' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 73 0x49 'I' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 74 0x4a 'J' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x1e, /* 00011110 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x78, /* 01111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 75 0x4b 'K' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xe6, /* 11100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x6c, /* 01101100 */
- 0x78, /* 01111000 */
- 0x78, /* 01111000 */
- 0x6c, /* 01101100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0xe6, /* 11100110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 76 0x4c 'L' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xf0, /* 11110000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x62, /* 01100010 */
- 0x66, /* 01100110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 77 0x4d 'M' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xee, /* 11101110 */
- 0xfe, /* 11111110 */
- 0xfe, /* 11111110 */
- 0xd6, /* 11010110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 78 0x4e 'N' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xe6, /* 11100110 */
- 0xf6, /* 11110110 */
- 0xfe, /* 11111110 */
- 0xde, /* 11011110 */
- 0xce, /* 11001110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 79 0x4f 'O' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 80 0x50 'P' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfc, /* 11111100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x7c, /* 01111100 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0xf0, /* 11110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 81 0x51 'Q' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xd6, /* 11010110 */
- 0xde, /* 11011110 */
- 0x7c, /* 01111100 */
- 0x0c, /* 00001100 */
- 0x0e, /* 00001110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 82 0x52 'R' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfc, /* 11111100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x7c, /* 01111100 */
- 0x6c, /* 01101100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0xe6, /* 11100110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 83 0x53 'S' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x60, /* 01100000 */
- 0x38, /* 00111000 */
- 0x0c, /* 00001100 */
- 0x06, /* 00000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 84 0x54 'T' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x7e, /* 01111110 */
- 0x5a, /* 01011010 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 85 0x55 'U' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 86 0x56 'V' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x10, /* 00010000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 87 0x57 'W' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xd6, /* 11010110 */
- 0xd6, /* 11010110 */
- 0xd6, /* 11010110 */
- 0xfe, /* 11111110 */
- 0xee, /* 11101110 */
- 0x6c, /* 01101100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 88 0x58 'X' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x6c, /* 01101100 */
- 0x7c, /* 01111100 */
- 0x38, /* 00111000 */
- 0x38, /* 00111000 */
- 0x7c, /* 01111100 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 89 0x59 'Y' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 90 0x5a 'Z' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0xc6, /* 11000110 */
- 0x86, /* 10000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0xc2, /* 11000010 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 91 0x5b '[' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 92 0x5c '\' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x80, /* 10000000 */
- 0xc0, /* 11000000 */
- 0xe0, /* 11100000 */
- 0x70, /* 01110000 */
- 0x38, /* 00111000 */
- 0x1c, /* 00011100 */
- 0x0e, /* 00001110 */
- 0x06, /* 00000110 */
- 0x02, /* 00000010 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 93 0x5d ']' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 94 0x5e '^' */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 95 0x5f '_' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 96 0x60 '`' */
- 0x00, /* 00000000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x0c, /* 00001100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 97 0x61 'a' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x78, /* 01111000 */
- 0x0c, /* 00001100 */
- 0x7c, /* 01111100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 98 0x62 'b' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xe0, /* 11100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x78, /* 01111000 */
- 0x6c, /* 01101100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 99 0x63 'c' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 100 0x64 'd' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x1c, /* 00011100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x3c, /* 00111100 */
- 0x6c, /* 01101100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 101 0x65 'e' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 102 0x66 'f' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x1c, /* 00011100 */
- 0x36, /* 00110110 */
- 0x32, /* 00110010 */
- 0x30, /* 00110000 */
- 0x78, /* 01111000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x78, /* 01111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 103 0x67 'g' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x76, /* 01110110 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x7c, /* 01111100 */
- 0x0c, /* 00001100 */
- 0xcc, /* 11001100 */
- 0x78, /* 01111000 */
- 0x00, /* 00000000 */
-
- /* 104 0x68 'h' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xe0, /* 11100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x6c, /* 01101100 */
- 0x76, /* 01110110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0xe6, /* 11100110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 105 0x69 'i' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 106 0x6a 'j' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x00, /* 00000000 */
- 0x0e, /* 00001110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
-
- /* 107 0x6b 'k' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xe0, /* 11100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x66, /* 01100110 */
- 0x6c, /* 01101100 */
- 0x78, /* 01111000 */
- 0x78, /* 01111000 */
- 0x6c, /* 01101100 */
- 0x66, /* 01100110 */
- 0xe6, /* 11100110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 108 0x6c 'l' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 109 0x6d 'm' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xec, /* 11101100 */
- 0xfe, /* 11111110 */
- 0xd6, /* 11010110 */
- 0xd6, /* 11010110 */
- 0xd6, /* 11010110 */
- 0xd6, /* 11010110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 110 0x6e 'n' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xdc, /* 11011100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 111 0x6f 'o' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 112 0x70 'p' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xdc, /* 11011100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x7c, /* 01111100 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0xf0, /* 11110000 */
- 0x00, /* 00000000 */
-
- /* 113 0x71 'q' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x76, /* 01110110 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x7c, /* 01111100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x1e, /* 00011110 */
- 0x00, /* 00000000 */
-
- /* 114 0x72 'r' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xdc, /* 11011100 */
- 0x76, /* 01110110 */
- 0x66, /* 01100110 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0xf0, /* 11110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 115 0x73 's' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0x60, /* 01100000 */
- 0x38, /* 00111000 */
- 0x0c, /* 00001100 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 116 0x74 't' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x10, /* 00010000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0xfc, /* 11111100 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x36, /* 00110110 */
- 0x1c, /* 00011100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 117 0x75 'u' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 118 0x76 'v' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 119 0x77 'w' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xd6, /* 11010110 */
- 0xd6, /* 11010110 */
- 0xd6, /* 11010110 */
- 0xfe, /* 11111110 */
- 0x6c, /* 01101100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 120 0x78 'x' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x38, /* 00111000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 121 0x79 'y' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7e, /* 01111110 */
- 0x06, /* 00000110 */
- 0x0c, /* 00001100 */
- 0xf8, /* 11111000 */
- 0x00, /* 00000000 */
-
- /* 122 0x7a 'z' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0xcc, /* 11001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 123 0x7b '{' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x0e, /* 00001110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x70, /* 01110000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x0e, /* 00001110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 124 0x7c '|' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 125 0x7d '}' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x70, /* 01110000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x0e, /* 00001110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x70, /* 01110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 126 0x7e '~' */
- 0x00, /* 00000000 */
- 0x76, /* 01110110 */
- 0xdc, /* 11011100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 127 0x7f '' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-#if CHAR_256256==1
- /* 128 0x80 '€' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x66, /* 01100110 */
- 0xc2, /* 11000010 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc2, /* 11000010 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x70, /* 01110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 129 0x81 '' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xcc, /* 11001100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 130 0x82 '‚' */
- 0x00, /* 00000000 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 131 0x83 'ƒ' */
- 0x00, /* 00000000 */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0x00, /* 00000000 */
- 0x78, /* 01111000 */
- 0x0c, /* 00001100 */
- 0x7c, /* 01111100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 132 0x84 '„' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xcc, /* 11001100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x78, /* 01111000 */
- 0x0c, /* 00001100 */
- 0x7c, /* 01111100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 133 0x85 '…' */
- 0x00, /* 00000000 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x78, /* 01111000 */
- 0x0c, /* 00001100 */
- 0x7c, /* 01111100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 134 0x86 '†' */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x00, /* 00000000 */
- 0x78, /* 01111000 */
- 0x0c, /* 00001100 */
- 0x7c, /* 01111100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 135 0x87 '‡' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x18, /* 00011000 */
- 0x70, /* 01110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 136 0x88 'ˆ' */
- 0x00, /* 00000000 */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 137 0x89 '‰' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 138 0x8a 'Š' */
- 0x00, /* 00000000 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 139 0x8b '‹' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x66, /* 01100110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 140 0x8c 'Œ' */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x66, /* 01100110 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 141 0x8d '' */
- 0x00, /* 00000000 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 142 0x8e 'Ž' */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 143 0x8f '' */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 144 0x90 '' */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x66, /* 01100110 */
- 0x62, /* 01100010 */
- 0x68, /* 01101000 */
- 0x78, /* 01111000 */
- 0x68, /* 01101000 */
- 0x62, /* 01100010 */
- 0x66, /* 01100110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 145 0x91 '‘' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xec, /* 11101100 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x7e, /* 01111110 */
- 0xd8, /* 11011000 */
- 0xd8, /* 11011000 */
- 0x6e, /* 01101110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 146 0x92 '’' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3e, /* 00111110 */
- 0x6c, /* 01101100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xfe, /* 11111110 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xce, /* 11001110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 147 0x93 '“' */
- 0x00, /* 00000000 */
- 0x10, /* 00010000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 148 0x94 '”' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 149 0x95 '•' */
- 0x00, /* 00000000 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 150 0x96 '–' */
- 0x00, /* 00000000 */
- 0x30, /* 00110000 */
- 0x78, /* 01111000 */
- 0xcc, /* 11001100 */
- 0x00, /* 00000000 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 151 0x97 '—' */
- 0x00, /* 00000000 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 152 0x98 '˜' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7e, /* 01111110 */
- 0x06, /* 00000110 */
- 0x0c, /* 00001100 */
- 0x78, /* 01111000 */
- 0x00, /* 00000000 */
-
- /* 153 0x99 '™' */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 154 0x9a 'š' */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 155 0x9b '›' */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 156 0x9c 'œ' */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0x64, /* 01100100 */
- 0x60, /* 01100000 */
- 0xf0, /* 11110000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0xe6, /* 11100110 */
- 0xfc, /* 11111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 157 0x9d '' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 158 0x9e 'ž' */
- 0x00, /* 00000000 */
- 0xf8, /* 11111000 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xf8, /* 11111000 */
- 0xc4, /* 11000100 */
- 0xcc, /* 11001100 */
- 0xde, /* 11011110 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 159 0x9f 'Ÿ' */
- 0x00, /* 00000000 */
- 0x0e, /* 00001110 */
- 0x1b, /* 00011011 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xd8, /* 11011000 */
- 0x70, /* 01110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 160 0xa0 ' ' */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0x00, /* 00000000 */
- 0x78, /* 01111000 */
- 0x0c, /* 00001100 */
- 0x7c, /* 01111100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 161 0xa1 '¡' */
- 0x00, /* 00000000 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 162 0xa2 '¢' */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 163 0xa3 '£' */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0x00, /* 00000000 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 164 0xa4 '¤' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x76, /* 01110110 */
- 0xdc, /* 11011100 */
- 0x00, /* 00000000 */
- 0xdc, /* 11011100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 165 0xa5 '¥' */
- 0x76, /* 01110110 */
- 0xdc, /* 11011100 */
- 0x00, /* 00000000 */
- 0xc6, /* 11000110 */
- 0xe6, /* 11100110 */
- 0xf6, /* 11110110 */
- 0xfe, /* 11111110 */
- 0xde, /* 11011110 */
- 0xce, /* 11001110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 166 0xa6 '¦' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x3e, /* 00111110 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 167 0xa7 '§' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 168 0xa8 '¨' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x00, /* 00000000 */
- 0x30, /* 00110000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0xc0, /* 11000000 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x7c, /* 01111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 169 0xa9 '©' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 170 0xaa 'ª' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 171 0xab '«' */
- 0x00, /* 00000000 */
- 0x60, /* 01100000 */
- 0xe0, /* 11100000 */
- 0x62, /* 01100010 */
- 0x66, /* 01100110 */
- 0x6c, /* 01101100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0xdc, /* 11011100 */
- 0x86, /* 10000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x3e, /* 00111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 172 0xac '¬' */
- 0x00, /* 00000000 */
- 0x60, /* 01100000 */
- 0xe0, /* 11100000 */
- 0x62, /* 01100010 */
- 0x66, /* 01100110 */
- 0x6c, /* 01101100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x66, /* 01100110 */
- 0xce, /* 11001110 */
- 0x9a, /* 10011010 */
- 0x3f, /* 00111111 */
- 0x06, /* 00000110 */
- 0x06, /* 00000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 173 0xad '­' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x3c, /* 00111100 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 174 0xae '®' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x36, /* 00110110 */
- 0x6c, /* 01101100 */
- 0xd8, /* 11011000 */
- 0x6c, /* 01101100 */
- 0x36, /* 00110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 175 0xaf '¯' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xd8, /* 11011000 */
- 0x6c, /* 01101100 */
- 0x36, /* 00110110 */
- 0x6c, /* 01101100 */
- 0xd8, /* 11011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 176 0xb0 '°' */
- 0x11, /* 00010001 */
- 0x44, /* 01000100 */
- 0x11, /* 00010001 */
- 0x44, /* 01000100 */
- 0x11, /* 00010001 */
- 0x44, /* 01000100 */
- 0x11, /* 00010001 */
- 0x44, /* 01000100 */
- 0x11, /* 00010001 */
- 0x44, /* 01000100 */
- 0x11, /* 00010001 */
- 0x44, /* 01000100 */
- 0x11, /* 00010001 */
- 0x44, /* 01000100 */
- 0x11, /* 00010001 */
- 0x44, /* 01000100 */
-
- /* 177 0xb1 '±' */
- 0x55, /* 01010101 */
- 0xaa, /* 10101010 */
- 0x55, /* 01010101 */
- 0xaa, /* 10101010 */
- 0x55, /* 01010101 */
- 0xaa, /* 10101010 */
- 0x55, /* 01010101 */
- 0xaa, /* 10101010 */
- 0x55, /* 01010101 */
- 0xaa, /* 10101010 */
- 0x55, /* 01010101 */
- 0xaa, /* 10101010 */
- 0x55, /* 01010101 */
- 0xaa, /* 10101010 */
- 0x55, /* 01010101 */
- 0xaa, /* 10101010 */
-
- /* 178 0xb2 '²' */
- 0xdd, /* 11011101 */
- 0x77, /* 01110111 */
- 0xdd, /* 11011101 */
- 0x77, /* 01110111 */
- 0xdd, /* 11011101 */
- 0x77, /* 01110111 */
- 0xdd, /* 11011101 */
- 0x77, /* 01110111 */
- 0xdd, /* 11011101 */
- 0x77, /* 01110111 */
- 0xdd, /* 11011101 */
- 0x77, /* 01110111 */
- 0xdd, /* 11011101 */
- 0x77, /* 01110111 */
- 0xdd, /* 11011101 */
- 0x77, /* 01110111 */
-
- /* 179 0xb3 '³' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 180 0xb4 '´' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xf8, /* 11111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 181 0xb5 'µ' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xf8, /* 11111000 */
- 0x18, /* 00011000 */
- 0xf8, /* 11111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 182 0xb6 '¶' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0xf6, /* 11110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 183 0xb7 '·' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 184 0xb8 '¸' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xf8, /* 11111000 */
- 0x18, /* 00011000 */
- 0xf8, /* 11111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 185 0xb9 '¹' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0xf6, /* 11110110 */
- 0x06, /* 00000110 */
- 0xf6, /* 11110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 186 0xba 'º' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 187 0xbb '»' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x06, /* 00000110 */
- 0xf6, /* 11110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 188 0xbc '¼' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0xf6, /* 11110110 */
- 0x06, /* 00000110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 189 0xbd '½' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 190 0xbe '¾' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xf8, /* 11111000 */
- 0x18, /* 00011000 */
- 0xf8, /* 11111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 191 0xbf '¿' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xf8, /* 11111000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 192 0xc0 'À' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x1f, /* 00011111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 193 0xc1 'Á' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 194 0xc2 'Â' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 195 0xc3 'Ã' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x1f, /* 00011111 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 196 0xc4 'Ä' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 197 0xc5 'Å' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xff, /* 11111111 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 198 0xc6 'Æ' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x1f, /* 00011111 */
- 0x18, /* 00011000 */
- 0x1f, /* 00011111 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 199 0xc7 'Ç' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x37, /* 00110111 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 200 0xc8 'È' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x37, /* 00110111 */
- 0x30, /* 00110000 */
- 0x3f, /* 00111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 201 0xc9 'É' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3f, /* 00111111 */
- 0x30, /* 00110000 */
- 0x37, /* 00110111 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 202 0xca 'Ê' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0xf7, /* 11110111 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 203 0xcb 'Ë' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0xf7, /* 11110111 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 204 0xcc 'Ì' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x37, /* 00110111 */
- 0x30, /* 00110000 */
- 0x37, /* 00110111 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 205 0xcd 'Í' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 206 0xce 'Î' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0xf7, /* 11110111 */
- 0x00, /* 00000000 */
- 0xf7, /* 11110111 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 207 0xcf 'Ï' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 208 0xd0 'Ð' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 209 0xd1 'Ñ' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 210 0xd2 'Ò' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 211 0xd3 'Ó' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x3f, /* 00111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 212 0xd4 'Ô' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x1f, /* 00011111 */
- 0x18, /* 00011000 */
- 0x1f, /* 00011111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 213 0xd5 'Õ' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x1f, /* 00011111 */
- 0x18, /* 00011000 */
- 0x1f, /* 00011111 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 214 0xd6 'Ö' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x3f, /* 00111111 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 215 0xd7 '×' */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0xff, /* 11111111 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
-
- /* 216 0xd8 'Ø' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xff, /* 11111111 */
- 0x18, /* 00011000 */
- 0xff, /* 11111111 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 217 0xd9 'Ù' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xf8, /* 11111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 218 0xda 'Ú' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x1f, /* 00011111 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 219 0xdb 'Û' */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
-
- /* 220 0xdc 'Ü' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
-
- /* 221 0xdd 'Ý' */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
- 0xf0, /* 11110000 */
-
- /* 222 0xde 'Þ' */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
- 0x0f, /* 00001111 */
-
- /* 223 0xdf 'ß' */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0xff, /* 11111111 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 224 0xe0 'à' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x76, /* 01110110 */
- 0xdc, /* 11011100 */
- 0xd8, /* 11011000 */
- 0xd8, /* 11011000 */
- 0xd8, /* 11011000 */
- 0xdc, /* 11011100 */
- 0x76, /* 01110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 225 0xe1 'á' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x78, /* 01111000 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xcc, /* 11001100 */
- 0xd8, /* 11011000 */
- 0xcc, /* 11001100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xcc, /* 11001100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 226 0xe2 'â' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0xc0, /* 11000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 227 0xe3 'ã' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 228 0xe4 'ä' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0xc6, /* 11000110 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 229 0xe5 'å' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0xd8, /* 11011000 */
- 0xd8, /* 11011000 */
- 0xd8, /* 11011000 */
- 0xd8, /* 11011000 */
- 0xd8, /* 11011000 */
- 0x70, /* 01110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 230 0xe6 'æ' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x7c, /* 01111100 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0xc0, /* 11000000 */
- 0x00, /* 00000000 */
-
- /* 231 0xe7 'ç' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x76, /* 01110110 */
- 0xdc, /* 11011100 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 232 0xe8 'è' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x3c, /* 00111100 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 233 0xe9 'é' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xfe, /* 11111110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 234 0xea 'ê' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0xee, /* 11101110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 235 0xeb 'ë' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x1e, /* 00011110 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x0c, /* 00001100 */
- 0x3e, /* 00111110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x66, /* 01100110 */
- 0x3c, /* 00111100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 236 0xec 'ì' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0xdb, /* 11011011 */
- 0xdb, /* 11011011 */
- 0xdb, /* 11011011 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 237 0xed 'í' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x03, /* 00000011 */
- 0x06, /* 00000110 */
- 0x7e, /* 01111110 */
- 0xdb, /* 11011011 */
- 0xdb, /* 11011011 */
- 0xf3, /* 11110011 */
- 0x7e, /* 01111110 */
- 0x60, /* 01100000 */
- 0xc0, /* 11000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 238 0xee 'î' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x1c, /* 00011100 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x7c, /* 01111100 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x1c, /* 00011100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 239 0xef 'ï' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7c, /* 01111100 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0xc6, /* 11000110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 240 0xf0 'ð' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0xfe, /* 11111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 241 0xf1 'ñ' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x7e, /* 01111110 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 242 0xf2 'ò' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x0c, /* 00001100 */
- 0x06, /* 00000110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 243 0xf3 'ó' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x30, /* 00110000 */
- 0x60, /* 01100000 */
- 0x30, /* 00110000 */
- 0x18, /* 00011000 */
- 0x0c, /* 00001100 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 244 0xf4 'ô' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x0e, /* 00001110 */
- 0x1b, /* 00011011 */
- 0x1b, /* 00011011 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
-
- /* 245 0xf5 'õ' */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0xd8, /* 11011000 */
- 0xd8, /* 11011000 */
- 0xd8, /* 11011000 */
- 0x70, /* 01110000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 246 0xf6 'ö' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 247 0xf7 '÷' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x76, /* 01110110 */
- 0xdc, /* 11011100 */
- 0x00, /* 00000000 */
- 0x76, /* 01110110 */
- 0xdc, /* 11011100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 248 0xf8 'ø' */
- 0x00, /* 00000000 */
- 0x38, /* 00111000 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x38, /* 00111000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 249 0xf9 'ù' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 250 0xfa 'ú' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x18, /* 00011000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 251 0xfb 'û' */
- 0x00, /* 00000000 */
- 0x0f, /* 00001111 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0x0c, /* 00001100 */
- 0xec, /* 11101100 */
- 0x6c, /* 01101100 */
- 0x6c, /* 01101100 */
- 0x3c, /* 00111100 */
- 0x1c, /* 00011100 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 252 0xfc 'ü' */
- 0x00, /* 00000000 */
- 0x6c, /* 01101100 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x36, /* 00110110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 253 0xfd 'ý' */
- 0x00, /* 00000000 */
- 0x3c, /* 00111100 */
- 0x66, /* 01100110 */
- 0x0c, /* 00001100 */
- 0x18, /* 00011000 */
- 0x32, /* 00110010 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 254 0xfe 'þ' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x7e, /* 01111110 */
- 0x7e, /* 01111110 */
- 0x7e, /* 01111110 */
- 0x7e, /* 01111110 */
- 0x7e, /* 01111110 */
- 0x7e, /* 01111110 */
- 0x7e, /* 01111110 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-
- /* 255 0xff 'ÿ' */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
- 0x00, /* 00000000 */
-#endif
-};
-
-#endif
diff --git a/gpxe/src/core/console.c b/gpxe/src/core/console.c
deleted file mode 100644
index e22d2601..00000000
--- a/gpxe/src/core/console.c
+++ /dev/null
@@ -1,130 +0,0 @@
-#include "stddef.h"
-#include "console.h"
-#include <gpxe/process.h>
-#include <gpxe/nap.h>
-
-/** @file */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-/**
- * Write a single character to each console device.
- *
- * @v character Character to be written
- * @ret None -
- * @err None -
- *
- * The character is written out to all enabled console devices, using
- * each device's console_driver::putchar() method.
- *
- */
-void putchar ( int character ) {
- struct console_driver *console;
-
- /* Automatic LF -> CR,LF translation */
- if ( character == '\n' )
- putchar ( '\r' );
-
- for_each_table_entry ( console, CONSOLES ) {
- if ( ( ! console->disabled ) && console->putchar )
- console->putchar ( character );
- }
-}
-
-/**
- * Check to see if any input is available on any console.
- *
- * @v None -
- * @ret console Console device that has input available, if any.
- * @ret NULL No console device has input available.
- * @err None -
- *
- * All enabled console devices are checked once for available input
- * using each device's console_driver::iskey() method. The first
- * console device that has available input will be returned, if any.
- *
- */
-static struct console_driver * has_input ( void ) {
- struct console_driver *console;
-
- for_each_table_entry ( console, CONSOLES ) {
- if ( ( ! console->disabled ) && console->iskey ) {
- if ( console->iskey () )
- return console;
- }
- }
- return NULL;
-}
-
-/**
- * Read a single character from any console.
- *
- * @v None -
- * @ret character Character read from a console.
- * @err None -
- *
- * A character will be read from the first enabled console device that
- * has input available using that console's console_driver::getchar()
- * method. If no console has input available to be read, this method
- * will block. To perform a non-blocking read, use something like
- *
- * @code
- *
- * int key = iskey() ? getchar() : -1;
- *
- * @endcode
- *
- * The character read will not be echoed back to any console.
- *
- */
-int getchar ( void ) {
- struct console_driver *console;
- int character;
-
- while ( 1 ) {
- console = has_input();
- if ( console && console->getchar ) {
- character = console->getchar ();
- break;
- }
-
- /* Doze for a while (until the next interrupt). This works
- * fine, because the keyboard is interrupt-driven, and the
- * timer interrupt (approx. every 50msec) takes care of the
- * serial port, which is read by polling. This reduces the
- * power dissipation of a modern CPU considerably, and also
- * makes Etherboot waiting for user interaction waste a lot
- * less CPU time in a VMware session.
- */
- cpu_nap();
-
- /* Keep processing background tasks while we wait for
- * input.
- */
- step();
- }
-
- /* CR -> LF translation */
- if ( character == '\r' )
- character = '\n';
-
- return character;
-}
-
-/** Check for available input on any console.
- *
- * @v None -
- * @ret True Input is available on a console
- * @ret False Input is not available on any console
- * @err None -
- *
- * All enabled console devices are checked once for available input
- * using each device's console_driver::iskey() method. If any console
- * device has input available, this call will return True. If this
- * call returns True, you can then safely call getchar() without
- * blocking.
- *
- */
-int iskey ( void ) {
- return has_input() ? 1 : 0;
-}
diff --git a/gpxe/src/core/cpio.c b/gpxe/src/core/cpio.c
deleted file mode 100644
index b303fa35..00000000
--- a/gpxe/src/core/cpio.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-/** @file
- *
- * CPIO archives
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <gpxe/cpio.h>
-
-/**
- * Set field within a CPIO header
- *
- * @v field Field within CPIO header
- * @v value Value to set
- */
-void cpio_set_field ( char *field, unsigned long value ) {
- char buf[9];
-
- snprintf ( buf, sizeof ( buf ), "%08lx", value );
- memcpy ( field, buf, 8 );
-}
diff --git a/gpxe/src/core/ctype.c b/gpxe/src/core/ctype.c
deleted file mode 100644
index 6185bb2f..00000000
--- a/gpxe/src/core/ctype.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-/**
- * @file
- *
- * Character types
- *
- */
-
-#include <ctype.h>
-
-/**
- * Check to see if character is a space
- *
- * @v c Character
- * @ret isspace Character is a space
- */
-int isspace ( int c ) {
- switch ( c ) {
- case ' ' :
- case '\f' :
- case '\n' :
- case '\r' :
- case '\t' :
- case '\v' :
- return 1;
- default:
- return 0;
- }
-}
diff --git a/gpxe/src/core/cwuri.c b/gpxe/src/core/cwuri.c
deleted file mode 100644
index 65e01b21..00000000
--- a/gpxe/src/core/cwuri.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stddef.h>
-#include <gpxe/uri.h>
-
-/** @file
- *
- * Current working URI
- *
- * Somewhat analogous to the current working directory in a POSIX
- * system.
- */
-
-/** Current working URI */
-struct uri *cwuri = NULL;
-
-/**
- * Change working URI
- *
- * @v uri New working URI, or NULL
- */
-void churi ( struct uri *uri ) {
- struct uri *new_uri;
-
- new_uri = resolve_uri ( cwuri, uri );
- uri_put ( cwuri );
- cwuri = new_uri;
-}
diff --git a/gpxe/src/core/debug.c b/gpxe/src/core/debug.c
deleted file mode 100644
index 8f929309..00000000
--- a/gpxe/src/core/debug.c
+++ /dev/null
@@ -1,196 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <gpxe/io.h>
-#include <console.h>
-
-void pause ( void ) {
- printf ( "\nPress a key" );
- getchar();
- printf ( "\r \r" );
-}
-
-void more ( void ) {
- printf ( "---more---" );
- getchar();
- printf ( "\r \r" );
-}
-
-/**
- * Print row of a hex dump with specified display address
- *
- * @v dispaddr Display address
- * @v data Data to print
- * @v len Length of data
- * @v offset Starting offset within data
- */
-static void dbg_hex_dump_da_row ( unsigned long dispaddr, const void *data,
- unsigned long len, unsigned int offset ) {
- const uint8_t *bytes = data;
- unsigned int i;
- uint8_t byte;
-
- printf ( "%08lx :", ( dispaddr + offset ) );
- for ( i = offset ; i < ( offset + 16 ) ; i++ ) {
- if ( i >= len ) {
- printf ( " " );
- continue;
- }
- printf ( "%c%02x",
- ( ( ( i % 16 ) == 8 ) ? '-' : ' ' ), bytes[i] );
- }
- printf ( " : " );
- for ( i = offset ; i < ( offset + 16 ) ; i++ ) {
- if ( i >= len ) {
- printf ( " " );
- continue;
- }
- byte = bytes[i];
- if ( ( byte < 0x20 ) || ( byte >= 0x7f ) )
- byte = '.';
- printf ( "%c", byte );
- }
- printf ( "\n" );
-}
-
-/**
- * Print hex dump with specified display address
- *
- * @v dispaddr Display address
- * @v data Data to print
- * @v len Length of data
- */
-void dbg_hex_dump_da ( unsigned long dispaddr, const void *data,
- unsigned long len ) {
- unsigned int offset;
-
- for ( offset = 0 ; offset < len ; offset += 16 ) {
- dbg_hex_dump_da_row ( dispaddr, data, len, offset );
- }
-}
-
-#define GUARD_SYMBOL ( ( 'M' << 24 ) | ( 'I' << 16 ) | ( 'N' << 8 ) | 'E' )
-/* Fill a region with guard markers. We use a 4-byte pattern to make
- * it less likely that check_region will find spurious 1-byte regions
- * of non-corruption.
- */
-void guard_region ( void *region, size_t len ) {
- uint32_t offset = 0;
-
- len &= ~0x03;
- for ( offset = 0; offset < len ; offset += 4 ) {
- *((uint32_t *)(region + offset)) = GUARD_SYMBOL;
- }
-}
-
-/* Check a region that has been guarded with guard_region() for
- * corruption.
- */
-int check_region ( void *region, size_t len ) {
- uint8_t corrupted = 0;
- uint8_t in_corruption = 0;
- uint32_t offset = 0;
- uint32_t test = 0;
-
- len &= ~0x03;
- for ( offset = 0; offset < len ; offset += 4 ) {
- test = *((uint32_t *)(region + offset)) = GUARD_SYMBOL;
- if ( ( in_corruption == 0 ) &&
- ( test != GUARD_SYMBOL ) ) {
- /* Start of corruption */
- if ( corrupted == 0 ) {
- corrupted = 1;
- printf ( "Region %p-%p (physical %#lx-%#lx) "
- "corrupted\n",
- region, region + len,
- virt_to_phys ( region ),
- virt_to_phys ( region + len ) );
- }
- in_corruption = 1;
- printf ( "--- offset %#x ", offset );
- } else if ( ( in_corruption != 0 ) &&
- ( test == GUARD_SYMBOL ) ) {
- /* End of corruption */
- in_corruption = 0;
- printf ( "to offset %#x", offset );
- }
-
- }
- if ( in_corruption != 0 ) {
- printf ( "to offset %#zx (end of region)\n", len-1 );
- }
- return corrupted;
-}
-
-/**
- * Maximum number of separately coloured message streams
- *
- * Six is the realistic maximum; there are 8 basic ANSI colours, one
- * of which will be the terminal default and one of which will be
- * invisible on the terminal because it matches the background colour.
- */
-#define NUM_AUTO_COLOURS 6
-
-/** A colour assigned to an autocolourised debug message stream */
-struct autocolour {
- /** Message stream ID */
- unsigned long stream;
- /** Last recorded usage */
- unsigned long last_used;
-};
-
-/**
- * Choose colour index for debug autocolourisation
- *
- * @v stream Message stream ID
- * @ret colour Colour ID
- */
-static int dbg_autocolour ( unsigned long stream ) {
- static struct autocolour acs[NUM_AUTO_COLOURS];
- static unsigned long use;
- unsigned int i;
- unsigned int oldest;
- unsigned int oldest_last_used;
-
- /* Increment usage iteration counter */
- use++;
-
- /* Scan through list for a currently assigned colour */
- for ( i = 0 ; i < ( sizeof ( acs ) / sizeof ( acs[0] ) ) ; i++ ) {
- if ( acs[i].stream == stream ) {
- acs[i].last_used = use;
- return i;
- }
- }
-
- /* No colour found; evict the oldest from the list */
- oldest = 0;
- oldest_last_used = use;
- for ( i = 0 ; i < ( sizeof ( acs ) / sizeof ( acs[0] ) ) ; i++ ) {
- if ( acs[i].last_used < oldest_last_used ) {
- oldest_last_used = acs[i].last_used;
- oldest = i;
- }
- }
- acs[oldest].stream = stream;
- acs[oldest].last_used = use;
- return oldest;
-}
-
-/**
- * Select automatic colour for debug messages
- *
- * @v stream Message stream ID
- */
-void dbg_autocolourise ( unsigned long stream ) {
- printf ( "\033[%dm",
- ( stream ? ( 31 + dbg_autocolour ( stream ) ) : 0 ) );
-}
-
-/**
- * Revert to normal colour
- *
- */
-void dbg_decolourise ( void ) {
- printf ( "\033[0m" );
-}
diff --git a/gpxe/src/core/device.c b/gpxe/src/core/device.c
deleted file mode 100644
index 96ccc9ff..00000000
--- a/gpxe/src/core/device.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <string.h>
-#include <gpxe/list.h>
-#include <gpxe/tables.h>
-#include <gpxe/device.h>
-#include <gpxe/init.h>
-
-/**
- * @file
- *
- * Device model
- *
- */
-
-/** Registered root devices */
-static LIST_HEAD ( devices );
-
-/**
- * Probe a root device
- *
- * @v rootdev Root device
- * @ret rc Return status code
- */
-static int rootdev_probe ( struct root_device *rootdev ) {
- int rc;
-
- DBG ( "Adding %s root bus\n", rootdev->dev.name );
- if ( ( rc = rootdev->driver->probe ( rootdev ) ) != 0 ) {
- DBG ( "Failed to add %s root bus: %s\n",
- rootdev->dev.name, strerror ( rc ) );
- return rc;
- }
-
- return 0;
-}
-
-/**
- * Remove a root device
- *
- * @v rootdev Root device
- */
-static void rootdev_remove ( struct root_device *rootdev ) {
- rootdev->driver->remove ( rootdev );
- DBG ( "Removed %s root bus\n", rootdev->dev.name );
-}
-
-/**
- * Probe all devices
- *
- * This initiates probing for all devices in the system. After this
- * call, the device hierarchy will be populated, and all hardware
- * should be ready to use.
- */
-static void probe_devices ( void ) {
- struct root_device *rootdev;
- int rc;
-
- for_each_table_entry ( rootdev, ROOT_DEVICES ) {
- list_add ( &rootdev->dev.siblings, &devices );
- INIT_LIST_HEAD ( &rootdev->dev.children );
- if ( ( rc = rootdev_probe ( rootdev ) ) != 0 )
- list_del ( &rootdev->dev.siblings );
- }
-}
-
-/**
- * Remove all devices
- *
- */
-static void remove_devices ( int flags ) {
- struct root_device *rootdev;
- struct root_device *tmp;
-
- if ( flags & SHUTDOWN_KEEP_DEVICES ) {
- DBG ( "Refusing to remove devices on shutdown\n" );
- return;
- }
-
- list_for_each_entry_safe ( rootdev, tmp, &devices, dev.siblings ) {
- rootdev_remove ( rootdev );
- list_del ( &rootdev->dev.siblings );
- }
-}
-
-struct startup_fn startup_devices __startup_fn ( STARTUP_NORMAL ) = {
- .startup = probe_devices,
- .shutdown = remove_devices,
-};
diff --git a/gpxe/src/core/downloader.c b/gpxe/src/core/downloader.c
deleted file mode 100644
index 86c144dc..00000000
--- a/gpxe/src/core/downloader.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <gpxe/xfer.h>
-#include <gpxe/open.h>
-#include <gpxe/job.h>
-#include <gpxe/uaccess.h>
-#include <gpxe/umalloc.h>
-#include <gpxe/image.h>
-#include <gpxe/downloader.h>
-
-/** @file
- *
- * Image downloader
- *
- */
-
-/** A downloader */
-struct downloader {
- /** Reference count for this object */
- struct refcnt refcnt;
-
- /** Job control interface */
- struct job_interface job;
- /** Data transfer interface */
- struct xfer_interface xfer;
-
- /** Image to contain downloaded file */
- struct image *image;
- /** Current position within image buffer */
- size_t pos;
- /** Image registration routine */
- int ( * register_image ) ( struct image *image );
-};
-
-/**
- * Free downloader object
- *
- * @v refcnt Downloader reference counter
- */
-static void downloader_free ( struct refcnt *refcnt ) {
- struct downloader *downloader =
- container_of ( refcnt, struct downloader, refcnt );
-
- image_put ( downloader->image );
- free ( downloader );
-}
-
-/**
- * Terminate download
- *
- * @v downloader Downloader
- * @v rc Reason for termination
- */
-static void downloader_finished ( struct downloader *downloader, int rc ) {
-
- /* Block further incoming messages */
- job_nullify ( &downloader->job );
- xfer_nullify ( &downloader->xfer );
-
- /* Free resources and close interfaces */
- xfer_close ( &downloader->xfer, rc );
- job_done ( &downloader->job, rc );
-}
-
-/**
- * Ensure that download buffer is large enough for the specified size
- *
- * @v downloader Downloader
- * @v len Required minimum size
- * @ret rc Return status code
- */
-static int downloader_ensure_size ( struct downloader *downloader,
- size_t len ) {
- userptr_t new_buffer;
-
- /* If buffer is already large enough, do nothing */
- if ( len <= downloader->image->len )
- return 0;
-
- DBGC ( downloader, "Downloader %p extending to %zd bytes\n",
- downloader, len );
-
- /* Extend buffer */
- new_buffer = urealloc ( downloader->image->data, len );
- if ( ! new_buffer ) {
- DBGC ( downloader, "Downloader %p could not extend buffer to "
- "%zd bytes\n", downloader, len );
- return -ENOBUFS;
- }
- downloader->image->data = new_buffer;
- downloader->image->len = len;
-
- return 0;
-}
-
-/****************************************************************************
- *
- * Job control interface
- *
- */
-
-/**
- * Handle kill() event received via job control interface
- *
- * @v job Downloader job control interface
- */
-static void downloader_job_kill ( struct job_interface *job ) {
- struct downloader *downloader =
- container_of ( job, struct downloader, job );
-
- /* Terminate download */
- downloader_finished ( downloader, -ECANCELED );
-}
-
-/**
- * Report progress of download job
- *
- * @v job Downloader job control interface
- * @v progress Progress report to fill in
- */
-static void downloader_job_progress ( struct job_interface *job,
- struct job_progress *progress ) {
- struct downloader *downloader =
- container_of ( job, struct downloader, job );
-
- /* This is not entirely accurate, since downloaded data may
- * arrive out of order (e.g. with multicast protocols), but
- * it's a reasonable first approximation.
- */
- progress->completed = downloader->pos;
- progress->total = downloader->image->len;
-}
-
-/** Downloader job control interface operations */
-static struct job_interface_operations downloader_job_operations = {
- .done = ignore_job_done,
- .kill = downloader_job_kill,
- .progress = downloader_job_progress,
-};
-
-/****************************************************************************
- *
- * Data transfer interface
- *
- */
-
-/**
- * Handle deliver_raw() event received via data transfer interface
- *
- * @v xfer Downloader data transfer interface
- * @v iobuf Datagram I/O buffer
- * @v meta Data transfer metadata
- * @ret rc Return status code
- */
-static int downloader_xfer_deliver_iob ( struct xfer_interface *xfer,
- struct io_buffer *iobuf,
- struct xfer_metadata *meta ) {
- struct downloader *downloader =
- container_of ( xfer, struct downloader, xfer );
- size_t len;
- size_t max;
- int rc;
-
- /* Calculate new buffer position */
- if ( meta->whence != SEEK_CUR )
- downloader->pos = 0;
- downloader->pos += meta->offset;
-
- /* Ensure that we have enough buffer space for this data */
- len = iob_len ( iobuf );
- max = ( downloader->pos + len );
- if ( ( rc = downloader_ensure_size ( downloader, max ) ) != 0 )
- goto done;
-
- /* Copy data to buffer */
- copy_to_user ( downloader->image->data, downloader->pos,
- iobuf->data, len );
-
- /* Update current buffer position */
- downloader->pos += len;
-
- done:
- free_iob ( iobuf );
- return rc;
-}
-
-/**
- * Handle close() event received via data transfer interface
- *
- * @v xfer Downloader data transfer interface
- * @v rc Reason for close
- */
-static void downloader_xfer_close ( struct xfer_interface *xfer, int rc ) {
- struct downloader *downloader =
- container_of ( xfer, struct downloader, xfer );
-
- /* Register image if download was successful */
- if ( rc == 0 )
- rc = downloader->register_image ( downloader->image );
-
- /* Terminate download */
- downloader_finished ( downloader, rc );
-}
-
-/** Downloader data transfer interface operations */
-static struct xfer_interface_operations downloader_xfer_operations = {
- .close = downloader_xfer_close,
- .vredirect = xfer_vreopen,
- .window = unlimited_xfer_window,
- .alloc_iob = default_xfer_alloc_iob,
- .deliver_iob = downloader_xfer_deliver_iob,
- .deliver_raw = xfer_deliver_as_iob,
-};
-
-/****************************************************************************
- *
- * Instantiator
- *
- */
-
-/**
- * Instantiate a downloader
- *
- * @v job Job control interface
- * @v image Image to fill with downloaded file
- * @v register_image Image registration routine
- * @v type Location type to pass to xfer_open()
- * @v ... Remaining arguments to pass to xfer_open()
- * @ret rc Return status code
- *
- * Instantiates a downloader object to download the specified URI into
- * the specified image object. If the download is successful, the
- * image registration routine @c register_image() will be called.
- */
-int create_downloader ( struct job_interface *job, struct image *image,
- int ( * register_image ) ( struct image *image ),
- int type, ... ) {
- struct downloader *downloader;
- va_list args;
- int rc;
-
- /* Allocate and initialise structure */
- downloader = zalloc ( sizeof ( *downloader ) );
- if ( ! downloader )
- return -ENOMEM;
- downloader->refcnt.free = downloader_free;
- job_init ( &downloader->job, &downloader_job_operations,
- &downloader->refcnt );
- xfer_init ( &downloader->xfer, &downloader_xfer_operations,
- &downloader->refcnt );
- downloader->image = image_get ( image );
- downloader->register_image = register_image;
- va_start ( args, type );
-
- /* Instantiate child objects and attach to our interfaces */
- if ( ( rc = xfer_vopen ( &downloader->xfer, type, args ) ) != 0 )
- goto err;
-
- /* Attach parent interface, mortalise self, and return */
- job_plug_plug ( &downloader->job, job );
- ref_put ( &downloader->refcnt );
- va_end ( args );
- return 0;
-
- err:
- downloader_finished ( downloader, rc );
- ref_put ( &downloader->refcnt );
- va_end ( args );
- return rc;
-}
diff --git a/gpxe/src/core/errno.c b/gpxe/src/core/errno.c
deleted file mode 100644
index b4f44cec..00000000
--- a/gpxe/src/core/errno.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <errno.h>
-
-/** @file
- *
- * Error codes
- *
- * This file provides the global variable #errno.
- *
- */
-
-/**
- * Global "last error" number.
- *
- * This is valid only when a function has just returned indicating a
- * failure.
- *
- */
-int errno;
diff --git a/gpxe/src/core/exec.c b/gpxe/src/core/exec.c
deleted file mode 100644
index 6c16aa44..00000000
--- a/gpxe/src/core/exec.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdint.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <errno.h>
-#include <assert.h>
-#include <gpxe/tables.h>
-#include <gpxe/command.h>
-#include <gpxe/settings.h>
-
-/** @file
- *
- * Command execution
- *
- */
-
-/* Avoid dragging in getopt.o unless a command really uses it */
-int optind;
-int nextchar;
-
-/**
- * Execute command
- *
- * @v command Command name
- * @v argv Argument list
- * @ret rc Command exit status
- *
- * Execute the named command. Unlike a traditional POSIX execv(),
- * this function returns the exit status of the command.
- */
-int execv ( const char *command, char * const argv[] ) {
- struct command *cmd;
- int argc;
-
- /* Count number of arguments */
- for ( argc = 0 ; argv[argc] ; argc++ ) {}
-
- /* Sanity checks */
- if ( ! command ) {
- DBG ( "No command\n" );
- return -EINVAL;
- }
- if ( ! argc ) {
- DBG ( "%s: empty argument list\n", command );
- return -EINVAL;
- }
-
- /* Reset getopt() library ready for use by the command. This
- * is an artefact of the POSIX getopt() API within the context
- * of Etherboot; see the documentation for reset_getopt() for
- * details.
- */
- reset_getopt();
-
- /* Hand off to command implementation */
- for_each_table_entry ( cmd, COMMANDS ) {
- if ( strcmp ( command, cmd->name ) == 0 )
- return cmd->exec ( argc, ( char ** ) argv );
- }
-
- printf ( "%s: command not found\n", command );
- return -ENOEXEC;
-}
-
-/**
- * Expand variables within command line
- *
- * @v command Command line
- * @ret expcmd Expanded command line
- *
- * The expanded command line is allocated with malloc() and the caller
- * must eventually free() it.
- */
-static char * expand_command ( const char *command ) {
- char *expcmd;
- char *start;
- char *end;
- char *head;
- char *name;
- char *tail;
- int setting_len;
- int new_len;
- char *tmp;
-
- /* Obtain temporary modifiable copy of command line */
- expcmd = strdup ( command );
- if ( ! expcmd )
- return NULL;
-
- /* Expand while expansions remain */
- while ( 1 ) {
-
- head = expcmd;
-
- /* Locate opener */
- start = strstr ( expcmd, "${" );
- if ( ! start )
- break;
- *start = '\0';
- name = ( start + 2 );
-
- /* Locate closer */
- end = strstr ( name, "}" );
- if ( ! end )
- break;
- *end = '\0';
- tail = ( end + 1 );
-
- /* Determine setting length */
- setting_len = fetchf_named_setting ( name, NULL, 0 );
- if ( setting_len < 0 )
- setting_len = 0; /* Treat error as empty setting */
-
- /* Read setting into temporary buffer */
- {
- char setting_buf[ setting_len + 1 ];
-
- setting_buf[0] = '\0';
- fetchf_named_setting ( name, setting_buf,
- sizeof ( setting_buf ) );
-
- /* Construct expanded string and discard old string */
- tmp = expcmd;
- new_len = asprintf ( &expcmd, "%s%s%s",
- head, setting_buf, tail );
- free ( tmp );
- if ( new_len < 0 )
- return NULL;
- }
- }
-
- return expcmd;
-}
-
-/**
- * Split command line into argv array
- *
- * @v args Command line
- * @v argv Argument array to populate, or NULL
- * @ret argc Argument count
- *
- * Splits the command line into whitespace-delimited arguments. If @c
- * argv is non-NULL, any whitespace in the command line will be
- * replaced with NULs.
- */
-static int split_args ( char *args, char * argv[] ) {
- int argc = 0;
-
- while ( 1 ) {
- /* Skip over any whitespace / convert to NUL */
- while ( isspace ( *args ) ) {
- if ( argv )
- *args = '\0';
- args++;
- }
- /* Check for end of line */
- if ( ! *args )
- break;
- /* We have found the start of the next argument */
- if ( argv )
- argv[argc] = args;
- argc++;
- /* Skip to start of next whitespace, if any */
- while ( *args && ! isspace ( *args ) ) {
- args++;
- }
- }
- return argc;
-}
-
-/**
- * Execute command line
- *
- * @v command Command line
- * @ret rc Command exit status
- *
- * Execute the named command and arguments.
- */
-int system ( const char *command ) {
- char *args;
- int argc;
- int rc = 0;
-
- /* Perform variable expansion */
- args = expand_command ( command );
- if ( ! args )
- return -ENOMEM;
-
- /* Count arguments */
- argc = split_args ( args, NULL );
-
- /* Create argv array and execute command */
- if ( argc ) {
- char * argv[argc + 1];
-
- split_args ( args, argv );
- argv[argc] = NULL;
-
- if ( argv[0][0] != '#' )
- rc = execv ( argv[0], argv );
- }
-
- free ( args );
- return rc;
-}
-
-/**
- * The "echo" command
- *
- * @v argc Argument count
- * @v argv Argument list
- * @ret rc Exit code
- */
-static int echo_exec ( int argc, char **argv ) {
- int i;
-
- for ( i = 1 ; i < argc ; i++ ) {
- printf ( "%s%s", ( ( i == 1 ) ? "" : " " ), argv[i] );
- }
- printf ( "\n" );
- return 0;
-}
-
-/** "echo" command */
-struct command echo_command __command = {
- .name = "echo",
- .exec = echo_exec,
-};
diff --git a/gpxe/src/core/filter.c b/gpxe/src/core/filter.c
deleted file mode 100644
index a8bee7dc..00000000
--- a/gpxe/src/core/filter.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <gpxe/xfer.h>
-#include <gpxe/filter.h>
-
-/** @file
- *
- * Data transfer filters
- *
- */
-
-/*
- * Pass-through methods to be used by filters which don't want to
- * intercept all events.
- *
- */
-
-void filter_close ( struct xfer_interface *xfer, int rc ) {
- struct xfer_interface *other = filter_other_half ( xfer );
-
- xfer_close ( other, rc );
-}
-
-int filter_vredirect ( struct xfer_interface *xfer, int type,
- va_list args ) {
- struct xfer_interface *other = filter_other_half ( xfer );
-
- return xfer_vredirect ( other, type, args );
-}
-
-size_t filter_window ( struct xfer_interface *xfer ) {
- struct xfer_interface *other = filter_other_half ( xfer );
-
- return xfer_window ( other );
-}
-
-struct io_buffer * filter_alloc_iob ( struct xfer_interface *xfer,
- size_t len ) {
- struct xfer_interface *other = filter_other_half ( xfer );
-
- return xfer_alloc_iob ( other, len );
-}
-
-int filter_deliver_iob ( struct xfer_interface *xfer, struct io_buffer *iobuf,
- struct xfer_metadata *meta ) {
- struct xfer_interface *other = filter_other_half ( xfer );
-
- return xfer_deliver_iob_meta ( other, iobuf, meta );
-}
-
-int filter_deliver_raw ( struct xfer_interface *xfer, const void *data,
- size_t len ) {
- struct xfer_interface *other = filter_other_half ( xfer );
-
- return xfer_deliver_raw ( other, data, len );
-}
diff --git a/gpxe/src/core/gdbserial.c b/gpxe/src/core/gdbserial.c
deleted file mode 100644
index b0d50479..00000000
--- a/gpxe/src/core/gdbserial.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2008 Stefan Hajnoczi <stefanha@gmail.com>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <assert.h>
-#include <gpxe/serial.h>
-#include <gpxe/gdbstub.h>
-#include <gpxe/gdbserial.h>
-
-struct gdb_transport serial_gdb_transport __gdb_transport;
-
-static size_t gdbserial_recv ( char *buf, size_t len ) {
- assert ( len > 0 );
- buf [ 0 ] = serial_getc();
- return 1;
-}
-
-static void gdbserial_send ( const char *buf, size_t len ) {
- while ( len-- > 0 ) {
- serial_putc ( *buf++ );
- }
-}
-
-struct gdb_transport serial_gdb_transport __gdb_transport = {
- .name = "serial",
- .recv = gdbserial_recv,
- .send = gdbserial_send,
-};
-
-struct gdb_transport *gdbserial_configure ( void ) {
- return &serial_gdb_transport;
-}
diff --git a/gpxe/src/core/gdbstub.c b/gpxe/src/core/gdbstub.c
deleted file mode 100644
index c8083955..00000000
--- a/gpxe/src/core/gdbstub.c
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- * Copyright (C) 2008 Stefan Hajnoczi <stefanha@gmail.com>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/**
- * @file
- *
- * GDB stub for remote debugging
- *
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <byteswap.h>
-#include <gpxe/gdbstub.h>
-#include "gdbmach.h"
-
-enum {
- POSIX_EINVAL = 0x1c, /* used to report bad arguments to GDB */
- SIZEOF_PAYLOAD = 256, /* buffer size of GDB payload data */
-};
-
-struct gdbstub {
- struct gdb_transport *trans;
- int exit_handler; /* leave interrupt handler */
-
- int signo;
- gdbreg_t *regs;
-
- void ( * parse ) ( struct gdbstub *stub, char ch );
- uint8_t cksum1;
-
- /* Buffer for payload data when parsing a packet. Once the
- * packet has been received, this buffer is used to hold
- * the reply payload. */
- char buf [ SIZEOF_PAYLOAD + 4 ]; /* $...PAYLOAD...#XX */
- char *payload; /* start of payload */
- int len; /* length of payload */
-};
-
-/* Packet parser states */
-static void gdbstub_state_new ( struct gdbstub *stub, char ch );
-static void gdbstub_state_data ( struct gdbstub *stub, char ch );
-static void gdbstub_state_cksum1 ( struct gdbstub *stub, char ch );
-static void gdbstub_state_cksum2 ( struct gdbstub *stub, char ch );
-static void gdbstub_state_wait_ack ( struct gdbstub *stub, char ch );
-
-static uint8_t gdbstub_from_hex_digit ( char ch ) {
- return ( isdigit ( ch ) ? ch - '0' : tolower ( ch ) - 'a' + 0xa ) & 0xf;
-}
-
-static uint8_t gdbstub_to_hex_digit ( uint8_t b ) {
- b &= 0xf;
- return ( b < 0xa ? '0' : 'a' - 0xa ) + b;
-}
-
-/*
- * To make reading/writing device memory atomic, we check for
- * 2- or 4-byte aligned operations and handle them specially.
- */
-
-static void gdbstub_from_hex_buf ( char *dst, char *src, int lenbytes ) {
- if ( lenbytes == 2 && ( ( unsigned long ) dst & 0x1 ) == 0 ) {
- uint16_t i = gdbstub_from_hex_digit ( src [ 2 ] ) << 12 |
- gdbstub_from_hex_digit ( src [ 3 ] ) << 8 |
- gdbstub_from_hex_digit ( src [ 0 ] ) << 4 |
- gdbstub_from_hex_digit ( src [ 1 ] );
- * ( uint16_t * ) dst = cpu_to_le16 ( i );
- } else if ( lenbytes == 4 && ( ( unsigned long ) dst & 0x3 ) == 0 ) {
- uint32_t i = gdbstub_from_hex_digit ( src [ 6 ] ) << 28 |
- gdbstub_from_hex_digit ( src [ 7 ] ) << 24 |
- gdbstub_from_hex_digit ( src [ 4 ] ) << 20 |
- gdbstub_from_hex_digit ( src [ 5 ] ) << 16 |
- gdbstub_from_hex_digit ( src [ 2 ] ) << 12 |
- gdbstub_from_hex_digit ( src [ 3 ] ) << 8 |
- gdbstub_from_hex_digit ( src [ 0 ] ) << 4 |
- gdbstub_from_hex_digit ( src [ 1 ] );
- * ( uint32_t * ) dst = cpu_to_le32 ( i );
- } else {
- while ( lenbytes-- > 0 ) {
- *dst++ = gdbstub_from_hex_digit ( src [ 0 ] ) << 4 |
- gdbstub_from_hex_digit ( src [ 1 ] );
- src += 2;
- }
- }
-}
-
-static void gdbstub_to_hex_buf ( char *dst, char *src, int lenbytes ) {
- if ( lenbytes == 2 && ( ( unsigned long ) src & 0x1 ) == 0 ) {
- uint16_t i = cpu_to_le16 ( * ( uint16_t * ) src );
- dst [ 0 ] = gdbstub_to_hex_digit ( i >> 4 );
- dst [ 1 ] = gdbstub_to_hex_digit ( i );
- dst [ 2 ] = gdbstub_to_hex_digit ( i >> 12 );
- dst [ 3 ] = gdbstub_to_hex_digit ( i >> 8 );
- } else if ( lenbytes == 4 && ( ( unsigned long ) src & 0x3 ) == 0 ) {
- uint32_t i = cpu_to_le32 ( * ( uint32_t * ) src );
- dst [ 0 ] = gdbstub_to_hex_digit ( i >> 4 );
- dst [ 1 ] = gdbstub_to_hex_digit ( i );
- dst [ 2 ] = gdbstub_to_hex_digit ( i >> 12 );
- dst [ 3 ] = gdbstub_to_hex_digit ( i >> 8 );
- dst [ 4 ] = gdbstub_to_hex_digit ( i >> 20 );
- dst [ 5 ] = gdbstub_to_hex_digit ( i >> 16);
- dst [ 6 ] = gdbstub_to_hex_digit ( i >> 28 );
- dst [ 7 ] = gdbstub_to_hex_digit ( i >> 24 );
- } else {
- while ( lenbytes-- > 0 ) {
- *dst++ = gdbstub_to_hex_digit ( *src >> 4 );
- *dst++ = gdbstub_to_hex_digit ( *src );
- src++;
- }
- }
-}
-
-static uint8_t gdbstub_cksum ( char *data, int len ) {
- uint8_t cksum = 0;
- while ( len-- > 0 ) {
- cksum += ( uint8_t ) *data++;
- }
- return cksum;
-}
-
-static void gdbstub_tx_packet ( struct gdbstub *stub ) {
- uint8_t cksum = gdbstub_cksum ( stub->payload, stub->len );
- stub->buf [ 0 ] = '$';
- stub->buf [ stub->len + 1 ] = '#';
- stub->buf [ stub->len + 2 ] = gdbstub_to_hex_digit ( cksum >> 4 );
- stub->buf [ stub->len + 3 ] = gdbstub_to_hex_digit ( cksum );
- stub->trans->send ( stub->buf, stub->len + 4 );
- stub->parse = gdbstub_state_wait_ack;
-}
-
-/* GDB commands */
-static void gdbstub_send_ok ( struct gdbstub *stub ) {
- stub->payload [ 0 ] = 'O';
- stub->payload [ 1 ] = 'K';
- stub->len = 2;
- gdbstub_tx_packet ( stub );
-}
-
-static void gdbstub_send_num_packet ( struct gdbstub *stub, char reply, int num ) {
- stub->payload [ 0 ] = reply;
- stub->payload [ 1 ] = gdbstub_to_hex_digit ( ( char ) num >> 4 );
- stub->payload [ 2 ] = gdbstub_to_hex_digit ( ( char ) num );
- stub->len = 3;
- gdbstub_tx_packet ( stub );
-}
-
-/* Format is arg1,arg2,...,argn:data where argn are hex integers and data is not an argument */
-static int gdbstub_get_packet_args ( struct gdbstub *stub, unsigned long *args, int nargs, int *stop_idx ) {
- int i;
- char ch = 0;
- int argc = 0;
- unsigned long val = 0;
- for ( i = 1; i < stub->len && argc < nargs; i++ ) {
- ch = stub->payload [ i ];
- if ( ch == ':' ) {
- break;
- } else if ( ch == ',' ) {
- args [ argc++ ] = val;
- val = 0;
- } else {
- val = ( val << 4 ) | gdbstub_from_hex_digit ( ch );
- }
- }
- if ( stop_idx ) {
- *stop_idx = i;
- }
- if ( argc < nargs ) {
- args [ argc++ ] = val;
- }
- return ( ( i == stub->len || ch == ':' ) && argc == nargs );
-}
-
-static void gdbstub_send_errno ( struct gdbstub *stub, int errno ) {
- gdbstub_send_num_packet ( stub, 'E', errno );
-}
-
-static void gdbstub_report_signal ( struct gdbstub *stub ) {
- gdbstub_send_num_packet ( stub, 'S', stub->signo );
-}
-
-static void gdbstub_read_regs ( struct gdbstub *stub ) {
- gdbstub_to_hex_buf ( stub->payload, ( char * ) stub->regs, GDBMACH_SIZEOF_REGS );
- stub->len = GDBMACH_SIZEOF_REGS * 2;
- gdbstub_tx_packet ( stub );
-}
-
-static void gdbstub_write_regs ( struct gdbstub *stub ) {
- if ( stub->len != 1 + GDBMACH_SIZEOF_REGS * 2 ) {
- gdbstub_send_errno ( stub, POSIX_EINVAL );
- return;
- }
- gdbstub_from_hex_buf ( ( char * ) stub->regs, &stub->payload [ 1 ], GDBMACH_SIZEOF_REGS );
- gdbstub_send_ok ( stub );
-}
-
-static void gdbstub_read_mem ( struct gdbstub *stub ) {
- unsigned long args [ 2 ];
- if ( !gdbstub_get_packet_args ( stub, args, sizeof args / sizeof args [ 0 ], NULL ) ) {
- gdbstub_send_errno ( stub, POSIX_EINVAL );
- return;
- }
- args [ 1 ] = ( args [ 1 ] < SIZEOF_PAYLOAD / 2 ) ? args [ 1 ] : SIZEOF_PAYLOAD / 2;
- gdbstub_to_hex_buf ( stub->payload, ( char * ) args [ 0 ], args [ 1 ] );
- stub->len = args [ 1 ] * 2;
- gdbstub_tx_packet ( stub );
-}
-
-static void gdbstub_write_mem ( struct gdbstub *stub ) {
- unsigned long args [ 2 ];
- int colon;
- if ( !gdbstub_get_packet_args ( stub, args, sizeof args / sizeof args [ 0 ], &colon ) ||
- colon >= stub->len || stub->payload [ colon ] != ':' ||
- ( stub->len - colon - 1 ) % 2 != 0 ) {
- gdbstub_send_errno ( stub, POSIX_EINVAL );
- return;
- }
- gdbstub_from_hex_buf ( ( char * ) args [ 0 ], &stub->payload [ colon + 1 ], ( stub->len - colon - 1 ) / 2 );
- gdbstub_send_ok ( stub );
-}
-
-static void gdbstub_continue ( struct gdbstub *stub, int single_step ) {
- gdbreg_t pc;
- if ( stub->len > 1 && gdbstub_get_packet_args ( stub, &pc, 1, NULL ) ) {
- gdbmach_set_pc ( stub->regs, pc );
- }
- gdbmach_set_single_step ( stub->regs, single_step );
- stub->exit_handler = 1;
- /* Reply will be sent when we hit the next breakpoint or interrupt */
-}
-
-static void gdbstub_breakpoint ( struct gdbstub *stub ) {
- unsigned long args [ 3 ];
- int enable = stub->payload [ 0 ] == 'Z' ? 1 : 0;
- if ( !gdbstub_get_packet_args ( stub, args, sizeof args / sizeof args [ 0 ], NULL ) ) {
- gdbstub_send_errno ( stub, POSIX_EINVAL );
- return;
- }
- if ( gdbmach_set_breakpoint ( args [ 0 ], args [ 1 ], args [ 2 ], enable ) ) {
- gdbstub_send_ok ( stub );
- } else {
- /* Not supported */
- stub->len = 0;
- gdbstub_tx_packet ( stub );
- }
-}
-
-static void gdbstub_rx_packet ( struct gdbstub *stub ) {
- switch ( stub->payload [ 0 ] ) {
- case '?':
- gdbstub_report_signal ( stub );
- break;
- case 'g':
- gdbstub_read_regs ( stub );
- break;
- case 'G':
- gdbstub_write_regs ( stub );
- break;
- case 'm':
- gdbstub_read_mem ( stub );
- break;
- case 'M':
- gdbstub_write_mem ( stub );
- break;
- case 'c': /* Continue */
- case 'k': /* Kill */
- case 's': /* Step */
- case 'D': /* Detach */
- gdbstub_continue ( stub, stub->payload [ 0 ] == 's' );
- if ( stub->payload [ 0 ] == 'D' ) {
- gdbstub_send_ok ( stub );
- }
- break;
- case 'Z': /* Insert breakpoint */
- case 'z': /* Remove breakpoint */
- gdbstub_breakpoint ( stub );
- break;
- default:
- stub->len = 0;
- gdbstub_tx_packet ( stub );
- break;
- }
-}
-
-/* GDB packet parser */
-static void gdbstub_state_new ( struct gdbstub *stub, char ch ) {
- if ( ch == '$' ) {
- stub->len = 0;
- stub->parse = gdbstub_state_data;
- }
-}
-
-static void gdbstub_state_data ( struct gdbstub *stub, char ch ) {
- if ( ch == '#' ) {
- stub->parse = gdbstub_state_cksum1;
- } else if ( ch == '$' ) {
- stub->len = 0; /* retry new packet */
- } else {
- /* If the length exceeds our buffer, let the checksum fail */
- if ( stub->len < SIZEOF_PAYLOAD ) {
- stub->payload [ stub->len++ ] = ch;
- }
- }
-}
-
-static void gdbstub_state_cksum1 ( struct gdbstub *stub, char ch ) {
- stub->cksum1 = gdbstub_from_hex_digit ( ch ) << 4;
- stub->parse = gdbstub_state_cksum2;
-}
-
-static void gdbstub_state_cksum2 ( struct gdbstub *stub, char ch ) {
- uint8_t their_cksum;
- uint8_t our_cksum;
-
- stub->parse = gdbstub_state_new;
- their_cksum = stub->cksum1 + gdbstub_from_hex_digit ( ch );
- our_cksum = gdbstub_cksum ( stub->payload, stub->len );
- if ( their_cksum == our_cksum ) {
- stub->trans->send ( "+", 1 );
- if ( stub->len > 0 ) {
- gdbstub_rx_packet ( stub );
- }
- } else {
- stub->trans->send ( "-", 1 );
- }
-}
-
-static void gdbstub_state_wait_ack ( struct gdbstub *stub, char ch ) {
- if ( ch == '+' ) {
- stub->parse = gdbstub_state_new;
- } else {
- /* This retransmit is very aggressive but necessary to keep
- * in sync with GDB. */
- gdbstub_tx_packet ( stub );
- }
-}
-
-static void gdbstub_parse ( struct gdbstub *stub, char ch ) {
- stub->parse ( stub, ch );
-}
-
-static struct gdbstub stub = {
- .parse = gdbstub_state_new
-};
-
-void gdbstub_handler ( int signo, gdbreg_t *regs ) {
- char packet [ SIZEOF_PAYLOAD + 4 ];
- size_t len, i;
-
- /* A transport must be set up */
- if ( !stub.trans ) {
- return;
- }
-
- stub.signo = signo;
- stub.regs = regs;
- stub.exit_handler = 0;
- gdbstub_report_signal ( &stub );
- while ( !stub.exit_handler && ( len = stub.trans->recv ( packet, sizeof ( packet ) ) ) > 0 ) {
- for ( i = 0; i < len; i++ ) {
- gdbstub_parse ( &stub, packet [ i ] );
- }
- }
-}
-
-struct gdb_transport *find_gdb_transport ( const char *name ) {
- struct gdb_transport *trans;
-
- for_each_table_entry ( trans, GDB_TRANSPORTS ) {
- if ( strcmp ( trans->name, name ) == 0 ) {
- return trans;
- }
- }
- return NULL;
-}
-
-void gdbstub_start ( struct gdb_transport *trans ) {
- stub.trans = trans;
- stub.payload = &stub.buf [ 1 ];
- gdbmach_breakpoint();
-}
diff --git a/gpxe/src/core/gdbudp.c b/gpxe/src/core/gdbudp.c
deleted file mode 100644
index 26feb38a..00000000
--- a/gpxe/src/core/gdbudp.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2008 Stefan Hajnoczi <stefanha@gmail.com>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <byteswap.h>
-#include <gpxe/iobuf.h>
-#include <gpxe/in.h>
-#include <gpxe/if_arp.h>
-#include <gpxe/if_ether.h>
-#include <gpxe/ip.h>
-#include <gpxe/udp.h>
-#include <gpxe/netdevice.h>
-#include <gpxe/nap.h>
-#include <gpxe/gdbstub.h>
-#include <gpxe/gdbudp.h>
-
-/** @file
- *
- * GDB over UDP transport
- *
- */
-
-enum {
- DEFAULT_PORT = 43770, /* UDP listen port */
-};
-
-struct gdb_transport udp_gdb_transport __gdb_transport;
-
-static struct net_device *netdev;
-static uint8_t dest_eth[ETH_ALEN];
-static struct sockaddr_in dest_addr;
-static struct sockaddr_in source_addr;
-
-static void gdbudp_ensure_netdev_open ( struct net_device *netdev ) {
- /* The device may have been closed between breakpoints */
- assert ( netdev );
- netdev_open ( netdev );
-
- /* Strictly speaking, we may need to close the device when leaving the interrupt handler */
-}
-
-static size_t gdbudp_recv ( char *buf, size_t len ) {
- struct io_buffer *iob;
- struct ethhdr *ethhdr;
- struct arphdr *arphdr;
- struct iphdr *iphdr;
- struct udp_header *udphdr;
- size_t payload_len;
-
- gdbudp_ensure_netdev_open ( netdev );
-
- for ( ; ; ) {
- netdev_poll ( netdev );
- while ( ( iob = netdev_rx_dequeue ( netdev ) ) != NULL ) {
- /* Ethernet header */
- if ( iob_len ( iob ) < sizeof ( *ethhdr ) ) {
- goto bad_packet;
- }
- ethhdr = iob->data;
- iob_pull ( iob, sizeof ( *ethhdr ) );
-
- /* Handle ARP requests so the client can find our MAC */
- if ( ethhdr->h_protocol == htons ( ETH_P_ARP ) ) {
- arphdr = iob->data;
- if ( iob_len ( iob ) < sizeof ( *arphdr ) + 2 * ( ETH_ALEN + sizeof ( struct in_addr ) ) ||
- arphdr->ar_hrd != htons ( ARPHRD_ETHER ) ||
- arphdr->ar_pro != htons ( ETH_P_IP ) ||
- arphdr->ar_hln != ETH_ALEN ||
- arphdr->ar_pln != sizeof ( struct in_addr ) ||
- arphdr->ar_op != htons ( ARPOP_REQUEST ) ||
- * ( uint32_t * ) arp_target_pa ( arphdr ) != source_addr.sin_addr.s_addr ) {
- goto bad_packet;
- }
-
- /* Generate an ARP reply */
- arphdr->ar_op = htons ( ARPOP_REPLY );
- memswap ( arp_sender_pa ( arphdr ), arp_target_pa ( arphdr ), sizeof ( struct in_addr ) );
- memcpy ( arp_target_ha ( arphdr ), arp_sender_ha ( arphdr ), ETH_ALEN );
- memcpy ( arp_sender_ha ( arphdr ), netdev->ll_addr, ETH_ALEN );
-
- /* Fix up ethernet header */
- ethhdr = iob_push ( iob, sizeof ( *ethhdr ) );
- memcpy ( ethhdr->h_dest, ethhdr->h_source, ETH_ALEN );
- memcpy ( ethhdr->h_source, netdev->ll_addr, ETH_ALEN );
-
- netdev_tx ( netdev, iob );
- continue; /* no need to free iob */
- }
-
- if ( ethhdr->h_protocol != htons ( ETH_P_IP ) ) {
- goto bad_packet;
- }
-
- /* IP header */
- if ( iob_len ( iob ) < sizeof ( *iphdr ) ) {
- goto bad_packet;
- }
- iphdr = iob->data;
- iob_pull ( iob, sizeof ( *iphdr ) );
- if ( iphdr->protocol != IP_UDP || iphdr->dest.s_addr != source_addr.sin_addr.s_addr ) {
- goto bad_packet;
- }
-
- /* UDP header */
- if ( iob_len ( iob ) < sizeof ( *udphdr ) ) {
- goto bad_packet;
- }
- udphdr = iob->data;
- if ( udphdr->dest != source_addr.sin_port ) {
- goto bad_packet;
- }
-
- /* Learn the remote connection details */
- memcpy ( dest_eth, ethhdr->h_source, ETH_ALEN );
- dest_addr.sin_addr.s_addr = iphdr->src.s_addr;
- dest_addr.sin_port = udphdr->src;
-
- /* Payload */
- payload_len = ntohs ( udphdr->len );
- if ( payload_len < sizeof ( *udphdr ) || payload_len > iob_len ( iob ) ) {
- goto bad_packet;
- }
- payload_len -= sizeof ( *udphdr );
- iob_pull ( iob, sizeof ( *udphdr ) );
- if ( payload_len > len ) {
- goto bad_packet;
- }
- memcpy ( buf, iob->data, payload_len );
-
- free_iob ( iob );
- return payload_len;
-
-bad_packet:
- free_iob ( iob );
- }
- cpu_nap();
- }
-}
-
-static void gdbudp_send ( const char *buf, size_t len ) {
- struct io_buffer *iob;
- struct ethhdr *ethhdr;
- struct iphdr *iphdr;
- struct udp_header *udphdr;
-
- /* Check that we are connected */
- if ( dest_addr.sin_port == 0 ) {
- return;
- }
-
- gdbudp_ensure_netdev_open ( netdev );
-
- iob = alloc_iob ( sizeof ( *ethhdr ) + sizeof ( *iphdr ) + sizeof ( *udphdr ) + len );
- if ( !iob ) {
- return;
- }
-
- /* Payload */
- iob_reserve ( iob, sizeof ( *ethhdr ) + sizeof ( *iphdr ) + sizeof ( *udphdr ) );
- memcpy ( iob_put ( iob, len ), buf, len );
-
- /* UDP header */
- udphdr = iob_push ( iob, sizeof ( *udphdr ) );
- udphdr->src = source_addr.sin_port;
- udphdr->dest = dest_addr.sin_port;
- udphdr->len = htons ( iob_len ( iob ) );
- udphdr->chksum = 0; /* optional and we are not using it */
-
- /* IP header */
- iphdr = iob_push ( iob, sizeof ( *iphdr ) );
- memset ( iphdr, 0, sizeof ( *iphdr ) );
- iphdr->verhdrlen = ( IP_VER | ( sizeof ( *iphdr ) / 4 ) );
- iphdr->service = IP_TOS;
- iphdr->len = htons ( iob_len ( iob ) );
- iphdr->ttl = IP_TTL;
- iphdr->protocol = IP_UDP;
- iphdr->dest.s_addr = dest_addr.sin_addr.s_addr;
- iphdr->src.s_addr = source_addr.sin_addr.s_addr;
- iphdr->chksum = tcpip_chksum ( iphdr, sizeof ( *iphdr ) );
-
- /* Ethernet header */
- ethhdr = iob_push ( iob, sizeof ( *ethhdr ) );
- memcpy ( ethhdr->h_dest, dest_eth, ETH_ALEN );
- memcpy ( ethhdr->h_source, netdev->ll_addr, ETH_ALEN );
- ethhdr->h_protocol = htons ( ETH_P_IP );
-
- netdev_tx ( netdev, iob );
-}
-
-struct gdb_transport *gdbudp_configure ( const char *name, struct sockaddr_in *addr ) {
- struct settings *settings;
-
- /* Release old network device */
- netdev_put ( netdev );
-
- netdev = find_netdev ( name );
- if ( !netdev ) {
- return NULL;
- }
-
- /* Hold network device */
- netdev_get ( netdev );
-
- /* Source UDP port */
- source_addr.sin_port = ( addr && addr->sin_port ) ? addr->sin_port : htons ( DEFAULT_PORT );
-
- /* Source IP address */
- if ( addr && addr->sin_addr.s_addr ) {
- source_addr.sin_addr.s_addr = addr->sin_addr.s_addr;
- } else {
- settings = netdev_settings ( netdev );
- fetch_ipv4_setting ( settings, &ip_setting, &source_addr.sin_addr );
- if ( source_addr.sin_addr.s_addr == 0 ) {
- netdev_put ( netdev );
- netdev = NULL;
- return NULL;
- }
- }
-
- return &udp_gdb_transport;
-}
-
-static int gdbudp_init ( int argc, char **argv ) {
- if ( argc != 1 ) {
- printf ( "udp: missing <interface> argument\n" );
- return 1;
- }
-
- if ( !gdbudp_configure ( argv[0], NULL ) ) {
- printf ( "%s: device does not exist or has no IP address\n", argv[0] );
- return 1;
- }
- return 0;
-}
-
-struct gdb_transport udp_gdb_transport __gdb_transport = {
- .name = "udp",
- .init = gdbudp_init,
- .send = gdbudp_send,
- .recv = gdbudp_recv,
-};
diff --git a/gpxe/src/core/getkey.c b/gpxe/src/core/getkey.c
deleted file mode 100644
index dbd074cc..00000000
--- a/gpxe/src/core/getkey.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <ctype.h>
-#include <console.h>
-#include <gpxe/process.h>
-#include <gpxe/keys.h>
-#include <gpxe/timer.h>
-
-/** @file
- *
- * Special key interpretation
- *
- */
-
-#define GETKEY_TIMEOUT ( TICKS_PER_SEC / 4 )
-
-/**
- * Read character from console if available within timeout period
- *
- * @v timeout Timeout period, in ticks
- * @ret character Character read from console
- */
-static int getchar_timeout ( unsigned long timeout ) {
- unsigned long expiry = ( currticks() + timeout );
-
- while ( currticks() < expiry ) {
- step();
- if ( iskey() )
- return getchar();
- }
-
- return -1;
-}
-
-/**
- * Get single keypress
- *
- * @ret key Key pressed
- *
- * The returned key will be an ASCII value or a KEY_XXX special
- * constant. This function differs from getchar() in that getchar()
- * will return "special" keys (e.g. cursor keys) as a series of
- * characters forming an ANSI escape sequence.
- */
-int getkey ( void ) {
- int character;
- unsigned int n = 0;
-
- character = getchar();
- if ( character != ESC )
- return character;
-
- while ( ( character = getchar_timeout ( GETKEY_TIMEOUT ) ) >= 0 ) {
- if ( character == '[' )
- continue;
- if ( isdigit ( character ) ) {
- n = ( ( n * 10 ) + ( character - '0' ) );
- continue;
- }
- if ( character >= 0x40 )
- return KEY_ANSI ( n, character );
- }
-
- return ESC;
-}
diff --git a/gpxe/src/core/getopt.c b/gpxe/src/core/getopt.c
deleted file mode 100644
index b67da0c1..00000000
--- a/gpxe/src/core/getopt.c
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdint.h>
-#include <string.h>
-#include <stdio.h>
-#include <getopt.h>
-
-/** @file
- *
- * Parse command-line options
- *
- */
-
-/**
- * Option argument
- *
- * This will point to the argument for the most recently returned
- * option, if applicable.
- */
-char *optarg;
-
-/**
- * Current option index
- *
- * This is an index into the argv[] array. When getopt() returns -1,
- * @c optind is the index to the first element that is not an option.
- */
-int optind;
-
-/**
- * Current option character index
- *
- * This is an index into the current element of argv[].
- */
-int nextchar;
-
-/**
- * Unrecognised option
- *
- * When an unrecognised option is encountered, the actual option
- * character is stored in @c optopt.
- */
-int optopt;
-
-/**
- * Get option argument from argv[] array
- *
- * @v argc Argument count
- * @v argv Argument list
- * @ret argument Option argument, or NULL
- *
- * Grab the next element of argv[], if it exists and is not an option.
- */
-static const char * get_argv_argument ( int argc, char * const argv[] ) {
- char *arg;
-
- /* Don't overrun argv[] */
- if ( optind >= argc )
- return NULL;
- arg = argv[optind];
-
- /* If next argv element is an option, then it's not usable as
- * an argument.
- */
- if ( *arg == '-' )
- return NULL;
-
- /** Consume this argv element, and return it */
- optind++;
- return arg;
-}
-
-/**
- * Match long option
- *
- * @v argc Argument count
- * @v argv Argument list
- * @v opttext Option text within current argv[] element
- * @v longopt Long option specification
- * @ret option Option to return from getopt()
- * @ret matched Found a match for this long option
- */
-static int match_long_option ( int argc, char * const argv[],
- const char *opttext,
- const struct option *longopt, int *option ) {
- size_t optlen;
- const char *argument = NULL;
-
- /* Compare option name */
- optlen = strlen ( longopt->name );
- if ( strncmp ( opttext, longopt->name, optlen ) != 0 )
- return 0;
-
- /* Check for inline argument */
- if ( opttext[optlen] == '=' ) {
- argument = &opttext[ optlen + 1 ];
- } else if ( opttext[optlen] ) {
- /* Long option with trailing garbage - no match */
- return 0;
- }
-
- /* Consume this argv element */
- optind++;
-
- /* If we want an argument but don't have one yet, try to grab
- * the next argv element
- */
- if ( ( longopt->has_arg != no_argument ) && ( ! argument ) )
- argument = get_argv_argument ( argc, argv );
-
- /* If we need an argument but don't have one, sulk */
- if ( ( longopt->has_arg == required_argument ) && ( ! argument ) ) {
- printf ( "Option \"%s\" requires an argument\n",
- longopt->name );
- *option = ':';
- return 1;
- }
-
- /* If we have an argument where we shouldn't have one, sulk */
- if ( ( longopt->has_arg == no_argument ) && argument ) {
- printf ( "Option \"%s\" takes no argument\n", longopt->name );
- *option = ':';
- return 1;
- }
-
- /* Store values and return success */
- optarg = ( char * ) argument;
- if ( longopt->flag ) {
- *(longopt->flag) = longopt->val;
- *option = 0;
- } else {
- *option = longopt->val;
- }
- return 1;
-}
-
-/**
- * Match short option
- *
- * @v argc Argument count
- * @v argv Argument list
- * @v opttext Option text within current argv[] element
- * @v shortopt Option character from option specification
- * @ret option Option to return from getopt()
- * @ret matched Found a match for this short option
- */
-static int match_short_option ( int argc, char * const argv[],
- const char *opttext, int shortopt,
- enum getopt_argument_requirement has_arg,
- int *option ) {
- const char *argument = NULL;
-
- /* Compare option character */
- if ( *opttext != shortopt )
- return 0;
-
- /* Consume option character */
- opttext++;
- nextchar++;
- if ( *opttext ) {
- if ( has_arg != no_argument ) {
- /* Consume remainder of element as inline argument */
- argument = opttext;
- optind++;
- nextchar = 0;
- }
- } else {
- /* Reached end of argv element */
- optind++;
- nextchar = 0;
- }
-
- /* If we want an argument but don't have one yet, try to grab
- * the next argv element
- */
- if ( ( has_arg != no_argument ) && ( ! argument ) )
- argument = get_argv_argument ( argc, argv );
-
- /* If we need an argument but don't have one, sulk */
- if ( ( has_arg == required_argument ) && ( ! argument ) ) {
- printf ( "Option \"%c\" requires an argument\n", shortopt );
- *option = ':';
- return 1;
- }
-
- /* Store values and return success */
- optarg = ( char * ) argument;
- *option = shortopt;
- return 1;
-}
-
-/**
- * Parse command-line options
- *
- * @v argc Argument count
- * @v argv Argument list
- * @v optstring Option specification string
- * @v longopts Long option specification table
- * @ret longindex Index of long option (or NULL)
- * @ret option Option found, or -1 for no more options
- *
- * Note that the caller must arrange for reset_getopt() to be called
- * before each set of calls to getopt_long(). In Etherboot, this is
- * done automatically by execv().
- */
-int getopt_long ( int argc, char * const argv[], const char *optstring,
- const struct option *longopts, int *longindex ) {
- const char *opttext = argv[optind];
- const struct option *longopt;
- int shortopt;
- enum getopt_argument_requirement has_arg;
- int option;
-
- /* Check for end of argv array */
- if ( optind >= argc )
- return -1;
-
- /* Check for end of options */
- if ( *(opttext++) != '-' )
- return -1;
-
- /* Check for long options */
- if ( *(opttext++) == '-' ) {
- for ( longopt = longopts ; longopt->name ; longopt++ ) {
- if ( ! match_long_option ( argc, argv, opttext,
- longopt, &option ) )
- continue;
- if ( longindex )
- *longindex = ( longopt - longopts );
- return option;
- }
- optopt = '?';
- printf ( "Unrecognised option \"--%s\"\n", opttext );
- return '?';
- }
-
- /* Check for short options */
- if ( nextchar < 1 )
- nextchar = 1;
- opttext = ( argv[optind] + nextchar );
- while ( ( shortopt = *(optstring++) ) ) {
- has_arg = no_argument;
- while ( *optstring == ':' ) {
- has_arg++;
- optstring++;
- }
- if ( match_short_option ( argc, argv, opttext, shortopt,
- has_arg, &option ) ) {
- return option;
- }
- }
- optopt = *opttext;
- printf ( "Unrecognised option \"-%c\"\n", optopt );
- return '?';
-}
diff --git a/gpxe/src/core/hw.c b/gpxe/src/core/hw.c
deleted file mode 100644
index 65604ee0..00000000
--- a/gpxe/src/core/hw.c
+++ /dev/null
@@ -1,74 +0,0 @@
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <gpxe/refcnt.h>
-#include <gpxe/process.h>
-#include <gpxe/xfer.h>
-#include <gpxe/open.h>
-
-/** @file
- *
- * "Hello World" data source
- *
- */
-
-struct hw {
- struct refcnt refcnt;
- struct xfer_interface xfer;
- struct process process;
-};
-
-static const char hw_msg[] = "Hello world!\n";
-
-static void hw_finished ( struct hw *hw, int rc ) {
- xfer_nullify ( &hw->xfer );
- xfer_close ( &hw->xfer, rc );
- process_del ( &hw->process );
-}
-
-static void hw_xfer_close ( struct xfer_interface *xfer, int rc ) {
- struct hw *hw = container_of ( xfer, struct hw, xfer );
-
- hw_finished ( hw, rc );
-}
-
-static struct xfer_interface_operations hw_xfer_operations = {
- .close = hw_xfer_close,
- .vredirect = ignore_xfer_vredirect,
- .window = unlimited_xfer_window,
- .alloc_iob = default_xfer_alloc_iob,
- .deliver_iob = xfer_deliver_as_raw,
- .deliver_raw = ignore_xfer_deliver_raw,
-};
-
-static void hw_step ( struct process *process ) {
- struct hw *hw = container_of ( process, struct hw, process );
- int rc;
-
- if ( xfer_window ( &hw->xfer ) ) {
- rc = xfer_deliver_raw ( &hw->xfer, hw_msg, sizeof ( hw_msg ) );
- hw_finished ( hw, rc );
- }
-}
-
-static int hw_open ( struct xfer_interface *xfer, struct uri *uri __unused ) {
- struct hw *hw;
-
- /* Allocate and initialise structure */
- hw = zalloc ( sizeof ( *hw ) );
- if ( ! hw )
- return -ENOMEM;
- xfer_init ( &hw->xfer, &hw_xfer_operations, &hw->refcnt );
- process_init ( &hw->process, hw_step, &hw->refcnt );
-
- /* Attach parent interface, mortalise self, and return */
- xfer_plug_plug ( &hw->xfer, xfer );
- ref_put ( &hw->refcnt );
- return 0;
-}
-
-struct uri_opener hw_uri_opener __uri_opener = {
- .scheme = "hw",
- .open = hw_open,
-};
diff --git a/gpxe/src/core/i82365.c b/gpxe/src/core/i82365.c
deleted file mode 100644
index c26639e0..00000000
--- a/gpxe/src/core/i82365.c
+++ /dev/null
@@ -1,656 +0,0 @@
-#ifdef CONFIG_PCMCIA
-
-/*
- * i82365.c
- * Support for i82365 and similar ISA-to-PCMCIA bridges
- *
- * Taken from Linux kernel sources, distributed under GPL2
- *
- * Software distributed under the License is distributed on an "AS
- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * rights and limitations under the License.
- *
- * The initial developer of the original code is David A. Hinds
- * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
- * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
- *
- * Ported by: Anselm Martin Hoffmeister, Stockholm Projekt Computer-Service, Sankt Augustin/Bonn, GERMANY
- */
-
-/*
- *
- *
- * ******************************
- * PLEASE DO NOT YET WORK ON THIS
- * ******************************
- *
- * I'm still fixing it up on every end, so we most probably would interfere
- * at some point. If there's anything obvious or better, not-so-obvious,
- * please contact me by e-mail: anselm (AT) hoffmeister (DOT) be *THANKS*
- */
-#include "../include/pcmcia.h"
-#include "../include/pcmcia-opts.h"
-#include "../include/i82365.h"
-
-#ifndef CONFIG_ISA
-#error PCMCIA_I82365 only works with ISA defined - set CONFIG_ISA
-#endif
-
-typedef enum pcic_id {
- IS_I82365A, IS_I82365B, IS_I82365DF,
- IS_IBM, IS_RF5Cx96, IS_VLSI, IS_VG468, IS_VG469,
- IS_PD6710, IS_PD672X, IS_VT83C469,
-} pcic_id;
-
-/* Flags for classifying groups of controllers */
-#define IS_VADEM 0x0001
-#define IS_CIRRUS 0x0002
-#define IS_TI 0x0004
-#define IS_O2MICRO 0x0008
-#define IS_VIA 0x0010
-#define IS_TOPIC 0x0020
-#define IS_RICOH 0x0040
-#define IS_UNKNOWN 0x0400
-#define IS_VG_PWR 0x0800
-#define IS_DF_PWR 0x1000
-#define IS_PCI 0x2000
-#define IS_ALIVE 0x8000
-
-typedef struct pcic_t {
- char *name;
- u_short flags;
-} pcic_t;
-
-static pcic_t pcic[] = {
- { "Intel i82365sl A step", 0 },
- { "Intel i82365sl B step", 0 },
- { "Intel i82365sl DF", IS_DF_PWR },
- { "IBM Clone", 0 },
- { "Ricoh RF5C296/396", 0 },
- { "VLSI 82C146", 0 },
- { "Vadem VG-468", IS_VADEM },
- { "Vadem VG-469", IS_VADEM|IS_VG_PWR },
- { "Cirrus PD6710", IS_CIRRUS },
- { "Cirrus PD672x", IS_CIRRUS },
- { "VIA VT83C469", IS_CIRRUS|IS_VIA },
-};
-
-typedef struct cirrus_state_t {
- u_char misc1, misc2;
- u_char timer[6];
-} cirrus_state_t;
-
-typedef struct vg46x_state_t {
- u_char ctl, ema;
-} vg46x_state_t;
-
-typedef struct socket_info_t {
- u_short type, flags;
- socket_cap_t cap;
- ioaddr_t ioaddr;
- u_short psock;
- u_char cs_irq, intr;
- void (*handler)(void *info, u_int events);
- void *info;
- union {
- cirrus_state_t cirrus;
- vg46x_state_t vg46x;
- } state;
-} socket_info_t;
-
-//static socket_info_t socket[8];
-
-int i365_base = 0x3e0; // Default in Linux kernel
-int cycle_time = 120; // External clock time in ns, 120ns =~ 8.33 MHz
-int mydriverid = 0;
-
-void phex ( unsigned char c );
-/*static int to_cycles(int ns)
-{
- return ns/cycle_time;
-}
-*/
-/*static int to_ns(int cycles)
-{
- return cycle_time*cycles;
-}
-*/
-
-static u_char i365_get(u_short sock, u_short reg)
-{
- //unsigned long flags;
- //spin_lock_irqsave(&bus_lock,flags);
- {
- ioaddr_t port = pccsock[sock].ioaddr;
- u_char val;
- reg = I365_REG(pccsock[sock].internalid, reg);
- outb(reg, port); val = inb(port+1);
- //spin_unlock_irqrestore(&bus_lock,flags);
- return val;
- }
-}
-
-static void i365_set(u_short sock, u_short reg, u_char data)
-{
- //unsigned long flags;
- //spin_lock_irqsave(&bus_lock,flags);
- {
- ioaddr_t port = pccsock[sock].ioaddr;
- u_char val = I365_REG(pccsock[sock].internalid, reg);
- outb(val, port); outb(data, port+1);
- //spin_unlock_irqrestore(&bus_lock,flags);
- }
-}
-
-void add_socket_i365(u_short port, int psock, int type) {
- pccsock[pccsocks].ioaddr = port;
- pccsock[pccsocks].internalid = psock;
- pccsock[pccsocks].type = type;
- pccsock[pccsocks].flags = pcic[type].flags;
- pccsock[pccsocks].drivernum = mydriverid;
- pccsock[pccsocks].configoffset = -1;
- // Find out if a card in inside that socket
- pccsock[pccsocks].status = (( 12 == (i365_get(pccsocks,I365_STATUS)&12) ) ? HASCARD : EMPTY );
- // *TODO* check if that's all
- if ( 0 == (psock & 1) ) {
- printf ( "Found a PCMCIA controller (i82365) at io %x, type '%s'\n", port, pcic[type].name );
- // pccsock[pccsocks].status == HASCARD? "holds card":"empty" );
- }
- pccsocks++;
- return;
-}
-
-void i365_bset(u_short sock, u_short reg, u_char mask) {
- u_char d = i365_get(sock, reg);
- d |= mask;
- i365_set(sock, reg, d);
-}
-
-void i365_bclr(u_short sock, u_short reg, u_char mask) {
- u_char d = i365_get(sock, reg);
- d &= ~mask;
- i365_set(sock, reg, d);
-}
-
-
-/*static void i365_bflip(u_short sock, u_short reg, u_char mask, int b)
-{
- u_char d = i365_get(sock, reg);
- if (b)
- d |= mask;
- else
- d &= ~mask;
- i365_set(sock, reg, d);
-}
-*/
-
-/*
-static u_short i365_get_pair(u_short sock, u_short reg)
-{
- u_short a, b;
- a = i365_get(sock, reg);
- b = i365_get(sock, reg+1);
- return (a + (b<<8));
-}
-*/
-
-/*
-static void i365_set_pair(u_short sock, u_short reg, u_short data)
-{
- i365_set(sock, reg, data & 0xff);
- i365_set(sock, reg+1, data >> 8);
-}
-*/
-int identify_i365 ( u_short port, u_short sock ) {
- u_char val;
- int type = -1;
- /* Use the next free entry in the socket table */
- pccsock[pccsocks].ioaddr = port;
- pccsock[pccsocks].internalid = sock;
- // *TODO* wakeup a sleepy cirrus controller?
-
- if ((val = i365_get(pccsocks, I365_IDENT)) & 0x70)
- return -1;
- switch (val) {
- case 0x82:
- type = IS_I82365A; break;
- case 0x83:
- type = IS_I82365B; break;
- case 0x84:
- type = IS_I82365DF; break;
- case 0x88: case 0x89: case 0x8a:
- type = IS_IBM; break;
- }
- /* Check for Vadem VG-468 chips */
- outb(0x0e, port);
- outb(0x37, port);
- i365_bset(pccsocks, VG468_MISC, VG468_MISC_VADEMREV);
- val = i365_get(pccsocks, I365_IDENT);
- if (val & I365_IDENT_VADEM) {
- i365_bclr(pccsocks, VG468_MISC, VG468_MISC_VADEMREV);
- type = ((val & 7) >= 4) ? IS_VG469 : IS_VG468;
- }
-
- /* Check for Ricoh chips */
- val = i365_get(pccsocks, RF5C_CHIP_ID);
- if ((val == RF5C_CHIP_RF5C296) || (val == RF5C_CHIP_RF5C396)) type = IS_RF5Cx96;
-
- /* Check for Cirrus CL-PD67xx chips */
- i365_set(pccsocks, PD67_CHIP_INFO, 0);
- val = i365_get(pccsocks, PD67_CHIP_INFO);
- if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) {
- val = i365_get(pccsocks, PD67_CHIP_INFO);
- if ((val & PD67_INFO_CHIP_ID) == 0) {
- type = (val & PD67_INFO_SLOTS) ? IS_PD672X : IS_PD6710;
- i365_set(pccsocks, PD67_EXT_INDEX, 0xe5);
- if (i365_get(pccsocks, PD67_EXT_INDEX) != 0xe5) type = IS_VT83C469;
- }
- }
- return type;
-}
-
-int init_i82365(void) {
- int i, j, sock, k, ns, id;
- //unsigned int ui,uj;
- //unsigned char * upc;
- ioaddr_t port;
- int i82365s = 0;
- // Change from kernel: No irq init, no check_region, no isapnp support
- // No ignore socket, no extra sockets to check (so it's easier here :-/)
- // Probably we don't need any of them; in case YOU do, SHOUT AT ME!
- id = identify_i365(i365_base, 0);
- if ((id == IS_I82365DF) && (identify_i365(i365_base, 1) != id)) {
- for (i = 0; i < 4; i++) {
- port = i365_base + ((i & 1) << 2) + ((i & 2) << 1);
- sock = (i & 1) << 1;
- if (identify_i365(port, sock) == IS_I82365DF) {
- add_socket_i365(port, sock, IS_VLSI);
- }
- }
- } else {
- for (i = 0; i < 4; i += 2) {
- port = i365_base + 2*(i>>2);
- sock = (i & 3);
- id = identify_i365(port, sock);
- if (id < 0) continue;
-
- for (j = ns = 0; j < 2; j++) {
- /* Does the socket exist? */
- if (identify_i365(port, sock+j) < 0) continue;
- /* Check for bad socket decode */
- for (k = 0; k <= i82365s; k++)
- i365_set(k, I365_MEM(0)+I365_W_OFF, k);
- for (k = 0; k <= i82365s; k++)
- if (i365_get(k, I365_MEM(0)+I365_W_OFF) != k)
- break;
- if (k <= i82365s) break;
- add_socket_i365(port, sock+j, id); ns++;
- }
- }
- }
- return 0;
-
-
-
-
-
-
-
-/* printf ( "Selecting config 1: io 0x300 @byte 87*2.." );
- upc[(2*87)] = 2;
- i365_bclr(1, I365_ADDRWIN, 1 );
- i365_set(1,I365_INTCTL, 0x65 ); //no-reset, memory-card
- i365_set(1, I365_IO(0)+0, 0x20 );
- i365_set(1, I365_IO(0)+1, 0x03 );
- i365_set(1, I365_IO(0)+2, 0x3f );
- i365_set(1, I365_IO(0)+3, 0x03 );
- i365_set(1, 0x3a, 0x05 );
- i365_set(1, 0x3b, 0x05 );
- i365_set(1, 0x3c, 0x05 );
- i365_set(1, 0x3d, 0x05 );
- i365_set(1, 0x3e, 0x05 );
- i365_set(1, 0x3f, 0x05 );
- i365_set(1, 0x07, 0x0a );
- i365_set(1, I365_ADDRWIN, 0x40 ); // 0x40
- printf ( "!\n" ); getchar();
- printf ( "\n" );
- return 0; */
-}
-
-void phex ( unsigned char c ) {
- unsigned char a = 0, b = 0;
- b = ( c & 0xf );
- if ( b > 9 ) b += ('a'-'9'-1);
- b += '0';
- a = ( c & 0xf0 ) >> 4;
- if ( a > 9 ) a += ('a'-'9'-1);
- a += '0';
- printf ( "%c%c ", a, b );
- return;
-}
-
-int deinit_i82365(void) {
- printf("Deinitializing i82365\n" );
- return 0;
-}
-
-/*static int i365_get_status(u_short sock, u_int *value)
-{
- u_int status;
-
- status = i365_get(sock, I365_STATUS);
- *value = ((status & I365_CS_DETECT) == I365_CS_DETECT)
- ? SS_DETECT : 0;
-
- if (i365_get(sock, I365_INTCTL) & I365_PC_IOCARD)
- *value |= (status & I365_CS_STSCHG) ? 0 : SS_STSCHG;
- else {
- *value |= (status & I365_CS_BVD1) ? 0 : SS_BATDEAD;
- *value |= (status & I365_CS_BVD2) ? 0 : SS_BATWARN;
- }
- *value |= (status & I365_CS_WRPROT) ? SS_WRPROT : 0;
- *value |= (status & I365_CS_READY) ? SS_READY : 0;
- *value |= (status & I365_CS_POWERON) ? SS_POWERON : 0;
-
-#ifdef CONFIG_ISA
- if (pccsock[sock].type == IS_VG469) {
- status = i365_get(sock, VG469_VSENSE);
- if (pccsock[sock].internalid & 1) {
- *value |= (status & VG469_VSENSE_B_VS1) ? 0 : SS_3VCARD;
- *value |= (status & VG469_VSENSE_B_VS2) ? 0 : SS_XVCARD;
- } else {
- *value |= (status & VG469_VSENSE_A_VS1) ? 0 : SS_3VCARD;
- *value |= (status & VG469_VSENSE_A_VS2) ? 0 : SS_XVCARD;
- }
- }
-#endif
-
- printf("i82365: GetStatus(%d) = %#4.4x\n", sock, *value);
- return 0;
-} //i365_get_status
-*/
-
-/*static int i365_set_socket(u_short sock, socket_state_t *state)
-{
- socket_info_t *t = &socket[sock];
- u_char reg;
-
- printf("i82365: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
- "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags,
- state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
-printf ("\nERROR:UNIMPLEMENTED\n" );
-return 0;
- // First set global controller options
- // set_bridge_state(sock); *TODO* check: need this here?
-
- // IO card, RESET flag, IO interrupt
- reg = t->intr;
- if (state->io_irq != t->cap.pci_irq) reg |= state->io_irq;
- reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET;
- reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0;
- i365_set(sock, I365_INTCTL, reg);
-
- reg = I365_PWR_NORESET;
- if (state->flags & SS_PWR_AUTO) reg |= I365_PWR_AUTO;
- if (state->flags & SS_OUTPUT_ENA) reg |= I365_PWR_OUT;
-
- if (t->flags & IS_CIRRUS) {
- if (state->Vpp != 0) {
- if (state->Vpp == 120)
- reg |= I365_VPP1_12V;
- else if (state->Vpp == state->Vcc)
- reg |= I365_VPP1_5V;
- else return -EINVAL;
- }
- if (state->Vcc != 0) {
- reg |= I365_VCC_5V;
- if (state->Vcc == 33)
- i365_bset(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
- else if (state->Vcc == 50)
- i365_bclr(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
- else return -EINVAL;
- }
- } else if (t->flags & IS_VG_PWR) {
- if (state->Vpp != 0) {
- if (state->Vpp == 120)
- reg |= I365_VPP1_12V;
- else if (state->Vpp == state->Vcc)
- reg |= I365_VPP1_5V;
- else return -EINVAL;
- }
- if (state->Vcc != 0) {
- reg |= I365_VCC_5V;
- if (state->Vcc == 33)
- i365_bset(sock, VG469_VSELECT, VG469_VSEL_VCC);
- else if (state->Vcc == 50)
- i365_bclr(sock, VG469_VSELECT, VG469_VSEL_VCC);
- else return -EINVAL;
- }
- } else if (t->flags & IS_DF_PWR) {
- switch (state->Vcc) {
- case 0: break;
- case 33: reg |= I365_VCC_3V; break;
- case 50: reg |= I365_VCC_5V; break;
- default: return -EINVAL;
- }
- switch (state->Vpp) {
- case 0: break;
- case 50: reg |= I365_VPP1_5V; break;
- case 120: reg |= I365_VPP1_12V; break;
- default: return -EINVAL;
- }
- } else {
- switch (state->Vcc) {
- case 0: break;
- case 50: reg |= I365_VCC_5V; break;
- default: return -EINVAL;
- }
- switch (state->Vpp) {
- case 0: break;
- case 50: reg |= I365_VPP1_5V | I365_VPP2_5V; break;
- case 120: reg |= I365_VPP1_12V | I365_VPP2_12V; break;
- default: return -EINVAL;
- }
- }
-
- if (reg != i365_get(sock, I365_POWER))
- i365_set(sock, I365_POWER, reg);
-
- // Chipset-specific functions
- if (t->flags & IS_CIRRUS) {
- // Speaker control
- i365_bflip(sock, PD67_MISC_CTL_1, PD67_MC1_SPKR_ENA,
- state->flags & SS_SPKR_ENA);
- }
-
- // Card status change interrupt mask
- reg = t->cs_irq << 4;
- if (state->csc_mask & SS_DETECT) reg |= I365_CSC_DETECT;
- if (state->flags & SS_IOCARD) {
- if (state->csc_mask & SS_STSCHG) reg |= I365_CSC_STSCHG;
- } else {
- if (state->csc_mask & SS_BATDEAD) reg |= I365_CSC_BVD1;
- if (state->csc_mask & SS_BATWARN) reg |= I365_CSC_BVD2;
- if (state->csc_mask & SS_READY) reg |= I365_CSC_READY;
- }
- i365_set(sock, I365_CSCINT, reg);
- i365_get(sock, I365_CSC);
-
- return 0;
-} // i365_set_socket
-*/
-
-/*static int i365_get_io_map(u_short sock, struct pccard_io_map *io)
-{
- u_char map, ioctl, addr;
- printf ( "GETIOMAP unimplemented\n" ); return 0;
- map = io->map;
- if (map > 1) return -EINVAL;
- io->start = i365_get_pair(sock, I365_IO(map)+I365_W_START);
- io->stop = i365_get_pair(sock, I365_IO(map)+I365_W_STOP);
- ioctl = i365_get(sock, I365_IOCTL);
- addr = i365_get(sock, I365_ADDRWIN);
- io->speed = to_ns(ioctl & I365_IOCTL_WAIT(map)) ? 1 : 0;
- io->flags = (addr & I365_ENA_IO(map)) ? MAP_ACTIVE : 0;
- io->flags |= (ioctl & I365_IOCTL_0WS(map)) ? MAP_0WS : 0;
- io->flags |= (ioctl & I365_IOCTL_16BIT(map)) ? MAP_16BIT : 0;
- io->flags |= (ioctl & I365_IOCTL_IOCS16(map)) ? MAP_AUTOSZ : 0;
- printf("i82365: GetIOMap(%d, %d) = %#2.2x, %d ns, "
- "%#4.4x-%#4.4x\n", sock, map, io->flags, io->speed,
- io->start, io->stop);
- return 0;
-} // i365_get_io_map
-*/
-
-/*====================================================================*/
-
-/*static int i365_set_io_map(u_short sock, struct pccard_io_map *io)
-{
- u_char map, ioctl;
-
- printf("i82365: SetIOMap(%d, %d, %#2.2x, %d ns, "
- "%#4.4x-%#4.4x)\n", sock, io->map, io->flags,
- io->speed, io->start, io->stop);
-printf ( "UNIMPLEMENTED\n" );
- return 0;
- map = io->map;
- //if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) ||
- if ((map > 1) ||
- (io->stop < io->start)) return -EINVAL;
- // Turn off the window before changing anything
- if (i365_get(sock, I365_ADDRWIN) & I365_ENA_IO(map))
- i365_bclr(sock, I365_ADDRWIN, I365_ENA_IO(map));
- i365_set_pair(sock, I365_IO(map)+I365_W_START, io->start);
- i365_set_pair(sock, I365_IO(map)+I365_W_STOP, io->stop);
- ioctl = i365_get(sock, I365_IOCTL) & ~I365_IOCTL_MASK(map);
- if (io->speed) ioctl |= I365_IOCTL_WAIT(map);
- if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map);
- if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map);
- if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map);
- i365_set(sock, I365_IOCTL, ioctl);
- // Turn on the window if necessary
- if (io->flags & MAP_ACTIVE)
- i365_bset(sock, I365_ADDRWIN, I365_ENA_IO(map));
- return 0;
-} // i365_set_io_map
-*/
-
-/*
-static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
-{
- u_short base, i;
- u_char map;
-
- printf("i82365: SetMemMap(%d, %d, %#2.2x, %d ns, %#5.5lx-%#5.5"
- "lx, %#5.5x)\n", sock, mem->map, mem->flags, mem->speed,
- mem->sys_start, mem->sys_stop, mem->card_start);
-
-printf ( "UNIMPLEMENTED\n" );
- return 0;
- map = mem->map;
- if ((map > 4) || (mem->card_start > 0x3ffffff) ||
- (mem->sys_start > mem->sys_stop) || (mem->speed > 1000))
- return -EINVAL;
- if (!(socket[sock].flags & IS_PCI) &&
- ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff)))
- return -EINVAL;
-
- // Turn off the window before changing anything
- if (i365_get(sock, I365_ADDRWIN) & I365_ENA_MEM(map))
- i365_bclr(sock, I365_ADDRWIN, I365_ENA_MEM(map));
-
- base = I365_MEM(map);
- i = (mem->sys_start >> 12) & 0x0fff;
- if (mem->flags & MAP_16BIT) i |= I365_MEM_16BIT;
- if (mem->flags & MAP_0WS) i |= I365_MEM_0WS;
- i365_set_pair(sock, base+I365_W_START, i);
-
- i = (mem->sys_stop >> 12) & 0x0fff;
- switch (to_cycles(mem->speed)) {
- case 0: break;
- case 1: i |= I365_MEM_WS0; break;
- case 2: i |= I365_MEM_WS1; break;
- default: i |= I365_MEM_WS1 | I365_MEM_WS0; break;
- }
- i365_set_pair(sock, base+I365_W_STOP, i);
-
- i = ((mem->card_start - mem->sys_start) >> 12) & 0x3fff;
- if (mem->flags & MAP_WRPROT) i |= I365_MEM_WRPROT;
- if (mem->flags & MAP_ATTRIB) i |= I365_MEM_REG;
- i365_set_pair(sock, base+I365_W_OFF, i);
-
- // Turn on the window if necessary
- if (mem->flags & MAP_ACTIVE)
- i365_bset(sock, I365_ADDRWIN, I365_ENA_MEM(map));
- return 0;
-} // i365_set_mem_map
-*/
-
-
-int i82365_interfacer ( interface_func_t func, int sockno, int par1, int par2, void* par3 ) {
- //int i, j, k;
- //u_int ui;
- u_char *upc;
- struct pcc_config_t * pccc;
- switch ( func ) {
- case INIT:
- mydriverid = par1;
- return init_i82365();
- case SHUTDOWN:
- i365_set(sockno, I365_ADDRWIN, i365_get(sockno, I365_ADDRWIN) & 0x20 );
- i365_set(sockno, I365_INTCTL, 0x05 );
- sleepticks(2);
- i365_set(sockno,I365_INTCTL, 0x45 ); //no-reset, memory-card
- break;
- case MAPATTRMEM:
- i365_set(sockno,I365_POWER, 0xb1 );
- i365_set(sockno, I365_INTCTL, 0x05 );
- sleepticks(2);
- i365_set(sockno,I365_INTCTL, 0x45 ); //no-reset, memory-card
- i365_set(sockno, I365_ADDRWIN, i365_get(sockno, I365_ADDRWIN) & 0x20 );
- //i365_bclr(sockno, I365_ADDRWIN, 1 );
- i365_set(sockno, I365_MEM(0)+0, ( par1 >> 12 )& 0xff ); //start
- i365_set(sockno, I365_MEM(0)+1, ( par1 >> 20 ) & 0x0f );
- i365_set(sockno, I365_MEM(0)+2, ((par1 + par2 - 1 ) >> 12 ) & 0xff ); //end
- i365_set(sockno, I365_MEM(0)+3, (( par1 + par2 - 1 ) >> 20 ) & 0x0f );
- i365_set(sockno, I365_MEM(0)+4, ((0x4000000 - par1) >> 12) & 0xff ); //offset low
- i365_set(sockno, I365_MEM(0)+5, 0x40 | (((0x40000000 - par1) >> 12) & 0x3f));
- i365_bset(sockno, I365_ADDRWIN, 1 );
- if ( ! ( 1 & i365_get ( sockno, I365_ADDRWIN ) ) ) return 1;
- break;
- case UNMAPATTRMEM:
- i365_set(sockno, I365_ADDRWIN, i365_get(sockno, I365_ADDRWIN) & 0x20 );
- i365_set(sockno,I365_INTCTL, 0x45 ); //no-reset, memory-card
- break;
- case SELECTCONFIG: // Params: par1: config number; par3 config pointer pointer
- if ( 0 > pccsock[sockno].configoffset ) return 1;
- if ( NULL == (pccc = par3 ) ) return 2;
- // write config number to
- upc = ioremap ( MAP_ATTRMEM_TO, MAP_ATTRMEM_LEN );
- if ( pccsock[sockno].configoffset > MAP_ATTRMEM_LEN ) return 3;
- if ( ( par1 & 0x7fffffc0 ) ) return 4;
- if ( pccc->index != par1 ) return 5;
- upc[pccsock[sockno].configoffset] = ( upc[pccsock[sockno].configoffset] & 0xc0 ) | ( par1 & 0x3f );
- i365_set(sockno, I365_IOCTL, (i365_get(sockno, I365_IOCTL) & 0xfe) | 0x20 ); // 16bit autosize
- i365_set(sockno, I365_IO(0)+0, pccc->iowin & 0xff);
- i365_set(sockno, I365_IO(0)+1, (pccc->iowin >> 8) & 0xff);
- i365_set(sockno, I365_IO(0)+2, (pccc->iowin+pccc->iolen - 1) & 0xff);
- i365_set(sockno, I365_IO(0)+3, ((pccc->iowin+pccc->iolen- 1) >> 8) & 0xff);
- // Disable mem mapping
- i365_bclr(sockno, I365_ADDRWIN, 1);
- i365_set(sockno, I365_INTCTL, 0x65);
- i365_bset(sockno, I365_ADDRWIN,0x40);
- break;
- default:
- return -1; // ERROR: Unknown function called
- }
- return 0;
-}
-
-// get_mem_map[1320]
-// cirrus_get_state/set/opts...
-// vg46x_get_state/...
-// get_bridge_state/...
-
-#endif /* CONFIG_PCMCIA */
diff --git a/gpxe/src/core/image.c b/gpxe/src/core/image.c
deleted file mode 100644
index 24fe51ab..00000000
--- a/gpxe/src/core/image.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stddef.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <assert.h>
-#include <libgen.h>
-#include <gpxe/list.h>
-#include <gpxe/umalloc.h>
-#include <gpxe/uri.h>
-#include <gpxe/image.h>
-
-/** @file
- *
- * Executable/loadable images
- *
- */
-
-/** List of registered images */
-struct list_head images = LIST_HEAD_INIT ( images );
-
-/**
- * Free executable/loadable image
- *
- * @v refcnt Reference counter
- */
-static void free_image ( struct refcnt *refcnt ) {
- struct image *image = container_of ( refcnt, struct image, refcnt );
-
- uri_put ( image->uri );
- ufree ( image->data );
- image_put ( image->replacement );
- free ( image );
- DBGC ( image, "IMAGE %p freed\n", image );
-}
-
-/**
- * Allocate executable/loadable image
- *
- * @ret image Executable/loadable image
- */
-struct image * alloc_image ( void ) {
- struct image *image;
-
- image = zalloc ( sizeof ( *image ) );
- if ( image ) {
- image->refcnt.free = free_image;
- }
- return image;
-}
-
-/**
- * Set image URI
- *
- * @v image Image
- * @v URI New image URI
- * @ret rc Return status code
- *
- * If no name is set, the name will be updated to the base name of the
- * URI path (if any).
- */
-int image_set_uri ( struct image *image, struct uri *uri ) {
- const char *path = uri->path;
-
- /* Replace URI reference */
- uri_put ( image->uri );
- image->uri = uri_get ( uri );
-
- /* Set name if none already specified */
- if ( path && ( ! image->name[0] ) )
- image_set_name ( image, basename ( ( char * ) path ) );
-
- return 0;
-}
-
-/**
- * Set image command line
- *
- * @v image Image
- * @v cmdline New image command line
- * @ret rc Return status code
- */
-int image_set_cmdline ( struct image *image, const char *cmdline ) {
- free ( image->cmdline );
- image->cmdline = strdup ( cmdline );
- if ( ! image->cmdline )
- return -ENOMEM;
- return 0;
-}
-
-/**
- * Register executable/loadable image
- *
- * @v image Executable/loadable image
- * @ret rc Return status code
- */
-int register_image ( struct image *image ) {
- static unsigned int imgindex = 0;
-
- /* Create image name if it doesn't already have one */
- if ( ! image->name[0] ) {
- snprintf ( image->name, sizeof ( image->name ), "img%d",
- imgindex++ );
- }
-
- /* Add to image list */
- image_get ( image );
- list_add_tail ( &image->list, &images );
- DBGC ( image, "IMAGE %p at [%lx,%lx) registered as %s\n",
- image, user_to_phys ( image->data, 0 ),
- user_to_phys ( image->data, image->len ), image->name );
-
- return 0;
-}
-
-/**
- * Unregister executable/loadable image
- *
- * @v image Executable/loadable image
- */
-void unregister_image ( struct image *image ) {
- DBGC ( image, "IMAGE %p unregistered\n", image );
- list_del ( &image->list );
- image_put ( image );
-}
-
-/**
- * Find image by name
- *
- * @v name Image name
- * @ret image Executable/loadable image, or NULL
- */
-struct image * find_image ( const char *name ) {
- struct image *image;
-
- list_for_each_entry ( image, &images, list ) {
- if ( strcmp ( image->name, name ) == 0 )
- return image;
- }
-
- return NULL;
-}
-
-/**
- * Load executable/loadable image into memory
- *
- * @v image Executable/loadable image
- * @v type Executable/loadable image type
- * @ret rc Return status code
- */
-static int image_load_type ( struct image *image, struct image_type *type ) {
- int rc;
-
- /* Check image is actually loadable */
- if ( ! type->load )
- return -ENOEXEC;
-
- /* Try the image loader */
- if ( ( rc = type->load ( image ) ) != 0 ) {
- DBGC ( image, "IMAGE %p could not load as %s: %s\n",
- image, type->name, strerror ( rc ) );
- return rc;
- }
-
- /* Flag as loaded */
- image->flags |= IMAGE_LOADED;
- return 0;
-}
-
-/**
- * Load executable/loadable image into memory
- *
- * @v image Executable/loadable image
- * @ret rc Return status code
- */
-int image_load ( struct image *image ) {
-
- assert ( image->type != NULL );
-
- return image_load_type ( image, image->type );
-}
-
-/**
- * Autodetect image type and load executable/loadable image into memory
- *
- * @v image Executable/loadable image
- * @ret rc Return status code
- */
-int image_autoload ( struct image *image ) {
- struct image_type *type;
- int rc;
-
- /* If image already has a type, use it */
- if ( image->type )
- return image_load ( image );
-
- /* Otherwise probe for a suitable type */
- for_each_table_entry ( type, IMAGE_TYPES ) {
- DBGC ( image, "IMAGE %p trying type %s\n", image, type->name );
- rc = image_load_type ( image, type );
- if ( image->type == NULL )
- continue;
- return rc;
- }
-
- DBGC ( image, "IMAGE %p format not recognised\n", image );
- return -ENOEXEC;
-}
-
-/**
- * Execute loaded image
- *
- * @v image Loaded image
- * @ret rc Return status code
- */
-int image_exec ( struct image *image ) {
- struct image *replacement;
- struct uri *old_cwuri;
- int rc;
-
- /* Image must be loaded first */
- if ( ! ( image->flags & IMAGE_LOADED ) ) {
- DBGC ( image, "IMAGE %p could not execute: not loaded\n",
- image );
- return -ENOTTY;
- }
-
- assert ( image->type != NULL );
-
- /* Check that image is actually executable */
- if ( ! image->type->exec )
- return -ENOEXEC;
-
- /* Switch current working directory to be that of the image itself */
- old_cwuri = uri_get ( cwuri );
- churi ( image->uri );
-
- /* Take out a temporary reference to the image. This allows
- * the image to unregister itself if necessary, without
- * automatically freeing itself.
- */
- image_get ( image );
-
- /* Try executing the image */
- if ( ( rc = image->type->exec ( image ) ) != 0 ) {
- DBGC ( image, "IMAGE %p could not execute: %s\n",
- image, strerror ( rc ) );
- /* Do not return yet; we still have clean-up to do */
- }
-
- /* Pick up replacement image before we drop the original
- * image's temporary reference.
- */
- replacement = image->replacement;
-
- /* Drop temporary reference to the original image */
- image_put ( image );
-
- /* Reset current working directory */
- churi ( old_cwuri );
- uri_put ( old_cwuri );
-
- /* Tail-recurse into replacement image, if one exists */
- if ( replacement ) {
- DBGC ( image, "IMAGE %p replacing self with IMAGE %p\n",
- image, replacement );
- if ( ( rc = image_exec ( replacement ) ) != 0 )
- return rc;
- }
-
- return rc;
-}
-
-/**
- * Register and autoload an image
- *
- * @v image Image
- * @ret rc Return status code
- */
-int register_and_autoload_image ( struct image *image ) {
- int rc;
-
- if ( ( rc = register_image ( image ) ) != 0 )
- return rc;
-
- if ( ( rc = image_autoload ( image ) ) != 0 )
- return rc;
-
- return 0;
-}
-
-/**
- * Register and autoexec an image
- *
- * @v image Image
- * @ret rc Return status code
- */
-int register_and_autoexec_image ( struct image *image ) {
- int rc;
-
- if ( ( rc = register_and_autoload_image ( image ) ) != 0 )
- return rc;
-
- if ( ( rc = image_exec ( image ) ) != 0 )
- return rc;
-
- return 0;
-}
diff --git a/gpxe/src/core/init.c b/gpxe/src/core/init.c
deleted file mode 100644
index cd0f6dcc..00000000
--- a/gpxe/src/core/init.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <gpxe/device.h>
-#include <gpxe/init.h>
-
-/** @file
- *
- * Initialisation, startup and shutdown routines
- *
- */
-
-/** "startup() has been called" flag */
-static int started = 0;
-
-/**
- * Initialise gPXE
- *
- * This function performs the one-time-only and irreversible
- * initialisation steps, such as initialising the heap. It must be
- * called before (almost) any other function.
- *
- * There is, by definition, no counterpart to this function on the
- * shutdown path.
- */
-void initialise ( void ) {
- struct init_fn *init_fn;
-
- /* Call registered initialisation functions */
- for_each_table_entry ( init_fn, INIT_FNS )
- init_fn->initialise ();
-}
-
-/**
- * Start up gPXE
- *
- * This function performs the repeatable initialisation steps, such as
- * probing devices. You may call startup() and shutdown() multiple
- * times (as is done via the PXE API when PXENV_START_UNDI is used).
- */
-void startup ( void ) {
- struct startup_fn *startup_fn;
-
- if ( started )
- return;
-
- /* Call registered startup functions */
- for_each_table_entry ( startup_fn, STARTUP_FNS ) {
- if ( startup_fn->startup )
- startup_fn->startup();
- }
-
- started = 1;
-}
-
-/**
- * Shut down gPXE
- *
- * @v flags Shutdown behaviour flags
- *
- * This function reverses the actions of startup(), and leaves gPXE in
- * a state ready to be removed from memory. You may call startup()
- * again after calling shutdown().
- *
- * Call this function only once, before either exiting main() or
- * starting up a non-returnable image.
- */
-void shutdown ( int flags ) {
- struct startup_fn *startup_fn;
-
- if ( ! started )
- return;
-
- /* Call registered shutdown functions (in reverse order) */
- for_each_table_entry_reverse ( startup_fn, STARTUP_FNS ) {
- if ( startup_fn->shutdown )
- startup_fn->shutdown ( flags );
- }
-
- started = 0;
-}
diff --git a/gpxe/src/core/interface.c b/gpxe/src/core/interface.c
deleted file mode 100644
index 43d58ed2..00000000
--- a/gpxe/src/core/interface.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <gpxe/interface.h>
-
-/** @file
- *
- * Object communication interfaces
- *
- */
-
-/**
- * Plug an interface into a new destination interface
- *
- * @v intf Interface
- * @v dest New destination interface
- *
- * The reference to the existing destination interface is dropped, a
- * reference to the new destination interface is obtained, and the
- * interface is updated to point to the new destination interface.
- *
- * Note that there is no "unplug" call; instead you must plug the
- * interface into a null interface.
- */
-void plug ( struct interface *intf, struct interface *dest ) {
- DBGC ( intf, "INTF %p moving from INTF %p to INTF %p\n",
- intf, intf->dest, dest );
- intf_put ( intf->dest );
- intf->dest = intf_get ( dest );
-}
-
-/**
- * Plug two interfaces together
- *
- * @v a Interface A
- * @v b Interface B
- *
- * Plugs interface A into interface B, and interface B into interface
- * A. (The basic plug() function is unidirectional; this function is
- * merely a shorthand for two calls to plug(), hence the name.)
- */
-void plug_plug ( struct interface *a, struct interface *b ) {
- plug ( a, b );
- plug ( b, a );
-}
diff --git a/gpxe/src/core/iobuf.c b/gpxe/src/core/iobuf.c
deleted file mode 100644
index 1ce7890e..00000000
--- a/gpxe/src/core/iobuf.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdint.h>
-#include <errno.h>
-#include <gpxe/malloc.h>
-#include <gpxe/iobuf.h>
-
-/** @file
- *
- * I/O buffers
- *
- */
-
-/**
- * Allocate I/O buffer
- *
- * @v len Required length of buffer
- * @ret iobuf I/O buffer, or NULL if none available
- *
- * The I/O buffer will be physically aligned to a multiple of
- * @c IOBUF_SIZE.
- */
-struct io_buffer * alloc_iob ( size_t len ) {
- struct io_buffer *iobuf = NULL;
- void *data;
-
- /* Pad to minimum length */
- if ( len < IOB_ZLEN )
- len = IOB_ZLEN;
-
- /* Align buffer length */
- len = ( len + __alignof__( *iobuf ) - 1 ) &
- ~( __alignof__( *iobuf ) - 1 );
-
- /* Allocate memory for buffer plus descriptor */
- data = malloc_dma ( len + sizeof ( *iobuf ), IOB_ALIGN );
- if ( ! data )
- return NULL;
-
- iobuf = ( struct io_buffer * ) ( data + len );
- iobuf->head = iobuf->data = iobuf->tail = data;
- iobuf->end = iobuf;
- return iobuf;
-}
-
-/**
- * Free I/O buffer
- *
- * @v iobuf I/O buffer
- */
-void free_iob ( struct io_buffer *iobuf ) {
- if ( iobuf ) {
- assert ( iobuf->head <= iobuf->data );
- assert ( iobuf->data <= iobuf->tail );
- assert ( iobuf->tail <= iobuf->end );
- free_dma ( iobuf->head,
- ( iobuf->end - iobuf->head ) + sizeof ( *iobuf ) );
- }
-}
-
-/**
- * Ensure I/O buffer has sufficient headroom
- *
- * @v iobuf I/O buffer
- * @v len Required headroom
- *
- * This function currently only checks for the required headroom; it
- * does not reallocate the I/O buffer if required. If we ever have a
- * code path that requires this functionality, it's a fairly trivial
- * change to make.
- */
-int iob_ensure_headroom ( struct io_buffer *iobuf, size_t len ) {
-
- if ( iob_headroom ( iobuf ) >= len )
- return 0;
- return -ENOBUFS;
-}
-
diff --git a/gpxe/src/core/job.c b/gpxe/src/core/job.c
deleted file mode 100644
index 438064ef..00000000
--- a/gpxe/src/core/job.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <string.h>
-#include <errno.h>
-#include <gpxe/job.h>
-
-/** @file
- *
- * Job control interfaces
- *
- */
-
-void job_done ( struct job_interface *job, int rc ) {
- struct job_interface *dest = job_get_dest ( job );
-
- job_unplug ( job );
- dest->op->done ( dest, rc );
- job_put ( dest );
-}
-
-void job_kill ( struct job_interface *job ) {
- struct job_interface *dest = job_get_dest ( job );
-
- job_unplug ( job );
- dest->op->kill ( dest );
- job_put ( dest );
-}
-
-void job_progress ( struct job_interface *job,
- struct job_progress *progress ) {
- struct job_interface *dest = job_get_dest ( job );
-
- dest->op->progress ( dest, progress );
- job_put ( dest );
-}
-
-/****************************************************************************
- *
- * Helper methods
- *
- * These functions are designed to be used as methods in the
- * job_interface_operations table.
- *
- */
-
-void ignore_job_done ( struct job_interface *job __unused, int rc __unused ) {
- /* Nothing to do */
-}
-
-void ignore_job_kill ( struct job_interface *job __unused ) {
- /* Nothing to do */
-}
-
-void ignore_job_progress ( struct job_interface *job __unused,
- struct job_progress *progress ) {
- memset ( progress, 0, sizeof ( *progress ) );
-}
-
-/** Null job control interface operations */
-struct job_interface_operations null_job_ops = {
- .done = ignore_job_done,
- .kill = ignore_job_kill,
- .progress = ignore_job_progress,
-};
-
-/**
- * Null job control interface
- *
- * This is the interface to which job control interfaces are connected
- * when unplugged. It will never generate messages, and will silently
- * absorb all received messages.
- */
-struct job_interface null_job = {
- .intf = {
- .dest = &null_job.intf,
- .refcnt = NULL,
- },
- .op = &null_job_ops,
-};
diff --git a/gpxe/src/core/linebuf.c b/gpxe/src/core/linebuf.c
deleted file mode 100644
index 221f4e1a..00000000
--- a/gpxe/src/core/linebuf.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-/**
- * @file
- *
- * Line buffering
- *
- */
-
-#include <stdint.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <gpxe/linebuf.h>
-
-/**
- * Retrieve buffered-up line
- *
- * @v linebuf Line buffer
- * @ret line Buffered line, or NULL if no line ready to read
- */
-char * buffered_line ( struct line_buffer *linebuf ) {
- return ( linebuf->ready ? linebuf->data : NULL );
-}
-
-/**
- * Discard line buffer contents
- *
- * @v linebuf Line buffer
- */
-void empty_line_buffer ( struct line_buffer *linebuf ) {
- free ( linebuf->data );
- linebuf->data = NULL;
- linebuf->len = 0;
- linebuf->ready = 0;
-}
-
-/**
- * Buffer up received data by lines
- *
- * @v linebuf Line buffer
- * @v data New data to add
- * @v len Length of new data to add
- * @ret len Consumed length, or negative error number
- *
- * After calling line_buffer(), use buffered_line() to determine
- * whether or not a complete line is available. Carriage returns and
- * newlines will have been stripped, and the line will be
- * NUL-terminated. This buffered line is valid only until the next
- * call to line_buffer() (or to empty_line_buffer()).
- *
- * Note that line buffers use dynamically allocated storage; you
- * should call empty_line_buffer() before freeing a @c struct @c
- * line_buffer.
- */
-ssize_t line_buffer ( struct line_buffer *linebuf,
- const char *data, size_t len ) {
- const char *eol;
- size_t consume;
- size_t new_len;
- char *new_data;
-
- /* Free any completed line from previous iteration */
- if ( linebuf->ready )
- empty_line_buffer ( linebuf );
-
- /* Search for line terminator */
- if ( ( eol = memchr ( data, '\n', len ) ) ) {
- consume = ( eol - data + 1 );
- } else {
- consume = len;
- }
-
- /* Reallocate data buffer and copy in new data */
- new_len = ( linebuf->len + consume );
- new_data = realloc ( linebuf->data, ( new_len + 1 ) );
- if ( ! new_data )
- return -ENOMEM;
- memcpy ( ( new_data + linebuf->len ), data, consume );
- new_data[new_len] = '\0';
- linebuf->data = new_data;
- linebuf->len = new_len;
-
- /* If we have reached end of line, trim the line and mark as ready */
- if ( eol ) {
- linebuf->data[--linebuf->len] = '\0'; /* trim NL */
- if ( linebuf->data[linebuf->len - 1] == '\r' )
- linebuf->data[--linebuf->len] = '\0'; /* trim CR */
- linebuf->ready = 1;
- }
-
- return consume;
-}
diff --git a/gpxe/src/core/main.c b/gpxe/src/core/main.c
deleted file mode 100644
index d07d24c0..00000000
--- a/gpxe/src/core/main.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/**************************************************************************
-gPXE - Network Bootstrap Program
-
-Literature dealing with the network protocols:
- ARP - RFC826
- RARP - RFC903
- UDP - RFC768
- BOOTP - RFC951, RFC2132 (vendor extensions)
- DHCP - RFC2131, RFC2132 (options)
- TFTP - RFC1350, RFC2347 (options), RFC2348 (blocksize), RFC2349 (tsize)
- RPC - RFC1831, RFC1832 (XDR), RFC1833 (rpcbind/portmapper)
-
-**************************************************************************/
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdio.h>
-#include <gpxe/init.h>
-#include <gpxe/features.h>
-#include <gpxe/shell.h>
-#include <gpxe/shell_banner.h>
-#include <gpxe/image.h>
-#include <usr/autoboot.h>
-#include <config/general.h>
-
-#define NORMAL "\033[0m"
-#define BOLD "\033[1m"
-#define CYAN "\033[36m"
-
-/**
- * Main entry point
- *
- * @ret rc Return status code
- */
-__asmcall int main ( void ) {
- struct feature *feature;
- struct image *image;
-
- /* Some devices take an unreasonably long time to initialise */
- printf ( PRODUCT_SHORT_NAME " initialising devices...\n" );
-
- initialise();
- startup();
-
- /*
- * Print welcome banner
- *
- *
- * If you wish to brand this build of gPXE, please do so by
- * defining the string PRODUCT_NAME in config/general.h.
- *
- * While nothing in the GPL prevents you from removing all
- * references to gPXE or http://etherboot.org, we prefer you
- * not to do so.
- *
- */
- printf ( NORMAL "\n\n" PRODUCT_NAME "\n" BOLD "gPXE " VERSION
- NORMAL " -- Open Source Boot Firmware -- "
- CYAN "http://etherboot.org" NORMAL "\n"
- "Features:" );
- for_each_table_entry ( feature, FEATURES )
- printf ( " %s", feature->name );
- printf ( "\n" );
-
- /* Prompt for shell */
- if ( shell_banner() ) {
- /* User wants shell; just give them a shell */
- shell();
- } else {
- /* User doesn't want shell; load and execute the first
- * image, or autoboot() if we have no images. If
- * booting fails for any reason, offer a second chance
- * to enter the shell for diagnostics.
- */
- if ( have_images() ) {
- for_each_image ( image ) {
- image_exec ( image );
- break;
- }
- } else {
- autoboot();
- }
-
- if ( shell_banner() )
- shell();
- }
-
- shutdown ( SHUTDOWN_EXIT | shutdown_exit_flags );
-
- return 0;
-}
diff --git a/gpxe/src/core/malloc.c b/gpxe/src/core/malloc.c
deleted file mode 100644
index 01537483..00000000
--- a/gpxe/src/core/malloc.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-#include <strings.h>
-#include <gpxe/io.h>
-#include <gpxe/list.h>
-#include <gpxe/init.h>
-#include <gpxe/malloc.h>
-
-/** @file
- *
- * Dynamic memory allocation
- *
- */
-
-/** A free block of memory */
-struct memory_block {
- /** List of free blocks */
- struct list_head list;
- /** Size of this block */
- size_t size;
-};
-
-#define MIN_MEMBLOCK_SIZE \
- ( ( size_t ) ( 1 << ( fls ( sizeof ( struct memory_block ) - 1 ) ) ) )
-
-/** A block of allocated memory complete with size information */
-struct autosized_block {
- /** Size of this block */
- size_t size;
- /** Remaining data */
- char data[0];
-};
-
-/**
- * Address for zero-length memory blocks
- *
- * @c malloc(0) or @c realloc(ptr,0) will return the special value @c
- * NOWHERE. Calling @c free(NOWHERE) will have no effect.
- *
- * This is consistent with the ANSI C standards, which state that
- * "either NULL or a pointer suitable to be passed to free()" must be
- * returned in these cases. Using a special non-NULL value means that
- * the caller can take a NULL return value to indicate failure,
- * without first having to check for a requested size of zero.
- *
- * Code outside of malloc.c do not ever need to refer to the actual
- * value of @c NOWHERE; this is an internal definition.
- */
-#define NOWHERE ( ( void * ) ~( ( intptr_t ) 0 ) )
-
-/** List of free memory blocks */
-static LIST_HEAD ( free_blocks );
-
-/** Total amount of free memory */
-size_t freemem;
-
-/**
- * Heap size
- *
- * Currently fixed at 512kB.
- */
-#define HEAP_SIZE ( 512 * 1024 )
-
-/** The heap itself */
-static char heap[HEAP_SIZE] __attribute__ (( aligned ( __alignof__(void *) )));
-
-/**
- * Allocate a memory block
- *
- * @v size Requested size
- * @v align Physical alignment
- * @ret ptr Memory block, or NULL
- *
- * Allocates a memory block @b physically aligned as requested. No
- * guarantees are provided for the alignment of the virtual address.
- *
- * @c align must be a power of two. @c size may not be zero.
- */
-void * alloc_memblock ( size_t size, size_t align ) {
- struct memory_block *block;
- size_t align_mask;
- size_t pre_size;
- ssize_t post_size;
- struct memory_block *pre;
- struct memory_block *post;
-
- /* Round up size to multiple of MIN_MEMBLOCK_SIZE and
- * calculate alignment mask.
- */
- size = ( size + MIN_MEMBLOCK_SIZE - 1 ) & ~( MIN_MEMBLOCK_SIZE - 1 );
- align_mask = ( align - 1 ) | ( MIN_MEMBLOCK_SIZE - 1 );
-
- DBG ( "Allocating %#zx (aligned %#zx)\n", size, align );
-
- /* Search through blocks for the first one with enough space */
- list_for_each_entry ( block, &free_blocks, list ) {
- pre_size = ( - virt_to_phys ( block ) ) & align_mask;
- post_size = block->size - pre_size - size;
- if ( post_size >= 0 ) {
- /* Split block into pre-block, block, and
- * post-block. After this split, the "pre"
- * block is the one currently linked into the
- * free list.
- */
- pre = block;
- block = ( ( ( void * ) pre ) + pre_size );
- post = ( ( ( void * ) block ) + size );
- DBG ( "[%p,%p) -> [%p,%p) + [%p,%p)\n", pre,
- ( ( ( void * ) pre ) + pre->size ), pre, block,
- post, ( ( ( void * ) pre ) + pre->size ) );
- /* If there is a "post" block, add it in to
- * the free list. Leak it if it is too small
- * (which can happen only at the very end of
- * the heap).
- */
- if ( ( size_t ) post_size >= MIN_MEMBLOCK_SIZE ) {
- post->size = post_size;
- list_add ( &post->list, &pre->list );
- }
- /* Shrink "pre" block, leaving the main block
- * isolated and no longer part of the free
- * list.
- */
- pre->size = pre_size;
- /* If there is no "pre" block, remove it from
- * the list. Also remove it (i.e. leak it) if
- * it is too small, which can happen only at
- * the very start of the heap.
- */
- if ( pre_size < MIN_MEMBLOCK_SIZE )
- list_del ( &pre->list );
- /* Update total free memory */
- freemem -= size;
- /* Return allocated block */
- DBG ( "Allocated [%p,%p)\n", block,
- ( ( ( void * ) block ) + size ) );
- return block;
- }
- }
-
- DBG ( "Failed to allocate %#zx (aligned %#zx)\n", size, align );
- return NULL;
-}
-
-/**
- * Free a memory block
- *
- * @v ptr Memory allocated by alloc_memblock(), or NULL
- * @v size Size of the memory
- *
- * If @c ptr is NULL, no action is taken.
- */
-void free_memblock ( void *ptr, size_t size ) {
- struct memory_block *freeing;
- struct memory_block *block;
- ssize_t gap_before;
- ssize_t gap_after = -1;
-
- /* Allow for ptr==NULL */
- if ( ! ptr )
- return;
-
- /* Round up size to match actual size that alloc_memblock()
- * would have used.
- */
- size = ( size + MIN_MEMBLOCK_SIZE - 1 ) & ~( MIN_MEMBLOCK_SIZE - 1 );
- freeing = ptr;
- freeing->size = size;
- DBG ( "Freeing [%p,%p)\n", freeing, ( ( ( void * ) freeing ) + size ));
-
- /* Insert/merge into free list */
- list_for_each_entry ( block, &free_blocks, list ) {
- /* Calculate gaps before and after the "freeing" block */
- gap_before = ( ( ( void * ) freeing ) -
- ( ( ( void * ) block ) + block->size ) );
- gap_after = ( ( ( void * ) block ) -
- ( ( ( void * ) freeing ) + freeing->size ) );
- /* Merge with immediately preceding block, if possible */
- if ( gap_before == 0 ) {
- DBG ( "[%p,%p) + [%p,%p) -> [%p,%p)\n", block,
- ( ( ( void * ) block ) + block->size ), freeing,
- ( ( ( void * ) freeing ) + freeing->size ),block,
- ( ( ( void * ) freeing ) + freeing->size ) );
- block->size += size;
- list_del ( &block->list );
- freeing = block;
- }
- /* Stop processing as soon as we reach a following block */
- if ( gap_after >= 0 )
- break;
- }
-
- /* Insert before the immediately following block. If
- * possible, merge the following block into the "freeing"
- * block.
- */
- DBG ( "[%p,%p)\n", freeing, ( ( ( void * ) freeing ) + freeing->size));
- list_add_tail ( &freeing->list, &block->list );
- if ( gap_after == 0 ) {
- DBG ( "[%p,%p) + [%p,%p) -> [%p,%p)\n", freeing,
- ( ( ( void * ) freeing ) + freeing->size ), block,
- ( ( ( void * ) block ) + block->size ), freeing,
- ( ( ( void * ) block ) + block->size ) );
- freeing->size += block->size;
- list_del ( &block->list );
- }
-
- /* Update free memory counter */
- freemem += size;
-}
-
-/**
- * Reallocate memory
- *
- * @v old_ptr Memory previously allocated by malloc(), or NULL
- * @v new_size Requested size
- * @ret new_ptr Allocated memory, or NULL
- *
- * Allocates memory with no particular alignment requirement. @c
- * new_ptr will be aligned to at least a multiple of sizeof(void*).
- * If @c old_ptr is non-NULL, then the contents of the newly allocated
- * memory will be the same as the contents of the previously allocated
- * memory, up to the minimum of the old and new sizes. The old memory
- * will be freed.
- *
- * If allocation fails the previously allocated block is left
- * untouched and NULL is returned.
- *
- * Calling realloc() with a new size of zero is a valid way to free a
- * memory block.
- */
-void * realloc ( void *old_ptr, size_t new_size ) {
- struct autosized_block *old_block;
- struct autosized_block *new_block;
- size_t old_total_size;
- size_t new_total_size;
- size_t old_size;
- void *new_ptr = NOWHERE;
-
- /* Allocate new memory if necessary. If allocation fails,
- * return without touching the old block.
- */
- if ( new_size ) {
- new_total_size = ( new_size +
- offsetof ( struct autosized_block, data ) );
- new_block = alloc_memblock ( new_total_size, 1 );
- if ( ! new_block )
- return NULL;
- new_block->size = new_total_size;
- new_ptr = &new_block->data;
- }
-
- /* Copy across relevant part of the old data region (if any),
- * then free it. Note that at this point either (a) new_ptr
- * is valid, or (b) new_size is 0; either way, the memcpy() is
- * valid.
- */
- if ( old_ptr && ( old_ptr != NOWHERE ) ) {
- old_block = container_of ( old_ptr, struct autosized_block,
- data );
- old_total_size = old_block->size;
- old_size = ( old_total_size -
- offsetof ( struct autosized_block, data ) );
- memcpy ( new_ptr, old_ptr,
- ( ( old_size < new_size ) ? old_size : new_size ) );
- free_memblock ( old_block, old_total_size );
- }
-
- return new_ptr;
-}
-
-/**
- * Allocate memory
- *
- * @v size Requested size
- * @ret ptr Memory, or NULL
- *
- * Allocates memory with no particular alignment requirement. @c ptr
- * will be aligned to at least a multiple of sizeof(void*).
- */
-void * malloc ( size_t size ) {
- return realloc ( NULL, size );
-}
-
-/**
- * Free memory
- *
- * @v ptr Memory allocated by malloc(), or NULL
- *
- * Memory allocated with malloc_dma() cannot be freed with free(); it
- * must be freed with free_dma() instead.
- *
- * If @c ptr is NULL, no action is taken.
- */
-void free ( void *ptr ) {
- realloc ( ptr, 0 );
-}
-
-/**
- * Allocate cleared memory
- *
- * @v size Requested size
- * @ret ptr Allocated memory
- *
- * Allocate memory as per malloc(), and zero it.
- *
- * This function name is non-standard, but pretty intuitive.
- * zalloc(size) is always equivalent to calloc(1,size)
- */
-void * zalloc ( size_t size ) {
- void *data;
-
- data = malloc ( size );
- if ( data )
- memset ( data, 0, size );
- return data;
-}
-
-/**
- * Add memory to allocation pool
- *
- * @v start Start address
- * @v end End address
- *
- * Adds a block of memory [start,end) to the allocation pool. This is
- * a one-way operation; there is no way to reclaim this memory.
- *
- * @c start must be aligned to at least a multiple of sizeof(void*).
- */
-void mpopulate ( void *start, size_t len ) {
- /* Prevent free_memblock() from rounding up len beyond the end
- * of what we were actually given...
- */
- free_memblock ( start, ( len & ~( MIN_MEMBLOCK_SIZE - 1 ) ) );
-}
-
-/**
- * Initialise the heap
- *
- */
-static void init_heap ( void ) {
- mpopulate ( heap, sizeof ( heap ) );
-}
-
-/** Memory allocator initialisation function */
-struct init_fn heap_init_fn __init_fn ( INIT_EARLY ) = {
- .initialise = init_heap,
-};
-
-#if 0
-#include <stdio.h>
-/**
- * Dump free block list
- *
- */
-void mdumpfree ( void ) {
- struct memory_block *block;
-
- printf ( "Free block list:\n" );
- list_for_each_entry ( block, &free_blocks, list ) {
- printf ( "[%p,%p] (size %#zx)\n", block,
- ( ( ( void * ) block ) + block->size ), block->size );
- }
-}
-#endif
diff --git a/gpxe/src/core/misc.c b/gpxe/src/core/misc.c
deleted file mode 100644
index c19591bb..00000000
--- a/gpxe/src/core/misc.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/**************************************************************************
-MISC Support Routines
-**************************************************************************/
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdlib.h>
-#include <ctype.h>
-#include <byteswap.h>
-#include <gpxe/in.h>
-#include <gpxe/timer.h>
-
-/**************************************************************************
-INET_ATON - Convert an ascii x.x.x.x to binary form
-**************************************************************************/
-int inet_aton ( const char *cp, struct in_addr *inp ) {
- const char *p = cp;
- const char *digits_start;
- unsigned long ip = 0;
- unsigned long val;
- int j;
- for(j = 0; j <= 3; j++) {
- digits_start = p;
- val = strtoul(p, ( char ** ) &p, 10);
- if ((p == digits_start) || (val > 255)) return 0;
- if ( ( j < 3 ) && ( *(p++) != '.' ) ) return 0;
- ip = (ip << 8) | val;
- }
- if ( *p == '\0' ) {
- inp->s_addr = htonl(ip);
- return 1;
- }
- return 0;
-}
-
-unsigned long strtoul ( const char *p, char **endp, int base ) {
- unsigned long ret = 0;
- unsigned int charval;
-
- while ( isspace ( *p ) )
- p++;
-
- if ( base == 0 ) {
- base = 10;
- if ( *p == '0' ) {
- p++;
- base = 8;
- if ( ( *p | 0x20 ) == 'x' ) {
- p++;
- base = 16;
- }
- }
- }
-
- while ( 1 ) {
- charval = *p;
- if ( charval >= 'a' ) {
- charval = ( charval - 'a' + 10 );
- } else if ( charval >= 'A' ) {
- charval = ( charval - 'A' + 10 );
- } else if ( charval <= '9' ) {
- charval = ( charval - '0' );
- }
- if ( charval >= ( unsigned int ) base )
- break;
- ret = ( ( ret * base ) + charval );
- p++;
- }
-
- if ( endp )
- *endp = ( char * ) p;
-
- return ( ret );
-}
-
-/*
- * Local variables:
- * c-basic-offset: 8
- * End:
- */
diff --git a/gpxe/src/core/monojob.c b/gpxe/src/core/monojob.c
deleted file mode 100644
index a24b559e..00000000
--- a/gpxe/src/core/monojob.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <string.h>
-#include <stdio.h>
-#include <errno.h>
-#include <gpxe/process.h>
-#include <console.h>
-#include <gpxe/keys.h>
-#include <gpxe/job.h>
-#include <gpxe/monojob.h>
-#include <gpxe/timer.h>
-
-/** @file
- *
- * Single foreground job
- *
- */
-
-static int monojob_rc;
-
-static void monojob_done ( struct job_interface *job __unused, int rc ) {
- monojob_rc = rc;
-}
-
-/** Single foreground job operations */
-static struct job_interface_operations monojob_operations = {
- .done = monojob_done,
- .kill = ignore_job_kill,
- .progress = ignore_job_progress,
-};
-
-/** Single foreground job */
-struct job_interface monojob = {
- .intf = {
- .dest = &null_job.intf,
- .refcnt = NULL,
- },
- .op = &monojob_operations,
-};
-
-/**
- * Wait for single foreground job to complete
- *
- * @v string Job description to display
- * @ret rc Job final status code
- */
-int monojob_wait ( const char *string ) {
- int key;
- int rc;
- unsigned long last_progress_dot;
- unsigned long elapsed;
-
- printf ( "%s.", string );
- monojob_rc = -EINPROGRESS;
- last_progress_dot = currticks();
- while ( monojob_rc == -EINPROGRESS ) {
- step();
- if ( iskey() ) {
- key = getchar();
- switch ( key ) {
- case CTRL_C:
- job_kill ( &monojob );
- rc = -ECANCELED;
- goto done;
- default:
- break;
- }
- }
- elapsed = ( currticks() - last_progress_dot );
- if ( elapsed >= TICKS_PER_SEC ) {
- printf ( "." );
- last_progress_dot = currticks();
- }
- }
- rc = monojob_rc;
-
-done:
- job_done ( &monojob, rc );
- if ( rc ) {
- printf ( " %s\n", strerror ( rc ) );
- } else {
- printf ( " ok\n" );
- }
- return rc;
-}
diff --git a/gpxe/src/core/null_nap.c b/gpxe/src/core/null_nap.c
deleted file mode 100644
index a3b01eb1..00000000
--- a/gpxe/src/core/null_nap.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#include <gpxe/nap.h>
-
-PROVIDE_NAP_INLINE ( null, cpu_nap );
diff --git a/gpxe/src/core/nvo.c b/gpxe/src/core/nvo.c
deleted file mode 100644
index 3dbf51d3..00000000
--- a/gpxe/src/core/nvo.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <gpxe/dhcp.h>
-#include <gpxe/nvs.h>
-#include <gpxe/nvo.h>
-
-/** @file
- *
- * Non-volatile stored options
- *
- */
-
-/**
- * Calculate checksum over non-volatile stored options
- *
- * @v nvo Non-volatile options block
- * @ret sum Checksum
- */
-static unsigned int nvo_checksum ( struct nvo_block *nvo ) {
- uint8_t *data = nvo->data;
- uint8_t sum = 0;
- unsigned int i;
-
- for ( i = 0 ; i < nvo->total_len ; i++ ) {
- sum += *(data++);
- }
- return sum;
-}
-
-/**
- * Load non-volatile stored options from non-volatile storage device
- *
- * @v nvo Non-volatile options block
- * @ret rc Return status code
- */
-static int nvo_load ( struct nvo_block *nvo ) {
- void *data = nvo->data;
- struct nvo_fragment *frag;
- int rc;
-
- /* Read data a fragment at a time */
- for ( frag = nvo->fragments ; frag->len ; frag++ ) {
- if ( ( rc = nvs_read ( nvo->nvs, frag->address, data,
- frag->len ) ) != 0 ) {
- DBGC ( nvo, "NVO %p could not read %zd bytes at "
- "%#04x\n", nvo, frag->len, frag->address );
- return rc;
- }
- data += frag->len;
- }
-
- DBGC ( nvo, "NVO %p loaded from non-volatile storage\n", nvo );
- return 0;
-}
-
-/**
- * Save non-volatile stored options back to non-volatile storage device
- *
- * @v nvo Non-volatile options block
- * @ret rc Return status code
- */
-static int nvo_save ( struct nvo_block *nvo ) {
- void *data = nvo->data;
- uint8_t *checksum = data;
- struct nvo_fragment *frag;
- int rc;
-
- /* Recalculate checksum */
- *checksum -= nvo_checksum ( nvo );
-
- /* Write data a fragment at a time */
- for ( frag = nvo->fragments ; frag->len ; frag++ ) {
- if ( ( rc = nvs_write ( nvo->nvs, frag->address, data,
- frag->len ) ) != 0 ) {
- DBGC ( nvo, "NVO %p could not write %zd bytes at "
- "%#04x\n", nvo, frag->len, frag->address );
- return rc;
- }
- data += frag->len;
- }
-
- DBGC ( nvo, "NVO %p saved to non-volatile storage\n", nvo );
- return 0;
-}
-
-/**
- * Parse stored options
- *
- * @v nvo Non-volatile options block
- *
- * Verifies that the options data is valid, and configures the DHCP
- * options block. If the data is not valid, it is replaced with an
- * empty options block.
- */
-static void nvo_init_dhcpopts ( struct nvo_block *nvo ) {
- uint8_t *options_data;
- size_t options_len;
-
- /* Steal one byte for the checksum */
- options_data = ( nvo->data + 1 );
- options_len = ( nvo->total_len - 1 );
-
- /* If checksum fails, or options data starts with a zero,
- * assume the whole block is invalid. This should capture the
- * case of random initial contents.
- */
- if ( ( nvo_checksum ( nvo ) != 0 ) || ( options_data[0] == 0 ) ) {
- DBGC ( nvo, "NVO %p has checksum %02x and initial byte %02x; "
- "assuming empty\n", nvo, nvo_checksum ( nvo ),
- options_data[0] );
- memset ( nvo->data, 0, nvo->total_len );
- }
-
- dhcpopt_init ( &nvo->dhcpopts, options_data, options_len );
-}
-
-/**
- * Store value of NVO setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v data Setting data, or NULL to clear setting
- * @v len Length of setting data
- * @ret rc Return status code
- */
-static int nvo_store ( struct settings *settings, struct setting *setting,
- const void *data, size_t len ) {
- struct nvo_block *nvo =
- container_of ( settings, struct nvo_block, settings );
- int rc;
-
- /* Update stored options */
- if ( ( rc = dhcpopt_store ( &nvo->dhcpopts, setting->tag,
- data, len ) ) != 0 ) {
- DBGC ( nvo, "NVO %p could not store %zd bytes: %s\n",
- nvo, len, strerror ( rc ) );
- return rc;
- }
-
- /* Save updated options to NVS */
- if ( ( rc = nvo_save ( nvo ) ) != 0 )
- return rc;
-
- return 0;
-}
-
-/**
- * Fetch value of NVO setting
- *
- * @v settings Settings block
- * @v setting Setting to fetch
- * @v data Buffer to fill with setting data
- * @v len Length of buffer
- * @ret len Length of setting data, or negative error
- *
- * The actual length of the setting will be returned even if
- * the buffer was too small.
- */
-static int nvo_fetch ( struct settings *settings, struct setting *setting,
- void *data, size_t len ) {
- struct nvo_block *nvo =
- container_of ( settings, struct nvo_block, settings );
-
- return dhcpopt_fetch ( &nvo->dhcpopts, setting->tag, data, len );
-}
-
-/** NVO settings operations */
-static struct settings_operations nvo_settings_operations = {
- .store = nvo_store,
- .fetch = nvo_fetch,
-};
-
-/**
- * Initialise non-volatile stored options
- *
- * @v nvo Non-volatile options block
- * @v nvs Underlying non-volatile storage device
- * @v fragments List of option-containing fragments
- * @v refcnt Containing object reference counter, or NULL
- */
-void nvo_init ( struct nvo_block *nvo, struct nvs_device *nvs,
- struct nvo_fragment *fragments, struct refcnt *refcnt ) {
- nvo->nvs = nvs;
- nvo->fragments = fragments;
- settings_init ( &nvo->settings, &nvo_settings_operations, refcnt,
- "nvo", 0 );
-}
-
-/**
- * Register non-volatile stored options
- *
- * @v nvo Non-volatile options block
- * @v parent Parent settings block, or NULL
- * @ret rc Return status code
- */
-int register_nvo ( struct nvo_block *nvo, struct settings *parent ) {
- struct nvo_fragment *fragment = nvo->fragments;
- int rc;
-
- /* Calculate total length of all fragments */
- for ( fragment = nvo->fragments ; fragment->len ; fragment++ )
- nvo->total_len += fragment->len;
-
- /* Allocate memory for options and read in from NVS */
- nvo->data = malloc ( nvo->total_len );
- if ( ! nvo->data ) {
- DBGC ( nvo, "NVO %p could not allocate %zd bytes\n",
- nvo, nvo->total_len );
- rc = -ENOMEM;
- goto err_malloc;
- }
- if ( ( rc = nvo_load ( nvo ) ) != 0 )
- goto err_load;
-
- /* Verify and register options */
- nvo_init_dhcpopts ( nvo );
- if ( ( rc = register_settings ( &nvo->settings, parent ) ) != 0 )
- goto err_register;
-
- DBGC ( nvo, "NVO %p registered\n", nvo );
- return 0;
-
- err_register:
- err_load:
- free ( nvo->data );
- nvo->data = NULL;
- err_malloc:
- return rc;
-}
-
-/**
- * Unregister non-volatile stored options
- *
- * @v nvo Non-volatile options block
- */
-void unregister_nvo ( struct nvo_block *nvo ) {
- unregister_settings ( &nvo->settings );
- free ( nvo->data );
- nvo->data = NULL;
- DBGC ( nvo, "NVO %p unregistered\n", nvo );
-}
diff --git a/gpxe/src/core/open.c b/gpxe/src/core/open.c
deleted file mode 100644
index 70b427ba..00000000
--- a/gpxe/src/core/open.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
-#include <gpxe/xfer.h>
-#include <gpxe/uri.h>
-#include <gpxe/socket.h>
-#include <gpxe/open.h>
-
-/** @file
- *
- * Data transfer interface opening
- *
- */
-
-/**
- * Open URI
- *
- * @v xfer Data transfer interface
- * @v uri URI
- * @ret rc Return status code
- *
- * The URI will be regarded as being relative to the current working
- * URI (see churi()).
- */
-int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ) {
- struct uri_opener *opener;
- struct uri *resolved_uri;
- int rc = -ENOTSUP;
-
- /* Resolve URI */
- resolved_uri = resolve_uri ( cwuri, uri );
- if ( ! resolved_uri )
- return -ENOMEM;
-
- /* Find opener which supports this URI scheme */
- for_each_table_entry ( opener, URI_OPENERS ) {
- if ( strcmp ( resolved_uri->scheme, opener->scheme ) == 0 ) {
- DBGC ( xfer, "XFER %p opening %s URI\n",
- xfer, opener->scheme );
- rc = opener->open ( xfer, resolved_uri );
- goto done;
- }
- }
- DBGC ( xfer, "XFER %p attempted to open unsupported URI scheme "
- "\"%s\"\n", xfer, resolved_uri->scheme );
-
- done:
- uri_put ( resolved_uri );
- return rc;
-}
-
-/**
- * Open URI string
- *
- * @v xfer Data transfer interface
- * @v uri_string URI string (e.g. "http://etherboot.org/kernel")
- * @ret rc Return status code
- *
- * The URI will be regarded as being relative to the current working
- * URI (see churi()).
- */
-int xfer_open_uri_string ( struct xfer_interface *xfer,
- const char *uri_string ) {
- struct uri *uri;
- int rc;
-
- DBGC ( xfer, "XFER %p opening URI %s\n", xfer, uri_string );
-
- uri = parse_uri ( uri_string );
- if ( ! uri )
- return -ENOMEM;
-
- rc = xfer_open_uri ( xfer, uri );
-
- uri_put ( uri );
- return rc;
-}
-
-/**
- * Open socket
- *
- * @v xfer Data transfer interface
- * @v semantics Communication semantics (e.g. SOCK_STREAM)
- * @v peer Peer socket address
- * @v local Local socket address, or NULL
- * @ret rc Return status code
- */
-int xfer_open_socket ( struct xfer_interface *xfer, int semantics,
- struct sockaddr *peer, struct sockaddr *local ) {
- struct socket_opener *opener;
-
- DBGC ( xfer, "XFER %p opening (%s,%s) socket\n", xfer,
- socket_semantics_name ( semantics ),
- socket_family_name ( peer->sa_family ) );
-
- for_each_table_entry ( opener, SOCKET_OPENERS ) {
- if ( ( opener->semantics == semantics ) &&
- ( opener->family == peer->sa_family ) ) {
- return opener->open ( xfer, peer, local );
- }
- }
-
- DBGC ( xfer, "XFER %p attempted to open unsupported socket type "
- "(%s,%s)\n", xfer, socket_semantics_name ( semantics ),
- socket_family_name ( peer->sa_family ) );
- return -ENOTSUP;
-}
-
-/**
- * Open location
- *
- * @v xfer Data transfer interface
- * @v type Location type
- * @v args Remaining arguments depend upon location type
- * @ret rc Return status code
- */
-int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args ) {
- switch ( type ) {
- case LOCATION_URI_STRING: {
- const char *uri_string = va_arg ( args, const char * );
-
- return xfer_open_uri_string ( xfer, uri_string ); }
- case LOCATION_URI: {
- struct uri *uri = va_arg ( args, struct uri * );
-
- return xfer_open_uri ( xfer, uri ); }
- case LOCATION_SOCKET: {
- int semantics = va_arg ( args, int );
- struct sockaddr *peer = va_arg ( args, struct sockaddr * );
- struct sockaddr *local = va_arg ( args, struct sockaddr * );
-
- return xfer_open_socket ( xfer, semantics, peer, local ); }
- default:
- DBGC ( xfer, "XFER %p attempted to open unsupported location "
- "type %d\n", xfer, type );
- return -ENOTSUP;
- }
-}
-
-/**
- * Open location
- *
- * @v xfer Data transfer interface
- * @v type Location type
- * @v ... Remaining arguments depend upon location type
- * @ret rc Return status code
- */
-int xfer_open ( struct xfer_interface *xfer, int type, ... ) {
- va_list args;
- int rc;
-
- va_start ( args, type );
- rc = xfer_vopen ( xfer, type, args );
- va_end ( args );
- return rc;
-}
-
-/**
- * Reopen location
- *
- * @v xfer Data transfer interface
- * @v type Location type
- * @v args Remaining arguments depend upon location type
- * @ret rc Return status code
- *
- * This will close the existing connection and open a new connection
- * using xfer_vopen(). It is intended to be used as a .vredirect
- * method handler.
- */
-int xfer_vreopen ( struct xfer_interface *xfer, int type, va_list args ) {
-
- /* Close existing connection */
- xfer_close ( xfer, 0 );
-
- /* Open new location */
- return xfer_vopen ( xfer, type, args );
-}
diff --git a/gpxe/src/core/pc_kbd.c b/gpxe/src/core/pc_kbd.c
deleted file mode 100644
index 799c8beb..00000000
--- a/gpxe/src/core/pc_kbd.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/* Minimal polling PC keyboard driver
- * - No interrupt
- * - No LED
- * - No special keys
- *
- * still Enough For Me to type a filename.
- *
- * 2003-07 by SONE Takesh
- * 2004-04 moved by LYH From filo to Etherboot
- * yhlu@tyan.com
- */
-
-#include <gpxe/io.h>
-#include "console.h"
-
-static char key_map[][128] = {
- {
- "\0\x1b""1234567890-=\b\t"
- "qwertyuiop[]\r\0as"
- "dfghjkl;'`\0\\zxcv"
- "bnm,./\0*\0 \0\0\0\0\0\0"
- "\0\0\0\0\0\0\0""789-456+1"
- "230."
- },{
- "\0\x1b""!@#$%^&*()_+\b\t"
- "QWERTYUIOP{}\r\0AS"
- "DFGHJKL:\"~\0|ZXCV"
- "BNM<>?\0\0\0 \0\0\0\0\0\0"
- "\0\0\0\0\0\0\0""789-456+1"
- "230."
- }
-};
-
-static int cur_scan;
-static unsigned int shift_state;
-#define SHIFT 1
-#define CONTROL 2
-#define CAPS 4
-
-static int get_scancode(void)
-{
- int scan;
-
- if ((inb(0x64) & 1) == 0)
- return 0;
- scan = inb(0x60);
-
- switch (scan) {
- case 0x2a:
- case 0x36:
- shift_state |= SHIFT;
- break;
- case 0xaa:
- case 0xb6:
- shift_state &= ~SHIFT;
- break;
- case 0x1d:
- shift_state |= CONTROL;
- break;
- case 0x9d:
- shift_state &= ~CONTROL;
- break;
- case 0x3a:
- shift_state ^= CAPS;
- break;
- }
-
- if (scan & 0x80)
- return 0; /* ignore break code or 0xe0 etc! */
- return scan;
-}
-
-static int kbd_havekey(void)
-{
- if (!cur_scan)
- cur_scan = get_scancode();
- return cur_scan != 0;
-}
-
-static int kbd_ischar(void)
-{
- if (!kbd_havekey())
- return 0;
- if (!key_map[shift_state & SHIFT][cur_scan]) {
- cur_scan = 0;
- return 0;
- }
- return 1;
-}
-
-static int kbd_getc(void)
-{
- int c;
-
- while (!kbd_ischar())
- ;
- c = key_map[shift_state & SHIFT][cur_scan];
- if (shift_state & (CONTROL | CAPS)) {
- if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
- if (shift_state & CONTROL)
- c &= 0x1f;
- else if (shift_state & CAPS)
- c ^= ('A' ^ 'a');
- }
- }
- cur_scan = 0;
- return c;
-}
-
-struct console_driver pc_kbd_console __console_driver = {
- .getchar = kbd_getc,
-};
diff --git a/gpxe/src/core/pcmcia.c b/gpxe/src/core/pcmcia.c
deleted file mode 100644
index 631971ef..00000000
--- a/gpxe/src/core/pcmcia.c
+++ /dev/null
@@ -1,267 +0,0 @@
-#if 0
-
-/*
- * pcmcia.c
- *
- * PCMCIA support routines for etherboot - generic stuff
- *
- * This code has partly be taken from the linux kernel sources, .../drivers/pcmcia/
- * Started & put together by
- * Anselm Martin Hoffmeister
- * Stockholm Projekt Computer-Service
- * Sankt Augustin / Bonn, Germany
- *
- * Distributed under GPL2
- */
-
-/*
- *
- *
- * ******************************
- * PLEASE DO NOT YET WORK ON THIS
- * ******************************
- *
- * I'm still fixing it up on every end, so we most probably would interfere
- * at some point. If there's anything obvious or better, not-so-obvious,
- * please contact me by e-mail: anselm (AT) hoffmeister (DOT) be *THANKS*
- */
-#include <stdio.h>
-#include <pcmcia.h>
-#include <i82365.h>
-#define CODE_STATUS "alpha"
-#define CODE_VERSION "0.1.3"
-#include <pcmcia-opts.h>
-#include <console.h>
-#include <gpxe/init.h>
-
-int sockets; /* AHTODO: Phase this out! */
-u_int pccsocks;
-struct pccsock_t pccsock[MAXPCCSOCKS];
-int inited = -1;
-struct pcc_config_t pccconfig[MAXPCCCONFIGS];
-
-struct driver_interact_t driver[] = {
-#ifdef SUPPORT_I82365
- { I82365, i82365_interfacer, "Intel_82365" },
-#endif
-};
-
-#define NUM_DRIVERS (sizeof(driver)/(sizeof(struct driver_interact_t)))
-
-void sleepticks(int numticks ) {
- u_int tmo;
- for (tmo = currticks()+numticks; currticks() < tmo; ) {
- }
- return;
-}
-
-static void pcmcia_init_all(void) {
- u_int i, j, k, l, m, n, ui, configs = 0;
- u_int multicard[8];
- u_char *uc, upc;
- if ( PDEBUG > 0 ) printf("Initializing PCMCIA subsystem (code-status: " CODE_STATUS ", Version " CODE_VERSION ")\n");
- if ( PDEBUG > 2 ) {
- printf ( "Supporting %d driver(s): ", NUM_DRIVERS );
- for ( i = 0; i < NUM_DRIVERS; ++i ) {
- printf ( "[%s] ", driver[i].name );
- }
- printf ( "\n" );
- }
- pccsocks = 0;
- sockets = 0;
- // Init all drivers in the driver[] array:
- for ( i = 0; i < NUM_DRIVERS; ++i ) {
- driver[i].f(INIT,0,i,0,0); // init needs no params. It uses pccsocks and pccsock[].
- // Only i tells it which driver_id itself is.
- }
- for ( i = 0; i < pccsocks; ++i ) {
- printf ( "Socket %d: ", i );
- if ( pccsock[i].status != HASCARD ) {
- printf ( "is %s: skipping\n", pccsock[i].status == EMPTY? "empty":"[status unknown]" );
- continue;
- }
- if ( 0 != driver[pccsock[i].drivernum].f(MAPATTRMEM,pccsock[i].internalid,MAP_ATTRMEM_TO, MAP_ATTRMEM_LEN,0 ) ) {
- printf ("PCMCIA controller failed to map attribute memory.\n**** SEVERE ERROR CONDITION. Skipping controller.\n" );
- if ( PDEBUG > 2 ) {
- printf ( "<press key. THIS CONDITION SHOULD BE REPORTED!>\n" ); getchar();
- }
- continue;
- }
- // parse configuration information
- uc = ioremap ( MAP_ATTRMEM_TO, MAP_ATTRMEM_LEN );
- pccsock[i].stringoffset = pccsock[i].configoffset = pccsock[i].stringlength = 0;
- pccsock[i].type = 0xff;
- for ( l = 0; l < 8; ++l ) multicard[l] = 0;
- sleepticks(2);
- for ( l = ui = 0; ui < 0x800; ui += uc[(2*ui)+2] + 2 ) {
- if ( uc[(2*ui)] == 0xff ) {
- break;
- }
- // This loop is complete rubbish AFAICS.
- // But without it, my test system won't come up.
- // It's too bad to develop on broken hardware
- // - Anselm
- }
- sleepticks(2);
- configs = 0;
- inited = -1;
- for ( l = ui = 0; ui < 0x800; ui += uc[(2*ui)+2] + 2 ) {
- if ( uc[(2*ui)] == 0xff ) break;
- else if ( uc[2*ui] == 0x15 ) {
- for ( k = 2 * ( ui + 2 ); ( uc[k] <= ' ' ) && ( k < ( 2 * ( uc[2*(ui+1)] + ui + 2 ) ) ) ; k += 2 ) { ; }
- pccsock[i].stringoffset = k;
- pccsock[i].stringlength = ( 2 * ( ui + 2 + uc[(2*ui)+2] ) - k ) / 2;
- } else if ( uc[2*ui] == 0x21 ) {
- pccsock[i].type = uc[(2*ui)+4];
- } else if ( uc[2*ui] == 0x1a ) { // Configuration map
- printf ( "\nConfig map 0x1a found [" );
- for ( k = 0; k < uc[2*(ui+1)]; ++k ) {
- printf ( "%02x ", uc[2*(ui+k+2)] );
- }
- printf ( "]\nHighest config available is %d\n", uc[2*(ui+3)] );
- m = uc[2*(ui+2)];
- pccsock[i].configoffset = 0;
- for ( j = 0; j <= (m & 3); ++j ) {
- pccsock[i].configoffset += uc[2*(ui+4+j)] << (8*j);
- }
- pccsock[i].rmask0 = 0;
- for ( j = 0; j <= ( ( ( m & 0x3c ) >> 2 ) & 3 ); ++j ) {
- pccsock[i].rmask0 += uc[2*(ui+5+(m&3)+j)] << (8*j);
- }
- j = pccsock[i].rmask0;
- printf ( "Config offset is %x, card has regs: < %s%s%s%s%s>\n", pccsock[i].configoffset,
- j & 1 ? "COR ":"", j & 2 ? "CCSR ":"", j & 4 ? "PRR ":"", j & 8 ? "SCR ":"", j & 16? "ESR ":"" );
- printf ( "COR + CCSR contents (si/du) %x %x/%x %x\n", uc[pccsock[i].configoffset+0],
- uc[pccsock[i].configoffset+2],uc[pccsock[i].configoffset*2],uc[(pccsock[i].configoffset*2)+2] );
- printf ( " " );
- } else if ( uc[2*ui] == 0x1b ) { // Configuration data entry
- //printf ( "Config data 0x1b found [\n" );getchar();
- for ( k = 0; k < uc[2*(ui+1)]; ++k ) {
- // printf ( "%02x ", uc[2*(ui+k+2)] );
- }
- // Parse this tuple into pccconfig[configs]
- // printf ( "]\n" );
- if ( configs == MAXPCCCONFIGS ) continue;
- k = 2*ui+4;
- pccconfig[configs].index = uc[k] & 0x3f;
- if ( uc[k] & 0x80 ) {
- // printf ( "Special config, unsupp. for now\n" );
- continue;
- }
- k+=2;
- // printf ( "Features: %2x\n", uc[k] );
- if ( uc[k] & 0x7 ) {
- // printf ( "Cannot work with Vcc/Timing configs right now\n" );
- continue;
- }
- pccconfig[configs].iowin = pccconfig[configs].iolen = 0;
- if ( 0 != ( uc[k] & 0x8 ) ) {
- k+=2;
- // printf ( "Reading IO config: " );
- if ( 0 == ( uc[k] & 0x80 ) ) {
- // printf ( "Cannot work with auto/io config\n" );
- continue;
- }
- k+=2;
- if ( 0 != ( uc[k] & 0x0f ) ) {
- // printf ( "Don't support more than 1 iowin right now\n" );
- continue;
- }
- j = (uc[k] & 0x30) >> 4;
- m = (uc[k] & 0xc0) >> 6;
- if ( 3 == j ) ++j;
- if ( 3 == m ) ++m;
- k += 2;
- pccconfig[configs].iowin = 0;
- pccconfig[configs].iolen = 1;
- for ( n = 0; n < j; ++n, k+=2 ) {
- pccconfig[configs].iowin += uc[k] << (n*8);
- }
- for ( n = 0; n < m; ++n, k+=2 ) {
- pccconfig[configs].iolen += uc[k] << (n*8);
- }
- // printf ( "io %x len %d (%d)\n", pccconfig[configs].iowin, pccconfig[configs].iolen,configs );
- }
- for ( j = 0; j < (uc[k] & 3); ++j ) {
- // pccconfig[configs].iowin += (uc[k+(2*j)+2]) << (8*j);
- }
- ++configs;
- }
- }
- if ( pccsock[i].stringoffset > 0 ) { // If no identifier, it's not a valid CIS (as of documentation...)
- printf ( "[" );
- for ( k = 0; ( k < pccsock[i].stringlength ) && ( k < 64 ); ++k ) {
- j = uc[pccsock[i].stringoffset + 2 * k];
- printf ( "%c", (j>=' '? j:' ' ) );
- }
- printf ("]\n is type %d (", pccsock[i].type );
- switch ( pccsock[i].type ) {
- case 0x00:
- printf ( "MULTI" ); break;
- case 0x01:
- printf ( "Memory" ); break;
- case 0x02:
- printf ( "Serial" ); break;
- case 0x03:
- printf ( "Parallel" ); break;
- case 0x04:
- printf ( "Fixed" ); break;
- case 0x05:
- printf ( "Video" ); break;
- case 0x06:
- printf ( "Network" ); break;
- case 0x07:
- printf ( "AIMS" ); break;
- case 0x08:
- printf ( "SCSI" ); break;
- case 0x106: // Special / homebrew to say "Multi/network"
- printf ( "MULTI, with Network" ); break; // AHTODO find a card for this
- default:
- printf ( "UNSUPPORTED/UNKNOWN" );
- }
- printf ( ") with %d possible configuration(s)\n", configs );
- // Now set dependency: If it's Network or multi->network, accept
- if ( (inited <= 0 ) && (6 == (0xff & pccsock[i].type) ) && (0 < configs ) ) {
- printf ( "activating this device with ioport %x-%x (config #%d)\n",
- pccconfig[0].iowin, pccconfig[0].iowin+pccconfig[0].iolen-1, pccconfig[0].index );
- inited = i;
- // And unmap attrmem ourselves!
- printf ( "Activating config..." );
- if ( m=driver[pccsock[i].drivernum].f(SELECTCONFIG,pccsock[i].internalid,pccconfig[0].index,0,&pccconfig[0]) ) {
- printf ("Failure(%d)!",m); inited = -1;
- driver[pccsock[i].drivernum].f(UNMAPATTRMEM,pccsock[i].internalid,0,0,0);
- }
- printf ( "done!\n" );
- continue;
- }
- } else {
- printf ( "unsupported - no identifier string found in CIS\n" );
- }
- // unmap the PCMCIA device
- if ( i != inited ) {
- if ( 0 != driver[pccsock[i].drivernum].f(UNMAPATTRMEM,pccsock[i].internalid,0,0,0) ) {
- printf ("PCMCIA controller failed to unmap attribute memory.\n**** SEVERE ERROR CONDITION ****\n" );
- if ( PDEBUG > 2 ) {
- printf ( "<press key. THIS CONDITION SHOULD BE REPORTED!>\n" ); getchar();
- }
- continue;
- }
- }
- }
- if ( PDEBUG > 2 ) {
- printf ( "<press key to exit the pcmcia_init_all routine>\n" );
- getchar();
- }
-
-}
-
-static void pcmcia_shutdown_all(void) {
- int i;
- //if ( PDEBUG > 2 ) {printf("<press key to continue>\n" ); getchar(); }
- for ( i = 0; i < pccsocks; ++i ) {
- driver[pccsock[i].drivernum].f(SHUTDOWN,pccsock[i].internalid,0,0,0);
- }
- printf("Shutdown of PCMCIA subsystem completed");
-}
-
-#endif
diff --git a/gpxe/src/core/posix_io.c b/gpxe/src/core/posix_io.c
deleted file mode 100644
index e6b1a0f6..00000000
--- a/gpxe/src/core/posix_io.c
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <gpxe/list.h>
-#include <gpxe/xfer.h>
-#include <gpxe/open.h>
-#include <gpxe/process.h>
-#include <gpxe/posix_io.h>
-
-/** @file
- *
- * POSIX-like I/O
- *
- * These functions provide traditional blocking I/O semantics. They
- * are designed to be used by the PXE TFTP API. Because they block,
- * they may not be used by most other portions of the gPXE codebase.
- */
-
-/** An open file */
-struct posix_file {
- /** Reference count for this object */
- struct refcnt refcnt;
- /** List of open files */
- struct list_head list;
- /** File descriptor */
- int fd;
- /** Overall status
- *
- * Set to -EINPROGRESS while data transfer is in progress.
- */
- int rc;
- /** Data transfer interface */
- struct xfer_interface xfer;
- /** Current seek position */
- size_t pos;
- /** File size */
- size_t filesize;
- /** Received data queue */
- struct list_head data;
-};
-
-/** List of open files */
-static LIST_HEAD ( posix_files );
-
-/**
- * Free open file
- *
- * @v refcnt Reference counter
- */
-static void posix_file_free ( struct refcnt *refcnt ) {
- struct posix_file *file =
- container_of ( refcnt, struct posix_file, refcnt );
- struct io_buffer *iobuf;
- struct io_buffer *tmp;
-
- list_for_each_entry_safe ( iobuf, tmp, &file->data, list ) {
- list_del ( &iobuf->list );
- free_iob ( iobuf );
- }
- free ( file );
-}
-
-/**
- * Terminate file data transfer
- *
- * @v file POSIX file
- * @v rc Reason for termination
- */
-static void posix_file_finished ( struct posix_file *file, int rc ) {
- xfer_nullify ( &file->xfer );
- xfer_close ( &file->xfer, rc );
- file->rc = rc;
-}
-
-/**
- * Handle close() event
- *
- * @v xfer POSIX file data transfer interface
- * @v rc Reason for close
- */
-static void posix_file_xfer_close ( struct xfer_interface *xfer, int rc ) {
- struct posix_file *file =
- container_of ( xfer, struct posix_file, xfer );
-
- posix_file_finished ( file, rc );
-}
-
-/**
- * Handle deliver_iob() event
- *
- * @v xfer POSIX file data transfer interface
- * @v iobuf I/O buffer
- * @v meta Data transfer metadata
- * @ret rc Return status code
- */
-static int
-posix_file_xfer_deliver_iob ( struct xfer_interface *xfer,
- struct io_buffer *iobuf,
- struct xfer_metadata *meta ) {
- struct posix_file *file =
- container_of ( xfer, struct posix_file, xfer );
-
- /* Keep track of file position solely for the filesize */
- if ( meta->whence != SEEK_CUR )
- file->pos = 0;
- file->pos += meta->offset;
- if ( file->filesize < file->pos )
- file->filesize = file->pos;
-
- if ( iob_len ( iobuf ) ) {
- list_add_tail ( &iobuf->list, &file->data );
- } else {
- free_iob ( iobuf );
- }
-
- return 0;
-}
-
-/** POSIX file data transfer interface operations */
-static struct xfer_interface_operations posix_file_xfer_operations = {
- .close = posix_file_xfer_close,
- .vredirect = xfer_vreopen,
- .window = unlimited_xfer_window,
- .alloc_iob = default_xfer_alloc_iob,
- .deliver_iob = posix_file_xfer_deliver_iob,
- .deliver_raw = xfer_deliver_as_iob,
-};
-
-/**
- * Identify file by file descriptor
- *
- * @v fd File descriptor
- * @ret file Corresponding file, or NULL
- */
-static struct posix_file * posix_fd_to_file ( int fd ) {
- struct posix_file *file;
-
- list_for_each_entry ( file, &posix_files, list ) {
- if ( file->fd == fd )
- return file;
- }
- return NULL;
-}
-
-/**
- * Find an available file descriptor
- *
- * @ret fd File descriptor, or negative error number
- */
-static int posix_find_free_fd ( void ) {
- int fd;
-
- for ( fd = POSIX_FD_MIN ; fd <= POSIX_FD_MAX ; fd++ ) {
- if ( ! posix_fd_to_file ( fd ) )
- return fd;
- }
- DBG ( "POSIX could not find free file descriptor\n" );
- return -ENFILE;
-}
-
-/**
- * Open file
- *
- * @v uri_string URI string
- * @ret fd File descriptor, or negative error number
- */
-int open ( const char *uri_string ) {
- struct posix_file *file;
- int fd;
- int rc;
-
- /* Find a free file descriptor to use */
- fd = posix_find_free_fd();
- if ( fd < 0 )
- return fd;
-
- /* Allocate and initialise structure */
- file = zalloc ( sizeof ( *file ) );
- if ( ! file )
- return -ENOMEM;
- file->refcnt.free = posix_file_free;
- file->fd = fd;
- file->rc = -EINPROGRESS;
- xfer_init ( &file->xfer, &posix_file_xfer_operations,
- &file->refcnt );
- INIT_LIST_HEAD ( &file->data );
-
- /* Open URI on data transfer interface */
- if ( ( rc = xfer_open_uri_string ( &file->xfer, uri_string ) ) != 0 )
- goto err;
-
- /* Wait for open to succeed or fail */
- while ( list_empty ( &file->data ) ) {
- step();
- if ( file->rc == 0 )
- break;
- if ( file->rc != -EINPROGRESS ) {
- rc = file->rc;
- goto err;
- }
- }
-
- /* Add to list of open files. List takes reference ownership. */
- list_add ( &file->list, &posix_files );
- DBG ( "POSIX opened %s as file %d\n", uri_string, fd );
- return fd;
-
- err:
- posix_file_finished ( file, rc );
- ref_put ( &file->refcnt );
- return rc;
-}
-
-/**
- * Check file descriptors for readiness
- *
- * @v readfds File descriptors to check
- * @v wait Wait until data is ready
- * @ret nready Number of ready file descriptors
- */
-int select ( fd_set *readfds, int wait ) {
- struct posix_file *file;
- int fd;
-
- do {
- for ( fd = POSIX_FD_MIN ; fd <= POSIX_FD_MAX ; fd++ ) {
- if ( ! FD_ISSET ( fd, readfds ) )
- continue;
- file = posix_fd_to_file ( fd );
- if ( ! file )
- return -EBADF;
- if ( ( list_empty ( &file->data ) ) &&
- ( file->rc == -EINPROGRESS ) )
- continue;
- /* Data is available or status has changed */
- FD_ZERO ( readfds );
- FD_SET ( fd, readfds );
- return 1;
- }
- step();
- } while ( wait );
-
- return 0;
-}
-
-/**
- * Read data from file
- *
- * @v buffer Data buffer
- * @v offset Starting offset within data buffer
- * @v len Maximum length to read
- * @ret len Actual length read, or negative error number
- *
- * This call is non-blocking; if no data is available to read then
- * -EWOULDBLOCK will be returned.
- */
-ssize_t read_user ( int fd, userptr_t buffer, off_t offset, size_t max_len ) {
- struct posix_file *file;
- struct io_buffer *iobuf;
- size_t len;
-
- /* Identify file */
- file = posix_fd_to_file ( fd );
- if ( ! file )
- return -EBADF;
-
- /* Try to fetch more data if none available */
- if ( list_empty ( &file->data ) )
- step();
-
- /* Dequeue at most one received I/O buffer into user buffer */
- list_for_each_entry ( iobuf, &file->data, list ) {
- len = iob_len ( iobuf );
- if ( len > max_len )
- len = max_len;
- copy_to_user ( buffer, offset, iobuf->data, len );
- iob_pull ( iobuf, len );
- if ( ! iob_len ( iobuf ) ) {
- list_del ( &iobuf->list );
- free_iob ( iobuf );
- }
- file->pos += len;
- assert ( len != 0 );
- return len;
- }
-
- /* If file has completed, return (after returning all data) */
- if ( file->rc != -EINPROGRESS ) {
- assert ( list_empty ( &file->data ) );
- return file->rc;
- }
-
- /* No data ready and file still in progress; return -WOULDBLOCK */
- return -EWOULDBLOCK;
-}
-
-/**
- * Determine file size
- *
- * @v fd File descriptor
- * @ret size File size, or negative error number
- */
-ssize_t fsize ( int fd ) {
- struct posix_file *file;
-
- /* Identify file */
- file = posix_fd_to_file ( fd );
- if ( ! file )
- return -EBADF;
-
- return file->filesize;
-}
-
-/**
- * Close file
- *
- * @v fd File descriptor
- * @ret rc Return status code
- */
-int close ( int fd ) {
- struct posix_file *file;
-
- /* Identify file */
- file = posix_fd_to_file ( fd );
- if ( ! file )
- return -EBADF;
-
- /* Terminate data transfer */
- posix_file_finished ( file, 0 );
-
- /* Remove from list of open files and drop reference */
- list_del ( &file->list );
- ref_put ( &file->refcnt );
- return 0;
-}
diff --git a/gpxe/src/core/process.c b/gpxe/src/core/process.c
deleted file mode 100644
index 9c13e020..00000000
--- a/gpxe/src/core/process.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <gpxe/list.h>
-#include <gpxe/init.h>
-#include <gpxe/process.h>
-
-/** @file
- *
- * Processes
- *
- * We implement a trivial form of cooperative multitasking, in which
- * all processes share a single stack and address space.
- */
-
-/** Process run queue */
-static LIST_HEAD ( run_queue );
-
-/**
- * Add process to process list
- *
- * @v process Process
- *
- * It is safe to call process_add() multiple times; further calls will
- * have no effect.
- */
-void process_add ( struct process *process ) {
- if ( list_empty ( &process->list ) ) {
- DBGC ( process, "PROCESS %p starting\n", process );
- ref_get ( process->refcnt );
- list_add_tail ( &process->list, &run_queue );
- } else {
- DBGC ( process, "PROCESS %p already started\n", process );
- }
-}
-
-/**
- * Remove process from process list
- *
- * @v process Process
- *
- * It is safe to call process_del() multiple times; further calls will
- * have no effect.
- */
-void process_del ( struct process *process ) {
- if ( ! list_empty ( &process->list ) ) {
- DBGC ( process, "PROCESS %p stopping\n", process );
- list_del ( &process->list );
- INIT_LIST_HEAD ( &process->list );
- ref_put ( process->refcnt );
- } else {
- DBGC ( process, "PROCESS %p already stopped\n", process );
- }
-}
-
-/**
- * Single-step a single process
- *
- * This executes a single step of the first process in the run queue,
- * and moves the process to the end of the run queue.
- */
-void step ( void ) {
- struct process *process;
-
- list_for_each_entry ( process, &run_queue, list ) {
- list_del ( &process->list );
- list_add_tail ( &process->list, &run_queue );
- DBGC2 ( process, "PROCESS %p executing\n", process );
- process->step ( process );
- DBGC2 ( process, "PROCESS %p finished executing\n", process );
- break;
- }
-}
-
-/**
- * Initialise processes
- *
- */
-static void init_processes ( void ) {
- struct process *process;
-
- for_each_table_entry ( process, PERMANENT_PROCESSES )
- process_add ( process );
-}
-
-/** Process initialiser */
-struct init_fn process_init_fn __init_fn ( INIT_NORMAL ) = {
- .initialise = init_processes,
-};
diff --git a/gpxe/src/core/proto_eth_slow.c b/gpxe/src/core/proto_eth_slow.c
deleted file mode 100644
index b759a713..00000000
--- a/gpxe/src/core/proto_eth_slow.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/* Copyright 2004 Linux Networx */
-#ifdef PROTO_LACP
-#if 0
-#include "nic.h"
-#include "timer.h"
-#endif
-
-#define LACP_DEBUG 0
-
-/* Structure definitions originally taken from the linux bond_3ad driver */
-
-#define SLOW_DST_MAC "\x01\x80\xc2\x00\x00\x02"
-static const char slow_dest[] = SLOW_DST_MAC;
-
-
-#define SLOW_SUBTYPE_LACP 1
-#define SLOW_SUBTYPE_MARKER 2
-
-struct slow_header {
- uint8_t subtype;
-};
-
-struct lacp_info {
- uint16_t system_priority;
- uint8_t system[ETH_ALEN];
- uint16_t key;
- uint16_t port_priority;
- uint16_t port;
- uint8_t state;
- uint8_t reserved[3];
-} PACKED;
-
-#define LACP_CMP_LEN (2 + 6 + 2 + 2 + 2)
-#define LACP_CP_LEN (2 + 6 + 2 + 2 + 2 + 1)
-
-/* Link Aggregation Control Protocol(LACP) data unit structure(43.4.2.2 in the 802.3ad standard) */
-struct slow_lacp {
- uint8_t subtype; /* = LACP(= 0x01) */
- uint8_t version_number;
- uint8_t tlv_type_actor_info; /* = actor information(type/length/value) */
-#define LACP_TLV_TERMINATOR 0
-#define LACP_TLV_ACTOR 1
-#define LACP_TLV_PARTNER 2
-#define LACP_TLV_COLLECTOR 3
- uint8_t actor_information_length; /* = 20 */
- struct lacp_info actor;
- uint8_t tlv_type_partner_info; /* = partner information */
- uint8_t partner_information_length; /* = 20 */
- struct lacp_info partner;
- uint8_t tlv_type_collector_info; /* = collector information */
- uint8_t collector_information_length; /* = 16 */
- uint16_t collector_max_delay;
- uint8_t reserved_12[12];
- uint8_t tlv_type_terminator; /* = terminator */
- uint8_t terminator_length; /* = 0 */
- uint8_t reserved_50[50]; /* = 0 */
-} PACKED;
-
-/* Marker Protocol Data Unit(PDU) structure(43.5.3.2 in the 802.3ad standard) */
-struct slow_marker {
- uint8_t subtype; /* = 0x02 (marker PDU) */
- uint8_t version_number; /* = 0x01 */
- uint8_t tlv_type;
-#define MARKER_TLV_TERMINATOR 0 /* marker terminator */
-#define MARKER_TLV_INFO 1 /* marker information */
-#define MARKER_TLV_RESPONSE 2 /* marker response information */
- uint8_t marker_length; /* = 0x16 */
- uint16_t requester_port; /* The number assigned to the port by the requester */
- uint8_t requester_system[ETH_ALEN]; /* The requester's system id */
- uint32_t requester_transaction_id; /* The transaction id allocated by the requester, */
- uint16_t pad; /* = 0 */
- uint8_t tlv_type_terminator; /* = 0x00 */
- uint8_t terminator_length; /* = 0x00 */
- uint8_t reserved_90[90]; /* = 0 */
-} PACKED;
-
-union slow_union {
- struct slow_header header;
- struct slow_lacp lacp;
- struct slow_marker marker;
-};
-
-#define FAST_PERIODIC_TIME (1*TICKS_PER_SEC)
-#define SLOW_PERIODIC_TIME (30*TICKS_PER_SEC)
-#define SHORT_TIMEOUT_TIME (3*FAST_PERIODIC_TIME)
-#define LONG_TIMEOUT_TIME (3*SLOW_PERIODIC_TIME)
-#define CHURN_DETECTION_TIME (60*TICKS_PER_SEC)
-#define AGGREGATE_WAIT_TIME (2*TICKS_PER_SEC)
-
-#define LACP_ACTIVITY (1 << 0)
-#define LACP_TIMEOUT (1 << 1)
-#define LACP_AGGREGATION (1 << 2)
-#define LACP_SYNCHRONIZATION (1 << 3)
-#define LACP_COLLECTING (1 << 4)
-#define LACP_DISTRIBUTING (1 << 5)
-#define LACP_DEFAULTED (1 << 6)
-#define LACP_EXPIRED (1 << 7)
-
-#define UNSELECTED 0
-#define STANDBY 1
-#define SELECTED 2
-
-
-struct lacp_state {
- struct slow_lacp pkt;
- unsigned long current_while_timer; /* Time when the LACP information expires */
- unsigned long periodic_timer; /* Time when I need to send my partner an update */
-};
-
-static struct lacp_state lacp;
-
-
-#if LACP_DEBUG > 0
-static void print_lacp_state(uint8_t state)
-{
- printf("%hhx", state);
- if (state & LACP_ACTIVITY) {
- printf(" Activity");
- }
- if (state & LACP_TIMEOUT) {
- printf(" Timeout");
- }
- if (state & LACP_AGGREGATION) {
- printf(" Aggregation");
- }
- if (state & LACP_SYNCHRONIZATION) {
- printf(" Syncronization");
- }
- if (state & LACP_COLLECTING) {
- printf(" Collecting");
- }
- if (state & LACP_DISTRIBUTING) {
- printf(" Distributing");
- }
- if (state & LACP_DEFAULTED) {
- printf(" Defaulted");
- }
- if (state & LACP_EXPIRED) {
- printf(" Expired");
- }
- printf("\n");
-}
-
-static inline void print_lacpdu(struct slow_lacp *pkt)
-{
- printf("subtype version: %hhx %hhx\n",
- pkt->subtype, pkt->version_number);
- printf("actor_tlv %hhx", pkt->tlv_type_actor_info);
- printf(" len: %hhx (\n", pkt->actor_information_length);
- printf(" sys_pri: %hx", ntohs(pkt->actor.system_priority));
- printf(" mac: %!", pkt->actor.system);
- printf(" key: %hx", ntohs(pkt->actor.key));
- printf(" port_pri: %hx", ntohs(pkt->actor.port_priority));
- printf(" port: %hx\n", ntohs(pkt->actor.port));
- printf(" state: ");
- print_lacp_state(pkt->actor.state);
-#if LACP_DEBUG > 1
- printf(" reserved: %hhx %hhx %hhx\n",
- pkt->actor.reserved[0], pkt->actor.reserved[1], pkt->actor.reserved[2]);
-#endif
- printf(")\n");
- printf("partner_tlv: %hhx", pkt->tlv_type_partner_info);
- printf(" len: %hhx (\n", pkt->partner_information_length);
- printf(" sys_pri: %hx", ntohs(pkt->partner.system_priority));
- printf(" mac: %!", pkt->partner.system);
- printf(" key: %hx", ntohs(pkt->partner.key));
- printf(" port_pri: %hx", ntohs(pkt->partner.port_priority));
- printf(" port: %hx\n", ntohs(pkt->partner.port));
- printf(" state: ");
- print_lacp_state(pkt->partner.state);
-#if LACP_DEBUG > 1
- printf(" reserved: %hhx %hhx %hhx\n",
- pkt->partner.reserved[0], pkt->partner.reserved[1], pkt->partner.reserved[2]);
-#endif
- printf(")\n");
- printf("collector_tlv: %hhx ", pkt->tlv_type_collector_info);
- printf(" len: %hhx (", pkt->collector_information_length);
- printf(" max_delay: %hx", ntohs(pkt->collector_max_delay));
-#if LACP_DEBUG > 1
- printf("reserved_12: %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx\n",
- pkt->reserved_12[0], pkt->reserved_12[1], pkt->reserved_12[2],
- pkt->reserved_12[3], pkt->reserved_12[4], pkt->reserved_12[5],
- pkt->reserved_12[6], pkt->reserved_12[7], pkt->reserved_12[8],
- pkt->reserved_12[9], pkt->reserved_12[10], pkt->reserved_12[11]);
-#endif
- printf(" )\n");
- printf("terminator_tlv: %hhx", pkt->tlv_type_terminator);
- printf(" len: %hhx ()\n", pkt->terminator_length);
-}
-
-static inline unsigned long lacp_timer_val(unsigned long now, unsigned long when)
-{
- return when?(when - now)/TICKS_PER_SEC : 0;
-}
-static void print_lacp(const char *which, struct slow_lacp *pkt, unsigned long now)
-{
- printf("%s\n", which);
- print_lacpdu(pkt);
- printf("timers: c %ds p %ds\n",
- lacp_timer_val(now, lacp.current_while_timer),
- lacp_timer_val(now, lacp.periodic_timer)
- );
- printf("\n");
-}
-#else /* LACP_DEBUG */
-#define print_lacp(which, pkt, now) do {} while(0)
-#endif /* LACP_DEBUG */
-
-static void lacp_init_state(const uint8_t *mac)
-{
- memset(&lacp, 0, sizeof(lacp));
-
- /* Initialize the packet constants */
- lacp.pkt.subtype = 1;
- lacp.pkt.version_number = 1;
-
-
- /* The default state of my interface */
- lacp.pkt.tlv_type_actor_info = LACP_TLV_ACTOR;
- lacp.pkt.actor_information_length = 0x14;
- lacp.pkt.actor.system_priority = htons(1);
- memcpy(lacp.pkt.actor.system, mac, ETH_ALEN);
- lacp.pkt.actor.key = htons(1);
- lacp.pkt.actor.port = htons(1);
- lacp.pkt.actor.port_priority = htons(1);
- lacp.pkt.actor.state =
- LACP_SYNCHRONIZATION |
- LACP_COLLECTING |
- LACP_DISTRIBUTING |
- LACP_DEFAULTED;
-
- /* Set my partner defaults */
- lacp.pkt.tlv_type_partner_info = LACP_TLV_PARTNER;
- lacp.pkt.partner_information_length = 0x14;
- lacp.pkt.partner.system_priority = htons(1);
- /* memset(lacp.pkt.parnter_system, 0, ETH_ALEN); */
- lacp.pkt.partner.key = htons(1);
- lacp.pkt.partner.port = htons(1);
- lacp.pkt.partner.port_priority = htons(1);
- lacp.pkt.partner.state =
- LACP_ACTIVITY |
- LACP_SYNCHRONIZATION |
- LACP_COLLECTING |
- LACP_DISTRIBUTING |
- LACP_DEFAULTED;
-
- lacp.pkt.tlv_type_collector_info = LACP_TLV_COLLECTOR;
- lacp.pkt.collector_information_length = 0x10;
- lacp.pkt.collector_max_delay = htons(0x8000); /* ???? */
-
- lacp.pkt.tlv_type_terminator = LACP_TLV_TERMINATOR;
- lacp.pkt.terminator_length = 0;
-}
-
-#define LACP_NTT_MASK (LACP_ACTIVITY | LACP_TIMEOUT | \
- LACP_SYNCHRONIZATION | LACP_AGGREGATION)
-
-static inline int lacp_update_ntt(struct slow_lacp *pkt)
-{
- int ntt = 0;
- if ((memcmp(&pkt->partner, &lacp.pkt.actor, LACP_CMP_LEN) != 0) ||
- ((pkt->partner.state & LACP_NTT_MASK) !=
- (lacp.pkt.actor.state & LACP_NTT_MASK)))
- {
- ntt = 1;
- }
- return ntt;
-}
-
-static inline void lacp_record_pdu(struct slow_lacp *pkt)
-{
- memcpy(&lacp.pkt.partner, &pkt->actor, LACP_CP_LEN);
-
- lacp.pkt.actor.state &= ~LACP_DEFAULTED;
- lacp.pkt.partner.state &= ~LACP_SYNCHRONIZATION;
- if ((memcmp(&pkt->partner, &lacp.pkt.actor, LACP_CMP_LEN) == 0) &&
- ((pkt->partner.state & LACP_AGGREGATION) ==
- (lacp.pkt.actor.state & LACP_AGGREGATION)))
- {
- lacp.pkt.partner.state |= LACP_SYNCHRONIZATION;
- }
- if (!(pkt->actor.state & LACP_AGGREGATION)) {
- lacp.pkt.partner.state |= LACP_SYNCHRONIZATION;
- }
-
- /* ACTIVITY? */
-}
-
-static inline int lacp_timer_expired(unsigned long now, unsigned long when)
-{
- return when && (now > when);
-}
-
-static inline void lacp_start_periodic_timer(unsigned long now)
-{
- if ((lacp.pkt.partner.state & LACP_ACTIVITY) ||
- (lacp.pkt.actor.state & LACP_ACTIVITY)) {
- lacp.periodic_timer = now +
- (((lacp.pkt.partner.state & LACP_TIMEOUT)?
- FAST_PERIODIC_TIME : SLOW_PERIODIC_TIME));
- }
-}
-
-static inline void lacp_start_current_while_timer(unsigned long now)
-{
- lacp.current_while_timer = now +
- ((lacp.pkt.actor.state & LACP_TIMEOUT) ?
- SHORT_TIMEOUT_TIME : LONG_TIMEOUT_TIME);
-
- lacp.pkt.actor.state &= ~LACP_EXPIRED;
-}
-
-static void send_lacp_reports(unsigned long now, int ntt)
-{
- if (memcmp(nic.node_addr, lacp.pkt.actor.system, ETH_ALEN) != 0) {
- lacp_init_state(nic.node_addr);
- }
- /* If the remote information has expired I need to take action */
- if (lacp_timer_expired(now, lacp.current_while_timer)) {
- if (!(lacp.pkt.actor.state & LACP_EXPIRED)) {
- lacp.pkt.partner.state &= ~LACP_SYNCHRONIZATION;
- lacp.pkt.partner.state |= LACP_TIMEOUT;
- lacp.pkt.actor.state |= LACP_EXPIRED;
- lacp.current_while_timer = now + SHORT_TIMEOUT_TIME;
- ntt = 1;
- }
- else {
- lacp_init_state(nic.node_addr);
- }
- }
- /* If the periodic timer has expired I need to transmit */
- if (lacp_timer_expired(now, lacp.periodic_timer)) {
- ntt = 1;
- /* Reset by lacp_start_periodic_timer */
- }
- if (ntt) {
- eth_transmit(slow_dest, ETH_P_SLOW, sizeof(lacp.pkt), &lacp.pkt);
-
- /* Restart the periodic timer */
- lacp_start_periodic_timer(now);
-
- print_lacp("Trasmitted", &lacp.pkt, now);
- }
-}
-
-static inline void send_eth_slow_reports(unsigned long now)
-{
- send_lacp_reports(now, 0);
-}
-
-static inline void process_eth_slow(unsigned short ptype, unsigned long now)
-{
- union slow_union *pkt;
- if ((ptype != ETH_P_SLOW) ||
- (nic.packetlen < (ETH_HLEN + sizeof(pkt->header)))) {
- return;
- }
- pkt = (union slow_union *)&nic.packet[ETH_HLEN];
- if ((pkt->header.subtype == SLOW_SUBTYPE_LACP) &&
- (nic.packetlen >= ETH_HLEN + sizeof(pkt->lacp))) {
- int ntt;
- if (memcmp(nic.node_addr, lacp.pkt.actor.system, ETH_ALEN) != 0) {
- lacp_init_state(nic.node_addr);
- }
- /* As long as nic.packet is 2 byte aligned all is good */
- print_lacp("Received", &pkt->lacp, now);
- /* I don't actually implement the MUX or SELECT
- * machines.
- *
- * What logically happens when the client and I
- * disagree about an aggregator is the current
- * aggregtator is unselected. The MUX machine places
- * me in DETACHED. The SELECT machine runs and
- * reslects the same aggregator. If I go through
- * these steps fast enough an outside observer can not
- * notice this.
- *
- * Since the process will not generate any noticeable
- * effect it does not need an implmenetation. This
- * keeps the code simple and the code and binary
- * size down.
- */
- /* lacp_update_selected(&pkt->lacp); */
- ntt = lacp_update_ntt(&pkt->lacp);
- lacp_record_pdu(&pkt->lacp);
- lacp_start_current_while_timer(now);
- send_lacp_reports(now, ntt);
- }
- /* If we receive a marker information packet return it */
- else if ((pkt->header.subtype == SLOW_SUBTYPE_MARKER) &&
- (nic.packetlen >= ETH_HLEN + sizeof(pkt->marker)) &&
- (pkt->marker.tlv_type == MARKER_TLV_INFO) &&
- (pkt->marker.marker_length == 0x16))
- {
- pkt->marker.tlv_type = MARKER_TLV_RESPONSE;
- eth_transmit(slow_dest, ETH_P_SLOW,
- sizeof(pkt->marker), &pkt->marker);
- }
-
- }
-#else
-
-#define send_eth_slow_reports(now) do {} while(0)
-#define process_eth_slow(ptype, now) do {} while(0)
-
-#endif
diff --git a/gpxe/src/core/random.c b/gpxe/src/core/random.c
deleted file mode 100644
index 6e7374e3..00000000
--- a/gpxe/src/core/random.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/** @file
- *
- * Random number generation
- *
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdlib.h>
-#include <gpxe/timer.h>
-
-static int32_t rnd_seed = 0;
-
-/**
- * Seed the pseudo-random number generator
- *
- * @v seed Seed value
- */
-void srandom ( unsigned int seed ) {
- rnd_seed = seed;
-}
-
-/**
- * Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
- *
- * @ret rand Pseudo-random number
- */
-long int random ( void ) {
- int32_t q;
-
- if ( ! rnd_seed ) /* Initialize linear congruential generator */
- srandom ( currticks() );
-
- /* simplified version of the LCG given in Bruce Schneier's
- "Applied Cryptography" */
- q = ( rnd_seed / 53668 );
- rnd_seed = ( 40014 * ( rnd_seed - 53668 * q ) - 12211 * q );
- if ( rnd_seed < 0 )
- rnd_seed += 2147483563L;
- return rnd_seed;
-}
diff --git a/gpxe/src/core/refcnt.c b/gpxe/src/core/refcnt.c
deleted file mode 100644
index f2286cac..00000000
--- a/gpxe/src/core/refcnt.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdlib.h>
-#include <gpxe/refcnt.h>
-
-/** @file
- *
- * Reference counting
- *
- */
-
-/**
- * Increment reference count
- *
- * @v refcnt Reference counter, or NULL
- * @ret refcnt Reference counter
- *
- * If @c refcnt is NULL, no action is taken.
- */
-struct refcnt * ref_get ( struct refcnt *refcnt ) {
-
- if ( refcnt ) {
- refcnt->refcnt++;
- DBGC2 ( refcnt, "REFCNT %p incremented to %d\n",
- refcnt, refcnt->refcnt );
- }
- return refcnt;
-}
-
-/**
- * Decrement reference count
- *
- * @v refcnt Reference counter, or NULL
- *
- * If the reference count decreases below zero, the object's free()
- * method will be called.
- *
- * If @c refcnt is NULL, no action is taken.
- */
-void ref_put ( struct refcnt *refcnt ) {
-
- if ( ! refcnt )
- return;
-
- refcnt->refcnt--;
- DBGC2 ( refcnt, "REFCNT %p decremented to %d\n",
- refcnt, refcnt->refcnt );
-
- if ( refcnt->refcnt >= 0 )
- return;
-
- if ( refcnt->free ) {
- DBGC ( refcnt, "REFCNT %p being freed via method %p\n",
- refcnt, refcnt->free );
- refcnt->free ( refcnt );
- } else {
- DBGC ( refcnt, "REFCNT %p being freed\n", refcnt );
- free ( refcnt );
- }
-}
diff --git a/gpxe/src/core/resolv.c b/gpxe/src/core/resolv.c
deleted file mode 100644
index 6f01f93e..00000000
--- a/gpxe/src/core/resolv.c
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <gpxe/in.h>
-#include <gpxe/xfer.h>
-#include <gpxe/open.h>
-#include <gpxe/process.h>
-#include <gpxe/resolv.h>
-
-/** @file
- *
- * Name resolution
- *
- */
-
-/***************************************************************************
- *
- * Name resolution interfaces
- *
- ***************************************************************************
- */
-
-/**
- * Name resolution completed
- *
- * @v resolv Name resolution interface
- * @v sa Completed socket address (if successful)
- * @v rc Final status code
- */
-void resolv_done ( struct resolv_interface *resolv, struct sockaddr *sa,
- int rc ) {
- struct resolv_interface *dest = resolv_get_dest ( resolv );
-
- resolv_unplug ( resolv );
- dest->op->done ( dest, sa, rc );
- resolv_put ( dest );
-}
-
-/**
- * Ignore name resolution done() event
- *
- * @v resolv Name resolution interface
- * @v sa Completed socket address (if successful)
- * @v rc Final status code
- */
-void ignore_resolv_done ( struct resolv_interface *resolv __unused,
- struct sockaddr *sa __unused, int rc __unused ) {
- /* Do nothing */
-}
-
-/** Null name resolution interface operations */
-struct resolv_interface_operations null_resolv_ops = {
- .done = ignore_resolv_done,
-};
-
-/** Null name resolution interface */
-struct resolv_interface null_resolv = {
- .intf = {
- .dest = &null_resolv.intf,
- .refcnt = NULL,
- },
- .op = &null_resolv_ops,
-};
-
-/***************************************************************************
- *
- * Numeric name resolver
- *
- ***************************************************************************
- */
-
-/** A numeric name resolver */
-struct numeric_resolv {
- /** Reference counter */
- struct refcnt refcnt;
- /** Name resolution interface */
- struct resolv_interface resolv;
- /** Process */
- struct process process;
- /** Completed socket address */
- struct sockaddr sa;
- /** Overall status code */
- int rc;
-};
-
-static void numeric_step ( struct process *process ) {
- struct numeric_resolv *numeric =
- container_of ( process, struct numeric_resolv, process );
-
- resolv_done ( &numeric->resolv, &numeric->sa, numeric->rc );
- process_del ( process );
-}
-
-static int numeric_resolv ( struct resolv_interface *resolv,
- const char *name, struct sockaddr *sa ) {
- struct numeric_resolv *numeric;
- struct sockaddr_in *sin;
-
- /* Allocate and initialise structure */
- numeric = zalloc ( sizeof ( *numeric ) );
- if ( ! numeric )
- return -ENOMEM;
- resolv_init ( &numeric->resolv, &null_resolv_ops, &numeric->refcnt );
- process_init ( &numeric->process, numeric_step, &numeric->refcnt );
- memcpy ( &numeric->sa, sa, sizeof ( numeric->sa ) );
-
- DBGC ( numeric, "NUMERIC %p attempting to resolve \"%s\"\n",
- numeric, name );
-
- /* Attempt to resolve name */
- sin = ( ( struct sockaddr_in * ) &numeric->sa );
- sin->sin_family = AF_INET;
- if ( inet_aton ( name, &sin->sin_addr ) == 0 )
- numeric->rc = -EINVAL;
-
- /* Attach to parent interface, mortalise self, and return */
- resolv_plug_plug ( &numeric->resolv, resolv );
- ref_put ( &numeric->refcnt );
- return 0;
-}
-
-struct resolver numeric_resolver __resolver ( RESOLV_NUMERIC ) = {
- .name = "NUMERIC",
- .resolv = numeric_resolv,
-};
-
-/***************************************************************************
- *
- * Name resolution multiplexer
- *
- ***************************************************************************
- */
-
-/** A name resolution multiplexer */
-struct resolv_mux {
- /** Reference counter */
- struct refcnt refcnt;
- /** Parent name resolution interface */
- struct resolv_interface parent;
-
- /** Child name resolution interface */
- struct resolv_interface child;
- /** Current child resolver */
- struct resolver *resolver;
-
- /** Socket address to complete */
- struct sockaddr sa;
- /** Name to be resolved
- *
- * Must be at end of structure
- */
- char name[0];
-};
-
-/**
- * Try current child name resolver
- *
- * @v mux Name resolution multiplexer
- * @ret rc Return status code
- */
-static int resolv_mux_try ( struct resolv_mux *mux ) {
- struct resolver *resolver = mux->resolver;
- int rc;
-
- DBGC ( mux, "RESOLV %p trying method %s\n", mux, resolver->name );
-
- if ( ( rc = resolver->resolv ( &mux->child, mux->name,
- &mux->sa ) ) != 0 ) {
- DBGC ( mux, "RESOLV %p could not use method %s: %s\n",
- mux, resolver->name, strerror ( rc ) );
- return rc;
- }
-
- return 0;
-}
-
-/**
- * Handle done() event from child name resolver
- *
- * @v resolv Child name resolution interface
- * @v sa Completed socket address (if successful)
- * @v rc Final status code
- */
-static void resolv_mux_done ( struct resolv_interface *resolv,
- struct sockaddr *sa, int rc ) {
- struct resolv_mux *mux =
- container_of ( resolv, struct resolv_mux, child );
-
- /* Unplug child */
- resolv_unplug ( &mux->child );
-
- /* If this resolution succeeded, stop now */
- if ( rc == 0 ) {
- DBGC ( mux, "RESOLV %p succeeded using method %s\n",
- mux, mux->resolver->name );
- goto finished;
- }
-
- /* Attempt next child resolver, if possible */
- mux->resolver++;
- if ( mux->resolver >= table_end ( RESOLVERS ) ) {
- DBGC ( mux, "RESOLV %p failed to resolve name\n", mux );
- goto finished;
- }
- if ( ( rc = resolv_mux_try ( mux ) ) != 0 )
- goto finished;
-
- /* Next resolver is now running */
- return;
-
- finished:
- resolv_done ( &mux->parent, sa, rc );
-}
-
-/** Name resolution multiplexer operations */
-static struct resolv_interface_operations resolv_mux_child_ops = {
- .done = resolv_mux_done,
-};
-
-/**
- * Start name resolution
- *
- * @v resolv Name resolution interface
- * @v name Name to resolve
- * @v sa Socket address to complete
- * @ret rc Return status code
- */
-int resolv ( struct resolv_interface *resolv, const char *name,
- struct sockaddr *sa ) {
- struct resolv_mux *mux;
- size_t name_len = ( strlen ( name ) + 1 );
- int rc;
-
- /* Allocate and initialise structure */
- mux = zalloc ( sizeof ( *mux ) + name_len );
- if ( ! mux )
- return -ENOMEM;
- resolv_init ( &mux->parent, &null_resolv_ops, &mux->refcnt );
- resolv_init ( &mux->child, &resolv_mux_child_ops, &mux->refcnt );
- mux->resolver = table_start ( RESOLVERS );
- memcpy ( &mux->sa, sa, sizeof ( mux->sa ) );
- memcpy ( mux->name, name, name_len );
-
- DBGC ( mux, "RESOLV %p attempting to resolve \"%s\"\n", mux, name );
-
- /* Start first resolver in chain. There will always be at
- * least one resolver (the numeric resolver), so no need to
- * check for the zero-resolvers-available case.
- */
- if ( ( rc = resolv_mux_try ( mux ) ) != 0 )
- goto err;
-
- /* Attach parent interface, mortalise self, and return */
- resolv_plug_plug ( &mux->parent, resolv );
- ref_put ( &mux->refcnt );
- return 0;
-
- err:
- ref_put ( &mux->refcnt );
- return rc;
-}
-
-/***************************************************************************
- *
- * Named socket opening
- *
- ***************************************************************************
- */
-
-/** A named socket */
-struct named_socket {
- /** Reference counter */
- struct refcnt refcnt;
- /** Data transfer interface */
- struct xfer_interface xfer;
- /** Name resolution interface */
- struct resolv_interface resolv;
- /** Communication semantics (e.g. SOCK_STREAM) */
- int semantics;
- /** Stored local socket address, if applicable */
- struct sockaddr local;
- /** Stored local socket address exists */
- int have_local;
-};
-
-/**
- * Finish using named socket
- *
- * @v named Named socket
- * @v rc Reason for finish
- */
-static void named_done ( struct named_socket *named, int rc ) {
-
- /* Close all interfaces */
- resolv_nullify ( &named->resolv );
- xfer_nullify ( &named->xfer );
- xfer_close ( &named->xfer, rc );
-}
-
-/**
- * Handle close() event
- *
- * @v xfer Data transfer interface
- * @v rc Reason for close
- */
-static void named_xfer_close ( struct xfer_interface *xfer, int rc ) {
- struct named_socket *named =
- container_of ( xfer, struct named_socket, xfer );
-
- named_done ( named, rc );
-}
-
-/** Named socket opener data transfer interface operations */
-static struct xfer_interface_operations named_xfer_ops = {
- .close = named_xfer_close,
- .vredirect = ignore_xfer_vredirect,
- .window = no_xfer_window,
- .alloc_iob = default_xfer_alloc_iob,
- .deliver_iob = xfer_deliver_as_raw,
- .deliver_raw = ignore_xfer_deliver_raw,
-};
-
-/**
- * Handle done() event
- *
- * @v resolv Name resolution interface
- * @v sa Completed socket address (if successful)
- * @v rc Final status code
- */
-static void named_resolv_done ( struct resolv_interface *resolv,
- struct sockaddr *sa, int rc ) {
- struct named_socket *named =
- container_of ( resolv, struct named_socket, resolv );
-
- /* Redirect if name resolution was successful */
- if ( rc == 0 ) {
- rc = xfer_redirect ( &named->xfer, LOCATION_SOCKET,
- named->semantics, sa,
- ( named->have_local ?
- &named->local : NULL ) );
- }
-
- /* Terminate resolution */
- named_done ( named, rc );
-}
-
-/** Named socket opener name resolution interface operations */
-static struct resolv_interface_operations named_resolv_ops = {
- .done = named_resolv_done,
-};
-
-/**
- * Open named socket
- *
- * @v semantics Communication semantics (e.g. SOCK_STREAM)
- * @v peer Peer socket address to complete
- * @v name Name to resolve
- * @v local Local socket address, or NULL
- * @ret rc Return status code
- */
-int xfer_open_named_socket ( struct xfer_interface *xfer, int semantics,
- struct sockaddr *peer, const char *name,
- struct sockaddr *local ) {
- struct named_socket *named;
- int rc;
-
- /* Allocate and initialise structure */
- named = zalloc ( sizeof ( *named ) );
- if ( ! named )
- return -ENOMEM;
- xfer_init ( &named->xfer, &named_xfer_ops, &named->refcnt );
- resolv_init ( &named->resolv, &named_resolv_ops, &named->refcnt );
- named->semantics = semantics;
- if ( local ) {
- memcpy ( &named->local, local, sizeof ( named->local ) );
- named->have_local = 1;
- }
-
- DBGC ( named, "RESOLV %p opening named socket \"%s\"\n",
- named, name );
-
- /* Start name resolution */
- if ( ( rc = resolv ( &named->resolv, name, peer ) ) != 0 )
- goto err;
-
- /* Attach parent interface, mortalise self, and return */
- xfer_plug_plug ( &named->xfer, xfer );
- ref_put ( &named->refcnt );
- return 0;
-
- err:
- ref_put ( &named->refcnt );
- return rc;
-}
diff --git a/gpxe/src/core/serial.c b/gpxe/src/core/serial.c
deleted file mode 100644
index d35e89e9..00000000
--- a/gpxe/src/core/serial.c
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * The serial port interface routines implement a simple polled i/o
- * interface to a standard serial port. Due to the space restrictions
- * for the boot blocks, no BIOS support is used (since BIOS requires
- * expensive real/protected mode switches), instead the rudimentary
- * BIOS support is duplicated here.
- *
- * The base address and speed for the i/o port are passed from the
- * Makefile in the COMCONSOLE and CONSPEED preprocessor macros. The
- * line control parameters are currently hard-coded to 8 bits, no
- * parity, 1 stop bit (8N1). This can be changed in init_serial().
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include "stddef.h"
-#include <gpxe/init.h>
-#include <gpxe/io.h>
-#include <unistd.h>
-#include <gpxe/serial.h>
-#include "config/serial.h"
-
-/* Set default values if none specified */
-
-#ifndef COMCONSOLE
-#define COMCONSOLE 0x3f8
-#endif
-
-#ifndef COMSPEED
-#define COMSPEED 9600
-#endif
-
-#ifndef COMDATA
-#define COMDATA 8
-#endif
-
-#ifndef COMPARITY
-#define COMPARITY 0
-#endif
-
-#ifndef COMSTOP
-#define COMSTOP 1
-#endif
-
-#undef UART_BASE
-#define UART_BASE ( COMCONSOLE )
-
-#undef UART_BAUD
-#define UART_BAUD ( COMSPEED )
-
-#if ((115200%UART_BAUD) != 0)
-#error Bad ttys0 baud rate
-#endif
-
-#define COMBRD (115200/UART_BAUD)
-
-/* Line Control Settings */
-#define UART_LCS ( ( ( (COMDATA) - 5 ) << 0 ) | \
- ( ( (COMPARITY) ) << 3 ) | \
- ( ( (COMSTOP) - 1 ) << 2 ) )
-
-/* Data */
-#define UART_RBR 0x00
-#define UART_TBR 0x00
-
-/* Control */
-#define UART_IER 0x01
-#define UART_IIR 0x02
-#define UART_FCR 0x02
-#define UART_LCR 0x03
-#define UART_MCR 0x04
-#define UART_DLL 0x00
-#define UART_DLM 0x01
-
-/* Status */
-#define UART_LSR 0x05
-#define UART_LSR_TEMPT 0x40 /* Transmitter empty */
-#define UART_LSR_THRE 0x20 /* Transmit-hold-register empty */
-#define UART_LSR_BI 0x10 /* Break interrupt indicator */
-#define UART_LSR_FE 0x08 /* Frame error indicator */
-#define UART_LSR_PE 0x04 /* Parity error indicator */
-#define UART_LSR_OE 0x02 /* Overrun error indicator */
-#define UART_LSR_DR 0x01 /* Receiver data ready */
-
-#define UART_MSR 0x06
-#define UART_SCR 0x07
-
-#if defined(UART_MEM)
-#define uart_readb(addr) readb((addr))
-#define uart_writeb(val,addr) writeb((val),(addr))
-#else
-#define uart_readb(addr) inb((addr))
-#define uart_writeb(val,addr) outb((val),(addr))
-#endif
-
-/*
- * void serial_putc(int ch);
- * Write character `ch' to port UART_BASE.
- */
-void serial_putc ( int ch ) {
- int i;
- int status;
- i = 1000; /* timeout */
- while(--i > 0) {
- status = uart_readb(UART_BASE + UART_LSR);
- if (status & UART_LSR_THRE) {
- /* TX buffer emtpy */
- uart_writeb(ch, UART_BASE + UART_TBR);
- break;
- }
- mdelay(2);
- }
-}
-
-/*
- * int serial_getc(void);
- * Read a character from port UART_BASE.
- */
-int serial_getc ( void ) {
- int status;
- int ch;
- do {
- status = uart_readb(UART_BASE + UART_LSR);
- } while((status & 1) == 0);
- ch = uart_readb(UART_BASE + UART_RBR); /* fetch (first) character */
- ch &= 0x7f; /* remove any parity bits we get */
- if (ch == 0x7f) { /* Make DEL... look like BS */
- ch = 0x08;
- }
- return ch;
-}
-
-/*
- * int serial_ischar(void);
- * If there is a character in the input buffer of port UART_BASE,
- * return nonzero; otherwise return 0.
- */
-int serial_ischar ( void ) {
- int status;
- status = uart_readb(UART_BASE + UART_LSR); /* line status reg; */
- return status & 1; /* rx char available */
-}
-
-/*
- * int serial_init(void);
- * Initialize port UART_BASE to speed COMSPEED, line settings 8N1.
- */
-static void serial_init ( void ) {
- int status;
- int divisor, lcs;
-
- DBG ( "Serial port %#x initialising\n", UART_BASE );
-
- divisor = COMBRD;
- lcs = UART_LCS;
-
-
-#ifdef COMPRESERVE
- lcs = uart_readb(UART_BASE + UART_LCR) & 0x7f;
- uart_writeb(0x80 | lcs, UART_BASE + UART_LCR);
- divisor = (uart_readb(UART_BASE + UART_DLM) << 8) | uart_readb(UART_BASE + UART_DLL);
- uart_writeb(lcs, UART_BASE + UART_LCR);
-#endif
-
- /* Set Baud Rate Divisor to COMSPEED, and test to see if the
- * serial port appears to be present.
- */
- uart_writeb(0x80 | lcs, UART_BASE + UART_LCR);
- uart_writeb(0xaa, UART_BASE + UART_DLL);
- if (uart_readb(UART_BASE + UART_DLL) != 0xaa) {
- DBG ( "Serial port %#x UART_DLL failed\n", UART_BASE );
- goto out;
- }
- uart_writeb(0x55, UART_BASE + UART_DLL);
- if (uart_readb(UART_BASE + UART_DLL) != 0x55) {
- DBG ( "Serial port %#x UART_DLL failed\n", UART_BASE );
- goto out;
- }
- uart_writeb(divisor & 0xff, UART_BASE + UART_DLL);
- if (uart_readb(UART_BASE + UART_DLL) != (divisor & 0xff)) {
- DBG ( "Serial port %#x UART_DLL failed\n", UART_BASE );
- goto out;
- }
- uart_writeb(0xaa, UART_BASE + UART_DLM);
- if (uart_readb(UART_BASE + UART_DLM) != 0xaa) {
- DBG ( "Serial port %#x UART_DLM failed\n", UART_BASE );
- goto out;
- }
- uart_writeb(0x55, UART_BASE + UART_DLM);
- if (uart_readb(UART_BASE + UART_DLM) != 0x55) {
- DBG ( "Serial port %#x UART_DLM failed\n", UART_BASE );
- goto out;
- }
- uart_writeb((divisor >> 8) & 0xff, UART_BASE + UART_DLM);
- if (uart_readb(UART_BASE + UART_DLM) != ((divisor >> 8) & 0xff)) {
- DBG ( "Serial port %#x UART_DLM failed\n", UART_BASE );
- goto out;
- }
- uart_writeb(lcs, UART_BASE + UART_LCR);
-
- /* disable interrupts */
- uart_writeb(0x0, UART_BASE + UART_IER);
-
- /* disable fifo's */
- uart_writeb(0x00, UART_BASE + UART_FCR);
-
- /* Set clear to send, so flow control works... */
- uart_writeb((1<<1), UART_BASE + UART_MCR);
-
-
- /* Flush the input buffer. */
- do {
- /* rx buffer reg
- * throw away (unconditionally the first time)
- */
- (void) uart_readb(UART_BASE + UART_RBR);
- /* line status reg */
- status = uart_readb(UART_BASE + UART_LSR);
- } while(status & UART_LSR_DR);
- out:
- return;
-}
-
-/*
- * void serial_fini(void);
- * Cleanup our use of the serial port, in particular flush the
- * output buffer so we don't accidentially lose characters.
- */
-static void serial_fini ( int flags __unused ) {
- int i, status;
- /* Flush the output buffer to avoid dropping characters,
- * if we are reinitializing the serial port.
- */
- i = 10000; /* timeout */
- do {
- status = uart_readb(UART_BASE + UART_LSR);
- } while((--i > 0) && !(status & UART_LSR_TEMPT));
- /* Don't mark it as disabled; it's still usable */
-}
-
-/**
- * Serial driver initialisation function
- *
- * Initialise serial port early on so that it is available to capture
- * early debug messages.
- */
-struct init_fn serial_init_fn __init_fn ( INIT_SERIAL ) = {
- .initialise = serial_init,
-};
-
-/** Serial driver startup function */
-struct startup_fn serial_startup_fn __startup_fn ( STARTUP_EARLY ) = {
- .shutdown = serial_fini,
-};
diff --git a/gpxe/src/core/serial_console.c b/gpxe/src/core/serial_console.c
deleted file mode 100644
index 0300482a..00000000
--- a/gpxe/src/core/serial_console.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <gpxe/init.h>
-#include <gpxe/serial.h>
-#include "console.h"
-
-/** @file
- *
- * Serial console
- *
- */
-
-struct console_driver serial_console __console_driver;
-
-static void serial_console_init ( void ) {
- /* Serial driver initialization should already be done,
- * time to enable the serial console. */
- serial_console.disabled = 0;
-}
-
-struct console_driver serial_console __console_driver = {
- .putchar = serial_putc,
- .getchar = serial_getc,
- .iskey = serial_ischar,
- .disabled = 1,
-};
-
-/**
- * Serial console initialisation function
- */
-struct init_fn serial_console_init_fn __init_fn ( INIT_CONSOLE ) = {
- .initialise = serial_console_init,
-};
diff --git a/gpxe/src/core/settings.c b/gpxe/src/core/settings.c
deleted file mode 100644
index 7d83101c..00000000
--- a/gpxe/src/core/settings.c
+++ /dev/null
@@ -1,1456 +0,0 @@
-/*
- * Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <strings.h>
-#include <byteswap.h>
-#include <errno.h>
-#include <assert.h>
-#include <gpxe/in.h>
-#include <gpxe/vsprintf.h>
-#include <gpxe/dhcp.h>
-#include <gpxe/uuid.h>
-#include <gpxe/uri.h>
-#include <gpxe/settings.h>
-
-/** @file
- *
- * Configuration settings
- *
- */
-
-/******************************************************************************
- *
- * Generic settings blocks
- *
- ******************************************************************************
- */
-
-/**
- * A generic setting
- *
- */
-struct generic_setting {
- /** List of generic settings */
- struct list_head list;
- /** Setting */
- struct setting setting;
- /** Size of setting name */
- size_t name_len;
- /** Size of setting data */
- size_t data_len;
-};
-
-/**
- * Get generic setting name
- *
- * @v generic Generic setting
- * @ret name Generic setting name
- */
-static inline void * generic_setting_name ( struct generic_setting *generic ) {
- return ( ( ( void * ) generic ) + sizeof ( *generic ) );
-}
-
-/**
- * Get generic setting data
- *
- * @v generic Generic setting
- * @ret data Generic setting data
- */
-static inline void * generic_setting_data ( struct generic_setting *generic ) {
- return ( ( ( void * ) generic ) + sizeof ( *generic ) +
- generic->name_len );
-}
-
-/**
- * Find generic setting
- *
- * @v generics Generic settings block
- * @v setting Setting to find
- * @ret generic Generic setting, or NULL
- */
-static struct generic_setting *
-find_generic_setting ( struct generic_settings *generics,
- struct setting *setting ) {
- struct generic_setting *generic;
-
- list_for_each_entry ( generic, &generics->list, list ) {
- if ( setting_cmp ( &generic->setting, setting ) == 0 )
- return generic;
- }
- return NULL;
-}
-
-/**
- * Store value of generic setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v data Setting data, or NULL to clear setting
- * @v len Length of setting data
- * @ret rc Return status code
- */
-int generic_settings_store ( struct settings *settings,
- struct setting *setting,
- const void *data, size_t len ) {
- struct generic_settings *generics =
- container_of ( settings, struct generic_settings, settings );
- struct generic_setting *old;
- struct generic_setting *new = NULL;
- size_t name_len;
-
- /* Identify existing generic setting, if any */
- old = find_generic_setting ( generics, setting );
-
- /* Create new generic setting, if required */
- if ( len ) {
- /* Allocate new generic setting */
- name_len = ( strlen ( setting->name ) + 1 );
- new = zalloc ( sizeof ( *new ) + name_len + len );
- if ( ! new )
- return -ENOMEM;
-
- /* Populate new generic setting */
- new->name_len = name_len;
- new->data_len = len;
- memcpy ( &new->setting, setting, sizeof ( new->setting ) );
- new->setting.name = generic_setting_name ( new );
- memcpy ( generic_setting_name ( new ),
- setting->name, name_len );
- memcpy ( generic_setting_data ( new ), data, len );
- }
-
- /* Delete existing generic setting, if any */
- if ( old ) {
- list_del ( &old->list );
- free ( old );
- }
-
- /* Add new setting to list, if any */
- if ( new )
- list_add ( &new->list, &generics->list );
-
- return 0;
-}
-
-/**
- * Fetch value of generic setting
- *
- * @v settings Settings block
- * @v setting Setting to fetch
- * @v data Buffer to fill with setting data
- * @v len Length of buffer
- * @ret len Length of setting data, or negative error
- */
-int generic_settings_fetch ( struct settings *settings,
- struct setting *setting,
- void *data, size_t len ) {
- struct generic_settings *generics =
- container_of ( settings, struct generic_settings, settings );
- struct generic_setting *generic;
-
- /* Find generic setting */
- generic = find_generic_setting ( generics, setting );
- if ( ! generic )
- return -ENOENT;
-
- /* Copy out generic setting data */
- if ( len > generic->data_len )
- len = generic->data_len;
- memcpy ( data, generic_setting_data ( generic ), len );
- return generic->data_len;
-}
-
-/**
- * Clear generic settings block
- *
- * @v settings Settings block
- */
-void generic_settings_clear ( struct settings *settings ) {
- struct generic_settings *generics =
- container_of ( settings, struct generic_settings, settings );
- struct generic_setting *generic;
- struct generic_setting *tmp;
-
- list_for_each_entry_safe ( generic, tmp, &generics->list, list ) {
- list_del ( &generic->list );
- free ( generic );
- }
- assert ( list_empty ( &generics->list ) );
-}
-
-/** Generic settings operations */
-struct settings_operations generic_settings_operations = {
- .store = generic_settings_store,
- .fetch = generic_settings_fetch,
- .clear = generic_settings_clear,
-};
-
-/******************************************************************************
- *
- * Registered settings blocks
- *
- ******************************************************************************
- */
-
-/** Root generic settings block */
-struct generic_settings generic_settings_root = {
- .settings = {
- .refcnt = NULL,
- .name = "",
- .siblings =
- LIST_HEAD_INIT ( generic_settings_root.settings.siblings ),
- .children =
- LIST_HEAD_INIT ( generic_settings_root.settings.children ),
- .op = &generic_settings_operations,
- },
- .list = LIST_HEAD_INIT ( generic_settings_root.list ),
-};
-
-/** Root settings block */
-#define settings_root generic_settings_root.settings
-
-/**
- * Find child named settings block
- *
- * @v parent Parent settings block
- * @v name Name within this parent
- * @ret settings Settings block, or NULL
- */
-static struct settings * find_child_settings ( struct settings *parent,
- const char *name ) {
- struct settings *settings;
-
- /* Treat empty name as meaning "this block" */
- if ( ! *name )
- return parent;
-
- /* Look for child with matching name */
- list_for_each_entry ( settings, &parent->children, siblings ) {
- if ( strcmp ( settings->name, name ) == 0 )
- return settings;
- }
-
- return NULL;
-}
-
-/**
- * Find or create child named settings block
- *
- * @v parent Parent settings block
- * @v name Name within this parent
- * @ret settings Settings block, or NULL
- */
-static struct settings * autovivify_child_settings ( struct settings *parent,
- const char *name ) {
- struct {
- struct generic_settings generic;
- char name[ strlen ( name ) + 1 /* NUL */ ];
- } *new_child;
- struct settings *settings;
-
- /* Return existing settings, if existent */
- if ( ( settings = find_child_settings ( parent, name ) ) != NULL )
- return settings;
-
- /* Create new generic settings block */
- new_child = zalloc ( sizeof ( *new_child ) );
- if ( ! new_child ) {
- DBGC ( parent, "Settings %p could not create child %s\n",
- parent, name );
- return NULL;
- }
- memcpy ( new_child->name, name, sizeof ( new_child->name ) );
- generic_settings_init ( &new_child->generic, NULL, new_child->name );
- settings = &new_child->generic.settings;
- register_settings ( settings, parent );
- return settings;
-}
-
-/**
- * Return settings block name (for debug only)
- *
- * @v settings Settings block
- * @ret name Settings block name
- */
-static const char * settings_name ( struct settings *settings ) {
- static char buf[64];
- char tmp[ sizeof ( buf ) ];
- int count;
-
- for ( count = 0 ; settings ; settings = settings->parent ) {
- memcpy ( tmp, buf, sizeof ( tmp ) );
- snprintf ( buf, sizeof ( buf ), "%s%c%s", settings->name,
- ( count++ ? '.' : '\0' ), tmp );
- }
- return ( buf + 1 );
-}
-
-/**
- * Parse settings block name
- *
- * @v name Name
- * @v get_child Function to find or create child settings block
- * @ret settings Settings block, or NULL
- */
-static struct settings *
-parse_settings_name ( const char *name,
- struct settings * ( * get_child ) ( struct settings *,
- const char * ) ) {
- struct settings *settings = &settings_root;
- char name_copy[ strlen ( name ) + 1 ];
- char *subname;
- char *remainder;
-
- /* Create modifiable copy of name */
- memcpy ( name_copy, name, sizeof ( name_copy ) );
- remainder = name_copy;
-
- /* Parse each name component in turn */
- while ( remainder ) {
- struct net_device *netdev;
-
- subname = remainder;
- remainder = strchr ( subname, '.' );
- if ( remainder )
- *(remainder++) = '\0';
-
- /* Special case "netX" root settings block */
- if ( ( subname == name_copy ) && ! strcmp ( subname, "netX" ) &&
- ( ( netdev = last_opened_netdev() ) != NULL ) )
- settings = get_child ( settings, netdev->name );
- else
- settings = get_child ( settings, subname );
-
- if ( ! settings )
- break;
- }
-
- return settings;
-}
-
-/**
- * Find named settings block
- *
- * @v name Name
- * @ret settings Settings block, or NULL
- */
-struct settings * find_settings ( const char *name ) {
-
- return parse_settings_name ( name, find_child_settings );
-}
-
-/**
- * Apply all settings
- *
- * @ret rc Return status code
- */
-static int apply_settings ( void ) {
- struct settings_applicator *applicator;
- int rc;
-
- /* Call all settings applicators */
- for_each_table_entry ( applicator, SETTINGS_APPLICATORS ) {
- if ( ( rc = applicator->apply() ) != 0 ) {
- DBG ( "Could not apply settings using applicator "
- "%p: %s\n", applicator, strerror ( rc ) );
- return rc;
- }
- }
-
- return 0;
-}
-
-/**
- * Reprioritise settings
- *
- * @v settings Settings block
- *
- * Reorders the settings block amongst its siblings according to its
- * priority.
- */
-static void reprioritise_settings ( struct settings *settings ) {
- struct settings *parent = settings->parent;
- long priority;
- struct settings *tmp;
- long tmp_priority;
-
- /* Stop when we reach the top of the tree */
- if ( ! parent )
- return;
-
- /* Read priority, if present */
- priority = fetch_intz_setting ( settings, &priority_setting );
-
- /* Remove from siblings list */
- list_del ( &settings->siblings );
-
- /* Reinsert after any existing blocks which have a higher priority */
- list_for_each_entry ( tmp, &parent->children, siblings ) {
- tmp_priority = fetch_intz_setting ( tmp, &priority_setting );
- if ( priority > tmp_priority )
- break;
- }
- list_add_tail ( &settings->siblings, &tmp->siblings );
-
- /* Recurse up the tree */
- reprioritise_settings ( parent );
-}
-
-/**
- * Register settings block
- *
- * @v settings Settings block
- * @v parent Parent settings block, or NULL
- * @ret rc Return status code
- */
-int register_settings ( struct settings *settings, struct settings *parent ) {
- struct settings *old_settings;
-
- /* NULL parent => add to settings root */
- assert ( settings != NULL );
- if ( parent == NULL )
- parent = &settings_root;
-
- /* Remove any existing settings with the same name */
- if ( ( old_settings = find_child_settings ( parent, settings->name ) ))
- unregister_settings ( old_settings );
-
- /* Add to list of settings */
- ref_get ( settings->refcnt );
- ref_get ( parent->refcnt );
- settings->parent = parent;
- list_add_tail ( &settings->siblings, &parent->children );
- DBGC ( settings, "Settings %p (\"%s\") registered\n",
- settings, settings_name ( settings ) );
-
- /* Fix up settings priority */
- reprioritise_settings ( settings );
-
- /* Apply potentially-updated settings */
- apply_settings();
-
- return 0;
-}
-
-/**
- * Unregister settings block
- *
- * @v settings Settings block
- */
-void unregister_settings ( struct settings *settings ) {
-
- DBGC ( settings, "Settings %p (\"%s\") unregistered\n",
- settings, settings_name ( settings ) );
-
- /* Remove from list of settings */
- ref_put ( settings->refcnt );
- ref_put ( settings->parent->refcnt );
- settings->parent = NULL;
- list_del ( &settings->siblings );
-
- /* Apply potentially-updated settings */
- apply_settings();
-}
-
-/******************************************************************************
- *
- * Core settings routines
- *
- ******************************************************************************
- */
-
-/**
- * Store value of setting
- *
- * @v settings Settings block, or NULL
- * @v setting Setting to store
- * @v data Setting data, or NULL to clear setting
- * @v len Length of setting data
- * @ret rc Return status code
- */
-int store_setting ( struct settings *settings, struct setting *setting,
- const void *data, size_t len ) {
- int rc;
-
- /* NULL settings implies storing into the global settings root */
- if ( ! settings )
- settings = &settings_root;
-
- /* Sanity check */
- if ( ! settings->op->store )
- return -ENOTSUP;
-
- /* Store setting */
- if ( ( rc = settings->op->store ( settings, setting,
- data, len ) ) != 0 )
- return rc;
-
- /* Reprioritise settings if necessary */
- if ( setting_cmp ( setting, &priority_setting ) == 0 )
- reprioritise_settings ( settings );
-
- /* If these settings are registered, apply potentially-updated
- * settings
- */
- for ( ; settings ; settings = settings->parent ) {
- if ( settings == &settings_root ) {
- if ( ( rc = apply_settings() ) != 0 )
- return rc;
- break;
- }
- }
-
- return 0;
-}
-
-/**
- * Fetch value of setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v data Buffer to fill with setting data
- * @v len Length of buffer
- * @ret len Length of setting data, or negative error
- *
- * The actual length of the setting will be returned even if
- * the buffer was too small.
- */
-int fetch_setting ( struct settings *settings, struct setting *setting,
- void *data, size_t len ) {
- struct settings *child;
- int ret;
-
- /* Avoid returning uninitialised data on error */
- memset ( data, 0, len );
-
- /* NULL settings implies starting at the global settings root */
- if ( ! settings )
- settings = &settings_root;
-
- /* Sanity check */
- if ( ! settings->op->fetch )
- return -ENOTSUP;
-
- /* Try this block first */
- if ( ( ret = settings->op->fetch ( settings, setting,
- data, len ) ) >= 0 )
- return ret;
-
- /* Recurse into each child block in turn */
- list_for_each_entry ( child, &settings->children, siblings ) {
- if ( ( ret = fetch_setting ( child, setting,
- data, len ) ) >= 0 )
- return ret;
- }
-
- return -ENOENT;
-}
-
-/**
- * Fetch length of setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @ret len Length of setting data, or negative error
- *
- * This function can also be used as an existence check for the
- * setting.
- */
-int fetch_setting_len ( struct settings *settings, struct setting *setting ) {
- return fetch_setting ( settings, setting, NULL, 0 );
-}
-
-/**
- * Fetch value of string setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v data Buffer to fill with setting string data
- * @v len Length of buffer
- * @ret len Length of string setting, or negative error
- *
- * The resulting string is guaranteed to be correctly NUL-terminated.
- * The returned length will be the length of the underlying setting
- * data.
- */
-int fetch_string_setting ( struct settings *settings, struct setting *setting,
- char *data, size_t len ) {
- memset ( data, 0, len );
- return fetch_setting ( settings, setting, data,
- ( ( len > 0 ) ? ( len - 1 ) : 0 ) );
-}
-
-/**
- * Fetch value of string setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v data Buffer to allocate and fill with setting string data
- * @ret len Length of string setting, or negative error
- *
- * The resulting string is guaranteed to be correctly NUL-terminated.
- * The returned length will be the length of the underlying setting
- * data. The caller is responsible for eventually freeing the
- * allocated buffer.
- */
-int fetch_string_setting_copy ( struct settings *settings,
- struct setting *setting,
- char **data ) {
- int len;
- int check_len = 0;
-
- len = fetch_setting_len ( settings, setting );
- if ( len < 0 )
- return len;
-
- *data = malloc ( len + 1 );
- if ( ! *data )
- return -ENOMEM;
-
- check_len = fetch_string_setting ( settings, setting, *data,
- ( len + 1 ) );
- assert ( check_len == len );
- return len;
-}
-
-/**
- * Fetch value of IPv4 address setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v inp IPv4 address to fill in
- * @ret len Length of setting, or negative error
- */
-int fetch_ipv4_setting ( struct settings *settings, struct setting *setting,
- struct in_addr *inp ) {
- int len;
-
- len = fetch_setting ( settings, setting, inp, sizeof ( *inp ) );
- if ( len < 0 )
- return len;
- if ( len < ( int ) sizeof ( *inp ) )
- return -ERANGE;
- return len;
-}
-
-/**
- * Fetch value of signed integer setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v value Integer value to fill in
- * @ret len Length of setting, or negative error
- */
-int fetch_int_setting ( struct settings *settings, struct setting *setting,
- long *value ) {
- union {
- uint8_t u8[ sizeof ( long ) ];
- int8_t s8[ sizeof ( long ) ];
- } buf;
- int len;
- int i;
-
- /* Avoid returning uninitialised data on error */
- *value = 0;
-
- /* Fetch raw (network-ordered, variable-length) setting */
- len = fetch_setting ( settings, setting, &buf, sizeof ( buf ) );
- if ( len < 0 )
- return len;
- if ( len > ( int ) sizeof ( buf ) )
- return -ERANGE;
-
- /* Convert to host-ordered signed long */
- *value = ( ( buf.s8[0] >= 0 ) ? 0 : -1L );
- for ( i = 0 ; i < len ; i++ ) {
- *value = ( ( *value << 8 ) | buf.u8[i] );
- }
-
- return len;
-}
-
-/**
- * Fetch value of unsigned integer setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v value Integer value to fill in
- * @ret len Length of setting, or negative error
- */
-int fetch_uint_setting ( struct settings *settings, struct setting *setting,
- unsigned long *value ) {
- long svalue;
- int len;
-
- /* Avoid returning uninitialised data on error */
- *value = 0;
-
- /* Fetch as a signed long */
- len = fetch_int_setting ( settings, setting, &svalue );
- if ( len < 0 )
- return len;
-
- /* Mask off sign-extended bits */
- assert ( len <= ( int ) sizeof ( long ) );
- *value = ( svalue & ( -1UL >> ( 8 * ( sizeof ( long ) - len ) ) ) );
-
- return len;
-}
-
-/**
- * Fetch value of signed integer setting, or zero
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @ret value Setting value, or zero
- */
-long fetch_intz_setting ( struct settings *settings, struct setting *setting ){
- long value;
-
- fetch_int_setting ( settings, setting, &value );
- return value;
-}
-
-/**
- * Fetch value of unsigned integer setting, or zero
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @ret value Setting value, or zero
- */
-unsigned long fetch_uintz_setting ( struct settings *settings,
- struct setting *setting ) {
- unsigned long value;
-
- fetch_uint_setting ( settings, setting, &value );
- return value;
-}
-
-/**
- * Fetch value of UUID setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v uuid UUID to fill in
- * @ret len Length of setting, or negative error
- */
-int fetch_uuid_setting ( struct settings *settings, struct setting *setting,
- union uuid *uuid ) {
- int len;
-
- len = fetch_setting ( settings, setting, uuid, sizeof ( *uuid ) );
- if ( len < 0 )
- return len;
- if ( len != sizeof ( *uuid ) )
- return -ERANGE;
- return len;
-}
-
-/**
- * Clear settings block
- *
- * @v settings Settings block
- */
-void clear_settings ( struct settings *settings ) {
- if ( settings->op->clear )
- settings->op->clear ( settings );
-}
-
-/**
- * Compare two settings
- *
- * @v a Setting to compare
- * @v b Setting to compare
- * @ret 0 Settings are the same
- * @ret non-zero Settings are not the same
- */
-int setting_cmp ( struct setting *a, struct setting *b ) {
-
- /* If the settings have tags, compare them */
- if ( a->tag && ( a->tag == b->tag ) )
- return 0;
-
- /* Otherwise, if the settings have names, compare them */
- if ( a->name && b->name && a->name[0] )
- return strcmp ( a->name, b->name );
-
- /* Otherwise, return a non-match */
- return ( ! 0 );
-}
-
-/******************************************************************************
- *
- * Formatted setting routines
- *
- ******************************************************************************
- */
-
-/**
- * Store value of typed setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v type Settings type
- * @v value Formatted setting data, or NULL
- * @ret rc Return status code
- */
-int storef_setting ( struct settings *settings, struct setting *setting,
- const char *value ) {
-
- /* NULL value implies deletion. Avoid imposing the burden of
- * checking for NULL values on each typed setting's storef()
- * method.
- */
- if ( ! value )
- return delete_setting ( settings, setting );
-
- return setting->type->storef ( settings, setting, value );
-}
-
-/**
- * Find named setting
- *
- * @v name Name
- * @ret setting Named setting, or NULL
- */
-static struct setting * find_setting ( const char *name ) {
- struct setting *setting;
-
- for_each_table_entry ( setting, SETTINGS ) {
- if ( strcmp ( name, setting->name ) == 0 )
- return setting;
- }
- return NULL;
-}
-
-/**
- * Parse setting name as tag number
- *
- * @v name Name
- * @ret tag Tag number, or 0 if not a valid number
- */
-static unsigned int parse_setting_tag ( const char *name ) {
- char *tmp = ( ( char * ) name );
- unsigned int tag = 0;
-
- while ( 1 ) {
- tag = ( ( tag << 8 ) | strtoul ( tmp, &tmp, 0 ) );
- if ( *tmp == 0 )
- return tag;
- if ( *tmp != '.' )
- return 0;
- tmp++;
- }
-}
-
-/**
- * Find setting type
- *
- * @v name Name
- * @ret type Setting type, or NULL
- */
-static struct setting_type * find_setting_type ( const char *name ) {
- struct setting_type *type;
-
- for_each_table_entry ( type, SETTING_TYPES ) {
- if ( strcmp ( name, type->name ) == 0 )
- return type;
- }
- return NULL;
-}
-
-/**
- * Parse setting name
- *
- * @v name Name of setting
- * @v get_child Function to find or create child settings block
- * @v settings Settings block to fill in
- * @v setting Setting to fill in
- * @v tmp_name Buffer for copy of setting name
- * @ret rc Return status code
- *
- * Interprets a name of the form
- * "[settings_name/]tag_name[:type_name]" and fills in the appropriate
- * fields.
- *
- * The @c tmp_name buffer must be large enough to hold a copy of the
- * setting name.
- */
-static int
-parse_setting_name ( const char *name,
- struct settings * ( * get_child ) ( struct settings *,
- const char * ),
- struct settings **settings, struct setting *setting,
- char *tmp_name ) {
- char *settings_name;
- char *setting_name;
- char *type_name;
- struct setting *named_setting;
-
- /* Set defaults */
- *settings = &settings_root;
- memset ( setting, 0, sizeof ( *setting ) );
- setting->name = "";
- setting->type = &setting_type_string;
-
- /* Split name into "[settings_name/]setting_name[:type_name]" */
- strcpy ( tmp_name, name );
- if ( ( setting_name = strchr ( tmp_name, '/' ) ) != NULL ) {
- *(setting_name++) = 0;
- settings_name = tmp_name;
- } else {
- setting_name = tmp_name;
- settings_name = NULL;
- }
- if ( ( type_name = strchr ( setting_name, ':' ) ) != NULL )
- *(type_name++) = 0;
-
- /* Identify settings block, if specified */
- if ( settings_name ) {
- *settings = parse_settings_name ( settings_name, get_child );
- if ( *settings == NULL ) {
- DBG ( "Unrecognised settings block \"%s\" in \"%s\"\n",
- settings_name, name );
- return -ENODEV;
- }
- }
-
- /* Identify setting */
- if ( ( named_setting = find_setting ( setting_name ) ) != NULL ) {
- /* Matches a defined named setting; use that setting */
- memcpy ( setting, named_setting, sizeof ( *setting ) );
- } else if ( ( setting->tag = parse_setting_tag ( setting_name ) ) !=0){
- /* Is a valid numeric tag; use the tag */
- setting->tag |= (*settings)->tag_magic;
- } else {
- /* Use the arbitrary name */
- setting->name = setting_name;
- }
-
- /* Identify setting type, if specified */
- if ( type_name ) {
- setting->type = find_setting_type ( type_name );
- if ( setting->type == NULL ) {
- DBG ( "Invalid setting type \"%s\" in \"%s\"\n",
- type_name, name );
- return -ENOTSUP;
- }
- }
-
- return 0;
-}
-
-/**
- * Parse and store value of named setting
- *
- * @v name Name of setting
- * @v value Formatted setting data, or NULL
- * @ret rc Return status code
- */
-int storef_named_setting ( const char *name, const char *value ) {
- struct settings *settings;
- struct setting setting;
- char tmp_name[ strlen ( name ) + 1 ];
- int rc;
-
- if ( ( rc = parse_setting_name ( name, autovivify_child_settings,
- &settings, &setting, tmp_name )) != 0)
- return rc;
- return storef_setting ( settings, &setting, value );
-}
-
-/**
- * Fetch and format value of named setting
- *
- * @v name Name of setting
- * @v buf Buffer to contain formatted value
- * @v len Length of buffer
- * @ret len Length of formatted value, or negative error
- */
-int fetchf_named_setting ( const char *name, char *buf, size_t len ) {
- struct settings *settings;
- struct setting setting;
- char tmp_name[ strlen ( name ) + 1 ];
- int rc;
-
- if ( ( rc = parse_setting_name ( name, find_child_settings,
- &settings, &setting, tmp_name )) != 0)
- return rc;
- return fetchf_setting ( settings, &setting, buf, len );
-}
-
-/******************************************************************************
- *
- * Setting types
- *
- ******************************************************************************
- */
-
-/**
- * Parse and store value of string setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v value Formatted setting data
- * @ret rc Return status code
- */
-static int storef_string ( struct settings *settings, struct setting *setting,
- const char *value ) {
- return store_setting ( settings, setting, value, strlen ( value ) );
-}
-
-/**
- * Fetch and format value of string setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v buf Buffer to contain formatted value
- * @v len Length of buffer
- * @ret len Length of formatted value, or negative error
- */
-static int fetchf_string ( struct settings *settings, struct setting *setting,
- char *buf, size_t len ) {
- return fetch_string_setting ( settings, setting, buf, len );
-}
-
-/** A string setting type */
-struct setting_type setting_type_string __setting_type = {
- .name = "string",
- .storef = storef_string,
- .fetchf = fetchf_string,
-};
-
-/**
- * Parse and store value of URI-encoded string setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v value Formatted setting data
- * @ret rc Return status code
- */
-static int storef_uristring ( struct settings *settings,
- struct setting *setting,
- const char *value ) {
- char buf[ strlen ( value ) + 1 ]; /* Decoding never expands string */
- size_t len;
-
- len = uri_decode ( value, buf, sizeof ( buf ) );
- return store_setting ( settings, setting, buf, len );
-}
-
-/**
- * Fetch and format value of URI-encoded string setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v buf Buffer to contain formatted value
- * @v len Length of buffer
- * @ret len Length of formatted value, or negative error
- */
-static int fetchf_uristring ( struct settings *settings,
- struct setting *setting,
- char *buf, size_t len ) {
- ssize_t raw_len;
-
- /* We need to always retrieve the full raw string to know the
- * length of the encoded string.
- */
- raw_len = fetch_setting ( settings, setting, NULL, 0 );
- if ( raw_len < 0 )
- return raw_len;
-
- {
- char raw_buf[ raw_len + 1 ];
-
- fetch_string_setting ( settings, setting, raw_buf,
- sizeof ( raw_buf ) );
- return uri_encode ( raw_buf, buf, len, URI_FRAGMENT );
- }
-}
-
-/** A URI-encoded string setting type */
-struct setting_type setting_type_uristring __setting_type = {
- .name = "uristring",
- .storef = storef_uristring,
- .fetchf = fetchf_uristring,
-};
-
-/**
- * Parse and store value of IPv4 address setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v value Formatted setting data
- * @ret rc Return status code
- */
-static int storef_ipv4 ( struct settings *settings, struct setting *setting,
- const char *value ) {
- struct in_addr ipv4;
-
- if ( inet_aton ( value, &ipv4 ) == 0 )
- return -EINVAL;
- return store_setting ( settings, setting, &ipv4, sizeof ( ipv4 ) );
-}
-
-/**
- * Fetch and format value of IPv4 address setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v buf Buffer to contain formatted value
- * @v len Length of buffer
- * @ret len Length of formatted value, or negative error
- */
-static int fetchf_ipv4 ( struct settings *settings, struct setting *setting,
- char *buf, size_t len ) {
- struct in_addr ipv4;
- int raw_len;
-
- if ( ( raw_len = fetch_ipv4_setting ( settings, setting, &ipv4 ) ) < 0)
- return raw_len;
- return snprintf ( buf, len, "%s", inet_ntoa ( ipv4 ) );
-}
-
-/** An IPv4 address setting type */
-struct setting_type setting_type_ipv4 __setting_type = {
- .name = "ipv4",
- .storef = storef_ipv4,
- .fetchf = fetchf_ipv4,
-};
-
-/**
- * Parse and store value of integer setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v value Formatted setting data
- * @v size Integer size, in bytes
- * @ret rc Return status code
- */
-static int storef_int ( struct settings *settings, struct setting *setting,
- const char *value, unsigned int size ) {
- union {
- uint32_t num;
- uint8_t bytes[4];
- } u;
- char *endp;
-
- u.num = htonl ( strtoul ( value, &endp, 0 ) );
- if ( *endp )
- return -EINVAL;
- return store_setting ( settings, setting,
- &u.bytes[ sizeof ( u ) - size ], size );
-}
-
-/**
- * Parse and store value of 8-bit integer setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v value Formatted setting data
- * @v size Integer size, in bytes
- * @ret rc Return status code
- */
-static int storef_int8 ( struct settings *settings, struct setting *setting,
- const char *value ) {
- return storef_int ( settings, setting, value, 1 );
-}
-
-/**
- * Parse and store value of 16-bit integer setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v value Formatted setting data
- * @v size Integer size, in bytes
- * @ret rc Return status code
- */
-static int storef_int16 ( struct settings *settings, struct setting *setting,
- const char *value ) {
- return storef_int ( settings, setting, value, 2 );
-}
-
-/**
- * Parse and store value of 32-bit integer setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v value Formatted setting data
- * @v size Integer size, in bytes
- * @ret rc Return status code
- */
-static int storef_int32 ( struct settings *settings, struct setting *setting,
- const char *value ) {
- return storef_int ( settings, setting, value, 4 );
-}
-
-/**
- * Fetch and format value of signed integer setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v buf Buffer to contain formatted value
- * @v len Length of buffer
- * @ret len Length of formatted value, or negative error
- */
-static int fetchf_int ( struct settings *settings, struct setting *setting,
- char *buf, size_t len ) {
- long value;
- int rc;
-
- if ( ( rc = fetch_int_setting ( settings, setting, &value ) ) < 0 )
- return rc;
- return snprintf ( buf, len, "%ld", value );
-}
-
-/**
- * Fetch and format value of unsigned integer setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v buf Buffer to contain formatted value
- * @v len Length of buffer
- * @ret len Length of formatted value, or negative error
- */
-static int fetchf_uint ( struct settings *settings, struct setting *setting,
- char *buf, size_t len ) {
- unsigned long value;
- int rc;
-
- if ( ( rc = fetch_uint_setting ( settings, setting, &value ) ) < 0 )
- return rc;
- return snprintf ( buf, len, "%#lx", value );
-}
-
-/** A signed 8-bit integer setting type */
-struct setting_type setting_type_int8 __setting_type = {
- .name = "int8",
- .storef = storef_int8,
- .fetchf = fetchf_int,
-};
-
-/** A signed 16-bit integer setting type */
-struct setting_type setting_type_int16 __setting_type = {
- .name = "int16",
- .storef = storef_int16,
- .fetchf = fetchf_int,
-};
-
-/** A signed 32-bit integer setting type */
-struct setting_type setting_type_int32 __setting_type = {
- .name = "int32",
- .storef = storef_int32,
- .fetchf = fetchf_int,
-};
-
-/** An unsigned 8-bit integer setting type */
-struct setting_type setting_type_uint8 __setting_type = {
- .name = "uint8",
- .storef = storef_int8,
- .fetchf = fetchf_uint,
-};
-
-/** An unsigned 16-bit integer setting type */
-struct setting_type setting_type_uint16 __setting_type = {
- .name = "uint16",
- .storef = storef_int16,
- .fetchf = fetchf_uint,
-};
-
-/** An unsigned 32-bit integer setting type */
-struct setting_type setting_type_uint32 __setting_type = {
- .name = "uint32",
- .storef = storef_int32,
- .fetchf = fetchf_uint,
-};
-
-/**
- * Parse and store value of hex string setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v value Formatted setting data
- * @ret rc Return status code
- */
-static int storef_hex ( struct settings *settings, struct setting *setting,
- const char *value ) {
- char *ptr = ( char * ) value;
- uint8_t bytes[ strlen ( value ) ]; /* cannot exceed strlen(value) */
- unsigned int len = 0;
-
- while ( 1 ) {
- bytes[len++] = strtoul ( ptr, &ptr, 16 );
- switch ( *ptr ) {
- case '\0' :
- return store_setting ( settings, setting, bytes, len );
- case ':' :
- ptr++;
- break;
- default :
- return -EINVAL;
- }
- }
-}
-
-/**
- * Fetch and format value of hex string setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v buf Buffer to contain formatted value
- * @v len Length of buffer
- * @ret len Length of formatted value, or negative error
- */
-static int fetchf_hex ( struct settings *settings, struct setting *setting,
- char *buf, size_t len ) {
- int raw_len;
- int check_len;
- int used = 0;
- int i;
-
- raw_len = fetch_setting_len ( settings, setting );
- if ( raw_len < 0 )
- return raw_len;
-
- {
- uint8_t raw[raw_len];
-
- check_len = fetch_setting ( settings, setting, raw,
- sizeof ( raw ) );
- if ( check_len < 0 )
- return check_len;
- assert ( check_len == raw_len );
-
- if ( len )
- buf[0] = 0; /* Ensure that a terminating NUL exists */
- for ( i = 0 ; i < raw_len ; i++ ) {
- used += ssnprintf ( ( buf + used ), ( len - used ),
- "%s%02x", ( used ? ":" : "" ),
- raw[i] );
- }
- return used;
- }
-}
-
-/** A hex-string setting */
-struct setting_type setting_type_hex __setting_type = {
- .name = "hex",
- .storef = storef_hex,
- .fetchf = fetchf_hex,
-};
-
-/**
- * Parse and store value of UUID setting
- *
- * @v settings Settings block
- * @v setting Setting to store
- * @v value Formatted setting data
- * @ret rc Return status code
- */
-static int storef_uuid ( struct settings *settings __unused,
- struct setting *setting __unused,
- const char *value __unused ) {
- return -ENOTSUP;
-}
-
-/**
- * Fetch and format value of UUID setting
- *
- * @v settings Settings block, or NULL to search all blocks
- * @v setting Setting to fetch
- * @v buf Buffer to contain formatted value
- * @v len Length of buffer
- * @ret len Length of formatted value, or negative error
- */
-static int fetchf_uuid ( struct settings *settings, struct setting *setting,
- char *buf, size_t len ) {
- union uuid uuid;
- int raw_len;
-
- if ( ( raw_len = fetch_uuid_setting ( settings, setting, &uuid ) ) < 0)
- return raw_len;
- return snprintf ( buf, len, "%s", uuid_ntoa ( &uuid ) );
-}
-
-/** UUID setting type */
-struct setting_type setting_type_uuid __setting_type = {
- .name = "uuid",
- .storef = storef_uuid,
- .fetchf = fetchf_uuid,
-};
-
-/******************************************************************************
- *
- * Settings
- *
- ******************************************************************************
- */
-
-/** Hostname setting */
-struct setting hostname_setting __setting = {
- .name = "hostname",
- .description = "Host name",
- .tag = DHCP_HOST_NAME,
- .type = &setting_type_string,
-};
-
-/** Filename setting */
-struct setting filename_setting __setting = {
- .name = "filename",
- .description = "Boot filename",
- .tag = DHCP_BOOTFILE_NAME,
- .type = &setting_type_string,
-};
-
-/** Root path setting */
-struct setting root_path_setting __setting = {
- .name = "root-path",
- .description = "iSCSI root path",
- .tag = DHCP_ROOT_PATH,
- .type = &setting_type_string,
-};
-
-/** Username setting */
-struct setting username_setting __setting = {
- .name = "username",
- .description = "User name",
- .tag = DHCP_EB_USERNAME,
- .type = &setting_type_string,
-};
-
-/** Password setting */
-struct setting password_setting __setting = {
- .name = "password",
- .description = "Password",
- .tag = DHCP_EB_PASSWORD,
- .type = &setting_type_string,
-};
-
-/** Priority setting */
-struct setting priority_setting __setting = {
- .name = "priority",
- .description = "Priority of these settings",
- .tag = DHCP_EB_PRIORITY,
- .type = &setting_type_int8,
-};
diff --git a/gpxe/src/core/string.c b/gpxe/src/core/string.c
deleted file mode 100644
index 190007a4..00000000
--- a/gpxe/src/core/string.c
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright (C) 1991, 1992 Linus Torvalds
- * Copyright (C) 2004 Tobias Lorenz
- *
- * string handling functions
- * based on linux/lib/string.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-FILE_LICENCE ( GPL2_ONLY );
-
-/*
- * stupid library routines.. The optimized versions should generally be found
- * as inline code in <asm-xx/string.h>
- *
- * These are buggy as well..
- *
- * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
- * - Added strsep() which will replace strtok() soon (because strsep() is
- * reentrant and should be faster). Use only strsep() in new code, please.
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-/* *** FROM string.c *** */
-
-#ifndef __HAVE_ARCH_STRCPY
-/**
- * strcpy - Copy a %NUL terminated string
- * @dest: Where to copy the string to
- * @src: Where to copy the string from
- */
-char * strcpy(char * dest,const char *src)
-{
- char *tmp = dest;
-
- while ((*dest++ = *src++) != '\0')
- /* nothing */;
- return tmp;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRNCPY
-/**
- * strncpy - Copy a length-limited, %NUL-terminated string
- * @dest: Where to copy the string to
- * @src: Where to copy the string from
- * @count: The maximum number of bytes to copy
- *
- * Note that unlike userspace strncpy, this does not %NUL-pad the buffer.
- * However, the result is not %NUL-terminated if the source exceeds
- * @count bytes.
- */
-char * strncpy(char * dest,const char *src,size_t count)
-{
- char *tmp = dest;
-
- while (count-- && (*dest++ = *src++) != '\0')
- /* nothing */;
-
- return tmp;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRCAT
-/**
- * strcat - Append one %NUL-terminated string to another
- * @dest: The string to be appended to
- * @src: The string to append to it
- */
-char * strcat(char * dest, const char * src)
-{
- char *tmp = dest;
-
- while (*dest)
- dest++;
- while ((*dest++ = *src++) != '\0')
- ;
-
- return tmp;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRCMP
-/**
- * strcmp - Compare two strings
- * @cs: One string
- * @ct: Another string
- */
-int strcmp(const char * cs,const char * ct)
-{
- register signed char __res;
-
- while (1) {
- if ((__res = *cs - *ct++) != 0 || !*cs++)
- break;
- }
-
- return __res;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRNCMP
-/**
- * strncmp - Compare two length-limited strings
- * @cs: One string
- * @ct: Another string
- * @count: The maximum number of bytes to compare
- */
-int strncmp(const char * cs,const char * ct,size_t count)
-{
- register signed char __res = 0;
-
- while (count) {
- if ((__res = *cs - *ct++) != 0 || !*cs++)
- break;
- count--;
- }
-
- return __res;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRCASECMP
-int strcasecmp(const char *a, const char *b)
-{
- while (*a && *b && (*a & ~0x20) == (*b & ~0x20)) {a++; b++; }
- return((*a & ~0x20) - (*b & ~0x20));
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRCHR
-/**
- * strchr - Find the first occurrence of a character in a string
- * @s: The string to be searched
- * @c: The character to search for
- */
-char * strchr(const char * s, int c)
-{
- for(; *s != (char) c; ++s)
- if (*s == '\0')
- return NULL;
- return (char *) s;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRRCHR
-/**
- * strrchr - Find the last occurrence of a character in a string
- * @s: The string to be searched
- * @c: The character to search for
- */
-char * strrchr(const char * s, int c)
-{
- const char *p = s + strlen(s);
- do {
- if (*p == (char)c)
- return (char *)p;
- } while (--p >= s);
- return NULL;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRLEN
-/**
- * strlen - Find the length of a string
- * @s: The string to be sized
- */
-size_t strlen(const char * s)
-{
- const char *sc;
-
- for (sc = s; *sc != '\0'; ++sc)
- /* nothing */;
- return sc - s;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRNLEN
-/**
- * strnlen - Find the length of a length-limited string
- * @s: The string to be sized
- * @count: The maximum number of bytes to search
- */
-size_t strnlen(const char * s, size_t count)
-{
- const char *sc;
-
- for (sc = s; count-- && *sc != '\0'; ++sc)
- /* nothing */;
- return sc - s;
-}
-#endif
-
-#ifndef __HAVE_ARCH_MEMSET
-/**
- * memset - Fill a region of memory with the given value
- * @s: Pointer to the start of the area.
- * @c: The byte to fill the area with
- * @count: The size of the area.
- *
- * Do not use memset() to access IO space, use memset_io() instead.
- */
-void * memset(void * s,int c,size_t count)
-{
- char *xs = (char *) s;
-
- while (count--)
- *xs++ = c;
-
- return s;
-}
-#endif
-
-#ifndef __HAVE_ARCH_MEMCPY
-/**
- * memcpy - Copy one area of memory to another
- * @dest: Where to copy to
- * @src: Where to copy from
- * @count: The size of the area.
- *
- * You should not use this function to access IO space, use memcpy_toio()
- * or memcpy_fromio() instead.
- */
-void * memcpy(void * dest,const void *src,size_t count)
-{
- char *tmp = (char *) dest, *s = (char *) src;
-
- while (count--)
- *tmp++ = *s++;
-
- return dest;
-}
-#endif
-
-#ifndef __HAVE_ARCH_MEMMOVE
-/**
- * memmove - Copy one area of memory to another
- * @dest: Where to copy to
- * @src: Where to copy from
- * @count: The size of the area.
- *
- * Unlike memcpy(), memmove() copes with overlapping areas.
- */
-void * memmove(void * dest,const void *src,size_t count)
-{
- char *tmp, *s;
-
- if (dest <= src) {
- tmp = (char *) dest;
- s = (char *) src;
- while (count--)
- *tmp++ = *s++;
- }
- else {
- tmp = (char *) dest + count;
- s = (char *) src + count;
- while (count--)
- *--tmp = *--s;
- }
-
- return dest;
-}
-#endif
-
-#ifndef __HAVE_ARCH_MEMCMP
-/**
- * memcmp - Compare two areas of memory
- * @cs: One area of memory
- * @ct: Another area of memory
- * @count: The size of the area.
- */
-int memcmp(const void * cs,const void * ct,size_t count)
-{
- const unsigned char *su1, *su2;
- int res = 0;
-
- for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
- if ((res = *su1 - *su2) != 0)
- break;
- return res;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRSTR
-/**
- * strstr - Find the first substring in a %NUL terminated string
- * @s1: The string to be searched
- * @s2: The string to search for
- */
-char * strstr(const char * s1,const char * s2)
-{
- int l1, l2;
-
- l2 = strlen(s2);
- if (!l2)
- return (char *) s1;
- l1 = strlen(s1);
- while (l1 >= l2) {
- l1--;
- if (!memcmp(s1,s2,l2))
- return (char *) s1;
- s1++;
- }
- return NULL;
-}
-#endif
-
-#ifndef __HAVE_ARCH_MEMCHR
-/**
- * memchr - Find a character in an area of memory.
- * @s: The memory area
- * @c: The byte to search for
- * @n: The size of the area.
- *
- * returns the address of the first occurrence of @c, or %NULL
- * if @c is not found
- */
-void * memchr(const void *s, int c, size_t n)
-{
- const unsigned char *p = s;
- while (n-- != 0) {
- if ((unsigned char)c == *p++) {
- return (void *)(p-1);
- }
- }
- return NULL;
-}
-
-#endif
-
-char * strndup(const char *s, size_t n)
-{
- size_t len = strlen(s);
- char *new;
-
- if (len>n)
- len = n;
- new = malloc(len+1);
- if (new) {
- new[len] = '\0';
- memcpy(new,s,len);
- }
- return new;
-}
-
-char * strdup(const char *s) {
- return strndup(s, ~((size_t)0));
-}
diff --git a/gpxe/src/core/stringextra.c b/gpxe/src/core/stringextra.c
deleted file mode 100644
index c2be4fc4..00000000
--- a/gpxe/src/core/stringextra.c
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 1991, 1992 Linus Torvalds
- * Copyright (C) 2004 Tobias Lorenz
- *
- * string handling functions
- * based on linux/lib/string.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-/*
- * stupid library routines.. The optimized versions should generally be found
- * as inline code in <asm-xx/string.h>
- *
- * These are buggy as well..
- *
- * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
- * - Added strsep() which will replace strtok() soon (because strsep() is
- * reentrant and should be faster). Use only strsep() in new code, please.
- */
-
-/*
- * these are the standard string functions that are currently not used by
- * any code in etherboot. put into a separate file to avoid linking them in
- * with the rest of string.o
- * if anything ever does want to use a function of these, consider moving
- * the function in question back into string.c
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-/* *** FROM string.c *** */
-
-#ifndef __HAVE_ARCH_STRNICMP
-/**
- * strnicmp - Case insensitive, length-limited string comparison
- * @s1: One string
- * @s2: The other string
- * @len: the maximum number of characters to compare
- */
-int strnicmp(const char *s1, const char *s2, size_t len)
-{
- /* Yes, Virginia, it had better be unsigned */
- unsigned char c1, c2;
-
- c1 = 0; c2 = 0;
- if (len) {
- do {
- c1 = *s1; c2 = *s2;
- s1++; s2++;
- if (!c1)
- break;
- if (!c2)
- break;
- if (c1 == c2)
- continue;
- c1 = tolower(c1);
- c2 = tolower(c2);
- if (c1 != c2)
- break;
- } while (--len);
- }
- return (int)c1 - (int)c2;
-}
-#endif
-
-char * ___strtok;
-
-#ifndef __HAVE_ARCH_STRNCAT
-/**
- * strncat - Append a length-limited, %NUL-terminated string to another
- * @dest: The string to be appended to
- * @src: The string to append to it
- * @count: The maximum numbers of bytes to copy
- *
- * Note that in contrast to strncpy, strncat ensures the result is
- * terminated.
- */
-char * strncat(char *dest, const char *src, size_t count)
-{
- char *tmp = dest;
-
- if (count) {
- while (*dest)
- dest++;
- while ((*dest++ = *src++)) {
- if (--count == 0) {
- *dest = '\0';
- break;
- }
- }
- }
-
- return tmp;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRSPN
-/**
- * strspn - Calculate the length of the initial substring of @s which only
- * contain letters in @accept
- * @s: The string to be searched
- * @accept: The string to search for
- */
-size_t strspn(const char *s, const char *accept)
-{
- const char *p;
- const char *a;
- size_t count = 0;
-
- for (p = s; *p != '\0'; ++p) {
- for (a = accept; *a != '\0'; ++a) {
- if (*p == *a)
- break;
- }
- if (*a == '\0')
- return count;
- ++count;
- }
-
- return count;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRCSPN
-/**
- * strcspn - Calculate the length of the initial substring of @s which only
- * contain letters not in @reject
- * @s: The string to be searched
- * @accept: The string to search for
- */
-size_t strcspn(const char *s, const char *reject)
-{
- const char *p;
- const char *r;
- size_t count = 0;
-
- for (p = s; *p != '\0'; ++p) {
- for (r = reject; *r != '\0'; ++r) {
- if (*p == *r)
- return count;
- }
- ++count;
- }
-
- return count;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRPBRK
-/**
- * strpbrk - Find the first occurrence of a set of characters
- * @cs: The string to be searched
- * @ct: The characters to search for
- */
-char * strpbrk(const char * cs,const char * ct)
-{
- const char *sc1,*sc2;
-
- for( sc1 = cs; *sc1 != '\0'; ++sc1) {
- for( sc2 = ct; *sc2 != '\0'; ++sc2) {
- if (*sc1 == *sc2)
- return (char *) sc1;
- }
- }
- return NULL;
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRTOK
-/**
- * strtok - Split a string into tokens
- * @s: The string to be searched
- * @ct: The characters to search for
- *
- * WARNING: strtok is deprecated, use strsep instead.
- */
-char * strtok(char * s,const char * ct)
-{
- char *sbegin, *send;
-
- sbegin = s ? s : ___strtok;
- if (!sbegin) {
- return NULL;
- }
- sbegin += strspn(sbegin,ct);
- if (*sbegin == '\0') {
- ___strtok = NULL;
- return( NULL );
- }
- send = strpbrk( sbegin, ct);
- if (send && *send != '\0')
- *send++ = '\0';
- ___strtok = send;
- return (sbegin);
-}
-#endif
-
-#ifndef __HAVE_ARCH_STRSEP
-/**
- * strsep - Split a string into tokens
- * @s: The string to be searched
- * @ct: The characters to search for
- *
- * strsep() updates @s to point after the token, ready for the next call.
- *
- * It returns empty tokens, too, behaving exactly like the libc function
- * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
- * Same semantics, slimmer shape. ;)
- */
-char * strsep(char **s, const char *ct)
-{
- char *sbegin = *s, *end;
-
- if (sbegin == NULL)
- return NULL;
-
- end = strpbrk(sbegin, ct);
- if (end)
- *end++ = '\0';
- *s = end;
-
- return sbegin;
-}
-#endif
-
-#ifndef __HAVE_ARCH_BCOPY
-/**
- * bcopy - Copy one area of memory to another
- * @src: Where to copy from
- * @dest: Where to copy to
- * @count: The size of the area.
- *
- * Note that this is the same as memcpy(), with the arguments reversed.
- * memcpy() is the standard, bcopy() is a legacy BSD function.
- *
- * You should not use this function to access IO space, use memcpy_toio()
- * or memcpy_fromio() instead.
- */
-char * bcopy(const char * src, char * dest, int count)
-{
- return memmove(dest,src,count);
-}
-#endif
-
-#ifndef __HAVE_ARCH_MEMSCAN
-/**
- * memscan - Find a character in an area of memory.
- * @addr: The memory area
- * @c: The byte to search for
- * @size: The size of the area.
- *
- * returns the address of the first occurrence of @c, or 1 byte past
- * the area if @c is not found
- */
-void * memscan(const void * addr, int c, size_t size)
-{
- unsigned char * p = (unsigned char *) addr;
-
- while (size) {
- if (*p == c)
- return (void *) p;
- p++;
- size--;
- }
- return (void *) p;
-}
-#endif
diff --git a/gpxe/src/core/timer.c b/gpxe/src/core/timer.c
deleted file mode 100644
index 096d07ec..00000000
--- a/gpxe/src/core/timer.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <unistd.h>
-
-/**
- * Delay for a fixed number of milliseconds
- *
- * @v msecs Number of milliseconds for which to delay
- */
-void mdelay ( unsigned long msecs ) {
- while ( msecs-- )
- udelay ( 1000 );
-}
-
-/**
- * Delay for a fixed number of seconds
- *
- * @v secs Number of seconds for which to delay
- */
-unsigned int sleep ( unsigned int secs ) {
- while ( secs-- )
- mdelay ( 1000 );
- return 0;
-}
diff --git a/gpxe/src/core/uri.c b/gpxe/src/core/uri.c
deleted file mode 100644
index 6a1f2e59..00000000
--- a/gpxe/src/core/uri.c
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-/** @file
- *
- * Uniform Resource Identifiers
- *
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <libgen.h>
-#include <ctype.h>
-#include <gpxe/vsprintf.h>
-#include <gpxe/uri.h>
-
-/**
- * Dump URI for debugging
- *
- * @v uri URI
- */
-static void dump_uri ( struct uri *uri ) {
- if ( ! uri )
- return;
- if ( uri->scheme )
- DBG ( " scheme \"%s\"", uri->scheme );
- if ( uri->opaque )
- DBG ( " opaque \"%s\"", uri->opaque );
- if ( uri->user )
- DBG ( " user \"%s\"", uri->user );
- if ( uri->password )
- DBG ( " password \"%s\"", uri->password );
- if ( uri->host )
- DBG ( " host \"%s\"", uri->host );
- if ( uri->port )
- DBG ( " port \"%s\"", uri->port );
- if ( uri->path )
- DBG ( " path \"%s\"", uri->path );
- if ( uri->query )
- DBG ( " query \"%s\"", uri->query );
- if ( uri->fragment )
- DBG ( " fragment \"%s\"", uri->fragment );
-}
-
-/**
- * Parse URI
- *
- * @v uri_string URI as a string
- * @ret uri URI
- *
- * Splits a URI into its component parts. The return URI structure is
- * dynamically allocated and must eventually be freed by calling
- * uri_put().
- */
-struct uri * parse_uri ( const char *uri_string ) {
- struct uri *uri;
- char *raw;
- char *tmp;
- char *path = NULL;
- char *authority = NULL;
- int i;
- size_t raw_len;
-
- /* Allocate space for URI struct and a copy of the string */
- raw_len = ( strlen ( uri_string ) + 1 /* NUL */ );
- uri = zalloc ( sizeof ( *uri ) + raw_len );
- if ( ! uri )
- return NULL;
- raw = ( ( ( char * ) uri ) + sizeof ( *uri ) );
-
- /* Copy in the raw string */
- memcpy ( raw, uri_string, raw_len );
-
- /* Start by chopping off the fragment, if it exists */
- if ( ( tmp = strchr ( raw, '#' ) ) ) {
- *(tmp++) = '\0';
- uri->fragment = tmp;
- }
-
- /* Identify absolute/relative URI. We ignore schemes that are
- * apparently only a single character long, since otherwise we
- * misinterpret a DOS-style path name ("C:\path\to\file") as a
- * URI with scheme="C",opaque="\path\to\file".
- */
- if ( ( tmp = strchr ( raw, ':' ) ) && ( tmp > ( raw + 1 ) ) ) {
- /* Absolute URI: identify hierarchical/opaque */
- uri->scheme = raw;
- *(tmp++) = '\0';
- if ( *tmp == '/' ) {
- /* Absolute URI with hierarchical part */
- path = tmp;
- } else {
- /* Absolute URI with opaque part */
- uri->opaque = tmp;
- }
- } else {
- /* Relative URI */
- path = raw;
- }
-
- /* If we don't have a path (i.e. we have an absolute URI with
- * an opaque portion, we're already finished processing
- */
- if ( ! path )
- goto done;
-
- /* Chop off the query, if it exists */
- if ( ( tmp = strchr ( path, '?' ) ) ) {
- *(tmp++) = '\0';
- uri->query = tmp;
- }
-
- /* Identify net/absolute/relative path */
- if ( strncmp ( path, "//", 2 ) == 0 ) {
- /* Net path. If this is terminated by the first '/'
- * of an absolute path, then we have no space for a
- * terminator after the authority field, so shuffle
- * the authority down by one byte, overwriting one of
- * the two slashes.
- */
- authority = ( path + 2 );
- if ( ( tmp = strchr ( authority, '/' ) ) ) {
- /* Shuffle down */
- uri->path = tmp;
- memmove ( ( authority - 1 ), authority,
- ( tmp - authority ) );
- authority--;
- *(--tmp) = '\0';
- }
- } else {
- /* Absolute/relative path */
- uri->path = path;
- }
-
- /* Split authority into user[:password] and host[:port] portions */
- if ( ( tmp = strchr ( authority, '@' ) ) ) {
- /* Has user[:password] */
- *(tmp++) = '\0';
- uri->host = tmp;
- uri->user = authority;
- if ( ( tmp = strchr ( authority, ':' ) ) ) {
- /* Has password */
- *(tmp++) = '\0';
- uri->password = tmp;
- }
- } else {
- /* No user:password */
- uri->host = authority;
- }
-
- /* Split host into host[:port] */
- if ( ( tmp = strchr ( uri->host, ':' ) ) ) {
- *(tmp++) = '\0';
- uri->port = tmp;
- }
-
- /* Decode fields that should be decoded */
- for ( i = URI_FIRST_FIELD; i <= URI_LAST_FIELD; i++ ) {
- const char *field = uri_get_field ( uri, i );
- if ( field && ( URI_ENCODED & ( 1 << i ) ) )
- uri_decode ( field, ( char * ) field,
- strlen ( field ) + 1 /* NUL */ );
- }
-
- done:
- DBG ( "URI \"%s\" split into", uri_string );
- dump_uri ( uri );
- DBG ( "\n" );
-
- return uri;
-}
-
-/**
- * Get port from URI
- *
- * @v uri URI, or NULL
- * @v default_port Default port to use if none specified in URI
- * @ret port Port
- */
-unsigned int uri_port ( struct uri *uri, unsigned int default_port ) {
- if ( ( ! uri ) || ( ! uri->port ) )
- return default_port;
- return ( strtoul ( uri->port, NULL, 0 ) );
-}
-
-/**
- * Unparse URI
- *
- * @v buf Buffer to fill with URI string
- * @v size Size of buffer
- * @v uri URI to write into buffer, or NULL
- * @v fields Bitmask of fields to include in URI string, or URI_ALL
- * @ret len Length of URI string
- */
-int unparse_uri ( char *buf, size_t size, struct uri *uri,
- unsigned int fields ) {
- /* List of characters that typically go before certain fields */
- static char separators[] = { /* scheme */ 0, /* opaque */ ':',
- /* user */ 0, /* password */ ':',
- /* host */ '@', /* port */ ':',
- /* path */ 0, /* query */ '?',
- /* fragment */ '#' };
- int used = 0;
- int i;
-
- DBG ( "URI unparsing" );
- dump_uri ( uri );
- DBG ( "\n" );
-
- /* Ensure buffer is NUL-terminated */
- if ( size )
- buf[0] = '\0';
-
- /* Special-case NULL URI */
- if ( ! uri )
- return 0;
-
- /* Iterate through requested fields */
- for ( i = URI_FIRST_FIELD; i <= URI_LAST_FIELD; i++ ) {
- const char *field = uri_get_field ( uri, i );
- char sep = separators[i];
-
- /* Ensure `fields' only contains bits for fields that exist */
- if ( ! field )
- fields &= ~( 1 << i );
-
- /* Store this field if we were asked to */
- if ( fields & ( 1 << i ) ) {
- /* Print :// if we're non-opaque and had a scheme */
- if ( ( fields & URI_SCHEME_BIT ) &&
- ( i > URI_OPAQUE ) ) {
- used += ssnprintf ( buf + used, size - used,
- "://" );
- /* Only print :// once */
- fields &= ~URI_SCHEME_BIT;
- }
-
- /* Only print separator if an earlier field exists */
- if ( sep && ( fields & ( ( 1 << i ) - 1 ) ) )
- used += ssnprintf ( buf + used, size - used,
- "%c", sep );
-
- /* Print contents of field, possibly encoded */
- if ( URI_ENCODED & ( 1 << i ) )
- used += uri_encode ( field, buf + used,
- size - used, i );
- else
- used += ssnprintf ( buf + used, size - used,
- "%s", field );
- }
- }
-
- return used;
-}
-
-/**
- * Duplicate URI
- *
- * @v uri URI
- * @ret uri Duplicate URI
- *
- * Creates a modifiable copy of a URI.
- */
-struct uri * uri_dup ( struct uri *uri ) {
- size_t len = ( unparse_uri ( NULL, 0, uri, URI_ALL ) + 1 );
- char buf[len];
-
- unparse_uri ( buf, len, uri, URI_ALL );
- return parse_uri ( buf );
-}
-
-/**
- * Resolve base+relative path
- *
- * @v base_uri Base path
- * @v relative_uri Relative path
- * @ret resolved_uri Resolved path
- *
- * Takes a base path (e.g. "/var/lib/tftpboot/vmlinuz" and a relative
- * path (e.g. "initrd.gz") and produces a new path
- * (e.g. "/var/lib/tftpboot/initrd.gz"). Note that any non-directory
- * portion of the base path will automatically be stripped; this
- * matches the semantics used when resolving the path component of
- * URIs.
- */
-char * resolve_path ( const char *base_path,
- const char *relative_path ) {
- size_t base_len = ( strlen ( base_path ) + 1 );
- char base_path_copy[base_len];
- char *base_tmp = base_path_copy;
- char *resolved;
-
- /* If relative path is absolute, just re-use it */
- if ( relative_path[0] == '/' )
- return strdup ( relative_path );
-
- /* Create modifiable copy of path for dirname() */
- memcpy ( base_tmp, base_path, base_len );
- base_tmp = dirname ( base_tmp );
-
- /* Process "./" and "../" elements */
- while ( *relative_path == '.' ) {
- relative_path++;
- if ( *relative_path == 0 ) {
- /* Do nothing */
- } else if ( *relative_path == '/' ) {
- relative_path++;
- } else if ( *relative_path == '.' ) {
- relative_path++;
- if ( *relative_path == 0 ) {
- base_tmp = dirname ( base_tmp );
- } else if ( *relative_path == '/' ) {
- base_tmp = dirname ( base_tmp );
- relative_path++;
- } else {
- relative_path -= 2;
- break;
- }
- } else {
- relative_path--;
- break;
- }
- }
-
- /* Create and return new path */
- if ( asprintf ( &resolved, "%s%s%s", base_tmp,
- ( ( base_tmp[ strlen ( base_tmp ) - 1 ] == '/' ) ?
- "" : "/" ), relative_path ) < 0 )
- return NULL;
-
- return resolved;
-}
-
-/**
- * Resolve base+relative URI
- *
- * @v base_uri Base URI, or NULL
- * @v relative_uri Relative URI
- * @ret resolved_uri Resolved URI
- *
- * Takes a base URI (e.g. "http://etherboot.org/kernels/vmlinuz" and a
- * relative URI (e.g. "../initrds/initrd.gz") and produces a new URI
- * (e.g. "http://etherboot.org/initrds/initrd.gz").
- */
-struct uri * resolve_uri ( struct uri *base_uri,
- struct uri *relative_uri ) {
- struct uri tmp_uri;
- char *tmp_path = NULL;
- struct uri *new_uri;
-
- /* If relative URI is absolute, just re-use it */
- if ( uri_is_absolute ( relative_uri ) || ( ! base_uri ) )
- return uri_get ( relative_uri );
-
- /* Mangle URI */
- memcpy ( &tmp_uri, base_uri, sizeof ( tmp_uri ) );
- if ( relative_uri->path ) {
- tmp_path = resolve_path ( ( base_uri->path ?
- base_uri->path : "/" ),
- relative_uri->path );
- tmp_uri.path = tmp_path;
- tmp_uri.query = relative_uri->query;
- tmp_uri.fragment = relative_uri->fragment;
- } else if ( relative_uri->query ) {
- tmp_uri.query = relative_uri->query;
- tmp_uri.fragment = relative_uri->fragment;
- } else if ( relative_uri->fragment ) {
- tmp_uri.fragment = relative_uri->fragment;
- }
-
- /* Create demangled URI */
- new_uri = uri_dup ( &tmp_uri );
- free ( tmp_path );
- return new_uri;
-}
-
-/**
- * Test for unreserved URI characters
- *
- * @v c Character to test
- * @v field Field of URI in which character lies
- * @ret is_unreserved Character is an unreserved character
- */
-static int is_unreserved_uri_char ( int c, int field ) {
- /* According to RFC3986, the unreserved character set is
- *
- * A-Z a-z 0-9 - _ . ~
- *
- * but we also pass & ; = in queries, / in paths,
- * and everything in opaques
- */
- int ok = ( isupper ( c ) || islower ( c ) || isdigit ( c ) ||
- ( c == '-' ) || ( c == '_' ) ||
- ( c == '.' ) || ( c == '~' ) );
-
- if ( field == URI_QUERY )
- ok = ok || ( c == ';' ) || ( c == '&' ) || ( c == '=' );
-
- if ( field == URI_PATH )
- ok = ok || ( c == '/' );
-
- if ( field == URI_OPAQUE )
- ok = 1;
-
- return ok;
-}
-
-/**
- * URI-encode string
- *
- * @v raw_string String to be URI-encoded
- * @v buf Buffer to contain encoded string
- * @v len Length of buffer
- * @v field Field of URI in which string lies
- * @ret len Length of encoded string (excluding NUL)
- */
-size_t uri_encode ( const char *raw_string, char *buf, ssize_t len,
- int field ) {
- ssize_t remaining = len;
- size_t used;
- unsigned char c;
-
- if ( len > 0 )
- buf[0] = '\0';
-
- while ( ( c = *(raw_string++) ) ) {
- if ( is_unreserved_uri_char ( c, field ) ) {
- used = ssnprintf ( buf, remaining, "%c", c );
- } else {
- used = ssnprintf ( buf, remaining, "%%%02X", c );
- }
- buf += used;
- remaining -= used;
- }
-
- return ( len - remaining );
-}
-
-/**
- * Decode URI-encoded string
- *
- * @v encoded_string URI-encoded string
- * @v buf Buffer to contain decoded string
- * @v len Length of buffer
- * @ret len Length of decoded string (excluding NUL)
- *
- * This function may be used in-place, with @a buf the same as
- * @a encoded_string.
- */
-size_t uri_decode ( const char *encoded_string, char *buf, ssize_t len ) {
- ssize_t remaining;
- char hexbuf[3];
- char *hexbuf_end;
- unsigned char c;
-
- for ( remaining = len; *encoded_string; remaining-- ) {
- if ( *encoded_string == '%' ) {
- encoded_string++;
- snprintf ( hexbuf, sizeof ( hexbuf ), "%s",
- encoded_string );
- c = strtoul ( hexbuf, &hexbuf_end, 16 );
- encoded_string += ( hexbuf_end - hexbuf );
- } else {
- c = *(encoded_string++);
- }
- if ( remaining > 1 )
- *buf++ = c;
- }
-
- if ( len )
- *buf = 0;
-
- return ( len - remaining );
-}
diff --git a/gpxe/src/core/uuid.c b/gpxe/src/core/uuid.c
deleted file mode 100644
index 2b67d55d..00000000
--- a/gpxe/src/core/uuid.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdint.h>
-#include <stdio.h>
-#include <byteswap.h>
-#include <gpxe/uuid.h>
-
-/** @file
- *
- * Universally unique IDs
- *
- */
-
-/**
- * Convert UUID to printable string
- *
- * @v uuid UUID
- * @ret string UUID in canonical form
- */
-char * uuid_ntoa ( union uuid *uuid ) {
- static char buf[37]; /* "00000000-0000-0000-0000-000000000000" */
-
- sprintf ( buf, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x",
- be32_to_cpu ( uuid->canonical.a ),
- be16_to_cpu ( uuid->canonical.b ),
- be16_to_cpu ( uuid->canonical.c ),
- be16_to_cpu ( uuid->canonical.d ),
- uuid->canonical.e[0], uuid->canonical.e[1],
- uuid->canonical.e[2], uuid->canonical.e[3],
- uuid->canonical.e[4], uuid->canonical.e[5] );
- return buf;
-}
diff --git a/gpxe/src/core/vsprintf.c b/gpxe/src/core/vsprintf.c
deleted file mode 100644
index 21ab2429..00000000
--- a/gpxe/src/core/vsprintf.c
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stddef.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <console.h>
-#include <errno.h>
-#include <gpxe/vsprintf.h>
-
-/** @file */
-
-#define CHAR_LEN 0 /**< "hh" length modifier */
-#define SHORT_LEN 1 /**< "h" length modifier */
-#define INT_LEN 2 /**< no length modifier */
-#define LONG_LEN 3 /**< "l" length modifier */
-#define LONGLONG_LEN 4 /**< "ll" length modifier */
-#define SIZE_T_LEN 5 /**< "z" length modifier */
-
-static uint8_t type_sizes[] = {
- [CHAR_LEN] = sizeof ( char ),
- [SHORT_LEN] = sizeof ( short ),
- [INT_LEN] = sizeof ( int ),
- [LONG_LEN] = sizeof ( long ),
- [LONGLONG_LEN] = sizeof ( long long ),
- [SIZE_T_LEN] = sizeof ( size_t ),
-};
-
-/**
- * Use lower-case for hexadecimal digits
- *
- * Note that this value is set to 0x20 since that makes for very
- * efficient calculations. (Bitwise-ORing with @c LCASE converts to a
- * lower-case character, for example.)
- */
-#define LCASE 0x20
-
-/**
- * Use "alternate form"
- *
- * For hexadecimal numbers, this means to add a "0x" or "0X" prefix to
- * the number.
- */
-#define ALT_FORM 0x02
-
-/**
- * Format a hexadecimal number
- *
- * @v end End of buffer to contain number
- * @v num Number to format
- * @v width Minimum field width
- * @ret ptr End of buffer
- *
- * Fills a buffer in reverse order with a formatted hexadecimal
- * number. The number will be zero-padded to the specified width.
- * Lower-case and "alternate form" (i.e. "0x" prefix) flags may be
- * set.
- *
- * There must be enough space in the buffer to contain the largest
- * number that this function can format.
- */
-static char * format_hex ( char *end, unsigned long long num, int width,
- int flags ) {
- char *ptr = end;
- int case_mod;
-
- /* Generate the number */
- case_mod = flags & LCASE;
- do {
- *(--ptr) = "0123456789ABCDEF"[ num & 0xf ] | case_mod;
- num >>= 4;
- } while ( num );
-
- /* Zero-pad to width */
- while ( ( end - ptr ) < width )
- *(--ptr) = '0';
-
- /* Add "0x" or "0X" if alternate form specified */
- if ( flags & ALT_FORM ) {
- *(--ptr) = 'X' | case_mod;
- *(--ptr) = '0';
- }
-
- return ptr;
-}
-
-/**
- * Format a decimal number
- *
- * @v end End of buffer to contain number
- * @v num Number to format
- * @v width Minimum field width
- * @ret ptr End of buffer
- *
- * Fills a buffer in reverse order with a formatted decimal number.
- * The number will be space-padded to the specified width.
- *
- * There must be enough space in the buffer to contain the largest
- * number that this function can format.
- */
-static char * format_decimal ( char *end, signed long num, int width ) {
- char *ptr = end;
- int negative = 0;
-
- /* Generate the number */
- if ( num < 0 ) {
- negative = 1;
- num = -num;
- }
- do {
- *(--ptr) = '0' + ( num % 10 );
- num /= 10;
- } while ( num );
-
- /* Add "-" if necessary */
- if ( negative )
- *(--ptr) = '-';
-
- /* Space-pad to width */
- while ( ( end - ptr ) < width )
- *(--ptr) = ' ';
-
- return ptr;
-}
-
-/**
- * Print character via a printf context
- *
- * @v ctx Context
- * @v c Character
- *
- * Call's the printf_context::handler() method and increments
- * printf_context::len.
- */
-static inline void cputchar ( struct printf_context *ctx, unsigned int c ) {
- ctx->handler ( ctx, c );
- ++ctx->len;
-}
-
-/**
- * Write a formatted string to a printf context
- *
- * @v ctx Context
- * @v fmt Format string
- * @v args Arguments corresponding to the format string
- * @ret len Length of formatted string
- */
-size_t vcprintf ( struct printf_context *ctx, const char *fmt, va_list args ) {
- int flags;
- int width;
- uint8_t *length;
- char *ptr;
- char tmp_buf[32]; /* 32 is enough for all numerical formats.
- * Insane width fields could overflow this buffer. */
-
- /* Initialise context */
- ctx->len = 0;
-
- for ( ; *fmt ; fmt++ ) {
- /* Pass through ordinary characters */
- if ( *fmt != '%' ) {
- cputchar ( ctx, *fmt );
- continue;
- }
- fmt++;
- /* Process flag characters */
- flags = 0;
- for ( ; ; fmt++ ) {
- if ( *fmt == '#' ) {
- flags |= ALT_FORM;
- } else if ( *fmt == '0' ) {
- /* We always 0-pad hex and space-pad decimal */
- } else {
- /* End of flag characters */
- break;
- }
- }
- /* Process field width */
- width = 0;
- for ( ; ; fmt++ ) {
- if ( ( ( unsigned ) ( *fmt - '0' ) ) < 10 ) {
- width = ( width * 10 ) + ( *fmt - '0' );
- } else {
- break;
- }
- }
- /* We don't do floating point */
- /* Process length modifier */
- length = &type_sizes[INT_LEN];
- for ( ; ; fmt++ ) {
- if ( *fmt == 'h' ) {
- length--;
- } else if ( *fmt == 'l' ) {
- length++;
- } else if ( *fmt == 'z' ) {
- length = &type_sizes[SIZE_T_LEN];
- } else {
- break;
- }
- }
- /* Process conversion specifier */
- ptr = tmp_buf + sizeof ( tmp_buf ) - 1;
- *ptr = '\0';
- if ( *fmt == 'c' ) {
- cputchar ( ctx, va_arg ( args, unsigned int ) );
- } else if ( *fmt == 's' ) {
- ptr = va_arg ( args, char * );
- if ( ! ptr )
- ptr = "<NULL>";
- } else if ( *fmt == 'p' ) {
- intptr_t ptrval;
-
- ptrval = ( intptr_t ) va_arg ( args, void * );
- ptr = format_hex ( ptr, ptrval, width,
- ( ALT_FORM | LCASE ) );
- } else if ( ( *fmt & ~0x20 ) == 'X' ) {
- unsigned long long hex;
-
- flags |= ( *fmt & 0x20 ); /* LCASE */
- if ( *length >= sizeof ( unsigned long long ) ) {
- hex = va_arg ( args, unsigned long long );
- } else if ( *length >= sizeof ( unsigned long ) ) {
- hex = va_arg ( args, unsigned long );
- } else {
- hex = va_arg ( args, unsigned int );
- }
- ptr = format_hex ( ptr, hex, width, flags );
- } else if ( ( *fmt == 'd' ) || ( *fmt == 'i' ) ){
- signed long decimal;
-
- if ( *length >= sizeof ( signed long ) ) {
- decimal = va_arg ( args, signed long );
- } else {
- decimal = va_arg ( args, signed int );
- }
- ptr = format_decimal ( ptr, decimal, width );
- } else {
- *(--ptr) = *fmt;
- }
- /* Write out conversion result */
- for ( ; *ptr ; ptr++ ) {
- cputchar ( ctx, *ptr );
- }
- }
-
- return ctx->len;
-}
-
-/** Context used by vsnprintf() and friends */
-struct sputc_context {
- struct printf_context ctx;
- /** Buffer for formatted string (used by printf_sputc()) */
- char *buf;
- /** Buffer length (used by printf_sputc()) */
- size_t max_len;
-};
-
-/**
- * Write character to buffer
- *
- * @v ctx Context
- * @v c Character
- */
-static void printf_sputc ( struct printf_context *ctx, unsigned int c ) {
- struct sputc_context * sctx =
- container_of ( ctx, struct sputc_context, ctx );
-
- if ( ctx->len < sctx->max_len )
- sctx->buf[ctx->len] = c;
-}
-
-/**
- * Write a formatted string to a buffer
- *
- * @v buf Buffer into which to write the string
- * @v size Size of buffer
- * @v fmt Format string
- * @v args Arguments corresponding to the format string
- * @ret len Length of formatted string
- *
- * If the buffer is too small to contain the string, the returned
- * length is the length that would have been written had enough space
- * been available.
- */
-int vsnprintf ( char *buf, size_t size, const char *fmt, va_list args ) {
- struct sputc_context sctx;
- size_t len;
- size_t end;
-
- /* Hand off to vcprintf */
- sctx.ctx.handler = printf_sputc;
- sctx.buf = buf;
- sctx.max_len = size;
- len = vcprintf ( &sctx.ctx, fmt, args );
-
- /* Add trailing NUL */
- if ( size ) {
- end = size - 1;
- if ( len < end )
- end = len;
- buf[end] = '\0';
- }
-
- return len;
-}
-
-/**
- * Write a formatted string to a buffer
- *
- * @v buf Buffer into which to write the string
- * @v size Size of buffer
- * @v fmt Format string
- * @v ... Arguments corresponding to the format string
- * @ret len Length of formatted string
- */
-int snprintf ( char *buf, size_t size, const char *fmt, ... ) {
- va_list args;
- int i;
-
- va_start ( args, fmt );
- i = vsnprintf ( buf, size, fmt, args );
- va_end ( args );
- return i;
-}
-
-/**
- * Version of vsnprintf() that accepts a signed buffer size
- *
- * @v buf Buffer into which to write the string
- * @v size Size of buffer
- * @v fmt Format string
- * @v args Arguments corresponding to the format string
- * @ret len Length of formatted string
- */
-int vssnprintf ( char *buf, ssize_t ssize, const char *fmt, va_list args ) {
-
- /* Treat negative buffer size as zero buffer size */
- if ( ssize < 0 )
- ssize = 0;
-
- /* Hand off to vsnprintf */
- return vsnprintf ( buf, ssize, fmt, args );
-}
-
-/**
- * Version of vsnprintf() that accepts a signed buffer size
- *
- * @v buf Buffer into which to write the string
- * @v size Size of buffer
- * @v fmt Format string
- * @v ... Arguments corresponding to the format string
- * @ret len Length of formatted string
- */
-int ssnprintf ( char *buf, ssize_t ssize, const char *fmt, ... ) {
- va_list args;
- int len;
-
- /* Hand off to vssnprintf */
- va_start ( args, fmt );
- len = vssnprintf ( buf, ssize, fmt, args );
- va_end ( args );
- return len;
-}
-
-/**
- * Write character to console
- *
- * @v ctx Context
- * @v c Character
- */
-static void printf_putchar ( struct printf_context *ctx __unused,
- unsigned int c ) {
- putchar ( c );
-}
-
-/**
- * Write a formatted string to the console
- *
- * @v fmt Format string
- * @v args Arguments corresponding to the format string
- * @ret len Length of formatted string
- */
-int vprintf ( const char *fmt, va_list args ) {
- struct printf_context ctx;
-
- /* Hand off to vcprintf */
- ctx.handler = printf_putchar;
- return vcprintf ( &ctx, fmt, args );
-}
-
-/**
- * Write a formatted string to the console.
- *
- * @v fmt Format string
- * @v ... Arguments corresponding to the format string
- * @ret len Length of formatted string
- */
-int printf ( const char *fmt, ... ) {
- va_list args;
- int i;
-
- va_start ( args, fmt );
- i = vprintf ( fmt, args );
- va_end ( args );
- return i;
-}
diff --git a/gpxe/src/core/xfer.c b/gpxe/src/core/xfer.c
deleted file mode 100644
index 1ec6f9d3..00000000
--- a/gpxe/src/core/xfer.c
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <string.h>
-#include <stdio.h>
-#include <errno.h>
-#include <gpxe/xfer.h>
-
-/** @file
- *
- * Data transfer interfaces
- *
- */
-
-/**
- * Dummy transfer metadata
- *
- * This gets passed to xfer_interface::deliver_iob() and equivalents
- * when no metadata is available.
- */
-static struct xfer_metadata dummy_metadata;
-
-/**
- * Close data transfer interface
- *
- * @v xfer Data transfer interface
- * @v rc Reason for close
- */
-void xfer_close ( struct xfer_interface *xfer, int rc ) {
- struct xfer_interface *dest = xfer_get_dest ( xfer );
- struct xfer_interface_operations *op = xfer->op;
-
- DBGC ( xfer, "XFER %p->%p close\n", xfer, dest );
-
- xfer_unplug ( xfer );
- xfer_nullify ( xfer );
- dest->op->close ( dest, rc );
- xfer->op = op;
- xfer_put ( dest );
-}
-
-/**
- * Send redirection event
- *
- * @v xfer Data transfer interface
- * @v type New location type
- * @v args Remaining arguments depend upon location type
- * @ret rc Return status code
- */
-int xfer_vredirect ( struct xfer_interface *xfer, int type, va_list args ) {
- struct xfer_interface *dest = xfer_get_dest ( xfer );
- int rc;
-
- DBGC ( xfer, "XFER %p->%p redirect\n", xfer, dest );
-
- rc = dest->op->vredirect ( dest, type, args );
-
- if ( rc != 0 ) {
- DBGC ( xfer, "XFER %p<-%p redirect: %s\n", xfer, dest,
- strerror ( rc ) );
- }
- xfer_put ( dest );
- return rc;
-}
-
-/**
- * Send redirection event
- *
- * @v xfer Data transfer interface
- * @v type New location type
- * @v ... Remaining arguments depend upon location type
- * @ret rc Return status code
- */
-int xfer_redirect ( struct xfer_interface *xfer, int type, ... ) {
- va_list args;
- int rc;
-
- va_start ( args, type );
- rc = xfer_vredirect ( xfer, type, args );
- va_end ( args );
- return rc;
-}
-
-/**
- * Check flow control window
- *
- * @v xfer Data transfer interface
- * @ret len Length of window
- */
-size_t xfer_window ( struct xfer_interface *xfer ) {
- struct xfer_interface *dest = xfer_get_dest ( xfer );
- size_t len;
-
- len = dest->op->window ( dest );
-
- xfer_put ( dest );
- return len;
-}
-
-/**
- * Allocate I/O buffer
- *
- * @v xfer Data transfer interface
- * @v len I/O buffer payload length
- * @ret iobuf I/O buffer
- */
-struct io_buffer * xfer_alloc_iob ( struct xfer_interface *xfer, size_t len ) {
- struct xfer_interface *dest = xfer_get_dest ( xfer );
- struct io_buffer *iobuf;
-
- DBGC ( xfer, "XFER %p->%p alloc_iob %zd\n", xfer, dest, len );
-
- iobuf = dest->op->alloc_iob ( dest, len );
-
- if ( ! iobuf ) {
- DBGC ( xfer, "XFER %p<-%p alloc_iob failed\n", xfer, dest );
- }
- xfer_put ( dest );
- return iobuf;
-}
-
-/**
- * Deliver datagram as I/O buffer with metadata
- *
- * @v xfer Data transfer interface
- * @v iobuf Datagram I/O buffer
- * @v meta Data transfer metadata
- * @ret rc Return status code
- */
-int xfer_deliver_iob_meta ( struct xfer_interface *xfer,
- struct io_buffer *iobuf,
- struct xfer_metadata *meta ) {
- struct xfer_interface *dest = xfer_get_dest ( xfer );
- int rc;
-
- DBGC ( xfer, "XFER %p->%p deliver_iob %zd\n", xfer, dest,
- iob_len ( iobuf ) );
-
- rc = dest->op->deliver_iob ( dest, iobuf, meta );
-
- if ( rc != 0 ) {
- DBGC ( xfer, "XFER %p<-%p deliver_iob: %s\n", xfer, dest,
- strerror ( rc ) );
- }
- xfer_put ( dest );
- return rc;
-}
-
-/**
- * Deliver datagram as I/O buffer with metadata
- *
- * @v xfer Data transfer interface
- * @v iobuf Datagram I/O buffer
- * @ret rc Return status code
- */
-int xfer_deliver_iob ( struct xfer_interface *xfer,
- struct io_buffer *iobuf ) {
- return xfer_deliver_iob_meta ( xfer, iobuf, &dummy_metadata );
-}
-
-/**
- * Deliver datagram as raw data
- *
- * @v xfer Data transfer interface
- * @v iobuf Datagram I/O buffer
- * @ret rc Return status code
- */
-int xfer_deliver_raw ( struct xfer_interface *xfer,
- const void *data, size_t len ) {
- struct xfer_interface *dest = xfer_get_dest ( xfer );
- int rc;
-
- DBGC ( xfer, "XFER %p->%p deliver_raw %p+%zd\n", xfer, dest,
- data, len );
-
- rc = dest->op->deliver_raw ( dest, data, len );
-
- if ( rc != 0 ) {
- DBGC ( xfer, "XFER %p<-%p deliver_raw: %s\n", xfer, dest,
- strerror ( rc ) );
- }
- xfer_put ( dest );
- return rc;
-}
-
-/**
- * Deliver formatted string
- *
- * @v xfer Data transfer interface
- * @v format Format string
- * @v args Arguments corresponding to the format string
- * @ret rc Return status code
- */
-int xfer_vprintf ( struct xfer_interface *xfer, const char *format,
- va_list args ) {
- size_t len;
- va_list args_tmp;
-
- va_copy ( args_tmp, args );
- len = vsnprintf ( NULL, 0, format, args );
- {
- char buf[len + 1];
- vsnprintf ( buf, sizeof ( buf ), format, args_tmp );
- va_end ( args_tmp );
- return xfer_deliver_raw ( xfer, buf, len );
- }
-}
-
-/**
- * Deliver formatted string
- *
- * @v xfer Data transfer interface
- * @v format Format string
- * @v ... Arguments corresponding to the format string
- * @ret rc Return status code
- */
-int xfer_printf ( struct xfer_interface *xfer, const char *format, ... ) {
- va_list args;
- int rc;
-
- va_start ( args, format );
- rc = xfer_vprintf ( xfer, format, args );
- va_end ( args );
- return rc;
-}
-
-/**
- * Seek to position
- *
- * @v xfer Data transfer interface
- * @v offset Offset to new position
- * @v whence Basis for new position
- * @ret rc Return status code
- */
-int xfer_seek ( struct xfer_interface *xfer, off_t offset, int whence ) {
- struct io_buffer *iobuf;
- struct xfer_metadata meta = {
- .offset = offset,
- .whence = whence,
- };
-
- DBGC ( xfer, "XFER %p seek %s+%ld\n", xfer,
- whence_text ( whence ), offset );
-
- /* Allocate and send a zero-length data buffer */
- iobuf = xfer_alloc_iob ( xfer, 0 );
- if ( ! iobuf )
- return -ENOMEM;
- return xfer_deliver_iob_meta ( xfer, iobuf, &meta );
-}
-
-/****************************************************************************
- *
- * Helper methods
- *
- * These functions are designed to be used as methods in the
- * xfer_interface_operations table.
- *
- */
-
-/**
- * Ignore close() event
- *
- * @v xfer Data transfer interface
- * @v rc Reason for close
- */
-void ignore_xfer_close ( struct xfer_interface *xfer __unused,
- int rc __unused ) {
- /* Nothing to do */
-}
-
-/**
- * Ignore vredirect() event
- *
- * @v xfer Data transfer interface
- * @v type New location type
- * @v args Remaining arguments depend upon location type
- * @ret rc Return status code
- */
-int ignore_xfer_vredirect ( struct xfer_interface *xfer __unused,
- int type __unused, va_list args __unused ) {
- return 0;
-}
-
-/**
- * Unlimited flow control window
- *
- * @v xfer Data transfer interface
- * @ret len Length of window
- *
- * This handler indicates that the interface is always ready to accept
- * data.
- */
-size_t unlimited_xfer_window ( struct xfer_interface *xfer __unused ) {
- return ~( ( size_t ) 0 );
-}
-
-/**
- * No flow control window
- *
- * @v xfer Data transfer interface
- * @ret len Length of window
- *
- * This handler indicates that the interface is never ready to accept
- * data.
- */
-size_t no_xfer_window ( struct xfer_interface *xfer __unused ) {
- return 0;
-}
-
-/**
- * Allocate I/O buffer
- *
- * @v xfer Data transfer interface
- * @v len I/O buffer payload length
- * @ret iobuf I/O buffer
- */
-struct io_buffer *
-default_xfer_alloc_iob ( struct xfer_interface *xfer __unused, size_t len ) {
- return alloc_iob ( len );
-}
-
-/**
- * Deliver datagram as raw data
- *
- * @v xfer Data transfer interface
- * @v iobuf Datagram I/O buffer
- * @v meta Data transfer metadata
- * @ret rc Return status code
- *
- * This function is intended to be used as the deliver() method for
- * data transfer interfaces that prefer to handle raw data.
- */
-int xfer_deliver_as_raw ( struct xfer_interface *xfer,
- struct io_buffer *iobuf,
- struct xfer_metadata *meta __unused ) {
- int rc;
-
- rc = xfer->op->deliver_raw ( xfer, iobuf->data, iob_len ( iobuf ) );
- free_iob ( iobuf );
- return rc;
-}
-
-/**
- * Deliver datagram as I/O buffer
- *
- * @v xfer Data transfer interface
- * @v data Data buffer
- * @v len Length of data buffer
- * @ret rc Return status code
- *
- * This function is intended to be used as the deliver_raw() method
- * for data transfer interfaces that prefer to handle I/O buffers.
- */
-int xfer_deliver_as_iob ( struct xfer_interface *xfer,
- const void *data, size_t len ) {
- struct io_buffer *iobuf;
-
- iobuf = xfer->op->alloc_iob ( xfer, len );
- if ( ! iobuf )
- return -ENOMEM;
-
- memcpy ( iob_put ( iobuf, len ), data, len );
- return xfer->op->deliver_iob ( xfer, iobuf, &dummy_metadata );
-}
-
-/**
- * Ignore datagram as raw data event
- *
- * @v xfer Data transfer interface
- * @v data Data buffer
- * @v len Length of data buffer
- * @ret rc Return status code
- */
-int ignore_xfer_deliver_raw ( struct xfer_interface *xfer,
- const void *data __unused, size_t len ) {
- DBGC ( xfer, "XFER %p %zd bytes delivered %s\n", xfer, len,
- ( ( xfer == &null_xfer ) ?
- "before connection" : "after termination" ) );
- return 0;
-}
-
-/** Null data transfer interface operations */
-struct xfer_interface_operations null_xfer_ops = {
- .close = ignore_xfer_close,
- .vredirect = ignore_xfer_vredirect,
- .window = unlimited_xfer_window,
- .alloc_iob = default_xfer_alloc_iob,
- .deliver_iob = xfer_deliver_as_raw,
- .deliver_raw = ignore_xfer_deliver_raw,
-};
-
-/**
- * Null data transfer interface
- *
- * This is the interface to which data transfer interfaces are
- * connected when unplugged. It will never generate messages, and
- * will silently absorb all received messages.
- */
-struct xfer_interface null_xfer = XFER_INIT ( &null_xfer_ops );