From patchwork Fri Dec 8 02:28:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 845957 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ytGWT2WCnz9rxm for ; Fri, 8 Dec 2017 13:29:09 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3ytGWS5HkxzDsTj for ; Fri, 8 Dec 2017 13:29:08 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Received: from ozlabs.org (ozlabs.org [IPv6:2401:3900:2:1::2]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3ytGWK6mGkzDsPp for ; Fri, 8 Dec 2017 13:29:01 +1100 (AEDT) Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPSA id 3ytGWK3jqsz9rxm; Fri, 8 Dec 2017 13:29:01 +1100 (AEDT) From: Alistair Popple To: skiboot@lists.ozlabs.org, stewart@linux.vnet.ibm.com Date: Fri, 8 Dec 2017 13:28:46 +1100 Message-Id: <20171208022846.28067-1-alistair@popple.id.au> X-Mailer: git-send-email 2.11.0 Subject: [Skiboot] [PATCH] core/console.c: Make skiboot fun again X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.24 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Alistair Popple MIME-Version: 1.0 Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" ,_ _, |\\.-"""-.//| \` `/ / _ _ \ | 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 --- 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 #include #include +#include #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();