64e4e2c4d36499582c9b8eb039db65b3a3627e3c
[platform/upstream/glibc.git] / sysdeps / unix / sysv / linux / powerpc / dl-sysdep.c
1 /* Operating system support for run-time dynamic linker.  Linux/PPC version.
2    Copyright (C) 1997, 1998, 2001, 2003 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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20
21 #include "config.h"
22 #include "kernel-features.h"
23 #include <ldsodefs.h>
24
25 extern int __cache_line_size;
26 weak_extern (__cache_line_size)
27
28 /* Scan the Aux Vector for the "Data Cache Block Size" entry.  If found
29    verify that the static extern __cache_line_size is defined by checking
30    for not NULL.  If it is defined then assign the cache block size
31    value to __cache_line_size.  */
32 #define DL_PLATFORM_AUXV                                                      \
33       case AT_DCACHEBSIZE:                                                    \
34         {                                                                     \
35           int *cls = & __cache_line_size;                                     \
36           if (cls != NULL)                                                    \
37             *cls = av->a_un.a_val;                                            \
38         }                                                                     \
39       break;
40
41 #ifndef __ASSUME_STD_AUXV
42
43 /* The PowerPC's auxiliary argument block gets aligned to a 16-byte
44    boundary.  This is history and impossible to change compatibly.  */
45
46 #define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \
47   do {                                                                        \
48     char **_tmp;                                                              \
49     size_t _test;                                                             \
50     (argc) = *(long int *) cookie;                                            \
51     (argv) = (char **) cookie + 1;                                            \
52     (envp) = (argv) + (argc) + 1;                                             \
53     for (_tmp = (envp); *_tmp; ++_tmp)                                        \
54       continue;                                                               \
55     /* The following '++' is important!  */                                   \
56     ++_tmp;                                                                   \
57                                                                               \
58     _test = (size_t)_tmp;                                                     \
59     _test = (_test + 0xf) & ~0xf;                                             \
60     /* Under some circumstances, MkLinux (up to at least DR3a5)               \
61        omits the padding.  To work around this, we make a                     \
62        basic sanity check of the argument vector.  Of                         \
63        course, this means that in future, the argument                        \
64        vector will have to be laid out to allow for this                      \
65        test :-(.  */                                                          \
66      if (((ElfW(auxv_t) *)_test)->a_type <= 0x10)                             \
67        _tmp = (char **)_test;                                                 \
68     (auxp) = (ElfW(auxv_t) *) _tmp;                                           \
69   } while (0)
70 #endif
71
72 #include_next <sysdeps/unix/sysv/linux/dl-sysdep.c>