From patchwork Thu Mar 10 20:50:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Anderson X-Patchwork-Id: 1604136 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=seco.com header.i=@seco.com header.a=rsa-sha256 header.s=selector1 header.b=JW442iwg; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KF1W213Lnz9sGB for ; Fri, 11 Mar 2022 07:53:34 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 3073D83B30; Thu, 10 Mar 2022 21:52:54 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=seco.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=seco.com header.i=@seco.com header.b="JW442iwg"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 8793783B10; Thu, 10 Mar 2022 21:51:47 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.2 Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-vi1eur04on060e.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe0e::60e]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id A993883AF7 for ; Thu, 10 Mar 2022 21:51:35 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=seco.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sean.anderson@seco.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hUemBbL07p9Ala4FqMkcWUmfizxpWryNpLEYNNl7v8wadrmVaFhk60rntWdJ3vgCNpUBdCTeqVRz2N6dEuynPKX0AkSZQve4PU5sbwO4E+w4ojMf5oh2d+3UlT+n3X1dsZN1pFNO9Z99IOv+P8IZYJtZ+5+ax6x09KfZOjuX8ZRk/7Uhvthua/5sP9Cj8d1JnvCMv7/xSKfwCkvh3LK2EsooNU/0nblUkolqI36H9JOb458DZ9KATeb9DVsUwpYSuNys7P5a2qVid9K1prvdHEgpcibHxLOaCplEez6Kg4MCqtsI5GmUUxiLe1RnopLl1GRis5sobI1FuN8DeqajuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=zMvWSkfMzmhlvdgu3viQWrNR58Hn+1LCz8HjYwyDs10=; b=I39hJdwAWqop3akqZXOcrVdSJ5vp82eUNT+m0rDroB71yln6rOz9FQ96SsSBsn04hpkUTglsx3n5//YOSZpljVdExPOJVJkS1pJyfwhStG2ZxScLxBUvK7GyPNh/CjPg3TDZ7oZDBwWMxC0917YiScL8ShTNYPtHQLMq6viwlNg/T9BYVAbnwG4es65Pu8aM4A/2XnDD0tpaztde5K4D4sAhdGEW5IZSRrXYQBJmCTNNVqZpeqjgGfjn710qqyAozh6MJd3g9ku9jSeS9RQa7Sc1YvG9ym0R2EHMazb+BMqpETj+fLxx8NpxLvxIaCkOIi5J9D/wt5MFVSb6eHGfMw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=seco.com; dmarc=pass action=none header.from=seco.com; dkim=pass header.d=seco.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=seco.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zMvWSkfMzmhlvdgu3viQWrNR58Hn+1LCz8HjYwyDs10=; b=JW442iwgt8ZaHRQW7OsxOUUxA1K8XuqIdkIIs4geSNjWJfc3q1Qf3Qm9rZ5EZ/Tvl5gaTtvBT81CmrU8pcvN0q2A4z//Lx57nS7ixuLUAJhJcRl7tih3ZCuYvjLuyM8wnluH0g9Nv245eAw57MOof6Lu4Ucb78zDl3nvth2U/X1eWRD8s8QLuD8l5APLf0ledrjVgqWbvnlxZ8NkC9QkIX/M9RH9/zi+wuRWo7RG+tvd/Ig9QF7wkxtnBolvKYLfHVve4Ns9njmRu0bauKg9e9Zgp1DF6P8z2gVA5U8xrTxNa2c7+j4Xhos3cUQGkJrLySzCTQWXzLn9UEqyHhF1lQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=seco.com; Received: from DB7PR03MB4523.eurprd03.prod.outlook.com (2603:10a6:10:19::27) by AM5PR03MB3105.eurprd03.prod.outlook.com (2603:10a6:206:24::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5038.14; Thu, 10 Mar 2022 20:51:34 +0000 Received: from DB7PR03MB4523.eurprd03.prod.outlook.com ([fe80::9860:b15b:f166:5896]) by DB7PR03MB4523.eurprd03.prod.outlook.com ([fe80::9860:b15b:f166:5896%3]) with mapi id 15.20.5061.022; Thu, 10 Mar 2022 20:51:34 +0000 From: Sean Anderson To: Tom Rini Cc: Liviu Dudau , u-boot@lists.denx.de, Simon Glass , Linus Walleij , Andre Przywara , Sean Anderson Subject: [PATCH v2 12/28] fs: Add semihosting filesystem Date: Thu, 10 Mar 2022 15:50:42 -0500 Message-Id: <20220310205059.499269-13-sean.anderson@seco.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220310205059.499269-1-sean.anderson@seco.com> References: <20220310205059.499269-1-sean.anderson@seco.com> X-ClientProxiedBy: BL1PR13CA0433.namprd13.prod.outlook.com (2603:10b6:208:2c3::18) To DB7PR03MB4523.eurprd03.prod.outlook.com (2603:10a6:10:19::27) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2ef3634a-aa1d-42f6-92a7-08da02d7c34c X-MS-TrafficTypeDiagnostic: AM5PR03MB3105:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: lbDeEc+2ujDSzGOWq6XX7ud4wfU2vtiS11FXbhKf482KBT2RQN1yFRsSHJbUdMkShtUD7106Op0ZB01m0g+StU5MbWc8E8zqXgRucw1E7rK8y8HJGstW8R/olbXQ1o4qjUbttwifoXI1kpOJS2ze+5KHFdlVVvndLXagVd8/KrQYAI1tBgkRwwgRwcJTngt57wOiUKQLiRWOvr94h/r7DH1T2QYiaILpiEBSV6OpiraDOXyYagJhHNOALRYrtAIiUCUtpv5HrVviQpaEYgQRVqSAO5KM6j+lmlv0dxWZff+bQo93EdypcADsy/yN9I+Bp5h2ZtTrje8UnyhCDG3Q5Mwb1H4n9M88c/NdCGOdDGgxQrWmQwIzE+/AuTrYyLKagohgOEtV2ln93DIS9Ufs73EZWTNaN3m3An2cdP4MT4UexNl2AaOoetRH8SSsNx0uXZ+48APml/v3vio5J2AE3Z6XcbFtXkm3mrW+3NiEtPbdgP/jzFm04ULtu3eBnp5hjC1pn/B8TCUavroze9xRsim1IMPdyamgyJ47lNKBHJzDGNdQ6LSKvY1k9uPoJnUNocw/uy37jSN3RzjTv7bDzlBWPGEWlLlg9a9Eujwi4PAjT3mj+s9JemJk/V5xMQoTIn9i8AxDOVcEdbFTILbkZkij5WDTJISa4GOXUXzTZxEmk6Lj8J0jn1cjYQDM+n4JiNU14MXbcQbhRwSaagsXKRg9b93C+ZbBdlby4gqUsyY= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB7PR03MB4523.eurprd03.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(366004)(44832011)(8676002)(54906003)(6916009)(8936002)(316002)(5660300002)(66476007)(6486002)(86362001)(66946007)(2906002)(66556008)(508600001)(107886003)(83380400001)(36756003)(4326008)(2616005)(52116002)(38100700002)(1076003)(6512007)(6666004)(38350700002)(26005)(6506007)(186003)(309714004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: YGgaw4sUIbpe1qP5fAPHbVbozUhg7HQnjD2h66QB4qiMekm035h/FY6pj/u+NuYy20zuNzp5Zd2Pp2E7n/gi8setXXdZzaLiWFJQtbsN85AInd/ZsJ3HwlrhgZp49mrRsSpwnMBoRvRSgzo4WOy+Qx6P1MlultRwjsKxPYEJWdfxetnmKPN+b1L/5Vug0EWaJnrWyV4HjIEmPMQs5xpoJq/NS2bviuhZpoL1sXa3dqZHWDygNcpusTbSvVb/n8SHhMsd92hJKLH7kz+kCC/kpRfXOM/U5CBzK1qFmjWHjSXJaKTlfqWkoeKjdo67HPK65pBUZisdtKDrXerlm+JtbuTSZeiJJirHHf31tM9IfcftPJdPC+l63YBJ/McSacU+ImhPH+WrEtWCS22+VhJq8CZ+Eb3GrpaZE2pPTdKqloiqxLsrGLAd+RteveJo63K5YGK8frbEq9YF2uJ/wjBlGk2z+tsw8Sboo+VBBmLL41xQOtbGdNpUIJQor2/9k2jitTV0GcqkjZPgnhwI+MkgspYBBUDNE/TnX3DzeITT9PoOlzMM3q8v02SYMBqkqI5GQrwuYwAEQwsLa1RRIUXTNNyAXdHKeasW1fS0DHW10PH6iamf47OtopYyCFHRiRUiZq6WMFzueK0Y+p5jWZeIc/n+05oX3/VRLOjcQsFnRH4Khkh1UUAkvdQ6eLUMYjbBYfDoxyyGOpMgjrmbXqitIEPd+Hnet10Pr1Yv8H1Z9kb7CPgsc/VDW8Qkj4r17eEZOmQv0zMbakdTWqaHdacnmZhFoDcVo/HAbJWlhpgrFp3mt+p4Wc0dtCI9kU/IspPVHTOHJrYFRzsPIHoANU1Qcn+qj9NMpxuW1x1j0ufV8HFKgsHUvnqnNBOR3TTCFKLORKX9CYB9WuKTa/KxrmLqz4rAWaeqDE0ie4tjHMbToPniaWp1IHQDw6A6xDQQga8XPlEH2My7lHMTHquMHrk39PJEpaU+xV9Iq+2HODypVKzJgH9C/l69ltTBAJAdiohsEiW9uvyZp/8PcR3I0Y+Z14c+rrdVpJ6nedFK/W4L7Gy1kI7y5ueZZsCFaT860XP64OtsxX02SDgZqCWRPJCvY9zCVitClldCSIrSTaR7BfwjSny0szBS1PGxfw9oNR6VK4ZXhSiT0qYjduftZcvGRkXrJVoB/K3Z/cboOAg/ECHdjU4zdrsw5vBeDparDKaGVjKs5frMB6vOj45f72HazA6RlMV9q+oVS6byvT7z/jIxwPS6pcfD/fnW+vcypFDtgLH65NOSg9vAbmyNZKRaSvj71jWTjHUfPmyv4yBwKoIqjinTNvHNY+0ZHxsv7iFipJ5YjKeYuMIhWprP5+Gew16hKBzQ5EOoo1DVC/Gx+Pnc0dE1TRsqeEnCWqRcGGgVGDbonM2m0kdR7vf4VbB9XcgcwlRF+heJzC32ckYEjsiT/W3POplmxzjHVkTn3238c1VTMgBYwTaWnRt8V6OJLWQ5A7HIm991A5U50FZ+TEudGXWpuITbjSp4iqQprqhiiV1ntGraKva5eRvRtWNFWwyN1isnhup12bP6uKOEGPQKnSlJEssiHu+q3Or2GwKepKxr7LfooHsj2zvTlaqo3K8sIfOBMc6e21VzidJaaEk= X-OriginatorOrg: seco.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2ef3634a-aa1d-42f6-92a7-08da02d7c34c X-MS-Exchange-CrossTenant-AuthSource: DB7PR03MB4523.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Mar 2022 20:51:34.5083 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bebe97c3-6438-442e-ade3-ff17aa50e733 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: sp4EEAJVCM88JZwFAVF/iD6L8qUFqfErRMmblqV2n5Jp3/D+cERigTrhNAGxlU1M1bVxCujNCkbWgWzEym4F7g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR03MB3105 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.5 at phobos.denx.de X-Virus-Status: Clean This adds a filesystem which is backed by the host's filesystem. It is modeled off of sandboxfs, which has very similar aims. Semihosting doesn't support listing directories (except with SYS_SYSTEM), so neither do we. it's possible to optimize a bit for the common case of reading a whole file by omitting a call to smh_seek, but this is left as a future optimization. Signed-off-by: Sean Anderson --- (no changes since v1) disk/part.c | 4 +- fs/Makefile | 1 + fs/fs.c | 20 +++++++ fs/semihostingfs.c | 115 ++++++++++++++++++++++++++++++++++++++++ include/fs.h | 1 + include/semihostingfs.h | 21 ++++++++ 6 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 fs/semihostingfs.c create mode 100644 include/semihostingfs.h diff --git a/disk/part.c b/disk/part.c index 49e39a24e8..b95405bb49 100644 --- a/disk/part.c +++ b/disk/part.c @@ -455,7 +455,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str, int part; struct disk_partition tmpinfo; -#ifdef CONFIG_SANDBOX +#if IS_ENABLED(CONFIG_SANDBOX) || IS_ENABLED(CONFIG_SEMIHOSTING) /* * Special-case a pseudo block device "hostfs", to allow access to the * host's own filesystem. @@ -467,7 +467,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str, info->blksz = 0; info->bootable = 0; strcpy((char *)info->type, BOOT_PART_TYPE); - strcpy((char *)info->name, "Sandbox host"); + strcpy((char *)info->name, "Host filesystem"); #if CONFIG_IS_ENABLED(PARTITION_UUIDS) info->uuid[0] = 0; #endif diff --git a/fs/Makefile b/fs/Makefile index 937cbcf6e8..c25d022946 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -21,6 +21,7 @@ obj-$(CONFIG_FS_FAT) += fat/ obj-$(CONFIG_FS_JFFS2) += jffs2/ obj-$(CONFIG_CMD_REISER) += reiserfs/ obj-$(CONFIG_SANDBOX) += sandbox/ +obj-$(CONFIG_SEMIHOSTING) += semihostingfs.o obj-$(CONFIG_CMD_UBIFS) += ubifs/ obj-$(CONFIG_YAFFS2) += yaffs2/ obj-$(CONFIG_CMD_ZFS) += zfs/ diff --git a/fs/fs.c b/fs/fs.c index 023f89cafe..bba010ea99 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -246,6 +247,25 @@ static struct fstype_info fstypes[] = { .ln = fs_ln_unsupported, }, #endif +#ifdef CONFIG_SEMIHOSTING + { + .fstype = FS_TYPE_SEMIHOSTING, + .name = "semihosting", + .null_dev_desc_ok = true, + .probe = smh_fs_set_blk_dev, + .close = fs_close_unsupported, + .ls = fs_ls_unsupported, + .exists = fs_exists_unsupported, + .size = smh_fs_size, + .read = smh_fs_read, + .write = smh_fs_write, + .uuid = fs_uuid_unsupported, + .opendir = fs_opendir_unsupported, + .unlink = fs_unlink_unsupported, + .mkdir = fs_mkdir_unsupported, + .ln = fs_ln_unsupported, + }, +#endif #ifdef CONFIG_CMD_UBIFS { .fstype = FS_TYPE_UBIFS, diff --git a/fs/semihostingfs.c b/fs/semihostingfs.c new file mode 100644 index 0000000000..96eb3349a2 --- /dev/null +++ b/fs/semihostingfs.c @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2022, Sean Anderson + * Copyright (c) 2012, Google Inc. + */ + +#include +#include +#include +#include +#include +#include + +int smh_fs_set_blk_dev(struct blk_desc *rbdd, struct disk_partition *info) +{ + /* + * Only accept a NULL struct blk_desc for the semihosting, which is when + * hostfs interface is used + */ + return !!rbdd; +} + +static int smh_fs_read_at(const char *filename, loff_t pos, void *buffer, + loff_t maxsize, loff_t *actread) +{ + long fd, size, ret; + + fd = smh_open(filename, MODE_READ | MODE_BINARY); + if (fd < 0) + return fd; + ret = smh_seek(fd, pos); + if (ret < 0) { + smh_close(fd); + return ret; + } + if (!maxsize) { + size = smh_flen(fd); + if (ret < 0) { + smh_close(fd); + return size; + } + + maxsize = size; + } + + size = smh_read(fd, buffer, maxsize); + smh_close(fd); + if (size < 0) + return size; + + *actread = size; + return 0; +} + +static int smh_fs_write_at(const char *filename, loff_t pos, void *buffer, + loff_t towrite, loff_t *actwrite) +{ + long fd, size, ret; + + fd = smh_open(filename, MODE_READ | MODE_BINARY | MODE_PLUS); + if (fd < 0) + return fd; + ret = smh_seek(fd, pos); + if (ret < 0) { + smh_close(fd); + return ret; + } + + ret = smh_write(fd, buffer, towrite, &size); + smh_close(fd); + *actwrite = size; + return ret; +} + +int smh_fs_size(const char *filename, loff_t *result) +{ + long fd, size; + + fd = smh_open(filename, MODE_READ | MODE_BINARY); + if (fd < 0) + return fd; + + size = smh_flen(fd); + smh_close(fd); + + if (size < 0) + return size; + + *result = size; + return 0; +} + +int smh_fs_read(const char *filename, void *buf, loff_t offset, loff_t len, + loff_t *actread) +{ + int ret; + + ret = smh_fs_read_at(filename, offset, buf, len, actread); + if (ret) + printf("** Unable to read file %s **\n", filename); + + return ret; +} + +int smh_fs_write(const char *filename, void *buf, loff_t offset, + loff_t len, loff_t *actwrite) +{ + int ret; + + ret = smh_fs_write_at(filename, offset, buf, len, actwrite); + if (ret) + printf("** Unable to write file %s **\n", filename); + + return ret; +} diff --git a/include/fs.h b/include/fs.h index c8df3886ac..2f631624b5 100644 --- a/include/fs.h +++ b/include/fs.h @@ -17,6 +17,7 @@ struct cmd_tbl; #define FS_TYPE_UBIFS 4 #define FS_TYPE_BTRFS 5 #define FS_TYPE_SQUASHFS 6 +#define FS_TYPE_SEMIHOSTING 7 struct blk_desc; diff --git a/include/semihostingfs.h b/include/semihostingfs.h new file mode 100644 index 0000000000..25ebdbbeff --- /dev/null +++ b/include/semihostingfs.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2022, Sean Anderson + * Copyright (c) 2012, Google Inc. + */ + +#ifndef __SEMIHOSTING_FS__ +#define __SEMIHOSTING_FS__ + +struct blk_desc; +struct disk_partition; + +int smh_fs_set_blk_dev(struct blk_desc *rbdd, struct disk_partition *info); +void smh_fs_close(void); +int smh_fs_size(const char *filename, loff_t *size); +int smh_fs_read(const char *filename, void *buf, loff_t offset, loff_t len, + loff_t *actread); +int smh_fs_write(const char *filename, void *buf, loff_t offset, + loff_t len, loff_t *actwrite); + +#endif