From patchwork Tue Jan 9 11:24:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Inochi Amaoto X-Patchwork-Id: 1884388 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=lKCG6yZ6; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=outlook.com header.i=@outlook.com header.a=rsa-sha256 header.s=selector1 header.b=HcLh3CoY; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4T8TB612Jxz1yPh for ; Tue, 9 Jan 2024 22:25:18 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Ak2E4pthMozbh5JbQ8eEqb/w01G0oBo5TNM5QKrxY54=; b=lKCG6yZ6nl6a1S uAPKKkrAbMGo5pvGM7bSqFtDgH4S5yQ92MRdicHYJmBKzWwX1fh4AEqzzwq7RA3LaOQqLkQtzOk21 y1qXPUSSCkDwAJtS4JP5b0jm0S3I8UuPrL47YBuTNqkUXbEUDjOCAsYc4el5Fn0NNtCWZFFpz6CIj 9daOuqJk8DeG93qig9VKAT/3PeeddcIndGXDpQoI8hUNGj1vjG4J2UGEQQwy0GKDxXUl+OUpkQDhP PYEaiPlVpO75JhMelDWE41AQZhsLSzTj1gWJ2vjtvd4+PYPCXRquhqvYSFEjelY7eCKLkKSy/cRQ6 ob2ejNsSt2UcmCo0hcGg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rNAED-007ov4-0W; Tue, 09 Jan 2024 11:25:05 +0000 Received: from mail-bn8nam12olkn2080e.outbound.protection.outlook.com ([2a01:111:f400:fe5b::80e] helo=NAM12-BN8-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rNAE9-007op7-15 for opensbi@lists.infradead.org; Tue, 09 Jan 2024 11:25:04 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YqX8nRQS7G3Zvsq61UnV0cS+ASG9Qv5jn7LXTsR53NtT+QCm2Z62PYozbdJL2e+1B6CSt4Wg86Szx063ql+n32+zqMg+QRn4vc0wB2krgmllweQEIcs/wlCmFmzN0JSm5pzj4KDH5IENMpwlzGWsErFbafy7ofcvUTi+22v3zqduu3V9MfsjNlq8AfCJ+/0VIAVIVGTP9HFnPrV/wBsUegi6cgAoxt56+NLiiImrhz1eb8B9l256h+NLOCLk3AKDpIzP4p04E0Ll6sVkmRaS/rgHXjGpJ7rkkWKNlCBhwg2BbW0lX2xCyT5vGIHZSBDnTnqFGGeNnIBMuDPMQrWHGg== 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=1yk7/QQTcwP+dUqiTuUFa82tF/2zUV+N6Y14N0NXWms=; b=M0bcSjUlieLcHbJo2BN8hDg5bbXlpCQbqprRRDo9cSNME3HgLOkChkR1ARUa7KhIC86+vC/xD2ZLxCcgwNxMDtDNcqAXWlXEV67zY3UBi4VZKiZH1BNmHVIvDao9Fl6JTOoiu5QOax0I1eq5vMzjqIVKpDIVZzTkQd+TDZFfQrIscaIAIy2UbKOWRgtjK52yr1+HGhb1CWOxIaWMll9oCnWElANv4FmTbOYNhksRfKnKgQ8tbLQAehs67qg3d2CUNLw/y9illf3Z+yPO+GzsUhqwf3+86+8lg9V8FOiP5Hao89ua50PcvESQ1VuEKc03lfZOP1Vs8BtnoowSE53zNA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1yk7/QQTcwP+dUqiTuUFa82tF/2zUV+N6Y14N0NXWms=; b=HcLh3CoYq43hJRTR9AQue+yxSQfHqH6+vrlCIPXncH20CMMqLsDT9UN8uPsjEgvo1+oC94XpwrKiyNfyP1tisduzRlvdF2ATRCl8dVxLhq+w7jzVWiBdFZP/sDvuRwaYBexH5bDSrSiFdxU5asPYvFGGxpt4cVHvIjW/XZi9sTY9mAXSVw9cBGCDZfhNVnrrZXlpAgxiHKzsrnLbhA7phlw7mYZFA5e8fsO7ouQacM1J6q2G5XYYmtlhx/gb/dpletvuWGmy8mp0WmXAuPQWYpSpm34+GKrwWs6IAZTNv1tdivOfLWrJ1jjvXBYIsRTrcfmNFFhPrPygNuPnCo/dpw== Received: from IA1PR20MB4953.namprd20.prod.outlook.com (2603:10b6:208:3af::19) by DS0PR20MB5895.namprd20.prod.outlook.com (2603:10b6:8:14b::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7159.24; Tue, 9 Jan 2024 11:24:54 +0000 Received: from IA1PR20MB4953.namprd20.prod.outlook.com ([fe80::406a:664b:b8bc:1e6b]) by IA1PR20MB4953.namprd20.prod.outlook.com ([fe80::406a:664b:b8bc:1e6b%2]) with mapi id 15.20.7159.020; Tue, 9 Jan 2024 11:24:54 +0000 From: Inochi Amaoto To: Anup Patel , Atish Patra , Xiang W Cc: opensbi@lists.infradead.org, Inochi Amaoto Subject: [RFC PATCH 1/2] lib: sbi: Add shared memory region support Date: Tue, 9 Jan 2024 19:24:43 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: X-TMN: [AEVLLMQSCKqyNVCNvGDKyfVnNaV8e8RmBNDZBoczYzA=] X-ClientProxiedBy: TYCP286CA0028.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:263::15) To IA1PR20MB4953.namprd20.prod.outlook.com (2603:10b6:208:3af::19) X-Microsoft-Original-Message-ID: <20240109112444.427230-1-inochiama@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: IA1PR20MB4953:EE_|DS0PR20MB5895:EE_ X-MS-Office365-Filtering-Correlation-Id: 18bb5f88-eb23-4ed9-9183-08dc11059a35 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: yAX/lBDxIazk3eGikiN4BzA5qNsDFFkRfOUJUNklKjcLy/LwiISTM3MaPQ/hfevvTe+cF/Xv7yU69OFs8oAy4Bso3vKUPs8PiSTR4TyopbaXpe90Ma9AzBYFd9+HfHcjfvQzmAXaQeaytU8DHJsEGYrYTYlZL0t8DxPvQvre/PHUVkReN9D7gq3as1FRhszFS5mvV/UURDdJGk5ycM5ercCKoeIH4rzohSQMggyH8UZskWfFr0UfHsR/03LUf8EHTjjEp3aPQxI3LTyt74G151bLWDvxfonhR+2Ay6uFvH34bMV86mVGrE84wlXpBoh3AQxM38GraLV03y11UI3g1rLf/3EFGhMaFRk/d0IOrs93qo2vzsUd2LL4umdKDt594/IbfPeM/dishFGNiqdzRITrj7omdCRz9ahdneozfZSD2N1WQBUPwRlfsFIK1Jl+ftqemaNh01RncGnLKXVegMyfGRJsjREKeyTsq5aLsrVTNIf3HohQjQ4P+Ebh/vadiioNSFcj3Voa9ZKSaesVx0PcN7LLeV3sQA0Y3rLgckDR14wbkuBdwFCkxunqiwWBuOHY6wDzKyj3r8ESh3kUlGsD6p0JNAI1xkpqB2Zq5Bc1Jz5lbh/+3nKvDfz+oJJf X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: MQs0+q+yJWAf/rPdjvNlUVtmuQCWvodlnXDdnFocV1UgY13h82AKjEyxiMcOFyS1WGyStxhG6clUIx+PufowQ+0rsCl2b2jPakK8W9pDw0poGtB2kHDoXg5arW8B62nWTJfPlftk98uZbc80HUoCez6CqEnUS63HXenRGWzzPzQTsAOm6wAttUYqfgGW7Z/4u61BuyxYqFl5/X6KcVZjkzQvh/MiF3QURJdiwoJ9I0pKuN0y/4CFb4Dw1cUBrevvN/S73SCL6dvuCQHWTOOPnovDjsF34l3imt1+0qDazBCVkj/7aLS6E5nDzUV3Jlb2B7B8b6Bfhhgg17jB/NHNMpEOcstqw5AakJCsdaigmF60XCfvts4fZXwGaT7gBVdFIKbz4c8MLl6T7up506N+v05927FSY0ZLVjdP02JM+X6AMAg55OiqULdtAmwKoCOJy4x0BY1t2XcenhcGaKbT4sSJztrI4Y05EY2fFdg67YQ1Yup3cQfIkP0A7MOP6ArGi/imbqEnNTcZHGllP3UOACL4sMGR9s8tBLvOd5PgRHkV8tPY2HWLAnVdPIvk82zSQG/kjqa5p8U4NL85+k4NUn5aOEt8vJBaREfdy/xXp2KyVULtYqlFy0TzLP20qUPLqIP1VgG4ZbMq9CyePdc/+cuC/O1FUDJQczBZLujtkGwt5Gx5qdo9hc6NsHHX2TObUqam3A8KaoDKjp8/IYhBkM1ZRHGLYm3mnYAZrEGfhqCYDYXfC4KYvO8ZVRWFMwDXKMqCvsS+RjyimkRPX2piRYszV7BwqKnlWfGmSbtPIDPw/LHT4sFBXhmj4zj7/VF8uEeGJbJwGpYgE+LbHdf252RdU/DKjII4epEfSDMBAu3hjDXi5DLv1cYcNFXbdBTYnyLd7NKunu7M82vbqMHDwK3jjinIbKzn/KA6lZif3Q2DTmPXNV2UKqBA64NU9y9pXs2RGqd07H8yNZc2lAO2wCslpQMF15fcMq1EP+kA9CSw4UfmbwSvTRrnmlLQ0yc0bnWuTT9/KS6ln0s4KHviqlvt2t51SMUp4nCth9AoupGwOK+IBExYcTIV9vu6AO9Qw+40b9elh2v/kVcH+Ic6Dk4Sa+OK3Fer8UCtIwATyw9tJSr7MKML09TVB0iJjeSNKUczTIHecmUflGt1xX3QiD7fho3Ks1HmojgsQPrIcHzgQ//YIuKAM6dRkNiu9EhIVPVOmeeC2t4siKtYEpFd9avRpEsiV+WUubWM4nfKCcA= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 18bb5f88-eb23-4ed9-9183-08dc11059a35 X-MS-Exchange-CrossTenant-AuthSource: IA1PR20MB4953.namprd20.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Jan 2024 11:24:54.2001 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR20MB5895 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240109_032501_390747_6B32469F X-CRM114-Status: GOOD ( 16.85 ) X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: SBI 2.0 introducts shared memory between SBI and supervisor-mode software, which is needed by various extension. So add inital support for shared memory mechanisms. Signed-off-by: Inochi Amaoto --- include/sbi/sbi_bitops.h | 3 + include/sbi/sbi_shm.h | 129 +++++++++++++++++++++++++++++++++++++++ lib/sbi/objects.mk | 1 + lib/sbi/sbi_shm.c | 114 +++++++++++++++++ [...] Content analysis details: (-0.2 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [inochiama[at]outlook.com] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 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 X-BeenThere: opensbi@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "opensbi" Errors-To: opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org SBI 2.0 introducts shared memory between SBI and supervisor-mode software, which is needed by various extension. So add inital support for shared memory mechanisms. Signed-off-by: Inochi Amaoto --- include/sbi/sbi_bitops.h | 3 + include/sbi/sbi_shm.h | 129 +++++++++++++++++++++++++++++++++++++++ lib/sbi/objects.mk | 1 + lib/sbi/sbi_shm.c | 114 ++++++++++++++++++++++++++++++++++ 4 files changed, 247 insertions(+) create mode 100644 include/sbi/sbi_shm.h create mode 100644 lib/sbi/sbi_shm.c -- 2.43.0 diff --git a/include/sbi/sbi_bitops.h b/include/sbi/sbi_bitops.h index 7d90334..19b478a 100644 --- a/include/sbi/sbi_bitops.h +++ b/include/sbi/sbi_bitops.h @@ -28,6 +28,9 @@ #define BIT_WORD_OFFSET(bit) ((bit) & (BITS_PER_LONG - 1)) #define BIT_ALIGN(bit, align) (((bit) + ((align) - 1)) & ~((align) - 1)) +#define IS_BIT_ALIGN(bit, align) \ + (((bit) & ((align) - 1)) == 0) + #define GENMASK(h, l) \ (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) diff --git a/include/sbi/sbi_shm.h b/include/sbi/sbi_shm.h new file mode 100644 index 0000000..c50753b --- /dev/null +++ b/include/sbi/sbi_shm.h @@ -0,0 +1,129 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2024 Inochi Amaoto + */ + +#ifndef __SBI_SHM_H__ +#define __SBI_SHM_H__ + +#include + +#define SBI_SHMEM_M_READABLE (1UL << 0) +#define SBI_SHMEM_M_WRITABLE (1UL << 1) +#define SBI_SHMEM_M_EXECUTABLE (1UL << 2) +#define SBI_SHMEM_S_READABLE (1UL << 3) +#define SBI_SHMEM_S_WRITABLE (1UL << 4) +#define SBI_SHMEM_S_EXECUTABLE (1UL << 5) + +#define SBI_SHMEM_M_RW \ + (SBI_SHMEM_M_READABLE | \ + SBI_SHMEM_M_WRITABLE) +#define SBI_SHMEM_M_RWX \ + (SBI_SHMEM_M_READABLE | \ + SBI_SHMEM_M_WRITABLE | \ + SBI_SHMEM_M_EXECUTABLE) + +#define SBI_SHMEM_S_RW \ + (SBI_SHMEM_S_READABLE | \ + SBI_SHMEM_S_WRITABLE) +#define SBI_SHMEM_S_RWX \ + (SBI_SHMEM_S_READABLE | \ + SBI_SHMEM_S_WRITABLE | \ + SBI_SHMEM_S_EXECUTABLE) + +#define SBI_SHMEM_S_ACCESS_SHIFT 3 + +struct sbi_shmem { + unsigned long addr; + unsigned long size; +}; + +int sbi_shmem_region_init(unsigned long lo, unsigned long hi, + unsigned long size, unsigned long align, + struct sbi_shmem *shmem); +void sbi_shmem_region_clear(struct sbi_shmem *shmem); + +int sbi_shmem_region_check(struct sbi_shmem *shmem, unsigned long flags); + +int sbi_shmem_raw_read(struct sbi_shmem *shmem, unsigned long offset, + void* value, unsigned long size); +int sbi_shmem_raw_write(struct sbi_shmem *shmem, unsigned long offset, + void* value, unsigned long size); + +static inline int sbi_shmem_read_u8(struct sbi_shmem *shmem, + unsigned long offset, + uint8_t* value) +{ + return sbi_shmem_raw_read(shmem, offset, value, 1); +} + +static inline int sbi_shmem_read_u16(struct sbi_shmem *shmem, + unsigned long offset, + uint16_t* value) +{ + uint16_t tmp; + int ret = sbi_shmem_raw_write(shmem, offset, &tmp, 2); + + *value = le16_to_cpu(tmp); + + return ret; +} + +static inline int sbi_shmem_read_u32(struct sbi_shmem *shmem, + unsigned long offset, + uint32_t* value) +{ + uint32_t tmp; + int ret = sbi_shmem_raw_write(shmem, offset, &tmp, 4); + + *value = le32_to_cpu(tmp); + + return ret; +} + +static inline int sbi_shmem_read_u64(struct sbi_shmem *shmem, + unsigned long offset, + uint64_t* value) +{ + uint64_t tmp; + int ret = sbi_shmem_raw_write(shmem, offset, &tmp, 8); + + *value = le64_to_cpu(tmp); + + return ret; +} + +static inline int sbi_shmem_write_u8(struct sbi_shmem *shmem, + unsigned long offset, + uint8_t value) +{ + return sbi_shmem_raw_write(shmem, offset, &value, 1); +} + +static inline int sbi_shmem_write_u16(struct sbi_shmem *shmem, + unsigned long offset, + uint16_t value) +{ + uint16_t tmp = cpu_to_le16(value); + return sbi_shmem_raw_write(shmem, offset, &tmp, 2); +} + +static inline int sbi_shmem_write_u32(struct sbi_shmem *shmem, + unsigned long offset, + uint32_t value) +{ + uint32_t tmp = cpu_to_le32(value); + return sbi_shmem_raw_write(shmem, offset, &tmp, 4); +} + +static inline int sbi_shmem_write_u64(struct sbi_shmem *shmem, + unsigned long offset, + uint64_t value) +{ + uint64_t tmp = cpu_to_le64(value); + return sbi_shmem_raw_write(shmem, offset, &tmp, 8); +} + + +#endif // __SBI_SHM_H__ diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk index c699187..5ffef06 100644 --- a/lib/sbi/objects.mk +++ b/lib/sbi/objects.mk @@ -71,6 +71,7 @@ libsbi-objs-y += sbi_misaligned_ldst.o libsbi-objs-y += sbi_platform.o libsbi-objs-y += sbi_pmu.o libsbi-objs-y += sbi_scratch.o +libsbi-objs-y += sbi_shm.o libsbi-objs-y += sbi_string.o libsbi-objs-y += sbi_system.o libsbi-objs-y += sbi_timer.o diff --git a/lib/sbi/sbi_shm.c b/lib/sbi/sbi_shm.c new file mode 100644 index 0000000..213edaf --- /dev/null +++ b/lib/sbi/sbi_shm.c @@ -0,0 +1,114 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2024 Inochi Amaoto + */ + +#include +#include +#include +#include +#include +#include + +void sbi_shmem_region_clear(struct sbi_shmem *shmem) +{ + shmem->addr = 0; + shmem->size = 0; +} + +int sbi_shmem_region_init(unsigned long lo, unsigned long hi, + unsigned long size, unsigned long align, + struct sbi_shmem *shmem) +{ + if (IS_BIT_ALIGN(lo, align)) + return SBI_EINVAL; + + if (size == 0) + return SBI_EINVAL; + + /* TODO: support address wider than XLEN bits */ + if (hi) + return SBI_EINVALID_ADDR; + + shmem->addr = lo; + shmem->size = size; + + return 0; +} + +static int __sbi_shmem_region_check(struct sbi_domain *domain, + struct sbi_shmem *shmem, + unsigned long mode, unsigned long flags) +{ + unsigned long access_flags = 0; + int ret; + + if (flags & SBI_SHMEM_M_RWX) { + if (flags & SBI_SHMEM_M_READABLE) + access_flags |= SBI_DOMAIN_READ; + if (flags & SBI_SHMEM_M_WRITABLE) + access_flags |= SBI_DOMAIN_WRITE; + if (flags & SBI_SHMEM_M_EXECUTABLE) + access_flags |= SBI_DOMAIN_EXECUTE; + ret = sbi_domain_check_addr_range(domain, + shmem->addr, shmem->size, + mode, access_flags); + if (!ret) + return SBI_EINVALID_ADDR; + } + + return 0; +} + + +int sbi_shmem_region_check(struct sbi_shmem *shmem, unsigned long flags) +{ + struct sbi_domain *domain = sbi_domain_thishart_ptr(); + int ret; + + if (shmem->size == 0) + return SBI_EINVAL; + + ret = __sbi_shmem_region_check(domain, shmem, PRV_M, flags); + if (ret) + return ret; + + ret = __sbi_shmem_region_check(domain, shmem, PRV_S, + flags >> SBI_SHMEM_S_ACCESS_SHIFT); + if (ret) + return ret; + + return 0; +} + + +int sbi_shmem_raw_write(struct sbi_shmem *shmem, unsigned long offset, + void* value, unsigned long size) +{ + void *pos = (void *)(shmem->addr + offset); + + if (shmem->size <= offset + size) + return SBI_EINVAL; + + mb(); + sbi_memcpy(pos, value, size); + wmb(); + + return 0; +} + +int sbi_shmem_raw_read(struct sbi_shmem *shmem, unsigned long offset, + void* value, unsigned long size) +{ + void *pos = (void *)(shmem->addr + offset); + + if (shmem->size <= offset + size) + return SBI_EINVAL; + + rmb(); + sbi_memcpy(value, pos, size); + wmb(); + + return 0; +}