getpagesize(3): drop support for non-ELF kernels

AT_PAGESZ was introduced with ELF support in 1996 (commit
e1743d02cd) so we can safely count on
being able to use it to get our page size via elf_aux_info().  As such
we don't need a fallback sysctl query.

Save a few bytes of bss by dropping caching as elf_aux_info() runs
in constant time for a given query.

Reviewed by:	kevans, imp, emaste
Sponsored by:	DARPA
Differential Revision:	https://reviews.freebsd.org/D42708
This commit is contained in:
Brooks Davis 2023-11-27 17:06:25 +00:00
parent df65c89375
commit ea180bb379

View file

@ -30,18 +30,11 @@
*/
#include <sys/param.h>
#include <sys/sysctl.h>
#include <errno.h>
#include <link.h>
#include <unistd.h>
#include <sys/auxv.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.
*
* NB: This function may be called from malloc(3) at initialization
* NB: so must not result in a malloc(3) related call!
*/
@ -49,23 +42,10 @@
int
getpagesize(void)
{
int mib[2];
static int value;
size_t size;
int error;
int value;
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, nitems(mib), &value, &size, NULL, 0) == -1)
return (PAGE_SIZE);
if (_elf_aux_info(AT_PAGESZ, &value, sizeof(value)) != 0)
value = PAGE_SIZE;
return (value);
}