Skip to content

Commit 214e43a

Browse files
folkertdevtgross35
authored andcommitted
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 (backport <rust-lang#4114>) (cherry picked from commit a2ec642)
1 parent d0ed18d commit 214e43a

File tree

3 files changed

+146
-0
lines changed

3 files changed

+146
-0
lines changed

libc-test/build.rs

+16
Original file line numberDiff line numberDiff line change
@@ -3968,6 +3968,22 @@ fn test_linux(target: &str) {
39683968
{
39693969
return true;
39703970
}
3971+
// FIXME: Requires >= 4.20 kernel headers
3972+
if name == "PTP_SYS_OFFSET_EXTENDED" {
3973+
return true;
3974+
}
3975+
// FIXME: Requires >= 5.4 kernel headers
3976+
if name == "PTP_ENABLE_PPS2"
3977+
|| name == "PTP_EXTTS_REQUEST2"
3978+
|| name == "PTP_PEROUT_REQUEST2"
3979+
|| name == "PTP_PIN_GETFUNC2"
3980+
|| name == "PTP_PIN_SETFUNC2"
3981+
|| name == "PTP_SYS_OFFSET2"
3982+
|| name == "PTP_SYS_OFFSET_PRECISE2"
3983+
|| name == "PTP_SYS_OFFSET_EXTENDED2"
3984+
{
3985+
return true;
3986+
}
39713987
// FIXME: Requires >= 5.4.1 kernel headers
39723988
if name.starts_with("J1939")
39733989
|| 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
@@ -4581,6 +4581,36 @@ pub const HWTSTAMP_FILTER_NTP_ALL: ::c_uint = 15;
45814581
// linux/ptp_clock.h
45824582
pub const PTP_MAX_SAMPLES: ::c_uint = 25; // Maximum allowed offset measurement samples.
45834583

4584+
const PTP_CLK_MAGIC: u32 = b'=' as u32;
4585+
4586+
// FIXME: needs the ptp_clock_caps struct
4587+
// pub const PTP_CLOCK_GETCAPS: ::c_uint = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 1);
4588+
pub const PTP_EXTTS_REQUEST: ::c_uint = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 2);
4589+
pub const PTP_PEROUT_REQUEST: ::c_uint = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 3);
4590+
pub const PTP_ENABLE_PPS: ::c_uint = _IOW::<::c_int>(PTP_CLK_MAGIC, 4);
4591+
pub const PTP_SYS_OFFSET: ::c_uint = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 5);
4592+
pub const PTP_PIN_GETFUNC: ::c_uint = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 6);
4593+
pub const PTP_PIN_SETFUNC: ::c_uint = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 7);
4594+
pub const PTP_SYS_OFFSET_PRECISE: ::c_uint = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 8);
4595+
pub const PTP_SYS_OFFSET_EXTENDED: ::c_uint = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 9);
4596+
4597+
// FIXME: needs the ptp_clock_caps struct
4598+
// pub const PTP_CLOCK_GETCAPS2: ::c_uint = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 10);
4599+
pub const PTP_EXTTS_REQUEST2: ::c_uint = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 11);
4600+
pub const PTP_PEROUT_REQUEST2: ::c_uint = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 12);
4601+
pub const PTP_ENABLE_PPS2: ::c_uint = _IOW::<::c_int>(PTP_CLK_MAGIC, 13);
4602+
pub const PTP_SYS_OFFSET2: ::c_uint = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 14);
4603+
pub const PTP_PIN_GETFUNC2: ::c_uint = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 15);
4604+
pub const PTP_PIN_SETFUNC2: ::c_uint = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 16);
4605+
pub const PTP_SYS_OFFSET_PRECISE2: ::c_uint = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 17);
4606+
pub const PTP_SYS_OFFSET_EXTENDED2: ::c_uint = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 18);
4607+
4608+
// enum ptp_pin_function
4609+
pub const PTP_PF_NONE: ::c_uint = 0;
4610+
pub const PTP_PF_EXTTS: ::c_uint = 1;
4611+
pub const PTP_PF_PEROUT: ::c_uint = 2;
4612+
pub const PTP_PF_PHYSYNC: ::c_uint = 3;
4613+
45844614
// linux/tls.h
45854615
pub const TLS_TX: ::c_int = 1;
45864616
pub const TLS_RX: ::c_int = 2;
@@ -5635,6 +5665,86 @@ pub const SCHED_FLAG_ALL: ::c_int = SCHED_FLAG_RESET_ON_FORK
56355665
pub const EPIOCSPARAMS: ::Ioctl = 0x40088a01;
56365666
pub const EPIOCGPARAMS: ::Ioctl = 0x80088a02;
56375667

5668+
const _IOC_NRBITS: u32 = 8;
5669+
const _IOC_TYPEBITS: u32 = 8;
5670+
5671+
// https://github.com./search?q=repo%3Atorvalds%2Flinux+%22%23define+_IOC_NONE%22&type=code
5672+
cfg_if! {
5673+
if #[cfg(any(
5674+
any(target_arch = "powerpc", target_arch = "powerpc64"),
5675+
any(target_arch = "sparc", target_arch = "sparc64"),
5676+
any(target_arch = "mips", target_arch = "mips64"),
5677+
))] {
5678+
// https://github.com./torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/powerpc/include/uapi/asm/ioctl.h
5679+
// https://github.com./torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/sparc/include/uapi/asm/ioctl.h
5680+
// https://github.com./torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/mips/include/uapi/asm/ioctl.h
5681+
5682+
const _IOC_SIZEBITS: u32 = 13;
5683+
const _IOC_DIRBITS: u32 = 3;
5684+
5685+
const _IOC_NONE: u32 = 1;
5686+
const _IOC_READ: u32 = 2;
5687+
const _IOC_WRITE: u32 = 4;
5688+
} else {
5689+
// https://github.com./torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/include/uapi/asm-generic/ioctl.h
5690+
5691+
const _IOC_SIZEBITS: u32 = 14;
5692+
const _IOC_DIRBITS: u32 = 2;
5693+
5694+
const _IOC_NONE: u32 = 0;
5695+
const _IOC_WRITE: u32 = 1;
5696+
const _IOC_READ: u32 = 2;
5697+
}
5698+
}
5699+
5700+
const _IOC_NRMASK: u32 = (1 << _IOC_NRBITS) - 1;
5701+
const _IOC_TYPEMASK: u32 = (1 << _IOC_TYPEBITS) - 1;
5702+
const _IOC_SIZEMASK: u32 = (1 << _IOC_SIZEBITS) - 1;
5703+
const _IOC_DIRMASK: u32 = (1 << _IOC_DIRBITS) - 1;
5704+
5705+
const _IOC_NRSHIFT: u32 = 0;
5706+
const _IOC_TYPESHIFT: u32 = _IOC_NRSHIFT + _IOC_NRBITS;
5707+
const _IOC_SIZESHIFT: u32 = _IOC_TYPESHIFT + _IOC_TYPEBITS;
5708+
const _IOC_DIRSHIFT: u32 = _IOC_SIZESHIFT + _IOC_SIZEBITS;
5709+
5710+
// adapted from https://github.com./torvalds/linux/blob/8a696a29c6905594e4abf78eaafcb62165ac61f1/rust/kernel/ioctl.rs
5711+
5712+
/// Build an ioctl number, analogous to the C macro of the same name.
5713+
const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 {
5714+
// FIXME(ctest) the `garando_syntax` crate (used by ctest2 in the CI test suite)
5715+
// cannot currently parse these `debug_assert!`s
5716+
//
5717+
// debug_assert!(dir <= _IOC_DIRMASK);
5718+
// debug_assert!(ty <= _IOC_TYPEMASK);
5719+
// debug_assert!(nr <= _IOC_NRMASK);
5720+
// debug_assert!(size <= (_IOC_SIZEMASK as usize));
5721+
5722+
(dir << _IOC_DIRSHIFT)
5723+
| (ty << _IOC_TYPESHIFT)
5724+
| (nr << _IOC_NRSHIFT)
5725+
| ((size as u32) << _IOC_SIZESHIFT)
5726+
}
5727+
5728+
/// Build an ioctl number for an argumentless ioctl.
5729+
pub(crate) const fn _IO(ty: u32, nr: u32) -> u32 {
5730+
_IOC(_IOC_NONE, ty, nr, 0)
5731+
}
5732+
5733+
/// Build an ioctl number for an read-only ioctl.
5734+
pub(crate) const fn _IOR<T>(ty: u32, nr: u32) -> u32 {
5735+
_IOC(_IOC_READ, ty, nr, core::mem::size_of::<T>())
5736+
}
5737+
5738+
/// Build an ioctl number for an write-only ioctl.
5739+
pub(crate) const fn _IOW<T>(ty: u32, nr: u32) -> u32 {
5740+
_IOC(_IOC_WRITE, ty, nr, core::mem::size_of::<T>())
5741+
}
5742+
5743+
/// Build an ioctl number for a read-write ioctl.
5744+
pub(crate) const fn _IOWR<T>(ty: u32, nr: u32) -> u32 {
5745+
_IOC(_IOC_READ | _IOC_WRITE, ty, nr, core::mem::size_of::<T>())
5746+
}
5747+
56385748
f! {
56395749
pub fn NLA_ALIGN(len: ::c_int) -> ::c_int {
56405750
return ((len) + NLA_ALIGNTO - 1) & !(NLA_ALIGNTO - 1);

0 commit comments

Comments
 (0)