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