/* Darwin support for GDB, the GNU debugger.
   Copyright (C) 1997-2023 Free Software Foundation, Inc.

   Contributed by Apple Computer, 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 3 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, see <http://www.gnu.org/licenses/>.  */

/* The name of the ppc_thread_state structure, and the names of its
   members, have been changed for Unix conformance reasons.  The easiest
   way to have gdb build on systems with the older names and systems
   with the newer names is to build this compilation unit with the
   non-conformant define below.  This doesn't seem to cause the resulting
   binary any problems but it seems like it could cause us problems in
   the future.  It'd be good to remove this at some point when compiling on
   Tiger is no longer important.  */

#include "defs.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "gdbcore.h"
#include "value.h"
#include "gdbcmd.h"
#include "inferior.h"
#include "gdbarch.h"

#include <sys/sysctl.h>

#include "darwin-nat.h"

#include <mach/thread_info.h>
#include <mach/thread_act.h>
#include <mach/task.h>
#include <mach/vm_map.h>
#include <mach/mach_port.h>
#include <mach/mach_init.h>
#include <mach/mach_vm.h>

#define CHECK_ARGS(what, args)                                      \
  do                                                                \
    {                                                               \
      if ((NULL == args) || ((args[0] != '0') && (args[1] != 'x'))) \
	error (_ ("%s must be specified with 0x..."), what);        \
    }                                                               \
  while (0)

#define PRINT_FIELD(structure, field) \
  gdb_printf (_ (#field ":\t%#lx\n"), (unsigned long) (structure)->field)

#define PRINT_TV_FIELD(structure, field)             \
  gdb_printf (_ (#field ":\t%u.%06u sec\n"),         \
	      (unsigned) (structure)->field.seconds, \
	      (unsigned) (structure)->field.microseconds)

#define task_self mach_task_self
#define task_by_unix_pid task_for_pid
#define port_name_array_t mach_port_array_t
#define port_type_array_t mach_port_array_t

static void
info_mach_tasks_command (const char *args, int from_tty)
{
  int sysControl[4];
  int count, index;
  size_t length;
  struct kinfo_proc *procInfo;

  sysControl[0] = CTL_KERN;
  sysControl[1] = KERN_PROC;
  sysControl[2] = KERN_PROC_ALL;

  sysctl (sysControl, 3, NULL, &length, NULL, 0);
  procInfo = (struct kinfo_proc *) xmalloc (length);
  sysctl (sysControl, 3, procInfo, &length, NULL, 0);

  count = (length / sizeof (struct kinfo_proc));
  gdb_printf (_ ("%d processes:\n"), count);
  for (index = 0; index < count; ++index)
    {
      kern_return_t result;
      mach_port_t taskPort;

      result = task_by_unix_pid (mach_task_self (),
				 procInfo[index].kp_proc.p_pid, &taskPort);
      if (KERN_SUCCESS == result)
	{
	  gdb_printf (_ ("    %s is %d has task %#x\n"),
		      procInfo[index].kp_proc.p_comm,
		      procInfo[index].kp_proc.p_pid, taskPort);
	}
      else
	{
	  gdb_printf (_ ("    %s is %d unknown task port\n"),
		      procInfo[index].kp_proc.p_comm,
		      procInfo[index].kp_proc.p_pid);
	}
    }

  xfree (procInfo);
}

static task_t
get_task_from_args (const char *args)
{
  task_t task;
  char *eptr;

  if (args == NULL || *args == 0)
    {
      if (inferior_ptid == null_ptid)
	gdb_printf (_ ("No inferior running\n"));

      darwin_inferior *priv = get_darwin_inferior (current_inferior ());

      return priv->task;
    }
  if (strcmp (args, "gdb") == 0)
    return mach_task_self ();
  task = strtoul (args, &eptr, 0);
  if (*eptr)
    {
      gdb_printf (_ ("cannot parse task id '%s'\n"), args);
      return TASK_NULL;
    }
  return task;
}

static void
info_mach_task_command (const char *args, int from_tty)
{
  union
  {
    struct task_basic_info basic;
    struct task_events_info events;
    struct task_thread_times_info thread_times;
  } task_info_data;

  kern_return_t result;
  unsigned int info_count;
  task_t task;

  task = get_task_from_args (args);
  if (task == TASK_NULL)
    return;

  gdb_printf (_ ("TASK_BASIC_INFO for 0x%x:\n"), task);
  info_count = TASK_BASIC_INFO_COUNT;
  result = task_info (task, TASK_BASIC_INFO,
		      (task_info_t) &task_info_data.basic, &info_count);
  MACH_CHECK_ERROR (result);

  PRINT_FIELD (&task_info_data.basic, suspend_count);
  PRINT_FIELD (&task_info_data.basic, virtual_size);
  PRINT_FIELD (&task_info_data.basic, resident_size);
  PRINT_TV_FIELD (&task_info_data.basic, user_time);
  PRINT_TV_FIELD (&task_info_data.basic, system_time);
  gdb_printf (_ ("\nTASK_EVENTS_INFO:\n"));
  info_count = TASK_EVENTS_INFO_COUNT;
  result = task_info (task, TASK_EVENTS_INFO,
		      (task_info_t) &task_info_data.events, &info_count);
  MACH_CHECK_ERROR (result);

  PRINT_FIELD (&task_info_data.events, faults);
#if 0
  PRINT_FIELD (&task_info_data.events, zero_fills);
  PRINT_FIELD (&task_info_data.events, reactivations);
#endif
  PRINT_FIELD (&task_info_data.events, pageins);
  PRINT_FIELD (&task_info_data.events, cow_faults);
  PRINT_FIELD (&task_info_data.events, messages_sent);
  PRINT_FIELD (&task_info_data.events, messages_received);
  gdb_printf (_ ("\nTASK_THREAD_TIMES_INFO:\n"));
  info_count = TASK_THREAD_TIMES_INFO_COUNT;
  result = task_info (task, TASK_THREAD_TIMES_INFO,
		      (task_info_t) &task_info_data.thread_times, &info_count);
  MACH_CHECK_ERROR (result);
  PRINT_TV_FIELD (&task_info_data.thread_times, user_time);
  PRINT_TV_FIELD (&task_info_data.thread_times, system_time);
}

static void
info_mach_ports_command (const char *args, int from_tty)
{
  port_name_array_t names;
  port_type_array_t types;
  unsigned int name_count, type_count;
  kern_return_t result;
  int index;
  task_t task;

  task = get_task_from_args (args);
  if (task == TASK_NULL)
    return;

  result = mach_port_names (task, &names, &name_count, &types, &type_count);
  MACH_CHECK_ERROR (result);

  gdb_assert (name_count == type_count);

  gdb_printf (_ ("Ports for task 0x%x:\n"), task);
  gdb_printf (_ ("port   type\n"));
  for (index = 0; index < name_count; ++index)
    {
      mach_port_t port = names[index];
      unsigned int j;

      struct type_descr
      {
	mach_port_type_t type;
	const char *name;
	mach_port_right_t right;
      };
      static struct type_descr descrs[]
	= { { MACH_PORT_TYPE_SEND, "send", MACH_PORT_RIGHT_SEND },
	    { MACH_PORT_TYPE_SEND_ONCE, "send-once",
	      MACH_PORT_RIGHT_SEND_ONCE },
	    { MACH_PORT_TYPE_RECEIVE, "receive", MACH_PORT_RIGHT_RECEIVE },
	    { MACH_PORT_TYPE_PORT_SET, "port-set", MACH_PORT_RIGHT_PORT_SET },
	    { MACH_PORT_TYPE_DEAD_NAME, "dead", MACH_PORT_RIGHT_DEAD_NAME } };

      gdb_printf (_ ("%04x: %08x "), port, types[index]);
      for (j = 0; j < sizeof (descrs) / sizeof (*descrs); j++)
	if (types[index] & descrs[j].type)
	  {
	    mach_port_urefs_t ref;
	    kern_return_t ret;

	    gdb_printf (_ (" %s("), descrs[j].name);
	    ret = mach_port_get_refs (task, port, descrs[j].right, &ref);
	    if (ret != KERN_SUCCESS)
	      gdb_printf (_ ("??"));
	    else
	      gdb_printf (_ ("%u"), ref);
	    gdb_printf (_ (" refs)"));
	  }

      if (task == task_self ())
	{
	  if (port == task_self ())
	    gdb_printf (_ (" gdb-task"));
	  else if (port == darwin_host_self)
	    gdb_printf (_ (" host-self"));
	  else if (port == darwin_ex_port)
	    gdb_printf (_ (" gdb-exception"));
	  else if (port == darwin_port_set)
	    gdb_printf (_ (" gdb-port_set"));
	  else if (inferior_ptid != null_ptid)
	    {
	      struct inferior *inf = current_inferior ();
	      darwin_inferior *priv = get_darwin_inferior (inf);

	      if (port == priv->task)
		gdb_printf (_ (" inferior-task"));
	      else if (port == priv->notify_port)
		gdb_printf (_ (" inferior-notify"));
	      else
		{
		  for (int k = 0; k < priv->exception_info.count; k++)
		    if (port == priv->exception_info.ports[k])
		      {
			gdb_printf (_ (" inferior-excp-port"));
			break;
		      }

		  for (darwin_thread_t *t : priv->threads)
		    {
		      if (port == t->gdb_port)
			{
			  gdb_printf (_ (" inferior-thread for 0x%x"),
				      priv->task);
			  break;
			}
		    }
		}
	    }
	}
      gdb_printf (_ ("\n"));
    }

  vm_deallocate (task_self (), (vm_address_t) names,
		 (name_count * sizeof (mach_port_t)));
  vm_deallocate (task_self (), (vm_address_t) types,
		 (type_count * sizeof (mach_port_type_t)));
}

static void
darwin_debug_port_info (task_t task, mach_port_t port)
{
  kern_return_t kret;
  mach_port_status_t status;
  mach_msg_type_number_t len = sizeof (status);

  kret = mach_port_get_attributes (task, port, MACH_PORT_RECEIVE_STATUS,
				   (mach_port_info_t) &status, &len);
  MACH_CHECK_ERROR (kret);

  gdb_printf (_ ("Port 0x%lx in task 0x%lx:\n"), (unsigned long) port,
	      (unsigned long) task);
  gdb_printf (_ ("  port set: 0x%x\n"), status.mps_pset);
  gdb_printf (_ ("     seqno: 0x%x\n"), status.mps_seqno);
  gdb_printf (_ ("   mscount: 0x%x\n"), status.mps_mscount);
  gdb_printf (_ ("    qlimit: 0x%x\n"), status.mps_qlimit);
  gdb_printf (_ ("  msgcount: 0x%x\n"), status.mps_msgcount);
  gdb_printf (_ ("  sorights: 0x%x\n"), status.mps_sorights);
  gdb_printf (_ ("   srights: 0x%x\n"), status.mps_srights);
  gdb_printf (_ (" pdrequest: 0x%x\n"), status.mps_pdrequest);
  gdb_printf (_ (" nsrequest: 0x%x\n"), status.mps_nsrequest);
  gdb_printf (_ ("     flags: 0x%x\n"), status.mps_flags);
}

static void
info_mach_port_command (const char *args, int from_tty)
{
  task_t task;
  mach_port_t port;

  CHECK_ARGS (_ ("Task and port"), args);
  sscanf (args, "0x%x 0x%x", &task, &port);

  darwin_debug_port_info (task, port);
}

static void
info_mach_threads_command (const char *args, int from_tty)
{
  thread_array_t threads;
  unsigned int thread_count;
  kern_return_t result;
  task_t task;
  int i;

  task = get_task_from_args (args);
  if (task == TASK_NULL)
    return;

  result = task_threads (task, &threads, &thread_count);
  MACH_CHECK_ERROR (result);

  gdb_printf (_ ("Threads in task %#x:\n"), task);
  for (i = 0; i < thread_count; ++i)
    {
      gdb_printf (_ ("    %#x\n"), threads[i]);
      mach_port_deallocate (task_self (), threads[i]);
    }

  vm_deallocate (task_self (), (vm_address_t) threads,
		 (thread_count * sizeof (thread_t)));
}

static void
info_mach_thread_command (const char *args, int from_tty)
{
  union
  {
    struct thread_basic_info basic;
  } thread_info_data;

  thread_t thread;
  kern_return_t result;
  unsigned int info_count;

  CHECK_ARGS (_ ("Thread"), args);
  sscanf (args, "0x%x", &thread);

  gdb_printf (_ ("THREAD_BASIC_INFO\n"));
  info_count = THREAD_BASIC_INFO_COUNT;
  result = thread_info (thread, THREAD_BASIC_INFO,
			(thread_info_t) &thread_info_data.basic, &info_count);
  MACH_CHECK_ERROR (result);

#if 0
  PRINT_FIELD (&thread_info_data.basic, user_time);
  PRINT_FIELD (&thread_info_data.basic, system_time);
#endif
  PRINT_FIELD (&thread_info_data.basic, cpu_usage);
  PRINT_FIELD (&thread_info_data.basic, run_state);
  PRINT_FIELD (&thread_info_data.basic, flags);
  PRINT_FIELD (&thread_info_data.basic, suspend_count);
  PRINT_FIELD (&thread_info_data.basic, sleep_time);
}

static const char *
unparse_protection (vm_prot_t p)
{
  switch (p)
    {
    case VM_PROT_NONE:
      return "---";
    case VM_PROT_READ:
      return "r--";
    case VM_PROT_WRITE:
      return "-w-";
    case VM_PROT_READ | VM_PROT_WRITE:
      return "rw-";
    case VM_PROT_EXECUTE:
      return "--x";
    case VM_PROT_EXECUTE | VM_PROT_READ:
      return "r-x";
    case VM_PROT_EXECUTE | VM_PROT_WRITE:
      return "-wx";
    case VM_PROT_EXECUTE | VM_PROT_WRITE | VM_PROT_READ:
      return "rwx";
    default:
      return "???";
    }
}

static const char *
unparse_inheritance (vm_inherit_t i)
{
  switch (i)
    {
    case VM_INHERIT_SHARE:
      return _ ("share");
    case VM_INHERIT_COPY:
      return _ ("copy ");
    case VM_INHERIT_NONE:
      return _ ("none ");
    default:
      return _ ("???  ");
    }
}

static const char *
unparse_share_mode (unsigned char p)
{
  switch (p)
    {
    case SM_COW:
      return _ ("cow");
    case SM_PRIVATE:
      return _ ("private");
    case SM_EMPTY:
      return _ ("empty");
    case SM_SHARED:
      return _ ("shared");
    case SM_TRUESHARED:
      return _ ("true-shrd");
    case SM_PRIVATE_ALIASED:
      return _ ("prv-alias");
    case SM_SHARED_ALIASED:
      return _ ("shr-alias");
    default:
      return _ ("???");
    }
}

static const char *
unparse_user_tag (unsigned int tag)
{
  switch (tag)
    {
    case 0:
      return _ ("default");
    case VM_MEMORY_MALLOC:
      return _ ("malloc");
    case VM_MEMORY_MALLOC_SMALL:
      return _ ("malloc_small");
    case VM_MEMORY_MALLOC_LARGE:
      return _ ("malloc_large");
    case VM_MEMORY_MALLOC_HUGE:
      return _ ("malloc_huge");
    case VM_MEMORY_SBRK:
      return _ ("sbrk");
    case VM_MEMORY_REALLOC:
      return _ ("realloc");
    case VM_MEMORY_MALLOC_TINY:
      return _ ("malloc_tiny");
    case VM_MEMORY_ANALYSIS_TOOL:
      return _ ("analysis_tool");
    case VM_MEMORY_MACH_MSG:
      return _ ("mach_msg");
    case VM_MEMORY_IOKIT:
      return _ ("iokit");
    case VM_MEMORY_STACK:
      return _ ("stack");
    case VM_MEMORY_GUARD:
      return _ ("guard");
    case VM_MEMORY_SHARED_PMAP:
      return _ ("shared_pmap");
    case VM_MEMORY_DYLIB:
      return _ ("dylib");
    case VM_MEMORY_APPKIT:
      return _ ("appkit");
    case VM_MEMORY_FOUNDATION:
      return _ ("foundation");
    default:
      return NULL;
    }
}

static void
darwin_debug_regions (task_t task, mach_vm_address_t address, int max)
{
  kern_return_t kret;
  vm_region_basic_info_data_64_t info, prev_info;
  mach_vm_address_t prev_address;
  mach_vm_size_t size, prev_size;

  mach_port_t object_name;
  mach_msg_type_number_t count;

  int nsubregions = 0;
  int num_printed = 0;

  count = VM_REGION_BASIC_INFO_COUNT_64;
  kret = mach_vm_region (task, &address, &size, VM_REGION_BASIC_INFO_64,
			 (vm_region_info_t) &info, &count, &object_name);
  if (kret != KERN_SUCCESS)
    {
      gdb_printf (_ ("No memory regions."));
      return;
    }
  memcpy (&prev_info, &info, sizeof (vm_region_basic_info_data_64_t));
  prev_address = address;
  prev_size = size;
  nsubregions = 1;

  for (;;)
    {
      int print = 0;
      int done = 0;

      address = prev_address + prev_size;

      /* Check to see if address space has wrapped around.  */
      if (address == 0)
	print = done = 1;

      if (!done)
	{
	  count = VM_REGION_BASIC_INFO_COUNT_64;
	  kret
	    = mach_vm_region (task, &address, &size, VM_REGION_BASIC_INFO_64,
			      (vm_region_info_t) &info, &count, &object_name);
	  if (kret != KERN_SUCCESS)
	    {
	      size = 0;
	      print = done = 1;
	    }
	}

      if (address != prev_address + prev_size)
	print = 1;

      if ((info.protection != prev_info.protection)
	  || (info.max_protection != prev_info.max_protection)
	  || (info.inheritance != prev_info.inheritance)
	  || (info.shared != prev_info.reserved)
	  || (info.reserved != prev_info.reserved))
	print = 1;

      if (print)
	{
	  gdb_printf (_ ("%s-%s %s/%s  %s %s %s"),
		      paddress (target_gdbarch (), prev_address),
		      paddress (target_gdbarch (), prev_address + prev_size),
		      unparse_protection (prev_info.protection),
		      unparse_protection (prev_info.max_protection),
		      unparse_inheritance (prev_info.inheritance),
		      prev_info.shared ? _ ("shrd") : _ ("priv"),
		      prev_info.reserved ? _ ("reserved") : _ ("not-rsvd"));

	  if (nsubregions > 1)
	    gdb_printf (_ (" (%d sub-rgn)"), nsubregions);

	  gdb_printf (_ ("\n"));

	  prev_address = address;
	  prev_size = size;
	  memcpy (&prev_info, &info, sizeof (vm_region_basic_info_data_64_t));
	  nsubregions = 1;

	  num_printed++;
	}
      else
	{
	  prev_size += size;
	  nsubregions++;
	}

      if ((max > 0) && (num_printed >= max))
	done = 1;

      if (done)
	break;
    }
}

static void
darwin_debug_regions_recurse (task_t task)
{
  mach_vm_address_t r_start;
  mach_vm_size_t r_size;
  natural_t r_depth;
  mach_msg_type_number_t r_info_size;
  vm_region_submap_short_info_data_64_t r_info;
  kern_return_t kret;
  struct ui_out *uiout = current_uiout;

  ui_out_emit_table table_emitter (uiout, 9, -1, "regions");

  if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
    {
      uiout->table_header (10, ui_left, "start", "Start");
      uiout->table_header (10, ui_left, "end", "End");
    }
  else
    {
      uiout->table_header (18, ui_left, "start", "Start");
      uiout->table_header (18, ui_left, "end", "End");
    }
  uiout->table_header (3, ui_left, "min-prot", "Min");
  uiout->table_header (3, ui_left, "max-prot", "Max");
  uiout->table_header (5, ui_left, "inheritence", "Inh");
  uiout->table_header (9, ui_left, "share-mode", "Shr");
  uiout->table_header (1, ui_left, "depth", "D");
  uiout->table_header (3, ui_left, "submap", "Sm");
  uiout->table_header (0, ui_noalign, "tag", "Tag");

  uiout->table_body ();

  r_start = 0;
  r_depth = 0;
  while (1)
    {
      const char *tag;

      r_info_size = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
      r_size = -1;
      kret = mach_vm_region_recurse (task, &r_start, &r_size, &r_depth,
				     (vm_region_recurse_info_t) &r_info,
				     &r_info_size);
      if (kret != KERN_SUCCESS)
	break;

      {
	ui_out_emit_tuple tuple_emitter (uiout, "regions-row");

	uiout->field_core_addr ("start", target_gdbarch (), r_start);
	uiout->field_core_addr ("end", target_gdbarch (), r_start + r_size);
	uiout->field_string ("min-prot",
			     unparse_protection (r_info.protection));
	uiout->field_string ("max-prot",
			     unparse_protection (r_info.max_protection));
	uiout->field_string ("inheritence",
			     unparse_inheritance (r_info.inheritance));
	uiout->field_string ("share-mode",
			     unparse_share_mode (r_info.share_mode));
	uiout->field_signed ("depth", r_depth);
	uiout->field_string ("submap",
			     r_info.is_submap ? _ ("sm ") : _ ("obj"));
	tag = unparse_user_tag (r_info.user_tag);
	if (tag)
	  uiout->field_string ("tag", tag);
	else
	  uiout->field_signed ("tag", r_info.user_tag);
      }

      uiout->text ("\n");

      if (r_info.is_submap)
	r_depth++;
      else
	r_start += r_size;
    }
}

static void
darwin_debug_region (task_t task, mach_vm_address_t address)
{
  darwin_debug_regions (task, address, 1);
}

static void
info_mach_regions_command (const char *args, int from_tty)
{
  task_t task;

  task = get_task_from_args (args);
  if (task == TASK_NULL)
    return;

  darwin_debug_regions (task, 0, -1);
}

static void
info_mach_regions_recurse_command (const char *args, int from_tty)
{
  task_t task;

  task = get_task_from_args (args);
  if (task == TASK_NULL)
    return;

  darwin_debug_regions_recurse (task);
}

static void
info_mach_region_command (const char *exp, int from_tty)
{
  struct value *val;
  mach_vm_address_t address;
  struct inferior *inf;

  expression_up expr = parse_expression (exp);
  val = evaluate_expression (expr.get ());
  if (TYPE_IS_REFERENCE (value_type (val)))
    {
      val = value_ind (val);
    }
  address = value_as_address (val);

  if (inferior_ptid == null_ptid)
    error (_ ("Inferior not available"));

  inf = current_inferior ();
  darwin_inferior *priv = get_darwin_inferior (inf);
  darwin_debug_region (priv->task, address);
}

static void
disp_exception (const darwin_exception_info *info)
{
  int i;

  gdb_printf (_ ("%d exceptions:\n"), info->count);
  for (i = 0; i < info->count; i++)
    {
      exception_mask_t mask = info->masks[i];

      gdb_printf (_ ("port 0x%04x, behavior: "), info->ports[i]);
      switch (info->behaviors[i])
	{
	case EXCEPTION_DEFAULT:
	  gdb_printf (_ ("default"));
	  break;
	case EXCEPTION_STATE:
	  gdb_printf (_ ("state"));
	  break;
	case EXCEPTION_STATE_IDENTITY:
	  gdb_printf (_ ("state-identity"));
	  break;
	default:
	  gdb_printf (_ ("0x%x"), info->behaviors[i]);
	}
      gdb_printf (_ (", masks:"));
      if (mask & EXC_MASK_BAD_ACCESS)
	gdb_printf (_ (" BAD_ACCESS"));
      if (mask & EXC_MASK_BAD_INSTRUCTION)
	gdb_printf (_ (" BAD_INSTRUCTION"));
      if (mask & EXC_MASK_ARITHMETIC)
	gdb_printf (_ (" ARITHMETIC"));
      if (mask & EXC_MASK_EMULATION)
	gdb_printf (_ (" EMULATION"));
      if (mask & EXC_MASK_SOFTWARE)
	gdb_printf (_ (" SOFTWARE"));
      if (mask & EXC_MASK_BREAKPOINT)
	gdb_printf (_ (" BREAKPOINT"));
      if (mask & EXC_MASK_SYSCALL)
	gdb_printf (_ (" SYSCALL"));
      if (mask & EXC_MASK_MACH_SYSCALL)
	gdb_printf (_ (" MACH_SYSCALL"));
      if (mask & EXC_MASK_RPC_ALERT)
	gdb_printf (_ (" RPC_ALERT"));
      if (mask & EXC_MASK_CRASH)
	gdb_printf (_ (" CRASH"));
      gdb_printf (_ ("\n"));
    }
}

static void
info_mach_exceptions_command (const char *args, int from_tty)
{
  kern_return_t kret;
  darwin_exception_info info;

  info.count = sizeof (info.ports) / sizeof (info.ports[0]);

  if (args != NULL)
    {
      if (strcmp (args, "saved") == 0)
	{
	  if (inferior_ptid == null_ptid)
	    gdb_printf (_ ("No inferior running\n"));

	  darwin_inferior *priv = get_darwin_inferior (current_inferior ());

	  disp_exception (&priv->exception_info);
	  return;
	}
      else if (strcmp (args, "host") == 0)
	{
	  /* FIXME: This needs a privileged host port!  */
	  kret = host_get_exception_ports (darwin_host_self, EXC_MASK_ALL,
					   info.masks, &info.count, info.ports,
					   info.behaviors, info.flavors);
	  MACH_CHECK_ERROR (kret);
	  disp_exception (&info);
	}
      else
	error (_ ("Parameter is saved, host or none"));
    }
  else
    {
      struct inferior *inf;

      if (inferior_ptid == null_ptid)
	gdb_printf (_ ("No inferior running\n"));
      inf = current_inferior ();

      darwin_inferior *priv = get_darwin_inferior (inf);

      kret = task_get_exception_ports (priv->task, EXC_MASK_ALL, info.masks,
				       &info.count, info.ports, info.behaviors,
				       info.flavors);
      MACH_CHECK_ERROR (kret);
      disp_exception (&info);
    }
}

void _initialize_darwin_info_commands ();

void
_initialize_darwin_info_commands ()
{
  add_info ("mach-tasks", info_mach_tasks_command,
	    _ ("Get list of tasks in system."));
  add_info ("mach-ports", info_mach_ports_command,
	    _ ("Get list of ports in a task."));
  add_info ("mach-port", info_mach_port_command,
	    _ ("Get info on a specific port."));
  add_info ("mach-task", info_mach_task_command,
	    _ ("Get info on a specific task."));
  add_info ("mach-threads", info_mach_threads_command,
	    _ ("Get list of threads in a task."));
  add_info ("mach-thread", info_mach_thread_command,
	    _ ("Get info on a specific thread."));

  add_info ("mach-regions", info_mach_regions_command,
	    _ ("Get information on all mach region for the task."));
  add_info ("mach-regions-rec", info_mach_regions_recurse_command,
	    _ ("Get information on all mach sub region for the task."));
  add_info ("mach-region", info_mach_region_command,
	    _ ("Get information on mach region at given address."));

  add_info ("mach-exceptions", info_mach_exceptions_command,
	    _ ("Disp mach exceptions."));
}
