Merge "Use ENTRY/END in custom x86 assembler too."
This commit is contained in:
commit
59aeff9417
@ -25,11 +25,10 @@
|
|||||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
.text
|
|
||||||
.type __get_sp, @function
|
|
||||||
.global __get_sp
|
|
||||||
.align 4
|
|
||||||
|
|
||||||
__get_sp:
|
#include <machine/asm.h>
|
||||||
mov %esp, %eax
|
|
||||||
ret
|
ENTRY(__get_sp)
|
||||||
|
mov %esp, %eax
|
||||||
|
ret
|
||||||
|
END(__get_sp)
|
||||||
|
@ -1,15 +1,8 @@
|
|||||||
|
#include <machine/asm.h>
|
||||||
#include <sys/linux-syscalls.h>
|
#include <sys/linux-syscalls.h>
|
||||||
|
|
||||||
.text
|
// void _exit_with_stack_teardown(void *stackBase, int stackSize, int *retCode)
|
||||||
.type _exit_with_stack_teardown, @function
|
ENTRY(_exit_with_stack_teardown)
|
||||||
.globl _exit_with_stack_teardown
|
|
||||||
.align 4
|
|
||||||
|
|
||||||
/*
|
|
||||||
* void _exit_with_stack_teardown(void *stackBase, int stackSize, int *retCode)
|
|
||||||
*/
|
|
||||||
|
|
||||||
_exit_with_stack_teardown:
|
|
||||||
/* we can trash %ebx here since this call should never return. */
|
/* we can trash %ebx here since this call should never return. */
|
||||||
/* We can also take advantage of the fact that the linux syscall trap
|
/* We can also take advantage of the fact that the linux syscall trap
|
||||||
* handler saves all the registers, so we don't need a stack to keep
|
* handler saves all the registers, so we don't need a stack to keep
|
||||||
@ -32,3 +25,4 @@ _exit_with_stack_teardown:
|
|||||||
* that presently, 'hlt' will cause the program to segfault.. but this
|
* that presently, 'hlt' will cause the program to segfault.. but this
|
||||||
* should never happen :) */
|
* should never happen :) */
|
||||||
hlt
|
hlt
|
||||||
|
END(_exit_with_stack_teardown)
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
|
#include <machine/asm.h>
|
||||||
#include <sys/linux-syscalls.h>
|
#include <sys/linux-syscalls.h>
|
||||||
|
|
||||||
.text
|
|
||||||
|
|
||||||
// int __pthread_clone(int (*fn)(void*), void* tls, int flags, void* arg);
|
// int __pthread_clone(int (*fn)(void*), void* tls, int flags, void* arg);
|
||||||
.globl __pthread_clone
|
ENTRY(__pthread_clone)
|
||||||
.type __pthread_clone, @function
|
|
||||||
.align 4
|
|
||||||
__pthread_clone:
|
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
pushl %ecx
|
pushl %ecx
|
||||||
movl 16(%esp), %ecx
|
movl 16(%esp), %ecx
|
||||||
@ -49,6 +45,7 @@ __pthread_clone:
|
|||||||
popl %ecx
|
popl %ecx
|
||||||
popl %ebx
|
popl %ebx
|
||||||
ret
|
ret
|
||||||
|
END(__pthread_clone)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -60,11 +57,7 @@ __pthread_clone:
|
|||||||
* int (*fn)(void *),
|
* int (*fn)(void *),
|
||||||
* void *arg);
|
* void *arg);
|
||||||
*/
|
*/
|
||||||
.text
|
ENTRY(__bionic_clone)
|
||||||
.globl __bionic_clone
|
|
||||||
.type __bionic_clone, @function
|
|
||||||
.align 4
|
|
||||||
__bionic_clone:
|
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
pushl %esi
|
pushl %esi
|
||||||
pushl %edi
|
pushl %edi
|
||||||
@ -107,3 +100,4 @@ __bionic_clone:
|
|||||||
popl %esi
|
popl %esi
|
||||||
popl %ebx
|
popl %ebx
|
||||||
ret
|
ret
|
||||||
|
END(__bionic_clone)
|
||||||
|
@ -1,17 +1,11 @@
|
|||||||
|
#include <machine/asm.h>
|
||||||
#include <sys/linux-syscalls.h>
|
#include <sys/linux-syscalls.h>
|
||||||
|
|
||||||
#define FUTEX_WAIT 0
|
#define FUTEX_WAIT 0
|
||||||
#define FUTEX_WAKE 1
|
#define FUTEX_WAKE 1
|
||||||
|
|
||||||
|
// int __futex_wait(volatile void *ftx, int val, const struct timespec *timeout)
|
||||||
/*
|
ENTRY(__futex_wait)
|
||||||
* int __futex_wait(volatile void *ftx, int val, const struct timespec *timeout)
|
|
||||||
*/
|
|
||||||
.text
|
|
||||||
.globl __futex_wait
|
|
||||||
.type __futex_wait, @function
|
|
||||||
.align 4
|
|
||||||
__futex_wait:
|
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
pushl %esi
|
pushl %esi
|
||||||
mov 12(%esp), %ebx /* ftx */
|
mov 12(%esp), %ebx /* ftx */
|
||||||
@ -23,15 +17,11 @@ __futex_wait:
|
|||||||
popl %esi
|
popl %esi
|
||||||
popl %ebx
|
popl %ebx
|
||||||
ret
|
ret
|
||||||
|
END(__futex_wait)
|
||||||
|
|
||||||
|
|
||||||
/* int __futex_wake(volatile void *ftx, int count) */
|
// int __futex_wake(volatile void *ftx, int count)
|
||||||
|
ENTRY(__futex_wake)
|
||||||
.text
|
|
||||||
.globl __futex_wake
|
|
||||||
.type __futex_wake, @function
|
|
||||||
.align 4
|
|
||||||
__futex_wake:
|
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
mov 8(%esp), %ebx /* ftx */
|
mov 8(%esp), %ebx /* ftx */
|
||||||
movl $FUTEX_WAKE, %ecx
|
movl $FUTEX_WAKE, %ecx
|
||||||
@ -40,13 +30,10 @@ __futex_wake:
|
|||||||
int $0x80
|
int $0x80
|
||||||
popl %ebx
|
popl %ebx
|
||||||
ret
|
ret
|
||||||
|
END(__futex_wake)
|
||||||
|
|
||||||
/* int __futex_syscall3(volatile void *ftx, int op, int count) */
|
// int __futex_syscall3(volatile void *ftx, int op, int count)
|
||||||
.text
|
ENTRY(__futex_syscall3)
|
||||||
.globl __futex_syscall3
|
|
||||||
.type __futex_syscall3, @function
|
|
||||||
.align 4
|
|
||||||
__futex_syscall3:
|
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
movl 8(%esp), %ebx /* ftx */
|
movl 8(%esp), %ebx /* ftx */
|
||||||
movl 12(%esp), %ecx /* op */
|
movl 12(%esp), %ecx /* op */
|
||||||
@ -55,13 +42,10 @@ __futex_syscall3:
|
|||||||
int $0x80
|
int $0x80
|
||||||
popl %ebx
|
popl %ebx
|
||||||
ret
|
ret
|
||||||
|
END(__futex_syscall3)
|
||||||
|
|
||||||
/* int __futex_syscall4(volatile void *ftx, int op, int val, const struct timespec *timeout) */
|
// int __futex_syscall4(volatile void *ftx, int op, int val, const struct timespec *timeout)
|
||||||
.text
|
ENTRY(__futex_syscall4)
|
||||||
.globl __futex_syscall4
|
|
||||||
.type __futex_syscall4, @function
|
|
||||||
.align 4
|
|
||||||
__futex_syscall4:
|
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
pushl %esi
|
pushl %esi
|
||||||
movl 12(%esp), %ebx /* ftx */
|
movl 12(%esp), %ebx /* ftx */
|
||||||
@ -73,3 +57,4 @@ __futex_syscall4:
|
|||||||
popl %esi
|
popl %esi
|
||||||
popl %ebx
|
popl %ebx
|
||||||
ret
|
ret
|
||||||
|
END(__futex_syscall4)
|
||||||
|
@ -10,14 +10,10 @@
|
|||||||
* %ebp: arg5 - callee save
|
* %ebp: arg5 - callee save
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <machine/asm.h>
|
||||||
#include <sys/linux-syscalls.h>
|
#include <sys/linux-syscalls.h>
|
||||||
|
|
||||||
.text
|
ENTRY(syscall)
|
||||||
.type syscall, @function
|
|
||||||
.globl syscall
|
|
||||||
.align 4
|
|
||||||
|
|
||||||
syscall:
|
|
||||||
# Push the callee save registers.
|
# Push the callee save registers.
|
||||||
push %ebx
|
push %ebx
|
||||||
push %esi
|
push %esi
|
||||||
@ -53,3 +49,4 @@ syscall:
|
|||||||
pop %esi
|
pop %esi
|
||||||
pop %ebx
|
pop %ebx
|
||||||
ret
|
ret
|
||||||
|
END(syscall)
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <machine/asm.h>
|
||||||
#include <sys/linux-syscalls.h>
|
#include <sys/linux-syscalls.h>
|
||||||
|
|
||||||
#ifndef __NR_vfork
|
#ifndef __NR_vfork
|
||||||
@ -5,17 +6,12 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
.text
|
|
||||||
.type vfork, @function
|
|
||||||
.globl vfork
|
|
||||||
.align 4
|
|
||||||
|
|
||||||
/* Get rid of the stack modifications (popl/ret) after vfork() success.
|
/* Get rid of the stack modifications (popl/ret) after vfork() success.
|
||||||
* vfork is VERY sneaky. One has to be very careful about what can be done
|
* vfork is VERY sneaky. One has to be very careful about what can be done
|
||||||
* between a successful vfork and a a subsequent execve()
|
* between a successful vfork and a a subsequent execve()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
vfork:
|
ENTRY(vfork)
|
||||||
/* grab the return address */
|
/* grab the return address */
|
||||||
popl %ecx
|
popl %ecx
|
||||||
movl $__NR_vfork, %eax
|
movl $__NR_vfork, %eax
|
||||||
@ -28,3 +24,4 @@ vfork:
|
|||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
1:
|
1:
|
||||||
jmp *%ecx
|
jmp *%ecx
|
||||||
|
END(vfork)
|
||||||
|
Loading…
Reference in New Issue
Block a user