mirror of git://sourceware.org/git/glibc.git
Update.
2003-09-14 Ulrich Drepper <drepper@redhat.com> * dirent/dirent.h: Remove __THROW from scandir. 2003-09-14 Philip Blundell <philb@gnu.org> * sysdeps/unix/sysv/linux/arm/mmap.S: Use sys_mmap2 if it's known to be available. * sysdeps/unix/sysv/linux/arm/mmap64.S: Optimise code a little. * sysdeps/arm/memset.S: Rewrite.
This commit is contained in:
parent
9b995718ae
commit
b6cfea1299
13
ChangeLog
13
ChangeLog
|
|
@ -1,3 +1,16 @@
|
||||||
|
2003-09-14 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* dirent/dirent.h: Remove __THROW from scandir.
|
||||||
|
|
||||||
|
2003-09-14 Philip Blundell <philb@gnu.org>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/arm/mmap.S: Use sys_mmap2 if it's known
|
||||||
|
to be available.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/arm/mmap64.S: Optimise code a little.
|
||||||
|
|
||||||
|
* sysdeps/arm/memset.S: Rewrite.
|
||||||
|
|
||||||
2003-09-12 Jakub Jelinek <jakub@redhat.com>
|
2003-09-12 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/s390/bits/typesizes.h: New.
|
* sysdeps/unix/sysv/linux/s390/bits/typesizes.h: New.
|
||||||
|
|
|
||||||
|
|
@ -239,14 +239,14 @@ extern int dirfd (DIR *__dirp) __THROW;
|
||||||
extern int scandir (__const char *__restrict __dir,
|
extern int scandir (__const char *__restrict __dir,
|
||||||
struct dirent ***__restrict __namelist,
|
struct dirent ***__restrict __namelist,
|
||||||
int (*__selector) (__const struct dirent *),
|
int (*__selector) (__const struct dirent *),
|
||||||
int (*__cmp) (__const void *, __const void *)) __THROW;
|
int (*__cmp) (__const void *, __const void *));
|
||||||
# else
|
# else
|
||||||
# ifdef __REDIRECT
|
# ifdef __REDIRECT
|
||||||
extern int __REDIRECT (scandir,
|
extern int __REDIRECT (scandir,
|
||||||
(__const char *__restrict __dir,
|
(__const char *__restrict __dir,
|
||||||
struct dirent ***__restrict __namelist,
|
struct dirent ***__restrict __namelist,
|
||||||
int (*__selector) (__const struct dirent *),
|
int (*__selector) (__const struct dirent *),
|
||||||
int (*__cmp) (__const void *, __const void *)) __THROW,
|
int (*__cmp) (__const void *, __const void *)),
|
||||||
scandir64);
|
scandir64);
|
||||||
# else
|
# else
|
||||||
# define scandir scandir64
|
# define scandir scandir64
|
||||||
|
|
@ -259,7 +259,7 @@ extern int __REDIRECT (scandir,
|
||||||
extern int scandir64 (__const char *__restrict __dir,
|
extern int scandir64 (__const char *__restrict __dir,
|
||||||
struct dirent64 ***__restrict __namelist,
|
struct dirent64 ***__restrict __namelist,
|
||||||
int (*__selector) (__const struct dirent64 *),
|
int (*__selector) (__const struct dirent64 *),
|
||||||
int (*__cmp) (__const void *, __const void *)) __THROW;
|
int (*__cmp) (__const void *, __const void *));
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Function to compare two `struct dirent's alphabetically. */
|
/* Function to compare two `struct dirent's alphabetically. */
|
||||||
|
|
@ -269,8 +269,7 @@ extern int alphasort (__const void *__e1, __const void *__e2)
|
||||||
# else
|
# else
|
||||||
# ifdef __REDIRECT
|
# ifdef __REDIRECT
|
||||||
extern int __REDIRECT (alphasort,
|
extern int __REDIRECT (alphasort,
|
||||||
(__const void *__e1, __const void *__e2)
|
(__const void *__e1, __const void *__e2) __THROW,
|
||||||
__THROW,
|
|
||||||
alphasort64) __attribute_pure__;
|
alphasort64) __attribute_pure__;
|
||||||
# else
|
# else
|
||||||
# define alphasort alphasort64
|
# define alphasort alphasort64
|
||||||
|
|
@ -290,8 +289,7 @@ extern int versionsort (__const void *__e1, __const void *__e2)
|
||||||
# else
|
# else
|
||||||
# ifdef __REDIRECT
|
# ifdef __REDIRECT
|
||||||
extern int __REDIRECT (versionsort,
|
extern int __REDIRECT (versionsort,
|
||||||
(__const void *__e1, __const void *__e2)
|
(__const void *__e1, __const void *__e2) __THROW,
|
||||||
__THROW,
|
|
||||||
versionsort64) __attribute_pure__;
|
versionsort64) __attribute_pure__;
|
||||||
# else
|
# else
|
||||||
# define versionsort versionsort64
|
# define versionsort versionsort64
|
||||||
|
|
|
||||||
|
|
@ -22,47 +22,46 @@
|
||||||
/* void *memset (dstpp, c, len) */
|
/* void *memset (dstpp, c, len) */
|
||||||
|
|
||||||
ENTRY(memset)
|
ENTRY(memset)
|
||||||
mov a4, a1
|
mov r3, r0
|
||||||
cmp a3, $8 @ at least 8 bytes to do?
|
cmp r2, #8
|
||||||
blt 2f
|
bcc 2f @ less than 8 bytes to move
|
||||||
orr a2, a2, a2, lsl $8
|
|
||||||
orr a2, a2, a2, lsl $16
|
|
||||||
1:
|
1:
|
||||||
tst a4, $3 @ aligned yet?
|
tst r3, #3 @ aligned yet?
|
||||||
strneb a2, [a4], $1
|
strneb r1, [r3], #1
|
||||||
subne a3, a3, $1
|
subne r2, r2, #1
|
||||||
bne 1b
|
bne 1b
|
||||||
mov ip, a2
|
|
||||||
|
orr r1, r1, r1, lsl $8
|
||||||
|
orr r1, r1, r1, lsl $16
|
||||||
|
|
||||||
1:
|
1:
|
||||||
cmp a3, $8 @ 8 bytes still to do?
|
subs r2, r2, #8
|
||||||
blt 2f
|
strcs r1, [r3], #4 @ store up to 32 bytes per loop iteration
|
||||||
stmia a4!, {a2, ip}
|
strcs r1, [r3], #4
|
||||||
sub a3, a3, $8
|
subcss r2, r2, #8
|
||||||
cmp a3, $8 @ 8 bytes still to do?
|
strcs r1, [r3], #4
|
||||||
blt 2f
|
strcs r1, [r3], #4
|
||||||
stmia a4!, {a2, ip}
|
subcss r2, r2, #8
|
||||||
sub a3, a3, $8
|
strcs r1, [r3], #4
|
||||||
cmp a3, $8 @ 8 bytes still to do?
|
strcs r1, [r3], #4
|
||||||
blt 2f
|
subcss r2, r2, #8
|
||||||
stmia a4!, {a2, ip}
|
strcs r1, [r3], #4
|
||||||
sub a3, a3, $8
|
strcs r1, [r3], #4
|
||||||
cmp a3, $8 @ 8 bytes still to do?
|
bcs 1b
|
||||||
stmgeia a4!, {a2, ip}
|
|
||||||
subge a3, a3, $8
|
and r2, r2, #7
|
||||||
bge 1b
|
|
||||||
2:
|
2:
|
||||||
movs a3, a3 @ anything left?
|
subs r2, r2, #1 @ store up to 4 bytes per loop iteration
|
||||||
RETINSTR(moveq,pc,lr) @ nope
|
strcsb r1, [r3], #1
|
||||||
rsb a3, a3, $7
|
subcss r2, r2, #1
|
||||||
add pc, pc, a3, lsl $2
|
strcsb r1, [r3], #1
|
||||||
mov r0, r0
|
subcss r2, r2, #1
|
||||||
strb a2, [a4], $1
|
strcsb r1, [r3], #1
|
||||||
strb a2, [a4], $1
|
subcss r2, r2, #1
|
||||||
strb a2, [a4], $1
|
strcsb r1, [r3], #1
|
||||||
strb a2, [a4], $1
|
bcs 2b
|
||||||
strb a2, [a4], $1
|
|
||||||
strb a2, [a4], $1
|
DO_RET(lr)
|
||||||
strb a2, [a4], $1
|
|
||||||
RETINSTR(mov,pc,lr)
|
|
||||||
END(memset)
|
END(memset)
|
||||||
libc_hidden_builtin_def (memset)
|
libc_hidden_builtin_def (memset)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
|
/* Copyright (C) 1998, 2000, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
|
@ -17,11 +17,47 @@
|
||||||
02111-1307 USA. */
|
02111-1307 USA. */
|
||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
|
||||||
|
#define EINVAL 22
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
ENTRY (__mmap)
|
ENTRY (__mmap)
|
||||||
|
# ifdef __ASSUME_MMAP2_SYSCALL
|
||||||
|
/* This code is actually a couple of cycles slower than the
|
||||||
|
sys_mmap version below, so it might seem like a loss. But the
|
||||||
|
code path inside the kernel is sufficiently much shorter to
|
||||||
|
make it a net gain to use mmap2 when it's known to be
|
||||||
|
available. */
|
||||||
|
|
||||||
|
/* shuffle args */
|
||||||
|
str r5, [sp, #-4]!
|
||||||
|
ldr r5, [sp, #8]
|
||||||
|
str r4, [sp, #-4]!
|
||||||
|
ldr r4, [sp, #8]
|
||||||
|
|
||||||
|
/* convert offset to pages */
|
||||||
|
movs ip, r5, lsl #20
|
||||||
|
bne .Linval
|
||||||
|
mov r5, r5, lsr #12
|
||||||
|
|
||||||
|
/* do the syscall */
|
||||||
|
swi SYS_ify (mmap2)
|
||||||
|
|
||||||
|
/* restore registers */
|
||||||
|
2:
|
||||||
|
ldr r4, [sp], #4
|
||||||
|
ldr r5, [sp], #4
|
||||||
|
|
||||||
|
cmn r0, $4096
|
||||||
|
RETINSTR(movcc, pc, lr)
|
||||||
|
b PLTJMP(syscall_error)
|
||||||
|
|
||||||
|
.Linval:
|
||||||
|
mov r0, #-EINVAL
|
||||||
|
b 2b
|
||||||
|
# else
|
||||||
/* Because we can only get five args through the syscall interface, and
|
/* Because we can only get five args through the syscall interface, and
|
||||||
mmap() takes six, we need to build a parameter block and pass its
|
mmap() takes six, we need to build a parameter block and pass its
|
||||||
address instead. The 386 port does a similar trick. */
|
address instead. The 386 port does a similar trick. */
|
||||||
|
|
@ -49,6 +85,7 @@ ENTRY (__mmap)
|
||||||
cmn r0, $4096
|
cmn r0, $4096
|
||||||
RETINSTR(movcc, pc, lr)
|
RETINSTR(movcc, pc, lr)
|
||||||
b PLTJMP(syscall_error);
|
b PLTJMP(syscall_error);
|
||||||
|
#endif
|
||||||
|
|
||||||
PSEUDO_END (__mmap)
|
PSEUDO_END (__mmap)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,38 +27,44 @@
|
||||||
.text
|
.text
|
||||||
ENTRY (__mmap64)
|
ENTRY (__mmap64)
|
||||||
#ifdef __NR_mmap2
|
#ifdef __NR_mmap2
|
||||||
stmfd sp!, {r4, r5, lr}
|
ldr ip, [sp, $4] @ offset low part
|
||||||
ldr r5, [sp, $16]
|
str r5, [sp, #-4]!
|
||||||
ldr r4, [sp, $12]
|
ldr r5, [sp, $12] @ offset high part
|
||||||
movs ip, r5, lsl $20 @ check that offset is page-aligned
|
str r4, [sp, #-4]!
|
||||||
|
movs r4, ip, lsl $20 @ check that offset is page-aligned
|
||||||
|
mov ip, ip, lsr $12
|
||||||
|
moveqs r4, r5, lsr $12 @ check for overflow
|
||||||
bne .Linval
|
bne .Linval
|
||||||
ldr ip, [sp, $20]
|
ldr r4, [sp, $8] @ load fd
|
||||||
mov r5, r5, lsr $12
|
orr r5, ip, r5, lsl $20 @ compose page offset
|
||||||
orr r5, r5, ip, lsl $20 @ compose page offset
|
|
||||||
movs ip, ip, lsr $12
|
|
||||||
bne .Linval @ check for overflow
|
|
||||||
mov ip, r0
|
mov ip, r0
|
||||||
swi SYS_ify (mmap2)
|
swi SYS_ify (mmap2)
|
||||||
cmn r0, $4096
|
cmn r0, $4096
|
||||||
LOADREGS(ccfd, sp!, {r4, r5, pc})
|
|
||||||
# ifdef __ASSUME_MMAP2_SYSCALL
|
# ifdef __ASSUME_MMAP2_SYSCALL
|
||||||
ldmfd sp!, {r4, r5, lr}
|
ldr r4, [sp], #4
|
||||||
|
ldr r5, [sp], #4
|
||||||
|
RETINSTR(movcc, pc, lr)
|
||||||
b PLTJMP(syscall_error)
|
b PLTJMP(syscall_error)
|
||||||
# else
|
# else
|
||||||
|
ldrcc r4, [sp], #4
|
||||||
|
ldrcc r5, [sp], #4
|
||||||
|
RETINSTR(movcc, pc, lr)
|
||||||
cmn r0, $ENOSYS
|
cmn r0, $ENOSYS
|
||||||
ldmnefd sp!, {r4, r5, lr}
|
bne .Lerror
|
||||||
bne PLTJMP(syscall_error)
|
|
||||||
/* The current kernel does not support mmap2. Fall back to plain
|
/* The current kernel does not support mmap2. Fall back to plain
|
||||||
mmap if the offset is small enough. */
|
mmap if the offset is small enough. */
|
||||||
ldr r5, [sp, $20]
|
ldr r5, [sp, $16]
|
||||||
mov r0, ip @ first arg was clobbered
|
mov r0, ip @ first arg was clobbered
|
||||||
teq r5, $0
|
teq r5, $0
|
||||||
ldmeqfd sp!, {r4, r5, lr}
|
ldreq r4, [sp], #4
|
||||||
|
ldreq r5, [sp], #4
|
||||||
beq PLTJMP(__mmap)
|
beq PLTJMP(__mmap)
|
||||||
# endif
|
# endif
|
||||||
.Linval:
|
.Linval:
|
||||||
mov r0, $-EINVAL
|
mov r0, $-EINVAL
|
||||||
ldmfd sp!, {r4, r5, lr}
|
.Lerror:
|
||||||
|
ldr r4, [sp], #4
|
||||||
|
ldr r5, [sp], #4
|
||||||
b PLTJMP(syscall_error)
|
b PLTJMP(syscall_error)
|
||||||
#else
|
#else
|
||||||
/* The kernel headers do not support mmap2. Fall back to plain
|
/* The kernel headers do not support mmap2. Fall back to plain
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue