Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
 1// SPDX-License-Identifier: GPL-2.0
 2/*
 3 * Copyright (C) 2021 Benjamin Berg <benjamin@sipsolutions.net>
 4 */
 5
 6#include <sysdep/stub.h>
 7
 8static __always_inline int syscall_handler(struct stub_data *d)
 9{
10	int i;
11	unsigned long res;
12
13	for (i = 0; i < d->syscall_data_len; i++) {
14		struct stub_syscall *sc = &d->syscall_data[i];
15
16		switch (sc->syscall) {
17		case STUB_SYSCALL_MMAP:
18			res = stub_syscall6(STUB_MMAP_NR,
19					    sc->mem.addr, sc->mem.length,
20					    sc->mem.prot,
21					    MAP_SHARED | MAP_FIXED,
22					    sc->mem.fd, sc->mem.offset);
23			if (res != sc->mem.addr) {
24				d->err = res;
25				d->syscall_data_len = i;
26				return -1;
27			}
28			break;
29		case STUB_SYSCALL_MUNMAP:
30			res = stub_syscall2(__NR_munmap,
31					    sc->mem.addr, sc->mem.length);
32			if (res) {
33				d->err = res;
34				d->syscall_data_len = i;
35				return -1;
36			}
37			break;
38		default:
39			d->err = -95; /* EOPNOTSUPP */
40			d->syscall_data_len = i;
41			return -1;
42		}
43	}
44
45	d->err = 0;
46	d->syscall_data_len = 0;
47
48	return 0;
49}
50
51void __section(".__syscall_stub")
52stub_syscall_handler(void)
53{
54	struct stub_data *d = get_stub_data();
55
56	syscall_handler(d);
57
58	trap_myself();
59}