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