[Skiboot] [PATCH] core/console.c: Make skiboot fun again

Alistair Popple alistair at popple.id.au
Fri Dec 8 13:28:46 AEDT 2017


         ,_         _,
         |\\.-"""-.//|
         \`         `/
        /    _   _    \
        |    a _ a    |
        '.=    Y    =.'
          >._  ^  _.<
         /   `````   \
         )           (
        ,(           ),
       / )   /   \   ( \
       ) (   )   (   ) (
       ( )   (   )   ( )
       )_(   )   (   )_(-.._
      (  )_  (._.)  _(  )_, `\
       ``(   )   (   )`` .' .'
    jgs   ```     ```   ( (`
                         '-'

Skiboot output is pretty dull to look at. Sometimes surprises are nice.
Especially when they are comforting cats. Even more so when they are
rainbow coloured cats. Lol.

Signed-off-by: Alistair Popple <alistair at popple.id.au>
---
 core/console.c            | 62 +++++++++++++++++++++++++++++++++++++++++++++++
 core/init.c               |  4 +++
 include/skiboot.h         |  3 +++
 platforms/astbmc/common.c |  5 ++++
 4 files changed, 74 insertions(+)

diff --git a/core/console.c b/core/console.c
index b9129c9f..9c344e9e 100644
--- a/core/console.c
+++ b/core/console.c
@@ -235,6 +235,39 @@ static void write_char(char c)
 	inmem_write(c);
 }
 
+int sine_table[] = {
+	0x80,0x83,0x86,0x8a,0x8d,0x90,0x93,0x97,
+	0x9a,0x9d,0xa0,0xa4,0xa7,0xaa,0xad,0xb0,
+	0xb3,0xb6,0xb9,0xbc,0xbf,0xc2,0xc5,0xc8,
+	0xca,0xcd,0xd0,0xd2,0xd5,0xd7,0xda,0xdc,
+	0xde,0xe0,0xe3,0xe5,0xe7,0xe9,0xea,0xec,
+	0xee,0xf0,0xf1,0xf3,0xf4,0xf5,0xf7,0xf8,
+	0xf9,0xfa,0xfb,0xfb,0xfc,0xfd,0xfd,0xfe,
+	0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+	0xfe,0xfe,0xfd,0xfd,0xfc,0xfb,0xfb,0xfa,
+	0xf9,0xf8,0xf7,0xf5,0xf4,0xf3,0xf1,0xf0,
+	0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe0,
+	0xde,0xdc,0xda,0xd7,0xd5,0xd2,0xd0,0xcd,
+	0xca,0xc8,0xc5,0xc2,0xbf,0xbc,0xb9,0xb6,
+	0xb3,0xb0,0xad,0xaa,0xa7,0xa4,0xa0,0x9d,
+	0x9a,0x97,0x93,0x90,0x8d,0x8a,0x86,0x83,
+	0x80,0x7c,0x79,0x75,0x72,0x6f,0x6c,0x68,
+	0x65,0x62,0x5f,0x5b,0x58,0x55,0x52,0x4f,
+	0x4c,0x49,0x46,0x43,0x40,0x3d,0x3a,0x37,
+	0x35,0x32,0x2f,0x2d,0x2a,0x28,0x25,0x23,
+	0x21,0x1f,0x1c,0x1a,0x18,0x16,0x15,0x13,
+	0x11,0xf,0xe,0xc,0xb,0xa,0x8,0x7,
+	0x6,0x5,0x4,0x4,0x3,0x2,0x2,0x1,
+	0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
+	0x1,0x1,0x2,0x2,0x3,0x4,0x4,0x5,
+	0x6,0x7,0x8,0xa,0xb,0xc,0xe,0xf,
+	0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1f,
+	0x21,0x23,0x25,0x28,0x2a,0x2d,0x2f,0x32,
+	0x35,0x37,0x3a,0x3d,0x40,0x43,0x46,0x49,
+	0x4c,0x4f,0x52,0x55,0x58,0x5b,0x5f,0x62,
+	0x65,0x68,0x6c,0x6f,0x72,0x75,0x79,0x7c };
+
+int lolcat = 0;
 ssize_t console_write(bool flush_to_drivers, const void *buf, size_t count)
 {
 	/* We use recursive locking here as we can get called
@@ -242,12 +275,41 @@ ssize_t console_write(bool flush_to_drivers, const void *buf, size_t count)
 	 */
 	bool need_unlock = lock_recursive(&con_lock);
 	const char *cbuf = buf;
+	char colour[30];
+	const char *colour_end = "\x1b[0m";
+	const char *cc;
+	int red, green, blue;
+	static int char_count = 0;
 
 	while(count--) {
 		char c = *(cbuf++);
 		if (c == '\n')
 			write_char('\r');
+
+		if (lolcat) {
+			red = sine_table[char_count];
+			green = sine_table[(char_count + ARRAY_SIZE(sine_table)/3) % ARRAY_SIZE(sine_table)];
+			blue = sine_table[(char_count + (2*ARRAY_SIZE(sine_table))/3) % ARRAY_SIZE(sine_table)];
+
+			snprintf(colour, ARRAY_SIZE(colour), "\x1b[38;2;%03d;%03d;%03dm", red, green, blue);
+			cc = colour;
+			while (*cc) {
+				write_char(*cc);
+				cc++;
+			}
+		}
+
 		write_char(c);
+
+		if (lolcat) {
+			cc = colour_end;
+			while (*cc) {
+				write_char(*cc);
+				cc++;
+				char_count++;
+				char_count %= ARRAY_SIZE(sine_table);
+			}
+		}
 	}
 
 	__flush_console(flush_to_drivers);
diff --git a/core/init.c b/core/init.c
index 2eeba759..17c31118 100644
--- a/core/init.c
+++ b/core/init.c
@@ -1002,6 +1002,10 @@ void __noreturn __nomcount main_cpu_entry(const void *fdt)
 	/* Read in NVRAM and set it up */
 	nvram_init();
 
+	/* Feeling colourful? */
+	if (!lolcat)
+		lolcat = !!nvram_query("lolcat");
+
 	/* preload the IMC catalog dtb */
 	imc_catalog_preload();
 
diff --git a/include/skiboot.h b/include/skiboot.h
index db913258..11914a67 100644
--- a/include/skiboot.h
+++ b/include/skiboot.h
@@ -52,6 +52,9 @@ extern struct mem_region *mem_region_next(struct mem_region *region);
 /* Readonly section start and end. */
 extern char __rodata_start[], __rodata_end[];
 
+/* Enable lolcat mode */
+extern int lolcat;
+
 static inline bool is_rodata(const void *p)
 {
 	return ((const char *)p >= __rodata_start && (const char *)p < __rodata_end);
diff --git a/platforms/astbmc/common.c b/platforms/astbmc/common.c
index 243ad946..9d6583b0 100644
--- a/platforms/astbmc/common.c
+++ b/platforms/astbmc/common.c
@@ -26,6 +26,7 @@
 #include <bt.h>
 #include <errorlog.h>
 #include <lpc.h>
+#include <rtc.h>
 
 #include "astbmc.h"
 
@@ -120,6 +121,8 @@ static int astbmc_fru_init(void)
 
 void astbmc_init(void)
 {
+	struct tm tm;
+
 	/* Initialize PNOR/NVRAM */
 	pnor_init();
 
@@ -131,6 +134,8 @@ void astbmc_init(void)
 	ipmi_wdt_init();
 	ipmi_rtc_init();
 	ipmi_opal_init();
+	while (rtc_cache_get(&tm)) opal_run_pollers();
+	lolcat = tm.tm_mon == 11 && tm.tm_mday == 7 && tm.tm_hour == 17 && tm.tm_min == 58;
 	astbmc_fru_init();
 	ipmi_sensor_init();
 
-- 
2.11.0



More information about the Skiboot mailing list