|
From: Matt B. <Mat...@al...> - 2015-06-16 01:32:40
|
The blame lies with me as I never checked what page sizes Valgrind
actually supports. Looking at configure.ac it only supports 4kB, 16kB
and 64kB page sizes. Therefore when I used '--with-pagesize=8' during
compilation it was defaulting to 4kB...
I have manually patched configure.ac to accept 8kB and set VKI_PAGE_SIZE
correctly (via VKI_PAGE_SHIFT and MIPS_PAGE_SHIFT).
I then modified the VKI_PAGE_SIZE and VKI_MAX_PAGE_SIZE assert
statements in coregrind/m_main.c to include 8kB.
Valgrind now appears to run correctly (I can enter 'valgrind -h').
However, if I try to run a program under Valgrind I get another
(unrelated) issue that I will address via a separate thread.
Thanks for your help.
On Mon, 2015-06-15 at 07:01 -0700, John Reiser wrote:
> On 06/14/2015 10:22 PM, Matt Bennett wrote:
> > On Sun, 2015-06-14 at 22:01 -0700, John Reiser wrote:
> >>> mmap(0x802001000, 4194304, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, 0, 0) = -1 EINVAL (Invalid argument)
> >>
> >> What is SHMLBA for this configuration? [grep -sr SHMLBA /usr/include]
> >
>
> > /usr/include/valgrind/vki/vki-mips32-linux.h:#define VKI_SHMLBA 0x40000
> > /usr/include/valgrind/vki/vki-mips64-linux.h:#define VKI_SHMLBA 0x40000
>
> [Note that 0x40000 is 256KiB, which is rather large and likely to cause
> noticeable fragmentation of address space.]
>
> Notice that all those files are from /usr/include/valgrind/vki/.
> Your compilation environment apparently lacked the definitions
> that correspond to the target hardware [these for x86_64]:
> -----
> /usr/include/bits/shm.h:#define SHM_RND 020000 /* round attach address to SHMLBA */
> /usr/include/bits/shm.h:#define SHMLBA (__getpagesize ())
> /usr/include/linux/shm.h:#define SHM_RND 020000 /* round attach address to SHMLBA boundary */
> /usr/include/asm-generic/shmparam.h:#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */
> -----
>
> >
> >> And on the same topic, what is the page size? [grep -sr PAGE_SIZE /usr/include]
> >
> > /usr/include/valgrind/pub_tool_libcbase.h:#define VG_IS_PAGE_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)(VKI_PAGE_SIZE-1))))
> > /usr/include/valgrind/pub_tool_libcbase.h:#define VG_PGROUNDDN(p) VG_ROUNDDN(p, VKI_PAGE_SIZE)
> > /usr/include/valgrind/pub_tool_libcbase.h:#define VG_PGROUNDUP(p) VG_ROUNDUP(p, VKI_PAGE_SIZE)
>
> > /usr/include/valgrind/vki/vki-mips32-linux.h:#define VKI_PAGE_SIZE (1UL << VKI_PAGE_SHIFT)
> > /usr/include/valgrind/vki/vki-mips32-linux.h:#define VKI_PAGE_MASK (~(VKI_PAGE_SIZE-1))
> > /usr/include/valgrind/vki/vki-mips32-linux.h:#define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE
> > /usr/include/valgrind/vki/vki-mips64-linux.h:#define VKI_PAGE_SIZE (1UL << VKI_PAGE_SHIFT)
> > /usr/include/valgrind/vki/vki-mips64-linux.h:#define VKI_PAGE_MASK (~(VKI_PAGE_SIZE-1))
> > /usr/include/valgrind/vki/vki-mips64-linux.h:#define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE
>
> Well, what is VKI_PAGE_SHIFT; and does one of {vki-mips32-linux.h, vki-mips64-linux.h}
> actually apply to the target machine?
>
> >
> >> Every successful mmap() return value happens to be a multiple of 0x2000 (8KiB);
> >> there are no odd multiples of 0x1000 (4KiB).
> >> [Some ARM machines have an SHMLBA of 0x4000 (16KiB) even though the page size is 0x1000 (4KiB).]
> >
> > This is on a MIPS chip, specifically Cavium (cnMIPS). The kernel page size is configured to 8kB and since I didn't configure the page size when
> > cross compiling valgrind it looks like it took the page size of my local machine (4kB). Looking at the upstream source code it appears that
> > 8kB page size isn't currently supported however there are some patches here that may make it work. https://bugs.kde.org/show_bug.cgi?id=342356
> >
> > Either way if this is indeed the issue here perhaps this is something that should be fixed upstream (supporting 8k and 32k pages)?
>
> Some of the blame belongs to you and the marketing/sales/support team
> that sold you the chips. Sometimes inexpensive hardware is *TOO* cheap!
> In this case it looks like Cavium (cnMIPS) is an architectural variant
> that does not have all the properties previously promised by MIPS.
>
> Also, successful cross-compiling requires setting the declarations
> and #includes correctly. Nothing in the valgrind source can prevent
> operator error in this department.
>
> Therefore: arrange for the proper definitions of VKI_PAGE_SHIFT and VKI_SHMLBA,
> and tell us the numerical values. (Write a test program which prints them!)
> If valgrind attempts MAP_FIXED at an address such as 0x802001000 which is not
> a multiple of the hardware page size (apparently 8KiB) then that is a clue
> that the compilation environment is not correct. If necessary, edit the
> definitions by hand _after_ performing "automatic configuration" and
> _before_ compiling.
>
> Look carefully at ARM:
> /usr/include/valgrind/vki/vki-arm-linux.h:#define VKI_SHMLBA (4 * VKI_PAGE_SIZE)
> which does work, and contrast with your case.
>
|