]> Git Repo - J-linux.git/blob - arch/um/kernel/skas/stub.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / arch / um / kernel / skas / stub.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2021 Benjamin Berg <[email protected]>
4  */
5
6 #include <sysdep/stub.h>
7
8 static __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
51 void __section(".__syscall_stub")
52 stub_syscall_handler(void)
53 {
54         struct stub_data *d = get_stub_data();
55
56         syscall_handler(d);
57
58         trap_myself();
59 }
This page took 0.029849 seconds and 4 git commands to generate.