summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/getpagesize.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/gen/getpagesize.c')
-rw-r--r--lib/libc/gen/getpagesize.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/lib/libc/gen/getpagesize.c b/lib/libc/gen/getpagesize.c
index d796b9d..f4b8128 100644
--- a/lib/libc/gen/getpagesize.c
+++ b/lib/libc/gen/getpagesize.c
@@ -36,8 +36,12 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/sysctl.h>
+#include <errno.h>
+#include <link.h>
#include <unistd.h>
+#include "libc_private.h"
+
/*
* This is unlikely to change over the running time of any
* program, so we cache the result to save some syscalls.
@@ -52,13 +56,20 @@ getpagesize()
int mib[2];
static int value;
size_t size;
+ int error;
+
+ if (value != 0)
+ return (value);
+
+ error = _elf_aux_info(AT_PAGESZ, &value, sizeof(value));
+ if (error == 0 && value != 0)
+ return (value);
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_PAGESIZE;
+ size = sizeof value;
+ if (sysctl(mib, 2, &value, &size, NULL, 0) == -1)
+ return (-1);
- if (!value) {
- mib[0] = CTL_HW;
- mib[1] = HW_PAGESIZE;
- size = sizeof value;
- if (sysctl(mib, 2, &value, &size, NULL, 0) == -1)
- return (-1);
- }
return (value);
}
OpenPOWER on IntegriCloud