Skip to content

Commit 236f488

Browse files
committed
add ptp_pin_function and most PTP_ constants
We cannot (apparently) use a type alias for `ptp_pin_function` because CI is unhappy with that (e.g. https://github.com/rust-lang/libc/actions/runs/11921706273/job/33226419934?pr=4114) We can always add that type alias later; it's not a breaking change
1 parent 05e45fd commit 236f488

File tree

3 files changed

+142
-0
lines changed

3 files changed

+142
-0
lines changed

libc-test/build.rs

+12
Original file line numberDiff line numberDiff line change
@@ -3903,6 +3903,18 @@ fn test_linux(target: &str) {
39033903
{
39043904
return true;
39053905
}
3906+
// FIXME: Requires >= 5.4 kernel headers
3907+
if name == "PTP_ENABLE_PPS2"
3908+
|| name == "PTP_EXTTS_REQUEST2"
3909+
|| name == "PTP_PEROUT_REQUEST2"
3910+
|| name == "PTP_PIN_GETFUNC2"
3911+
|| name == "PTP_PIN_SETFUNC2"
3912+
|| name == "PTP_SYS_OFFSET2"
3913+
|| name == "PTP_SYS_OFFSET_PRECISE2"
3914+
|| name == "PTP_SYS_OFFSET_EXTENDED2"
3915+
{
3916+
return true;
3917+
}
39063918
// FIXME: Requires >= 5.4.1 kernel headers
39073919
if name.starts_with("J1939")
39083920
|| name.starts_with("RTEXT_FILTER_")

libc-test/semver/linux.txt

+20
Original file line numberDiff line numberDiff line change
@@ -2252,7 +2252,27 @@ PTHREAD_PRIO_PROTECT
22522252
PTHREAD_PROCESS_PRIVATE
22532253
PTHREAD_PROCESS_SHARED
22542254
PTHREAD_STACK_MIN
2255+
PTP_ENABLE_PPS
2256+
PTP_ENABLE_PPS2
2257+
PTP_EXTTS_REQUEST
2258+
PTP_EXTTS_REQUEST2
22552259
PTP_MAX_SAMPLES
2260+
PTP_PEROUT_REQUEST
2261+
PTP_PEROUT_REQUEST2
2262+
PTP_PF_EXTTS
2263+
PTP_PF_NONE
2264+
PTP_PF_PEROUT
2265+
PTP_PF_PHYSYNC
2266+
PTP_PIN_GETFUNC
2267+
PTP_PIN_GETFUNC2
2268+
PTP_PIN_SETFUNC
2269+
PTP_PIN_SETFUNC2
2270+
PTP_SYS_OFFSET
2271+
PTP_SYS_OFFSET2
2272+
PTP_SYS_OFFSET_EXTENDED
2273+
PTP_SYS_OFFSET_EXTENDED2
2274+
PTP_SYS_OFFSET_PRECISE
2275+
PTP_SYS_OFFSET_PRECISE2
22562276
PTRACE_ATTACH
22572277
PTRACE_CONT
22582278
PTRACE_DETACH

src/unix/linux_like/linux/mod.rs

+110
Original file line numberDiff line numberDiff line change
@@ -4541,6 +4541,36 @@ pub const HWTSTAMP_FILTER_NTP_ALL: ::c_uint = 15;
45414541
// linux/ptp_clock.h
45424542
pub const PTP_MAX_SAMPLES: ::c_uint = 25; // Maximum allowed offset measurement samples.
45434543

4544+
const PTP_CLK_MAGIC: u32 = b'=' as u32;
4545+
4546+
// FIXME: needs the ptp_clock_caps struct
4547+
// pub const PTP_CLOCK_GETCAPS: ::c_uint = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 1);
4548+
pub const PTP_EXTTS_REQUEST: ::c_uint = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 2);
4549+
pub const PTP_PEROUT_REQUEST: ::c_uint = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 3);
4550+
pub const PTP_ENABLE_PPS: ::c_uint = _IOW::<::c_int>(PTP_CLK_MAGIC, 4);
4551+
pub const PTP_SYS_OFFSET: ::c_uint = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 5);
4552+
pub const PTP_PIN_GETFUNC: ::c_uint = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 6);
4553+
pub const PTP_PIN_SETFUNC: ::c_uint = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 7);
4554+
pub const PTP_SYS_OFFSET_PRECISE: ::c_uint = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 8);
4555+
pub const PTP_SYS_OFFSET_EXTENDED: ::c_uint = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 9);
4556+
4557+
// FIXME: needs the ptp_clock_caps struct
4558+
// pub const PTP_CLOCK_GETCAPS2: ::c_uint = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 10);
4559+
pub const PTP_EXTTS_REQUEST2: ::c_uint = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 11);
4560+
pub const PTP_PEROUT_REQUEST2: ::c_uint = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 12);
4561+
pub const PTP_ENABLE_PPS2: ::c_uint = _IOW::<::c_int>(PTP_CLK_MAGIC, 13);
4562+
pub const PTP_SYS_OFFSET2: ::c_uint = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 14);
4563+
pub const PTP_PIN_GETFUNC2: ::c_uint = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 15);
4564+
pub const PTP_PIN_SETFUNC2: ::c_uint = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 16);
4565+
pub const PTP_SYS_OFFSET_PRECISE2: ::c_uint = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 17);
4566+
pub const PTP_SYS_OFFSET_EXTENDED2: ::c_uint = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 18);
4567+
4568+
// enum ptp_pin_function
4569+
pub const PTP_PF_NONE: ::c_uint = 0;
4570+
pub const PTP_PF_EXTTS: ::c_uint = 1;
4571+
pub const PTP_PF_PEROUT: ::c_uint = 2;
4572+
pub const PTP_PF_PHYSYNC: ::c_uint = 3;
4573+
45444574
// linux/tls.h
45454575
pub const TLS_TX: ::c_int = 1;
45464576
pub const TLS_RX: ::c_int = 2;
@@ -5595,6 +5625,86 @@ pub const SCHED_FLAG_ALL: ::c_int = SCHED_FLAG_RESET_ON_FORK
55955625
pub const EPIOCSPARAMS: ::Ioctl = 0x40088a01;
55965626
pub const EPIOCGPARAMS: ::Ioctl = 0x80088a02;
55975627

5628+
const _IOC_NRBITS: u32 = 8;
5629+
const _IOC_TYPEBITS: u32 = 8;
5630+
5631+
// https://github.com/search?q=repo%3Atorvalds%2Flinux+%22%23define+_IOC_NONE%22&type=code
5632+
cfg_if! {
5633+
if #[cfg(any(
5634+
any(target_arch = "powerpc", target_arch = "powerpc64"),
5635+
any(target_arch = "sparc", target_arch = "sparc64"),
5636+
any(target_arch = "mips", target_arch = "mips64"),
5637+
))] {
5638+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/powerpc/include/uapi/asm/ioctl.h
5639+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/sparc/include/uapi/asm/ioctl.h
5640+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/mips/include/uapi/asm/ioctl.h
5641+
5642+
const _IOC_SIZEBITS: u32 = 13;
5643+
const _IOC_DIRBITS: u32 = 3;
5644+
5645+
const _IOC_NONE: u32 = 1;
5646+
const _IOC_READ: u32 = 2;
5647+
const _IOC_WRITE: u32 = 4;
5648+
} else {
5649+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/include/uapi/asm-generic/ioctl.h
5650+
5651+
const _IOC_SIZEBITS: u32 = 14;
5652+
const _IOC_DIRBITS: u32 = 2;
5653+
5654+
const _IOC_NONE: u32 = 0;
5655+
const _IOC_WRITE: u32 = 1;
5656+
const _IOC_READ: u32 = 2;
5657+
}
5658+
}
5659+
5660+
const _IOC_NRMASK: u32 = (1 << _IOC_NRBITS) - 1;
5661+
const _IOC_TYPEMASK: u32 = (1 << _IOC_TYPEBITS) - 1;
5662+
const _IOC_SIZEMASK: u32 = (1 << _IOC_SIZEBITS) - 1;
5663+
const _IOC_DIRMASK: u32 = (1 << _IOC_DIRBITS) - 1;
5664+
5665+
const _IOC_NRSHIFT: u32 = 0;
5666+
const _IOC_TYPESHIFT: u32 = _IOC_NRSHIFT + _IOC_NRBITS;
5667+
const _IOC_SIZESHIFT: u32 = _IOC_TYPESHIFT + _IOC_TYPEBITS;
5668+
const _IOC_DIRSHIFT: u32 = _IOC_SIZESHIFT + _IOC_SIZEBITS;
5669+
5670+
// adapted from https://github.com/torvalds/linux/blob/8a696a29c6905594e4abf78eaafcb62165ac61f1/rust/kernel/ioctl.rs
5671+
5672+
/// Build an ioctl number, analogous to the C macro of the same name.
5673+
const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 {
5674+
// FIXME(ctest) the `garando_syntax` crate (used by ctest2 in the CI test suite)
5675+
// cannot currently parse these `debug_assert!`s
5676+
//
5677+
// debug_assert!(dir <= _IOC_DIRMASK);
5678+
// debug_assert!(ty <= _IOC_TYPEMASK);
5679+
// debug_assert!(nr <= _IOC_NRMASK);
5680+
// debug_assert!(size <= (_IOC_SIZEMASK as usize));
5681+
5682+
(dir << _IOC_DIRSHIFT)
5683+
| (ty << _IOC_TYPESHIFT)
5684+
| (nr << _IOC_NRSHIFT)
5685+
| ((size as u32) << _IOC_SIZESHIFT)
5686+
}
5687+
5688+
/// Build an ioctl number for an argumentless ioctl.
5689+
pub(crate) const fn _IO(ty: u32, nr: u32) -> u32 {
5690+
_IOC(_IOC_NONE, ty, nr, 0)
5691+
}
5692+
5693+
/// Build an ioctl number for an read-only ioctl.
5694+
pub(crate) const fn _IOR<T>(ty: u32, nr: u32) -> u32 {
5695+
_IOC(_IOC_READ, ty, nr, core::mem::size_of::<T>())
5696+
}
5697+
5698+
/// Build an ioctl number for an write-only ioctl.
5699+
pub(crate) const fn _IOW<T>(ty: u32, nr: u32) -> u32 {
5700+
_IOC(_IOC_WRITE, ty, nr, core::mem::size_of::<T>())
5701+
}
5702+
5703+
/// Build an ioctl number for a read-write ioctl.
5704+
pub(crate) const fn _IOWR<T>(ty: u32, nr: u32) -> u32 {
5705+
_IOC(_IOC_READ | _IOC_WRITE, ty, nr, core::mem::size_of::<T>())
5706+
}
5707+
55985708
f! {
55995709
pub fn NLA_ALIGN(len: ::c_int) -> ::c_int {
56005710
return ((len) + NLA_ALIGNTO - 1) & !(NLA_ALIGNTO - 1);

0 commit comments

Comments
 (0)