Skip to content

Commit e23acab

Browse files
committed
use a _IOC const fn to generate constants
adopted from RFL
1 parent 42d149b commit e23acab

File tree

1 file changed

+112
-43
lines changed
  • src/unix/linux_like/linux

1 file changed

+112
-43
lines changed

src/unix/linux_like/linux/mod.rs

+112-43
Original file line numberDiff line numberDiff line change
@@ -3736,49 +3736,33 @@ pub const HWTSTAMP_FILTER_NTP_ALL: ::c_uint = 15;
37363736
// linux/ptp_clock.h
37373737
pub const PTP_MAX_SAMPLES: ::c_uint = 25; // Maximum allowed offset measurement samples.
37383738

3739-
cfg_if! {
3740-
if #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64", target_arch = "sparc64"))] {
3741-
pub const PTP_CLOCK_GETCAPS: ::c_uint = 0x40503d01;
3742-
pub const PTP_EXTTS_REQUEST: ::c_uint = 0x80103d02;
3743-
pub const PTP_PEROUT_REQUEST: ::c_uint = 0x80383d03;
3744-
pub const PTP_ENABLE_PPS: ::c_uint = 0x80043d04;
3745-
pub const PTP_SYS_OFFSET: ::c_uint = 0x83403d05;
3746-
pub const PTP_PIN_GETFUNC: ::c_uint = 0xc0603d06;
3747-
pub const PTP_PIN_SETFUNC: ::c_uint = 0x80603d07;
3748-
pub const PTP_SYS_OFFSET_PRECISE: ::c_uint = 0xc0403d08;
3749-
pub const PTP_SYS_OFFSET_EXTENDED: ::c_uint = 0xc4c03d09;
3750-
3751-
pub const PTP_CLOCK_GETCAPS2: ::c_uint = 0x40503d0a;
3752-
pub const PTP_EXTTS_REQUEST2: ::c_uint = 0x80103d0b;
3753-
pub const PTP_PEROUT_REQUEST2: ::c_uint = 0x80383d0c;
3754-
pub const PTP_ENABLE_PPS2: ::c_uint = 0x80043d0d;
3755-
pub const PTP_SYS_OFFSET2: ::c_uint = 0x83403d0e;
3756-
pub const PTP_PIN_GETFUNC2: ::c_uint = 0xc0603d0f;
3757-
pub const PTP_PIN_SETFUNC2: ::c_uint = 0x80603d10;
3758-
pub const PTP_SYS_OFFSET_PRECISE2: ::c_uint = 0xc0403d11;
3759-
pub const PTP_SYS_OFFSET_EXTENDED2: ::c_uint = 0xc4c03d12;
3760-
} else {
3761-
pub const PTP_CLOCK_GETCAPS: ::c_uint = 0x80503d01;
3762-
pub const PTP_EXTTS_REQUEST: ::c_uint = 0x40103d02;
3763-
pub const PTP_PEROUT_REQUEST: ::c_uint = 0x40383d03;
3764-
pub const PTP_ENABLE_PPS: ::c_uint = 0x40043d04;
3765-
pub const PTP_SYS_OFFSET: ::c_uint = 0x43403d05;
3766-
pub const PTP_PIN_GETFUNC: ::c_uint = 0xc0603d06;
3767-
pub const PTP_PIN_SETFUNC: ::c_uint = 0x40603d07;
3768-
pub const PTP_SYS_OFFSET_PRECISE: ::c_uint = 0xc0403d08;
3769-
pub const PTP_SYS_OFFSET_EXTENDED: ::c_uint = 0xc4c03d09;
3770-
3771-
pub const PTP_CLOCK_GETCAPS2: ::c_uint = 0x80503d0a;
3772-
pub const PTP_EXTTS_REQUEST2: ::c_uint = 0x40103d0b;
3773-
pub const PTP_PEROUT_REQUEST2: ::c_uint = 0x40383d0c;
3774-
pub const PTP_ENABLE_PPS2: ::c_uint = 0x40043d0d;
3775-
pub const PTP_SYS_OFFSET2: ::c_uint = 0x43403d0e;
3776-
pub const PTP_PIN_GETFUNC2: ::c_uint = 0xc0603d0f;
3777-
pub const PTP_PIN_SETFUNC2: ::c_uint = 0x40603d10;
3778-
pub const PTP_SYS_OFFSET_PRECISE2: ::c_uint = 0xc0403d11;
3779-
pub const PTP_SYS_OFFSET_EXTENDED2: ::c_uint = 0xc4c03d12;
3780-
}
3781-
}
3739+
const PTP_CLK_MAGIC: u32 = b'=' as u32;
3740+
3741+
pub const PTP_CLOCK_GETCAPS: ::c_uint = ioctl::_IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 1);
3742+
pub const PTP_EXTTS_REQUEST: ::c_uint = ioctl::_IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 2);
3743+
pub const PTP_PEROUT_REQUEST: ::c_uint = ioctl::_IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 3);
3744+
pub const PTP_ENABLE_PPS: ::c_uint = ioctl::_IOW::<::c_int>(PTP_CLK_MAGIC, 4);
3745+
pub const PTP_SYS_OFFSET: ::c_uint = ioctl::_IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 5);
3746+
pub const PTP_PIN_GETFUNC: ::c_uint = ioctl::_IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 6);
3747+
pub const PTP_PIN_SETFUNC: ::c_uint = ioctl::_IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 7);
3748+
pub const PTP_SYS_OFFSET_PRECISE: ::c_uint =
3749+
ioctl::_IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 8);
3750+
pub const PTP_SYS_OFFSET_EXTENDED: ::c_uint =
3751+
ioctl::_IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 9);
3752+
3753+
pub const PTP_CLOCK_GETCAPS2: ::c_uint = ioctl::_IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 10);
3754+
pub const PTP_EXTTS_REQUEST2: ::c_uint = ioctl::_IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 11);
3755+
pub const PTP_PEROUT_REQUEST2: ::c_uint = ioctl::_IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 12);
3756+
pub const PTP_ENABLE_PPS2: ::c_uint = ioctl::_IOW::<::c_int>(PTP_CLK_MAGIC, 13);
3757+
pub const PTP_SYS_OFFSET2: ::c_uint = ioctl::_IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 14);
3758+
pub const PTP_PIN_GETFUNC2: ::c_uint = ioctl::_IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 15);
3759+
pub const PTP_PIN_SETFUNC2: ::c_uint = ioctl::_IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 16);
3760+
pub const PTP_SYS_OFFSET_PRECISE2: ::c_uint =
3761+
ioctl::_IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 17);
3762+
pub const PTP_SYS_OFFSET_EXTENDED2: ::c_uint =
3763+
ioctl::_IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 18);
3764+
pub const PTP_MASK_CLEAR_ALL: ::c_uint = ioctl::_IO(PTP_CLK_MAGIC, 19);
3765+
pub const PTP_MASK_EN_SINGLE: ::c_uint = ioctl::_IOW::<::c_uint>(PTP_CLK_MAGIC, 20);
37823766

37833767
// enum ptp_pin_function
37843768
pub const PTP_PF_NONE: ::c_uint = 0;
@@ -5840,3 +5824,88 @@ cfg_if! {
58405824
pub use self::non_exhaustive::*;
58415825
}
58425826
}
5827+
5828+
mod ioctl {
5829+
const _IOC_NRBITS: u32 = 8;
5830+
const _IOC_TYPEBITS: u32 = 8;
5831+
5832+
// https://github.com/search?q=repo%3Atorvalds%2Flinux+%22%23define+_IOC_NONE%22&type=code
5833+
cfg_if! {
5834+
if #[cfg(any(
5835+
any(target_arch = "powerpc", target_arch = "powerpc64"),
5836+
any(target_arch = "sparc", target_arch = "sparc64"),
5837+
any(target_arch = "mips", target_arch = "mips64"),
5838+
))]
5839+
{
5840+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/powerpc/include/uapi/asm/ioctl.h
5841+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/sparc/include/uapi/asm/ioctl.h
5842+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/mips/include/uapi/asm/ioctl.h
5843+
5844+
const _IOC_SIZEBITS: u32 = 13;
5845+
const _IOC_DIRBITS: u32 = 3;
5846+
5847+
const _IOC_NONE: u32 = 1;
5848+
const _IOC_READ: u32 = 2;
5849+
const _IOC_WRITE: u32 = 4;
5850+
} else {
5851+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/include/uapi/asm-generic/ioctl.h
5852+
5853+
const _IOC_SIZEBITS: u32 = 14;
5854+
const _IOC_DIRBITS: u32 = 2;
5855+
5856+
const _IOC_NONE: u32 = 0;
5857+
const _IOC_WRITE: u32 = 1;
5858+
const _IOC_READ: u32 = 2;
5859+
}
5860+
}
5861+
5862+
const _IOC_NRMASK: u32 = (1 << _IOC_NRBITS) - 1;
5863+
const _IOC_TYPEMASK: u32 = (1 << _IOC_TYPEBITS) - 1;
5864+
const _IOC_SIZEMASK: u32 = (1 << _IOC_SIZEBITS) - 1;
5865+
const _IOC_DIRMASK: u32 = (1 << _IOC_DIRBITS) - 1;
5866+
5867+
const _IOC_NRSHIFT: u32 = 0;
5868+
const _IOC_TYPESHIFT: u32 = _IOC_NRSHIFT + _IOC_NRBITS;
5869+
const _IOC_SIZESHIFT: u32 = _IOC_TYPESHIFT + _IOC_TYPEBITS;
5870+
const _IOC_DIRSHIFT: u32 = _IOC_SIZESHIFT + _IOC_SIZEBITS;
5871+
5872+
// adopted from https://github.com/torvalds/linux/blob/8a696a29c6905594e4abf78eaafcb62165ac61f1/rust/kernel/ioctl.rs
5873+
5874+
/// Build an ioctl number, analogous to the C macro of the same name.
5875+
#[inline(always)]
5876+
const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 {
5877+
debug_assert!(dir <= _IOC_DIRMASK);
5878+
debug_assert!(ty <= _IOC_TYPEMASK);
5879+
debug_assert!(nr <= _IOC_NRMASK);
5880+
debug_assert!(size <= (_IOC_SIZEMASK as usize));
5881+
5882+
(dir << _IOC_DIRSHIFT)
5883+
| (ty << _IOC_TYPESHIFT)
5884+
| (nr << _IOC_NRSHIFT)
5885+
| ((size as u32) << _IOC_SIZESHIFT)
5886+
}
5887+
5888+
/// Build an ioctl number for an argumentless ioctl.
5889+
#[inline(always)]
5890+
pub const fn _IO(ty: u32, nr: u32) -> u32 {
5891+
_IOC(_IOC_NONE, ty, nr, 0)
5892+
}
5893+
5894+
/// Build an ioctl number for an read-only ioctl.
5895+
#[inline(always)]
5896+
pub const fn _IOR<T>(ty: u32, nr: u32) -> u32 {
5897+
_IOC(_IOC_READ, ty, nr, core::mem::size_of::<T>())
5898+
}
5899+
5900+
/// Build an ioctl number for an write-only ioctl.
5901+
#[inline(always)]
5902+
pub const fn _IOW<T>(ty: u32, nr: u32) -> u32 {
5903+
_IOC(_IOC_WRITE, ty, nr, core::mem::size_of::<T>())
5904+
}
5905+
5906+
/// Build an ioctl number for a read-write ioctl.
5907+
#[inline(always)]
5908+
pub const fn _IOWR<T>(ty: u32, nr: u32) -> u32 {
5909+
_IOC(_IOC_READ | _IOC_WRITE, ty, nr, core::mem::size_of::<T>())
5910+
}
5911+
}

0 commit comments

Comments
 (0)