From patchwork Fri Aug 31 20:51:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Thompson X-Patchwork-Id: 145699 Delivered-To: patches@linaro.org Received: by 2002:a2e:1648:0:0:0:0:0 with SMTP id 8-v6csp1217054ljw; Fri, 31 Aug 2018 13:52:30 -0700 (PDT) X-Received: by 2002:a1c:385:: with SMTP id 127-v6mr5961520wmd.92.1535748750875; Fri, 31 Aug 2018 13:52:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535748750; cv=none; d=google.com; s=arc-20160816; b=P9x+Y02F9OY6b9hyPqrOFdbQiwAeMamduhSkmPEat4TtmqQdVByZlU3UCnO3ju7Dx+ yzTNSHX6N/rLkNTsFHbZKUqN0eH2PRF0n3e66DU0ZbQ43Mpwz60R/48TdJRPPRsFq3VC YXCTdmR0In6zRGWBi8XUHN/xwpwFJ8ug/f7zBthcc55JuAd0o/ARhMV12n12hAlcsyIW fXJdEMIj91r5KWWrOVt2JvndPmJsynj/mgn5XZl1hBK5FpI4PuOLCCwf94DcyO3mlAun TEuJjt9JN0PrsS1YSveMAsuUyNH04ZrcsE5pZ3BBrhiNyp97WO4w2wm1f3wc3whejkvQ RHpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=SDDwRURgW+9beihRIjWtwTATpIOmHeBgZf9tCXPLsIU=; b=JB4Rp9Qg2AQbg7e2iWGbNe4HoqAbkCrslIliDfosDSyUIFzSizZshAtqbbijHkeqlY z/IbBFqGWPZ8F/xK55xQ7V+zAAzywpERQZmEUc1KsQD8Zriu+tYwUKlbEZ8LqNnvDazS /HATEjiwKhawrYDkTDH5dDulWBwq4lp6B/FYH2qXPpV4w50k6AnKSSmI+1fnXmYtppmp JpTFW9w2uHY3bwTzfU9wihemPjznjSOC/qVyHBjWpUtwPOo7g+x5RGtECa607diMO/M4 RicUbSKkIUYpv+jW2HD6YXN+Jg4V0nsfNFkMUUsxlojZZe8d7XeVyvmo8WKlXVSEhaPG psQw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Li8g6ySl; spf=pass (google.com: domain of daniel.thompson@linaro.org designates 209.85.220.41 as permitted sender) smtp.mailfrom=daniel.thompson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) by mx.google.com with SMTPS id u3-v6sor7762767wrw.12.2018.08.31.13.52.30 for (Google Transport Security); Fri, 31 Aug 2018 13:52:30 -0700 (PDT) Received-SPF: pass (google.com: domain of daniel.thompson@linaro.org designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Li8g6ySl; spf=pass (google.com: domain of daniel.thompson@linaro.org designates 209.85.220.41 as permitted sender) smtp.mailfrom=daniel.thompson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=SDDwRURgW+9beihRIjWtwTATpIOmHeBgZf9tCXPLsIU=; b=Li8g6ySlDuN5rwxc0TZOM0Q8t7r30Q2vg7GCjfGQICD+y8o78ifgDawvOXmw+vyO8/ 11nzgw260iHZVCRNuA4a1WK9OmME+zrY0m67NA02E1glaVL0OkCa7BveXoCMi0GynMVQ a3Xr2exPhy3TQBTucl9j18vpcFs/DShaUFlS8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=SDDwRURgW+9beihRIjWtwTATpIOmHeBgZf9tCXPLsIU=; b=NjLA6kV7UXg13qKD/GBmRqZXvVmbyjNaaGdenz+A1ZAZOg8Yvcy50RyTaAVU9Zh+Hi 0K2I6a7LZneVnYGC6dHykNZ8nG7fMYKNlka8wMgUCi0pqvphYADKpw1V4iaaMP2QnAQD Fmr7c+2DTxtrZuBmC6kvd3vrVzDLOBkaY0c0YaYIJHaib0ufLQi9xob6Oo/wi4LvLi78 Lb49sVNtVE6eLf8CF9JlTzp9/GxJaRMWyqTjiS/fNR1BtatwyMhnVM9eGudmZ61YSJbZ E0jm1jceMfGmYZgoxSrkTqZLBuKf/UTLupUfgVU19g8gEmzltTzT7jNYVXiNxhD1WbrD UuMw== X-Gm-Message-State: APzg51DMZ7lYu34zGWpRKpgFrQ7BGpU8rOdo6JgU0c41kQJKBGbTBfIk id25salrw8qkSfqvl3RuIVGSJ8a2 X-Google-Smtp-Source: ANB0VdYU4aCGAfMh8OLC3OkJYLrKkb7o26RcSC9GE9RDr8RddSd1WAowzpUaG8F7XH+uk79jxnmziQ== X-Received: by 2002:a5d:488c:: with SMTP id g12-v6mr12267068wrq.0.1535748750622; Fri, 31 Aug 2018 13:52:30 -0700 (PDT) Return-Path: Received: from wychelm.lan (cpc141214-aztw34-2-0-cust773.18-1.cable.virginm.net. [86.9.19.6]) by smtp.gmail.com with ESMTPSA id u4-v6sm7659356wro.47.2018.08.31.13.52.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 31 Aug 2018 13:52:29 -0700 (PDT) From: Daniel Thompson To: Jason Wessel Cc: Daniel Thompson , kgdb-bugreport@lists.sourceforge.net, linux-kernel@vger.kernel.org, patches@linaro.org Subject: [PATCH 1/5] kdb: Tidy up code to handle escape sequences Date: Fri, 31 Aug 2018 21:51:38 +0100 Message-Id: <20180831205142.23609-2-daniel.thompson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180831205142.23609-1-daniel.thompson@linaro.org> References: <20180831205142.23609-1-daniel.thompson@linaro.org> kdb_read_get_key() has extremely complex break/continue control flow managed by state variables and is very hard to review or modify. In particular the way the escape sequence handling interacts with the general control flow is hard to follow. Separate out the escape key handling, without changing the control flow. This makes the main body of the code easier to review. Signed-off-by: Daniel Thompson --- kernel/debug/kdb/kdb_io.c | 127 ++++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 61 deletions(-) -- 2.17.1 diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index ed5d34925ad0..e54e1e185c47 100644 --- a/kernel/debug/kdb/kdb_io.c +++ b/kernel/debug/kdb/kdb_io.c @@ -49,6 +49,63 @@ static int kgdb_transition_check(char *buffer) return 0; } +/* + * kdb_read_handle_escape + * + * Run a validity check on an accumulated escape sequence. + * + * Returns -1 if the escape sequence is unwanted, 0 if it is incomplete, + * otherwise it returns a mapped key value to pass to the upper layers. + */ +static int kdb_read_handle_escape(char *buf, size_t sz) +{ + char *lastkey = buf + sz - 1; + + switch (sz) { + case 1: + if (*lastkey == '\e') + return 0; + break; + + case 2: /* \e */ + if (*lastkey == '[') + return 0; + break; + + case 3: + switch (*lastkey) { + case 'A': /* \e[A, up arrow */ + return 16; + case 'B': /* \e[B, down arrow */ + return 14; + case 'C': /* \e[C, right arrow */ + return 6; + case 'D': /* \e[D, left arrow */ + return 2; + case '1': /* \e[<1,3,4>], may be home, del, end */ + case '3': + case '4': + return 0; + } + break; + + case 4: + if (*lastkey == '~') { + switch (buf[2]) { + case '1': /* \e[1~, home */ + return 1; + case '3': /* \e[3~, del */ + return 4; + case '4': /* \e[4~, end */ + return 5; + } + } + break; + } + + return -1; +} + static int kdb_read_get_key(char *buffer, size_t bufsize) { #define ESCAPE_UDELAY 1000 @@ -102,68 +159,16 @@ static int kdb_read_get_key(char *buffer, size_t bufsize) escape_delay = 2; continue; } - if (ped - escape_data == 1) { - /* \e */ - continue; - } else if (ped - escape_data == 2) { - /* \e */ - if (key != '[') - escape_delay = 2; - continue; - } else if (ped - escape_data == 3) { - /* \e[ */ - int mapkey = 0; - switch (key) { - case 'A': /* \e[A, up arrow */ - mapkey = 16; - break; - case 'B': /* \e[B, down arrow */ - mapkey = 14; - break; - case 'C': /* \e[C, right arrow */ - mapkey = 6; - break; - case 'D': /* \e[D, left arrow */ - mapkey = 2; - break; - case '1': /* dropthrough */ - case '3': /* dropthrough */ - /* \e[<1,3,4>], may be home, del, end */ - case '4': - mapkey = -1; - break; - } - if (mapkey != -1) { - if (mapkey > 0) { - escape_data[0] = mapkey; - escape_data[1] = '\0'; - } - escape_delay = 2; - } - continue; - } else if (ped - escape_data == 4) { - /* \e[<1,3,4> */ - int mapkey = 0; - if (key == '~') { - switch (escape_data[2]) { - case '1': /* \e[1~, home */ - mapkey = 1; - break; - case '3': /* \e[3~, del */ - mapkey = 4; - break; - case '4': /* \e[4~, end */ - mapkey = 5; - break; - } - } - if (mapkey > 0) { - escape_data[0] = mapkey; - escape_data[1] = '\0'; - } - escape_delay = 2; - continue; + + key = kdb_read_handle_escape(escape_data, + ped - escape_data); + if (key > 0) { + escape_data[0] = key; + escape_data[1] = '\0'; } + if (key) + escape_delay = 2; + continue; } break; /* A key to process */ }