15dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes/* Should strace show byte or page offsets in mmap syscalls
25dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * which take page offset parameters?
35dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
45dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * At the time of writing, sys_mmap() converts page to byte offsets,
55dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * but only for SH64! But this routine is used on i386 too - by mmap2 syscall,
65dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * which uses page offsets too. As it stands now, SH64 and i386 are inconsistent.
75dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
85dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * sys_old_mmap() is used for old mmap syscall, which uses byte offset -
95dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * should be ok.
105dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * sys_mmap64() is currently buggy (should print bogus offset, but I can't
115dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * test it right now. What arch/bitness invokes sys_mmap64?)
125dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
135dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * This program is intended for testing what strace actually shows. Usage:
145dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * $ gcc test/mmap_offset_decode.c -o mmap_offset_decode -static
155dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * $ strace ./mmap_offset_decode
165dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
175dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * As of today (2011-08), on i386 strace prints page offset.
185dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * Fixed 2013-02-19. Now all mmaps on all arches should show byte offsets.
195dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes */
205dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define _LARGEFILE_SOURCE
215dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define _LARGEFILE64_SOURCE
225dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define _FILE_OFFSET_BITS 64
235dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <sys/mman.h>
245dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <errno.h>
255dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesint main()
265dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes{
275dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	/* 0x1000 is meant to be page size multiplier */
285dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
295dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes			0x7fff0000LL * 0x1000);
305dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	return errno != 0;
315dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes}
32