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
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  Copyright (C) 2000-2013 Julian Seward
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     jseward@acm.org
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  Copyright (C) 2006-2013 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
192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(amd64_linux_REDIR_FOR_vgetcpu)
193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.type   VG_(amd64_linux_REDIR_FOR_vgetcpu), @function
194663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(amd64_linux_REDIR_FOR_vgetcpu):
195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.LfnB4:
196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movq    $__NR_getcpu, %rax
197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        syscall
198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        ret
199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.LfnE4:
200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.size VG_(amd64_linux_REDIR_FOR_vgetcpu), .-.LfnB4
201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* There's no particular reason that this needs to be handwritten
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assembly, but since that's what this file contains, here's a
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   simple strlen implementation (written in C and compiled by gcc.)
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(amd64_linux_REDIR_FOR_strlen)
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(amd64_linux_REDIR_FOR_strlen), @function
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_linux_REDIR_FOR_strlen):
209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.LfnB5:
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	xorl	%eax, %eax
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%rdi)
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rdx
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	.L41
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L40:	addq	$1, %rdx
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%rdx)
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	.L40
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdx, %rax
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	%rdi, %rax
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L41:	ret
220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.LfnE5:
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size VG_(amd64_linux_REDIR_FOR_strlen), .-VG_(amd64_linux_REDIR_FOR_strlen)
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A CIE for the above four functions, followed by their FDEs */
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.section .eh_frame,"a",@progbits
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.Lframe1:
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LEcie1-.LScie1
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LScie1:
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   0x0
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0x1
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .string "zR"
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x1
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .sleb128 -8
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0x10
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x1
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0x3
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0xc
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x7
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x8
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte   0x90
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x1
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 8
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LEcie1:
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LSfde2:
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LEfde2-.LASfde2
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LASfde2:
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LASfde2-.Lframe1
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnB2
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnE2-.LfnB2
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x0
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 8
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LEfde2:
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LSfde3:
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LEfde3-.LASfde3
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LASfde3:
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LASfde3-.Lframe1
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnB3
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnE3-.LfnB3
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x0
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 8
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LEfde3:
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LSfde4:
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LEfde4-.LASfde4
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LASfde4:
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LASfde4-.Lframe1
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnB4
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long   .LfnE4-.LfnB4
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .uleb128 0x0
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 8
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LEfde4:
271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.LSfde5:
272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .long   .LEfde5-.LASfde5
273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.LASfde5:
274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .long   .LASfde5-.Lframe1
275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .long   .LfnB5
276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .long   .LfnE5-.LfnB5
277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .uleb128 0x0
278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .align 8
279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.LEfde5:
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.previous
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_end)
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* and a trailing page of unexecutable code */
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_16
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_64
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_256
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_1024
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_PAGE
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- ppc32-linux ----------------*/
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_ppc32_linux)
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_16     trap ; trap ; trap; trap
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* a leading page of unexecutable code */
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_start)
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_SUBST_FOR_sigreturn)
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_SUBST_FOR_sigreturn):
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li 0,__NR_sigreturn
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        sc
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0	/*illegal insn*/
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_SUBST_FOR_rt_sigreturn)
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_SUBST_FOR_rt_sigreturn):
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li 0,__NR_rt_sigreturn
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        sc
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0	/*illegal insn*/
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* There's no particular reason that this needs to be handwritten
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assembly, but since that's what this file contains, here's a
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   simple strlen implementation (written in C and compiled by gcc.)
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_REDIR_FOR_strlen)
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(ppc32_linux_REDIR_FOR_strlen), @function
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_REDIR_FOR_strlen):
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 4,0(3)
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 9,0
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 0,4,0
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq- 0,.L18
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L19:
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbzu 5,1(3)
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi 9,9,1
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 0,5,0
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne+ 0,.L19
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L18:
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mr 3,9
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size VG_(ppc32_linux_REDIR_FOR_strlen), .-VG_(ppc32_linux_REDIR_FOR_strlen)
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Ditto strcmp */
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_REDIR_FOR_strcmp)
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(ppc32_linux_REDIR_FOR_strcmp), @function
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_REDIR_FOR_strcmp):
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L20:
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne- 7,.L21
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(4)
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,0
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq- 7,.L22
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L21:
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,-1
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq- 7,.L22
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(4)
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,1
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq- 7,.L22
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 9,0(3)
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(4)
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,-1
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmplw 7,9,0
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blt- 7,.L22
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 9,0(3)
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(4)
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 11,1
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi 3,3,1
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi 4,4,1
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmplw 7,9,0
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ble+ 7,.L20
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L22:
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mr 3,11
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size VG_(ppc32_linux_REDIR_FOR_strcmp), .-VG_(ppc32_linux_REDIR_FOR_strcmp)
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Ditto index/strchr */
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc32_linux_REDIR_FOR_strchr)
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type   VG_(ppc32_linux_REDIR_FOR_strchr), @function
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc32_linux_REDIR_FOR_strchr):
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        rlwinm 4,4,0,0xff
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpw 7,4,0
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beqlr 7
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L308
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        b .L304
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L309:
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq 6,.L304
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L308:
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbzu 0,1(3)
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpw 7,4,0
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 6,0,0
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L309
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L304:
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 3,0
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.size   VG_(ppc32_linux_REDIR_FOR_strchr),.-VG_(ppc32_linux_REDIR_FOR_strchr)
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_end)
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* and a trailing page of unexecutable code */
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_16
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_64
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_256
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_1024
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_PAGE
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- ppc64-linux ----------------*/
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_ppc64_linux)
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_16     trap ; trap ; trap; trap
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* a leading page of unexecutable code */
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_start)
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppc64_linux_SUBST_FOR_rt_sigreturn)
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc64_linux_SUBST_FOR_rt_sigreturn):
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li 0,__NR_rt_sigreturn
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        sc
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0	/*illegal insn*/
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* See comment in pub_core_trampoline.h for what this is for */
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(ppctoc_magic_redirect_return_stub)
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppctoc_magic_redirect_return_stub):
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	trap
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* this function is written using the "dotless" ABI convention */
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.align 2
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.globl VG_(ppc64_linux_REDIR_FOR_strlen)
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.section        ".opd","aw"
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.align 3
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc64_linux_REDIR_FOR_strlen):
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.quad   .L.VG_(ppc64_linux_REDIR_FOR_strlen),.TOC.@tocbase,0
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.previous
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.size	VG_(ppc64_linux_REDIR_FOR_strlen), \
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown			.L0end-.L.VG_(ppc64_linux_REDIR_FOR_strlen)
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.type	VG_(ppc64_linux_REDIR_FOR_strlen), @function
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L.VG_(ppc64_linux_REDIR_FOR_strlen):
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mr 9,3
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 3,0
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beqlr 7
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 3,0
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L01:
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi 0,3,1
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        extsw 3,0
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbzx 0,9,3
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpwi 7,0,0
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L01
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte 0,0,0,0,0,0,0,0
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L0end:
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* this function is written using the "dotless" ABI convention */
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 2
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .globl VG_(ppc64_linux_REDIR_FOR_strchr)
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.section        ".opd","aw"
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.align 3
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(ppc64_linux_REDIR_FOR_strchr):
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .quad   .L.VG_(ppc64_linux_REDIR_FOR_strchr),.TOC.@tocbase,0
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .previous
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .size   VG_(ppc64_linux_REDIR_FOR_strchr), \
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        .L1end-.L.VG_(ppc64_linux_REDIR_FOR_strchr)
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .type   VG_(ppc64_linux_REDIR_FOR_strchr),@function
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L.VG_(ppc64_linux_REDIR_FOR_strchr):
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbz 0,0(3)
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        rldicl 4,4,0,56
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpw 7,4,0
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beqlr 7
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpdi 7,0,0
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L18
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        b .L14
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L19:
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq 6,.L14
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L18:
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lbzu 0,1(3)
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpw 7,4,0
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpdi 6,0,0
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne 7,.L19
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L14:
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li 3,0
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .long 0
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .byte 0,0,0,0,0,0,0,0
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L1end:
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_end)
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* and a trailing page of unexecutable code */
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_16
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_64
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_256
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_1024
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_PAGE
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------- arm-linux ----------------*/
523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(VGP_arm_linux)
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#       define UD2_4      .word 0xFFFFFFFF
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_16     UD2_4    ; UD2_4    ; UD2_4    ; UD2_4
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* a leading page of unexecutable code */
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_start)
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(arm_linux_SUBST_FOR_sigreturn)
540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.type   VG_(arm_linux_SUBST_FOR_sigreturn),#function
541663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(arm_linux_SUBST_FOR_sigreturn):
542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	mov r7, # __NR_sigreturn
543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        svc #0
544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .long 0xFFFFFFFF /*illegal insn*/
545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.size VG_(arm_linux_SUBST_FOR_sigreturn), .-VG_(arm_linux_SUBST_FOR_sigreturn)
546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(arm_linux_SUBST_FOR_rt_sigreturn)
548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.type   VG_(arm_linux_SUBST_FOR_rt_sigreturn),#function
549663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(arm_linux_SUBST_FOR_rt_sigreturn):
550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	mov r7, # __NR_rt_sigreturn
551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        svc #0
552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .long 0xFFFFFFFF /*illegal insn*/
553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.size VG_(arm_linux_SUBST_FOR_rt_sigreturn), .-VG_(arm_linux_SUBST_FOR_rt_sigreturn)
554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(arm_linux_REDIR_FOR_strlen)
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(arm_linux_REDIR_FOR_strlen):
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r2, r0
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r0, [r0, #0]	@ zero_extendqisi2
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ lr needed for prologue
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r0, #0
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bxeq	lr
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0, #0
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L5:
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r0, r0, #1
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r0, r2]	@ zero_extendqisi2
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r3, #0
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	.L5
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bx	lr
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_4
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.global VG_(arm_linux_REDIR_FOR_index)
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//VG_(arm_linux_REDIR_FOR_index):
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	ldrb	r3, [r0, #0]	@ zero_extendqisi2
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	and	r1, r1, #255
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	cmp	r3, r1
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	@ lr needed for prologue
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bne	.L9
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bx	lr
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.L12:
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	ldrb	r3, [r0, #1]!	@ zero_extendqisi2
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	cmp	r3, r1
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	beq	.L11
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.L9:
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	cmp	r3, #0
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bne	.L12
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	mov	r0, #0
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bx	lr
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//.L11:
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	bx	lr
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//	UD2_4
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(arm_linux_REDIR_FOR_memcpy)
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(arm_linux_REDIR_FOR_memcpy):
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stmfd	sp!, {r4, r5, lr}
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subs	lr, r2, #0
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r5, r0
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	.L2
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r0, r1
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bls	.L4
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r3, r0, lr
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1, lr, r1
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #3
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r4, r3, #1
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r0, r1, #1
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ble	.L28
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	ip, r3, #5
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r1, r1, #5
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L8:
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1, #4]	@ zero_extendqisi2
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	lr, lr, #4
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip, #4]
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r2, [r1, #3]	@ zero_extendqisi2
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #3
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r2, [ip, #3]
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1, #2]	@ zero_extendqisi2
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r4, ip
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip, #2]
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r2, [r1, #1]	@ zero_extendqisi2
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0, r1
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r2, [ip, #1]
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r1, r1, #4
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	ip, ip, #4
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bgt	.L8
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #0
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	.L2
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L28:
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r2, lr, #1
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L21:
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r2, r2, #1
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r0], #-1	@ zero_extendqisi2
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmn	r2, #1
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [r4], #-1
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	.L21
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L2:
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0, r5
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldmfd	sp!, {r4, r5, pc}
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L4:
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bcs	.L2
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #3
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	ip, r0
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ble	.L29
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L19:
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1, #0]	@ zero_extendqisi2
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	lr, lr, #4
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip, #0]
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r2, [r1, #1]	@ zero_extendqisi2
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #3
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r2, [ip, #1]
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1, #2]	@ zero_extendqisi2
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip, #2]
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r2, [r1, #3]	@ zero_extendqisi2
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1, r1, #4
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r2, [ip, #3]
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	ip, ip, #4
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bgt	.L19
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	lr, #0
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	.L2
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L29:
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r2, lr, #1
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.L20:
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r2, r2, #1
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3, [r1], #1	@ zero_extendqisi2
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmn	r2, #1
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3, [ip], #1
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	.L20
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0, r5
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldmfd	sp!, {r4, r5, pc}
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_4
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.global VG_(trampoline_stuff_end)
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* and a trailing page of unexecutable code */
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	UD2_PAGE
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_4
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_16
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_64
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_256
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_1024
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	undef UD2_PAGE
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------- arm64-linux ----------------*/
684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(VGP_arm64_linux)
686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#       define UD2_4      .word 0xFFFFFFFF
688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	define UD2_16     UD2_4    ; UD2_4    ; UD2_4    ; UD2_4
689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	/* a leading page of unexecutable code */
695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	UD2_PAGE
696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.global VG_(trampoline_stuff_start)
698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVG_(trampoline_stuff_start):
699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.global VG_(arm64_linux_SUBST_FOR_rt_sigreturn)
701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.type   VG_(arm64_linux_SUBST_FOR_rt_sigreturn),#function
702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVG_(arm64_linux_SUBST_FOR_rt_sigreturn):
703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	mov x8, # __NR_rt_sigreturn
704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        svc #0
705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        .long 0xFFFFFFFF /*illegal insn*/
706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.size VG_(arm64_linux_SUBST_FOR_rt_sigreturn), \
707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        .-VG_(arm64_linux_SUBST_FOR_rt_sigreturn)
708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7092ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.global VG_(arm64_linux_REDIR_FOR_strlen)
7102ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.type   VG_(arm64_linux_REDIR_FOR_strlen),#function
7112ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy IvanovVG_(arm64_linux_REDIR_FOR_strlen):
7122ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	mov	x2, x0
7132ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	ldrb	w0, [x0]
7142ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	cbz	w0, .L5
7152ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	mov	x0, 0
7162ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.L4:
7172ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	add	x0, x0, 1
7182ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	ldrb	w1, [x2,x0]
7192ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	cbnz	w1, .L4
7202ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	ret
7212ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.L5:
7222ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	mov	x0, 0
7232ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov	ret
7242ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.size VG_(arm64_linux_REDIR_FOR_strlen), .-VG_(arm64_linux_REDIR_FOR_strlen)
7252ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov
7262ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.global VG_(arm64_linux_REDIR_FOR_index)
7272ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.type   VG_(arm64_linux_REDIR_FOR_index),#function
7282ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy IvanovVG_(arm64_linux_REDIR_FOR_index):
7292ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ldrb    w2, [x0]
7302ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        uxtb    w1, w1
7312ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        cmp     w2, w1
7322ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        beq     .L11
7332ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.L13:
7342ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        cbz     w2, .L16
7352ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ldrb    w2, [x0,1]!
7362ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        cmp     w2, w1
7372ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        bne     .L13
7382ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.L11:
7392ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ret
7402ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.L16:
7412ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        mov     x0, 0
7422ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ret
7432ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.size VG_(arm64_linux_REDIR_FOR_index), .-VG_(arm64_linux_REDIR_FOR_index)
7442ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov
7452ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.global VG_(arm64_linux_REDIR_FOR_strcmp)
7462ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.type   VG_(arm64_linux_REDIR_FOR_strcmp),#function
7472ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy IvanovVG_(arm64_linux_REDIR_FOR_strcmp):
7482ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ldrb    w2, [x0]
7492ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ldrb    w3, [x1]
7502ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        cmp     w2, w3
7512ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        bcc     .L22
7522ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.L21:
7532ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        bhi     .L25
7542ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        cbz     w2, .L26
7552ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ldrb    w2, [x0,1]!
7562ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ldrb    w3, [x1,1]!
7572ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        cmp     w2, w3
7582ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        bcs     .L21
7592ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.L22:
7602ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        mov     x0, -1
7612ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ret
7622ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.L25:
7632ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        mov     x0, 1
7642ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ret
7652ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.L26:
7662ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        mov     x0, 0
7672ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov        ret
7682ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov.size VG_(arm64_linux_REDIR_FOR_strcmp), .-VG_(arm64_linux_REDIR_FOR_strcmp)
7692ca80a6a6fc069acdb73186e8e578dbf8f46af80Dmitriy Ivanov
770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.global VG_(trampoline_stuff_end)
771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVG_(trampoline_stuff_end):
772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	/* and a trailing page of unexecutable code */
774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	UD2_PAGE
775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_4
777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_16
778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_64
779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_256
780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_1024
781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_PAGE
782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- x86-darwin ----------------*/
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_x86_darwin)
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* a leading page of unexecutable code */
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.fill 2048, 2, 0x0b0f /* `ud2` */
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(trampoline_stuff_start)
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_SUBST_FOR_sigreturn)
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_SUBST_FOR_sigreturn):
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* XXX does this need to have any special form? (cf x86-linux
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	version) */
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    $ __NR_DARWIN_FAKE_SIGRETURN, %eax
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        int     $0x80
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ud2
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strlen)
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strlen):
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    4(%esp), %edx
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    %edx, %eax
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jmp     1f
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %eax
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    $0, (%eax)
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     0b
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        subl    %edx, %eax
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strcat)
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strcat):
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        pushl   %esi
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    8(%esp), %esi
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    12(%esp), %ecx
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    %esi, %edx
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jmp     1f
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %edx
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    $0, (%edx)
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     0b
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  (%ecx), %eax
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %ecx
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movb    %al, (%edx)
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %edx
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        testb   %al, %al
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     2b
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    %esi, %eax
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        popl    %esi
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strcmp)
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strcmp):
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    4(%esp), %edx
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movl    8(%esp), %ecx
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jmp     1f
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %edx
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incl    %ecx
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  (%edx), %eax
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        testb   %al, %al
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        je      2f
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    (%ecx), %al
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        je      0b
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  (%ecx),%edx
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movzbl  %al,%eax
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        subl    %edx, %eax
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strcpy)
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strcpy):
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%ebp
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esp, %ebp
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%esi
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	8(%ebp), %esi
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	12(%ebp), %ecx
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esi, %edx
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%ecx
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%edx
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%ecx), %eax
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%al, %al
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%al, (%edx)
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esi, %eax
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%esi
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leave
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(x86_darwin_REDIR_FOR_strlcat)
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(x86_darwin_REDIR_FOR_strlcat):
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%ebp
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esp, %ebp
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%edi
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%esi
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	$16, %esp
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	8(%ebp), %esi
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	16(%ebp), %ecx
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%esi, %edx
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leal	(%ecx,%esi), %eax
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%edx
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpl	%edx, %eax
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	2f
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%edx)
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%edx, %edi
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	%esi, %edi
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%ecx, %esi
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	%edi, %esi
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	3f
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	12(%ebp), %eax
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	6f
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown3:
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	12(%ebp), %eax
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movl	%eax, (%esp)
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	call	VG_(x86_darwin_REDIR_FOR_strlen)
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	7f
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown4:
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpl	$1, %esi
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	5f
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%cl, (%edx)
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	decl	%esi
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%edx
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown5:
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incl	%eax
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown6:
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%eax), %ecx
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%cl, %cl
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	4b
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	$0, (%edx)
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	12(%ebp), %eax
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown7:
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addl	$16, %esp
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leal	(%edi,%eax), %eax
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%esi
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%edi
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leave
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(trampoline_stuff_end)
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* a trailing page of unexecutable code */
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.fill 2048, 2, 0x0b0f /* `ud2` */
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- amd64-darwin ----------------*/
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_amd64_darwin)
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* a leading page of unexecutable code */
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.fill 2048, 2, 0x0b0f /* `ud2` */
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(trampoline_stuff_start)
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_start):
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_SUBST_FOR_sigreturn)
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_SUBST_FOR_sigreturn):
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* XXX does this need to have any special form? (cf x86-linux
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	version) */
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movq    $ __NR_DARWIN_FAKE_SIGRETURN, %rax
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        syscall
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ud2
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strlen)
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strlen):
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        movq    %rdi, %rax
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jmp     1f
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        incq    %rax
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpb    $0, (%rax)
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        jne     0b
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        subq    %rdi, %rax
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ret
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strcat)
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strcat):
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rdx
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rdx
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%rdx)
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rsi), %eax
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rsi
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%al, (%rdx)
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rdx
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%al, %al
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	2b
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rax
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strcmp)
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strcmp):
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rdi
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rsi
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rdi), %eax
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%al, %al
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	2f
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	(%rsi), %al
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	0b
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rsi), %edx
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	%al, %eax
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subl	%edx, %eax
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strcpy)
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strcpy):
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushq	%rbp
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rdx
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rsp, %rbp
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rsi
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rdx
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rsi), %eax
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%al, %al
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%al, (%rdx)
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leave
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rax
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_strlcat)
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_strlcat):
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushq	%rbp
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leaq	(%rdx,%rdi), %rax
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdi, %rcx
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rsp, %rbp
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushq	%rbx
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	$8, %rsp
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	1f
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown0:
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rcx
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown1:
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpq	%rcx, %rax
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	2f
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpb	$0, (%rcx)
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	0b
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown2:
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rcx, %rbx
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	%rdi, %rbx
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rdx, %rdi
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	%rbx, %rdi
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	3f
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rsi, %rax
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	6f
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown3:
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	%rsi, %rdi
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	call	VG_(amd64_darwin_REDIR_FOR_strlen)
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jmp	7f
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown4:
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpq	$1, %rdi
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	je	5f
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	%dl, (%rcx)
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	decq	%rdi
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rcx
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown5:
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	incq	%rax
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown6:
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movzbl	(%rax), %edx
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	testb	%dl, %dl
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jne	4b
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movb	$0, (%rcx)
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subq	%rsi, %rax
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown7:
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leaq	(%rbx,%rax), %rax
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addq	$8, %rsp
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popq	%rbx
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	leave
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(amd64_darwin_REDIR_FOR_arc4random)
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(amd64_darwin_REDIR_FOR_arc4random):
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* not very random, hope dyld won't mind */
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movq	$0x76616c6772696e64, %rax
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(trampoline_stuff_end)
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(trampoline_stuff_end):
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* a trailing page of unexecutable code */
1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.fill 2048, 2, 0x0b0f /* `ud2` */
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------- s390x-linux ----------------*/
1092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
1093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if defined(VGP_s390x_linux)
1094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /* a leading page of unexecutable code */
1096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	.fill 2048, 2, 0x0000
1097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.global VG_(trampoline_stuff_start)
1099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_(trampoline_stuff_start):
1100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.global VG_(s390x_linux_SUBST_FOR_sigreturn)
1102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_(s390x_linux_SUBST_FOR_sigreturn):
1103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        svc __NR_sigreturn
1104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	.short 0
1105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.global VG_(s390x_linux_SUBST_FOR_rt_sigreturn)
1107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_(s390x_linux_SUBST_FOR_rt_sigreturn):
1108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /* Old gcc unwinding code checks for a sig(_rt)_return svc and then
1109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           for ra = cfa to decide if it is a sig_rt_frame or not. Since we
1110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           set ra to this trampoline, but the cfa is still in the stack,
1111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           the unwinder thinks, that this is a non-rt frame  and causes a
1112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           crash in the gcc unwinder - which is used by the thread library
1113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           and others. Therefore we add a lr 1,1 nop, to let the gcc
1114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           unwinder bail out gracefully. This might also affect unwinding
1115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           across the signal frame - tough luck. fixs390 */
1116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        lr 1,1
1117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        svc __NR_rt_sigreturn
1118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	.short 0
1119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov.globl VG_(trampoline_stuff_end)
1121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_(trampoline_stuff_end):
1122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	.fill 2048, 2, 0x0000
1123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---------------------- mips32-linux ----------------------*/
1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#else
1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined(VGP_mips32_linux)
1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	define UD2_16     trap ; trap ; trap; trap
1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
1132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
1133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(trampoline_stuff_start)
1136663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(trampoline_stuff_start):
1137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(mips32_linux_SUBST_FOR_sigreturn)
1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(mips32_linux_SUBST_FOR_sigreturn):
1140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        li $v0,__NR_sigreturn
1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        syscall
1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        nop
1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .long 0	/*illegal insn*/
1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(mips32_linux_SUBST_FOR_rt_sigreturn)
1146663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(mips32_linux_SUBST_FOR_rt_sigreturn):
1147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	li $v0,__NR_rt_sigreturn
1148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        syscall
1149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        nop
1150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        .long 0	/*illegal insn*/
1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* There's no particular reason that this needs to be handwritten
1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assembly, but since that's what this file contains, here's a
1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   simple strlen implementation (written in C and compiled by gcc.)
1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/
1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(mips32_linux_REDIR_FOR_strlen)
1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.type   VG_(mips32_linux_REDIR_FOR_strlen), @function
1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(mips32_linux_REDIR_FOR_strlen):
1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      li $v0, 0
1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      //la $a0, string
1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      j strlen_cond
1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   strlen_loop:
1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addi $v0, $v0, 1
1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addi $a0, $a0, 1
1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   strlen_cond:
1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      lbu $t0, ($a0)
1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      bne $t0, $zero, strlen_loop
1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    jr $ra
1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.size VG_(mips32_linux_REDIR_FOR_strlen), .-VG_(mips32_linux_REDIR_FOR_strlen)
1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(trampoline_stuff_end)
1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(trampoline_stuff_end):
1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	undef UD2_16
1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	undef UD2_64
1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	undef UD2_256
1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	undef UD2_1024
1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	undef UD2_PAGE
1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---------------------- mips64-linux ----------------------*/
1183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
1184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(VGP_mips64_linux)
1185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#       define UD2_16     trap ; trap ; trap; trap
1187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#       define UD2_64     UD2_16   ; UD2_16   ; UD2_16   ; UD2_16
1188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#       define UD2_256    UD2_64   ; UD2_64   ; UD2_64   ; UD2_64
1189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#       define UD2_1024   UD2_256  ; UD2_256  ; UD2_256  ; UD2_256
1190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#       define UD2_PAGE   UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024
1191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.global VG_(trampoline_stuff_start)
1193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVG_(trampoline_stuff_start):
1194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.global VG_(mips64_linux_SUBST_FOR_rt_sigreturn)
1196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVG_(mips64_linux_SUBST_FOR_rt_sigreturn):
1197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        li $2,__NR_rt_sigreturn
1198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        syscall
1199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        nop
1200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        .long 0	/*illegal insn*/
1201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* There's no particular reason that this needs to be handwritten
1203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assembly, but since that's what this file contains, here's a
1204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   simple strlen implementation (written in C and compiled by gcc.)
1205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
1206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.global VG_(mips64_linux_REDIR_FOR_strlen)
1207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.type   VG_(mips64_linux_REDIR_FOR_strlen), @function
1208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVG_(mips64_linux_REDIR_FOR_strlen):
1209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        lbu $12, 0($4)
1210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        li  $13, 0
1211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        beq $12, $0, M01
1212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        nop
1213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovM02:
1215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        addiu $13, $13, 1
1216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        addiu $4, $4, 1
1217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        lbu $12, 0($4)
1218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        bne $12, $0, M02
1219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        nop
1220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovM01:
1222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        move $2, $13
1223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        jr $31
1224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        nop
1225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.size VG_(mips64_linux_REDIR_FOR_strlen), .-VG_(mips64_linux_REDIR_FOR_strlen)
1227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov.global VG_(trampoline_stuff_end)
1229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovVG_(trampoline_stuff_end):
1230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_16
1233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_64
1234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_256
1235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_1024
1236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#	undef UD2_PAGE
1237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------- unknown ----------------*/
1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  error Unknown platform
1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
1250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
1251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
1252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGO_linux)
1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Let the linker know we don't need an executable stack */
1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  if defined(VGP_arm_linux)
1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   .section .note.GNU-stack,"",%progbits
1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  else
1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   .section .note.GNU-stack,"",@progbits
1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  endif
1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
1266