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.
> 

------------------------------------------------------------------------------
_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to