summaryrefslogtreecommitdiff
path: root/gpxe/src/core
diff options
context:
space:
mode:
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 );