1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

Fix SHMLBA on sparc.

[BZ #6471]
	* sysdeps/unix/sysv/linux/shmat.c (shmat): Test for syscall errors
	properly.
	* sysdeps/unix/sysv/linux/sparc/getshmlba.c: New file.
	* sysdeps/unix/sysv/linux/sparc/Makefile: Add getshmlba to
	sysdep_routines when subdir is sysvipc.
	* sysdeps/unix/sysv/linux/sparc/bits/shm.h (SHMLBA): Use new
	__getshmlba helper.
This commit is contained in:
David S. Miller
2012-03-16 19:28:51 -07:00
parent edc218041e
commit 374976dd13
6 changed files with 73 additions and 16 deletions

View File

@ -7,3 +7,7 @@ syscall-list-64bit-condition := __WORDSIZE == 64
ifeq ($(subdir),rt)
librt-routines += rt-sysdep
endif
ifeq ($(subdir),sysvipc)
sysdep_routines += getshmlba
endif

View File

@ -40,8 +40,8 @@
__BEGIN_DECLS
/* Segment low boundary address multiple. */
#define SHMLBA (__getpagesize ())
extern int __getpagesize (void) __THROW __attribute__ ((__const__));
#define SHMLBA (__getshmlba ())
extern int __getshmlba (void) __attribute__ ((__const__));
/* Type to count number of attaches. */

View File

@ -0,0 +1,40 @@
/* Copyright (C) 2012
Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <unistd.h>
#include <sys/shm.h>
#include <ldsodefs.h>
int
__getshmlba (void)
{
uint64_t hwcap = GLRO(dl_hwcap);
int pgsz = GLRO(dl_pagesize);
if (hwcap & HWCAP_SPARC_V9)
{
if (pgsz < (16 * 1024))
return 16 * 1024;
else
return pgsz;
}
else if (!(hwcap & HWCAP_SPARC_FLUSH))
return 64 * 1024;
else
return 256 * 1024;
}