[coreboot] TINT payload major update!

Mike Banon mikebdp2 at gmail.com
Mon Nov 14 20:50:24 CET 2016


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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Makefile
Type: application/octet-stream
Size: 777 bytes
Desc: not available
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20161114/4135a820/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: libpayload_tint.patch
Type: text/x-patch
Size: 13040 bytes
Desc: not available
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20161114/4135a820/attachment.patch>


More information about the coreboot mailing list