Merge tag 'memblock-v5.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt...
[linux-2.6-microblaze.git] / arch / x86 / um / stub_32.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include <as-layout.h>
3
4 .section .__syscall_stub, "ax"
5
6         .globl batch_syscall_stub
7 batch_syscall_stub:
8         /* %esp comes in as "top of page" */
9         mov %esp, %ecx
10         /* %esp has pointer to first operation */
11         add $8, %esp
12 again:
13         /* load length of additional data */
14         mov     0x0(%esp), %eax
15
16         /* if(length == 0) : end of list */
17         /* write possible 0 to header */
18         mov     %eax, 0x4(%ecx)
19         cmpl    $0, %eax
20         jz      done
21
22         /* save current pointer */
23         mov     %esp, 0x4(%ecx)
24
25         /* skip additional data */
26         add     %eax, %esp
27
28         /* load syscall-# */
29         pop     %eax
30
31         /* load syscall params */
32         pop     %ebx
33         pop     %ecx
34         pop     %edx
35         pop     %esi
36         pop     %edi
37         pop     %ebp
38
39         /* execute syscall */
40         int     $0x80
41
42         /* restore top of page pointer in %ecx */
43         mov     %esp, %ecx
44         andl    $(~UM_KERN_PAGE_SIZE) + 1, %ecx
45
46         /* check return value */
47         pop     %ebx
48         cmp     %ebx, %eax
49         je      again
50
51 done:
52         /* save return value */
53         mov     %eax, (%ecx)
54
55         /* stop */
56         int3