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