diff options
author | Siddhesh Poyarekar <siddhesh@redhat.com> | 2014-07-03 01:28:45 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@redhat.com> | 2014-07-03 01:49:43 +0530 |
commit | 99f8dc922033821edcc13f9f8360e9fda40dfcff (patch) | |
tree | 50c567b703247e62945dbe084c754c149f38ba9e /sysdeps/generic/memcopy.h | |
parent | bc8ea38590070604006399e42469087e943fc8ec (diff) | |
download | glibc-99f8dc922033821edcc13f9f8360e9fda40dfcff.tar.gz glibc-99f8dc922033821edcc13f9f8360e9fda40dfcff.tar.xz glibc-99f8dc922033821edcc13f9f8360e9fda40dfcff.zip |
Fix -Wundef warning on PAGE_COPY_THRESHOLD
The PAGE_COPY_THRESHOLD macro is meant to be overridden by architecture-specific pagecopy.h, but it is currently done only by mach; all other architectures use the default. Check to see if the macro is defined in addition to whether it is set to a non-zero value.
Diffstat (limited to 'sysdeps/generic/memcopy.h')
-rw-r--r-- | sysdeps/generic/memcopy.h | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/sysdeps/generic/memcopy.h b/sysdeps/generic/memcopy.h index b39a9608b8..45c5fcb479 100644 --- a/sysdeps/generic/memcopy.h +++ b/sysdeps/generic/memcopy.h @@ -40,6 +40,7 @@ #include <sys/cdefs.h> #include <endian.h> +#include <pagecopy.h> /* The macros defined in this file are: @@ -144,6 +145,47 @@ extern void _wordcopy_bwd_dest_aligned (long int, long int, size_t) __THROW; (nbytes_left) = (nbytes) % OPSIZ; \ } while (0) +/* The macro PAGE_COPY_FWD_MAYBE (dstp, srcp, nbytes_left, nbytes) is invoked + like WORD_COPY_FWD et al. The pointers should be at least word aligned. + This will check if virtual copying by pages can and should be done and do it + if so. The pointers will be aligned to PAGE_SIZE bytes. The macro requires + that pagecopy.h defines at least PAGE_COPY_THRESHOLD to 0. If + PAGE_COPY_THRESHOLD is non-zero, the header must also define PAGE_COPY_FWD + and PAGE_SIZE. +*/ +#if PAGE_COPY_THRESHOLD + +# include <assert.h> + +# define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) \ + do \ + { \ + if ((nbytes) >= PAGE_COPY_THRESHOLD && \ + PAGE_OFFSET ((dstp) - (srcp)) == 0) \ + { \ + /* The amount to copy is past the threshold for copying \ + pages virtually with kernel VM operations, and the \ + source and destination addresses have the same alignment. */ \ + size_t nbytes_before = PAGE_OFFSET (-(dstp)); \ + if (nbytes_before != 0) \ + { \ + /* First copy the words before the first page boundary. */ \ + WORD_COPY_FWD (dstp, srcp, nbytes_left, nbytes_before); \ + assert (nbytes_left == 0); \ + nbytes -= nbytes_before; \ + } \ + PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes); \ + } \ + } while (0) + +/* The page size is always a power of two, so we can avoid modulo division. */ +# define PAGE_OFFSET(n) ((n) & (PAGE_SIZE - 1)) + +#else + +# define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) /* nada */ + +#endif /* Threshold value for when to enter the unrolled loops. */ #define OP_T_THRES 16 |