OSDN Git Service

hidden_def/hidden_proto: convert all users (I hope) termios split, add some missing...
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / arm / mmap64.S
1 /* Copyright (C) 2000 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <features.h>
20 #define _ERRNO_H
21 #include <bits/errno.h>
22 #include <sys/syscall.h>
23
24 #if defined __UCLIBC_HAS_LFS__ && defined __NR_mmap2
25
26 /* The mmap2 system call takes six arguments, all in registers.  */
27 .text
28 .global mmap64
29 .type mmap64,%function
30 .align 4
31 mmap64:
32         stmfd   sp!, {r4, r5, lr}
33         ldr     r5, [sp, $16]
34         ldr     r4, [sp, $12]
35         movs    ip, r5, lsl $20         @ check that offset is page-aligned
36         bne     .Linval
37         ldr     ip, [sp, $20]
38         mov     r5, r5, lsr $12
39         orr     r5, r5, ip, lsl $20     @ compose page offset
40         movs    ip, ip, lsr $12
41         bne     .Linval                 @ check for overflow
42         mov     ip, r0
43         swi     __NR_mmap2
44         cmn     r0, $4096
45         ldmccfd sp!, {r4, r5, pc}
46         cmn     r0, $ENOSYS
47         ldmnefd sp!, {r4, r5, lr}
48         bne     __error
49         /* The current kernel does not support mmap2.  Fall back to plain
50            mmap if the offset is small enough.  */
51         ldr     r5, [sp, $20]
52         mov     r0, ip                  @ first arg was clobbered
53         teq     r5, $0
54         ldmeqfd sp!, {r4, r5, lr}
55         beq     HIDDEN_JUMPTARGET(mmap)
56 .Linval:
57         mov     r0, $-EINVAL
58         ldmfd   sp!, {r4, r5, lr}
59         b       __error
60
61 __error:
62         b       __syscall_error
63
64 .size mmap64,.-mmap64
65
66 #endif