/* Copyright (C) 1994-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifdef __ASSEMBLER__

/* Get the Mach definitions of ENTRY and kernel_trap.  */
#include <mach/machine/syscall_sw.h>

/* The Mach definitions assume underscores should be prepended to
   symbol names.  Redefine them to do so only when appropriate.  */
#undef EXT
#undef LEXT
#define EXT(x) C_SYMBOL_NAME(x)
#define LEXT(x) C_SYMBOL_NAME(x##:)

/* For ELF we need to add the `.type' directive to make shared libraries
   work right.  */
#undef ENTRY
#define ENTRY(name) \
  .globl name; \
  .align ALIGN; \
  .type name,@function; \
  name:

#endif

/* This is invoked by things run when there is random lossage, before they
   try to do anything else.  Just to be safe, deallocate the reply port so
   bogons arriving on it don't foul up future RPCs.  */

#ifndef __ASSEMBLER__
#define FATAL_PREPARE_INCLUDE <mach/mig_support.h>
#define FATAL_PREPARE __mig_dealloc_reply_port (MACH_PORT_NULL)
#endif

/* sysdeps/mach/MACHINE/sysdep.h should define the following macros.  */

/* Produce a text assembler label for the C global symbol NAME.  */
#ifndef ENTRY
#define ENTRY(name) .error ENTRY not defined by sysdeps/mach/MACHINE/sysdep.h
/* This is not used on all machines.  */
#endif

/* Set variables ARGC, ARGV, and ENVP for the arguments
   left on the stack by the microkernel.  */
#ifndef SNARF_ARGS
#define SNARF_ARGS(argc, argv, envp)
#error SNARF_ARGS not defined by sysdeps/mach/MACHINE/sysdep.h
#endif

/* Call the C function FN with no arguments,
   on a stack starting at SP (as returned by *_cthread_init_routine).
   You don't need to deal with FN returning; it shouldn't.  */
#ifndef	CALL_WITH_SP
#define CALL_WITH_SP(fn, sp)
#error CALL_WITH_SP not defined by sysdeps/mach/MACHINE/sysdep.h
#endif

/* LOSE can be defined as the `halt' instruction or something
   similar which will cause the process to die in a characteristic
   way suggesting a bug.  */
#ifndef LOSE
#define	LOSE	({ volatile int zero = 0; zero / zero; })
#endif

/* One of these should be defined to specify the stack direction.  */
#if !defined (STACK_GROWTH_UP) && !defined (STACK_GROWTH_DOWN)
#error stack direction unspecified
#endif

/* Used by some assembly code.  */
#define C_SYMBOL_NAME(name)	name
