/* Mach 3.0 common definitions and global vars.

   Copyright 1992, 1993, 1994, 1996 Free Software Foundation, Inc.

   This file is part of GDB.

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

   This program 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 General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

#ifndef NM_M3_H
#define NM_M3_H

#include <mach.h>
#include "regcache.h"

/* Mach3 doesn't declare errno in <errno.h>.  */
extern int errno;

/* Task port of our debugged inferior. */

extern task_t inferior_task;

/* Thread port of the current thread in the inferior. */

extern thread_t current_thread;

/* If nonzero, we must suspend/abort && resume threads
 * when setting or getting the state.
 */
extern int must_suspend_thread;

#define PREPARE_TO_PROCEED(select_it) mach3_prepare_to_proceed(select_it)

/* Try to get the privileged host port for authentication to machid

 * If you can get this, you may debug anything on this host.
 *
 * If you can't, gdb gives it's own task port as the
 * authentication port
 */
#define  mach_privileged_host_port() task_by_pid(-1)

/*
 * This is the MIG ID number of the emulator/server bsd_execve() RPC call.
 *
 * It SHOULD never change, but if it does, gdb `run'
 * command won't work until you fix this define.
 * 
 */
#define MIG_EXEC_SYSCALL_ID		101000

/* If our_message_port gets a msg with this ID,
 * GDB suspends it's inferior and enters command level.
 * (Useful at least if ^C does not work)
 */
#define GDB_MESSAGE_ID_STOP			0x41151

/* wait3 WNOHANG is defined in <sys/wait.h> but
 * for some reason gdb does not want to include
 * that file.
 *
 * If your system defines WNOHANG differently, this has to be changed.
 */
#define WNOHANG 1

/* Before storing, we need to read all the registers.  */

#define CHILD_PREPARE_TO_STORE() read_register_bytes (0, NULL, REGISTER_BYTES)

/* Check if the inferior exists */
#define MACH_ERROR_NO_INFERIOR \
  do if (!MACH_PORT_VALID (inferior_task)) \
  	error ("Inferior task does not exist."); while(0)

/* Error handler for mach calls */
#define CHK(str,ret)	\
  do if (ret != KERN_SUCCESS) \
       error ("Gdb %s [%d] %s : %s\n",__FILE__,__LINE__,str, \
	      mach_error_string(ret)); while(0)

/* This is from POE9 emulator/emul_stack.h
 */
/*
 * Top of emulator stack holds link and reply port.
 */
struct emul_stack_top
  {
    struct emul_stack_top *link;
    mach_port_t reply_port;
  };

#define EMULATOR_STACK_SIZE (4096*4)

#define THREAD_ALLOWED_TO_BREAK(mid) mach_thread_for_breakpoint (mid)

#define THREAD_PARSE_ID(arg) mach_thread_parse_id (arg)

#define THREAD_OUTPUT_ID(mid) mach_thread_output_id (mid)

#define ATTACH_TO_THREAD attach_to_thread

/* Don't do wait_for_inferior on attach.  */
#define ATTACH_NO_WAIT

/* Do Mach 3 dependent operations when ^C or a STOP is requested */
#define DO_QUIT() mach3_quit ()

#if 0
/* This is bogus.  It is NOT OK to quit out of target_wait.  */
/* If in mach_msg() and ^C is typed set immediate_quit */
#define REQUEST_QUIT() mach3_request_quit ()
#endif

#endif /* NM_M3_H */
