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