Remove output routine from the reloc program, making it smaller
authorH. Peter Anvin <hpa@zytor.com>
Sat, 5 Jan 2008 00:28:36 +0000 (16:28 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Sat, 5 Jan 2008 00:28:36 +0000 (16:28 -0800)
Save a fair bit of space in the reloc program by omitting the console
output routine and printf code.  They were useful for debugging, though.

reloc/conio.c [deleted file]
reloc/conio.h [deleted file]
reloc/reloc_linux.c

diff --git a/reloc/conio.c b/reloc/conio.c
deleted file mode 100644 (file)
index dcff13b..0000000
+++ /dev/null
@@ -1,364 +0,0 @@
-/* ----------------------------------------------------------------------- *
- *
- *   Copyright 2001-2008 H. Peter Anvin - All Rights Reserved
- *
- *   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, Inc., 53 Temple Place Ste 330,
- *   Boston MA 02111-1307, USA; either version 2 of the License, or
- *   (at your option) any later version; incorporated herein by reference.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * conio.c
- *
- * Output to the screen
- */
-
-#include <stdint.h>
-#include "reloc.h"
-#include "conio.h"
-
-int putchar(int ch)
-{
-  com32sys_t regs;
-  memset(&regs, 0, sizeof regs);
-
-  if ( ch == '\n' ) {
-    /* \n -> \r\n */
-    putchar('\r');
-  }
-
-  regs.eax.w[0] = 0x0e00|(ch&0xff);
-  intcall(0x10, &regs, NULL);
-
-  return ch;
-}
-
-int puts(const char *s)
-{
-  int count = 0;
-
-  while ( *s ) {
-    putchar(*s);
-    count++;
-    s++;
-  }
-
-  return count;
-}
-
-/*
- * Oh, it's a waste of space, but oh-so-yummy for debugging.  It's just
- * initialization code anyway, so it doesn't take up space when we're
- * actually running.  This version of printf() does not include 64-bit
- * support.  "Live with it."
- *
- * Most of this code was shamelessly snarfed from the Linux kernel, then
- * modified.
- */
-
-static inline int
-isdigit(int ch)
-{
-  return (ch >= '0') && (ch <= '9');
-}
-
-static int skip_atoi(const char **s)
-{
-  int i=0;
-
-  while (isdigit(**s))
-    i = i*10 + *((*s)++) - '0';
-  return i;
-}
-
-unsigned int atou(const char *s)
-{
-  unsigned int i = 0;
-  while (isdigit(*s))
-    i = i*10 + (*s++ - '0');
-  return i;
-}
-
-static int strnlen(const char *s, int maxlen)
-{
-  const char *es = s;
-  while ( *es && maxlen ) {
-    es++; maxlen--;
-  }
-
-  return (es-s);
-}
-
-#define ZEROPAD        1               /* pad with zero */
-#define SIGN   2               /* unsigned/signed long */
-#define PLUS   4               /* show plus */
-#define SPACE  8               /* space if plus */
-#define LEFT   16              /* left justified */
-#define SPECIAL        32              /* 0x */
-#define LARGE  64              /* use 'ABCDEF' instead of 'abcdef' */
-
-#define do_div(n,base) ({ \
-int __res; \
-__res = ((unsigned long) n) % (unsigned) base; \
-n = ((unsigned long) n) / (unsigned) base; \
-__res; })
-
-static char * number(char * str, long num, int base, int size, int precision
-       ,int type)
-{
-  char c,sign,tmp[66];
-  const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
-  int i;
-
-  if (type & LARGE)
-    digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-  if (type & LEFT)
-    type &= ~ZEROPAD;
-  if (base < 2 || base > 36)
-    return 0;
-  c = (type & ZEROPAD) ? '0' : ' ';
-  sign = 0;
-  if (type & SIGN) {
-    if (num < 0) {
-      sign = '-';
-      num = -num;
-      size--;
-    } else if (type & PLUS) {
-      sign = '+';
-      size--;
-    } else if (type & SPACE) {
-      sign = ' ';
-      size--;
-    }
-  }
-  if (type & SPECIAL) {
-    if (base == 16)
-      size -= 2;
-    else if (base == 8)
-      size--;
-  }
-  i = 0;
-  if (num == 0)
-    tmp[i++]='0';
-  else while (num != 0)
-    tmp[i++] = digits[do_div(num,base)];
-  if (i > precision)
-    precision = i;
-  size -= precision;
-  if (!(type&(ZEROPAD+LEFT)))
-    while(size-->0)
-      *str++ = ' ';
-  if (sign)
-    *str++ = sign;
-  if (type & SPECIAL) {
-    if (base==8)
-      *str++ = '0';
-    else if (base==16) {
-      *str++ = '0';
-      *str++ = digits[33];
-    }
-  }
-  if (!(type & LEFT))
-    while (size-- > 0)
-      *str++ = c;
-  while (i < precision--)
-    *str++ = '0';
-  while (i-- > 0)
-    *str++ = tmp[i];
-  while (size-- > 0)
-    *str++ = ' ';
-  return str;
-}
-
-/* Forward decl. needed for IP address printing stuff... */
-int sprintf(char * buf, const char *fmt, ...);
-
-int vsprintf(char *buf, const char *fmt, va_list args)
-{
-  int len;
-  unsigned long num;
-  int i, base;
-  char * str;
-  const char *s;
-
-  int flags;           /* flags to number() */
-
-  int field_width;     /* width of output field */
-  int precision;               /* min. # of digits for integers; max
-                                  number of chars for from string */
-  int qualifier;               /* 'h', 'l', or 'L' for integer fields */
-
-  for (str=buf ; *fmt ; ++fmt) {
-    if (*fmt != '%') {
-      *str++ = *fmt;
-      continue;
-    }
-
-    /* process flags */
-    flags = 0;
-  repeat:
-    ++fmt;             /* this also skips first '%' */
-    switch (*fmt) {
-    case '-': flags |= LEFT; goto repeat;
-    case '+': flags |= PLUS; goto repeat;
-    case ' ': flags |= SPACE; goto repeat;
-    case '#': flags |= SPECIAL; goto repeat;
-    case '0': flags |= ZEROPAD; goto repeat;
-    }
-
-    /* get field width */
-    field_width = -1;
-    if (isdigit(*fmt))
-      field_width = skip_atoi(&fmt);
-    else if (*fmt == '*') {
-      ++fmt;
-      /* it's the next argument */
-      field_width = va_arg(args, int);
-      if (field_width < 0) {
-       field_width = -field_width;
-       flags |= LEFT;
-      }
-    }
-
-    /* get the precision */
-    precision = -1;
-    if (*fmt == '.') {
-      ++fmt;
-      if (isdigit(*fmt))
-       precision = skip_atoi(&fmt);
-      else if (*fmt == '*') {
-       ++fmt;
-       /* it's the next argument */
-       precision = va_arg(args, int);
-      }
-      if (precision < 0)
-       precision = 0;
-    }
-
-    /* get the conversion qualifier */
-    qualifier = -1;
-    if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') {
-      qualifier = *fmt;
-      ++fmt;
-    }
-
-    /* default base */
-    base = 10;
-
-    switch (*fmt) {
-    case 'c':
-      if (!(flags & LEFT))
-       while (--field_width > 0)
-         *str++ = ' ';
-      *str++ = (unsigned char) va_arg(args, int);
-      while (--field_width > 0)
-       *str++ = ' ';
-      continue;
-
-    case 's':
-      s = va_arg(args, char *);
-      len = strnlen(s, precision);
-
-      if (!(flags & LEFT))
-       while (len < field_width--)
-         *str++ = ' ';
-      for (i = 0; i < len; ++i)
-       *str++ = *s++;
-      while (len < field_width--)
-       *str++ = ' ';
-      continue;
-
-    case 'p':
-      if (field_width == -1) {
-       field_width = 2*sizeof(void *);
-       flags |= ZEROPAD;
-      }
-      str = number(str,
-                  (unsigned long) va_arg(args, void *), 16,
-                  field_width, precision, flags);
-      continue;
-
-
-    case 'n':
-      if (qualifier == 'l') {
-       long * ip = va_arg(args, long *);
-       *ip = (str - buf);
-      } else {
-       int * ip = va_arg(args, int *);
-       *ip = (str - buf);
-      }
-      continue;
-
-    case '%':
-      *str++ = '%';
-      continue;
-
-      /* integer number formats - set up the flags and "break" */
-    case 'o':
-      base = 8;
-      break;
-
-    case 'X':
-      flags |= LARGE;
-    case 'x':
-      base = 16;
-      break;
-
-    case 'd':
-    case 'i':
-      flags |= SIGN;
-    case 'u':
-      break;
-
-    default:
-      *str++ = '%';
-      if (*fmt)
-       *str++ = *fmt;
-      else
-       --fmt;
-      continue;
-    }
-    if (qualifier == 'l')
-      num = va_arg(args, unsigned long);
-    else if (qualifier == 'h') {
-      num = (unsigned short) va_arg(args, int);
-      if (flags & SIGN)
-       num = (short) num;
-    } else if (flags & SIGN)
-      num = va_arg(args, int);
-    else
-      num = va_arg(args, unsigned int);
-    str = number(str, num, base, field_width, precision, flags);
-  }
-  *str = '\0';
-  return str-buf;
-}
-
-int sprintf(char * buf, const char *fmt, ...)
-{
-  va_list args;
-  int i;
-
-  va_start(args, fmt);
-  i=vsprintf(buf,fmt,args);
-  va_end(args);
-  return i;
-}
-
-int printf(const char *fmt, ...)
-{
-  char printf_buf[1024];
-  va_list args;
-  int printed;
-
-  va_start(args, fmt);
-  printed = vsprintf(printf_buf, fmt, args);
-  va_end(args);
-
-  puts(printf_buf);
-
-  return printed;
-}
diff --git a/reloc/conio.h b/reloc/conio.h
deleted file mode 100644 (file)
index aab7a52..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* ----------------------------------------------------------------------- *
- *
- *   Copyright 2001 H. Peter Anvin - All Rights Reserved
- *
- *   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, Inc., 53 Temple Place Ste 330,
- *   Boston MA 02111-1307, USA; either version 2 of the License, or
- *   (at your option) any later version; incorporated herein by reference.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * conio.h
- *
- * Limited console I/O
- */
-
-#ifndef CONIO_H
-#define CONIO_H
-
-#include <stdint.h>
-#include <stddef.h>
-#include <stdarg.h>
-
-int putchar(int);
-int puts(const char *);
-int printf(const char *, ...);
-unsigned int atou(const char *);
-
-#endif
index 79655c1..1bf6f44 100644 (file)
@@ -37,7 +37,6 @@
 
 #include "reloc.h"
 #include "setup.h"
-#include "conio.h"
 
 static uint32_t initrd_len, initrd_addr;
 static uint64_t max_addr;
@@ -46,8 +45,6 @@ static int initrd_fit(uint32_t base, uint32_t end)
 {
        uint64_t ibase;
 
-       printf("Fit: base = %08x, end = %08x\n", base, end);
-
        if (end <= base)
                return -1;      /* Invalid */
 
@@ -66,7 +63,6 @@ static int initrd_fit(uint32_t base, uint32_t end)
 
        if (initrd_addr < ibase) {
                initrd_addr = ibase; /* This is a better one... */
-               printf("Best: initrd_addr = %08x\n", initrd_addr);
        }
 
        return 0;
@@ -178,9 +174,6 @@ int main(void)
                        return -1;
 
                /* Move the initrd into place */
-               printf("Moving initrd: 0x%08x -> 0x%08x (0x%08x bytes)\n",
-                      startup_info.rd_addr, initrd_addr, startup_info.rd_len);
-
                memmove((void *)initrd_addr, (void *)startup_info.rd_addr,
                        startup_info.rd_len);