Skip to content

Commit 10823d4

Browse files
committed
use a _IOC const fn to generate constants
adopted from RFL
1 parent 6880a33 commit 10823d4

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

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

42324216
// enum ptp_pin_function
42334217
pub const PTP_PF_NONE: ::c_uint = 0;
@@ -6312,3 +6296,88 @@ expand_align!();
63126296

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

0 commit comments

Comments
 (0)