From patchwork Thu Mar 23 12:08:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Asahi Lina X-Patchwork-Id: 74043 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:604a:0:0:0:0:0 with SMTP id j10csp2874540wrt; Thu, 23 Mar 2023 05:16:10 -0700 (PDT) X-Google-Smtp-Source: AK7set8K+oDF1cVGjawq+jea8vYddNrds2VOp782T3DhnbYVTBlTEM5kF5yYzQ0T5wxWwOrPs+IW X-Received: by 2002:aa7:d7d4:0:b0:501:d43e:d1dd with SMTP id e20-20020aa7d7d4000000b00501d43ed1ddmr9233418eds.33.1679573770816; Thu, 23 Mar 2023 05:16:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679573770; cv=none; d=google.com; s=arc-20160816; b=E6rqFTIMCU/xlC9R11lwKIXzAb+xHuy/w4ct/cyLk4sJlunfeeBaGF4hrtXl6Sc/g7 ZXOqJ0+cl4ysvLBeroL03ac2s/uBHfw4AKOX6IpJj3fCa3JY5hxxK0SCHZTYKlmaSbGD 6QCVMdravh0Nd0xaA2spfL8WZYNqqfjzECLc827TRGTYfBM/S1WsXLk0QKQweFzW2VYg QphQSdmXHPOkeO12WeH1Z6VdwbOPSy/NcMm4aYvuR12BX5yUkoQsXeClm2t257QNJtWF BAp0a7En8boy51ASJwta8B7510tfZkp6gxe6NMXJHPnj3RD0/tYk8WVRLzLWr2BQBX75 OjVA== 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=qtNowLjTInpyEHb55nM9GmYkWY2x0fhDJySBc250aOE=; b=m/iFgaBLSN9LPAvX5NbAO+qw1ZiXwlreavdc179qd7MdC9IigzBV7luHciYulsLowX OKH5QO+uskvuFPL6hZtvf3hoM3qv/agaIBIyPSY0+/RVTCwA8622KGIJrmPjRd5Og/xV /lnqgKr6DTj0CVoc41p+UJD9RWZxzLhyqwTBz5I0XoqZW2BZRvzh5B5iiqqtmxZjdHT2 bIwrEGpnDzs6k/06HzAwLSTmtZHBQQnzIxZVhFkYWgLdl1auabb6z3SQAFND3EvIY/8I pvKuE0tnypcU5aQI1iren/6O30cBGUB91m4f6lLPmYPtSWij0joOjQNxgG7S1kGzmkhU QAuA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@asahilina.net header.s=default header.b=b5r9D30n; 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 a26-20020a1709064a5a00b00931038178ecsi15341818ejv.330.2023.03.23.05.15.47; Thu, 23 Mar 2023 05:16:10 -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=b5r9D30n; 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 S230373AbjCWMJE (ORCPT + 99 others); Thu, 23 Mar 2023 08:09:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40424 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229775AbjCWMJB (ORCPT ); Thu, 23 Mar 2023 08:09:01 -0400 Received: from mail.marcansoft.com (marcansoft.com [212.63.210.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3FC59269E; Thu, 23 Mar 2023 05:08:59 -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 C95AD421F5; Thu, 23 Mar 2023 12:08:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=asahilina.net; s=default; t=1679573336; bh=sYPq8DVDqYDKIlu8xuvRRYDZkcKq3MJzONMmKDC0UM4=; h=From:Date:Subject:To:Cc; b=b5r9D30nX6KXu9h9G5IiPVFFfIWwAYiP84ipgYGlmyVxNPiAoEMl+Mp2qj0vyS1NK bP67cZcyyUX1L+WbQAmENjtiqzVzjt1rhn0U+Lxvvz2Fpor1Sm8Cih3cUZhzNUPixh u0up56pJmVYi7pNoledGlPqPuz1duVnFMhMWC4XvfGnqXklxAbtogJ/XE4PWHLThMm rWzjIvJ6gSXq+Sg2OxMHMCF013HVxMWjYiUuvTFqK9FlIh7pVVBF4TKrUmIURnmgvm Pyc7VsWZDicDZFE2te2a8iegBSqeuvXwW6Vhgoqwn8h5wT1x04r76nsVq0fkfPgEsL GymOeIrun/HUw== From: Asahi Lina Date: Thu, 23 Mar 2023 21:08:47 +0900 Subject: [PATCH v2] rust: ioctl: Add ioctl number manipulation functions MIME-Version: 1.0 Message-Id: <20230224-rust-ioctl-v2-1-5325e76a92df@asahilina.net> X-B4-Tracking: v=1; b=H4sIAE5BHGQC/22NQQ6CMBBFr2K6tkqnYNSV9zAsBhjoJKSQTiEaw t1tWbt8P//lbUooMIl6njYVaGXhySeA80m1Dv1AmrvECgqwBUCpwyJR89TGUWMFRW+psYh3lYQ GhXQT0LcuK8O8XI933iEf5kA9f47au07sWOIUvkd8NXn921mNNroyJXT2VuHDli8UdDyyx4unq Op933+pCs51yQAAAA== 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=1679573333; l=4141; i=lina@asahilina.net; s=20230221; h=from:subject:message-id; bh=sYPq8DVDqYDKIlu8xuvRRYDZkcKq3MJzONMmKDC0UM4=; b=F+5I18tAITjTn4Cl9G85fDVFPqZZZOIJ9kK2woOoY4IUVIUPjhN/89l3WByg3T6/jNMqzVfVB pA27X5lTLFrB2tQUr0JyeTRlIAVG8n7i3ab8VbRAwvS48DYggKDKJ4S 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?1761160746645540486?= 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 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 | 64 +++++++++++++++++++++++++++++++++++++++++ rust/kernel/lib.rs | 1 + 3 files changed, 67 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..6cd8e5738b91 --- /dev/null +++ b/rust/kernel/ioctl.rs @@ -0,0 +1,64 @@ +// 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) + +/// Build an ioctl number, analogous to the C macro of the same name. +const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 { + core::assert!(dir <= bindings::_IOC_DIRMASK); + core::assert!(ty <= bindings::_IOC_TYPEMASK); + core::assert!(nr <= bindings::_IOC_NRMASK); + core::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. +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. +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. +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. +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;