1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 237185b33SAl Viro#include <as-layout.h> 35c48b108SAl Viro 45c48b108SAl Viro.section .__syscall_stub, "ax" 55c48b108SAl Viro 65c48b108SAl Viro .globl batch_syscall_stub 75c48b108SAl Virobatch_syscall_stub: 8*9f0b4807SJohannes Berg /* %esp comes in as "top of page" */ 9*9f0b4807SJohannes Berg mov %esp, %ecx 10*9f0b4807SJohannes Berg /* %esp has pointer to first operation */ 11*9f0b4807SJohannes Berg add $8, %esp 125c48b108SAl Viroagain: 135c48b108SAl Viro /* load length of additional data */ 145c48b108SAl Viro mov 0x0(%esp), %eax 155c48b108SAl Viro 165c48b108SAl Viro /* if(length == 0) : end of list */ 175c48b108SAl Viro /* write possible 0 to header */ 18*9f0b4807SJohannes Berg mov %eax, 0x4(%ecx) 195c48b108SAl Viro cmpl $0, %eax 205c48b108SAl Viro jz done 215c48b108SAl Viro 225c48b108SAl Viro /* save current pointer */ 23*9f0b4807SJohannes Berg mov %esp, 0x4(%ecx) 245c48b108SAl Viro 255c48b108SAl Viro /* skip additional data */ 265c48b108SAl Viro add %eax, %esp 275c48b108SAl Viro 285c48b108SAl Viro /* load syscall-# */ 295c48b108SAl Viro pop %eax 305c48b108SAl Viro 315c48b108SAl Viro /* load syscall params */ 325c48b108SAl Viro pop %ebx 335c48b108SAl Viro pop %ecx 345c48b108SAl Viro pop %edx 355c48b108SAl Viro pop %esi 365c48b108SAl Viro pop %edi 375c48b108SAl Viro pop %ebp 385c48b108SAl Viro 395c48b108SAl Viro /* execute syscall */ 405c48b108SAl Viro int $0x80 415c48b108SAl Viro 42*9f0b4807SJohannes Berg /* restore top of page pointer in %ecx */ 43*9f0b4807SJohannes Berg mov %esp, %ecx 44*9f0b4807SJohannes Berg andl $(~UM_KERN_PAGE_SIZE) + 1, %ecx 45*9f0b4807SJohannes Berg 465c48b108SAl Viro /* check return value */ 475c48b108SAl Viro pop %ebx 485c48b108SAl Viro cmp %ebx, %eax 495c48b108SAl Viro je again 505c48b108SAl Viro 515c48b108SAl Virodone: 525c48b108SAl Viro /* save return value */ 53*9f0b4807SJohannes Berg mov %eax, (%ecx) 545c48b108SAl Viro 555c48b108SAl Viro /* stop */ 565c48b108SAl Viro int3 57