~linaro-toolchain-dev/cortex-strings/trunk

« back to all changes in this revision

Viewing changes to reference/glibc-c/pagecopy.h

  • Committer: Michael Hope
  • Date: 2012-06-12 03:19:48 UTC
  • Revision ID: michael.hope@linaro.org-20120612031948-4ii8jicywtzjprak
Added the C only routines from GLIBC 2.16+20120607~git24a6dbe

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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.
 
4
 
 
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.
 
9
 
 
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.
 
14
 
 
15
   You should have received a copy of the GNU Lesser General Public
 
16
   License along with the GNU C Library; if not, see
 
17
   <http://www.gnu.org/licenses/>.  */
 
18
 
 
19
/* This file defines the macro:
 
20
 
 
21
   PAGE_COPY_FWD_MAYBE (dstp, srcp, nbytes_left, nbytes)
 
22
 
 
23
   which is invoked like WORD_COPY_FWD et al.  The pointers should be at
 
24
   least word aligned.  This will check if virtual copying by pages can and
 
25
   should be done and do it if so.
 
26
 
 
27
   System-specific pagecopy.h files should define these macros and then
 
28
   #include this file:
 
29
 
 
30
   PAGE_COPY_THRESHOLD
 
31
   -- Minimum size for which virtual copying by pages is worthwhile.
 
32
 
 
33
   PAGE_SIZE
 
34
   -- Size of a page.
 
35
 
 
36
   PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes)
 
37
   -- Macro to perform the virtual copy operation.
 
38
   The pointers will be aligned to PAGE_SIZE bytes.
 
39
*/
 
40
 
 
41
 
 
42
#if PAGE_COPY_THRESHOLD
 
43
 
 
44
#include <assert.h>
 
45
 
 
46
#define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes)                  \
 
47
  do                                                                          \
 
48
    {                                                                         \
 
49
      if ((nbytes) >= PAGE_COPY_THRESHOLD &&                                  \
 
50
          PAGE_OFFSET ((dstp) - (srcp)) == 0)                                 \
 
51
        {                                                                     \
 
52
          /* The amount to copy is past the threshold for copying             \
 
53
             pages virtually with kernel VM operations, and the               \
 
54
             source and destination addresses have the same alignment.  */    \
 
55
          size_t nbytes_before = PAGE_OFFSET (-(dstp));                       \
 
56
          if (nbytes_before != 0)                                             \
 
57
            {                                                                 \
 
58
              /* First copy the words before the first page boundary.  */     \
 
59
              WORD_COPY_FWD (dstp, srcp, nbytes_left, nbytes_before);         \
 
60
              assert (nbytes_left == 0);                                      \
 
61
              nbytes -= nbytes_before;                                        \
 
62
            }                                                                 \
 
63
          PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes);                    \
 
64
        }                                                                     \
 
65
    } while (0)
 
66
 
 
67
/* The page size is always a power of two, so we can avoid modulo division.  */
 
68
#define PAGE_OFFSET(n)  ((n) & (PAGE_SIZE - 1))
 
69
 
 
70
#else
 
71
 
 
72
#define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) /* nada */
 
73
 
 
74
#endif