1 /* Macros for copying by pages; used in memcpy, memmove. Generic macros.
2 Copyright (C) 1995 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If
17 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
18 Cambridge, MA 02139, USA. */
20 /* This file defines the macro:
22 PAGE_COPY_FWD_MAYBE (dstp, srcp, nbytes_left, nbytes)
24 which is invoked like WORD_COPY_FWD et al. The pointers should be at
25 least word aligned. This will check if virtual copying by pages can and
26 should be done and do it if so.
28 System-specific pagecopy.h files should define these macros and then
32 -- Minimum size for which virtual copying by pages is worthwhile.
37 PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes)
38 -- Macro to perform the virtual copy operation.
39 The pointers will be aligned to PAGE_SIZE bytes.
43 #if PAGE_COPY_THRESHOLD
47 #define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) \
50 if ((nbytes) >= PAGE_COPY_THRESHOLD && \
51 PAGE_OFFSET ((dstp) - (srcp)) == 0) \
53 /* The amount to copy is past the threshold for copying \
54 pages virtually with kernel VM operations, and the \
55 source and destination addresses have the same alignment. */ \
56 size_t nbytes_before = PAGE_OFFSET (-(dstp)); \
57 if (nbytes_before != 0) \
59 /* First copy the words before the first page boundary. */ \
60 WORD_COPY_FWD (dstp, srcp, nbytes_left, nbytes_before); \
61 assert (nbytes_left == 0); \
62 nbytes -= nbytes_before; \
64 PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes); \
68 /* The page size is always a power of two, so we can avoid modulo division. */
69 #define PAGE_OFFSET(n) ((n) & (PAGE_SIZE - 1))
73 #define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) /* nada */