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

@ -1,5 +1,14 @@
2012-03-16 David S. Miller <davem@davemloft.net>
[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.
* sysdeps/sparc/fpu/libm-test/ulps: Update.
2012-03-16 H.J. Lu <hongjiu.lu@intel.com>

12
NEWS
View file

@ -11,12 +11,12 @@ Version 2.16
174, 350, 411, 2541, 2547, 2548, 2551, 2552, 2553, 2554, 2562, 2563, 2565,
2566, 2576, 3335, 3976, 3992, 4026, 4108, 4596, 4822, 5077, 5461, 5805,
5993, 6884, 6907, 6911, 9739, 9902, 10110, 10135, 10140, 10210, 10545,
10716, 11174, 11322, 11365, 11494, 12047, 13058, 13525, 13526, 13527,
13528, 13529, 13530, 13531, 13532, 13533, 13547, 13551, 13552, 13553,
13555, 13559, 13566, 13583, 13618, 13637, 13656, 13658, 13673, 13695,
13704, 13706, 13726, 13738, 13786, 13792, 13806, 13840, 13841, 13844,
13846, 13851, 13852, 13854
5993, 6471, 6884, 6907, 6911, 9739, 9902, 10110, 10135, 10140, 10210,
10545, 10716, 11174, 11322, 11365, 11494, 12047, 13058, 13525, 13526,
13527, 13528, 13529, 13530, 13531, 13532, 13533, 13547, 13551, 13552,
13553, 13555, 13559, 13566, 13583, 13618, 13637, 13656, 13658, 13673,
13695, 13704, 13706, 13726, 13738, 13786, 13792, 13806, 13840, 13841,
13844, 13846, 13851, 13852, 13854
* ISO C11 support:

View file

@ -35,7 +35,8 @@ shmat (shmid, shmaddr, shmflg)
const void *shmaddr;
int shmflg;
{
void *__unbounded result;
INTERNAL_SYSCALL_DECL(err);
unsigned long resultvar;
void *__unbounded raddr;
#if __BOUNDED_POINTERS__
@ -47,12 +48,15 @@ shmat (shmid, shmaddr, shmflg)
length = shmds.shm_segsz;
#endif
result = (void *__unbounded) INLINE_SYSCALL (ipc, 5, IPCOP_shmat,
shmid, shmflg,
(long int) __ptrvalue (&raddr),
__ptrvalue ((void *) shmaddr));
if ((unsigned long) result <= -(unsigned long) SHMLBA)
result = raddr;
resultvar = INTERNAL_SYSCALL (ipc, err, 5, IPCOP_shmat,
shmid, shmflg,
(long int) __ptrvalue (&raddr),
__ptrvalue ((void *) shmaddr));
if (INTERNAL_SYSCALL_ERROR_P (resultvar, err))
{
__set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, err));
return (void *) -1;
}
return BOUNDED_N (result, length);
return BOUNDED_N (raddr, length);
}

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;
}