From patchwork Thu Mar 23 12:33:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Asahi Lina X-Patchwork-Id: 74059 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:604a:0:0:0:0:0 with SMTP id j10csp2889385wrt; Thu, 23 Mar 2023 05:48:17 -0700 (PDT) X-Google-Smtp-Source: AK7set/Tci4fxNkeMihsuBC/QB1Cv20i+jbi3TEpsc2x1iPcG5j2p7nYJyw6UdjcdazedUnT8w8c X-Received: by 2002:aa7:9e04:0:b0:625:500c:35bd with SMTP id y4-20020aa79e04000000b00625500c35bdmr5913026pfq.6.1679575696843; Thu, 23 Mar 2023 05:48:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679575696; cv=none; d=google.com; s=arc-20160816; b=S76F1ppM8qWNV9qj0lbKtdQ/Ly/B2O27wRrg593+m2HDQvU6OI4NhX4tn0mpw43hJ8 0UnCfJusYOai0XD8sQjGaElW00dFKeaHzL18a/3VRFDMIOT1V1CMGI+93feYbGz0WbwE 5gRyAgzlQKk53oa4NZ8Y0gUoJoWuj4nHHRJf2bdXukgJBc0aDc0w/GSKAjqCQI4q5jGq lAu1XQq1OJFfrJ5fuDgVJT1Jc3U2qVbD2qVTH1tzH9nsI5U0F5tpNMNPwgcLWi7yJipv ggEQ6DFAJYoeri1RbMMF2x6SFs/i7hHMkfF8GBvmsViAzrRp8eMrhFIRuRMGUcLn3et3 rDhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:message-id:content-transfer-encoding :mime-version:subject:date:from:dkim-signature; bh=hgaU1YtqK8gZSOM1p4f0G6OKpJVINqCwjDANp0mXu9w=; b=j/NPFlUZubeJV81GBfkdXjZIBNWiIFBnTBYDWg/6GyNwXGF+OhoKIRPtwTZWFlvg9G +V1Hka1Ipgq+hDSlE2tE7UDaxeLeXgA/3b1+Dish10tpSVr0WG25sVdpGjmbjWAaWuBO bq119oaJj+foB6qGxLekmEClvfwgN18giRmYxTzzKVbbDe5RlmcjNAcaXKBmMxvKjzgC t9Qj5acXFisrh0GmopnvVW0E1HzUddqCMz7UMIeR73ZW1z/1xyMwtga2RjCwgpIrccTe GBms8vR0wYOtjM08uko/Y084YI3hBYrvBgxQDB1g3S4nFsaPypBvAFscRAc2OXwvrXY2 pQLA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@asahilina.net header.s=default header.b=KCmfvMiM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=asahilina.net Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l71-20020a63884a000000b00502f9ffb8bbsi18210266pgd.297.2023.03.23.05.48.04; Thu, 23 Mar 2023 05:48:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@asahilina.net header.s=default header.b=KCmfvMiM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=asahilina.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231622AbjCWMeI (ORCPT + 99 others); Thu, 23 Mar 2023 08:34:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33234 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231547AbjCWMeG (ORCPT ); Thu, 23 Mar 2023 08:34:06 -0400 Received: from mail.marcansoft.com (marcansoft.com [212.63.210.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 67B33196AD; Thu, 23 Mar 2023 05:34:04 -0700 (PDT) Received: from [127.0.0.1] (localhost [127.0.0.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) (Authenticated sender: linasend@asahilina.net) by mail.marcansoft.com (Postfix) with ESMTPSA id DE791420CF; Thu, 23 Mar 2023 12:33:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=asahilina.net; s=default; t=1679574842; bh=dU+ouRLpZkJDik6nlmkKXlAzXALaF6/l7WtvgLXO5Rg=; h=From:Date:Subject:To:Cc; b=KCmfvMiMVpberx82OFDcDMPsbno/GMxpzLzAunpRDDyccD9oRx9YXrVvq0B6ja2+2 6uAd6QuJb1ZCVPPwdf/RGoVp75+S3HGkXKUDFCr+VVhcDzC/Jgj9OS0RHq8mTW5Lpy oveYqQCEB+E6sLFoZLXvAMkw+TSoPwMz+/EMvfRtz7W25bmDCZnzDdz3O+I5hlzw/c Ipp/GSvbwL+OJk7o6phNwyM+rppi2PTa7V9C/GGm1clx5RFaXOUl6BXrka47vzZ6Hz +RCm2sSZzsaH1Vn8csb+A/YA7Jso4wbt13rysCibodoHQ9HZUVER/8lctaDjycbsZi q3S585ItjEupw== From: Asahi Lina Date: Thu, 23 Mar 2023 21:33:54 +0900 Subject: [PATCH v3] rust: ioctl: Add ioctl number manipulation functions MIME-Version: 1.0 Message-Id: <20230224-rust-ioctl-v3-1-3c5f7a6954b5@asahilina.net> X-B4-Tracking: v=1; b=H4sIADFHHGQC/3WNwQ6CMBBEf4X0bBW2FMWT/2E8LLDQTUwhLTQaw r/bcjR6fJN5M6vw5Ji8uGarcBTY82gjqEMmWoN2IMldZAE5qByglG7xs+SxnZ8SNeS9okYhXkQ UGvQkG4e2NUkZpuW0t1MOqTA56vm1v90fkQ37eXTv/TwUKf35EwpZSF2U0KlKY63KG3o0/GSLR 0uzSFMB/uuQdAWazhXW0PXf+rZtHzY15/EIAQAA To: Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Arnd Bergmann Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, asahi@lists.linux.dev, linux-arch@vger.kernel.org, Asahi Lina X-Mailer: b4 0.12.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1679574839; l=4426; i=lina@asahilina.net; s=20230221; h=from:subject:message-id; bh=dU+ouRLpZkJDik6nlmkKXlAzXALaF6/l7WtvgLXO5Rg=; b=pNeQGZgAbH44+sahsleVEVvZ/xncu3esemq28+oJ0oHzhrHwUv6yVnjKisOIoI73mCXQ0/ayb W5kgtIYTLLLDl5j0pqcQPo7VuOzOvobdPG7yMPnAilECZwhGMG8BzWF X-Developer-Key: i=lina@asahilina.net; a=ed25519; pk=Qn8jZuOtR1m5GaiDfTrAoQ4NE1XoYVZ/wmt5YtXWFC4= X-Spam-Status: No, score=-0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1761160746645540486?= X-GMAIL-MSGID: =?utf-8?q?1761162765794891108?= Add simple 1:1 wrappers of the C ioctl number manipulation functions. Since these are macros we cannot bindgen them directly, and since they should be usable in const context we cannot use helper wrappers, so we'll have to reimplement them in Rust. Thankfully, the C headers do declare defines for the relevant bitfield positions, so we don't need to duplicate that. Signed-off-by: Asahi Lina --- Changes in v3: - Actually made the change intended in v2. - Link to v2: https://lore.kernel.org/r/20230224-rust-ioctl-v2-1-5325e76a92df@asahilina.net Changes in v2: - Changed from assert!() to build_assert!() (static_assert!() can't work here) - Link to v1: https://lore.kernel.org/r/20230224-rust-ioctl-v1-1-5142d365a934@asahilina.net --- rust/bindings/bindings_helper.h | 3 +- rust/kernel/ioctl.rs | 71 +++++++++++++++++++++++++++++++++++++++++ rust/kernel/lib.rs | 1 + 3 files changed, 74 insertions(+), 1 deletion(-) --- base-commit: fe15c26ee26efa11741a7b632e9f23b01aca4cc6 change-id: 20230224-rust-ioctl-a520f3eb3aa8 Thank you, ~~ Lina diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h index 75d85bd6c592..aef60f300be0 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -6,8 +6,9 @@ * Sorted alphabetically. */ -#include +#include #include +#include /* `bindgen` gets confused at certain things. */ const gfp_t BINDINGS_GFP_KERNEL = GFP_KERNEL; diff --git a/rust/kernel/ioctl.rs b/rust/kernel/ioctl.rs new file mode 100644 index 000000000000..b2076113b6a8 --- /dev/null +++ b/rust/kernel/ioctl.rs @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0 +#![allow(non_snake_case)] + +//! ioctl() number definitions +//! +//! C header: [`include/asm-generic/ioctl.h`](../../../../include/asm-generic/ioctl.h) + +use crate::build_assert; + +/// Build an ioctl number, analogous to the C macro of the same name. +#[inline(always)] +const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 { + build_assert!(dir <= bindings::_IOC_DIRMASK); + build_assert!(ty <= bindings::_IOC_TYPEMASK); + build_assert!(nr <= bindings::_IOC_NRMASK); + build_assert!(size <= (bindings::_IOC_SIZEMASK as usize)); + + (dir << bindings::_IOC_DIRSHIFT) + | (ty << bindings::_IOC_TYPESHIFT) + | (nr << bindings::_IOC_NRSHIFT) + | ((size as u32) << bindings::_IOC_SIZESHIFT) +} + +/// Build an ioctl number for an argumentless ioctl. +#[inline(always)] +pub const fn _IO(ty: u32, nr: u32) -> u32 { + _IOC(bindings::_IOC_NONE, ty, nr, 0) +} + +/// Build an ioctl number for an read-only ioctl. +#[inline(always)] +pub const fn _IOR(ty: u32, nr: u32) -> u32 { + _IOC(bindings::_IOC_READ, ty, nr, core::mem::size_of::()) +} + +/// Build an ioctl number for an write-only ioctl. +#[inline(always)] +pub const fn _IOW(ty: u32, nr: u32) -> u32 { + _IOC(bindings::_IOC_WRITE, ty, nr, core::mem::size_of::()) +} + +/// Build an ioctl number for a read-write ioctl. +#[inline(always)] +pub const fn _IOWR(ty: u32, nr: u32) -> u32 { + _IOC( + bindings::_IOC_READ | bindings::_IOC_WRITE, + ty, + nr, + core::mem::size_of::(), + ) +} + +/// Get the ioctl direction from an ioctl number. +pub const fn _IOC_DIR(nr: u32) -> u32 { + (nr >> bindings::_IOC_DIRSHIFT) & bindings::_IOC_DIRMASK +} + +/// Get the ioctl type from an ioctl number. +pub const fn _IOC_TYPE(nr: u32) -> u32 { + (nr >> bindings::_IOC_TYPESHIFT) & bindings::_IOC_TYPEMASK +} + +/// Get the ioctl number from an ioctl number. +pub const fn _IOC_NR(nr: u32) -> u32 { + (nr >> bindings::_IOC_NRSHIFT) & bindings::_IOC_NRMASK +} + +/// Get the ioctl size from an ioctl number. +pub const fn _IOC_SIZE(nr: u32) -> usize { + ((nr >> bindings::_IOC_SIZESHIFT) & bindings::_IOC_SIZEMASK) as usize +} diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 223564f9f0cc..7610b18ee642 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -30,6 +30,7 @@ compile_error!("Missing kernel configuration for conditional compilation"); mod allocator; mod build_assert; pub mod error; +pub mod ioctl; pub mod prelude; pub mod print; mod static_assert;