1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Support for doing system calls. syscall-amd64-darwin.S ---*/ 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This file is part of Valgrind, a dynamic binary instrumentation 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown framework. 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Copyright (C) 2000-2007 Julian Seward 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jseward@acm.org 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU General Public License as 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown published by the Free Software Foundation; either version 2 of the 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, or (at your option) any later version. 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown General Public License for more details. 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU General Public License 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown along with this program; if not, write to the Free Software 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02111-1307, USA. 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The GNU General Public License is contained in the file COPYING. 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_amd64_darwin) 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics_asm.h" 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_vkiscnums_asm.h" 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_guest_offsets.h" 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------------------*/ 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Perform a syscall for the client. This will run a syscall 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown with the client's specific per-thread signal mask. 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The structure of this function is such that, if the syscall is 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown interrupted by a signal, we can determine exactly what 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown execution state we were in with respect to the execution of 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the syscall by examining the value of %eip in the signal 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown handler. This means that we can always do the appropriate 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown thing to precisely emulate the kernel's signal/syscall 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown interactions. 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The syscall number is taken from the argument, even though it 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown should also be in guest_state->guest_RAX. The syscall result 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is written back to guest_state->guest_RAX on completion. 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Returns 0 if the syscall was successfully called (even if the 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syscall itself failed), or a -ve error code if one of the 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sigprocmasks failed (there's no way to determine which one 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown failed). 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(fixup_guest_state_after_syscall_interrupted) does the 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown thread state fixup in the case where we were interrupted by a 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown signal. 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Prototype: 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int ML_(do_syscall_for_client_WRK( 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int syscallno, // rdi 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* guest_state, // rsi 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const vki_sigset_t *sysmask, // rdx 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const vki_sigset_t *postmask, // rcx 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int sigsetSzB) // r8 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Note that sigsetSzB is totally ignored (and irrelevant). 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from vki_arch.h */ 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VKI_SIG_SETMASK 3 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* DO_SYSCALL MACH|MDEP|UNIX */ 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MACH 1 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MDEP 2 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define UNIX 3 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.macro DO_SYSCALL 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* save callee-saved regs */ 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pushq %rbp 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq %rsp, %rbp 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // stack is now aligned 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pushq %rdi // -8(%rbp) syscallno 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pushq %rsi // -16(%rbp) guest_state 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pushq %rdx // -24(%rbp) sysmask 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pushq %rcx // -32(%rbp) postmask 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pushq %r8 // -40(%rbp) sigsetSzB 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // stack is now aligned 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownL_$0_1: /* Even though we can't take a signal until the sigprocmask completes, 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown start the range early. 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown If rip is in the range [1,2), the syscall hasn't been started yet */ 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Set the signal mask which should be current during the syscall. */ 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* GrP fixme signals 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DDD: JRS fixme: use __NR___pthread_sigmask, not __NR_rt_sigprocmask 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq $__NR_rt_sigprocmask, %rax // syscall # 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq $VKI_SIG_SETMASK, %rdi // how 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq -24(%rbp), %rsi // sysmask 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq -32(%rbp), %rdx // postmask 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq -40(%rbp), %r10 // sigsetSzB in r10 not rcx 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DDD: fixme return address 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syscall 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jnc 7f // sigprocmask failed 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* OK, that worked. Now do the syscall proper. */ 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* 6 register parameters */ 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq -16(%rbp), %r11 /* r11 = VexGuestAMD64State * */ 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq OFFSET_amd64_RDI(%r11), %rdi 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq OFFSET_amd64_RSI(%r11), %rsi 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq OFFSET_amd64_RDX(%r11), %rdx 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq OFFSET_amd64_RCX(%r11), %r10 /* rcx is passed in r10 instead */ 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq OFFSET_amd64_R8(%r11), %r8 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq OFFSET_amd64_R9(%r11), %r9 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* 2 stack parameters plus return address (ignored by syscall) */ 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq OFFSET_amd64_RSP(%r11), %r11 /* r11 = simulated RSP */ 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq 16(%r11), %rax 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pushq %rax 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq 8(%r11), %rax 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pushq %rax 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* stack is currently aligned - return address misaligns */ 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq 0(%r11), %rax 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pushq %rax 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* syscallno */ 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq -8(%rbp), %rax 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* If rip==2, then the syscall was either just about 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to start, or was interrupted and the kernel was 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown restarting it. */ 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownL_$0_2: syscall 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownL_$0_3: /* In the range [3, 4), the syscall result is in %rax, 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown but hasn't been committed to RAX. */ 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* stack contents: 3 words for syscall above, plus our prologue */ 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown setc 0(%rsp) /* stash returned carry flag */ 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq -16(%rbp), %r11 /* r11 = VexGuestAMD64State * */ 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq %rax, OFFSET_amd64_RAX(%r11) /* save back to RAX */ 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq %rdx, OFFSET_amd64_RDX(%r11) /* save back to RDX */ 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.if $0 == UNIX 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* save carry flag to VEX */ 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown xor %rax, %rax 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movb 0(%rsp), %al 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq %rax, %rdi /* arg1 = new flag */ 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq %r11, %rsi /* arg2 = vex state */ 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addq $$24, %rsp /* remove syscall parameters */ 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown call _LibVEX_GuestAMD64_put_rflag_c 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.else 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addq $$24, %rsp /* remove syscall parameters*/ 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.endif 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownL_$0_4: /* Re-block signals. If eip is in [4,5), then the syscall 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is complete and we needn't worry about it. */ 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* GrP fixme signals 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DDD: JRS fixme: use __NR___pthread_sigmask, not __NR_rt_sigprocmask 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PUSH_di_si_dx_cx_8 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq $__NR_rt_sigprocmask, %rax // syscall # 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq $VKI_SIG_SETMASK, %rdi // how 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq %rcx, %rsi // postmask 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown xorq %rdx, %rdx // NULL 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq %r8, %r10 // sigsetSzB 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DDD: fixme return address 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syscall 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown POP_di_si_dx_cx_8 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jnc 7f // sigprocmask failed 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownL_$0_5: /* now safe from signals */ 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq $$0, %rax /* SUCCESS */ 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq %rbp, %rsp 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown popq %rbp 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ret 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* GrP fixme signals 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownL_$0_7: // failure: return 0x8000 | error code 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DDD: fixme return value 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movq %rbp, %rsp 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown popq %rbp 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ret 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.endmacro 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(do_syscall_for_client_unix_WRK) 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(do_syscall_for_client_unix_WRK): 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DO_SYSCALL UNIX 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(do_syscall_for_client_mach_WRK) 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(do_syscall_for_client_mach_WRK): 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DO_SYSCALL MACH 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(do_syscall_for_client_mdep_WRK) 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(do_syscall_for_client_mdep_WRK): 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DO_SYSCALL MDEP 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.data 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* export the ranges so that 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(fixup_guest_state_after_syscall_interrupted) can do the 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown right thing */ 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* eg MK_L_SCLASS_N(UNIX,99) produces L_3_99 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown since UNIX is #defined to 3 at the top of this file */ 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define FOO(scclass,labelno) L_##scclass##_##labelno 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MK_L_SCCLASS_N(scclass,labelno) FOO(scclass,labelno) 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_setup_MACH) 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_restart_MACH) 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_complete_MACH) 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_committed_MACH) 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_finished_MACH) 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_setup_MACH): .quad MK_L_SCCLASS_N(MACH,1) 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_restart_MACH): .quad MK_L_SCCLASS_N(MACH,2) 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_complete_MACH): .quad MK_L_SCCLASS_N(MACH,3) 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_committed_MACH): .quad MK_L_SCCLASS_N(MACH,4) 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_finished_MACH): .quad MK_L_SCCLASS_N(MACH,5) 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_setup_MDEP) 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_restart_MDEP) 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_complete_MDEP) 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_committed_MDEP) 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_finished_MDEP) 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_setup_MDEP): .quad MK_L_SCCLASS_N(MDEP,1) 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_restart_MDEP): .quad MK_L_SCCLASS_N(MDEP,2) 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_complete_MDEP): .quad MK_L_SCCLASS_N(MDEP,3) 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_committed_MDEP): .quad MK_L_SCCLASS_N(MDEP,4) 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_finished_MDEP): .quad MK_L_SCCLASS_N(MDEP,5) 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_setup_UNIX) 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_restart_UNIX) 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_complete_UNIX) 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_committed_UNIX) 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl ML_(blksys_finished_UNIX) 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_setup_UNIX): .quad MK_L_SCCLASS_N(UNIX,1) 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_restart_UNIX): .quad MK_L_SCCLASS_N(UNIX,2) 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_complete_UNIX): .quad MK_L_SCCLASS_N(UNIX,3) 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_committed_UNIX): .quad MK_L_SCCLASS_N(UNIX,4) 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(blksys_finished_UNIX): .quad MK_L_SCCLASS_N(UNIX,5) 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_amd64_darwin) 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end ---*/ 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 257