1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include <dietfeatures.h>
#include <syscalls.h>
#include <errno.h>
#ifdef __DYN_LIB
#ifndef WANT_THREAD_SAFE
#define WANT_THREAD_SAFE
#endif
#endif
.text
.global mmap64
.type mmap64,@function
mmap64:
/* man is this ugly! */
push %ebp
push %edi
push %esi
push %ebx
movl %esp, %edi
movl 0x28(%edi), %eax
movl 0x2c(%edi), %edx
testl $0xfff, %eax /* offset in pages */
jnz .Leinval
shrdl $12, %edx, %eax
shrl $12, %edx
jnz .Leinval
movl %eax, %ebp
movl 0x14(%edi),%ebx
movl 0x18(%edi),%ecx
movl 0x1c(%edi),%edx
movl 0x20(%edi),%esi
movl 0x24(%edi),%edi
movl $__NR_mmap2,%eax
int $0x80
cmp $-124,%eax
jbe .Lnoerror
neg %eax
.Lerror:
#ifdef WANT_THREAD_SAFE
movl %eax,%ebx
#ifdef __DYN_LIB
call __errno_location@PLT
#else
call __errno_location
#endif
movl %ebx,(%eax)
orl $-1,%eax
#else
mov %eax,errno
sbb %eax,%eax # eax = eax - eax - CY = -1
#endif
.Lnoerror:
pop %ebx
pop %esi
pop %edi
pop %ebp
ret
.Leinval:
movl $EINVAL,%eax
jmp .Lerror
.Lende2:
.size mmap64,.Lende2-mmap64
|