mips: determine page size at runtime

Instead of passing an option to the configure script, use runtime detection
of the page size. Remove the "--with-pagesize" parameter from the configure
script.
Also accept 8k and 32k as valid page sizes.

Patch by Maran Pakkirisamy

It fixes BZ#342356.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15813
This commit is contained in:
Petar Jovanovic 2016-02-26 15:30:53 +00:00
parent 8a8b65d1f2
commit d7a9a37a07
5 changed files with 26 additions and 48 deletions

View File

@ -930,32 +930,6 @@ AC_CACHE_CHECK([for using the undefined behaviour sanitiser], vg_cv_ubsan,
[vg_cv_ubsan=$enableval],
[vg_cv_ubsan=no])])
#----------------------------------------------------------------------------
# Define MIPS_PAGE_SHIFT (--with-pagesize)
#----------------------------------------------------------------------------
AC_ARG_WITH(pagesize,
[ --with-pagesize= override detected page size (4, 16 or 64)],
[psize=$withval],
[psize=0]
)
if test "$psize" = "0"; then
psizer=`getconf PAGESIZE`
psize=$((${psizer}/1024))
fi
if test "$psize" = "4"; then
AC_DEFINE([MIPS_PAGE_SHIFT], 12, [configured page size 4k])
elif test "$psize" = "16"; then
AC_DEFINE([MIPS_PAGE_SHIFT], 14, [configured page size 16k])
elif test "$psize" = "64"; then
AC_DEFINE([MIPS_PAGE_SHIFT], 16, [configured page size 64k])
else
AC_DEFINE([MIPS_PAGE_SHIFT], 12, [configured default page size 4k])
fi
AC_MSG_RESULT([checking for Pagesize... ${psize}k])
#----------------------------------------------------------------------------
# Extra fine-tuning of installation directories
#----------------------------------------------------------------------------

View File

@ -1743,10 +1743,12 @@ Int valgrind_main ( Int argc, HChar **argv, HChar **envp )
// p: logging, plausible-stack
//--------------------------------------------------------------
VG_(debugLog)(1, "main", "Starting the address space manager\n");
vg_assert(VKI_PAGE_SIZE == 4096 || VKI_PAGE_SIZE == 65536
|| VKI_PAGE_SIZE == 16384);
vg_assert(VKI_MAX_PAGE_SIZE == 4096 || VKI_MAX_PAGE_SIZE == 65536
|| VKI_MAX_PAGE_SIZE == 16384);
vg_assert(VKI_PAGE_SIZE == 4096 || VKI_PAGE_SIZE == 8192
|| VKI_PAGE_SIZE == 16384 || VKI_PAGE_SIZE == 32768
|| VKI_PAGE_SIZE == 65536);
vg_assert(VKI_MAX_PAGE_SIZE == 4096 || VKI_MAX_PAGE_SIZE == 8192
|| VKI_MAX_PAGE_SIZE == 16384 || VKI_MAX_PAGE_SIZE == 32768
|| VKI_MAX_PAGE_SIZE == 65536);
vg_assert(VKI_PAGE_SIZE <= VKI_MAX_PAGE_SIZE);
vg_assert(VKI_PAGE_SIZE == (1 << VKI_PAGE_SHIFT));
vg_assert(VKI_MAX_PAGE_SIZE == (1 << VKI_MAX_PAGE_SHIFT));
@ -3324,11 +3326,12 @@ void _start_in_C_linux ( UWord* pArgc )
the_iicii.sp_at_startup = (Addr)pArgc;
# if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \
|| defined(VGP_ppc64le_linux) || defined(VGP_arm64_linux)
|| defined(VGP_ppc64le_linux) || defined(VGP_arm64_linux) \
|| defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
{
/* ppc32/ppc64 can be configured with different page sizes.
Determine this early. This is an ugly hack and really should
be moved into valgrind_main. */
/* ppc32/ppc64, arm64, mips32/64 can be configured with different
page sizes. Determine this early. This is an ugly hack and really
should be moved into valgrind_main. */
UWord *sp = &pArgc[1+argc+1];
while (*sp++ != 0)
;

View File

@ -39,11 +39,12 @@
describing the kernel interface, so this file is nearly empty. */
/* ppc32/64-linux determines page size at startup, hence m_vki is
the logical place to store that info. */
/* ppc32/64, arm64 and mips32/64 (linux) determine page size at startup,
hence m_vki is the logical place to store that info. */
#if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \
|| defined(VGP_ppc64le_linux) || defined(VGP_arm64_linux)
|| defined(VGP_ppc64le_linux) || defined(VGP_arm64_linux) \
|| defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
unsigned long VKI_PAGE_SHIFT = 12;
unsigned long VKI_PAGE_SIZE = 1UL << 12;
#endif

View File

@ -71,12 +71,12 @@ typedef unsigned long long __vki_u64;
// From linux-2.6.35.5/include/asm-mips/page.h
//----------------------------------------------------------------------
/* PAGE_SHIFT determines the page size */
#define VKI_PAGE_SHIFT MIPS_PAGE_SHIFT
#define VKI_PAGE_SIZE (1UL << VKI_PAGE_SHIFT)
/* MIPS32 uses runtime pagesize detection */
extern UWord VKI_PAGE_SHIFT;
extern UWord VKI_PAGE_SIZE;
#define VKI_PAGE_MASK (~(VKI_PAGE_SIZE-1))
#define VKI_MAX_PAGE_SHIFT VKI_PAGE_SHIFT
#define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE
#define VKI_MAX_PAGE_SHIFT 16
#define VKI_MAX_PAGE_SIZE (1UL << VKI_MAX_PAGE_SHIFT)
//----------------------------------------------------------------------
// From linux-2.6.35.9/arch/mips/include/bits/shm.h

View File

@ -80,12 +80,12 @@ typedef unsigned long long __vki_u64;
// From linux-2.6.35.9/include/asm-mips/page.h
//----------------------------------------------------------------------
/* PAGE_SHIFT determines the page size */
#define VKI_PAGE_SHIFT MIPS_PAGE_SHIFT
#define VKI_PAGE_SIZE (1UL << VKI_PAGE_SHIFT)
#define VKI_PAGE_MASK (~(VKI_PAGE_SIZE-1))
#define VKI_MAX_PAGE_SHIFT VKI_PAGE_SHIFT
#define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE
/* MIPS64 uses runtime pagesize detection */
extern UWord VKI_PAGE_SHIFT;
extern UWord VKI_PAGE_SIZE;
#define VKI_PAGE_MASK (~(VKI_PAGE_SIZE-1))
#define VKI_MAX_PAGE_SHIFT 16
#define VKI_MAX_PAGE_SIZE (1UL << VKI_MAX_PAGE_SHIFT)
//----------------------------------------------------------------------
// From linux-2.6.35.9/arch/mips/include/bits/shm.h