From: Petar Jovanovic Date: Fri, 26 Feb 2016 15:30:53 +0000 (+0000) Subject: mips: determine page size at runtime X-Git-Tag: svn/VALGRIND_3_12_0~210 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d7a9a37a07a50e59e609a050d52bca769dfdd642;p=thirdparty%2Fvalgrind.git 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 --- diff --git a/configure.ac b/configure.ac index 87fcf35b6a..ea08341aac 100644 --- a/configure.ac +++ b/configure.ac @@ -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 #---------------------------------------------------------------------------- diff --git a/coregrind/m_main.c b/coregrind/m_main.c index 36489c3721..fd05185c88 100644 --- a/coregrind/m_main.c +++ b/coregrind/m_main.c @@ -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) ; diff --git a/coregrind/m_vki.c b/coregrind/m_vki.c index 11b115c724..f1efa20e96 100644 --- a/coregrind/m_vki.c +++ b/coregrind/m_vki.c @@ -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 diff --git a/include/vki/vki-mips32-linux.h b/include/vki/vki-mips32-linux.h index 5f8857f781..d3eec1742d 100644 --- a/include/vki/vki-mips32-linux.h +++ b/include/vki/vki-mips32-linux.h @@ -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 diff --git a/include/vki/vki-mips64-linux.h b/include/vki/vki-mips64-linux.h index 03b1836c20..397509bcef 100644 --- a/include/vki/vki-mips64-linux.h +++ b/include/vki/vki-mips64-linux.h @@ -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