linux/include/uapi/linux
Gabriel Krisman Bertazi 1446e1df9e kernel: Implement selective syscall userspace redirection
Introduce a mechanism to quickly disable/enable syscall handling for a
specific process and redirect to userspace via SIGSYS.  This is useful
for processes with parts that require syscall redirection and parts that
don't, but who need to perform this boundary crossing really fast,
without paying the cost of a system call to reconfigure syscall handling
on each boundary transition.  This is particularly important for Windows
games running over Wine.

The proposed interface looks like this:

  prctl(PR_SET_SYSCALL_USER_DISPATCH, <op>, <off>, <length>, [selector])

The range [<offset>,<offset>+<length>) is a part of the process memory
map that is allowed to by-pass the redirection code and dispatch
syscalls directly, such that in fast paths a process doesn't need to
disable the trap nor the kernel has to check the selector.  This is
essential to return from SIGSYS to a blocked area without triggering
another SIGSYS from rt_sigreturn.

selector is an optional pointer to a char-sized userspace memory region
that has a key switch for the mechanism. This key switch is set to
either PR_SYS_DISPATCH_ON, PR_SYS_DISPATCH_OFF to enable and disable the
redirection without calling the kernel.

The feature is meant to be set per-thread and it is disabled on
fork/clone/execv.

Internally, this doesn't add overhead to the syscall hot path, and it
requires very little per-architecture support.  I avoided using seccomp,
even though it duplicates some functionality, due to previous feedback
that maybe it shouldn't mix with seccomp since it is not a security
mechanism.  And obviously, this should never be considered a security
mechanism, since any part of the program can by-pass it by using the
syscall dispatcher.

For the sysinfo benchmark, which measures the overhead added to
executing a native syscall that doesn't require interception, the
overhead using only the direct dispatcher region to issue syscalls is
pretty much irrelevant.  The overhead of using the selector goes around
40ns for a native (unredirected) syscall in my system, and it is (as
expected) dominated by the supervisor-mode user-address access.  In
fact, with SMAP off, the overhead is consistently less than 5ns on my
test box.

Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Andy Lutomirski <luto@kernel.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20201127193238.821364-4-krisman@collabora.com
2020-12-02 15:07:56 +01:00
..
android
byteorder
caif
can can: isotp: implement cleanups / improvements from review 2020-10-12 10:06:08 +02:00
cifs
dvb
genwqe
hdlc
hsi
iio iio: add IIO_MOD_O2 modifier 2020-08-22 10:53:12 +01:00
isdn
mmc
netfilter netfilter: nftables: allow re-computing sctp CRC-32C in 'payload' statements 2020-10-15 11:45:19 -07:00
netfilter_arp
netfilter_bridge
netfilter_ipv4
netfilter_ipv6
nfsd
raid
sched
spi
sunrpc
tc_act net/sched: act_mpls: Add action to push MPLS LSE before Ethernet header 2020-10-03 17:28:45 -07:00
tc_ematch
usb include/: replace HTTP links with HTTPS ones 2020-08-12 10:57:59 -07:00
wimax
a.out.h
acct.h
adb.h
adfs_fs.h
affs_hardblocks.h
agpgart.h
aio_abi.h
am437x-vpfe.h
apm_bios.h
arcfb.h
arm_sdei.h
aspeed-lpc-ctrl.h
aspeed-p2a-ctrl.h
atalk.h
atm_eni.h
atm_he.h
atm_idt77105.h
atm_nicstar.h
atm_tcp.h
atm_zatm.h
atm.h
atmapi.h
atmarp.h
atmbr2684.h
atmclip.h
atmdev.h
atmioc.h
atmlec.h
atmmpc.h
atmppp.h
atmsap.h
atmsvc.h
audit.h
auto_dev-ioctl.h autofs: fix doubled word 2020-08-12 10:58:00 -07:00
auto_fs.h
auto_fs4.h
auxvec.h
ax25.h
batadv_packet.h
batman_adv.h
baycom.h
bcache.h
bcm933xx_hcs.h
bfs_fs.h
binfmts.h
blkpg.h
blktrace_api.h
blkzoned.h block: fix uapi blkzoned.h comments 2020-10-09 12:47:02 -06:00
bpf_common.h
bpf_perf_event.h
bpf.h bpf: Fix bpf_redirect_neigh helper api to support supplying nexthop 2020-10-22 01:28:54 +02:00
bpfilter.h
bpqether.h
bsg.h
bt-bmc.h
btf.h
btrfs_tree.h btrfs: tree-checker: fix false alert caused by legacy btrfs root item 2020-10-07 12:13:23 +02:00
btrfs.h
can.h
capability.h block: grant IOPRIO_CLASS_RT to CAP_SYS_NICE 2020-09-01 19:38:33 -06:00
capi.h
cciss_defs.h
cciss_ioctl.h
cdrom.h block: scsi_ioctl: Avoid the use of one-element arrays 2020-10-02 17:58:52 -06:00
cec-funcs.h
cec.h
cgroupstats.h
chio.h
close_range.h
cm4000_cs.h
cn_proc.h
coda.h
coff.h
connector.h
const.h
coresight-stm.h coresight: stm: Support marked packet 2020-09-17 18:46:04 +02:00
cramfs_fs.h
cryptouser.h
cuda.h
cyclades.h
cycx_cfm.h
dcbnl.h
dccp.h
devlink.h devlink: Add remote reload stats 2020-10-09 12:06:52 -07:00
dlm_device.h
dlm_netlink.h
dlm_plock.h
dlm.h
dlmconstants.h
dm-ioctl.h dm: export dm_copy_name_and_uuid 2020-10-01 15:03:40 -04:00
dm-log-userspace.h
dma-buf.h
dma-heap.h
dn.h
dns_resolver.h
dqblk_xfs.h quota: Expand comment describing d_itimer 2020-09-10 09:10:06 +02:00
edd.h
efs_fs_sb.h
elf-em.h
elf-fdpic.h
elf.h arm64: mte: ptrace: Add NT_ARM_TAGGED_ADDR_CTRL regset 2020-09-04 12:46:07 +01:00
errno.h
errqueue.h
erspan.h
ethtool_netlink.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-09-22 16:45:34 -07:00
ethtool.h ethtool: Add 100base-FX link mode entries 2020-09-19 16:54:35 -07:00
eventpoll.h
fadvise.h
falloc.h
fanotify.h
fb.h
fcntl.h
fd.h
fdreg.h
fib_rules.h
fiemap.h
filter.h
firewire-cdev.h
firewire-constants.h
fou.h
fpga-dfl.h
fs.h
fscrypt.h fscrypt: make "#define fscrypt_policy" user-only 2020-09-22 06:48:44 -07:00
fsi.h
fsl_hypervisor.h
fsmap.h
fsverity.h
fuse.h fuse: add submount support to <uapi/linux/fuse.h> 2020-09-18 15:17:40 +02:00
futex.h
gameport.h
gen_stats.h
genetlink.h genetlink: allow dumping command-specific policy 2020-10-03 14:18:29 -07:00
gfs2_ondisk.h
gpio.h gpio: uapi: document uAPI v1 as deprecated 2020-09-30 10:57:08 +02:00
gsmmux.h
gtp.h gtp: add notification mechanism 2020-08-27 08:01:47 -07:00
hash_info.h
hdlc.h
hdlcdrv.h
hdreg.h
hid.h
hiddev.h
hidraw.h
hpet.h
hsr_netlink.h
hw_breakpoint.h
hyperv.h
i2c-dev.h
i2c.h
i2o-dev.h
i8k.h
icmp.h
icmpv6.h
idxd.h Merge branch 'for-linus' into fixes 2020-08-05 19:02:07 +05:30
if_addr.h
if_addrlabel.h
if_alg.h crypto: af_alg - add extra parameters for DRBG interface 2020-09-25 17:48:52 +10:00
if_arcnet.h
if_arp.h
if_bonding.h
if_bridge.h net: bridge: mcast: add support for blocked port groups 2020-09-23 13:24:34 -07:00
if_cablemodem.h
if_eql.h
if_ether.h
if_fc.h
if_fddi.h
if_frad.h
if_hippi.h
if_infiniband.h
if_link.h net: remove comments on struct rtnl_link_stats 2020-09-17 17:58:13 -07:00
if_ltalk.h
if_macsec.h
if_packet.h
if_phonet.h
if_plip.h
if_ppp.h
if_pppol2tp.h l2tp: remove tunnel and session debug flags field 2020-08-22 12:44:37 -07:00
if_pppox.h
if_slip.h
if_team.h
if_tun.h
if_tunnel.h
if_vlan.h
if_x25.h
if_xdp.h
if.h
ife.h
igmp.h
ila.h
in_route.h
in.h net: Fix some comments 2020-08-27 07:55:59 -07:00
in6.h
inet_diag.h ip: expose inet sockopts through inet_diag 2020-09-03 15:17:28 -07:00
inotify.h
input-event-codes.h Input: allocate keycode for Fn + right shift 2020-09-08 16:31:14 -07:00
input.h
io_uring.h io_uring: provide IORING_ENTER_SQ_WAIT for SQPOLL SQ ring waits 2020-09-30 20:32:33 -06:00
ioctl.h
iommu.h iommu/vt-d: Check UAPI data processed by IOMMU core 2020-10-01 14:52:46 +02:00
ip_vs.h
ip.h
ip6_tunnel.h
ipc.h
ipmi_bmc.h
ipmi_msgdefs.h ipmi:msghandler: retry to get device id on an error 2020-09-15 09:57:45 -05:00
ipmi.h
ipsec.h
ipv6_route.h
ipv6.h
ipx.h
irqnr.h
iso_fs.h
isst_if.h
ivtv.h
ivtvfb.h
jffs2.h
joystick.h
kcm.h
kcmp.h
kcov.h
kd.h
kdev_t.h
kernel-page-flags.h
kernel.h
kernelcapi.h
kexec.h
keyboard.h
keyctl.h
kfd_ioctl.h include/uapi/linux: Fix indentation in kfd_smi_event enum 2020-08-31 14:40:29 -04:00
kvm_para.h
kvm.h kvm: x86: only provide PV features if enabled in guest's CPUID 2020-10-21 17:36:32 -04:00
l2tp.h l2tp: report rx cookie discards in netlink get 2020-09-29 13:26:36 -07:00
libc-compat.h
lightnvm.h
limits.h
lirc.h
llc.h
loop.h
lp.h
lwtunnel.h
magic.h
major.h
map_to_7segment.h include/: replace HTTP links with HTTPS ones 2020-08-12 10:57:59 -07:00
matroxfb.h
max2175.h
mdio.h
media-bus-format.h
media.h
mei.h mei: add connect with vtag ioctl 2020-08-18 15:44:44 +02:00
membarrier.h rseq/membarrier: Add MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ 2020-09-25 14:23:27 +02:00
memfd.h
mempolicy.h
meye.h
mii.h
minix_fs.h
mman.h powerpc/8xx: Support 16k hugepages with 4k pages 2020-09-15 22:13:31 +10:00
mmtimer.h
module.h
mount.h Add a "nosymfollow" mount option. 2020-08-27 16:06:47 -04:00
mpls_iptunnel.h
mpls.h
mptcp.h
mqueue.h
mroute.h ipmr: Add high byte of VIF ID to igmpmsg 2020-09-10 12:25:51 -07:00
mroute6.h
mrp_bridge.h
msdos_fs.h
msg.h
mtio.h
n_r3964.h
nbd-netlink.h
nbd.h
ncsi.h
ndctl.h
neighbour.h
net_dropmon.h
net_namespace.h
net_tstamp.h
net.h
netconf.h
netdevice.h
netfilter_arp.h
netfilter_bridge.h
netfilter_decnet.h
netfilter_ipv4.h
netfilter_ipv6.h
netfilter.h netfilter: restore NF_INET_NUMHOOKS 2020-10-14 20:28:05 -07:00
netlink_diag.h
netlink.h netlink: export policy in extended ACK 2020-10-09 20:22:32 -07:00
netrom.h
nexthop.h
nfc.h
nfs_fs.h
nfs_idmap.h
nfs_mount.h
nfs.h
nfs2.h
nfs3.h
nfs4_mount.h
nfs4.h NFSv4.2: support EXCHGID4_FLAG_SUPP_FENCE_OPS 4.2 EXCHANGE_ID flag 2020-10-16 09:28:43 -04:00
nfsacl.h NFSACL: Replace PROC() macro with open code 2020-10-02 09:37:41 -04:00
nilfs2_api.h
nilfs2_ondisk.h
nitro_enclaves.h nitro_enclaves: Add ioctl interface definition 2020-09-22 13:58:40 +02:00
nl80211.h nl80211: extend support to config spatial reuse parameter set 2020-09-28 15:07:41 +02:00
nsfs.h
nubus.h
nvme_ioctl.h
nvram.h
omap3isp.h
omapfb.h
oom.h
openat2.h
openvswitch.h
packet_diag.h
param.h
parport.h
patchkey.h
pci_regs.h Merge branch 'remotes/lorenzo/pci/dwc' 2020-10-21 09:58:39 -05:00
pci.h
pcitest.h
perf_event.h perf: correct SNOOPX field offset 2020-10-19 19:39:22 +02:00
personality.h
pfkeyv2.h
pg.h
phantom.h
phonet.h
pidfd.h pidfd: support PIDFD_NONBLOCK in pidfd_open() 2020-09-04 12:34:50 +02:00
pkt_cls.h
pkt_sched.h
pktcdvd.h
pmu.h
poll.h
posix_acl_xattr.h
posix_acl.h
posix_types.h
ppdev.h
ppp_defs.h
ppp-comp.h
ppp-ioctl.h
pps.h
pr.h
prctl.h kernel: Implement selective syscall userspace redirection 2020-12-02 15:07:56 +01:00
psample.h
psci.h
psp-sev.h
ptp_clock.h
ptrace.h
qemu_fw_cfg.h
qnx4_fs.h
qnxtypes.h
qrtr.h
quota.h
radeonfb.h
random.h
raw.h
rds.h
reboot.h
reiserfs_fs.h
reiserfs_xattr.h
remoteproc_cdev.h remoteproc: Add remoteproc character device interface 2020-08-04 20:16:37 -07:00
resource.h
rfkill.h
rio_cm_cdev.h
rio_mport_cdev.h
romfs_fs.h
rose.h
route.h
rpl_iptunnel.h
rpl.h
rpmsg.h
rseq.h
rtc.h
rtnetlink.h
rxrpc.h rxrpc: Fix accept on a connection that need securing 2020-10-05 16:35:57 +01:00
scc.h
sched.h
scif_ioctl.h
screen_info.h
sctp.h
sdla.h
seccomp.h
securebits.h
sed-opal.h
seg6_genl.h
seg6_hmac.h
seg6_iptunnel.h
seg6_local.h
seg6.h
selinux_netlink.h
sem.h
serial_core.h
serial_reg.h
serial.h
serio.h
shm.h
signal.h
signalfd.h
smc_diag.h
smc.h
smiapp.h
snmp.h tcp: skip DSACKs with dubious sequence ranges 2020-09-24 20:15:45 -07:00
sock_diag.h
socket.h
sockios.h
sonet.h
sonypi.h
sound.h
soundcard.h
stat.h
stddef.h
stm.h
string.h
suspend_ioctls.h
swab.h
switchtec_ioctl.h
sync_file.h
synclink.h
sysctl.h
sysinfo.h
target_core_user.h
taskstats.h
tcp_metrics.h
tcp.h
tee.h driver: tee: Handle NULL pointer indication from client 2020-08-21 08:55:13 +02:00
termios.h
thermal.h
time_types.h
time.h
timerfd.h
times.h
timex.h
tiocl.h
tipc_config.h
tipc_netlink.h tipc: add automatic rekeying for encryption key 2020-09-18 13:58:37 -07:00
tipc_sockets_diag.h
tipc.h tipc: add automatic rekeying for encryption key 2020-09-18 13:58:37 -07:00
tls.h
toshiba.h
tty_flags.h
tty.h
types.h include/: replace HTTP links with HTTPS ones 2020-08-12 10:57:59 -07:00
udf_fs_i.h
udmabuf.h
udp.h
uhid.h
uinput.h
uio.h
uleds.h
ultrasound.h
um_timetravel.h
un.h
unistd.h
unix_diag.h
usbdevice_fs.h
usbip.h
userfaultfd.h
userio.h
utime.h
utsname.h
uuid.h
uvcvideo.h
v4l2-common.h
v4l2-controls.h media: v4l2-ctrl: Add VP9 codec levels 2020-09-14 15:39:42 +02:00
v4l2-dv-timings.h
v4l2-mediabus.h media: v4l2: extend the CSC API to subdevice. 2020-09-26 10:22:29 +02:00
v4l2-subdev.h media: v4l2: extend the CSC API to subdevice. 2020-09-26 10:22:29 +02:00
vbox_err.h
vbox_vmmdev_types.h
vboxguest.h
veth.h
vfio_ccw.h
vfio_zdev.h vfio: Introduce capability definitions for VFIO_DEVICE_GET_INFO 2020-10-07 14:23:44 -06:00
vfio.h Merge branches 'v5.10/vfio/fsl-mc-v6' and 'v5.10/vfio/zpci-info-v3' into v5.10/vfio/next 2020-10-12 11:41:02 -06:00
vhost_types.h vhost: vdpa: report iova range 2020-10-23 11:55:28 -04:00
vhost.h vhost: vdpa: report iova range 2020-10-23 11:55:28 -04:00
videodev2.h Linux 5.9-rc7 2020-10-04 12:19:12 +02:00
virtio_9p.h virtio_9p: correct tags for config space fields 2020-08-05 09:30:19 -04:00
virtio_balloon.h virtio_balloon: correct tags for config space fields 2020-08-05 09:30:20 -04:00
virtio_blk.h virtio_blk: correct tags for config space fields 2020-08-05 11:08:39 -04:00
virtio_config.h
virtio_console.h virtio_console: correct tags for config space fields 2020-08-05 11:08:39 -04:00
virtio_crypto.h virtio_crypto: correct tags for config space fields 2020-08-05 11:08:39 -04:00
virtio_fs.h virtiofs: set up virtio_fs dax_device 2020-09-10 11:39:22 +02:00
virtio_gpu.h Linux 5.9-rc1 2020-08-18 14:14:25 +02:00
virtio_ids.h
virtio_input.h virtio_input: correct tags for config space fields 2020-08-05 11:08:40 -04:00
virtio_iommu.h virtio_iommu: correct tags for config space fields 2020-08-05 11:08:40 -04:00
virtio_mem.h virtio_mem: correct tags for config space fields 2020-08-05 11:08:40 -04:00
virtio_mmio.h virtio: Implement get_shm_region for MMIO transport 2020-09-10 10:05:58 +02:00
virtio_net.h virtio_net: use LE accessors for speed/duplex 2020-08-05 11:08:41 -04:00
virtio_pci.h virtio: Implement get_shm_region for PCI transport 2020-09-10 10:05:58 +02:00
virtio_pmem.h virtio_pmem: correct tags for config space fields 2020-08-05 11:08:40 -04:00
virtio_ring.h
virtio_rng.h
virtio_scsi.h virtio_scsi: correct tags for config space fields 2020-08-05 11:08:40 -04:00
virtio_types.h
virtio_vsock.h
vm_sockets_diag.h
vm_sockets.h
vmcore.h
vsockmon.h
vt.h
vtpm_proxy.h
wait.h
watch_queue.h
watchdog.h
wimax.h
wireguard.h
wireless.h
wmi.h
x25.h
xattr.h
xdp_diag.h
xfrm.h
xilinx-v4l2-controls.h
zorro_ids.h
zorro.h