Files
RedBear-OS/include/sys/ioccom.h
T
Red Bear OS ca7a7edbfb relibc: add sys/ioccom.h with Linux IOC bitfield constants
Mesa 26.1.4's DRM UAPI headers include <sys/ioccom.h> as the BSD
include path for ioctl command encoding. The basic _IO / _IOR / _IOW /
_IOWR macros are already in <sys/ioctl.h> (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 <sys/ioctl.h> 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.
2026-07-27 20:18:01 +09:00

97 lines
2.8 KiB
C

#ifndef _SYS_IOCCOM_H
#define _SYS_IOCCOM_H
// Linux-compatible ioctl command encoding constants — supplements the
// base _IOC / _IO / _IOR / _IOW / _IOWR macros from <sys/ioctl.h> with
// the bitfield widths, masks, shifts, decoders, and IOC direction
// macros that Linux UAPI headers (DRM, V4L2, etc.) expect.
//
// DRM headers include <sys/ioccom.h> as the BSD-naming path for ioctl
// command encoding; relibc's <sys/ioctl.h> 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 <sys/ioctl.h>
#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 */