| #include "uml-config.h" |
| |
| .globl syscall_stub |
| .section .__syscall_stub, "x" |
| |
| .globl batch_syscall_stub |
| batch_syscall_stub: |
| /* load pointer to first operation */ |
| mov $(UML_CONFIG_STUB_DATA+8), %esp |
| |
| again: |
| /* load length of additional data */ |
| mov 0x0(%esp), %eax |
| |
| /* if(length == 0) : end of list */ |
| /* write possible 0 to header */ |
| mov %eax, UML_CONFIG_STUB_DATA+4 |
| cmpl $0, %eax |
| jz done |
| |
| /* save current pointer */ |
| mov %esp, UML_CONFIG_STUB_DATA+4 |
| |
| /* skip additional data */ |
| add %eax, %esp |
| |
| /* load syscall-# */ |
| pop %eax |
| |
| /* load syscall params */ |
| pop %ebx |
| pop %ecx |
| pop %edx |
| pop %esi |
| pop %edi |
| pop %ebp |
| |
| /* execute syscall */ |
| int $0x80 |
| |
| /* check return value */ |
| pop %ebx |
| cmp %ebx, %eax |
| je again |
| |
| done: |
| /* save return value */ |
| mov %eax, UML_CONFIG_STUB_DATA |
| |
| /* stop */ |
| int3 |