Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752564AbdCPOHR (ORCPT ); Thu, 16 Mar 2017 10:07:17 -0400 Received: from mail-lf0-f41.google.com ([209.85.215.41]:36662 "EHLO mail-lf0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752495AbdCPOHP (ORCPT ); Thu, 16 Mar 2017 10:07:15 -0400 From: Aleksey Makarov Subject: Does braille console work? To: linux-serial@vger.kernel.org Cc: Petr Mladek , Steven Rostedt , Joe Perches , Samuel Thibault , linux-kernel@vger.kernel.org Message-ID: <1bb67bee-b8f9-2835-725a-f36fda085216@linaro.org> Date: Thu, 16 Mar 2017 17:02:53 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6115 Lines: 151 Hi, I am looking at the braille console code and don't understand how its initialization works. This is from kernel/printk/braille.c: char *_braille_console_setup(char **str, char **brl_options) { if (!strncmp(*str, "brl,", 4)) { *brl_options = ""; *str += 4; (3) } else if (!strncmp(*str, "brl=", 4)) { *brl_options = *str + 4; *str = strchr(*brl_options, ','); if (!*str) pr_err("need port name after brl=\n"); (2) else *((*str)++) = 0; (3) } else return NULL; (1) return *str; } There can be 3 outcomes from this function: 1) it returns NULL and does not set brl_options 2) it returns NULL and set the variable pointed by str to NULL 3) it returns non-NULL And this is how it is called in a __setup() function from kernel/printk/printk.c: static int __init console_setup(char *str) { char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for "ttyS" */ char *s, *options, *brl_options = NULL; int idx; if (_braille_console_setup(&str, &brl_options)) return 1; /* * Decode str into name, index, options. */ if (str[0] >= '0' && str[0] <= '9') { strcpy(buf, "ttyS"); strncpy(buf + 4, str, sizeof(buf) - 5); } else { strncpy(buf, str, sizeof(buf) - 1); } [... Parse other console options here ...] __add_preferred_console(buf, idx, options, brl_options); console_set_on_cmdline = 1; return 1; } __setup("console=", console_setup); To register a braille console (i. e. to call __add_preferred_console() with non-NULL brl_options) function _braille_console_setup() should return NULL and initialize brl_options. 1) in this case brl_options is NULL and non-braille console is registered 2) kernel produces oops later in console_setup(). I reproduced it passing "console=brl=aaa" parameter to kernel, see below. 3) no console is registered So braille console registration should not work. What do I miss? The code was changed in July/August 2013 in commits commit bbeddf52adc1 ("printk: move braille console support into separate braille.[ch] files") commit 2cfe6c4ac7ee ("printk: Fix return of braille_register_console()") So it looks like braille console has not been used for more than 3 years. Should we remote it? ------------------------------------------------------------ Kernel command line: systemd.show_status=no rootwait rw root=/dev/sda7 acpi=force earlycon console=brl=aaa braille: need port name after brl= Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = fffffc00089b0000 [00000000] *pgd=0000001ffffe0003, *pud=0000001ffffe0003, *pmd=0000001ffffe0003, *pte=0000000000000000 Internal error: Oops: 96000006 [#1] PREEMPT SMP Modules linked in: CPU: 0 PID: 0 Comm: swapper Not tainted 4.11.0-rc2-07-00033-g417d6c6d1a16-dirty #727 Hardware name: Cavium ThunderX CN88XX board (DT) task: fffffc0008868000 task.stack: fffffc0008840000 PC is at console_setup+0x28/0x108 LR is at console_setup+0x20/0x108 pc : [] lr : [] pstate: 800000c5 sp : fffffc0008843e70 x29: fffffc0008843e70 x28: 0000000000000000 x27: fffffc00087a7b18 x26: 0000000000000001 x25: fffffc000880ccb9 x24: 0000000000000008 x23: fffffc0008812b40 x22: 0000000000000000 x21: fffffe1ffffafece x20: fffffe1ffffafec6 x19: 0000000000000000 x18: 0000000000000001 x17: 0000000000000000 x16: 0000000000000018 x15: 0000000000020000 x14: 00000000fffffff0 x13: fffffc0008873158 x12: fffffc00088fc82a x11: 0000000000000000 x10: 000000000000002d x9 : 0000000000000023 x8 : 7262207265746661 x7 : 20656d616e207472 x6 : 000000000000002e x5 : 0000000000000400 x4 : 0000000000000000 x3 : 0000000000000002 x2 : 0000000000000002 x1 : 0000000000000001 x0 : 0000000000000000 Process swapper (pid: 0, stack limit = 0xfffffc0008840000) Stack: (0xfffffc0008843e70 to 0xfffffc0008844000) 3e60: fffffc0008843ec0 fffffc00087c0600 3e80: fffffc0008812330 fffffe1ffffafec6 fffffc0008812060 0000000000000000 3ea0: fffffe1ffffafed2 fffffc00087c0598 fffffc0008811f40 fffffe1ffffafec6 3ec0: fffffc0008843f10 fffffc00080c816c fffffc0008623558 fffffe1ffffafec6 3ee0: fffffc00087a7b18 fffffe1ffffafece 0000000000000080 fffffc0008707130 3f00: 00000000000000bc fffffe1ffffafed5 fffffc0008843fa0 fffffc00087c094c 3f20: fffffc00087f3948 fffffc00088d0000 fffffc0008863000 fffffc00088d0000 3f40: fffffe1ffffafe80 fffffc00087f3948 0000000000000174 0000001fffaf51a0 3f60: 0000001fffa38d00 0000000001bc0018 fffffc000886e6f0 fffffc000870e560 3f80: ffffffffffffffff fffffc00087c0558 0000000000000000 fffffc00087a5db8 3fa0: fffffc0008843ff0 fffffc00087c01e8 0000001ffa3d0a18 0000000021200000 3fc0: 0000000021200000 000000074fb10f48 0000000000000000 0000000000000000 3fe0: 0000000000000000 fffffc00087f3948 0000000000000000 000000000192c27c Call trace: Exception stack(0xfffffc0008843ca0 to 0xfffffc0008843dd0) 3ca0: 0000000000000000 0000040000000000 fffffc0008843e70 fffffc00087cd71c 3cc0: fffffc0008843e00 00000000ffffffc8 fffffc0008843d00 fffffc00080f6a80 3ce0: fffffc0008843e40 fffffc0008843e40 fffffc0008843e00 00000000ffffffc8 3d00: fffffc0008843db0 fffffc000813a418 fffffc0008843e98 fffffe1ffffafece 3d20: fffffc0008843ea0 0000000000000000 fffffc0008812b40 0000000000000008 3d40: 0000000000000000 0000000000000001 0000000000000002 0000000000000002 3d60: 0000000000000000 0000000000000400 000000000000002e 20656d616e207472 3d80: 7262207265746661 0000000000000023 000000000000002d 0000000000000000 3da0: fffffc00088fc82a fffffc0008873158 00000000fffffff0 0000000000020000 3dc0: 0000000000000018 0000000000000000 [] console_setup+0x28/0x108 [] unknown_bootoption+0xa8/0x1d0 [] parse_args+0x2a4/0x4a8 [] start_kernel+0x180/0x378 [] __primary_switched+0x64/0x6c Code: f81e0c3f 97e4a534 b50006c0 f94017b3 (39400260) ---[ end trace 0000000000000000 ]--- Kernel panic - not syncing: Attempted to kill the idle task! ---[ end Kernel panic - not syncing: Attempted to kill the idle task! -- All the best Alekséy Makárov