1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-07 06:43:00 +03:00
2001-04-03  Ulrich Drepper  <drepper@redhat.com>

	* misc/dirname.c (dirname): Handle multiple slashes correctly.

2001-04-03  Martin Schwidefsky  <schwidefsky@de.ibm.com>

	* sysdeps/s390/s390-64/initfini.c: Fix __gmon_start__ GOT access.

2001-04-03  Martin Schwidefsky  <schwidefsky@de.ibm.com>

	* sysdeps/s390/s390-32/bcopy.S: Optimize for speed.
	* sysdeps/s390/s390-64/bcopy.S: Likewise.
	* sysdeps/s390/s390-32/mempcy.S: Likewise.
	* sysdeps/s390/s390-64/memcpy.S: Likewise.

2001-04-02  Bruno Haible  <haible@clisp.cons.org>

	* manual/message.texi (Advanced gettext functions): More specific
	syntax in the plural formula examples.

2001-04-02  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>

	* sysdeps/powerpc/atomicity.h: Silence warnings.
	* sysdeps/powerpc/dl-machine.h: Likewise.
	* sysdeps/powerpc/register-dump.h: Likewise.
	* sysdeps/powerpc/fpu/s_lrint.c: Likewise.

2001-04-02  Andreas Jaeger  <aj@suse.de>

	* misc/tst-dirname.c (main): Add more tests, derived from a bug
	report by Michael Kerrisk <mtk16@ext.canterbury.ac.nz>.

2001-04-01  Andreas Jaeger  <aj@suse.de>

	* debug/xtrace.sh (pcprofileso): Use SLIBDIR since libpcprofile.so
	is installed there.
	* malloc/memusage.sh (memusageso): Likewise for libmemusage.so.

2001-04-01  H.J. Lu  <hjl@gnu.org>

	* posix/annexc.c (macrofile): Renamed from TMPFILE and set to
	tmpnam (NULL).
	* stdlib/isomac.c (macrofile): Likewise.

2001-03-30  Thorsten Kukuk  <kukuk@suse.de>

	* inet/rcmd.c: Allow AF_UNSPEC as parameter.
	* nis/ypclnt.c (yp_all): Print error message only at last try,
	check for protocoll error only if we don't have a network error.
This commit is contained in:
Ulrich Drepper
2001-04-04 00:01:02 +00:00
parent f114375059
commit c891b2df08
20 changed files with 410 additions and 276 deletions

View File

@@ -1,3 +1,53 @@
2001-04-03 Ulrich Drepper <drepper@redhat.com>
* misc/dirname.c (dirname): Handle multiple slashes correctly.
2001-04-03 Martin Schwidefsky <schwidefsky@de.ibm.com>
* sysdeps/s390/s390-64/initfini.c: Fix __gmon_start__ GOT access.
2001-04-03 Martin Schwidefsky <schwidefsky@de.ibm.com>
* sysdeps/s390/s390-32/bcopy.S: Optimize for speed.
* sysdeps/s390/s390-64/bcopy.S: Likewise.
* sysdeps/s390/s390-32/mempcy.S: Likewise.
* sysdeps/s390/s390-64/memcpy.S: Likewise.
2001-04-02 Bruno Haible <haible@clisp.cons.org>
* manual/message.texi (Advanced gettext functions): More specific
syntax in the plural formula examples.
2001-04-02 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
* sysdeps/powerpc/atomicity.h: Silence warnings.
* sysdeps/powerpc/dl-machine.h: Likewise.
* sysdeps/powerpc/register-dump.h: Likewise.
* sysdeps/powerpc/fpu/s_lrint.c: Likewise.
2001-04-02 Andreas Jaeger <aj@suse.de>
* misc/tst-dirname.c (main): Add more tests, derived from a bug
report by Michael Kerrisk <mtk16@ext.canterbury.ac.nz>.
2001-04-01 Andreas Jaeger <aj@suse.de>
* debug/xtrace.sh (pcprofileso): Use SLIBDIR since libpcprofile.so
is installed there.
* malloc/memusage.sh (memusageso): Likewise for libmemusage.so.
2001-04-01 H.J. Lu <hjl@gnu.org>
* posix/annexc.c (macrofile): Renamed from TMPFILE and set to
tmpnam (NULL).
* stdlib/isomac.c (macrofile): Likewise.
2001-03-30 Thorsten Kukuk <kukuk@suse.de>
* inet/rcmd.c: Allow AF_UNSPEC as parameter.
* nis/ypclnt.c (yp_all): Print error message only at last try,
check for protocoll error only if we don't have a network error.
2001-04-02 Andreas Schwab <schwab@suse.de> 2001-04-02 Andreas Schwab <schwab@suse.de>
* resolv/res_data.c (res_isourserver): Fix cast. * resolv/res_data.c (res_isourserver): Fix cast.

12
FAQ
View File

@@ -163,6 +163,7 @@ please let me know.
when I try to use it, it always returns -1 and sets errno to ENOSYS. when I try to use it, it always returns -1 and sets errno to ENOSYS.
3.22. My program segfaults when I call fclose() on the FILE* returned 3.22. My program segfaults when I call fclose() on the FILE* returned
from setmntent(). Is this a glibc bug? from setmntent(). Is this a glibc bug?
3.23. I get "undefined reference to `atexit'"
4. Miscellaneous 4. Miscellaneous
@@ -1683,6 +1684,17 @@ In the case of setmntent(), it may appear to work in most cases, but it
won't always work. Unfortunately, for compatibility reasons, we can't won't always work. Unfortunately, for compatibility reasons, we can't
change the return type of setmntent() to something other than FILE *. change the return type of setmntent() to something other than FILE *.
3.23. I get "undefined reference to `atexit'"
{UD} This means that your installation is somehow broken. The situation is
the same as for 'stat', 'fstat', etc (see question 2.7). Investigate why the
linker does not pick up libc_nonshared.a.
If a similar message is issued at runtime this means that the application or
DSO is not linked against libc. This can cause problems since 'atexit' is
not exported anymore.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12
FAQ.in
View File

@@ -565,7 +565,7 @@ exactly what to use.
Version 2.7.2.3 does and future versions of GCC will automatically Version 2.7.2.3 does and future versions of GCC will automatically
provide the correct specs. provide the correct specs.
?? Looking through the shared libc file I haven't found the ??nonsh Looking through the shared libc file I haven't found the
functions `stat', `lstat', `fstat', and `mknod' and while functions `stat', `lstat', `fstat', and `mknod' and while
linking on my Linux system I get error messages. How is linking on my Linux system I get error messages. How is
this supposed to work? this supposed to work?
@@ -1438,6 +1438,16 @@ In the case of setmntent(), it may appear to work in most cases, but it
won't always work. Unfortunately, for compatibility reasons, we can't won't always work. Unfortunately, for compatibility reasons, we can't
change the return type of setmntent() to something other than FILE *. change the return type of setmntent() to something other than FILE *.
?? I get "undefined reference to `atexit'"
{UD} This means that your installation is somehow broken. The situation is
the same as for 'stat', 'fstat', etc (see ?nonsh). Investigate why the
linker does not pick up libc_nonshared.a.
If a similar message is issued at runtime this means that the application or
DSO is not linked against libc. This can cause problems since 'atexit' is
not exported anymore.
? Miscellaneous ? Miscellaneous

View File

@@ -18,7 +18,7 @@
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA. # Boston, MA 02111-1307, USA.
pcprofileso=@LIBDIR@/libpcprofile.so pcprofileso=@SLIBDIR@/libpcprofile.so
pcprofiledump=@BINDIR@/pcprofiledump pcprofiledump=@BINDIR@/pcprofiledump
# Print usage message. # Print usage message.

View File

@@ -18,7 +18,7 @@
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA. # Boston, MA 02111-1307, USA.
memusageso=@LIBDIR@/libmemusage.so memusageso=@SLIBDIR@/libmemusage.so
memusagestat=@BINDIR@/memusagestat memusagestat=@BINDIR@/memusagestat
# Print usage message. # Print usage message.

View File

@@ -1075,7 +1075,7 @@ code similar to the following:
@end smallexample @end smallexample
@noindent @noindent
After the first complains from people internationalizing the code people After the first complaints from people internationalizing the code people
either completely avoided formulations like this or used strings like either completely avoided formulations like this or used strings like
@code{"file(s)"}. Both look unnatural and should be avoided. First @code{"file(s)"}. Both look unnatural and should be avoided. First
tries to solve the problem correctly looked like this: tries to solve the problem correctly looked like this:
@@ -1193,11 +1193,11 @@ details are explained in the GNU @code{gettext} manual. Here only a a
bit of information is provided. bit of information is provided.
The information about the plural form selection has to be stored in the The information about the plural form selection has to be stored in the
header entry (the one with the empty (@code{msgid} string). There should header entry (the one with the empty (@code{msgid} string). It looks
be something like: like this:
@smallexample @smallexample
nplurals=2; plural=n == 1 ? 0 : 1 Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;
@end smallexample @end smallexample
The @code{nplurals} value must be a decimal number which specifies how The @code{nplurals} value must be a decimal number which specifies how
@@ -1222,11 +1222,11 @@ below).@footnote{Additions are welcome. Send appropriate information to
@table @asis @table @asis
@item Only one form: @item Only one form:
Some languages only require one single form. There is no distinction Some languages only require one single form. There is no distinction
between the singular and plural form. And appropriate header entry between the singular and plural form. An appropriate header entry
would look like this: would look like this:
@smallexample @smallexample
nplurals=1; plural=0 Plural-Forms: nplurals=1; plural=0;
@end smallexample @end smallexample
@noindent @noindent
@@ -1246,7 +1246,7 @@ This is the form used in most existing programs since it is what English
is using. A header entry would look like this: is using. A header entry would look like this:
@smallexample @smallexample
nplurals=2; plural=n != 1 Plural-Forms: nplurals=2; plural=n != 1;
@end smallexample @end smallexample
(Note: this uses the feature of C expressions that boolean expressions (Note: this uses the feature of C expressions that boolean expressions
@@ -1274,7 +1274,7 @@ Esperanto
Exceptional case in the language family. The header entry would be: Exceptional case in the language family. The header entry would be:
@smallexample @smallexample
nplurals=2; plural=n>1 Plural-Forms: nplurals=2; plural=n>1;
@end smallexample @end smallexample
@noindent @noindent
@@ -1289,7 +1289,7 @@ French
The header entry would be: The header entry would be:
@smallexample @smallexample
nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2 Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;
@end smallexample @end smallexample
@noindent @noindent
@@ -1304,7 +1304,8 @@ Gaeilge
The header entry would look like this: The header entry would look like this:
@smallexample @smallexample
nplurals=3; plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1 Plural-Forms: nplurals=3; \
plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1;
@end smallexample @end smallexample
@noindent @noindent
@@ -1319,8 +1320,9 @@ Czech, Russian, Slovak
The header entry would look like this: The header entry would look like this:
@smallexample @smallexample
nplurals=3; plural=n==1 ? 0 : \ Plural-Forms: nplurals=3; \
n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2 plural=n==1 ? 0 : \
n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
@end smallexample @end smallexample
(Continuation in the next line is possible.) (Continuation in the next line is possible.)
@@ -1337,7 +1339,8 @@ Polish
The header entry would look like this: The header entry would look like this:
@smallexample @smallexample
nplurals=4; plural=n==1 ? 0 : n%10==2 ? 1 : n%10==3 || n%10==4 ? 2 : 3 Plural-Forms: nplurals=4; \
plural=n==1 ? 0 : n%10==2 ? 1 : n%10==3 || n%10==4 ? 2 : 3;
@end smallexample @end smallexample
@noindent @noindent

View File

@@ -1,5 +1,5 @@
/* dirname - return directory part of PATH. /* dirname - return directory part of PATH.
Copyright (C) 1996, 2000 Free Software Foundation, Inc. Copyright (C) 1996, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -32,16 +32,40 @@ dirname (char *path)
last_slash = path != NULL ? strrchr (path, '/') : NULL; last_slash = path != NULL ? strrchr (path, '/') : NULL;
if (last_slash != NULL && last_slash != path && last_slash[1] == '\0') if (last_slash != NULL && last_slash != path && last_slash[1] == '\0')
/* The '/' is the last character, we have to look further. */ {
last_slash = __memrchr (path, '/', last_slash - path); /* Determine whether all remaining characters are slashes. */
char *runp;
for (runp = last_slash; runp != path; --runp)
if (runp[-1] != '/')
break;
/* The '/' is the last character, we have to look further. */
if (runp != path)
last_slash = __memrchr (path, '/', runp - path);
}
if (last_slash != NULL) if (last_slash != NULL)
{ {
/* Determine whether all remaining characters are slashes. */
char *runp;
for (runp = last_slash; runp != path; --runp)
if (runp[-1] != '/')
break;
/* Terminate the path. */ /* Terminate the path. */
if (last_slash == path) if (runp == path)
/* The last slash is the first character in the string. We have to {
return "/". */ /* The last slash is the first character in the string. We have to
++last_slash; return "/". As a special case we have to return "//" if there
are exactly two slashes at the beginning of the string. See
XBD 4.10 Path Name Resolution for more information. */
if (last_slash == path + 1)
++last_slash;
else
last_slash = path + 1;
}
last_slash[0] = '\0'; last_slash[0] = '\0';
} }

View File

@@ -1,5 +1,5 @@
/* Test program for dirname function a la XPG. /* Test program for dirname function a la XPG.
Copyright (C) 1996, 2000 Free Software Foundation, Inc. Copyright (C) 1996, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -54,6 +54,13 @@ main (void)
/* Some more tests. */ /* Some more tests. */
result |= test ("/usr/lib/", "/usr"); result |= test ("/usr/lib/", "/usr");
result |= test ("/usr", "/"); result |= test ("/usr", "/");
result |= test ("a//", ".");
result |= test ("a////", ".");
result |= test ("////usr", "/");
result |= test ("////usr//", "/");
result |= test ("//usr", "//");
result |= test ("//usr//", "//");
result |= test ("//", "//");
return result != 0; return result != 0;
} }

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. /* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996. Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
@@ -729,7 +729,9 @@ yp_all (const char *indomain, const char *inmap,
if (result != RPC_SUCCESS) if (result != RPC_SUCCESS)
{ {
clnt_perror (clnt, "yp_all: clnt_call"); /* Print the error message only on the last try */
if (try == MAXTRIES - 1)
clnt_perror (clnt, "yp_all: clnt_call");
res = YPERR_RPC; res = YPERR_RPC;
} }
else else
@@ -738,7 +740,7 @@ yp_all (const char *indomain, const char *inmap,
__yp_unbind (ydb); __yp_unbind (ydb);
clnt_destroy (clnt); clnt_destroy (clnt);
if (status != YP_NOMORE) if (res == YPERR_SUCCESS && status != YP_NOMORE)
{ {
__set_errno (saved_errno); __set_errno (saved_errno);
return ypprot_err (status); return ypprot_err (status);

View File

@@ -25,9 +25,10 @@
#include <signal.h> #include <signal.h>
#include <sys/wait.h> #include <sys/wait.h>
#define TMPFILE "/tmp/macros"
#define HEADER_MAX 256 #define HEADER_MAX 256
static const char *macrofile;
/* <aio.h>. */ /* <aio.h>. */
static const char *const aio_syms[] = static const char *const aio_syms[] =
{ {
@@ -712,8 +713,10 @@ get_null_defines (void)
FILE *input; FILE *input;
int first = 1; int first = 1;
macrofile = tmpnam (NULL);
command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC) command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
+ strlen (INC) + strlen (TMPFILE)); + strlen (INC) + strlen (macrofile));
if (command == NULL) if (command == NULL)
{ {
@@ -721,7 +724,7 @@ get_null_defines (void)
exit (1); exit (1);
} }
sprintf (command, fmt, "/dev/null", CC, INC, CC, TMPFILE); sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile);
if (xsystem (command)) if (xsystem (command))
{ {
@@ -729,11 +732,11 @@ get_null_defines (void)
return NULL; return NULL;
} }
free (command); free (command);
input = fopen (TMPFILE, "r"); input = fopen (macrofile, "r");
if (input == NULL) if (input == NULL)
{ {
printf ("Could not read %s: ", TMPFILE); printf ("Could not read %s: ", macrofile);
perror (NULL); perror (NULL);
return NULL; return NULL;
} }
@@ -782,7 +785,7 @@ get_null_defines (void)
} }
result[result_len] = NULL; result[result_len] = NULL;
fclose (input); fclose (input);
remove (TMPFILE); remove (macrofile);
return (const char **) result; return (const char **) result;
} }
@@ -799,7 +802,7 @@ check_header (const struct header *header, const char **except)
memset (found, '\0', header->nsyms * sizeof (int)); memset (found, '\0', header->nsyms * sizeof (int));
command = alloca (sizeof fmt + strlen (header->name) + 2 * strlen (CC) command = alloca (sizeof fmt + strlen (header->name) + 2 * strlen (CC)
+ strlen (INC) + strlen (TMPFILE)); + strlen (INC) + strlen (macrofile));
if (command == NULL) if (command == NULL)
@@ -809,13 +812,13 @@ check_header (const struct header *header, const char **except)
} }
printf ("=== %s ===\n", header->name); printf ("=== %s ===\n", header->name);
sprintf (command, fmt, header->name, CC, INC, CC, TMPFILE); sprintf (command, fmt, header->name, CC, INC, CC, macrofile);
/* First see whether this subset is supported at all. */ /* First see whether this subset is supported at all. */
if (header->subset != NULL) if (header->subset != NULL)
{ {
sprintf (line, testfmt, header->subset, header->subset, CC, INC, CC, sprintf (line, testfmt, header->subset, header->subset, CC, INC, CC,
TMPFILE); macrofile);
if (xsystem (line)) if (xsystem (line))
{ {
printf ("!! not available\n"); printf ("!! not available\n");
@@ -828,11 +831,11 @@ check_header (const struct header *header, const char **except)
puts ("system() returned nonzero"); puts ("system() returned nonzero");
result = 1; result = 1;
} }
input = fopen (TMPFILE, "r"); input = fopen (macrofile, "r");
if (input == NULL) if (input == NULL)
{ {
printf ("Could not read %s: ", TMPFILE); printf ("Could not read %s: ", macrofile);
perror (NULL); perror (NULL);
return 1; return 1;
} }
@@ -884,7 +887,7 @@ check_header (const struct header *header, const char **except)
result |= 1; result |= 1;
} }
fclose (input); fclose (input);
remove (TMPFILE); remove (macrofile);
for (i = 0; i < header->nsyms; ++i) for (i = 0; i < header->nsyms; ++i)
if (found[i] == 0) if (found[i] == 0)

View File

@@ -52,7 +52,7 @@
preprocessor has something similar to gcc's -dM option. Tune preprocessor has something similar to gcc's -dM option. Tune
PRINT_MACROS in this case. This program assumes headers are found PRINT_MACROS in this case. This program assumes headers are found
under /usr/include and that there is a writable /tmp directory. under /usr/include and that there is a writable /tmp directory.
Tune SYSTEM_INCLUDE and TMPFILE if your system differs. Tune SYSTEM_INCLUDE if your system differs.
#define BROKEN_SYSTEM if system(NULL) bombs -- one more violation #define BROKEN_SYSTEM if system(NULL) bombs -- one more violation
of ISO C, by the way. of ISO C, by the way.
@@ -75,9 +75,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#define TMPFILE "/tmp/macros"
#define HEADER_MAX 256 #define HEADER_MAX 256
static const char *macrofile;
/* ISO C header names including Amendment 1 (without ".h" suffix). */ /* ISO C header names including Amendment 1 (without ".h" suffix). */
static char *header[] = static char *header[] =
{ {
@@ -247,8 +248,10 @@ get_null_defines (void)
FILE *input; FILE *input;
int first = 1; int first = 1;
macrofile = tmpnam (NULL);
command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC) command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
+ strlen (INC) + strlen (TMPFILE)); + strlen (INC) + strlen (macrofile));
if (command == NULL) if (command == NULL)
{ {
@@ -256,7 +259,7 @@ get_null_defines (void)
exit (1); exit (1);
} }
sprintf (command, fmt, "/dev/null", CC, INC, CC, TMPFILE); sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile);
if (system (command)) if (system (command))
{ {
@@ -264,11 +267,11 @@ get_null_defines (void)
return NULL; return NULL;
} }
free (command); free (command);
input = fopen (TMPFILE, "r"); input = fopen (macrofile, "r");
if (input == NULL) if (input == NULL)
{ {
printf ("Could not read %s: ", TMPFILE); printf ("Could not read %s: ", macrofile);
perror (NULL); perror (NULL);
return NULL; return NULL;
} }
@@ -321,7 +324,7 @@ get_null_defines (void)
} }
result[result_len] = NULL; result[result_len] = NULL;
fclose (input); fclose (input);
remove (TMPFILE); remove (macrofile);
return (const char **) result; return (const char **) result;
} }
@@ -335,7 +338,7 @@ check_header (const char *file_name, const char **except)
int result = 0; int result = 0;
command = malloc (sizeof fmt + strlen (file_name) + 2 * strlen (CC) command = malloc (sizeof fmt + strlen (file_name) + 2 * strlen (CC)
+ strlen (INC) + strlen (TMPFILE)); + strlen (INC) + strlen (macrofile));
if (command == NULL) if (command == NULL)
{ {
@@ -344,7 +347,7 @@ check_header (const char *file_name, const char **except)
} }
puts (file_name); puts (file_name);
sprintf (command, fmt, file_name, CC, INC, CC, TMPFILE); sprintf (command, fmt, file_name, CC, INC, CC, macrofile);
if (system (command)) if (system (command))
{ {
@@ -352,11 +355,11 @@ check_header (const char *file_name, const char **except)
result = 1; result = 1;
} }
free (command); free (command);
input = fopen (TMPFILE, "r"); input = fopen (macrofile, "r");
if (input == NULL) if (input == NULL)
{ {
printf ("Could not read %s: ", TMPFILE); printf ("Could not read %s: ", macrofile);
perror (NULL); perror (NULL);
return 1; return 1;
} }
@@ -430,7 +433,7 @@ check_header (const char *file_name, const char **except)
} }
} }
fclose (input); fclose (input);
remove (TMPFILE); remove (macrofile);
return result; return result;
} }

View File

@@ -33,11 +33,11 @@ __attribute__ ((unused))
exchange_and_add (volatile uint32_t *mem, int val) exchange_and_add (volatile uint32_t *mem, int val)
{ {
int tmp, result; int tmp, result;
__asm__ ("\ __asm__ ("\n\
0: lwarx %0,0,%2 0: lwarx %0,0,%2 \n\
add%I3 %1,%0,%3 add%I3 %1,%0,%3 \n\
stwcx. %1,0,%2 stwcx. %1,0,%2 \n\
bne- 0b bne- 0b \n\
" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); " : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
return result; return result;
} }
@@ -47,11 +47,11 @@ __attribute__ ((unused))
atomic_add (volatile uint32_t *mem, int val) atomic_add (volatile uint32_t *mem, int val)
{ {
int tmp; int tmp;
__asm__ ("\ __asm__ ("\n\
0: lwarx %0,0,%1 0: lwarx %0,0,%1 \n\
add%I2 %0,%0,%2 add%I2 %0,%0,%2 \n\
stwcx. %0,0,%1 stwcx. %0,0,%1 \n\
bne- 0b bne- 0b \n\
" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); " : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
} }
@@ -60,14 +60,14 @@ __attribute__ ((unused))
compare_and_swap (volatile long int *p, long int oldval, long int newval) compare_and_swap (volatile long int *p, long int oldval, long int newval)
{ {
int result; int result;
__asm__ ("\ __asm__ ("\n\
0: lwarx %0,0,%1 0: lwarx %0,0,%1 \n\
sub%I2c. %0,%0,%2 sub%I2c. %0,%0,%2 \n\
cntlzw %0,%0 cntlzw %0,%0 \n\
bne- 1f bne- 1f \n\
stwcx. %3,0,%1 stwcx. %3,0,%1 \n\
bne- 0b bne- 0b \n\
1: 1: \n\
" : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory"); " : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory");
return result >> 5; return result >> 5;
} }
@@ -77,10 +77,10 @@ __attribute__ ((unused))
always_swap (volatile long int *p, long int newval) always_swap (volatile long int *p, long int newval)
{ {
long int result; long int result;
__asm__ ("\ __asm__ ("\n\
0: lwarx %0,0,%1 0: lwarx %0,0,%1 \n\
stwcx. %2,0,%1 stwcx. %2,0,%1 \n\
bne- 0b bne- 0b \n\
" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory"); " : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
return result; return result;
} }
@@ -90,13 +90,13 @@ __attribute__ ((unused))
test_and_set (volatile long int *p, long int newval) test_and_set (volatile long int *p, long int newval)
{ {
int result; int result;
__asm__ ("\ __asm__ ("\n\
0: lwarx %0,0,%1 0: lwarx %0,0,%1 \n\
cmpwi %0,0 cmpwi %0,0 \n\
bne- 1f bne- 1f \n\
stwcx. %2,0,%1 stwcx. %2,0,%1 \n\
bne- 0b bne- 0b \n\
1: 1: \n\
" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory"); " : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
return result; return result;
} }

View File

@@ -102,101 +102,101 @@ elf_machine_load_address (void)
/* This code is used in dl-runtime.c to call the `fixup' function /* This code is used in dl-runtime.c to call the `fixup' function
and then redirect to the address it returns. It is called and then redirect to the address it returns. It is called
from code built in the PLT by elf_machine_runtime_setup. */ from code built in the PLT by elf_machine_runtime_setup. */
#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ #define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
.section \".text\" .section \".text\" \n\
.align 2 .align 2 \n\
.globl _dl_runtime_resolve .globl _dl_runtime_resolve \n\
.type _dl_runtime_resolve,@function .type _dl_runtime_resolve,@function \n\
_dl_runtime_resolve: _dl_runtime_resolve: \n\
# We need to save the registers used to pass parameters, and register 0, # We need to save the registers used to pass parameters, and register 0,\n\
# which is used by _mcount; the registers are saved in a stack frame. # which is used by _mcount; the registers are saved in a stack frame.\n\
stwu 1,-64(1) stwu 1,-64(1) \n\
stw 0,12(1) stw 0,12(1) \n\
stw 3,16(1) stw 3,16(1) \n\
stw 4,20(1) stw 4,20(1) \n\
# The code that calls this has put parameters for `fixup' in r12 and r11. # The code that calls this has put parameters for `fixup' in r12 and r11.\n\
mr 3,12 mr 3,12 \n\
stw 5,24(1) stw 5,24(1) \n\
mr 4,11 mr 4,11 \n\
stw 6,28(1) stw 6,28(1) \n\
mflr 0 mflr 0 \n\
# We also need to save some of the condition register fields. # We also need to save some of the condition register fields.\n\
stw 7,32(1) stw 7,32(1) \n\
stw 0,48(1) stw 0,48(1) \n\
stw 8,36(1) stw 8,36(1) \n\
mfcr 0 mfcr 0 \n\
stw 9,40(1) stw 9,40(1) \n\
stw 10,44(1) stw 10,44(1) \n\
stw 0,8(1) stw 0,8(1) \n\
bl fixup@local bl fixup@local \n\
# 'fixup' returns the address we want to branch to. # 'fixup' returns the address we want to branch to.\n\
mtctr 3 mtctr 3 \n\
# Put the registers back... # Put the registers back...\n\
lwz 0,48(1) lwz 0,48(1) \n\
lwz 10,44(1) lwz 10,44(1) \n\
lwz 9,40(1) lwz 9,40(1) \n\
mtlr 0 mtlr 0 \n\
lwz 8,36(1) lwz 8,36(1) \n\
lwz 0,8(1) lwz 0,8(1) \n\
lwz 7,32(1) lwz 7,32(1) \n\
lwz 6,28(1) lwz 6,28(1) \n\
mtcrf 0xFF,0 mtcrf 0xFF,0 \n\
lwz 5,24(1) lwz 5,24(1) \n\
lwz 4,20(1) lwz 4,20(1) \n\
lwz 3,16(1) lwz 3,16(1) \n\
lwz 0,12(1) lwz 0,12(1) \n\
# ...unwind the stack frame, and jump to the PLT entry we updated. # ...unwind the stack frame, and jump to the PLT entry we updated.\n\
addi 1,1,64 addi 1,1,64 \n\
bctr bctr \n\
.size _dl_runtime_resolve,.-_dl_runtime_resolve .size _dl_runtime_resolve,.-_dl_runtime_resolve \n\
\n\
.align 2 .align 2 \n\
.globl _dl_prof_resolve .globl _dl_prof_resolve \n\
.type _dl_prof_resolve,@function .type _dl_prof_resolve,@function \n\
_dl_prof_resolve: _dl_prof_resolve: \n\
# We need to save the registers used to pass parameters, and register 0, # We need to save the registers used to pass parameters, and register 0,\n\
# which is used by _mcount; the registers are saved in a stack frame. # which is used by _mcount; the registers are saved in a stack frame.\n\
stwu 1,-64(1) stwu 1,-64(1) \n\
stw 0,12(1) stw 0,12(1) \n\
stw 3,16(1) stw 3,16(1) \n\
stw 4,20(1) stw 4,20(1) \n\
# The code that calls this has put parameters for `fixup' in r12 and r11. # The code that calls this has put parameters for `fixup' in r12 and r11.\n\
mr 3,12 mr 3,12 \n\
stw 5,24(1) stw 5,24(1) \n\
mr 4,11 mr 4,11 \n\
stw 6,28(1) stw 6,28(1) \n\
mflr 5 mflr 5 \n\
# We also need to save some of the condition register fields. # We also need to save some of the condition register fields.\n\
stw 7,32(1) stw 7,32(1) \n\
stw 5,48(1) stw 5,48(1) \n\
stw 8,36(1) stw 8,36(1) \n\
mfcr 0 mfcr 0 \n\
stw 9,40(1) stw 9,40(1) \n\
stw 10,44(1) stw 10,44(1) \n\
stw 0,8(1) stw 0,8(1) \n\
bl profile_fixup@local bl profile_fixup@local \n\
# 'fixup' returns the address we want to branch to. # 'fixup' returns the address we want to branch to.\n\
mtctr 3 mtctr 3 \n\
# Put the registers back... # Put the registers back...\n\
lwz 0,48(1) lwz 0,48(1) \n\
lwz 10,44(1) lwz 10,44(1) \n\
lwz 9,40(1) lwz 9,40(1) \n\
mtlr 0 mtlr 0 \n\
lwz 8,36(1) lwz 8,36(1) \n\
lwz 0,8(1) lwz 0,8(1) \n\
lwz 7,32(1) lwz 7,32(1) \n\
lwz 6,28(1) lwz 6,28(1) \n\
mtcrf 0xFF,0 mtcrf 0xFF,0 \n\
lwz 5,24(1) lwz 5,24(1) \n\
lwz 4,20(1) lwz 4,20(1) \n\
lwz 3,16(1) lwz 3,16(1) \n\
lwz 0,12(1) lwz 0,12(1) \n\
# ...unwind the stack frame, and jump to the PLT entry we updated. # ...unwind the stack frame, and jump to the PLT entry we updated.\n\
addi 1,1,64 addi 1,1,64 \n\
bctr bctr \n\
.size _dl_prof_resolve,.-_dl_prof_resolve .size _dl_prof_resolve,.-_dl_prof_resolve \n\
# Undo '.section text'. # Undo '.section text'.\n\
.previous .previous \n\
"); ");
/* The actual _start code is in dl-start.S. Use a really /* The actual _start code is in dl-start.S. Use a really

View File

@@ -32,12 +32,12 @@ __lrint (double x)
weak_alias (__lrint, lrint) weak_alias (__lrint, lrint)
/* This code will also work for a 'float' argument. */ /* This code will also work for a 'float' argument. */
asm ("\ asm ("\n\
.globl __lrintf .globl __lrintf \n\
.globl lrintf .globl lrintf \n\
.weak lrintf .weak lrintf \n\
.set __lrintf,__lrint .set __lrintf,__lrint \n\
.set lrintf,__lrint .set lrintf,__lrint \n\
"); ");
#ifdef NO_LONG_DOUBLE #ifdef NO_LONG_DOUBLE

View File

@@ -22,23 +22,23 @@
/* This prints out the information in the following form: */ /* This prints out the information in the following form: */
static const char dumpform[] = "\ static const char dumpform[] = "\
Register dump: Register dump:\n\
fp0-3: 0000030%0000031% 0000032%0000033% 0000034%0000035% 0000036%0000037% fp0-3: 0000030%0000031% 0000032%0000033% 0000034%0000035% 0000036%0000037%\n\
fp4-7: 0000038%0000039% 000003a%000003b% 000003c%000003d% 000003e%000003f% fp4-7: 0000038%0000039% 000003a%000003b% 000003c%000003d% 000003e%000003f%\n\
fp8-11: 0000040%0000041% 0000042%0000043% 0000044%0000045% 0000046%0000047% fp8-11: 0000040%0000041% 0000042%0000043% 0000044%0000045% 0000046%0000047%\n\
fp12-15: 0000048%0000049% 000004a%000004b% 000004c%000004d% 000004e%000004f% fp12-15: 0000048%0000049% 000004a%000004b% 000004c%000004d% 000004e%000004f%\n\
fp16-19: 0000050%0000051% 0000052%0000053% 0000054%0000055% 0000056%0000057% fp16-19: 0000050%0000051% 0000052%0000053% 0000054%0000055% 0000056%0000057%\n\
fp20-23: 0000058%0000059% 000005a%000005b% 000005c%000005d% 000005e%000005f% fp20-23: 0000058%0000059% 000005a%000005b% 000005c%000005d% 000005e%000005f%\n\
fp24-27: 0000060%0000061% 0000062%0000063% 0000064%0000065% 0000066%0000067% fp24-27: 0000060%0000061% 0000062%0000063% 0000064%0000065% 0000066%0000067%\n\
fp28-31: 0000068%0000069% 000006a%000006b% 000006c%000006d% 000006e%000006f% fp28-31: 0000068%0000069% 000006a%000006b% 000006c%000006d% 000006e%000006f%\n\
r0 =0000000% sp =0000001% r2 =0000002% r3 =0000003% trap=0000028% r0 =0000000% sp =0000001% r2 =0000002% r3 =0000003% trap=0000028%\n\
r4 =0000004% r5 =0000005% r6 =0000006% r7 =0000007% sr0=0000020% sr1=0000021% r4 =0000004% r5 =0000005% r6 =0000006% r7 =0000007% sr0=0000020% sr1=0000021%\n\
r8 =0000008% r9 =0000009% r10=000000a% r11=000000b% dar=0000029% dsi=000002a% r8 =0000008% r9 =0000009% r10=000000a% r11=000000b% dar=0000029% dsi=000002a%\n\
r12=000000c% r13=000000d% r14=000000e% r15=000000f% r3*=0000022% r12=000000c% r13=000000d% r14=000000e% r15=000000f% r3*=0000022%\n\
r16=0000010% r17=0000011% r18=0000012% r19=0000013% r16=0000010% r17=0000011% r18=0000012% r19=0000013%\n\
r20=0000014% r21=0000015% r22=0000016% r23=0000017% lr=0000024% xer=0000025% r20=0000014% r21=0000015% r22=0000016% r23=0000017% lr=0000024% xer=0000025%\n\
r24=0000018% r25=0000019% r26=000001a% r27=000001b% mq=0000027% ctr=0000023% r24=0000018% r25=0000019% r26=000001a% r27=000001b% mq=0000027% ctr=0000023%\n\
r28=000001c% r29=000001d% r30=000001e% r31=000001f% fscr=0000071% ccr=0000026% r28=000001c% r29=000001d% r30=000001e% r31=000001f% fscr=0000071% ccr=0000026%\n\
"; ";
/* Most of the fields are self-explanatory. 'sr0' is the next /* Most of the fields are self-explanatory. 'sr0' is the next

View File

@@ -1,4 +1,4 @@
/* bcopy -- copy a block from source to destination. For IBM S390 /* bcopy -- copy a block from source to destination. S/390 version.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000, 2001 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
@@ -18,48 +18,53 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
/* /* INPUT PARAMETERS
* R2 = address of source %r2 = address of source
* R3 = address of destination %r3 = address of destination
* R4 = number of bytes to copy %r4 = number of bytes to copy. */
*/
#include "sysdep.h" #include "sysdep.h"
#include "asm-syntax.h" #include "asm-syntax.h"
.text .text
ENTRY(__bcopy) ENTRY(__bcopy)
ltr %r1,%r4 # zero bcopy ?
jz .L4
clr %r2,%r3 # check against destructive overlap clr %r2,%r3 # check against destructive overlap
jnl .L0 jnl .L0
lr %r1,%r2 alr %r1,%r2
alr %r1,%r4
clr %r1,%r3 clr %r1,%r3
jh .L2 jh .L5
.L0: .L0: ahi %r4,-1 # length - 1
lr %r5,%r4 # source length lr %r1,%r4
lr %r4,%r2 # source address srl %r1,8
sr %r1,%r1 # set pad byte to zero ltr %r1,%r1
lr %r2,%r3 # set destination jz .L2
lr %r3,%r5 # destination length = source length .L1: mvc 0(256,%r3),0(%r2) # move in 256 byte chunks
.L1: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend la %r2,256(%r2)
jo .L1 la %r3,256(%r3)
br %r14 brct %r1,.L1
.L2: # destructive overlay, can not use mvcle .L2: bras %r1,.L3 # setup base pointer for execute
mvc 0(1,%r3),0(%r2) # instruction for execute
.L3: ex %r4,0(%r1) # execute mvc with length ((%r4)&255)+1
.L4: br %r14
.L5: # destructive overlay, can not use mvcle
lr %r1,%r2 # bcopy is called with source,dest lr %r1,%r2 # bcopy is called with source,dest
lr %r2,%r3 # memmove with dest,source! Oh, well... lr %r2,%r3 # memmove with dest,source! Oh, well...
lr %r3,%r1 lr %r3,%r1
basr %r1,0 basr %r1,0
.L3: .L6:
#ifdef PIC #ifdef PIC
al %r1,.L4-.L3(%r1) # get address of global offset table al %r1,.L7-.L6(%r1) # get address of global offset table
# load address of memmove # load address of memmove
l %r1,memmove@GOT12(%r1) l %r1,memmove@GOT12(%r1)
br %r1 br %r1
.L4: .long _GLOBAL_OFFSET_TABLE_-.L3 .L7: .long _GLOBAL_OFFSET_TABLE_-.L6
#else #else
al %r1,.L4-.L3(%r1) # load address of memmove al %r1,.L7-.L6(%r1) # load address of memmove
br %r1 # jump to memmove br %r1 # jump to memmove
.L4: .long memmove-.L3 .L7: .long memmove-.L6
#endif #endif
END(__bcopy) END(__bcopy)
@@ -67,3 +72,4 @@ END(__bcopy)
#ifndef NO_WEAK_ALIAS #ifndef NO_WEAK_ALIAS
weak_alias (__bcopy, bcopy) weak_alias (__bcopy, bcopy)
#endif #endif

View File

@@ -1,4 +1,4 @@
/* Set a block of memory to some byte value. For IBM S390 /* memcpy - copy a block from source to destination. S/390 version.
Copyright (C) 2000, 2001 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
@@ -17,25 +17,30 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
/* /* INPUT PARAMETERS
* R2 = address to destination memory area %r2 = address of destination memory area
* R3 = address to source memory area %r3 = address of source memory area
* R4 = number of bytes to copy %r4 = number of bytes to copy. */
*/
#include "sysdep.h" #include "sysdep.h"
#include "asm-syntax.h" #include "asm-syntax.h"
.text .text
ENTRY(memcpy) ENTRY(memcpy)
ltr %r5,%r4 ltr %r4,%r4
jz .L3
ahi %r4,-1 # length - 1
lr %r1,%r2 # copy destination address
lr %r5,%r4
sra %r5,8
jz .L1 jz .L1
lr %r4,%r3 # %r4/%r5 = source ptr/len .L0: mvc 0(256,%r1),0(%r3) # move in 256 byte chunks
lr %r3,%r5 # %r2/%r3 = dest ptr/len la %r1,256(%r1)
lr %r0,%r2 # save source address la %r3,256(%r3)
.L0: mvcle %r2,%r4,0 # thats it, MVCLE is your friend brct %r5,.L0
jo .L0 .L1: bras %r5,.L2 # setup base pointer for execute
lr %r2,%r0 # return value is source address mvc 0(1,%r1),0(%r3) # instruction for execute
.L1: .L2: ex %r4,0(%r5) # execute mvc with length ((%r4)&255)+1
br %r14 .L3: br %r14
END(memset) END(memcpy)

View File

@@ -1,6 +1,6 @@
/* bcopy -- copy a block from source to destination. 64 bit S/390 version. /* bcopy -- copy a block from source to destination. 64 bit S/390 version.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2001 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
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
@@ -26,27 +26,32 @@
#include "sysdep.h" #include "sysdep.h"
#include "asm-syntax.h" #include "asm-syntax.h"
.text .text
ENTRY(__bcopy) ENTRY(__bcopy)
clgr %r2,%r3 # check against destructive overlap ltgr %r1,%r4 # zero bcopy ?
jnl .L0 jz .L4
lgr %r1,%r2 clgr %r2,%r3 # check against destructive overlap
algr %r1,%r4 jnl .L0
clgr %r1,%r3 algr %r1,%r2
jh .L2 clgr %r1,%r3
.L0: jh .L5
lgr %r5,%r4 # source length .L0: aghi %r4,-1 # length - 1
lgr %r4,%r2 # source address srlg %r1,%r4,8
sgr %r1,%r1 # set pad byte to zero ltgr %r1,%r1
lgr %r2,%r3 # set destination jz .L2
lgr %r3,%r5 # destination length = source length .L1: mvc 0(256,%r3),0(%r2) # move in 256 byte chunks
.L1: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend la %r2,256(%r2)
jo .L1 la %r3,256(%r3)
br %r14 brctg %r1,.L1
.L2: # destructive overlay, can not use mvcle .L2: bras %r1,.L3 # setup base pointer for execute
lgr %r1,%r2 # bcopy is called with source,dest mvc 0(1,%r3),0(%r2) # instruction for execute
lgr %r2,%r3 # memmove with dest,source! Oh, well... .L3: ex %r4,0(%r1) # execute mvc with length ((%r4)&255)+1
lgr %r3,%r1 .L4: br %r14
.L5: # destructive overlay, can not use mvcle
lgr %r1,%r2 # bcopy is called with source,dest
lgr %r2,%r3 # memmove with dest,source! Oh, well...
lgr %r3,%r1
#ifdef PIC #ifdef PIC
jg memmove@PLT jg memmove@PLT
#else #else

View File

@@ -68,8 +68,8 @@ _init:
AGHI 15,-160 AGHI 15,-160
STG 1,0(15) STG 1,0(15)
LARL 12,_GLOBAL_OFFSET_TABLE_ LARL 12,_GLOBAL_OFFSET_TABLE_
LGHI 1,__gmon_start__@GOT LARL 1,__gmon_start__@GOTENT
LG 1,0(1,12) LG 1,0(1)
LTGR 1,1 LTGR 1,1
JE .L22 JE .L22
BASR 14,1 BASR 14,1

View File

@@ -1,7 +1,6 @@
/* Set a block of memory to some byte value. 64 bit S/390 version. /* memcpy - copy a block from source to destination. 64 bit S/390 version.
Copyright (C) 2001 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
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
modify it under the terms of the GNU Library General Public License as modify it under the terms of the GNU Library General Public License as
@@ -19,8 +18,8 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
/* INPUT PARAMETERS /* INPUT PARAMETERS
%r2 = address to destination memory area %r2 = address of destination memory area
%r3 = address to source memory area %r3 = address of source memory area
%r4 = number of bytes to copy. */ %r4 = number of bytes to copy. */
#include "sysdep.h" #include "sysdep.h"
@@ -28,14 +27,19 @@
.text .text
ENTRY(memcpy) ENTRY(memcpy)
ltgr %r5,%r4 ltgr %r4,%r4
jz .L3
aghi %r4,-1 # length - 1
lgr %r1,%r2 # copy destination address
srag %r5,%r4,8
jz .L1 jz .L1
lgr %r4,%r3 # %r4/%r5 = source ptr/len .L0: mvc 0(256,%r1),0(%r3) # move in 256 byte chunks
lgr %r3,%r5 # %r2/%r3 = dest ptr/len la %r1,256(%r1)
lgr %r0,%r2 # save source address la %r3,256(%r3)
.L0: mvcle %r2,%r4,0 # thats it, MVCLE is your friend brctg %r5,.L0
jo .L0 .L1: bras %r5,.L2 # setup base pointer for execute
lgr %r2,%r0 # return value is source address mvc 0(1,%r1),0(%r3) # instruction for execute
.L1: .L2: ex %r4,0(%r5) # execute mvc with length ((%r4)&255)+1
br %r14 .L3: br %r14
END(memset) END(memcpy)