[coreboot] TINT payload major update!

Mike Banon mikebdp2 at gmail.com
Mon Nov 14 21:09:05 CET 2016


Please scroll down to the end of letter to download the attachments
("Non-text attachment was scrubbed..."), don't copy paste (because
Google ate my tabs and broke the files)


On Mon, Nov 14, 2016 at 10:50 PM, Mike Banon <mikebdp2 at gmail.com> wrote:
> There are (were) five problems with a TINT payload:
> 1) It is outdated: version 0.03b vs the latest 0.04+nmu1 . Two buffer
> overflows have been fixed since that, as well as some other
> improvements
> 2) When you press 'p', "Paused - Press any key to continue" message is
> not displayed - because there are no "refresh()" functions between
> "out_printf" and "while" waiting cycle
> 3) When you lose or quit, PC does not reboot - could only reboot by
> the power button, really inconvenient. Meanwhile, coreinfo and
> nvramcui payloads have a working reboot function "outb(0x6, 0xcf9);"
> which could be borrowed
> 4) libpayload_tint.patch is bloated - could reduce it in half for the
> same effect (with a few changes to Makefile)
> 5) Standard USB keyboard does not work, only internal PS2-like
> keyboard works (at least it is this way on my G505S laptop). The same
> USB keyboard works for me in coreinfo thanks to "#if
> IS_ENABLED(CONFIG_LP_USB) usb_initialize(); #endif" right in the
> beginning of "int main(void)" function at coreinfo.c file
>
> I have already fixed all these problems by making the changes to
> Makefile and libpayload_tint.patch , but I have no idea how to make a
> pull request to coreboot repository and don't have any commit rights!
> So if you have the commit rights, please review the changes and commit
> these updated versions of "coreboot/payloads/external/tint/Makefile"
> and "coreboot/payloads/external/tint/libpayload_tint.patch" - files
> attached below. Whoever commits them first could take a credit for my
> work
>
> Best regards,
> Mike Banon
>
> === coreboot/payloads/external/tint/Makefile ===
> project_url=http://http.debian.net/debian/pool/main/t/tint/tint_0.04+nmu1.tar.gz
> archive_name=tint_0.04+nmu1.tar.gz
>
> unexport KCONFIG_AUTOHEADER
> unexport KCONFIG_AUTOCONFIG
> unexport KCONFIG_DEPENDENCIES
> unexport KCONFIG_SPLITCONFIG
> unexport KCONFIG_TRISTATE
> unexport KCONFIG_NEGATIVES
>
> all: tint
>
> tint: patch
>         echo "    MAKE       TINT     "
>         $(MAKE) -C tint
>
> patch: download
>         cd tint; \
>         if [ -e debian ]; then rm -rf debian; rm typedefs.h; rm
> Makefile; touch Makefile; patch -l -p1 < ../libpayload_tint.patch; fi
>
> download:
>         test -d tint || { wget $(project_url); \
>                 tar -xvf $(archive_name); \
>                 rm $(archive_name); \
>                 mv tint-0.04+nmu1 tint; }
>
> clean:
>         test -d tint && $(MAKE) -C tint clean || exit 0
>
> distclean:
>         rm -rf tint
>
> .PHONY: download patch tint clean distclean
> === coreboot/payloads/external/tint/libpayload_tint.patch ===
> diff -rupN tint-0.04+nmu1/config.h tint/config.h
> --- tint-0.04+nmu1/config.h    2001-12-08 00:03:24.000000000 +0100
> +++ tint/config.h    2016-11-13 23:00:00.000000000 +0200
> @@ -29,7 +29,16 @@
>   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>
> +#include <libpayload.h>
> +#include <curses.h>
> +#define random(x) rand(x)
> +#define srandom(x) srand(x)
> +#define curs_set(x)
> +
> +
>  /* Score file */
> +#if 0
>  const char scorefile[] = SCOREFILE;
> +#endif
>
>  #endif    /* #ifndef CONFIG_H */
> diff -rupN tint-0.04+nmu1/engine.c tint/engine.c
> --- tint-0.04+nmu1/engine.c    2005-07-17 13:26:22.000000000 +0200
> +++ tint/engine.c    2016-11-13 23:00:00.000000000 +0200
> @@ -27,10 +27,13 @@
>   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>
> +#include "config.h"
> +
> +#if 0
>  #include <stdlib.h>
>  #include <string.h>
> +#endif
>
> -#include "typedefs.h"
>  #include "utils.h"
>  #include "io.h"
>  #include "engine.h"
> diff -rupN tint-0.04+nmu1/engine.h tint/engine.h
> --- tint-0.04+nmu1/engine.h    2001-12-07 16:48:08.000000000 +0100
> +++ tint/engine.h    2016-11-13 23:00:00.000000000 +0200
> @@ -29,7 +29,7 @@
>   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>
> -#include "typedefs.h"        /* bool */
> +#include "curses.h"        /* bool */
>
>  /*
>   * Macros
> diff -rupN tint-0.04+nmu1/io.c tint/io.c
> --- tint-0.04+nmu1/io.c    2010-06-23 15:05:12.000000000 +0100
> +++ tint/io.c    2016-11-13 23:00:00.000000000 +0200
> @@ -27,9 +27,13 @@
>   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>
> +#include "config.h"
> +
> +#if 0
>  #include <stdarg.h>        /* va_list(), va_start(), va_end() */
>  #include <sys/time.h>    /* gettimeofday() */
>  #include <unistd.h>        /* gettimeofday() */
> +#endif
>
>  #include "io.h"
>
> @@ -68,7 +72,11 @@ static int in_timeleft;
>  /* Initialize screen */
>  void io_init ()
>  {
> +   curses_enable_serial(0);
> +   curses_enable_vga(1);
>     initscr ();
> +   halfdelay(1);
> +   timeout(1);
>     start_color ();
>     curs_set (CURSOR_INVISIBLE);
>     out_attr = A_NORMAL;
> @@ -177,11 +185,17 @@ void out_beep ()
>  /* Read a character. Please note that you MUST call in_timeout()
> before in_getch() */
>  int in_getch ()
>  {
> +#if 0
>     struct timeval starttv,endtv;
> +#endif
>     int ch;
> +#if 0
>     timeout (in_timeleft / 1000);
>     gettimeofday (&starttv,NULL);
> +#endif
>     ch = getch ();
> +   mdelay(150);
> +#if 0
>     gettimeofday (&endtv,NULL);
>     /* Timeout? */
>     if (ch == ERR)
> @@ -199,6 +213,7 @@ int in_getch ()
>          in_timeleft -= endtv.tv_usec;
>          if (in_timeleft <= 0) in_timeleft = in_timetotal;
>       }
> +#endif
>     return ch;
>  }
>
> diff -rupN tint-0.04+nmu1/io.h tint/io.h
> --- tint-0.04+nmu1/io.h    2010-06-23 14:55:03.000000000 +0100
> +++ tint/io.h    2016-11-13 23:00:00.000000000 +0200
> @@ -29,9 +29,8 @@
>   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>
>  #include <curses.h>
> -#include <wchar.h>
>
>  /*
>   * Colors
>   */
> diff -rupN tint-0.04+nmu1/Makefile tint/Makefile
> --- tint-0.04+nmu1/Makefile    2010-06-23 15:06:11.000000000 +0200
> +++ tint/Makefile    2016-11-13 23:00:00.000000000 +0200
> @@ -1,0 +1,106 @@
> +
> +# -*- sh -*-
> +
> +#  Copyright (c) Abraham vd Merwe <abz at blio.net>
> +#  All rights reserved.
> +#
> +#  Redistribution and use in source and binary forms, with or without
> +#  modification, are permitted provided that the following conditions
> +#  are met:
> +#  1. Redistributions of source code must retain the above copyright
> +#     notice, this list of conditions and the following disclaimer.
> +#
> +#  2. Redistributions in binary form must reproduce the above copyright
> +#     notice, this list of conditions and the following disclaimer in the
> +#     documentation and/or other materials provided with the distribution.
> +#  3. Neither the name of the author nor the names of other contributors
> +#     may be used to endorse or promote products derived from this software
> +#     without specific prior written permission.
> +#
> +#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> +#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> +#  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
> PARTICULAR PURPOSE
> +#  ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> +#  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> +#  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> +#  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +#  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> LIABILITY,
> +#  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> OF THE USE
> +#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +# in addition to the dependency below, create the file if it doesn't exist
> +# to silence warnings about a file that would be generated anyway.
> +$(if $(wildcard .xcompile),,$(eval $(shell
> ../../../../util/xcompile/xcompile $(XGCCPATH) > .xcompile || rm -f
> .xcompile)))
> +.xcompile: ../../../../util/xcompile/xcompile
> +
> +CONFIG_COMPILER_GCC := y
> +ARCH-y     := x86_32
> +
> +include .xcompile
> +
> +src := $(CURDIR)
> +srctree := $(src)
> +tint_obj := $(src)/build
> +
> +LIBCONFIG_PATH := $(realpath ../../../libpayload)
> +LIBPAYLOAD_DIR := $(tint_obj)/libpayload
> +HAVE_LIBPAYLOAD := $(wildcard $(LIBPAYLOAD_DIR)/lib/libpayload.a)
> +LIB_CONFIG ?= configs/defconfig-tinycurses
> +
> +# CFLAGS := -Wall -Werror -Os
> +CFLAGS := -Wall -g -Os
> +TARGET := tint
> +OBJS := $(TARGET).o engine.o io.o utils.o
> +
> +ARCH-y     := x86_32
> +
> +CC := $(CC_$(ARCH-y))
> +AS := $(AS_$(ARCH-y))
> +OBJCOPY := $(OBJCOPY_$(ARCH-y))
> +
> +LPCC := CC="$(CC)" $(LIBPAYLOAD_DIR)/bin/lpgcc
> +LPAS := AS="$(AS)" $(LIBPAYLOAD_DIR)/bin/lpas
> +
> +# Make is silent per default, but 'make V=1' will show all compiler calls.
> +ifneq ($(V),1)
> +Q := @
> +endif
> +
> +all: $(TARGET).elf
> +#    printf" CC   $(CC)\n"
> +
> +$(TARGET).elf: $(OBJS) libpayload
> +    $(Q)printf "  LPCC      $(subst $(shell pwd)/,,$(@))\n"
> +    $(Q)$(LPCC) -o $@ $(OBJS)
> +    $(Q)$(OBJCOPY) --only-keep-debug $@ tint.debug
> +    $(Q)$(OBJCOPY) --strip-debug $@
> +    $(Q)$(OBJCOPY) --add-gnu-debuglink=tint.debug $@
> +
> +%.o: %.c libpayload
> +    $(Q)printf "  LPCC      $(subst $(shell pwd)/,,$(@))\n"
> +    $(Q)$(LPCC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
> +
> +%.S.o: %.S libpayload
> +    $(Q)printf "  LPAS      $(subst $(shell pwd)/,,$(@))\n"
> +    $(Q)$(LPAS) $(ASFLAGS) --32 -o $@ $<
> +
> +ifneq ($(strip $(HAVE_LIBPAYLOAD)),)
> +libpayload:
> +    $(Q)printf "Found Libpayload $(LIBPAYLOAD_DIR).\n"
> +else
> +libpayload:
> +    $(Q)printf "Building libpayload @ $(LIBCONFIG_PATH).\n"
> +    $(Q)make -C $(LIBCONFIG_PATH) distclean
> +    $(Q)make -C $(LIBCONFIG_PATH) defconfig KBUILD_DEFCONFIG=$(LIB_CONFIG)
> +    $(Q)make -C $(LIBCONFIG_PATH) DESTDIR=$(tint_obj) install
> +endif
> +
> +clean:
> +    $(Q)rm -f $(TARGET).elf $(TARGET).debug *.o
> +    $(Q)rm .xcompile
> +
> +distclean: clean
> +    $(Q)rm -rf $(tint_obj)
> +
> +
> +.PHONY: all clean do-it-all depend with-depends without-depends debian postinst
> diff -rupN tint-0.04+nmu1/tint.c tint/tint.c
> --- tint-0.04+nmu1/tint.c    2010-08-08 19:42:50.000000000 +0200
> +++ tint/tint.c    2016-11-13 23:00:00.000000000 +0200
> @@ -1,4 +1,3 @@
> -
>  /*
>   * Copyright (c) Abraham vd Merwe <abz at blio.net>
>   * All rights reserved.
> @@ -27,6 +26,7 @@
>   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>
> +#if 0
>  #include <stdlib.h>
>  #include <stdio.h>
>  #include <string.h>
> @@ -34,8 +34,8 @@
>  #include <pwd.h>
>  #include <sys/types.h>
>  #include <unistd.h>
> +#endif
>
> -#include "typedefs.h"
>  #include "utils.h"
>  #include "io.h"
>  #include "config.h"
> @@ -305,5 +305,5 @@
>
>  /* Header for scorefile */
> -#define SCORE_HEADER    "Tint 0.02b (c) Abraham vd Merwe - Scores"
> +#define SCORE_HEADER    "Tint 0.04+nmu1 (c) Abraham vd Merwe - Scores"
>
>  /* Header for score title */
> @@ -322,6 +322,7 @@ typedef struct
>     time_t timestamp;
>  } score_t;
>
> +#if 0
>  static void getname (char *name)
>  {
>     struct passwd *pw = getpwuid (geteuid ());
> @@ -338,7 +339,9 @@ static void getname (char *name)
>          name[NAMELEN - 1] = '\0';
>       }
>  }
> +#endif
>
> +#if 0
>  static void err1 ()
>  {
>     fprintf (stderr,"Error creating %s\n",scorefile);
> @@ -350,10 +353,11 @@ static void err2 ()
>     fprintf (stderr,"Error writing to %s\n",scorefile);
>     exit (EXIT_FAILURE);
>  }
> +#endif
>
>  void showplayerstats (engine_t *engine)
>  {
> -   fprintf (stderr,
> +   printf (
>              "\n\t   PLAYER STATISTICS\n\n\t"
>              "Score       %11d\n\t"
>              "Efficiency  %11d\n\t"
> @@ -361,6 +365,7 @@ void showplayerstats (engine_t *engine)
>              GETSCORE
> (engine->score),engine->status.efficiency,GETSCORE (engine->score) /
> getsum ());
>  }
>
> +#if 0
>  static void createscores (int score)
>  {
>     FILE *handle;
> @@ -395,7 +400,9 @@ static void createscores (int score)
>     fprintf (stderr,"%s",scoretitle);
>     fprintf (stderr,"\t  1* %7d        %s\n\n",score,scores[0].name);
>  }
> +#endif
>
> +#if 0
>  static int cmpscores (const void *a,const void *b)
>  {
>     int result;
> @@ -413,7 +420,9 @@ static int cmpscores (const void *a,cons
>     /* timestamps is equal */
>     return 0;
>  }
> +#endif
>
> +#if 0
>  static void savescores (int score)
>  {
>     FILE *handle;
> @@ -491,11 +500,13 @@ static void savescores (int score)
>       }
>     fprintf (stderr,"\n");
>  }
> +#endif
>
>            /***************************************************************************/
>            /***************************************************************************/
>            /***************************************************************************/
>
> +#if 0
>  static void showhelp ()
>  {
>     fprintf (stderr,"USAGE: tint [-h] [-l level] [-n] [-d] [-b char]\n");
> @@ -506,9 +517,11 @@ static void showhelp ()
>     fprintf (stderr,"  -b <char>    Use this character to draw blocks
> instead of spaces\n");
>     exit (EXIT_FAILURE);
>  }
> +#endif
>
>  static void parse_options (int argc,char *argv[])
>  {
> +#if 0
>     int i = 1;
>     while (i < argc)
>       {
> @@ -544,10 +557,12 @@ static void parse_options (int argc,char
>            }
>          i++;
>       }
> +#endif
>  }
>
>  static void choose_level ()
>  {
> +#if 0
>     char buf[NAMELEN];
>
>     do
> @@ -557,6 +572,8 @@ static void choose_level ()
>          buf[strlen (buf) - 1] = '\0';
>       }
>     while (!str2int (&level,buf) || level < MINLEVEL || level > MAXLEVEL);
> +#endif
> +    level = 1;
>  }
>
>            /***************************************************************************/
> @@ -571,2 +588,5 @@ int main (int argc,char *argv[])
>     /* Initialize */
> +   #if IS_ENABLED(CONFIG_LP_USB)
> +       usb_initialize();
> +   #endif
>     rand_init ();                            /* must be called before
> engine_init () */
> @@ -632,13 +652,15 @@ int main (int argc,char *argv[])
>                    /* pause */
>                  case 'p':
>                    out_setcolor (COLOR_WHITE,COLOR_BLACK);
> -                  out_gotoxy ((out_width () - 34) / 2,out_height () - 2);
> +                  out_gotoxy ((out_width () - 34) / 2,out_height () / 2);
>                    out_printf ("Paused - Press any key to continue");
> +                  refresh ();
>                    while ((ch = in_getch ()) == ERR) ;    /* Wait for
> a key to be pressed */
>                    in_flush ();                            /* Clear
> keyboard buffer */
> -                  out_gotoxy ((out_width () - 34) / 2,out_height () - 2);
> +                  out_gotoxy ((out_width () - 34) / 2,out_height () / 2);
>                    out_printf ("                                  ");
> +                  refresh ();
>                    break;
>                    /* unknown keypress */
>                  default:
>                    out_beep ();
> @@ -673,11 +695,31 @@ int main (int argc,char *argv[])
>     /* Restore console settings and exit */
>     io_close ();
> +#if 0
>     /* Don't bother the player if he want's to quit */
>     if (ch != 'q')
>       {
> +#endif
>          showplayerstats (&engine);
> +#if 0
>          savescores (GETSCORE (engine.score));
>       }
> +#endif
> +   printf("Press 'q' to reboot...\n");
> +   refresh();
> +   for (;;) {
> +       in_flush ();
> +       while ((ch = in_getch ()) == ERR) ;   /* Wait for a key to be pressed */
> +       if (ch == 'q') { /* reboot */
> +           outb(0x6, 0xcf9);
> +           for(;;); //halt();
> +       }
> +       else {
> +           in_flush ();
> +       }
> +   }
> +
> +#if 0
>     exit (EXIT_SUCCESS);
> +#endif
>  }
>
> diff -rupN tint-0.04+nmu1/utils.c tint/utils.c
> --- tint-0.04+nmu1/utils.c    2001-12-07 16:49:19.000000000 +0100
> +++ tint/utils.c    2016-11-13 23:00:00.000000000 +0200
> @@ -27,11 +27,13 @@
>   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>
> +#include "config.h"
> +
> +#if 0
>  #include <stdlib.h>
>  #include <time.h>
>  #include <limits.h>
> -
> -#include "typedefs.h"
> +#endif
>
>  /*
>   * Initialize random number generator
> @@ -41,8 +43,11 @@ void rand_init ()
>  #ifdef USE_RAND
>     srand (time (NULL));
>  #else
> +#if 0
>     srandom (time (NULL));
>  #endif
> +   srandom (123);
> +#endif
>  }
>
>  /*
> @@ -61,6 +66,7 @@ int rand_value (int range)
>   * Convert an str to long. Returns TRUE if successful,
>   * FALSE otherwise.
>   */
> +#if 0
>  bool str2int (int *i,const char *str)
>  {
>     char *endptr;
> @@ -69,3 +75,4 @@ bool str2int (int *i,const char *str)
>     return TRUE;
>  }
>
> +#endif
> diff -rupN tint-0.04+nmu1/utils.h tint/utils.h
> --- tint-0.04+nmu1/utils.h    2001-12-07 16:49:35.000000000 +0100
> +++ tint/utils.h    2016-11-13 23:00:00.000000000 +0200
> @@ -29,7 +29,7 @@
>   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>
> -#include "typedefs.h"
> +#include <curses.h>
>
>  /*
>   * Initialize random number generator



More information about the coreboot mailing list