@samitouri / QOSamiQemu / commits / 844a31daa2

bsd-user: ioctl: add common definitions

Modeled on sys/ioccom.h. Signed-off-by: Stacey Son <sson@FreeBSD.org> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> Signed-off-by: Warner Losh <imp@bsdimp.com>

Stacey Son committed Apr 30, 2026 at 20:36 UTC 844a31daa210c58a766251af9471028fbea99be1
1 file changed +43
bsd-user/freebsd/os-ioctl-ioccom.h new
+43
@@ -0,0 +1,43 @@
1 +/*
2 + * FreeBSD ioccom definitions for ioctl(2) emulation
3 + *
4 + * Copyright (c) 2013 Stacey D. Son
5 + *
6 + * SPDX-License-Identifier: GPL-2.0-or-later
7 + */
8 +#ifndef BSD_USER_FREEBSD_OS_IOCTL_IOCCOM_H
9 +#define BSD_USER_FREEBSD_OS_IOCTL_IOCCOM_H
10 +
11 +/*
12 + * Ioctl's have the command encoded in the lower word, and the size of
13 + * any in or out parameters in the upper word. The high 3 bits of the
14 + * upper word are used to encode the in/out status of the parameter.
15 + */
16 +/* number of bits for ioctl size */
17 +#define TARGET_IOCPARM_SHIFT 13
18 +
19 +/* parameter length mask */
20 +#define TARGET_IOCPARM_MASK ((1 << TARGET_IOCPARM_SHIFT) - 1)
21 +
22 +#define TARGET_IOCPARM_LEN(x) (((x) >> 16) & TARGET_IOCPARM_MASK)
23 +#define TARGET_IOCBASECMD(x) ((x) & ~(TARGET_IOCPARM_MASK << 16))
24 +#define TARGET_IOCGROUP(x) (((x) >> 8) & 0xff)
25 +
26 +#define TARGET_IOCPARM_MAX (1 << TARGET_IOCPARM_SHIFT) /* max size of ioctl */
27 +#define TARGET_IOC_VOID 0x20000000 /* no parameters */
28 +#define TARGET_IOC_OUT 0x40000000 /* copy out parameters */
29 +#define TARGET_IOC_IN 0x80000000 /* copy in parameters */
30 +#define TARGET_IOC_INOUT (TARGET_IOC_IN | TARGET_IOC_OUT)
31 +#define TARGET_IOC_DIRMASK (TARGET_IOC_VOID | TARGET_IOC_OUT | TARGET_IOC_IN)
32 +
33 +#define TARGET_IOC(inout, group, num, len) ((abi_ulong) \
34 + ((inout) | (((len) & TARGET_IOCPARM_MASK) << 16) | ((group) << 8) \
35 + | (num)))
36 +#define TARGET_IO(g, n) TARGET_IOC(TARGET_IOC_VOID, (g), (n), 0)
37 +#define TARGET_IOWINT(g, n) TARGET_IOC(TARGET_IOC_VOID, (g), (n), sizeof(int))
38 +#define TARGET_IOR(g, n, t) TARGET_IOC(TARGET_IOC_OUT, (g), (n), sizeof(t))
39 +#define TARGET_IOW(g, n, t) TARGET_IOC(TARGET_IOC_IN, (g), (n), sizeof(t))
40 +/* this should be _IORW, but stdio got there first */
41 +#define TARGET_IOWR(g, n, t) TARGET_IOC(TARGET_IOC_INOUT, (g), (n), sizeof(t))
42 +
43 +#endif /* BSD_USER_FREEBSD_OS_IOCTL_IOCCOM_H */