[BZ #2172]
[glibc.git] / sysdeps / generic / pagecopy.h
blob5a0ada1fae23d02221afac57a47bc6e29f68c872
1 /* Macros for copying by pages; used in memcpy, memmove. Generic macros.
2 Copyright (C) 1995, 1997 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 Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the 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 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 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
29 #include this file:
31 PAGE_COPY_THRESHOLD
32 -- Minimum size for which virtual copying by pages is worthwhile.
34 PAGE_SIZE
35 -- Size of a page.
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
45 #include <assert.h>
47 #define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) \
48 do \
49 { \
50 if ((nbytes) >= PAGE_COPY_THRESHOLD && \
51 PAGE_OFFSET ((dstp) - (srcp)) == 0) \
52 { \
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) \
58 { \
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; \
63 } \
64 PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes); \
65 } \
66 } while (0)
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))
71 #else
73 #define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) /* nada */
75 #endif