m_trampoline.S revision b32f58018498ea2225959b0ba11c18f0c433deef
1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Trampoline code page stuff.                   m_trampoline.S ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This file is part of Valgrind, a dynamic binary instrumentation
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  framework.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  Copyright (C) 2000-2011 Julian Seward
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     jseward@acm.org
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  Copyright (C) 2006-2011 OpenWorks LLP
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     info@open-works.co.uk
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This program is free software; you can redistribute it and/or
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  modify it under the terms of the GNU General Public License as
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  published by the Free Software Foundation; either version 2 of the
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  License, or (at your option) any later version.
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This program is distributed in the hope that it will be useful, but
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  WITHOUT ANY WARRANTY; without even the implied warranty of
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  General Public License for more details.
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  You should have received a copy of the GNU General Public License
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  along with this program; if not, write to the Free Software
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  02111-1307, USA.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  The GNU General Public License is contained in the file COPYING.
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics_asm.h"
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vkiscnums_asm.h"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ------------------ SIMULATED CPU HELPERS ------------------ */
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Replacements for some functions to do with vsyscalls and signals.
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This code runs on the simulated CPU.
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------- x86-linux ----------------------*/
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_x86_linux)
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_16     ud2 ; ud2 ; ud2 ; ud2 ;ud2 ; ud2 ; ud2 ; ud2
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* a leading page of unexecutable code */
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_start)
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(x86_linux_SUBST_FOR_sigreturn)
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_linux_SUBST_FOR_sigreturn):
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* This is a very specific sequence which GDB uses to
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           recognize signal handler frames.  Also gcc: see
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           x86_fallback_frame_state() in
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           gcc-4.1.0/gcc/config/i386/linux-unwind.h */
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        popl    %eax
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    $ __NR_sigreturn, %eax
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        int     $0x80
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ud2
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(x86_linux_SUBST_FOR_rt_sigreturn)
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_linux_SUBST_FOR_rt_sigreturn):
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Likewise for rt signal frames */
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    $ __NR_rt_sigreturn, %eax
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        int     $0x80
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ud2
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* There's no particular reason that this needs to be handwritten
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assembly, but since that's what this file contains, here's a
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   simple index implementation (written in C and compiled by gcc.)
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char* REDIR_FOR_index ( const char* s, int c )
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      unsigned char  ch = (unsigned char)((unsigned int)c);
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      unsigned char* p  = (unsigned char*)s;
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      while (1) {
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (*p == ch) return p;
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (*p == 0)  return 0;
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p++;
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(x86_linux_REDIR_FOR_index)
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(x86_linux_REDIR_FOR_index), @function
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_linux_REDIR_FOR_index):
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        pushl   %ebp
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    %esp, %ebp
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    8(%ebp), %eax
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  12(%ebp), %ecx
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  (%eax), %edx
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    %dl, %cl
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     .L9
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jmp     .L2
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L11:
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addl    $1, %eax
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  (%eax), %edx
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    %dl, %cl
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        je      .L2
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L9:
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        testb   %dl, %dl
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     .L11
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        xorl    %eax, %eax
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L2:
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        popl    %ebp
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size VG_(x86_linux_REDIR_FOR_index), .-VG_(x86_linux_REDIR_FOR_index)
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* There's no particular reason that this needs to be handwritten
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assembly, but since that's what this file contains, here's a
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   simple strlen implementation (written in C and compiled by gcc.)
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.global VG_(x86_linux_REDIR_FOR_strlen)
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.type   VG_(x86_linux_REDIR_FOR_strlen), @function
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_(x86_linux_REDIR_FOR_strlen):
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        pushl   %ebp
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        movl    %esp, %ebp
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        movl    8(%ebp), %edx
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        movl    %edx, %eax
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        jmp     2f
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov1:      incl    %eax
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov2:      cmpb    $0, (%eax)
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        jne     1b
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        subl    %edx, %eax
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        popl    %ebp
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ret
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.size VG_(x86_linux_REDIR_FOR_strlen), .-VG_(x86_linux_REDIR_FOR_strlen)
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_end)
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* and a trailing page of unexecutable code */
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_16
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_64
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_256
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_1024
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_PAGE
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------- amd64-linux ----------------------*/
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_amd64_linux)
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_16     ud2 ; ud2 ; ud2 ; ud2 ;ud2 ; ud2 ; ud2 ; ud2
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* a leading page of unexecutable code */
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_start)
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(amd64_linux_SUBST_FOR_rt_sigreturn)
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_linux_SUBST_FOR_rt_sigreturn):
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* This is a very specific sequence which GDB uses to
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           recognize signal handler frames. */
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movq    $__NR_rt_sigreturn, %rax
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        syscall
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ud2
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(amd64_linux_REDIR_FOR_vgettimeofday)
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(amd64_linux_REDIR_FOR_vgettimeofday), @function
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_linux_REDIR_FOR_vgettimeofday):
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LfnB2:
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movq    $__NR_gettimeofday, %rax
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        syscall
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LfnE2:
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size VG_(amd64_linux_REDIR_FOR_vgettimeofday), .-.LfnB2
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(amd64_linux_REDIR_FOR_vtime)
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(amd64_linux_REDIR_FOR_vtime), @function
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_linux_REDIR_FOR_vtime):
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LfnB3:
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movq    $__NR_time, %rax
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        syscall
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LfnE3:
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size VG_(amd64_linux_REDIR_FOR_vtime), .-.LfnB3
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* There's no particular reason that this needs to be handwritten
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assembly, but since that's what this file contains, here's a
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   simple strlen implementation (written in C and compiled by gcc.)
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(amd64_linux_REDIR_FOR_strlen)
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(amd64_linux_REDIR_FOR_strlen), @function
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_linux_REDIR_FOR_strlen):
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LfnB4:
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	xorl	%eax, %eax
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%rdi)
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rdx
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	.L41
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L40:	addq	$1, %rdx
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%rdx)
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	.L40
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdx, %rax
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	%rdi, %rax
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L41:	ret
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LfnE4:
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size VG_(amd64_linux_REDIR_FOR_strlen), .-VG_(amd64_linux_REDIR_FOR_strlen)
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A CIE for the above three functions, followed by their FDEs */
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.section .eh_frame,"a",@progbits
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.Lframe1:
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LEcie1-.LScie1
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LScie1:
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   0x0
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0x1
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .string "zR"
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x1
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .sleb128 -8
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0x10
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x1
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0x3
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0xc
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x7
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x8
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0x90
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x1
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 8
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LEcie1:
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LSfde2:
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LEfde2-.LASfde2
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LASfde2:
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LASfde2-.Lframe1
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnB2
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnE2-.LfnB2
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x0
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 8
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LEfde2:
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LSfde3:
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LEfde3-.LASfde3
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LASfde3:
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LASfde3-.Lframe1
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnB3
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnE3-.LfnB3
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x0
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 8
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LEfde3:
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LSfde4:
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LEfde4-.LASfde4
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LASfde4:
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LASfde4-.Lframe1
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnB4
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnE4-.LfnB4
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x0
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 8
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LEfde4:
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.previous
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_end)
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* and a trailing page of unexecutable code */
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_16
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_64
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_256
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_1024
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_PAGE
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- ppc32-linux ----------------*/
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_ppc32_linux)
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_16     trap ; trap ; trap; trap
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* a leading page of unexecutable code */
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_start)
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_SUBST_FOR_sigreturn)
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_SUBST_FOR_sigreturn):
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li 0,__NR_sigreturn
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        sc
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0	/*illegal insn*/
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_SUBST_FOR_rt_sigreturn)
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_SUBST_FOR_rt_sigreturn):
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li 0,__NR_rt_sigreturn
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        sc
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0	/*illegal insn*/
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* There's no particular reason that this needs to be handwritten
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assembly, but since that's what this file contains, here's a
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   simple strlen implementation (written in C and compiled by gcc.)
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_REDIR_FOR_strlen)
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(ppc32_linux_REDIR_FOR_strlen), @function
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_REDIR_FOR_strlen):
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 4,0(3)
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 9,0
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 0,4,0
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq- 0,.L18
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L19:
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbzu 5,1(3)
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi 9,9,1
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 0,5,0
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne+ 0,.L19
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L18:
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mr 3,9
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size VG_(ppc32_linux_REDIR_FOR_strlen), .-VG_(ppc32_linux_REDIR_FOR_strlen)
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Ditto strcmp */
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_REDIR_FOR_strcmp)
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(ppc32_linux_REDIR_FOR_strcmp), @function
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_REDIR_FOR_strcmp):
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L20:
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne- 7,.L21
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(4)
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,0
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq- 7,.L22
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L21:
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,-1
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq- 7,.L22
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(4)
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,1
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq- 7,.L22
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 9,0(3)
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(4)
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,-1
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmplw 7,9,0
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blt- 7,.L22
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 9,0(3)
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(4)
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,1
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi 3,3,1
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi 4,4,1
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmplw 7,9,0
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ble+ 7,.L20
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L22:
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mr 3,11
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size VG_(ppc32_linux_REDIR_FOR_strcmp), .-VG_(ppc32_linux_REDIR_FOR_strcmp)
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Ditto index/strchr */
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_REDIR_FOR_strchr)
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(ppc32_linux_REDIR_FOR_strchr), @function
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_REDIR_FOR_strchr):
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        rlwinm 4,4,0,0xff
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpw 7,4,0
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beqlr 7
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L308
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        b .L304
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L309:
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq 6,.L304
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L308:
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbzu 0,1(3)
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpw 7,4,0
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 6,0,0
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L309
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L304:
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 3,0
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size   VG_(ppc32_linux_REDIR_FOR_strchr),.-VG_(ppc32_linux_REDIR_FOR_strchr)
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_end)
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* and a trailing page of unexecutable code */
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_16
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_64
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_256
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_1024
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_PAGE
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- ppc64-linux ----------------*/
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_ppc64_linux)
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_16     trap ; trap ; trap; trap
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* a leading page of unexecutable code */
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_start)
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc64_linux_SUBST_FOR_rt_sigreturn)
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc64_linux_SUBST_FOR_rt_sigreturn):
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li 0,__NR_rt_sigreturn
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        sc
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0	/*illegal insn*/
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* See comment in pub_core_trampoline.h for what this is for */
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppctoc_magic_redirect_return_stub)
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppctoc_magic_redirect_return_stub):
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	trap
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* this function is written using the "dotless" ABI convention */
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.align 2
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.globl VG_(ppc64_linux_REDIR_FOR_strlen)
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.section        ".opd","aw"
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.align 3
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc64_linux_REDIR_FOR_strlen):
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.quad   .L.VG_(ppc64_linux_REDIR_FOR_strlen),.TOC.@tocbase,0
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.previous
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.size	VG_(ppc64_linux_REDIR_FOR_strlen), \
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown			.L0end-.L.VG_(ppc64_linux_REDIR_FOR_strlen)
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.type	VG_(ppc64_linux_REDIR_FOR_strlen), @function
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L.VG_(ppc64_linux_REDIR_FOR_strlen):
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mr 9,3
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 3,0
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beqlr 7
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 3,0
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L01:
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi 0,3,1
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        extsw 3,0
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbzx 0,9,3
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L01
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte 0,0,0,0,0,0,0,0
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L0end:
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* this function is written using the "dotless" ABI convention */
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 2
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .globl VG_(ppc64_linux_REDIR_FOR_strchr)
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.section        ".opd","aw"
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.align 3
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc64_linux_REDIR_FOR_strchr):
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .quad   .L.VG_(ppc64_linux_REDIR_FOR_strchr),.TOC.@tocbase,0
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .previous
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .size   VG_(ppc64_linux_REDIR_FOR_strchr), \
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        .L1end-.L.VG_(ppc64_linux_REDIR_FOR_strchr)
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .type   VG_(ppc64_linux_REDIR_FOR_strchr),@function
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L.VG_(ppc64_linux_REDIR_FOR_strchr):
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        rldicl 4,4,0,56
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpw 7,4,0
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beqlr 7
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpdi 7,0,0
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L18
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        b .L14
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L19:
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq 6,.L14
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L18:
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbzu 0,1(3)
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpw 7,4,0
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpdi 6,0,0
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L19
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L14:
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 3,0
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte 0,0,0,0,0,0,0,0
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L1end:
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_end)
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* and a trailing page of unexecutable code */
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_16
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_64
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_256
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_1024
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_PAGE
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- ppc32-linux ----------------*/
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_arm_linux)
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#       define UD2_4      .word 0xFFFFFFFF
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_16     UD2_4    ; UD2_4    ; UD2_4    ; UD2_4
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* a leading page of unexecutable code */
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_start)
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(arm_linux_REDIR_FOR_strlen)
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(arm_linux_REDIR_FOR_strlen):
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r2, r0
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r0, [r0, #0]	@ zero_extendqisi2
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ lr needed for prologue
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r0, #0
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bxeq	lr
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0, #0
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L5:
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r0, r0, #1
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r0, r2]	@ zero_extendqisi2
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r3, #0
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	.L5
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bx	lr
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_4
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.global VG_(arm_linux_REDIR_FOR_index)
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//VG_(arm_linux_REDIR_FOR_index):
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	ldrb	r3, [r0, #0]	@ zero_extendqisi2
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	and	r1, r1, #255
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	cmp	r3, r1
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	@ lr needed for prologue
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bne	.L9
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bx	lr
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.L12:
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	ldrb	r3, [r0, #1]!	@ zero_extendqisi2
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	cmp	r3, r1
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	beq	.L11
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.L9:
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	cmp	r3, #0
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bne	.L12
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	mov	r0, #0
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bx	lr
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.L11:
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bx	lr
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	UD2_4
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(arm_linux_REDIR_FOR_memcpy)
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(arm_linux_REDIR_FOR_memcpy):
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stmfd	sp!, {r4, r5, lr}
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subs	lr, r2, #0
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r5, r0
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	.L2
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r0, r1
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bls	.L4
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r3, r0, lr
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1, lr, r1
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #3
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r4, r3, #1
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r0, r1, #1
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ble	.L28
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	ip, r3, #5
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r1, r1, #5
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L8:
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1, #4]	@ zero_extendqisi2
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	lr, lr, #4
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip, #4]
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r2, [r1, #3]	@ zero_extendqisi2
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #3
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r2, [ip, #3]
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1, #2]	@ zero_extendqisi2
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r4, ip
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip, #2]
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r2, [r1, #1]	@ zero_extendqisi2
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0, r1
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r2, [ip, #1]
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r1, r1, #4
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	ip, ip, #4
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bgt	.L8
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #0
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	.L2
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L28:
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r2, lr, #1
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L21:
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r2, r2, #1
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r0], #-1	@ zero_extendqisi2
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmn	r2, #1
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [r4], #-1
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	.L21
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L2:
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0, r5
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldmfd	sp!, {r4, r5, pc}
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L4:
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bcs	.L2
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #3
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	ip, r0
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ble	.L29
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L19:
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1, #0]	@ zero_extendqisi2
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	lr, lr, #4
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip, #0]
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r2, [r1, #1]	@ zero_extendqisi2
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #3
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r2, [ip, #1]
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1, #2]	@ zero_extendqisi2
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip, #2]
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r2, [r1, #3]	@ zero_extendqisi2
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1, r1, #4
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r2, [ip, #3]
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	ip, ip, #4
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bgt	.L19
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #0
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	.L2
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L29:
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r2, lr, #1
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L20:
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r2, r2, #1
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1], #1	@ zero_extendqisi2
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmn	r2, #1
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip], #1
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	.L20
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0, r5
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldmfd	sp!, {r4, r5, pc}
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_4
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_end)
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* and a trailing page of unexecutable code */
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_4
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_16
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_64
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_256
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_1024
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_PAGE
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- x86-darwin ----------------*/
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_x86_darwin)
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* a leading page of unexecutable code */
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.fill 2048, 2, 0x0b0f /* `ud2` */
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(trampoline_stuff_start)
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_SUBST_FOR_sigreturn)
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_SUBST_FOR_sigreturn):
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* XXX does this need to have any special form? (cf x86-linux
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	version) */
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    $ __NR_DARWIN_FAKE_SIGRETURN, %eax
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        int     $0x80
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ud2
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strlen)
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strlen):
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    4(%esp), %edx
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    %edx, %eax
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jmp     1f
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %eax
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    $0, (%eax)
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     0b
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        subl    %edx, %eax
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strcat)
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strcat):
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        pushl   %esi
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    8(%esp), %esi
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    12(%esp), %ecx
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    %esi, %edx
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jmp     1f
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %edx
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    $0, (%edx)
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     0b
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  (%ecx), %eax
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %ecx
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movb    %al, (%edx)
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %edx
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        testb   %al, %al
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     2b
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    %esi, %eax
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        popl    %esi
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strcmp)
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strcmp):
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    4(%esp), %edx
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    8(%esp), %ecx
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jmp     1f
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %edx
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %ecx
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  (%edx), %eax
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        testb   %al, %al
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        je      2f
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    (%ecx), %al
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        je      0b
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  (%ecx),%edx
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  %al,%eax
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        subl    %edx, %eax
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strcpy)
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strcpy):
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%ebp
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esp, %ebp
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%esi
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	8(%ebp), %esi
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	12(%ebp), %ecx
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esi, %edx
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%ecx
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%edx
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%ecx), %eax
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%al, %al
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%al, (%edx)
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esi, %eax
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%esi
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leave
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strlcat)
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strlcat):
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%ebp
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esp, %ebp
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%edi
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%esi
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	$16, %esp
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	8(%ebp), %esi
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	16(%ebp), %ecx
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esi, %edx
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leal	(%ecx,%esi), %eax
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%edx
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpl	%edx, %eax
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	2f
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%edx)
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%edx, %edi
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	%esi, %edi
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%ecx, %esi
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	%edi, %esi
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	3f
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	12(%ebp), %eax
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	6f
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown3:
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	12(%ebp), %eax
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%eax, (%esp)
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	call	VG_(x86_darwin_REDIR_FOR_strlen)
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	7f
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown4:
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpl	$1, %esi
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	5f
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%cl, (%edx)
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	decl	%esi
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%edx
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown5:
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%eax
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown6:
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%eax), %ecx
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%cl, %cl
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	4b
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	$0, (%edx)
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	12(%ebp), %eax
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown7:
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addl	$16, %esp
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leal	(%edi,%eax), %eax
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%esi
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%edi
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leave
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(trampoline_stuff_end)
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* a trailing page of unexecutable code */
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.fill 2048, 2, 0x0b0f /* `ud2` */
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- amd64-darwin ----------------*/
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_amd64_darwin)
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* a leading page of unexecutable code */
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.fill 2048, 2, 0x0b0f /* `ud2` */
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(trampoline_stuff_start)
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_SUBST_FOR_sigreturn)
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_SUBST_FOR_sigreturn):
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* XXX does this need to have any special form? (cf x86-linux
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	version) */
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movq    $ __NR_DARWIN_FAKE_SIGRETURN, %rax
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        syscall
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ud2
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strlen)
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strlen):
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movq    %rdi, %rax
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jmp     1f
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incq    %rax
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    $0, (%rax)
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     0b
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        subq    %rdi, %rax
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strcat)
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strcat):
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rdx
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rdx
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%rdx)
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rsi), %eax
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rsi
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%al, (%rdx)
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rdx
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%al, %al
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	2b
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rax
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strcmp)
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strcmp):
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rdi
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rsi
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rdi), %eax
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%al, %al
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	2f
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	(%rsi), %al
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	0b
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rsi), %edx
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	%al, %eax
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	%edx, %eax
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strcpy)
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strcpy):
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushq	%rbp
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rdx
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rsp, %rbp
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rsi
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rdx
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rsi), %eax
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%al, %al
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%al, (%rdx)
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leave
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rax
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strlcat)
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strlcat):
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushq	%rbp
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leaq	(%rdx,%rdi), %rax
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rcx
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rsp, %rbp
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushq	%rbx
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	$8, %rsp
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rcx
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpq	%rcx, %rax
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	2f
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%rcx)
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rcx, %rbx
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	%rdi, %rbx
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdx, %rdi
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	%rbx, %rdi
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	3f
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rsi, %rax
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	6f
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown3:
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rsi, %rdi
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	call	VG_(amd64_darwin_REDIR_FOR_strlen)
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	7f
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown4:
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpq	$1, %rdi
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	5f
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%dl, (%rcx)
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	decq	%rdi
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rcx
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown5:
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rax
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown6:
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rax), %edx
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%dl, %dl
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	4b
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	$0, (%rcx)
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	%rsi, %rax
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown7:
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leaq	(%rbx,%rax), %rax
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addq	$8, %rsp
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popq	%rbx
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leave
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_arc4random)
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_arc4random):
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* not very random, hope dyld won't mind */
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	$0x76616c6772696e64, %rax
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(trampoline_stuff_end)
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* a trailing page of unexecutable code */
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.fill 2048, 2, 0x0b0f /* `ud2` */
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------- s390x-linux ----------------*/
957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(VGP_s390x_linux)
959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /* a leading page of unexecutable code */
961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	.fill 2048, 2, 0x0000
962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.global VG_(trampoline_stuff_start)
964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_(trampoline_stuff_start):
965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.global VG_(s390x_linux_SUBST_FOR_sigreturn)
967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_(s390x_linux_SUBST_FOR_sigreturn):
968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        svc __NR_sigreturn
969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	.short 0
970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.global VG_(s390x_linux_SUBST_FOR_rt_sigreturn)
972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_(s390x_linux_SUBST_FOR_rt_sigreturn):
973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /* Old gcc unwinding code checks for a sig(_rt)_return svc and then
974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           for ra = cfa to decide if it is a sig_rt_frame or not. Since we
975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           set ra to this trampoline, but the cfa is still in the stack,
976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           the unwinder thinks, that this is a non-rt frame  and causes a
977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           crash in the gcc unwinder - which is used by the thread library
978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           and others. Therefore we add a lr 1,1 nop, to let the gcc
979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           unwinder bail out gracefully. This might also affect unwinding
980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           across the signal frame - tough luck. fixs390 */
981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        lr 1,1
982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        svc __NR_rt_sigreturn
983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	.short 0
984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.globl VG_(trampoline_stuff_end)
986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_(trampoline_stuff_end):
987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	.fill 2048, 2, 0x0000
988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- unknown ----------------*/
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  error Unknown platform
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGO_linux)
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Let the linker know we don't need an executable stack */
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  if defined(VGP_arm_linux)
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   .section .note.GNU-stack,"",%progbits
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  else
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   .section .note.GNU-stack,"",@progbits
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  endif
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1013