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@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@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