Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp5650155ybp; Tue, 8 Oct 2019 06:21:39 -0700 (PDT) X-Google-Smtp-Source: APXvYqzqziwEhWW8vI0pz/5a9vC2H4OIREJoe4ySOiXRO+eNlccx6T6oYRR2mC+k0oQMF2aIv45w X-Received: by 2002:a05:6402:1212:: with SMTP id c18mr34191541edw.259.1570540899509; Tue, 08 Oct 2019 06:21:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570540899; cv=none; d=google.com; s=arc-20160816; b=d0oDEGlZZlI/2/leUSPD4F584JqbOl0GgOSvPRSX4y0v8lhLd2B1ERqIxzDByoOPYo 3buUEp7putvJvQ6+N/3fqXbnbxhKq8YaVA4sLZpl1ivzfmahZh4GklchzzYbC02qTKDE 4XbHZXlqy1plAHasvhuaY2QfosLADHNlu1nHrY4vZlVRhDwQmGVDiKikbB/e6e6rTPxW hwFAXc2rbHDwKnso45x85qf075159BWLqo5guf0XPJvR8nAYh4RjH83T7sMEBTByHzd9 Pi+6pjOT6DvxvpZ++IK7UI42J5UzCzl4jB2WOxPrPEr8Iu3krh19/vl8C0EQCDyf2WiX bicQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=8fqv4PyrK6g1lPHnpAokAojNoS9v/RKHcLgZ0jjPkiE=; b=FDhUoJo69mO0K2mL4EYCXpuCvY04Kz1fcUsn6OqwT4O90CSD1cN1l2BaSdi9HWHyga B0fKpSGOQvCZqzWQPX6Dmtr8q08V9XEVBVfOsuQdIfY7ETToTKH9Vg7hi6ofWlo9ZvIT 6ne51LBO3afqI4i+qtmv8GYrVvY5Vc38aJ7ovBOSgBLXyKw4S0X+0wkpUPP1mnAKYs4k oXV9npAjtkbkHtZN8qI5F5f8CP7eND2NGmYRNhAhtTJRxUFtN3LUqlsMkkopO/jxrXXP 04lW2UdRNNkSX8rAfCqcOg5klWmyOalai6PokXonCPLVLRVRSGL1GNoSrNUyPFIG7sog rBvA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ODVHXP4I; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q24si8676836ejr.128.2019.10.08.06.21.15; Tue, 08 Oct 2019 06:21:39 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ODVHXP4I; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730974AbfJHNVF (ORCPT + 99 others); Tue, 8 Oct 2019 09:21:05 -0400 Received: from mail-wr1-f51.google.com ([209.85.221.51]:44518 "EHLO mail-wr1-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730316AbfJHNVE (ORCPT ); Tue, 8 Oct 2019 09:21:04 -0400 Received: by mail-wr1-f51.google.com with SMTP id z9so19344382wrl.11 for ; Tue, 08 Oct 2019 06:21:01 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=8fqv4PyrK6g1lPHnpAokAojNoS9v/RKHcLgZ0jjPkiE=; b=ODVHXP4IDvSf3+dsD48e/xrpRuCOaDhFwY0ETdD0g+c6W5KI6m9f5yRoSTouZN8Yoa cB9QrWlm2xGRhKVVoBeZZyg4zDzEneA3xVJe9H71eyZaMqEYORdlxcqqgb8mV9mnQyBQ wkGpS65Ls4slhxHIvY/msOGOsyw9cpyhf974IFkicg2q/OrLJCni/+cv8ObjWiPG/cyG wqlLu0tpZaHiCDwX4YbwOAAas61/U8mSvyqhbB/NAsZD/n1cy4GgTxgi3HLRYQgacHu/ XDTPKtBpW8VVmLtKDLcgyCFXphNOPz/jkK12Y7b1CnFhi6H4/bNBk4Z7Euzp4z3OsEnb dzsA== 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:mime-version:content-transfer-encoding; bh=8fqv4PyrK6g1lPHnpAokAojNoS9v/RKHcLgZ0jjPkiE=; b=BeXfDgg9gUwTm2O8hgHcegpMzF3erPb9xZhvtGnRPIhrshNB89dOzw1RNY3UWzakgU em7wIsh27j7Ijy7Grmpz+YvuGVeshhu4XfgiEhclJdGqfq9TIwLEKqhMV1EAN7LlDWhx GOlWh07QI06OP76SUCl9b6U7Cs2CrzNAhU9Qr0YBLWZTmNPUwl4S9ICmvobmjvlMhUtu J/kH11oP7rzoZyBnNLQDr7oFy2UCrZfiKkiYZd/Z5C9wLgbVf2EQyny62HUwsF7jTgcd 86mwf2sY2qBvWu1CREV6loaSH+HBV41XxMP30ma/+5bnfPMoBNxSNZh1skDaza9NwwWs CCHw== X-Gm-Message-State: APjAAAVb4/D6P6A/F9s0w8onxWIhe9AYqKdaw1l8Yx1QJ8JBWKtJA3Qn rKa6dViZis1jf6jkHuzEMfeNog== X-Received: by 2002:a5d:5183:: with SMTP id k3mr25134077wrv.55.1570540860341; Tue, 08 Oct 2019 06:21:00 -0700 (PDT) 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 t8sm18237214wrx.76.2019.10.08.06.20.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Oct 2019 06:20:59 -0700 (PDT) From: Daniel Thompson To: Jason Wessel , Douglas Anderson Cc: Daniel Thompson , kgdb-bugreport@lists.sourceforge.net, linux-kernel@vger.kernel.org, patches@linaro.org Subject: [PATCH v2 1/5] kdb: Tidy up code to handle escape sequences Date: Tue, 8 Oct 2019 14:20:39 +0100 Message-Id: <20191008132043.7966-2-daniel.thompson@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191008132043.7966-1-daniel.thompson@linaro.org> References: <20191008132043.7966-1-daniel.thompson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.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(-) diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index 3a5184eb6977..68e2c29f14f5 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 */ } -- 2.21.0