From ca7a7edbfbd1dc6a6aa74de2baefaab7e25b8603 Mon Sep 17 00:00:00 2001 From: Red Bear OS Date: Mon, 27 Jul 2026 20:18:01 +0900 Subject: [PATCH] relibc: add sys/ioccom.h with Linux IOC bitfield constants Mesa 26.1.4's DRM UAPI headers include as the BSD include path for ioctl command encoding. The basic _IO / _IOR / _IOW / _IOWR macros are already in (musl-style via cbindgen), but sys/ioccom.h adds the bitfield widths / masks / shifts / decoders and the IOC_IN / IOC_OUT / IOC_INOUT / IOCSIZE_* macros that DRM and other Linux UAPI consumers require. This header includes for the base macros and adds the Linux-style constants as a thin shim. All new symbols are guarded with #ifndef so including both headers is safe and idempotent. This makes the Mesa-side 04-sys-ioccom-stub-header.patch redundant; that patch can be removed from local/patches/mesa/ and the Mesa recipe's patches list. --- include/sys/ioccom.h | 97 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 include/sys/ioccom.h diff --git a/include/sys/ioccom.h b/include/sys/ioccom.h new file mode 100644 index 0000000000..2406a8272b --- /dev/null +++ b/include/sys/ioccom.h @@ -0,0 +1,97 @@ +#ifndef _SYS_IOCCOM_H +#define _SYS_IOCCOM_H + +// Linux-compatible ioctl command encoding constants — supplements the +// base _IOC / _IO / _IOR / _IOW / _IOWR macros from with +// the bitfield widths, masks, shifts, decoders, and IOC direction +// macros that Linux UAPI headers (DRM, V4L2, etc.) expect. +// +// DRM headers include as the BSD-naming path for ioctl +// command encoding; relibc's provides the basic macros +// but not these constants. This header unifies them so DRM and other +// Linux UAPI consumers build without a Mesa-side stub. + +#include + +#ifndef _IOC_NRBITS +#define _IOC_NRBITS 8 +#endif +#ifndef _IOC_TYPEBITS +#define _IOC_TYPEBITS 8 +#endif +#ifndef _IOC_SIZEBITS +#define _IOC_SIZEBITS 14 +#endif +#ifndef _IOC_DIRBITS +#define _IOC_DIRBITS 2 +#endif + +#ifndef _IOC_NRMASK +#define _IOC_NRMASK ((1 << _IOC_NRBITS) - 1) +#endif +#ifndef _IOC_TYPEMASK +#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS) - 1) +#endif +#ifndef _IOC_SIZEMASK +#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS) - 1) +#endif +#ifndef _IOC_DIRMASK +#define _IOC_DIRMASK ((1 << _IOC_DIRBITS) - 1) +#endif + +#ifndef _IOC_NRSHIFT +#define _IOC_NRSHIFT 0 +#endif +#ifndef _IOC_TYPESHIFT +#define _IOC_TYPESHIFT (_IOC_NRSHIFT + _IOC_NRBITS) +#endif +#ifndef _IOC_SIZESHIFT +#define _IOC_SIZESHIFT (_IOC_TYPESHIFT + _IOC_TYPEBITS) +#endif +#ifndef _IOC_DIRSHIFT +#define _IOC_DIRSHIFT (_IOC_SIZESHIFT + _IOC_SIZEBITS) +#endif + +// _IOC_TYPECHECK wraps the ioctl size argument in a sizeof() for type +// safety. The musl/relibc _IOW / _IOR / _IOWR macros already call +// sizeof internally on the third argument; this macro is provided for +// callers that compose ioctl numbers directly (e.g. DRM). +#ifndef _IOC_TYPECHECK +#define _IOC_TYPECHECK(t) (sizeof(t)) +#endif + +// _IOC_DIR / _IOC_TYPE / _IOC_NR / _IOC_SIZE decode the fields of an +// ioctl number. Linux UAPI callers use these to inspect ioctls. +#ifndef _IOC_DIR +#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) +#endif +#ifndef _IOC_TYPE +#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) +#endif +#ifndef _IOC_NR +#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) +#endif +#ifndef _IOC_SIZE +#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) +#endif + +// IOC_IN / IOC_OUT / IOC_INOUT are the values stored in the direction +// field of an ioctl number when constructing one without _IO / _IOR / +// _IOW / _IOWR. +#ifndef IOC_IN +#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) +#endif +#ifndef IOC_OUT +#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) +#endif +#ifndef IOC_INOUT +#define IOC_INOUT ((_IOC_WRITE | _IOC_READ) << _IOC_DIRSHIFT) +#endif +#ifndef IOCSIZE_MASK +#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) +#endif +#ifndef IOCSIZE_SHIFT +#define IOCSIZE_SHIFT (_IOC_SIZESHIFT) +#endif + +#endif /* _SYS_IOCCOM_H */ \ No newline at end of file