[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