From patchwork Wed Dec 30 03:33:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anup Patel X-Patchwork-Id: 1421304 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2001:8b0:10b:1231::1; helo=merlin.infradead.org; envelope-from=opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=wdc.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=merlin.20170209 header.b=dttKZvLV; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=wdc.com header.i=@wdc.com header.a=rsa-sha256 header.s=dkim.wdc.com header.b=CQGJfOGI; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=sharedspace.onmicrosoft.com header.i=@sharedspace.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-sharedspace-onmicrosoft-com header.b=PLKtM2/1; dkim-atps=neutral Received: from merlin.infradead.org (merlin.infradead.org [IPv6:2001:8b0:10b:1231::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4D5H2J1wZ6z9sVl for ; Wed, 30 Dec 2020 14:33:58 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=ILoSZv7XclLGnCpEq13CVX2hYGOGSewSntQP4gzE/r8=; b=dttKZvLVchM/oSfzgLHN0Cmyo eld43WBvx7kCRRjDzGneaYSMQlrg/9aQrBBW8GpChkq1WmMBJEnPApOQRWBrbQUi2EC7crsMcb8ZJ 3b+3G+hebZGR/dOvgy9E8eMSvI7vj0ovWP3vnnlLrjUH/8ZI/vxm4K4CZED0BNAGLsIl9ptO/DIa2 myUM8Zq9PQCDF8SB24hqa0Aomx0l+H6f3J7wi6rSOI1MpZ0Dj6Lr9Ur97AGIJcO+QIlnXkpXI1v+o k9AlowP6bCsD/eCxoNt0Et1p+baeUtie9f17XWaH4JWvIfwxMnESCit3gQMcoA+7A1nfVK5V5GM2d xYfg7sN4A==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kuSFF-0000vA-GU; Wed, 30 Dec 2020 03:33:53 +0000 Received: from esa4.hgst.iphmx.com ([216.71.154.42]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kuSF8-0000rV-LJ for opensbi@lists.infradead.org; Wed, 30 Dec 2020 03:33:50 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1609299226; x=1640835226; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=cbA4YmL10K8C7FVxm3LgruZiMr4eXE7Jb8vipmrANaY=; b=CQGJfOGIp/Fbz+OLbt5CKiGGneHbKsJQXzms0pw6fRsplkiejq4De91P q64XUQLJWBKZPJqbZQV3u4F1273o7APA4L2sq1C0mLgCsk63V8B7AnZtw pmrzXS+wMU9kyhl/QEb2tyvfvCLLl8Pv7+4w7HUbCHb21W1WVOFMYgFFh hdxFo5g8xLbs6E6+HQ3oP6yB2TdI26TptkocNJeGuXz2GxoiqqlxGwnEg ueOlEwsHBOuFhh1r6EqNWEYDrbVoYXJaZmEm7NlDx5+BNg6cEvGQpy1af +Dnst5ioXJenw+GPOVGI4WAfGnAF0VLO+qKvu3eNoAZeNbxQXbiLJz+wp g==; IronPort-SDR: AV3U21QCmD3y8L2C20O8Kak6KZj3iod+yRCvC1QGqKFOOhJqHrY9kbBYIHm6H8mZaeWMbZ8PzF UYLm9g5X2TZh1zUCTVuZ+Ca2Th9aIkFn9b+k8P9hHMEy6083fASDIx9/B9KfnJsM/0o8iH8MLY /mXnsRMBhluhbxOXjsgrCn/y67K69QdKG2Hvf0cfgz74TsyN/oBEWJtZG8zCM4ut82SGz0newt gaWnOohu06qHRkqUK7IZ7SSqPUyrgsy6oDhpPyTI0vTEdC4oFR6aTsSJmUmBh2gWnHmfYrywEb 0N4= X-IronPort-AV: E=Sophos;i="5.78,460,1599494400"; d="scan'208";a="156287669" Received: from mail-dm6nam12lp2177.outbound.protection.outlook.com (HELO NAM12-DM6-obe.outbound.protection.outlook.com) ([104.47.59.177]) by ob1.hgst.iphmx.com with ESMTP; 30 Dec 2020 11:33:44 +0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OoqFPBtcRl8QJvrmras2HSz4nCrpCTBvNZVtpdgzzkndoUl1Igf7cssno+uUrDJl9JQD1lkUu+uUNr1l6kRoFB6HJs04hnnrx4L4QzvokbXEMgIoenvAk6E1l4wRw3gw9vqZRsnnN1WgI+03NfHMP84bIoAQ9L8zIr2GZMjWjMTApritNWokM8OAGM3ZGK9w6vFwp8v6GuFRYqN5wzdOGu1rigxIhwCEBUMJ41qLJA8zUTrKQQ3WI7dEUSLWzXNA/Ib77vA8p+PVmraDoHDkgE3hDOFicvfiP2zS5YN1fmvyKFrN51oQ1GQGncKw+hJ55Q8VWNoYzGNga6+daU+UhA== 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-SenderADCheck; bh=IeOl6qAToNSOy4GVso+fHSfkCHU2gMYTi2XIBTWAFzU=; b=kKL58kFyHu/fPl8wxMETDOX/xD0S1mH22tDY9i4lQrJaqtuQcaZo9MlO48JgmkVa7B3bS+fr8UsPqZTKEyt5TSprmr+4CTRRrl4NRmYr2EEWobyEq9nGPQmag7jgOMcj1/InmFSR7I721izSfl77uAQL3bGmLJFBeIX6lziqmY2EImuky3HkwgvuEMSh/PMc2eGw3W2TjOV2/y3olgd9SYZS21qf9i91XaW5s+mT0pk3dbp+ERnyC7Kgl8T1ogE29+o9oeJU/GrZFNDoHcA99vZ4QSGBSiQiv3IEAckiqZF4k5lzTiNqtUhaiXg/KOnercWd5r6OHZ+hCJ9KAGDhEg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wdc.com; dmarc=pass action=none header.from=wdc.com; dkim=pass header.d=wdc.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sharedspace.onmicrosoft.com; s=selector2-sharedspace-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=IeOl6qAToNSOy4GVso+fHSfkCHU2gMYTi2XIBTWAFzU=; b=PLKtM2/1lY1cmr7B0VE7CRtsJ4DPB9zicNdRuxx83iqqgJJ0f993Xh91m/LS9oCJ8konSzLrjimDODpnCH5DziCaeCjF8sMWUEDxtRoo6w4S2V+Dcvoc+j/4iTct7aeMfnaMd1fd/eLGi33kp80ZutEPTdlP+XnOA5/Lda7klA4= Authentication-Results: wdc.com; dkim=none (message not signed) header.d=none;wdc.com; dmarc=none action=none header.from=wdc.com; Received: from DM6PR04MB6201.namprd04.prod.outlook.com (2603:10b6:5:127::32) by DM6PR04MB5754.namprd04.prod.outlook.com (2603:10b6:5:16c::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3700.31; Wed, 30 Dec 2020 03:33:43 +0000 Received: from DM6PR04MB6201.namprd04.prod.outlook.com ([fe80::2513:b200:bdc8:b97]) by DM6PR04MB6201.namprd04.prod.outlook.com ([fe80::2513:b200:bdc8:b97%5]) with mapi id 15.20.3721.020; Wed, 30 Dec 2020 03:33:43 +0000 From: Anup Patel To: Atish Patra , Alistair Francis Subject: [PATCH 1/3] lib: sbi: Replace args with trap registers in ecall handler Date: Wed, 30 Dec 2020 09:03:02 +0530 Message-Id: <20201230033304.295706-2-anup.patel@wdc.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201230033304.295706-1-anup.patel@wdc.com> References: <20201230033304.295706-1-anup.patel@wdc.com> X-Originating-IP: [122.182.250.184] X-ClientProxiedBy: MA1PR01CA0138.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a00:35::32) To DM6PR04MB6201.namprd04.prod.outlook.com (2603:10b6:5:127::32) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from wdc.com (122.182.250.184) by MA1PR01CA0138.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a00:35::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.20 via Frontend Transport; Wed, 30 Dec 2020 03:33:41 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: bef8ae7b-2249-4d7f-bccd-08d8ac73b4fc X-MS-TrafficTypeDiagnostic: DM6PR04MB5754: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: WDCIPOUTBOUND: EOP-TRUE X-MS-Oob-TLC-OOBClassifiers: OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: bsT/kZfo0csOGFQ973lzcrnAynF/IMCaai6AT5M5DsD1jSjUbLKhgPxrpSHIEfxZhZ4m2uNy4I9sHGWx1u6PFdiE+yksrYzdaxN2MlwirXIqH2YuFyhbi3fcrN4yxPSZguY7lk0TrD5HoAAX1S9sL0woimpIlQNzVufJHZb2z8mmpz3uPt/6dBa5f4WAoVZsnSqIBn4mEajEBr7nX8X2gWqL0q0Cg08YDZuE2qv4c/JgZVi905+tt/apMBgIXjEPBzeaElPgo7xj3cZUoqlEj0/fKkwVLTuudJE2gy0HvFC2gJFrEpo5hsSc2S6h92oPv53xDEa+V47ZA9UDoGaJ1Ug3sh2N+14aXzPy2cP5krf1VO8hL7OaxXQAygVZIIhO+v7CqKAWo73qrNYc8R7UNA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR04MB6201.namprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(346002)(366004)(39860400002)(136003)(376002)(396003)(83380400001)(86362001)(66946007)(4326008)(8886007)(2906002)(30864003)(36756003)(55016002)(66556008)(6636002)(1076003)(66476007)(316002)(44832011)(8676002)(16526019)(7696005)(54906003)(6666004)(478600001)(5660300002)(52116002)(110136005)(2616005)(186003)(8936002)(26005)(956004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData: ZT2vZEeBVBwDrmm1eKmydx1P0zhc3WH1omJgx0hB07z8oJMMJk9uJzuPRyHX8kscJWDHhl+gBeBjHDkXsktSpQ5nudSZa6u72wMha5R9ThtNcxw2l8bMdBcORmBvRme6T9bz1Q574Te9NYMGQ3xdY7fPNFiCNqiYAGUjbJVpaiHVTqIiO6fcd0pztzdlHp8Ie1QXsM76EamWSfLeUdEqGdcXoLYCFCgiTGQskDZO/bowXAZHR+Qk4QCI9ZncqEDhNBAndScDn3tHLr1y9u7ez19dRcqmvQ4WG2cD655fGKsS5g5RhRIpDhAUeAna35qeYfnyo9ym4DJ486Lg9QRk0VaEPboepI9GvkW0yJlzec06TgILLY6XHAIe5mPL2dBisOyxPHisRZ43CX9eIxW2ThupXvyWpR3of14s9xfFPZvMw1JoFnd2rHFhcTptUTinHLCp+9Z5SA+pqjuC1Gd1NxEPOpVrdSR6bTbyJFoJwPQfjswRo25yCAhHCUoQCUEGC8mZEW8vZPNOyhaE7Yaavf0fyVw+ucqjs2KZisO6N26mQvLrcLcd1pR/zf7koJ97t3XV8p9ZBa9p/sT+2QYl4pKrGkjEQuPo8nb9r+JGWesYRfGyInprarr+tH8XsdlzXNvvOnss+An8Ehn1ZW2dYIrAjn/j7SU/JElk+ymBRZLkKnsotXyQqEH0utkQtm96lvwBAnJQZZB111aBJWuQC7fDf8jmzdTIZ9bNnRCuHdd2JwY80+IIQ+rlRHQ6F1ZtsvJ8MFQC7tzJGKq0Qet1VR2Hayo7WOS12w3WUI+9gNbqr+6RiGecxaF99h77StD76ms1TJMS8K82QGb+9ufK+NIdS+kb1HNF4jwI0vMzHBqOZqcUPRpxV3sGcEoGDkNfXyA0O//9sm7JrVzEny/ncYDPiOsJsE910HrRMhEEEIU/zLLZMSLhl82TeErC33l1cBU6IfkfRH8vTwUbXtMyzbIR3HRkFJDQ/+2u0KZMqy7mcYno9GIL9AWS9vR/ZWVF X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-AuthSource: DM6PR04MB6201.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Dec 2020 03:33:42.9604 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b61c8803-16f3-4c35-9b17-6f65f441df86 X-MS-Exchange-CrossTenant-Network-Message-Id: bef8ae7b-2249-4d7f-bccd-08d8ac73b4fc X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 4Cn3ycYIfvVc6tQxwfXhlr+TvCZ/WvLGtn46sDxpGym5li1q7d2aMBpzRKLBboqSsk15/0Ib+492On6fV1vi7w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR04MB5754 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201229_223347_088316_0CE1364B X-CRM114-Status: GOOD ( 20.01 ) X-Spam-Score: -0.9 (/) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-0.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at https://www.dnswl.org/, low trust [216.71.154.42 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.0 MSGID_FROM_MTA_HEADER Message-Id was added by a relay X-BeenThere: opensbi@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Anup Patel , Anup Patel , opensbi@lists.infradead.org Sender: "opensbi" Errors-To: opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org We had added args pointer in ecall handler to ensure that ecall handler only implements functionality and does not deal with SBI calling convention. This also helped us to keep SBI calling convention related code in one place at sbi_ecall_handler(). The Keystone Enclavce project needs access to the trap regsiters in their ecall handler so that they can context switch enclaves in custom SBI calls. To help the Keystone Enclave project, we replace the args pointer in ecall handler parameter with a const pointer to trap registers. Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- include/sbi/sbi_ecall.h | 3 +- include/sbi/sbi_platform.h | 9 ++--- lib/sbi/sbi_ecall.c | 10 +----- lib/sbi/sbi_ecall_base.c | 6 ++-- lib/sbi/sbi_ecall_hsm.c | 8 +++-- lib/sbi/sbi_ecall_legacy.c | 25 +++++++------- lib/sbi/sbi_ecall_replace.c | 59 ++++++++++++++++++--------------- lib/sbi/sbi_ecall_vendor.c | 6 ++-- platform/andes/ae350/platform.c | 19 ++++++----- 9 files changed, 76 insertions(+), 69 deletions(-) diff --git a/include/sbi/sbi_ecall.h b/include/sbi/sbi_ecall.h index 1ef86e2..d357085 100644 --- a/include/sbi/sbi_ecall.h +++ b/include/sbi/sbi_ecall.h @@ -26,7 +26,8 @@ struct sbi_ecall_extension { unsigned long extid_end; int (* probe)(unsigned long extid, unsigned long *out_val); int (* handle)(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap); }; diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h index 58aba71..7b8fe89 100644 --- a/include/sbi/sbi_platform.h +++ b/include/sbi/sbi_platform.h @@ -47,6 +47,7 @@ struct sbi_domain; struct sbi_trap_info; +struct sbi_trap_regs; /** Possible feature flags of a platform */ enum sbi_platform_features { @@ -146,7 +147,7 @@ struct sbi_platform_operations { int (*vendor_ext_check)(long extid); /** platform specific SBI extension implementation provider */ int (*vendor_ext_provider)(long extid, long funcid, - unsigned long *args, + const struct sbi_trap_regs *regs, unsigned long *out_value, struct sbi_trap_info *out_trap); } __packed; @@ -710,7 +711,7 @@ static inline int sbi_platform_vendor_ext_check(const struct sbi_platform *plat, * @param plat pointer to struct sbi_platform * @param extid vendor SBI extension id * @param funcid SBI function id within the extension id - * @param args pointer to arguments passed by the caller + * @param regs pointer to trap registers passed by the caller * @param out_value output value that can be filled by the callee * @param out_trap trap info that can be filled by the callee * @@ -719,13 +720,13 @@ static inline int sbi_platform_vendor_ext_check(const struct sbi_platform *plat, static inline int sbi_platform_vendor_ext_provider( const struct sbi_platform *plat, long extid, long funcid, - unsigned long *args, + const struct sbi_trap_regs *regs, unsigned long *out_value, struct sbi_trap_info *out_trap) { if (plat && sbi_platform_ops(plat)->vendor_ext_provider) { return sbi_platform_ops(plat)->vendor_ext_provider(extid, - funcid, args, + funcid, regs, out_value, out_trap); } diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c index 6d41cff..e92a539 100644 --- a/lib/sbi/sbi_ecall.c +++ b/lib/sbi/sbi_ecall.c @@ -101,19 +101,11 @@ int sbi_ecall_handler(struct sbi_trap_regs *regs) struct sbi_trap_info trap = {0}; unsigned long out_val = 0; bool is_0_1_spec = 0; - unsigned long args[6]; - - args[0] = regs->a0; - args[1] = regs->a1; - args[2] = regs->a2; - args[3] = regs->a3; - args[4] = regs->a4; - args[5] = regs->a5; ext = sbi_ecall_find_extension(extension_id); if (ext && ext->handle) { ret = ext->handle(extension_id, func_id, - args, &out_val, &trap); + regs, &out_val, &trap); if (extension_id >= SBI_EXT_0_1_SET_TIMER && extension_id <= SBI_EXT_0_1_SHUTDOWN) is_0_1_spec = 1; diff --git a/lib/sbi/sbi_ecall_base.c b/lib/sbi/sbi_ecall_base.c index 53c93c8..786d2ac 100644 --- a/lib/sbi/sbi_ecall_base.c +++ b/lib/sbi/sbi_ecall_base.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -32,7 +33,8 @@ static int sbi_ecall_base_probe(unsigned long extid, unsigned long *out_val) } static int sbi_ecall_base_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; @@ -61,7 +63,7 @@ static int sbi_ecall_base_handler(unsigned long extid, unsigned long funcid, *out_val = csr_read(CSR_MIMPID); break; case SBI_EXT_BASE_PROBE_EXT: - ret = sbi_ecall_base_probe(args[0], out_val); + ret = sbi_ecall_base_probe(regs->a0, out_val); break; default: ret = SBI_ENOTSUPP; diff --git a/lib/sbi/sbi_ecall_hsm.c b/lib/sbi/sbi_ecall_hsm.c index 376740c..df29d51 100644 --- a/lib/sbi/sbi_ecall_hsm.c +++ b/lib/sbi/sbi_ecall_hsm.c @@ -11,13 +11,15 @@ #include #include #include +#include #include #include #include #include static int sbi_ecall_hsm_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { ulong smode; @@ -29,14 +31,14 @@ static int sbi_ecall_hsm_handler(unsigned long extid, unsigned long funcid, smode = csr_read(CSR_MSTATUS); smode = (smode & MSTATUS_MPP) >> MSTATUS_MPP_SHIFT; ret = sbi_hsm_hart_start(scratch, sbi_domain_thishart_ptr(), - args[0], args[1], smode, args[2]); + regs->a0, regs->a1, smode, regs->a2); break; case SBI_EXT_HSM_HART_STOP: ret = sbi_hsm_hart_stop(scratch, TRUE); break; case SBI_EXT_HSM_HART_GET_STATUS: hstate = sbi_hsm_hart_get_state(sbi_domain_thishart_ptr(), - args[0]); + regs->a0); ret = sbi_hsm_hart_state_to_status(hstate); break; default: diff --git a/lib/sbi/sbi_ecall_legacy.c b/lib/sbi/sbi_ecall_legacy.c index 7844fbb..8afeb00 100644 --- a/lib/sbi/sbi_ecall_legacy.c +++ b/lib/sbi/sbi_ecall_legacy.c @@ -43,7 +43,8 @@ static int sbi_load_hart_mask_unpriv(ulong *pmask, ulong *hmask, } static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; @@ -54,13 +55,13 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, switch (extid) { case SBI_EXT_0_1_SET_TIMER: #if __riscv_xlen == 32 - sbi_timer_event_start((((u64)args[1] << 32) | (u64)args[0])); + sbi_timer_event_start((((u64)regs->a1 << 32) | (u64)regs->a0)); #else - sbi_timer_event_start((u64)args[0]); + sbi_timer_event_start((u64)regs->a0); #endif break; case SBI_EXT_0_1_CONSOLE_PUTCHAR: - sbi_putc(args[0]); + sbi_putc(regs->a0); break; case SBI_EXT_0_1_CONSOLE_GETCHAR: ret = sbi_getc(); @@ -69,13 +70,13 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, sbi_ipi_clear_smode(); break; case SBI_EXT_0_1_SEND_IPI: - ret = sbi_load_hart_mask_unpriv((ulong *)args[0], + ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0, &hmask, out_trap); if (ret != SBI_ETRAP) ret = sbi_ipi_send_smode(hmask, 0); break; case SBI_EXT_0_1_REMOTE_FENCE_I: - ret = sbi_load_hart_mask_unpriv((ulong *)args[0], + ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0, &hmask, out_trap); if (ret != SBI_ETRAP) { SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0, @@ -84,21 +85,21 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, } break; case SBI_EXT_0_1_REMOTE_SFENCE_VMA: - ret = sbi_load_hart_mask_unpriv((ulong *)args[0], + ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0, &hmask, out_trap); if (ret != SBI_ETRAP) { - SBI_TLB_INFO_INIT(&tlb_info, args[1], args[2], 0, 0, + SBI_TLB_INFO_INIT(&tlb_info, regs->a1, regs->a2, 0, 0, SBI_TLB_FLUSH_VMA, source_hart); ret = sbi_tlb_request(hmask, 0, &tlb_info); } break; case SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID: - ret = sbi_load_hart_mask_unpriv((ulong *)args[0], + ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0, &hmask, out_trap); if (ret != SBI_ETRAP) { - SBI_TLB_INFO_INIT(&tlb_info, args[1], args[2], args[3], - 0, SBI_TLB_FLUSH_VMA_ASID, - source_hart); + SBI_TLB_INFO_INIT(&tlb_info, regs->a1, + regs->a2, regs->a3, 0, + SBI_TLB_FLUSH_VMA_ASID, source_hart); ret = sbi_tlb_request(hmask, 0, &tlb_info); } break; diff --git a/lib/sbi/sbi_ecall_replace.c b/lib/sbi/sbi_ecall_replace.c index d06dfa2..a95821b 100644 --- a/lib/sbi/sbi_ecall_replace.c +++ b/lib/sbi/sbi_ecall_replace.c @@ -17,18 +17,20 @@ #include #include #include +#include static int sbi_ecall_time_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; if (funcid == SBI_EXT_TIME_SET_TIMER) { #if __riscv_xlen == 32 - sbi_timer_event_start((((u64)args[1] << 32) | (u64)args[0])); + sbi_timer_event_start((((u64)regs->a1 << 32) | (u64)regs->a0)); #else - sbi_timer_event_start((u64)args[0]); + sbi_timer_event_start((u64)regs->a0); #endif } else ret = SBI_ENOTSUPP; @@ -43,7 +45,8 @@ struct sbi_ecall_extension ecall_time = { }; static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; @@ -60,41 +63,41 @@ static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid, case SBI_EXT_RFENCE_REMOTE_FENCE_I: SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0, SBI_ITLB_FLUSH, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA: - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], 0, 0, + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, SBI_TLB_FLUSH_GVMA, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID: - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], 0, args[4], + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, regs->a4, SBI_TLB_FLUSH_GVMA_VMID, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA: vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); vmid = vmid >> HGATP_VMID_SHIFT; - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], 0, vmid, + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, vmid, SBI_TLB_FLUSH_VVMA, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID: vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); vmid = vmid >> HGATP_VMID_SHIFT; - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], args[4], vmid, - SBI_TLB_FLUSH_VVMA_ASID, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, + vmid, SBI_TLB_FLUSH_VVMA_ASID, source_hart); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA: - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], 0, 0, + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, SBI_TLB_FLUSH_VMA, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID: - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], args[4], 0, + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, 0, SBI_TLB_FLUSH_VMA_ASID, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; default: ret = SBI_ENOTSUPP; @@ -110,13 +113,14 @@ struct sbi_ecall_extension ecall_rfence = { }; static int sbi_ecall_ipi_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; if (funcid == SBI_EXT_IPI_SEND_IPI) - ret = sbi_ipi_send_smode(args[0], args[1]); + ret = sbi_ipi_send_smode(regs->a0, regs->a1); else ret = SBI_ENOTSUPP; @@ -130,15 +134,16 @@ struct sbi_ecall_extension ecall_ipi = { }; static int sbi_ecall_srst_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { if (funcid == SBI_EXT_SRST_RESET) { - if ((((u32)-1U) <= ((u64)args[0])) || - (((u32)-1U) <= ((u64)args[1]))) + if ((((u32)-1U) <= ((u64)regs->a0)) || + (((u32)-1U) <= ((u64)regs->a1))) return SBI_EINVAL; - switch (args[0]) { + switch (regs->a0) { case SBI_SRST_RESET_TYPE_SHUTDOWN: case SBI_SRST_RESET_TYPE_COLD_REBOOT: case SBI_SRST_RESET_TYPE_WARM_REBOOT: @@ -147,7 +152,7 @@ static int sbi_ecall_srst_handler(unsigned long extid, unsigned long funcid, return SBI_ENOTSUPP; } - switch (args[1]) { + switch (regs->a1) { case SBI_SRST_RESET_REASON_NONE: case SBI_SRST_RESET_REASON_SYSFAIL: break; @@ -155,8 +160,8 @@ static int sbi_ecall_srst_handler(unsigned long extid, unsigned long funcid, return SBI_ENOTSUPP; } - if (sbi_system_reset_supported(args[0], args[1])) - sbi_system_reset(args[0], args[1]); + if (sbi_system_reset_supported(regs->a0, regs->a1)) + sbi_system_reset(regs->a0, regs->a1); } return SBI_ENOTSUPP; diff --git a/lib/sbi/sbi_ecall_vendor.c b/lib/sbi/sbi_ecall_vendor.c index 34c0be6..9252829 100644 --- a/lib/sbi/sbi_ecall_vendor.c +++ b/lib/sbi/sbi_ecall_vendor.c @@ -12,6 +12,7 @@ #include #include #include +#include static int sbi_ecall_vendor_probe(unsigned long extid, unsigned long *out_val) @@ -22,11 +23,12 @@ static int sbi_ecall_vendor_probe(unsigned long extid, } static int sbi_ecall_vendor_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { return sbi_platform_vendor_ext_provider(sbi_platform_thishart_ptr(), - extid, funcid, args, + extid, funcid, regs, out_val, out_trap); } diff --git a/platform/andes/ae350/platform.c b/platform/andes/ae350/platform.c index 6d6ce4e..aec91cd 100644 --- a/platform/andes/ae350/platform.c +++ b/platform/andes/ae350/platform.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -116,7 +117,7 @@ static int ae350_timer_init(bool cold_boot) /* Vendor-Specific SBI handler */ static int ae350_vendor_ext_provider(long extid, long funcid, - unsigned long *args, unsigned long *out_value, + const struct sbi_trap_regs *regs, unsigned long *out_value, struct sbi_trap_info *out_trap) { int ret = 0; @@ -128,28 +129,28 @@ static int ae350_vendor_ext_provider(long extid, long funcid, *out_value = csr_read(CSR_MMISCCTL); break; case SBI_EXT_ANDES_SET_MCACHE_CTL: - ret = mcall_set_mcache_ctl(args[0]); + ret = mcall_set_mcache_ctl(regs->a0); break; case SBI_EXT_ANDES_SET_MMISC_CTL: - ret = mcall_set_mmisc_ctl(args[0]); + ret = mcall_set_mmisc_ctl(regs->a0); break; case SBI_EXT_ANDES_ICACHE_OP: - ret = mcall_icache_op(args[0]); + ret = mcall_icache_op(regs->a0); break; case SBI_EXT_ANDES_DCACHE_OP: - ret = mcall_dcache_op(args[0]); + ret = mcall_dcache_op(regs->a0); break; case SBI_EXT_ANDES_L1CACHE_I_PREFETCH: - ret = mcall_l1_cache_i_prefetch_op(args[0]); + ret = mcall_l1_cache_i_prefetch_op(regs->a0); break; case SBI_EXT_ANDES_L1CACHE_D_PREFETCH: - ret = mcall_l1_cache_d_prefetch_op(args[0]); + ret = mcall_l1_cache_d_prefetch_op(regs->a0); break; case SBI_EXT_ANDES_NON_BLOCKING_LOAD_STORE: - ret = mcall_non_blocking_load_store(args[0]); + ret = mcall_non_blocking_load_store(regs->a0); break; case SBI_EXT_ANDES_WRITE_AROUND: - ret = mcall_write_around(args[0]); + ret = mcall_write_around(regs->a0); break; default: sbi_printf("Unsupported vendor sbi call : %ld\n", funcid); From patchwork Wed Dec 30 03:33:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anup Patel X-Patchwork-Id: 1421306 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2001:8b0:10b:1231::1; helo=merlin.infradead.org; envelope-from=opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=wdc.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=merlin.20170209 header.b=1jby1jSg; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=wdc.com header.i=@wdc.com header.a=rsa-sha256 header.s=dkim.wdc.com header.b=AN1GjDm+; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=sharedspace.onmicrosoft.com header.i=@sharedspace.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-sharedspace-onmicrosoft-com header.b=arJ/6WjG; dkim-atps=neutral Received: from merlin.infradead.org (merlin.infradead.org [IPv6:2001:8b0:10b:1231::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4D5H2J022Cz9sVb for ; Wed, 30 Dec 2020 14:33:59 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=NN6xRnkrmJbs+MkOUP/xhEDuBVpiv6g50fcyhSe0oNQ=; b=1jby1jSgcUiPtdljUuqPNImnU JpIr/XVfqNprA8620YyLYbdzc9f9Fww81NOXz8jj1hv7bigW8TJxZKA+x15P2dDNOu/x2JyarVJxR PACgAMyERB0JZv6z6evJkG+8GToxmQy3EGgZgtc7jG4p9qxPjGYcp+q+9iVyQZBUhJX5sDb5KeXRo RyH4htDSvtsCAOVnDph6ouZfJu++W3LCa53rVunHy5R3yoGZlxfE/ZtNGUZoS4/HZhUlNeARbfC1I hmQv5X6HMp6jd/xvMyhxvc5bO5XP1n359Afg8v91ghPl2DcgjQlyTra/G3ebjSI8oZ6zNcRo8vtnZ UMNqilQAw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kuSFG-0000vW-C3; Wed, 30 Dec 2020 03:33:54 +0000 Received: from esa1.hgst.iphmx.com ([68.232.141.245]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kuSFB-0000tJ-I2 for opensbi@lists.infradead.org; Wed, 30 Dec 2020 03:33:52 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1609299229; x=1640835229; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=KtBtVe1eL6ti9IF8IUT4owTY9NcItZXRBDqNQBdtHHs=; b=AN1GjDm+ZjWoyGPyKNe6VF0zwk8qtPjp34xEnfok1Ora5qv28NOwfRLF +XMZr5L+YO3KzwQz1e9JAe5AGu7cwxdOxpaX0x+T1WjPcseuL27RJVMoc vuXlCKoPpWRM9JrwywuG7690y/CTFTX1srk1WtV6ld/7Oo6DYWSbT5Q5o AWCZGkvACTApBnPa4+R12bJNXF9vYjScj6Zf92x59DbAHsRJM8s3c95EN 2ECxKxpvwIiP2o6oKjlBt6lCN3d+RldO9lFvn8l5xFFyqwSijG24CF5Fs 8PQeygkWfooXSPvu8XSDbP+MNrxvs6cftwQTz8fe6a02UvLnYBR4uUs4b A==; IronPort-SDR: TOFYElRuG7jU2sUccwV9i1MaNsJLcxvKSG7Cf91mQ0NebWgE6TusG4OOD9LCgmdphXzTE+/VS3 neKdhUeARPXsZuwzDf+HH6rwazpkyz63bw1VJuqGEJ3Q4MgFzKlkyLxUvR2CkXuMlbmkWPlgux 7ORsytE1xWD8ih7xN0HlJnILoQHEYNXTZ8wyAP97POCoYuPF2t7KROYDCzTXExHuaZG3qbxASO ckZPACL0c+INZASLV7Cg+VhRIPuqitSsu6y11VWyPVn18qihm//ZnGU+l8Lk/1/KP5+RDO+Q4p mUY= X-IronPort-AV: E=Sophos;i="5.78,460,1599494400"; d="scan'208";a="266489254" Received: from mail-cys01nam02lp2058.outbound.protection.outlook.com (HELO NAM02-CY1-obe.outbound.protection.outlook.com) ([104.47.37.58]) by ob1.hgst.iphmx.com with ESMTP; 30 Dec 2020 11:33:47 +0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LZuoQhI8B+mZxUWDmUJ5nev042tqlId+cAk5N64DzlVLM4Z3dwTPaLcHsq3LOD8ROfeRwODehKaIwxIEWNPcBnFg/1JvFizQukzebDtjqdRKqveQ+Jk38wa/5ih7Hv6Wts9ahXGizRbGFzWc/w6VRokw9RR6Xt+EPvylIu2dB7B6Df9QcIX3aDsGjFLGRs6rKxFY/QVXN6nMgb3+RrkHoIDwwIe2CYNE4vFv0AQ+qIgomsZDU6Pog0H+MyDQL3ZZ1K16S5D5HupFQh67/YQ9hCKc8te4aG0zLnH2YjmKA22xEb9r4uv4JWWbTFwtTk05r36A8kx92EW51TX7smOkZg== 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-SenderADCheck; bh=YSd5dycD1c2STuYY4EyFuzCwWPTX1WkY45TgHbznvmA=; b=UuNKfAIzoIa1IOXLD/Q9Tyq9wbX9zJooyNyLtwGfg7Tuxn5EDTkTAaK6/TVp/HJ/kH0itK24AU0hjT3couYBQ0RtbwrRQBk5l6tz1/hIffW0SkywsDKwfLeutF1MLmO0oEz8gFJL9yUDyoU7QpEar1QS9WzmFdqmEbG/Y4JobpwRFMVBihse+1zKTAgtpJuYjgchsyCsgB/zZ5nLBKvJTg9gaxj+cqeEi9lhrL+Gg9JoVpTYGAbUuj5/NFjNleasYN9XFBxy8t1b31xyjSg0N99O16Qm1/DuQIgLaH5t1nuoKGfX0M1sY5E2RBfIys9s5X9cxnzU7blxZUFZu72b6Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wdc.com; dmarc=pass action=none header.from=wdc.com; dkim=pass header.d=wdc.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sharedspace.onmicrosoft.com; s=selector2-sharedspace-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YSd5dycD1c2STuYY4EyFuzCwWPTX1WkY45TgHbznvmA=; b=arJ/6WjG/wYL6o6ONRyXlt1BkjTxaKaict/IDj/2sIFLRtiwGxQWQBycHwZ3tn6TTdaWo61g0X4vnfMNqfFlQ2mssOEq+xTGhxmQDrC7XgGBwwWZ2SeSlr7+bpGd4VfTX4l9Kl1jGzfAU+MEReD+4QZh26ILFVFG/MEDotsAR2w= Authentication-Results: wdc.com; dkim=none (message not signed) header.d=none;wdc.com; dmarc=none action=none header.from=wdc.com; Received: from DM6PR04MB6201.namprd04.prod.outlook.com (2603:10b6:5:127::32) by DM6PR04MB5754.namprd04.prod.outlook.com (2603:10b6:5:16c::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3700.31; Wed, 30 Dec 2020 03:33:45 +0000 Received: from DM6PR04MB6201.namprd04.prod.outlook.com ([fe80::2513:b200:bdc8:b97]) by DM6PR04MB6201.namprd04.prod.outlook.com ([fe80::2513:b200:bdc8:b97%5]) with mapi id 15.20.3721.020; Wed, 30 Dec 2020 03:33:45 +0000 From: Anup Patel To: Atish Patra , Alistair Francis Subject: [PATCH 2/3] lib: sbi: Introduce sbi_trap_exit() API Date: Wed, 30 Dec 2020 09:03:03 +0530 Message-Id: <20201230033304.295706-3-anup.patel@wdc.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201230033304.295706-1-anup.patel@wdc.com> References: <20201230033304.295706-1-anup.patel@wdc.com> X-Originating-IP: [122.182.250.184] X-ClientProxiedBy: MA1PR01CA0138.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a00:35::32) To DM6PR04MB6201.namprd04.prod.outlook.com (2603:10b6:5:127::32) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from wdc.com (122.182.250.184) by MA1PR01CA0138.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a00:35::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.20 via Frontend Transport; Wed, 30 Dec 2020 03:33:43 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: f2bd0ef6-b24d-4715-db4a-08d8ac73b685 X-MS-TrafficTypeDiagnostic: DM6PR04MB5754: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: WDCIPOUTBOUND: EOP-TRUE X-MS-Oob-TLC-OOBClassifiers: OLM:2803; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: bmgzPV7QOM9oqFz3UGKB5wqssYkn+3Ke2EZ0VUPe/I92ItFq35dgT5jG/9CHW1wRGp6sSmCiPNerFR134PH1F7RaR9vhAU8zQA3+NFjbfrOVuDpPT7JYjAS4DPgPm6fFTQPAReLS+E8FKKQKod086lm85/hZMcZbq8441NJtG9mibbugxrEI2KMcRgQKzYEdsq3LJDR3J9pZ1OfnyyNvqv+FfkILQOZDI1nNuFaJn3JEnw9R8meza5x52+HhButa5qQ6XCz5UQL8EApkFKpRmwoLn/fCIbF8zXI0TLQNleaErXiqTLOi+0e4b86FA/XuDg5Nl36xFtsXDLtKZoy1imUQ87UDHlvY5ud9ps+F2JhJ/kudypC0DGbVf5cxNTAkocwTa9FUTeg7A2puKjq/pg== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR04MB6201.namprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(346002)(366004)(39860400002)(136003)(376002)(396003)(83380400001)(86362001)(66946007)(4326008)(8886007)(2906002)(36756003)(55016002)(66556008)(6636002)(1076003)(66476007)(316002)(44832011)(8676002)(16526019)(7696005)(54906003)(6666004)(478600001)(5660300002)(52116002)(110136005)(2616005)(186003)(8936002)(26005)(956004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData: 0ye6IUV5WbGHu1f1lGuACaP+24i84XJrWY8bY8Nd4GlSaLY5/DOt3k8P/AF1p/BGpj/8QvOPVXI/g0dEwXAsdqOuy4FtPk66ncrm8bTQL3tNeG+USapeKo9/ShcrVxzjRJ4r7U9/aQ73sLhc5yrDz/LVzpM/ZO0a4IZvPWdgfqOBuzquvV2Vh3sGqol1Mixf0D649DJD8dscvlXqhxdpGyiDE2mk7t2y2osg8A9DrxKo04MC8sW5agkaKh9u7LdBLYWo9+Zw+8C9nGEgD4esn2E3NWPMasSJdDIFYELk60z/fgLys4qFPNQYIZHRn/jmjqDw6KFgtmmW+xyZ5x9RYTxAkHvYwzWg7iPeRRU8x+1tTmggreDdbc/y4k54qZGwd3Id4kBExXIGJb9wISKX27JJUMByzSRhHwTrSdmiRQpuIGDXvwH9u9AT/Kb7hAZQgSlBfwMk61XrlcvLG0CO2c2Wen72QAHGMqDgdFynyr9jv2D8fgNKQ2Aky8/mwZskX9xIFHRDfAkG7ygKbYCVxTzHzLV5+pEJgKB6Da0Kz+DD0+hIMLvDlIwPedy0ZY+3IIairEVsG7n8mE9B4v74eSxhVIg9JPNbJGGYmMTCFRF0C6/Er1CqeOSWwFzVJrbQLgBx5S+4vasDqNWk0UuE6G/PE4tEZ64wyF1ZHIMdjPzX591utwzj5dNxc4PDn7e1qMNqS5z5FkZVZbO06+a/S41WzvLEfGY1S+F2ov+vkJz90c+NyZ6sD+dmJiZ5KykLTBa7qKCEceo1hGWD/mZEtVUfAhAK6S2ecLLjrwKY/GISpiNobXozGcpLlosZWWpFCkdWvdY5iZ9rjuenftiNUIX1iAHuc9ycFgmzLU7THYyq8nOpUSLX5yo7Nzfa1HZ+PK4VKpDPMMdA6jxqh7dBNAzGr6cUe4Zr73ELGr8rJBN4WLHoJkogWHX+mI5R9ZcfJ6Hz5RVu0St6ZLUGMr8Kx3NLl+Y/wRLZS5pDtoFN0uae/kxZReNLSGM9xkpepidq X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-AuthSource: DM6PR04MB6201.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Dec 2020 03:33:45.5857 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b61c8803-16f3-4c35-9b17-6f65f441df86 X-MS-Exchange-CrossTenant-Network-Message-Id: f2bd0ef6-b24d-4715-db4a-08d8ac73b685 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: uYNVsTFNOsxeRyFk1BU3SaVWotuIWaC8TGfSPVV/V1mlMvBCr4HqJdjPxdWkIzZcfF0Qfod+I37EPxj9u+w9Qw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR04MB5754 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201229_223350_613943_9B3CD001 X-CRM114-Status: GOOD ( 18.75 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [68.232.141.245 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.0 MSGID_FROM_MTA_HEADER Message-Id was added by a relay X-BeenThere: opensbi@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Anup Patel , Anup Patel , opensbi@lists.infradead.org Sender: "opensbi" Errors-To: opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org We introduce sbi_trap_exit() API which can help non-firmware (i.e. generic or platform) code to force exit trap/interrupt handling and resume execution at context pointed by parameter "const struct sbi_trap_regs *regs". This new sbi_trap_exit() API will help Keystone Enclave project to resume execution of enclave from custom SBI call handler. Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- firmware/fw_base.S | 43 +++++++++++++++++++++++++++++++++++++++ include/sbi/sbi_scratch.h | 10 ++++++--- include/sbi/sbi_trap.h | 2 ++ lib/sbi/sbi_trap.c | 20 ++++++++++++++++++ 4 files changed, 72 insertions(+), 3 deletions(-) diff --git a/firmware/fw_base.S b/firmware/fw_base.S index fb504e8..ab33e11 100644 --- a/firmware/fw_base.S +++ b/firmware/fw_base.S @@ -261,6 +261,9 @@ _scratch_init: /* Store hartid-to-scratch function address in scratch space */ la a4, _hartid_to_scratch REG_S a4, SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET(tp) + /* Store trap-exit function address in scratch space */ + la a4, _trap_exit + REG_S a4, SBI_SCRATCH_TRAP_EXIT_OFFSET(tp) /* Clear tmp0 in scratch space */ REG_S zero, SBI_SCRATCH_TMP0_OFFSET(tp) /* Store firmware options in scratch space */ @@ -423,6 +426,18 @@ _skip_trap_handler_rv32_hyp: #endif csrw CSR_MTVEC, a4 +#if __riscv_xlen == 32 + /* Override trap exit for H-extension */ + csrr a5, CSR_MISA + srli a5, a5, ('H' - 'A') + andi a5, a5, 0x1 + beq a5, zero, _skip_trap_exit_rv32_hyp + la a4, _trap_exit_rv32_hyp + csrr a5, CSR_MSCRATCH + REG_S a4, SBI_SCRATCH_TRAP_EXIT_OFFSET(a5) +_skip_trap_exit_rv32_hyp: +#endif + /* Initialize SBI runtime */ csrr a0, CSR_MSCRATCH call sbi_init @@ -653,6 +668,20 @@ _trap_handler: mret + .section .entry, "ax", %progbits + .align 3 + .globl _trap_exit +_trap_exit: + add sp, a0, zero + + TRAP_RESTORE_GENERAL_REGS_EXCEPT_SP_T0 + + TRAP_RESTORE_MEPC_MSTATUS 0 + + TRAP_RESTORE_SP_T0 + + mret + #if __riscv_xlen == 32 .section .entry, "ax", %progbits .align 3 @@ -673,6 +702,20 @@ _trap_handler_rv32_hyp: TRAP_RESTORE_SP_T0 mret + + .section .entry, "ax", %progbits + .align 3 + .globl _trap_exit_rv32_hyp +_trap_exit_rv32_hyp: + add sp, a0, zero + + TRAP_RESTORE_GENERAL_REGS_EXCEPT_SP_T0 + + TRAP_RESTORE_MEPC_MSTATUS 1 + + TRAP_RESTORE_SP_T0 + + mret #endif .section .entry, "ax", %progbits diff --git a/include/sbi/sbi_scratch.h b/include/sbi/sbi_scratch.h index 9f3453d..e7079f5 100644 --- a/include/sbi/sbi_scratch.h +++ b/include/sbi/sbi_scratch.h @@ -30,12 +30,14 @@ #define SBI_SCRATCH_PLATFORM_ADDR_OFFSET (6 * __SIZEOF_POINTER__) /** Offset of hartid_to_scratch member in sbi_scratch */ #define SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET (7 * __SIZEOF_POINTER__) +/** Offset of trap_exit member in sbi_scratch */ +#define SBI_SCRATCH_TRAP_EXIT_OFFSET (8 * __SIZEOF_POINTER__) /** Offset of tmp0 member in sbi_scratch */ -#define SBI_SCRATCH_TMP0_OFFSET (8 * __SIZEOF_POINTER__) +#define SBI_SCRATCH_TMP0_OFFSET (9 * __SIZEOF_POINTER__) /** Offset of options member in sbi_scratch */ -#define SBI_SCRATCH_OPTIONS_OFFSET (9 * __SIZEOF_POINTER__) +#define SBI_SCRATCH_OPTIONS_OFFSET (10 * __SIZEOF_POINTER__) /** Offset of extra space in sbi_scratch */ -#define SBI_SCRATCH_EXTRA_SPACE_OFFSET (10 * __SIZEOF_POINTER__) +#define SBI_SCRATCH_EXTRA_SPACE_OFFSET (11 * __SIZEOF_POINTER__) /** Maximum size of sbi_scratch (4KB) */ #define SBI_SCRATCH_SIZE (0x1000) @@ -63,6 +65,8 @@ struct sbi_scratch { unsigned long platform_addr; /** Address of HART ID to sbi_scratch conversion function */ unsigned long hartid_to_scratch; + /** Address of trap exit function */ + unsigned long trap_exit; /** Temporary storage */ unsigned long tmp0; /** Options for OpenSBI library */ diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h index 5d0962f..04001df 100644 --- a/include/sbi/sbi_trap.h +++ b/include/sbi/sbi_trap.h @@ -207,6 +207,8 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs, void sbi_trap_handler(struct sbi_trap_regs *regs); +void __noreturn sbi_trap_exit(const struct sbi_trap_regs *regs); + #endif #endif diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c index db5aa2f..b7349d2 100644 --- a/lib/sbi/sbi_trap.c +++ b/lib/sbi/sbi_trap.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -271,3 +272,22 @@ trap_error: if (rc) sbi_trap_error(msg, rc, mcause, mtval, mtval2, mtinst, regs); } + +typedef void (*trap_exit_t)(const struct sbi_trap_regs *regs); + +/** + * Exit trap/interrupt handling + * + * This function is called by non-firmware code to abruptly exit + * trap/interrupt handling and resume execution at context pointed + * by given register state. + * + * @param regs pointer to register state + */ +void __noreturn sbi_trap_exit(const struct sbi_trap_regs *regs) +{ + struct sbi_scratch *scratch = sbi_scratch_thishart_ptr(); + + ((trap_exit_t)scratch->trap_exit)(regs); + __builtin_unreachable(); +} From patchwork Wed Dec 30 03:33:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anup Patel X-Patchwork-Id: 1421307 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2001:8b0:10b:1231::1; helo=merlin.infradead.org; envelope-from=opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=wdc.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=merlin.20170209 header.b=LZUUvSqs; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=wdc.com header.i=@wdc.com header.a=rsa-sha256 header.s=dkim.wdc.com header.b=h7G7QO5Q; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=sharedspace.onmicrosoft.com header.i=@sharedspace.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-sharedspace-onmicrosoft-com header.b=nQX8sHrJ; dkim-atps=neutral Received: from merlin.infradead.org (merlin.infradead.org [IPv6:2001:8b0:10b:1231::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4D5H2L0h83z9sVx for ; Wed, 30 Dec 2020 14:34:02 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=UFMfefALnlQHljNOV6FUEUYOnlYJk28e60NikYSKgpI=; b=LZUUvSqsz+370M2YW/4YGsQdY 0EsX0/AiG4HoxiV/2b6QR6pEvYAC+xYIWia2mAnqsnDwTGzIG/AKVvWvhTH4hL6UdydwbBJt1m0pv TIjP46KdqJ2kgMKYy+q6gcHQq8jnBg6+KHL2DLnA2ZnVpCtWguCtRFVj5gaFVfcTfb8+g8/pcjLCz Cn4PSlB0/j38LdrDe/7zU4gJKzaz9X5PcFdY/7ZFv3YRixo0p9aP+amwIMPydtP3wxGcZi9CXAVvB 4aI4+GWnDvcUBPuGv5RM2qNaGPctHQ7u1E5rHbN3SUIUoWuyZ7qm4ce6zMGgvEBQSyitAmi0KJpya dXTKXT9BA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kuSFG-0000vi-Sn; Wed, 30 Dec 2020 03:33:54 +0000 Received: from esa1.hgst.iphmx.com ([68.232.141.245]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kuSFC-0000tm-70 for opensbi@lists.infradead.org; Wed, 30 Dec 2020 03:33:52 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1609299230; x=1640835230; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=vD4ao51PUOEwFEsvKDNCPnirloHenGEFZtEV3DWtMVg=; b=h7G7QO5QBqcPLR2JEQdtrxjLM4WQXLJhV0QEMpzH1Ihor32gtB+RTfQK 0R7Gxi0iQCZbw/tU6BUzKqUZFlONKqxUJKT0StJ1yhu5aAo6ZlMv8waEX 6OjWRvHPNhjxZVbtlFOGGCEzunTj3WiEcRRVk3tGj8gPNrEbv/815E5dg Y9FuXaXeiz1f3yO9Vae4THj/bY1QTdVKioC6rjFhmulKlw6gzxI0ElXdg qauCeTke1OKrThzRRpWIwPfkPOXLiBs6zzAicdkrIW0ZiA8vHVNkIu6rt CyKyTBvoW1U9MqlXZCkMpD8XL3z8MOjqOojrPvdh/BWd+yJ+ma/srmOqN A==; IronPort-SDR: 8gmMEgt23G4mHJo6JNTlbQxzW7bigHgyj/Ck/GuMN5KfBb53FcY2jky9aq0rd4cwW0TVurs88i ovlB5PSjG5HlmX0zgmkH2fzHoL4uubX8tNP2XmfrFXjGAo1PQyY2BLV3du3zQ8yGiz1H04Yk5T a6wqU14xQV7k59ZwnDjm8IJIA2+66Y9/1kLfKyHp9BalGg7YasfCF37BsP88xapsX/4MIzNZxg qdhdRWkpGl+jPW1h1Zc13nLvT89zmClrMwtr1CV09g1SisbbcEOkNiuDcFY/DPTEoFbcMa9jVD Wks= X-IronPort-AV: E=Sophos;i="5.78,460,1599494400"; d="scan'208";a="266489259" Received: from mail-cys01nam02lp2056.outbound.protection.outlook.com (HELO NAM02-CY1-obe.outbound.protection.outlook.com) ([104.47.37.56]) by ob1.hgst.iphmx.com with ESMTP; 30 Dec 2020 11:33:49 +0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=J3eRC8A+EMxYKBnyaDB3Jru4GyOSS3gv1mXAnRtwBSfCUnh0r8avXa1TxUUiWkH12wg78s3/SbtxJvRVFRolJfu0+8wM/jrH1gzCofBG67zORC+kDhqiCFmml+M+hjO6g6QOZ8qX1/8qR+h/2RDdTL9TrpeLHYUgjEh1Rq4EAfCpSPZiK9LxgVRI05Eo9rvy9ETWOL9EaB5n9fg0zazHUCw/exCRWkfLazw6GFCWtovSIGv+ZR3n4HWzacjRZLQLQ2ipM6/ZNr5MerH58iZv/8xayasIgf1DtnYKlHaxZizgmFVlMdGLDlpd2JI5E5THE0LteNMs6YD54WgCJ7aIwg== 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-SenderADCheck; bh=CHdHChh/SehUlquuRLwi2Eyn+ef2FQnxwRGQuNlrCq8=; b=jZtR0M618lNheXPyQMqh2GYpy5eE/yCLHF6weSP2445h6EPcgZfluXZ/w9/NIgvB0rDmBuJRf/TU5L8M0sDnJRJHDINLVCG3MOE8fOirOwOzqMPCxzbNSgIFRRwLc3NEcuRSube46QNO5I+eCIqBVPGGZdpS9DLE5g6ELuRMIhL/bP5BQYUpmGFswheRY4ugwdt5YKbdNquZJOgN628VfubcZ+M9spmLwltSYv9WQpxQn1mVb9GSH8LrBoNnCLByyqxaCHGYUdVWgq5d6yUmg5BQRkkx9IG71vlDPVNk2NrbiljH30gikGBGJHCyncyaIMjMZGmS/hAeKQoAMsRyng== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wdc.com; dmarc=pass action=none header.from=wdc.com; dkim=pass header.d=wdc.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sharedspace.onmicrosoft.com; s=selector2-sharedspace-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CHdHChh/SehUlquuRLwi2Eyn+ef2FQnxwRGQuNlrCq8=; b=nQX8sHrJSCTDg6Tle3A64VfOaHULOcYPOH6GzD5AaKDosOUdgInSsE8fssMGKirej4XTaAoDZz6GlW6j7j/FfrnH2udp7l4sMW6e34u/vqRqN9n+ls/hFUAFot6x7ES/UcKSCEOqKihGRewLWXQaLIDf9WShGVi68JTmQTtKP/o= Authentication-Results: wdc.com; dkim=none (message not signed) header.d=none;wdc.com; dmarc=none action=none header.from=wdc.com; Received: from DM6PR04MB6201.namprd04.prod.outlook.com (2603:10b6:5:127::32) by DM6PR04MB5754.namprd04.prod.outlook.com (2603:10b6:5:16c::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3700.31; Wed, 30 Dec 2020 03:33:48 +0000 Received: from DM6PR04MB6201.namprd04.prod.outlook.com ([fe80::2513:b200:bdc8:b97]) by DM6PR04MB6201.namprd04.prod.outlook.com ([fe80::2513:b200:bdc8:b97%5]) with mapi id 15.20.3721.020; Wed, 30 Dec 2020 03:33:48 +0000 From: Anup Patel To: Atish Patra , Alistair Francis Subject: [PATCH 3/3] lib: sbi: Allow custom local TLB flush function Date: Wed, 30 Dec 2020 09:03:04 +0530 Message-Id: <20201230033304.295706-4-anup.patel@wdc.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201230033304.295706-1-anup.patel@wdc.com> References: <20201230033304.295706-1-anup.patel@wdc.com> X-Originating-IP: [122.182.250.184] X-ClientProxiedBy: MA1PR01CA0138.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a00:35::32) To DM6PR04MB6201.namprd04.prod.outlook.com (2603:10b6:5:127::32) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from wdc.com (122.182.250.184) by MA1PR01CA0138.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a00:35::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.20 via Frontend Transport; Wed, 30 Dec 2020 03:33:46 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 8d57d45b-0029-48c9-c0ad-08d8ac73b816 X-MS-TrafficTypeDiagnostic: DM6PR04MB5754: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: WDCIPOUTBOUND: EOP-TRUE X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: JhAhEDNEd5/h0xvT5wle2KlirzZaOosD3BHkofIXRU6CLEgdgp+SzLDOVCTu2C3RskH4hpUtrGo2YMLJ9jYuMJJuLWPdrBCGhLKMxZ5TFJe0RIz6FViWhlanAlYKX+KN/CUK7SObHB1B85T0va02vfLWV8AVxE8lmUFiQ+f6EieSk/bSdG68bA/LgfrLOL/V5AKO2ueWrxEi/P1R+39PVktHALhduqqlO5ZSCUJLJ4XOWEEvUSDgWsTv3iKXqshpulsR1wfwUhaHUDbVz0IErFN5jeog14RjkTSWSiTVQ4dSXUIkFyTknvZMKzvu6rZQwKB182PEtdx2ePCDdLMoeJDixdv8m+k7zhatsL91TdJ5EMpfKXE/Fs9YVW7fxq8UG8BFFaDMzMUA1i3tddrlEg== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR04MB6201.namprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(346002)(366004)(39860400002)(136003)(376002)(396003)(83380400001)(86362001)(66946007)(4326008)(8886007)(2906002)(36756003)(55016002)(66556008)(6636002)(1076003)(66476007)(316002)(44832011)(8676002)(16526019)(7696005)(54906003)(6666004)(478600001)(5660300002)(52116002)(110136005)(2616005)(186003)(8936002)(26005)(956004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData: QfS3jxYFU5M2V3lxEBP2VplolZY6+YWsvpgfb5cRRxC9t0XU/FWoRcp5/27A6BJh4IW+PSk63J9rwsqHrYOq5mX2/FP307ayGqKKJjjjEbyNHWX3Sb2JJNcFg2caKZIQyYCvXDbxd8hbXdSD1OZA6AqiUMOLm8mfpd9PHLihBE60+nd1p6ko+eHUAXt+E1q7xs+xYGIaKYlTAARlaW/3QOzZOQPAEzYNucbeF0G3G9Qjf+q25q+pltkgGnZuiGp9IXUV94+nFHvtLhcWCAwzB233q/rAUPRE7fWRz1nXsXaVJYLc2PFBAy15yARZdaSYiwobvByuFAEyKo1xC/px/rklKypaDWn8kTeX0mTaOg7K+vGBgy1AxZcsYcAIEuTgXdRrO0qiJ7EQYaDbHayizZYJlvRbUrNQjPB6Wv8NezFJ7LfidX7EL/0/VI2D4oJ8G9uZXsulWpLYY323YkNMwhTBMmhNbQSij+dopvOd10aJEEJRBwpk1nv5G3ahfhyXjoSYymia8MQAgjfX08pE2r4SXGex6ERnw+qgu2q+w9sTDIUjZrBN5jjdu/NgfJ9FH9tZmSLe8B/HJDeLeEV1pm45hn7I43jhylWDk329RTT4DCuWKDh5l3oumw2TGDHSjKN5e9B3vsxhZHINZi3XxMPc/fiGw0zhdGic7R2QRpjeNP8ONHPhS0re8hBiGMmZ1RMyZuzPYLLB+Ba8WBc/mXBLf8oX3TQwp2VYZsYga9zUF+39BSFdWNsGfnLVwdMtvwqRz5031JydLjg6DOh7w7t+x1IaVgEd+oe+tour/Dk6vBbdVG/bIzXmMdq9pnMXx7WCTZLbiL0ADXXALbab4HRpVcAbvJsGT8m+Y8bL4FuSJwD0Wvn+1r2yd3tDJVeloOSQwE8mrWEnZWzbtGsIVJW5xR1u+fz5YoyNArUEQwA9x9Xb7aYMoVR/5n/7jIPf/l6e/OWNg6g34daGtmwndtO1IRB8t+kCHepUbeMk/avvLvn+feggWt5zhRzoi3cS X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-AuthSource: DM6PR04MB6201.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Dec 2020 03:33:48.1451 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b61c8803-16f3-4c35-9b17-6f65f441df86 X-MS-Exchange-CrossTenant-Network-Message-Id: 8d57d45b-0029-48c9-c0ad-08d8ac73b816 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: hnQa20VR2aosL95TLm/AJM3wvApdZ9oTUTDt0kqG3iKxBdwSoPdtX7lygsS4CjdxmFFTMyO6FpfLBPKnWPU31A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR04MB5754 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201229_223350_784746_F58729D1 X-CRM114-Status: GOOD ( 16.42 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [68.232.141.245 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.0 MSGID_FROM_MTA_HEADER Message-Id was added by a relay X-BeenThere: opensbi@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Anup Patel , Anup Patel , opensbi@lists.infradead.org Sender: "opensbi" Errors-To: opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Currently, we have fixed TLB flush types supported by the remote TLB library. This approach is not flexible and does not allow custom local TLB flush function. For example, after updating PMP entries on a set of HARTs at runtime, we have to flush TLB on these HARTs as well. To support custom local TLB flush function, we replace the "type" field of "struct sbi_tlb_info" with a local TLB flush function pointer. We also provide definitions of standard TLB flush operations (such as fence_i, sfence.vma, hfence.vvma, hfence.gvma, etc). Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- include/sbi/sbi_tlb.h | 24 +++++++-------- lib/sbi/sbi_ecall_legacy.c | 9 ++++-- lib/sbi/sbi_ecall_replace.c | 16 +++++----- lib/sbi/sbi_tlb.c | 59 +++++++++++-------------------------- 4 files changed, 44 insertions(+), 64 deletions(-) diff --git a/include/sbi/sbi_tlb.h b/include/sbi/sbi_tlb.h index 6ee64a9..48f1962 100644 --- a/include/sbi/sbi_tlb.h +++ b/include/sbi/sbi_tlb.h @@ -22,16 +22,6 @@ #define SBI_TLB_FIFO_NUM_ENTRIES 8 -enum sbi_tlb_info_types { - SBI_TLB_FLUSH_VMA, - SBI_TLB_FLUSH_VMA_ASID, - SBI_TLB_FLUSH_GVMA, - SBI_TLB_FLUSH_GVMA_VMID, - SBI_TLB_FLUSH_VVMA, - SBI_TLB_FLUSH_VVMA_ASID, - SBI_ITLB_FLUSH -}; - struct sbi_scratch; struct sbi_tlb_info { @@ -39,17 +29,25 @@ struct sbi_tlb_info { unsigned long size; unsigned long asid; unsigned long vmid; - unsigned long type; + void (*local_fn)(struct sbi_tlb_info *tinfo); struct sbi_hartmask smask; }; -#define SBI_TLB_INFO_INIT(__p, __start, __size, __asid, __vmid, __type, __src) \ +void sbi_tlb_local_hfence_vvma(struct sbi_tlb_info *tinfo); +void sbi_tlb_local_hfence_gvma(struct sbi_tlb_info *tinfo); +void sbi_tlb_local_sfence_vma(struct sbi_tlb_info *tinfo); +void sbi_tlb_local_hfence_vvma_asid(struct sbi_tlb_info *tinfo); +void sbi_tlb_local_hfence_gvma_vmid(struct sbi_tlb_info *tinfo); +void sbi_tlb_local_sfence_vma_asid(struct sbi_tlb_info *tinfo); +void sbi_tlb_local_fence_i(struct sbi_tlb_info *tinfo); + +#define SBI_TLB_INFO_INIT(__p, __start, __size, __asid, __vmid, __lfn, __src) \ do { \ (__p)->start = (__start); \ (__p)->size = (__size); \ (__p)->asid = (__asid); \ (__p)->vmid = (__vmid); \ - (__p)->type = (__type); \ + (__p)->local_fn = (__lfn); \ SBI_HARTMASK_INIT_EXCEPT(&(__p)->smask, (__src)); \ } while (0) diff --git a/lib/sbi/sbi_ecall_legacy.c b/lib/sbi/sbi_ecall_legacy.c index 8afeb00..1a7fe26 100644 --- a/lib/sbi/sbi_ecall_legacy.c +++ b/lib/sbi/sbi_ecall_legacy.c @@ -80,7 +80,8 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, &hmask, out_trap); if (ret != SBI_ETRAP) { SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0, - SBI_ITLB_FLUSH, source_hart); + sbi_tlb_local_fence_i, + source_hart); ret = sbi_tlb_request(hmask, 0, &tlb_info); } break; @@ -89,7 +90,8 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, &hmask, out_trap); if (ret != SBI_ETRAP) { SBI_TLB_INFO_INIT(&tlb_info, regs->a1, regs->a2, 0, 0, - SBI_TLB_FLUSH_VMA, source_hart); + sbi_tlb_local_sfence_vma, + source_hart); ret = sbi_tlb_request(hmask, 0, &tlb_info); } break; @@ -99,7 +101,8 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, if (ret != SBI_ETRAP) { SBI_TLB_INFO_INIT(&tlb_info, regs->a1, regs->a2, regs->a3, 0, - SBI_TLB_FLUSH_VMA_ASID, source_hart); + sbi_tlb_local_sfence_vma_asid, + source_hart); ret = sbi_tlb_request(hmask, 0, &tlb_info); } break; diff --git a/lib/sbi/sbi_ecall_replace.c b/lib/sbi/sbi_ecall_replace.c index a95821b..a7935d9 100644 --- a/lib/sbi/sbi_ecall_replace.c +++ b/lib/sbi/sbi_ecall_replace.c @@ -62,41 +62,43 @@ static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid, switch (funcid) { case SBI_EXT_RFENCE_REMOTE_FENCE_I: SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0, - SBI_ITLB_FLUSH, source_hart); + sbi_tlb_local_fence_i, source_hart); ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA: SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, - SBI_TLB_FLUSH_GVMA, source_hart); + sbi_tlb_local_hfence_gvma, source_hart); ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID: SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, regs->a4, - SBI_TLB_FLUSH_GVMA_VMID, source_hart); + sbi_tlb_local_hfence_gvma_vmid, + source_hart); ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA: vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); vmid = vmid >> HGATP_VMID_SHIFT; SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, vmid, - SBI_TLB_FLUSH_VVMA, source_hart); + sbi_tlb_local_hfence_vvma, source_hart); ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID: vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); vmid = vmid >> HGATP_VMID_SHIFT; SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, - vmid, SBI_TLB_FLUSH_VVMA_ASID, source_hart); + vmid, sbi_tlb_local_hfence_vvma_asid, + source_hart); ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA: SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, - SBI_TLB_FLUSH_VMA, source_hart); + sbi_tlb_local_sfence_vma, source_hart); ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID: SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, 0, - SBI_TLB_FLUSH_VMA_ASID, source_hart); + sbi_tlb_local_sfence_vma_asid, source_hart); ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; default: diff --git a/lib/sbi/sbi_tlb.c b/lib/sbi/sbi_tlb.c index c8e62cd..73f59e8 100644 --- a/lib/sbi/sbi_tlb.c +++ b/lib/sbi/sbi_tlb.c @@ -32,7 +32,7 @@ static void sbi_tlb_flush_all(void) __asm__ __volatile("sfence.vma"); } -static void sbi_tlb_hfence_vvma(struct sbi_tlb_info *tinfo) +void sbi_tlb_local_hfence_vvma(struct sbi_tlb_info *tinfo) { unsigned long start = tinfo->start; unsigned long size = tinfo->size; @@ -55,7 +55,7 @@ done: csr_write(CSR_HGATP, hgatp); } -static void sbi_tlb_hfence_gvma(struct sbi_tlb_info *tinfo) +void sbi_tlb_local_hfence_gvma(struct sbi_tlb_info *tinfo) { unsigned long start = tinfo->start; unsigned long size = tinfo->size; @@ -71,7 +71,7 @@ static void sbi_tlb_hfence_gvma(struct sbi_tlb_info *tinfo) } } -static void sbi_tlb_sfence_vma(struct sbi_tlb_info *tinfo) +void sbi_tlb_local_sfence_vma(struct sbi_tlb_info *tinfo) { unsigned long start = tinfo->start; unsigned long size = tinfo->size; @@ -90,7 +90,7 @@ static void sbi_tlb_sfence_vma(struct sbi_tlb_info *tinfo) } } -static void sbi_tlb_hfence_vvma_asid(struct sbi_tlb_info *tinfo) +void sbi_tlb_local_hfence_vvma_asid(struct sbi_tlb_info *tinfo) { unsigned long start = tinfo->start; unsigned long size = tinfo->size; @@ -119,7 +119,7 @@ done: csr_write(CSR_HGATP, hgatp); } -static void sbi_tlb_hfence_gvma_vmid(struct sbi_tlb_info *tinfo) +void sbi_tlb_local_hfence_gvma_vmid(struct sbi_tlb_info *tinfo) { unsigned long start = tinfo->start; unsigned long size = tinfo->size; @@ -141,7 +141,7 @@ static void sbi_tlb_hfence_gvma_vmid(struct sbi_tlb_info *tinfo) } } -static void sbi_tlb_sfence_vma_asid(struct sbi_tlb_info *tinfo) +void sbi_tlb_local_sfence_vma_asid(struct sbi_tlb_info *tinfo) { unsigned long start = tinfo->start; unsigned long size = tinfo->size; @@ -170,35 +170,9 @@ static void sbi_tlb_sfence_vma_asid(struct sbi_tlb_info *tinfo) } } -static void sbi_tlb_local_flush(struct sbi_tlb_info *tinfo) +void sbi_tlb_local_fence_i(struct sbi_tlb_info *tinfo) { - switch (tinfo->type) { - case SBI_TLB_FLUSH_VMA: - sbi_tlb_sfence_vma(tinfo); - break; - case SBI_TLB_FLUSH_VMA_ASID: - sbi_tlb_sfence_vma_asid(tinfo); - break; - case SBI_TLB_FLUSH_GVMA: - sbi_tlb_hfence_gvma(tinfo); - break; - case SBI_TLB_FLUSH_GVMA_VMID: - sbi_tlb_hfence_gvma_vmid(tinfo); - break; - case SBI_TLB_FLUSH_VVMA: - sbi_tlb_hfence_vvma(tinfo); - break; - case SBI_TLB_FLUSH_VVMA_ASID: - sbi_tlb_hfence_vvma_asid(tinfo); - break; - case SBI_ITLB_FLUSH: - __asm__ __volatile("fence.i"); - break; - default: - sbi_printf("Invalid tlb flush request type [%lu]\n", - tinfo->type); - } - return; + __asm__ __volatile("fence.i"); } static void sbi_tlb_entry_process(struct sbi_tlb_info *tinfo) @@ -207,7 +181,7 @@ static void sbi_tlb_entry_process(struct sbi_tlb_info *tinfo) struct sbi_scratch *rscratch = NULL; unsigned long *rtlb_sync = NULL; - sbi_tlb_local_flush(tinfo); + tinfo->local_fn(tinfo); sbi_hartmask_for_each_hart(rhartid, &tinfo->smask) { rscratch = sbi_hartid_to_scratch(rhartid); @@ -316,13 +290,13 @@ static int sbi_tlb_update_cb(void *in, void *data) curr = (struct sbi_tlb_info *)data; next = (struct sbi_tlb_info *)in; - if (next->type == SBI_TLB_FLUSH_VMA_ASID && - curr->type == SBI_TLB_FLUSH_VMA_ASID) { + if (next->local_fn == sbi_tlb_local_sfence_vma_asid && + curr->local_fn == sbi_tlb_local_sfence_vma_asid) { if (next->asid == curr->asid) ret = __sbi_tlb_range_check(curr, next); - } else if (next->type == SBI_TLB_FLUSH_VMA && - curr->type == SBI_TLB_FLUSH_VMA) { - ret = __sbi_tlb_range_check(curr, next); + } else if (next->local_fn == sbi_tlb_local_sfence_vma && + curr->local_fn == sbi_tlb_local_sfence_vma) { + ret = __sbi_tlb_range_check(curr, next); } return ret; @@ -352,7 +326,7 @@ static int sbi_tlb_update(struct sbi_scratch *scratch, * then just do a local flush and return; */ if (remote_hartid == curr_hartid) { - sbi_tlb_local_flush(tinfo); + tinfo->local_fn(tinfo); return -1; } @@ -391,6 +365,9 @@ static u32 tlb_event = SBI_IPI_EVENT_MAX; int sbi_tlb_request(ulong hmask, ulong hbase, struct sbi_tlb_info *tinfo) { + if (!tinfo->local_fn) + return SBI_EINVAL; + return sbi_ipi_send_many(hmask, hbase, tlb_event, tinfo); }