leak-segv-jmp.c revision e27c8cd24643d09ef7857a567771a95e888b6b5f
121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#define _GNU_SOURCE
221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <stdio.h>
321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <stdlib.h>
421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <unistd.h>
521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include "../memcheck.h"
621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include "leak.h"
721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <sys/mman.h>
821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <sys/syscall.h>
921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
10e37c4bce28e78b9288458907357989bfacd265e7philippetypedef unsigned long            UWord;
11e37c4bce28e78b9288458907357989bfacd265e7philippetypedef unsigned long long int   ULong;
12e37c4bce28e78b9288458907357989bfacd265e7philippe// Below code is copied from m_syscall.c
13e37c4bce28e78b9288458907357989bfacd265e7philippe// Refer to this file for syscall convention.
14e37c4bce28e78b9288458907357989bfacd265e7philippe#if defined(VGP_x86_linux)
1521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeextern UWord do_syscall_WRK (UWord syscall_no,
1621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                             UWord a1, UWord a2, UWord a3,
1721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                             UWord a4, UWord a5, UWord a6
1821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                             );
1921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeasm(
2021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".text\n"
2121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".globl do_syscall_WRK\n"
2221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"do_syscall_WRK:\n"
2321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	push	%esi\n"
2421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	push	%edi\n"
2521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	push	%ebx\n"
2621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	push	%ebp\n"
2721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movl	16+ 4(%esp),%eax\n"
2821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movl	16+ 8(%esp),%ebx\n"
2921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movl	16+12(%esp),%ecx\n"
3021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movl	16+16(%esp),%edx\n"
3121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movl	16+20(%esp),%esi\n"
3221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movl	16+24(%esp),%edi\n"
3321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movl	16+28(%esp),%ebp\n"
3421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	int	$0x80\n"
3521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	popl	%ebp\n"
3621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	popl	%ebx\n"
3721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	popl	%edi\n"
3821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	popl	%esi\n"
3921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	ret\n"
4021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".previous\n"
4121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe);
4221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#elif defined(VGP_amd64_linux)
4321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeextern UWord do_syscall_WRK (
4421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe          UWord syscall_no,
4521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe          UWord a1, UWord a2, UWord a3,
4621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe          UWord a4, UWord a5, UWord a6
4721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe       );
4821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeasm(
4921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".text\n"
5021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".globl do_syscall_WRK\n"
5121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"do_syscall_WRK:\n"
5221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movq	%rdi, %rax\n"
5321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movq	%rsi, %rdi\n"
5421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movq	%rdx, %rsi\n"
5521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movq	%rcx, %rdx\n"
5621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movq	%r8,  %r10\n"
5721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movq	%r9,  %r8\n"
5821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	movq    8(%rsp), %r9\n"	 /* last arg from stack */
5921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	syscall\n"
6021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"	ret\n"
6121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".previous\n"
6221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe);
6321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
6421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#elif defined(VGP_ppc32_linux)
6521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeextern ULong do_syscall_WRK (
6621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe          UWord syscall_no,
6721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe          UWord a1, UWord a2, UWord a3,
6821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe          UWord a4, UWord a5, UWord a6
6921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe       );
7021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeasm(
7121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".text\n"
7221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".globl do_syscall_WRK\n"
7321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"do_syscall_WRK:\n"
7421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        mr      0,3\n"
7521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        mr      3,4\n"
7621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        mr      4,5\n"
7721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        mr      5,6\n"
7821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        mr      6,7\n"
7921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        mr      7,8\n"
8021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        mr      8,9\n"
8121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        sc\n"                  /* syscall: sets %cr0.so on error         */
8221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        mfcr    4\n"           /* %cr -> low word of return var          */
8321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        rlwinm  4,4,4,31,31\n" /* rotate flag bit so to lsb, and mask it */
8421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"        blr\n"                 /* and return                             */
8521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".previous\n"
8621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe);
8721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
8821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#elif defined(VGP_arm_linux)
8921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeextern UWord do_syscall_WRK (
9021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe          UWord a1, UWord a2, UWord a3,
9121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe          UWord a4, UWord a5, UWord a6,
9221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe          UWord syscall_no
9321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe       );
9421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeasm(
9521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".text\n"
9621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".globl do_syscall_WRK\n"
9721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"do_syscall_WRK:\n"
9821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"         push    {r4, r5, r7}\n"
9921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"         ldr     r4, [sp, #12]\n"
10021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"         ldr     r5, [sp, #16]\n"
10121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"         ldr     r7, [sp, #20]\n"
10221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"         svc     0x0\n"
10321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"         pop     {r4, r5, r7}\n"
10421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"         bx      lr\n"
10521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".previous\n"
10621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe);
10721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#elif defined(VGP_s390x_linux)
10821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeUWord do_syscall_WRK (
10921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   UWord syscall_no,
11021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   UWord arg1, UWord arg2, UWord arg3,
11121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   UWord arg4, UWord arg5, UWord arg6
11221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   )
11321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{
11421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   register UWord __arg1 asm("2") = arg1;
11521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   register UWord __arg2 asm("3") = arg2;
11621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   register UWord __arg3 asm("4") = arg3;
11721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   register UWord __arg4 asm("5") = arg4;
11821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   register UWord __arg5 asm("6") = arg5;
11921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   register UWord __arg6 asm("7") = arg6;
12021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   register ULong __svcres asm("2");
12121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
12221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   __asm__ __volatile__ (
12321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                 "lgr %%r1,%1\n\t"
12421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                 "svc 0\n\t"
12521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe		: "=d" (__svcres)
12621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe		: "a" (syscall_no),
12721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe		  "0" (__arg1),
12821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe		  "d" (__arg2),
12921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe		  "d" (__arg3),
13021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe		  "d" (__arg4),
13121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe		  "d" (__arg5),
13221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe		  "d" (__arg6)
13321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe		: "1", "cc", "memory");
13421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
13521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   return (UWord) (__svcres);
13621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe}
13721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
138ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj#elif defined(VGP_mips64_linux)
139ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanjextern UWord do_syscall_WRK (
140ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj          UWord syscall_no,
141ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj          UWord a1, UWord a2, UWord a3,
142ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj          UWord a4, UWord a5, UWord a6
143ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj       )
144ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj{
145ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj   UWord out;
146ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj   __asm__ __volatile__ (
147ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 "move $v0, %1\n\t"
148ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 "move $a0, %2\n\t"
149ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 "move $a1, %3\n\t"
150ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 "move $a2, %4\n\t"
151ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 "move $a3, %5\n\t"
152ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 "move $8,  %6\n\t"  /* We use numbers because some compilers */
153ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 "move $9,  %7\n\t"  /* don't recognize $a4 and $a5 */
154ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 "syscall\n"
155ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 "move %0, $v0\n\t"
156ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 : /*out*/ "=r" (out)
157ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 : "r"(syscall_no), "r"(a1), "r"(a2), "r"(a3),
158ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                   "r"(a4), "r"(a5), "r"(a6)
159ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj                 : "v0", "v1", "a0", "a1", "a2", "a3", "$8", "$9");
160ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj   return out;
161ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj}
162112711afefcfcd43680c7c4aa8d38ef180e8811esewardj#elif defined(VGP_tilegx_linux)
163112711afefcfcd43680c7c4aa8d38ef180e8811esewardjextern UWord do_syscall_WRK (
164112711afefcfcd43680c7c4aa8d38ef180e8811esewardj          UWord syscall_no,
165112711afefcfcd43680c7c4aa8d38ef180e8811esewardj          UWord a1, UWord a2, UWord a3,
166112711afefcfcd43680c7c4aa8d38ef180e8811esewardj          UWord a4, UWord a5, UWord a6
167112711afefcfcd43680c7c4aa8d38ef180e8811esewardj       )
168112711afefcfcd43680c7c4aa8d38ef180e8811esewardj{
169112711afefcfcd43680c7c4aa8d38ef180e8811esewardj   UWord out;
170112711afefcfcd43680c7c4aa8d38ef180e8811esewardj   __asm__ __volatile__ (
171e27c8cd24643d09ef7857a567771a95e888b6b5fzliu                 "move r10, %1\n\t"
172e27c8cd24643d09ef7857a567771a95e888b6b5fzliu                 "move r0,  %2\n\t"
173e27c8cd24643d09ef7857a567771a95e888b6b5fzliu                 "move r1,  %3\n\t"
174e27c8cd24643d09ef7857a567771a95e888b6b5fzliu                 "move r2,  %4\n\t"
175e27c8cd24643d09ef7857a567771a95e888b6b5fzliu                 "move r3,  %5\n\t"
176e27c8cd24643d09ef7857a567771a95e888b6b5fzliu                 "move r4,  %6\n\t"
177e27c8cd24643d09ef7857a567771a95e888b6b5fzliu                 "move r5,  %7\n\t"
178112711afefcfcd43680c7c4aa8d38ef180e8811esewardj                 "swint1      \n\t"
179112711afefcfcd43680c7c4aa8d38ef180e8811esewardj                 "move %0,  r0\n\t"
180112711afefcfcd43680c7c4aa8d38ef180e8811esewardj                 : /*out*/ "=r" (out)
181112711afefcfcd43680c7c4aa8d38ef180e8811esewardj                 : "r"(syscall_no), "r"(a1), "r"(a2), "r"(a3),
182112711afefcfcd43680c7c4aa8d38ef180e8811esewardj                   "r"(a4), "r"(a5), "r"(a6)
183112711afefcfcd43680c7c4aa8d38ef180e8811esewardj                 : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r10");
184112711afefcfcd43680c7c4aa8d38ef180e8811esewardj   return out;
185112711afefcfcd43680c7c4aa8d38ef180e8811esewardj}
186ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj
18721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#else
1882082b3436bd570f764945258654bd2152ec1a7dephilippe// Ensure the file compiles even if the syscall nr is not defined.
1892082b3436bd570f764945258654bd2152ec1a7dephilippe#ifndef __NR_mprotect
1902082b3436bd570f764945258654bd2152ec1a7dephilippe#define __NR_mprotect 0
1912082b3436bd570f764945258654bd2152ec1a7dephilippe#endif
19221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeUWord do_syscall_WRK (UWord syscall_no,
19321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                      UWord a1, UWord a2, UWord a3,
19421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                      UWord a4, UWord a5, UWord a6
19521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                      )
19621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{
19721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // not implemented. vgtest prereq should avoid this to be called.
19821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   return -1;
19921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe}
20021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#endif
20121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
20221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
20321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
20421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippechar **b10;
20521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeint mprotect_result = 0;
20621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippestatic void non_simd_mprotect (long tid, void* addr, long len)
20721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{
20821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   mprotect_result = do_syscall_WRK(__NR_mprotect,
20921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                                    (UWord) addr, len, PROT_NONE,
21021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe                                    0, 0, 0);
21121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe}
21221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
21321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippevoid f(void)
21421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{
21521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   long pagesize;
21621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#define RNDPAGEDOWN(a) ((long)a & ~(pagesize-1))
2177a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   int i;
2187a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   const int nr_ptr = (10000 * 4)/sizeof(char*);
21921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
2207a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   b10 = calloc (nr_ptr * sizeof(char*), 1);
2217a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   for (i = 0; i < nr_ptr; i++)
2227a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe      b10[i] = (char*)b10;
22321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   b10[4000] = malloc (1000);
22421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
22521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   fprintf(stderr, "expecting no leaks\n");
22621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   fflush(stderr);
22721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   VALGRIND_DO_LEAK_CHECK;
22821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
22921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // make b10[4000] undefined. This should create a leak.
23006bc722457ffe12e056d2f40d0d2f5c8711b541fflorian   (void) VALGRIND_MAKE_MEM_UNDEFINED (&b10[4000], sizeof(char*));
23121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   fprintf(stderr, "expecting a leak\n");
23221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   fflush(stderr);
23321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   VALGRIND_DO_LEAK_CHECK;
23421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
23521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // make  b10[4000] defined again.
23606bc722457ffe12e056d2f40d0d2f5c8711b541fflorian   (void) VALGRIND_MAKE_MEM_DEFINED (&b10[4000], sizeof(char*));
23721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
23821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // now make some bricolage to have some pages around b10[4000]
23921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // unreadable. The leak check should recover from that
24021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // thanks to a SEGV handler and a setjmp/longjmp.
24121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // This setjmp/longjmp is useful if there is a desync between
24221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // the aspacemgr and the real pages mapping.
24321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // To have such a discrepancy, we resort on a non SIMD call
24421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // to mprotect the pages : as this syscall will not be seen
24521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // by Valgrind core, the aspacemgr will not get a chance
24621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   // to stay synchronised.
24721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   pagesize = sysconf(_SC_PAGE_SIZE);
24821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   if (pagesize == -1)
24921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe      perror ("sysconf failed");
25021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
25121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   if (RUNNING_ON_VALGRIND)
25206bc722457ffe12e056d2f40d0d2f5c8711b541fflorian     (void) VALGRIND_NON_SIMD_CALL2(non_simd_mprotect, RNDPAGEDOWN(&b10[4000]), 2 * pagesize);
25321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   else
25421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe      mprotect_result = mprotect((void*) RNDPAGEDOWN(&b10[4000]), 2 * pagesize, PROT_NONE);
25521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   fprintf(stderr, "mprotect result %d\n", mprotect_result);
25621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
25721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   fprintf(stderr, "expecting a leak again\n");
25821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   fflush(stderr);
25921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   VALGRIND_DO_LEAK_CHECK;
26021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
2617a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   if (RUNNING_ON_VALGRIND)
2627a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe     (void) VALGRIND_NON_SIMD_CALL2(non_simd_mprotect,
2637a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe                                    RNDPAGEDOWN(&b10[0]),
2647a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe                                    RNDPAGEDOWN(&(b10[nr_ptr-1]))
2657a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe                                    - RNDPAGEDOWN(&(b10[0])));
2667a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   else
2677a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe      mprotect_result = mprotect((void*) RNDPAGEDOWN(&b10[0]),
2687a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe                                 RNDPAGEDOWN(&(b10[nr_ptr-1]))
2697a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe                                 - RNDPAGEDOWN(&(b10[0])),
2707a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe                                 PROT_NONE);
2717a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   fprintf(stderr, "full mprotect result %d\n", mprotect_result);
2727a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe
2737a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   fprintf(stderr, "expecting a leak again after full mprotect\n");
2747a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   fflush(stderr);
2757a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe   VALGRIND_DO_LEAK_CHECK;
2767a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe
27721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   fprintf(stderr, "finished\n");
27821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe}
27921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
28021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeint main(void)
28121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{
28221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   DECLARE_LEAK_COUNTERS;
28321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
28421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   GET_INITIAL_LEAK_COUNTS;
28521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
28621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   f();   // see leak-cases.c
28721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
28821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
28921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   GET_FINAL_LEAK_COUNTS;
29021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
29121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   PRINT_LEAK_COUNTS(stderr);
29221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe
29321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe   return 0;
29421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe}
295