[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