/* Interface GDB to Mach 3.0 operating systems.
(Most) Mach 3.0 related routines live in this file.
- Copyright (C) 1992 Free Software Foundation, Inc.
+ Copyright (C) 1992, 1996 Free Software Foundation, Inc.
This file is part of GDB.
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*
* Author: Jukka Virtanen <jtv@hut.fi>
\f
extern struct target_ops m3_ops;
+static void m3_kill_inferior ();
\f
#if 0
#define MACH_TYPE_EXCEPTION_PORT -1
}
}
else
- mid = 3735928559; /* 0x? :-) */
+ abort ();
new = (port_chain_t) obstack_alloc (port_chain_obstack,
sizeof (struct port_chain));
intercept_exec_calls (exec_counter)
int exec_counter;
{
+ int terminal_initted = 0;
+
struct syscall_msg_t {
mach_msg_header_t header;
mach_msg_type_t type;
original_exec_reply = syscall_in.header.msgh_remote_port;
syscall_in.header.msgh_remote_port = exec_reply_send;
}
+
+ if (!terminal_initted)
+ {
+ /* Now that the child has exec'd we know it has already set its
+ process group. On POSIX systems, tcsetpgrp will fail with
+ EPERM if we try it before the child's setpgid. */
+
+ /* Set up the "saved terminal modes" of the inferior
+ based on what modes we are starting it with. */
+ target_terminal_init ();
+
+ /* Install inferior's terminal modes. */
+ target_terminal_inferior ();
+
+ terminal_initted = 1;
+ }
+
exec_counter--;
}
CHK ("Could not abort system calls when selecting a thread", ret);
stop_pc = read_pc();
- set_current_frame (create_new_frame (read_register (FP_REGNUM),
- stop_pc));
+ flush_cached_frames ();
select_frame (get_current_frame (), 0);
-
- stop_frame_address = FRAME_FP (get_current_frame ());
}
return KERN_SUCCESS;
/* Do this in gdb after doing FORK but before STARTUP_INFERIOR.
* Note that the registers are not yet valid in the inferior task.
*/
-static void
+static int
m3_trace_him (pid)
int pid;
{
kern_return_t ret;
+ push_target (&m3_ops);
+
inferior_task = task_by_pid (pid);
if (! MACH_PORT_VALID (inferior_task))
/* One trap to exec the shell, one to exec the program being debugged. */
intercept_exec_calls (2);
+
+ return pid;
}
setup_exception_port ()
Returns the inferior_pid for rest of gdb.
Side effects: Set *OURSTATUS. */
int
-mach_really_wait (ourstatus)
+mach_really_wait (pid, ourstatus)
+ int pid;
struct target_waitstatus *ourstatus;
{
- int pid;
kern_return_t ret;
int w;
return;
}
+#if 0
+/* bogus bogus bogus. It is NOT OK to quit out of target_wait. */
+
/* If ^C is typed when we are waiting for a message
* and your Unix server is able to notice that we
* should quit now.
if (mach_really_waiting)
immediate_quit = 1;
}
+#endif
/*
* Gdb message server.
sprintf(buf, "_t%d", id);
}
else
- return (one_cproc->cthread->name);
+ return (char *)(one_cproc->cthread->name);
else
{
if (id < 0)
if (! symaddr)
{
- msymbol = lookup_minimal_symbol (name, (struct objfile *) NULL);
+ msymbol = lookup_minimal_symbol (name, NULL, NULL);
if (msymbol && msymbol->type == mst_data)
symaddr = SYMBOL_VALUE_ADDRESS (msymbol);
if (ths.flags & TH_FLAGS_IDLE)
strcat (buf, "I");
- /* FIXME: May run afloul of arbitrary limit in printf_filtered. */
printf_filtered (TL_FORMAT,
slot,
mid,
continue; /* EMcM */
#endif
- /* FIXME: May run afloul of arbitrary limit in printf_filtered. */
printf_filtered (TL_FORMAT,
"-",
-neworder, /* Pseudo MID */
if (ths.flags & TH_FLAGS_IDLE)
strcat (buf, "I");
- /* FIXME: May run afloul of arbitrary limit in printf_filtered. */
printf_filtered (TL_FORMAT,
slot,
mid,
{
warning ("Could not suspend inferior threads.");
m3_kill_inferior ();
- return_to_top_level ();
+ return_to_top_level (RETURN_ERROR);
}
for (index = 0; index < thread_count; index++)
{
if (current_thread)
current_thread = saved_thread;
- return_to_top_level ();
+ return_to_top_level (RETURN_ERROR);
}
ret = thread_info (current_thread,
add_mach_specific_commands ()
{
- extern void condition_thread ();
-
/* Thread handling commands */
/* FIXME: Move our thread support into the generic thread.c stuff so we
add_cmd ("kill", class_run, thread_kill_command,
"Kill the specified thread MID from inferior task.",
&cmd_thread_list);
+#if 0
+ /* The rest of this support (condition_thread) was not merged. It probably
+ should not be merged in this form, but instead added to the generic GDB
+ thread support. */
add_cmd ("break", class_breakpoint, condition_thread,
"Breakpoint N will only be effective for thread MID or @SLOT\n\
If MID/@SLOT is omitted allow all threads to break at breakpoint",
&cmd_thread_list);
+#endif
/* Thread command shorthands (for backward compatibility) */
add_alias_cmd ("ts", "mthread select", 0, 0, &cmdlist);
add_alias_cmd ("tl", "mthread list", 0, 0, &cmdlist);
}
#endif DUMP_SYSCALL
+static void
+m3_stop ()
+{
+ error ("to_stop target function not implemented");
+}
+
struct target_ops m3_ops = {
"mach", /* to_shortname */
"Mach child process", /* to_longname */
m3_mourn_inferior, /* to_mourn_inferior */
m3_can_run, /* to_can_run */
0, /* to_notice_signals */
+ 0, /* to_thread_alive */
+ m3_stop, /* to_stop */
process_stratum, /* to_stratum */
0, /* to_next */
1, /* to_has_all_memory */