From nobody Tue Oct 28 12:35:58 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1515016023055571.3613568647668; Wed, 3 Jan 2018 13:47:03 -0800 (PST) Received: from localhost ([::1]:38170 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eWqsF-0004Go-5V for importer@patchew.org; Wed, 03 Jan 2018 16:46:59 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52850) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eWqYH-0003GY-5h for qemu-devel@nongnu.org; Wed, 03 Jan 2018 16:26:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eWqYE-0000JT-Nr for qemu-devel@nongnu.org; Wed, 03 Jan 2018 16:26:21 -0500 Received: from mail-qk0-x242.google.com ([2607:f8b0:400d:c09::242]:39756) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eWqYE-0000JK-Fh for qemu-devel@nongnu.org; Wed, 03 Jan 2018 16:26:18 -0500 Received: by mail-qk0-x242.google.com with SMTP id c5so3241412qkg.6 for ; Wed, 03 Jan 2018 13:26:18 -0800 (PST) Received: from x1.lan ([138.117.48.219]) by smtp.gmail.com with ESMTPSA id a19sm1104402qtj.74.2018.01.03.13.26.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 Jan 2018 13:26:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=RdwtmvAk+rg7qQqhvsXLmWr2drmj7DmzvEUhvzTvlWw=; b=d90UH4p6Otb8nlwRlCkQBZVi+KLL1he7CJ3XPHEdwxSCSmUwZUNmJeKD0R9SIPO+LI m7HJbgA8LC7MxVNl9MFjcbkODCijILFRjY/437TSUSEkY1G/uGRgNmAX9//kwbgIeRxL 8FEHqGRTQ9aZOfjfbAcZaRQAmb09BfcT4bvrGRumcoV2oAuA87MjMRDfwGxjB9h0eARC puTwsh3182ArWglqxltnspBE1Bj8NmRtg7lILOoimt1a/SOkJXrTVwcEPVkJFpBmpjT7 RGRcgjdH1UjMlI72HSPR0EAtB8dYLwLX03BMpNqQq065SA7zy5au10NRMGcDBseHgtl5 AxEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=RdwtmvAk+rg7qQqhvsXLmWr2drmj7DmzvEUhvzTvlWw=; b=JWCgJyzMFwrqUNOkhbbh1CUke53HIieols82AFAbDbopSZYfG6LUwK58XSou35vMJM kjNNpRTcj2QxVCWZTwGZKihx7kI6HThhKQi35L3rtwr3NstvJB191m1peYsfDCSySz6g tBP2u/ZBJO1H27vdBSLKDLuyz1VOSFFXKF9r19QXstk0AvWZKi79+DZFJKajQercG7Q3 8PghG8kkEFq9ekJtU1JzRh3ZfLl1Jv8yf6elbZWfhTiwzyhrMSQgKhN+P/X3ubiBQGgv Rh0W6MmeUx+xMk7blGheKsmXjfD/YQLOZFw6iCQxzs/V47Utk2pxHh5uaq3VgSdpE8sK jvaQ== X-Gm-Message-State: AKGB3mI6SGOloKqW4AKoFOssiE7Yweu+P1NxRH80bXLPIREsdAkJcxfj cvJHbvqWZv+gUEkv4ilwoRM= X-Google-Smtp-Source: ACJfBoviGtMifVit6k+laM9YEmJfL6rwuzyNydWKHlVrRDkst/opBOrPxfSZA8eDydOyjozTwJuJqg== X-Received: by 10.233.216.195 with SMTP id u186mr3243979qkf.341.1515014777974; Wed, 03 Jan 2018 13:26:17 -0800 (PST) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Alistair Francis , Peter Maydell , Igor Mitsyanko , Andrew Baumann , Olbrich , Andrzej Zaborowski Date: Wed, 3 Jan 2018 18:24:32 -0300 Message-Id: <20180103212436.15762-22-f4bug@amsat.org> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180103212436.15762-1-f4bug@amsat.org> References: <20180103212436.15762-1-f4bug@amsat.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c09::242 Subject: [Qemu-devel] [PATCH v2 21/25] sdcard: add cmd_version_supported(), improve cmd_class_supported() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Edgar E . Iglesias" , Prasad J Pandit , Peter Crosthwaite , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, Paul Brook , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Using the cmd_supported[] array we keep track of which Spec version introdu= ced a command, and which class it belongs to. This array is initialized with SD Spec v2.00. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- hw/sd/sd.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++= ---- 1 file changed, 121 insertions(+), 7 deletions(-) diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 16a8a7411d..0e4871869f 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -278,13 +278,121 @@ static const sd_cmd_type_t sd_cmd_type[SDCARD_CMD_MA= X] =3D { sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, }; =20 -static const int sd_cmd_class[SDCARD_CMD_MAX] =3D { - 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6, - 5, 5, 10, 10, 10, 10, 5, 9, 9, 9, 7, 7, 7, 7, 7, 7, - 7, 7, 10, 7, 9, 9, 9, 8, 8, 10, 8, 8, 8, 8, 8, 8, +#define BIT_2_4 (BIT(2) | BIT(4)) +#define BIT_2_4_7 (BIT(2) | BIT(4) | BIT(7)) +#define BIT_SECU BIT(30) /* SD Specifications Part3 Security Specificat= ion */ +#define BIT_MANUF BIT(31) /* reserved for manufacturer */ + +typedef struct { + struct { + uint16_t version; + uint32_t ccc_mask; + } sd, spi; +} sd_cmd_supported_t; + +static const sd_cmd_supported_t cmd_supported[SDCARD_CMD_MAX] =3D { + /* SD SPI */ + [0] =3D {{200, BIT(0)}, {200, BIT(0)}, }, + [1] =3D {{}, {200, BIT(0)}, }, + [2] =3D {{200, BIT(0)}, {}, }, + [3] =3D {{200, BIT(0)}, {}, }, + [4] =3D {{200, BIT(0)}, {}, }, + [5] =3D {{200, BIT(9)}, {200, BIT(9)}, }, + [6] =3D {{200, BIT(10)}, {200, BIT(10)}, }, + [7] =3D {{200, BIT(0)}, {}, }, + [8] =3D {{200, BIT(0)}, {200, BIT(0)}, }, + [9] =3D {{200, BIT(0)}, {200, BIT(0)}, }, + [10] =3D {{200, BIT(0)}, {200, BIT(0)}, }, + [12] =3D {{200, BIT(0)}, {200, BIT(0)}, }, + [13] =3D {{200, BIT(0)}, {200, BIT(0)}, }, + [14] =3D {{200, BIT(0)}, {}, }, + [15] =3D {{200, BIT(0)}, {}, }, + [16] =3D {{200, BIT_2_4_7}, {200, BIT_2_4_7}, }, + [17] =3D {{200, BIT(2)}, {200, BIT(2)}, }, + [18] =3D {{200, BIT(2)}, {200, BIT(2)}, }, + [24] =3D {{200, BIT(4)}, {200, BIT(4)}, }, + [25] =3D {{200, BIT(4)}, {200, BIT(4)}, }, + [26] =3D {{200, BIT_MANUF}, {/*?*/}, }, + [27] =3D {{200, BIT(4)}, {200, BIT(4)}, }, + [28] =3D {{200, BIT(6)}, {200, BIT(6)}, }, + [29] =3D {{200, BIT(6)}, {200, BIT(6)}, }, + [30] =3D {{200, BIT(6)}, {200, BIT(6)}, }, + [32] =3D {{200, BIT(5)}, {200, BIT(5)}, }, + [33] =3D {{200, BIT(5)}, {200, BIT(5)}, }, + [34] =3D {{200, BIT(10)}, {200, BIT(10)}, }, + [35] =3D {{200, BIT(10)}, {200, BIT(10)}, }, + [36] =3D {{200, BIT(10)}, {200, BIT(10)}, }, + [37] =3D {{200, BIT(10)}, {200, BIT(10)}, }, + [38] =3D {{200, BIT(5)}, {200, BIT(5)}, }, + [42] =3D {{200, BIT(7)}, {200, BIT(7)}, }, + [50] =3D {{200, BIT(10)}, {200, BIT(10)}, }, + [52] =3D {{200, BIT(9)}, {200, BIT(9)}, }, + [53] =3D {{200, BIT(9)}, {200, BIT(9)}, }, + [54] =3D {{/* 2.00 SDIO */}, {/* 2.00 SDIO */}, }, + [55] =3D {{200, BIT(8)}, {200, BIT(8)}, }, + [56] =3D {{200, BIT(8)}, {200, BIT(8)}, }, + [57] =3D {{200, BIT(10)}, {200, BIT(10)}, }, + [58] =3D {{}, {200, BIT(0)}, }, + [59] =3D {{}, {200, BIT(0)}, }, + [60] =3D {{200, BIT_MANUF}, {/*?*/}, }, + [61] =3D {{200, BIT_MANUF}, {/*?*/}, }, + [62] =3D {{200, BIT_MANUF}, {/*?*/}, }, + [63] =3D {{200, BIT_MANUF}, {/*?*/}, }, +}, acmd_supported[SDCARD_CMD_MAX] =3D { + /* SD SPI */ + [6] =3D {{200, BIT(8)}, {}, }, + [13] =3D {{200, BIT(8)}, {200, BIT(8)}, }, + [18] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [22] =3D {{200, BIT(8)}, {200, BIT(8)}, }, + [23] =3D {{200, BIT(8)}, {200, BIT(8)}, }, + [25] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [26] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [38] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [41] =3D {{200, BIT(8)}, {200, BIT(8)}, }, + [42] =3D {{200, BIT(8)}, {200, BIT(8)}, }, + [43] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [44] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [45] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [46] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [47] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [48] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [49] =3D {{200, BIT_SECU}, {200, BIT_SECU}, }, + [51] =3D {{200, BIT(8)}, {200, BIT(8)}, }, }; =20 +static bool cmd_version_supported(SDState *sd, uint8_t cmd, bool is_acmd) +{ + const sd_cmd_supported_t *cmdset =3D is_acmd ? acmd_supported : cmd_su= pported; + uint16_t cmd_version; + + cmd_version =3D sd->spi ? cmdset[cmd].spi.version : cmdset[cmd].sd.ver= sion; + if (cmd_version) { + return true; + } + qemu_log_mask(LOG_GUEST_ERROR, "%s: Unsupported %s%02u\n", + sd->proto_name, is_acmd ? "ACMD" : "CMD", cmd); + + return false; +} + +static bool cmd_class_supported(SDState *sd, uint8_t cmd, uint8_t class, + bool is_acmd) +{ + const sd_cmd_supported_t *cmdset =3D is_acmd ? acmd_supported : cmd_su= pported; + uint32_t cmd_ccc_mask; + + cmd_ccc_mask =3D sd->spi ? cmdset[cmd].spi.ccc_mask : cmdset[cmd].sd.c= cc_mask; + + /* class 1, 3 and 9 are not supported in SPI mode */ + if (cmd_ccc_mask & BIT(class)) { + return true; + } + qemu_log_mask(LOG_GUEST_ERROR, "%s: Unsupported %s%02u (class %d)\n", + sd->proto_name, is_acmd ? "ACMD" : "CMD", cmd, class); + + return false; +} + static uint8_t sd_crc7(void *message, size_t width) { int i, bit; @@ -1570,8 +1678,8 @@ static bool cmd_valid_while_locked(SDState *sd, SDReq= uest *req) if (req->cmd =3D=3D 16 || req->cmd =3D=3D 55) { return true; } - return sd_cmd_class[req->cmd] =3D=3D 0 - || sd_cmd_class[req->cmd] =3D=3D 7; + return cmd_class_supported(sd, req->cmd, 0, false) || + cmd_class_supported(sd, req->cmd, 7, false); } =20 int sd_do_command(SDState *sd, SDRequest *req, @@ -1596,6 +1704,12 @@ int sd_do_command(SDState *sd, SDRequest *req, req->cmd &=3D 0x3f; } =20 + if (!cmd_version_supported(sd, req->cmd, sd->expecting_acmd)) { + sd->card_status |=3D ILLEGAL_COMMAND; + rtype =3D sd_illegal; + goto send_response; + } + if (sd->card_status & CARD_IS_LOCKED) { if (!cmd_valid_while_locked(sd, req)) { sd->card_status |=3D ILLEGAL_COMMAND; --=20 2.15.1