Skip to content

Commit

Permalink
Fix SHMLBA on sparc.
Browse files Browse the repository at this point in the history
	[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.
  • Loading branch information
David S. Miller committed Mar 17, 2012
1 parent edc2180 commit 374976d
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 17 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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>
Expand Down
12 changes: 6 additions & 6 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand Down
22 changes: 13 additions & 9 deletions sysdeps/unix/sysv/linux/shmat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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__
Expand All @@ -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;

return BOUNDED_N (result, length);
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 (raddr, length);
}
4 changes: 4 additions & 0 deletions sysdeps/unix/sysv/linux/sparc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions sysdeps/unix/sysv/linux/sparc/bits/shm.h
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
40 changes: 40 additions & 0 deletions sysdeps/unix/sysv/linux/sparc/getshmlba.c
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 374976d

Please sign in to comment.