Skip to content

Commit 2773e96

Browse files
committed
use a _IOC const fn to generate constants
adopted from RFL
1 parent c18c416 commit 2773e96

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
@@ -4188,49 +4188,33 @@ pub const HWTSTAMP_FILTER_NTP_ALL: ::c_uint = 15;
41884188
// linux/ptp_clock.h
41894189
pub const PTP_MAX_SAMPLES: ::c_uint = 25; // Maximum allowed offset measurement samples.
41904190

4191-
cfg_if! {
4192-
if #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64", target_arch = "sparc64"))] {
4193-
pub const PTP_CLOCK_GETCAPS: ::c_uint = 0x40503d01;
4194-
pub const PTP_EXTTS_REQUEST: ::c_uint = 0x80103d02;
4195-
pub const PTP_PEROUT_REQUEST: ::c_uint = 0x80383d03;
4196-
pub const PTP_ENABLE_PPS: ::c_uint = 0x80043d04;
4197-
pub const PTP_SYS_OFFSET: ::c_uint = 0x83403d05;
4198-
pub const PTP_PIN_GETFUNC: ::c_uint = 0xc0603d06;
4199-
pub const PTP_PIN_SETFUNC: ::c_uint = 0x80603d07;
4200-
pub const PTP_SYS_OFFSET_PRECISE: ::c_uint = 0xc0403d08;
4201-
pub const PTP_SYS_OFFSET_EXTENDED: ::c_uint = 0xc4c03d09;
4202-
4203-
pub const PTP_CLOCK_GETCAPS2: ::c_uint = 0x40503d0a;
4204-
pub const PTP_EXTTS_REQUEST2: ::c_uint = 0x80103d0b;
4205-
pub const PTP_PEROUT_REQUEST2: ::c_uint = 0x80383d0c;
4206-
pub const PTP_ENABLE_PPS2: ::c_uint = 0x80043d0d;
4207-
pub const PTP_SYS_OFFSET2: ::c_uint = 0x83403d0e;
4208-
pub const PTP_PIN_GETFUNC2: ::c_uint = 0xc0603d0f;
4209-
pub const PTP_PIN_SETFUNC2: ::c_uint = 0x80603d10;
4210-
pub const PTP_SYS_OFFSET_PRECISE2: ::c_uint = 0xc0403d11;
4211-
pub const PTP_SYS_OFFSET_EXTENDED2: ::c_uint = 0xc4c03d12;
4212-
} else {
4213-
pub const PTP_CLOCK_GETCAPS: ::c_uint = 0x80503d01;
4214-
pub const PTP_EXTTS_REQUEST: ::c_uint = 0x40103d02;
4215-
pub const PTP_PEROUT_REQUEST: ::c_uint = 0x40383d03;
4216-
pub const PTP_ENABLE_PPS: ::c_uint = 0x40043d04;
4217-
pub const PTP_SYS_OFFSET: ::c_uint = 0x43403d05;
4218-
pub const PTP_PIN_GETFUNC: ::c_uint = 0xc0603d06;
4219-
pub const PTP_PIN_SETFUNC: ::c_uint = 0x40603d07;
4220-
pub const PTP_SYS_OFFSET_PRECISE: ::c_uint = 0xc0403d08;
4221-
pub const PTP_SYS_OFFSET_EXTENDED: ::c_uint = 0xc4c03d09;
4222-
4223-
pub const PTP_CLOCK_GETCAPS2: ::c_uint = 0x80503d0a;
4224-
pub const PTP_EXTTS_REQUEST2: ::c_uint = 0x40103d0b;
4225-
pub const PTP_PEROUT_REQUEST2: ::c_uint = 0x40383d0c;
4226-
pub const PTP_ENABLE_PPS2: ::c_uint = 0x40043d0d;
4227-
pub const PTP_SYS_OFFSET2: ::c_uint = 0x43403d0e;
4228-
pub const PTP_PIN_GETFUNC2: ::c_uint = 0xc0603d0f;
4229-
pub const PTP_PIN_SETFUNC2: ::c_uint = 0x40603d10;
4230-
pub const PTP_SYS_OFFSET_PRECISE2: ::c_uint = 0xc0403d11;
4231-
pub const PTP_SYS_OFFSET_EXTENDED2: ::c_uint = 0xc4c03d12;
4232-
}
4233-
}
4191+
const PTP_CLK_MAGIC: u32 = b'=' as u32;
4192+
4193+
pub const PTP_CLOCK_GETCAPS: ::c_uint = ioctl::_IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 1);
4194+
pub const PTP_EXTTS_REQUEST: ::c_uint = ioctl::_IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 2);
4195+
pub const PTP_PEROUT_REQUEST: ::c_uint = ioctl::_IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 3);
4196+
pub const PTP_ENABLE_PPS: ::c_uint = ioctl::_IOW::<::c_int>(PTP_CLK_MAGIC, 4);
4197+
pub const PTP_SYS_OFFSET: ::c_uint = ioctl::_IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 5);
4198+
pub const PTP_PIN_GETFUNC: ::c_uint = ioctl::_IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 6);
4199+
pub const PTP_PIN_SETFUNC: ::c_uint = ioctl::_IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 7);
4200+
pub const PTP_SYS_OFFSET_PRECISE: ::c_uint =
4201+
ioctl::_IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 8);
4202+
pub const PTP_SYS_OFFSET_EXTENDED: ::c_uint =
4203+
ioctl::_IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 9);
4204+
4205+
pub const PTP_CLOCK_GETCAPS2: ::c_uint = ioctl::_IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 10);
4206+
pub const PTP_EXTTS_REQUEST2: ::c_uint = ioctl::_IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 11);
4207+
pub const PTP_PEROUT_REQUEST2: ::c_uint = ioctl::_IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 12);
4208+
pub const PTP_ENABLE_PPS2: ::c_uint = ioctl::_IOW::<::c_int>(PTP_CLK_MAGIC, 13);
4209+
pub const PTP_SYS_OFFSET2: ::c_uint = ioctl::_IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 14);
4210+
pub const PTP_PIN_GETFUNC2: ::c_uint = ioctl::_IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 15);
4211+
pub const PTP_PIN_SETFUNC2: ::c_uint = ioctl::_IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 16);
4212+
pub const PTP_SYS_OFFSET_PRECISE2: ::c_uint =
4213+
ioctl::_IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 17);
4214+
pub const PTP_SYS_OFFSET_EXTENDED2: ::c_uint =
4215+
ioctl::_IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 18);
4216+
pub const PTP_MASK_CLEAR_ALL: ::c_uint = ioctl::_IO(PTP_CLK_MAGIC, 19);
4217+
pub const PTP_MASK_EN_SINGLE: ::c_uint = ioctl::_IOW::<::c_uint>(PTP_CLK_MAGIC, 20);
42344218

42354219
// enum ptp_pin_function
42364220
pub const PTP_PF_NONE: ::c_uint = 0;
@@ -6315,3 +6299,88 @@ expand_align!();
63156299

63166300
mod non_exhaustive;
63176301
pub use self::non_exhaustive::*;
6302+
6303+
mod ioctl {
6304+
const _IOC_NRBITS: u32 = 8;
6305+
const _IOC_TYPEBITS: u32 = 8;
6306+
6307+
// https://github.com/search?q=repo%3Atorvalds%2Flinux+%22%23define+_IOC_NONE%22&type=code
6308+
cfg_if! {
6309+
if #[cfg(any(
6310+
any(target_arch = "powerpc", target_arch = "powerpc64"),
6311+
any(target_arch = "sparc", target_arch = "sparc64"),
6312+
any(target_arch = "mips", target_arch = "mips64"),
6313+
))]
6314+
{
6315+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/powerpc/include/uapi/asm/ioctl.h
6316+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/sparc/include/uapi/asm/ioctl.h
6317+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/mips/include/uapi/asm/ioctl.h
6318+
6319+
const _IOC_SIZEBITS: u32 = 13;
6320+
const _IOC_DIRBITS: u32 = 3;
6321+
6322+
const _IOC_NONE: u32 = 1;
6323+
const _IOC_READ: u32 = 2;
6324+
const _IOC_WRITE: u32 = 4;
6325+
} else {
6326+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/include/uapi/asm-generic/ioctl.h
6327+
6328+
const _IOC_SIZEBITS: u32 = 14;
6329+
const _IOC_DIRBITS: u32 = 2;
6330+
6331+
const _IOC_NONE: u32 = 0;
6332+
const _IOC_WRITE: u32 = 1;
6333+
const _IOC_READ: u32 = 2;
6334+
}
6335+
}
6336+
6337+
const _IOC_NRMASK: u32 = (1 << _IOC_NRBITS) - 1;
6338+
const _IOC_TYPEMASK: u32 = (1 << _IOC_TYPEBITS) - 1;
6339+
const _IOC_SIZEMASK: u32 = (1 << _IOC_SIZEBITS) - 1;
6340+
const _IOC_DIRMASK: u32 = (1 << _IOC_DIRBITS) - 1;
6341+
6342+
const _IOC_NRSHIFT: u32 = 0;
6343+
const _IOC_TYPESHIFT: u32 = _IOC_NRSHIFT + _IOC_NRBITS;
6344+
const _IOC_SIZESHIFT: u32 = _IOC_TYPESHIFT + _IOC_TYPEBITS;
6345+
const _IOC_DIRSHIFT: u32 = _IOC_SIZESHIFT + _IOC_SIZEBITS;
6346+
6347+
// adopted from https://github.com/torvalds/linux/blob/8a696a29c6905594e4abf78eaafcb62165ac61f1/rust/kernel/ioctl.rs
6348+
6349+
/// Build an ioctl number, analogous to the C macro of the same name.
6350+
#[inline(always)]
6351+
const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 {
6352+
debug_assert!(dir <= _IOC_DIRMASK);
6353+
debug_assert!(ty <= _IOC_TYPEMASK);
6354+
debug_assert!(nr <= _IOC_NRMASK);
6355+
debug_assert!(size <= (_IOC_SIZEMASK as usize));
6356+
6357+
(dir << _IOC_DIRSHIFT)
6358+
| (ty << _IOC_TYPESHIFT)
6359+
| (nr << _IOC_NRSHIFT)
6360+
| ((size as u32) << _IOC_SIZESHIFT)
6361+
}
6362+
6363+
/// Build an ioctl number for an argumentless ioctl.
6364+
#[inline(always)]
6365+
pub const fn _IO(ty: u32, nr: u32) -> u32 {
6366+
_IOC(_IOC_NONE, ty, nr, 0)
6367+
}
6368+
6369+
/// Build an ioctl number for an read-only ioctl.
6370+
#[inline(always)]
6371+
pub const fn _IOR<T>(ty: u32, nr: u32) -> u32 {
6372+
_IOC(_IOC_READ, ty, nr, core::mem::size_of::<T>())
6373+
}
6374+
6375+
/// Build an ioctl number for an write-only ioctl.
6376+
#[inline(always)]
6377+
pub const fn _IOW<T>(ty: u32, nr: u32) -> u32 {
6378+
_IOC(_IOC_WRITE, ty, nr, core::mem::size_of::<T>())
6379+
}
6380+
6381+
/// Build an ioctl number for a read-write ioctl.
6382+
#[inline(always)]
6383+
pub const fn _IOWR<T>(ty: u32, nr: u32) -> u32 {
6384+
_IOC(_IOC_READ | _IOC_WRITE, ty, nr, core::mem::size_of::<T>())
6385+
}
6386+
}

0 commit comments

Comments
 (0)