From patchwork Mon Oct 14 15:46:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Thompson X-Patchwork-Id: 176257 Delivered-To: patches@linaro.org Received: by 2002:a92:7e96:0:0:0:0:0 with SMTP id q22csp4682852ill; Mon, 14 Oct 2019 08:46:32 -0700 (PDT) X-Received: by 2002:a1c:804d:: with SMTP id b74mr15976842wmd.170.1571067991977; Mon, 14 Oct 2019 08:46:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571067991; cv=none; d=google.com; s=arc-20160816; b=L5YgUjZd1wgYwQEDRknnDQrMmEs/wPvXFYn1m1/OkfFPswmGO91KLBcRy5fmVZLIp5 JGCo8aW5z+L+Ttov0TLqSGdxnJL2eIrU3UtR3ZQA0q1wk8JFd+m+KXXNaHA0Arvhg/hJ Ls13ndfW6XcD8Wl2Miu9dq5TVXjAdU5FVgmmzwob0H9sU3VNSOCL4Ma2TBMMKUN2wBlP ru2yaad2cGHRGBnBE4TQ9M+q6e9md5StrHcYT7lhsBSsZsujbx2Pk4D+40F1sHAmFvmR kXz0au+CNmmhdcEWA5VXuJgBfSVM2xGb7E15ff2Yw56bFelTUERQq2RfcsfxfkoBxHes IO5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=jevXkkwcX0tlcqUocBLqbbviGRXh0qF+AVQ/mfDGUjk=; b=d8Liqh54gZEUXY7UGt57bsOZtVwYHUY0CTBwLUEylhq/LIuXNMfU2A3jftgsljd21b oiH2O8zj3VJEgf+C77EYCu/wuKOfezx10XZBxKPdjHlTmKFgg1xhymWXROaYZTU7NTPT h/nSxofp8uA9jqhEhsLZXy2XHIXvHvGxq3hEQw3HRGTBcIkoampcppkt2JMLJ4Vd/Zm5 vBdoaUCVSh1pRZ60i9EESLKmZf5o0Ozr7ONDJZMTtzPV2JvaiJrAJ08lZDMUIF4hb+iH hviBg+Yrso0RR3/l37R5qdVScQCe4z/OilMUwBvwS+0cp8IZlMtJwzPtLWzgoVpJVUGf OI+A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=tI5ziScF; 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 h15sor12068109wrs.31.2019.10.14.08.46.31 for (Google Transport Security); Mon, 14 Oct 2019 08:46:31 -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=tI5ziScF; 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 :mime-version:content-transfer-encoding; bh=jevXkkwcX0tlcqUocBLqbbviGRXh0qF+AVQ/mfDGUjk=; b=tI5ziScFn2BLsrXBgfvUTIl08iV6sOgpXr5k+1Pj1kKR3aqoRMExitDKDlLxjX2GXl G59aID6ez6Ymar1kpnivugXNbl5TecFb49b3Ktws91ZWOqgcmaJNJRwT8ouoxOtqjpb4 C+kfoMT7NwZ1NtmjvsF/3fk70DsbnkwPM5OLjjh41VCuOc80tl3zbxCpNDgKBZ5SRUFc wHgqig4h0/LXG/rprIZbvk/Bddsn5CabXMytCxzESJD9PW9sqHjy4BJSTHqTTMA7mFUn pizDZ2FrKM2MSTvISU1Fnq6vbuRj2WcbRrb+TBhldU8aWxhS1vw/piJ7dLP6RDicl3OS hzqw== 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=jevXkkwcX0tlcqUocBLqbbviGRXh0qF+AVQ/mfDGUjk=; b=r7eo2Aob0a/QHtWMA2quX9p6QeLxoaJ+Xk7MkldU1SoSMpBrWeSTp778pYram5heaD J1nZt8y3FKu+kJeIzvAXkdrOgH5JOeIfiO7p3qCxjGg6nMi9grsQ2QYkY4StoMPr/+0c D106nnf25VLeqyXW/04caDmOAOIpS3h6RBsw9nDqFl5kgh4K2TxiP8TNdAp6FOwBmn2Z kujtxA3fZnCRsPdG8I+gPOZTgRK1gGeSWUay4yVD21jVI5lnf18ROHOrABZNB9OlCA90 3YYziKpXQbYDwr5GaUiVaCLmhL6OyV0+b2Gmwh6rBxWMZdWSzHrrwP2NgV8pmAeJ2P78 o8vA== X-Gm-Message-State: APjAAAUNlqAaYpZPm/25DColog5HdNdOkPWvElj+x73MzZhV6r8QeOxo KtuRFCK3LC22Ov6niywRZkxtYnw6o+MdIbP7 X-Google-Smtp-Source: APXvYqwrhpQluePggjAgvaGAIAcAXqpG1HIcFcJRG+3p3ceuWTCqXStrR4+HdCNFx4yifdG69aY9Wg== X-Received: by 2002:adf:ed88:: with SMTP id c8mr7828592wro.214.1571067991501; Mon, 14 Oct 2019 08:46:31 -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 q22sm16539738wmj.5.2019.10.14.08.46.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Oct 2019 08:46:30 -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 v3 1/5] kdb: Tidy up code to handle escape sequences Date: Mon, 14 Oct 2019 16:46:22 +0100 Message-Id: <20191014154626.351-2-daniel.thompson@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191014154626.351-1-daniel.thompson@linaro.org> References: <20191014154626.351-1-daniel.thompson@linaro.org> MIME-Version: 1.0 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 Reviewed-by: Douglas Anderson --- kernel/debug/kdb/kdb_io.c | 127 ++++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 61 deletions(-) -- 2.21.0 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 */ }