diff options
author | Jim Kingdon <jkingdon@engr.sgi.com> | 1993-10-15 04:26:06 +0000 |
---|---|---|
committer | Jim Kingdon <jkingdon@engr.sgi.com> | 1993-10-15 04:26:06 +0000 |
commit | 5d76c8e66273baf43bfee19c3341e605d4a09ad8 (patch) | |
tree | 5db705f610608b293aed609977860b76ae5b272b /gdb/m3-nat.c | |
parent | 8c4731b588620a52771117864c29f4ab1b6bc892 (diff) | |
download | gdb-5d76c8e66273baf43bfee19c3341e605d4a09ad8.zip gdb-5d76c8e66273baf43bfee19c3341e605d4a09ad8.tar.gz gdb-5d76c8e66273baf43bfee19c3341e605d4a09ad8.tar.bz2 |
* fork-child.c (fork_inferior), remote-eb.c (eb_create_inferior),
remote-mon.c (monitor_create_inferior), remote-nindy.c
(nindy_create_inferior), remote-st.c (st2000_create_inferior),
remote-vx.c (vx_create_inferior): Remove CREATE_INFERIOR_HOOK; it
is replaced by init_trace_fun.
* config/convex/xm-convex.h, convex-xdep.c: Add comments explaining
how to do without CREATE_INFERIOR_HOOK for whoever fixes the Convex
port.
* Makefile.in: Add Mach files to ALLDEPFILES, etc.
* m3-nat.c: Clean up more hair--message(), cprocs.
* configure.in: Recognize Mach targets and hosts.
* config/ns32k/tm-umax.h: Add some #ifndef's so tm-ns32km3.h can
include this file.
* Mach headers in config/*/tm-*.h: Fix includes to match correct
locations of files.
Diffstat (limited to 'gdb/m3-nat.c')
-rw-r--r-- | gdb/m3-nat.c | 389 |
1 files changed, 228 insertions, 161 deletions
diff --git a/gdb/m3-nat.c b/gdb/m3-nat.c index 747c7b3..66a21e5 100644 --- a/gdb/m3-nat.c +++ b/gdb/m3-nat.c @@ -67,14 +67,44 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <cthreads.h> -/* - * Mis-use the struct cproc busy field in the copy of - * the cproc in gdb's address space. - * - * This *can* be done otherwise, but I'm too lazy. - * (Don't tell anyone :-) - */ -#define CPROC_REVERSE_MAP(x) ((x)->busy) +/* This is what a cproc looks like. This is here partly because + cthread_internals.h is not a header we can just #include, partly with + an eye towards perhaps getting this to work with cross-debugging + someday. Best solution is if CMU publishes a real interface to this + stuff. */ +#define CPROC_NEXT_OFFSET 0 +#define CPROC_NEXT_SIZE (TARGET_PTR_BIT / HOST_CHAR_BIT) +#define CPROC_INCARNATION_OFFSET (CPROC_NEXT_OFFSET + CPROC_NEXT_SIZE) +#define CPROC_INCARNATION_SIZE (sizeof (cthread_t)) +#define CPROC_LIST_OFFSET (CPROC_INCARNATION_OFFSET + CPROC_INCARNATION_SIZE) +#define CPROC_LIST_SIZE (TARGET_PTR_BIT / HOST_CHAR_BIT) +#define CPROC_WAIT_OFFSET (CPROC_LIST_OFFSET + CPROC_LIST_SIZE) +#define CPROC_WAIT_SIZE (TARGET_PTR_BIT / HOST_CHAR_BIT) +#define CPROC_REPLY_OFFSET (CPROC_WAIT_OFFSET + CPROC_WAIT_SIZE) +#define CPROC_REPLY_SIZE (sizeof (mach_port_t)) +#define CPROC_CONTEXT_OFFSET (CPROC_REPLY_OFFSET + CPROC_REPLY_SIZE) +#define CPROC_CONTEXT_SIZE (TARGET_INT_BIT / HOST_CHAR_BIT) +#define CPROC_LOCK_OFFSET (CPROC_CONTEXT_OFFSET + CPROC_CONTEXT_SIZE) +#define CPROC_LOCK_SIZE (sizeof (spin_lock_t)) +#define CPROC_STATE_OFFSET (CPROC_LOCK_OFFSET + CPROC_LOCK_SIZE) +#define CPROC_STATE_SIZE (TARGET_INT_BIT / HOST_CHAR_BIT) +#define CPROC_WIRED_OFFSET (CPROC_STATE_OFFSET + CPROC_STATE_SIZE) +#define CPROC_WIRED_SIZE (sizeof (mach_port_t)) +#define CPROC_BUSY_OFFSET (CPROC_WIRED_OFFSET + CPROC_WIRED_SIZE) +#define CPROC_BUSY_SIZE (TARGET_INT_BIT / HOST_CHAR_BIT) +#define CPROC_MSG_OFFSET (CPROC_BUSY_OFFSET + CPROC_BUSY_SIZE) +#define CPROC_MSG_SIZE (sizeof (mach_msg_header_t)) +#define CPROC_BASE_OFFSET (CPROC_MSG_OFFSET + CPROC_MSG_SIZE) +#define CPROC_BASE_SIZE (TARGET_INT_BIT / HOST_CHAR_BIT) +#define CPROC_SIZE_OFFSET (CPROC_BASE_OFFSET + CPROC_BASE_SIZE) +#define CPROC_SIZE_SIZE (TARGET_INT_BIT / HOST_CHAR_BIT) +#define CPROC_SIZE (CPROC_SIZE_OFFSET + CPROC_SIZE_SIZE) + +/* Values for the state field in the cproc. */ +#define CPROC_RUNNING 0 +#define CPROC_SWITCHING 1 +#define CPROC_BLOCKED 2 +#define CPROC_CONDWAIT 4 /* For cproc and kernel thread mapping */ typedef struct gdb_thread { @@ -82,9 +112,23 @@ typedef struct gdb_thread { CORE_ADDR sp; CORE_ADDR pc; CORE_ADDR fp; - cproc_t cproc; boolean_t in_emulator; int slotid; + + /* This is for the mthreads list. It points to the cproc list. + Perhaps the two lists should be merged (or perhaps it was a mistake + to make them both use a struct gdb_thread). */ + struct gdb_thread *cproc; + + /* These are for the cproc list, which is linked through the next field + of the struct gdb_thread. */ + char raw_cproc[CPROC_SIZE]; + /* The cthread which is pointed to by the incarnation field from the + cproc. This points to the copy we've read into GDB. */ + cthread_t cthread; + /* Point back to the mthreads list. */ + int reverse_map; + struct gdb_thread *next; } *gdb_thread_t; /* @@ -136,7 +180,7 @@ char *fmt; int a,b,c; { if (debug_level) - message (fmt, a, b, c); + warning (fmt, a, b, c); } /* This is in libmach.a */ @@ -253,7 +297,7 @@ port_chain_insert (list, name, type) { if (! MACH_PORT_VALID (mid_server)) { - message ("Machid server port invalid, can not map port 0x%x to MID", + warning ("Machid server port invalid, can not map port 0x%x to MID", name); mid = name; } @@ -263,7 +307,7 @@ port_chain_insert (list, name, type) if (ret != KERN_SUCCESS) { - message ("Can not map name (0x%x) to MID with machid", name); + warning ("Can not map name (0x%x) to MID with machid", name); mid = name; } } @@ -342,7 +386,7 @@ int type; if (! MACH_PORT_VALID (mid_server)) { - message ("Machid server port invalid, can not map port 0x%x to mid", + warning ("Machid server port invalid, can not map port 0x%x to mid", name); return -1; } @@ -355,7 +399,7 @@ int type; if (ret != KERN_SUCCESS) { - message ("Can not map name (0x%x) to mid with machid", name); + warning ("Can not map name (0x%x) to mid with machid", name); return -1; } return mid; @@ -394,7 +438,7 @@ setup_single_step (thread, start_step) { if (MACH_PORT_VALID (singlestepped_thread_port)) { - message ("Singlestepped_thread_port (0x%x) is still valid?", + warning ("Singlestepped_thread_port (0x%x) is still valid?", singlestepped_thread_port); singlestepped_thread_port = MACH_PORT_NULL; } @@ -941,7 +985,7 @@ select_thread (task, thread_id, flag) ret = task_threads (task, &thread_list, &thread_count); if (ret != KERN_SUCCESS) { - message ("Can not select a thread from a dead task"); + warning ("Can not select a thread from a dead task"); kill_inferior (); return KERN_FAILURE; } @@ -952,7 +996,7 @@ select_thread (task, thread_id, flag) * exists as a container for memory and ports. */ registers_changed (); - message ("Task %d has no threads", + warning ("Task %d has no threads", map_port_name_to_mid (task, MACH_TYPE_TASK)); current_thread = MACH_PORT_NULL; (void) vm_deallocate(mach_task_self(), @@ -1055,7 +1099,7 @@ switch_to_thread (new_thread) mid = map_port_name_to_mid (new_thread, MACH_TYPE_THREAD); if (mid == -1) - message ("Can't map thread name 0x%x to mid", new_thread); + warning ("Can't map thread name 0x%x to mid", new_thread); else if (select_thread (inferior_task, mid, 1) != KERN_SUCCESS) { if (current_thread) @@ -1224,7 +1268,7 @@ mach_really_wait (w) (WIFEXITED(*w) && WEXITSTATUS(*w) > 0377)) { WSETEXIT(*w, 0); - message ("Using exit value 0 for terminated task"); + warning ("Using exit value 0 for terminated task"); } else if (!WIFEXITED(*w)) { @@ -1232,11 +1276,11 @@ mach_really_wait (w) /* Signals cause problems. Warn the user. */ if (sig != SIGKILL) /* Bad luck if garbage matches this */ - message ("The terminating signal stuff may be nonsense"); + warning ("The terminating signal stuff may be nonsense"); else if (sig > NSIG) { WSETEXIT(*w, 0); - message ("Using exit value 0 for terminated task"); + warning ("Using exit value 0 for terminated task"); } } return inferior_pid; @@ -1293,7 +1337,7 @@ mach3_quit () if (ret != KERN_SUCCESS) { - message ("Could not suspend task for interrupt: %s", + warning ("Could not suspend task for interrupt: %s", mach_error_string (ret)); mach_really_waiting = 0; return; @@ -1306,7 +1350,7 @@ mach3_quit () mid = map_port_name_to_mid (current_thread, MACH_TYPE_THREAD); if (mid == -1) { - message ("Selecting first existing kernel thread"); + warning ("Selecting first existing kernel thread"); mid = 0; } @@ -1349,7 +1393,7 @@ gdb_message_server (InP) case GDB_MESSAGE_ID_STOP: ret = task_suspend (inferior_task); if (ret != KERN_SUCCESS) - message ("Could not suspend task for stop message: %s", + warning ("Could not suspend task for stop message: %s", mach_error_string (ret)); /* QUIT in mach_really_wait() loop. */ @@ -1357,7 +1401,7 @@ gdb_message_server (InP) break; default: - message ("Invalid message id %d received, ignored.", + warning ("Invalid message id %d received, ignored.", InP->msgh_id); break; } @@ -1646,7 +1690,7 @@ catch_exception_raise (port, thread, task, exception, code, subcode) if (select_thread (inferior_task, mid, 0) != KERN_SUCCESS) error ("Could not select thread %d causing exception", mid); else - message ("Gdb selected thread %d", mid); + warning ("Gdb selected thread %d", mid); } /* If we receive an exception that is not breakpoint @@ -1656,7 +1700,7 @@ catch_exception_raise (port, thread, task, exception, code, subcode) if (MACH_PORT_VALID (singlestepped_thread_port)) { if (stop_exception != EXC_BREAKPOINT) - message ("Single step interrupted by exception"); + warning ("Single step interrupted by exception"); else if (port == singlestepped_thread_port) { /* Single step exception occurred, remove trace bit @@ -1669,7 +1713,7 @@ catch_exception_raise (port, thread, task, exception, code, subcode) resume_all_threads (0); } else - message ("Breakpoint while single stepping?"); + warning ("Breakpoint while single stepping?"); discard_single_step (current_thread); } @@ -1746,7 +1790,7 @@ mach3_read_inferior (addr, myaddr, length) screw it. Eamonn seems to like this, so I enable it if OSF is defined... */ - message ("[read inferior %x failed: %s]", + warning ("[read inferior %x failed: %s]", addr, mach_error_string (ret)); errno = 0; #endif @@ -1852,7 +1896,7 @@ mach3_write_inferior (addr, myaddr, length) /* Check for holes in memory */ if (old_address != region_address) { - message ("No memory at 0x%x. Nothing written", + warning ("No memory at 0x%x. Nothing written", old_address); ret = KERN_SUCCESS; length = 0; @@ -1861,7 +1905,7 @@ mach3_write_inferior (addr, myaddr, length) if (!(max_protection & VM_PROT_WRITE)) { - message ("Memory at address 0x%x is unwritable. Nothing written", + warning ("Memory at address 0x%x is unwritable. Nothing written", old_address); ret = KERN_SUCCESS; length = 0; @@ -1940,7 +1984,7 @@ mach3_write_inferior (addr, myaddr, length) if (ret != KERN_SUCCESS) { - message ("%s %s", errstr, mach_error_string (ret)); + warning ("%s %s", errstr, mach_error_string (ret)); return 0; } @@ -1982,22 +2026,21 @@ int state; } static char * -translate_cstate(state) -int state; +translate_cstate (state) + int state; { - switch (state) { - case CPROC_RUNNING: return "R"; - case CPROC_SWITCHING: return "S"; - case CPROC_BLOCKED: return "B"; - case CPROC_CONDWAIT: return "C"; - case CPROC_CONDWAIT|CPROC_SWITCHING: - return "CS"; - default: return "?"; - } + switch (state) + { + case CPROC_RUNNING: return "R"; + case CPROC_SWITCHING: return "S"; + case CPROC_BLOCKED: return "B"; + case CPROC_CONDWAIT: return "C"; + case CPROC_CONDWAIT|CPROC_SWITCHING: return "CS"; + default: return "?"; + } } -/* type == MACH_MSG_TYPE_COPY_SEND || type == MACH_MSG_TYPE_MAKE_SEND - */ +/* type == MACH_MSG_TYPE_COPY_SEND || type == MACH_MSG_TYPE_MAKE_SEND */ mach_port_t /* no mach_port_name_t found in include files. */ map_inferior_port_name (inferior_name, type) @@ -2041,26 +2084,26 @@ static char buf[7]; static char * get_thread_name (one_cproc, id) - cproc_t one_cproc; + gdb_thread_t one_cproc; int id; { if (one_cproc) - if (one_cproc->incarnation == NULL) + if (one_cproc->cthread == NULL) { /* cproc not mapped to any cthread */ sprintf(buf, "_C%d", id); } - else if (! one_cproc->incarnation->name) + else if (! one_cproc->cthread->name) { /* cproc and cthread, but no name */ sprintf(buf, "_t%d", id); } else - return (one_cproc->incarnation->name); + return (one_cproc->cthread->name); else { if (id < 0) - message ("Inconsistency in thread name id %d", id); + warning ("Inconsistency in thread name id %d", id); /* Kernel thread without cproc */ sprintf(buf, "_K%d", id); @@ -2083,7 +2126,7 @@ fetch_thread_info (task, mthreads_out) ret = task_threads (task, &th_table, &th_count); if (ret != KERN_SUCCESS) { - message ("Error getting inferior's thread list:%s", + warning ("Error getting inferior's thread list:%s", mach_error_string(ret)); kill_inferior (); return -1; @@ -2130,7 +2173,7 @@ fetch_thread_info (task, mthreads_out) (th_count * sizeof(mach_port_t))); if (ret != KERN_SUCCESS) { - message ("Error trying to deallocate thread list : %s", + warning ("Error trying to deallocate thread list : %s", mach_error_string (ret)); } @@ -2157,7 +2200,7 @@ fetch_usp_from_emulator_stack (sp) &stack_pointer, sizeof (CORE_ADDR)) != sizeof (CORE_ADDR)) { - message ("Can't read user sp from emulator stack address 0x%x", sp); + warning ("Can't read user sp from emulator stack address 0x%x", sp); return 0; } @@ -2211,7 +2254,7 @@ have_emulator_p (task) static boolean_t informed = FALSE; if (!informed) { - message("Emulation vector address 0x08%x outside emulator space", + warning("Emulation vector address 0x08%x outside emulator space", entry); informed = TRUE; } @@ -2220,41 +2263,41 @@ have_emulator_p (task) return FALSE; } -/* - * Map cprocs to kernel threads and vice versa. - * - * For reverse mapping the code mis-uses one struct cproc field, - * see "os-mach3.h" and code here. - * - */ +/* Map cprocs to kernel threads and vice versa. */ void map_cprocs_to_kernel_threads (cprocs, mthreads, thread_count) - cproc_t cprocs; - gdb_thread_t mthreads; + gdb_thread_t cprocs; + gdb_thread_t mthreads; int thread_count; { int index; - cproc_t scan; - boolean_t all_mapped = TRUE; + gdb_thread_t scan; + boolean_t all_mapped = TRUE; - for (scan = cprocs; scan; scan = scan->list) + for (scan = cprocs; scan; scan = scan->next) { /* Default to: no kernel thread for this cproc */ - CPROC_REVERSE_MAP (scan) = -1; + scan->reverse_map = -1; /* Check if the cproc is found by its stack */ for (index = 0; index < thread_count; index++) { - if ((mthreads + index)->sp > scan->stack_base && - (mthreads + index)->sp <= scan->stack_base + scan->stack_size) + LONGEST stack_base = + extract_signed_integer (scan.raw_cproc + CPROC_BASE_OFFSET, + CPROC_BASE_SIZE); + LONGEST stack_size = + extract_signed_integer (scan.raw_cproc + CPROC_SIZE_OFFSET, + CPROC_SIZE_SIZE); + if ((mthreads + index)->sp > stack_base && + (mthreads + index)->sp <= stack_base + stack_size) { (mthreads + index)->cproc = scan; - CPROC_REVERSE_MAP (scan) = index; + scan->reverse_map = index; break; } } - all_mapped &= (CPROC_REVERSE_MAP(scan) != -1); + all_mapped &= (scan->reverse_map != -1); } /* Check for threads that are currently in the emulator. @@ -2282,7 +2325,7 @@ map_cprocs_to_kernel_threads (cprocs, mthreads, thread_count) gdb_thread_t mthread = (mthreads+index); emul_sp = mthread->sp; - if (! mthread->cproc && + if (mthread->cproc == NULL && EMULATOR_BASE <= emul_sp && emul_sp <= EMULATOR_END) { mthread->in_emulator = emulator_present; @@ -2298,19 +2341,19 @@ map_cprocs_to_kernel_threads (cprocs, mthreads, thread_count) /* Try to match this stack pointer to the cprocs that * don't yet have a kernel thread. */ - for (scan = cprocs; scan; scan = scan->list) + for (scan = cprocs; scan; scan = scan->next) { /* Check is this unmapped CPROC stack contains * the user stack pointer saved in the * emulator. */ - if (CPROC_REVERSE_MAP (scan) == -1 && + if (scan->reverse_map == -1 && usp > scan->stack_base && usp <= scan->stack_base + scan->stack_size) { mthread->cproc = scan; - CPROC_REVERSE_MAP (scan) = index; + scan->reverse_map = index; break; } } @@ -2380,10 +2423,13 @@ lookup_address_of_variable (name) return symaddr; } -static cproc_t +static gdb_thread_t get_cprocs() { - cproc_t their_cprocs, cproc_head, cproc_copy; + gdb_thread_t cproc_head; + gdb_thread_t cproc_copy; + CORE_ADDR their_cprocs; + char *buf[TARGET_PTR_BIT / HOST_CHAR_BIT]; char *name; cthread_t cthread; CORE_ADDR symaddr; @@ -2391,65 +2437,77 @@ get_cprocs() symaddr = lookup_address_of_variable ("cproc_list"); if (! symaddr) - { /* cproc_list is not in a file compiled with debugging + { + /* cproc_list is not in a file compiled with debugging symbols, but don't give up yet */ - + symaddr = lookup_address_of_variable ("cprocs"); if (symaddr) { static int informed = 0; - if (!informed) { - informed++; - message ("Your program is loaded with an old threads library."); - message ("GDB does not know the old form of threads"); - message ("so things may not work."); - } + if (!informed) + { + informed++; + warning ("Your program is loaded with an old threads library."); + warning ("GDB does not know the old form of threads"); + warning ("so things may not work."); + } } } /* Stripped or no -lthreads loaded or "cproc_list" is in wrong segment. */ if (! symaddr) - return NO_CPROC; + return NULL; /* Get the address of the first cproc in the task */ - if (!mach3_read_inferior(symaddr, - &their_cprocs, - sizeof(cproc_t))) - error("Can't read cproc master list at address (0x%x).", symaddr); + if (!mach3_read_inferior (symaddr, + buf, + TARGET_PTR_BIT / HOST_CHAR_BIT)) + error ("Can't read cproc master list at address (0x%x).", symaddr); + their_cprocs = extract_address (buf, TARGET_PTR_BIT / HOST_CHAR_BIT); /* Scan the CPROCs in the task. CPROCs are chained with LIST field, not NEXT field, which chains mutexes, condition variables and queues */ - - cproc_head = NO_CPROC; - while (their_cprocs != NO_CPROC) + cproc_head = NULL; + + while (their_cprocs != (CORE_ADDR)0) { - cproc_copy = (cproc_t) obstack_alloc(cproc_obstack, - sizeof(struct cproc)); - - if (!mach3_read_inferior(their_cprocs, - cproc_copy, - sizeof(struct cproc))) + CORE_ADDR cproc_copy_incarnation; + cproc_copy = (gdb_thread_t) obstack_alloc (cproc_obstack, + sizeof (struct gdb_thread)); + + if (!mach3_read_inferior (their_cprocs, + &cproc_copy.raw_cproc[0], + CPROC_SIZE)) error("Can't read next cproc at 0x%x.", their_cprocs); - - their_cprocs = cproc_copy->list; - - if (cproc_copy->incarnation != NULL) + cproc_copy = extract_address (buf, TARGET_PTR_BIT / HOST_CHAR_BIT); + + their_cprocs = + extract_address (cproc_copy.raw_cproc + CPROC_LIST_OFFSET, + CPROC_LIST_SIZE); + cproc_copy_incarnation = + extract_address (cproc_copy.raw_cproc + CPROC_INCARNATION_OFFSET, + CPROC_INCARNATION_SIZE); + + if (cproc_copy_incarnation == (CORE_ADDR)0) + cproc_copy->cthread = NULL; + else { /* This CPROC has an attached CTHREAD. Get its name */ cthread = (cthread_t)obstack_alloc (cproc_obstack, sizeof(struct cthread)); - - if (!mach3_read_inferior(cproc_copy->incarnation, + + if (!mach3_read_inferior (cproc_copy_incarnation, cthread, sizeof(struct cthread))) error("Can't read next thread at 0x%x.", - cproc_copy->incarnation); - - cproc_copy->incarnation = cthread; - + cproc_copy_incarnation); + + cproc_copy->cthread = cthread; + if (cthread->name) { name = (char *) obstack_alloc (cproc_obstack, MAX_NAME_LEN); @@ -2460,12 +2518,12 @@ get_cprocs() cthread->name = name; } } - + /* insert in front */ - cproc_copy->list = cproc_head; - cproc_head = cproc_copy; + cproc_copy->next = cproc_head; + cproc_head = cproc_copy; } - return(cproc_head); + return cproc_head; } #ifndef FETCH_CPROC_STATE @@ -2489,7 +2547,9 @@ mach3_cproc_state (mthread) if (! mthread || !mthread->cproc || !mthread->cproc->context) return -1; - context = mthread->cproc->context; + context = extract_signed_integer + (mthread->cproc->raw_cproc + CPROC_CONTEXT_OFFSET, + CPROC_CONTEXT_SIZE); mthread->sp = context + MACHINE_CPROC_SP_OFFSET; @@ -2497,7 +2557,7 @@ mach3_cproc_state (mthread) &mthread->pc, sizeof (CORE_ADDR)) != sizeof (CORE_ADDR)) { - message ("Can't read cproc pc from inferior"); + warning ("Can't read cproc pc from inferior"); return -1; } @@ -2505,7 +2565,7 @@ mach3_cproc_state (mthread) &mthread->fp, sizeof (CORE_ADDR)) != sizeof (CORE_ADDR)) { - message ("Can't read cproc fp from inferior"); + warning ("Can't read cproc fp from inferior"); return -1; } @@ -2519,8 +2579,8 @@ thread_list_command() { thread_basic_info_data_t ths; int thread_count; - cproc_t cprocs; - cproc_t scan; + gdb_thread_t cprocs; + gdb_thread_t scan; int index; char *name; char selected; @@ -2555,7 +2615,7 @@ thread_list_command() map_cprocs_to_kernel_threads (cprocs, their_threads, thread_count); - for (scan = cprocs; scan; scan = scan->list) + for (scan = cprocs; scan; scan = scan->next) { int mid; char buf[10]; @@ -2564,10 +2624,12 @@ thread_list_command() selected = ' '; /* a wired cproc? */ - wired = scan->wired ? "wired" : ""; - - if (CPROC_REVERSE_MAP(scan) != -1) - kthread = (their_threads + CPROC_REVERSE_MAP(scan)); + wired = (extract_address (scan->raw_cproc + CPROC_WIRED_OFFSET, + CPROC_WIRED_SIZE) + ? "wired" : ""); + + if (scan->reverse_map != -1) + kthread = (their_threads + scan->reverse_map); else kthread = NULL; @@ -2586,7 +2648,7 @@ thread_list_command() if (ret != KERN_SUCCESS) { - message ("Unable to get basic info on thread %d : %s", + warning ("Unable to get basic info on thread %d : %s", mid, mach_error_string (ret)); continue; @@ -2611,6 +2673,7 @@ thread_list_command() 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, @@ -2638,6 +2701,7 @@ thread_list_command() continue; /* EMcM */ #endif + /* FIXME: May run afloul of arbitrary limit in printf_filtered. */ printf_filtered (TL_FORMAT, "-", -neworder, /* Pseudo MID */ @@ -2683,7 +2747,7 @@ thread_list_command() if (ret != KERN_SUCCESS) { - message ("Unable to get basic info on thread %d : %s", + warning ("Unable to get basic info on thread %d : %s", mid, mach_error_string (ret)); continue; @@ -2709,6 +2773,7 @@ thread_list_command() 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, @@ -2779,7 +2844,7 @@ boolean_t set; if (! MACH_PORT_VALID (thread)) { - message ("thread_trace: invalid thread"); + warning ("thread_trace: invalid thread"); return; } @@ -2828,7 +2893,7 @@ flush_inferior_icache(pc, amount) MATTR_CACHE, &flush); if (ret != KERN_SUCCESS) - message ("Error flushing inferior's cache : %s", + warning ("Error flushing inferior's cache : %s", mach_error_string (ret)); } #endif FLUSH_INFERIOR_CACHE @@ -2848,7 +2913,7 @@ suspend_all_threads (from_tty) ret = task_threads (inferior_task, &thread_list, &thread_count); if (ret != KERN_SUCCESS) { - message ("Could not suspend inferior threads."); + warning ("Could not suspend inferior threads."); kill_inferior (); return_to_top_level (); } @@ -2863,7 +2928,7 @@ suspend_all_threads (from_tty) ret = thread_suspend(thread_list[ index ]); if (ret != KERN_SUCCESS) - message ("Error trying to suspend thread %d : %s", + warning ("Error trying to suspend thread %d : %s", mid, mach_error_string (ret)); if (from_tty) @@ -2875,7 +2940,7 @@ suspend_all_threads (from_tty) &infoCnt); CHK ("suspend can't get thread info", ret); - message ("Thread %d suspend count is %d", + warning ("Thread %d suspend count is %d", mid, th_info.suspend_count); } } @@ -2924,7 +2989,7 @@ thread_suspend_command (args, from_tty) ret = thread_suspend (current_thread); if (ret != KERN_SUCCESS) - message ("thread_suspend failed : %s", + warning ("thread_suspend failed : %s", mach_error_string (ret)); infoCnt = THREAD_BASIC_INFO_COUNT; @@ -2934,7 +2999,7 @@ thread_suspend_command (args, from_tty) &infoCnt); CHK ("suspend can't get thread info", ret); - message ("Thread %d suspend count is %d", mid, th_info.suspend_count); + warning ("Thread %d suspend count is %d", mid, th_info.suspend_count); current_thread = saved_thread; } @@ -2971,17 +3036,17 @@ resume_all_threads (from_tty) if (! th_info.suspend_count) { if (mid != -1 && from_tty) - message ("Thread %d is not suspended", mid); + warning ("Thread %d is not suspended", mid); continue; } ret = thread_resume (thread_list[ index ]); if (ret != KERN_SUCCESS) - message ("Error trying to resume thread %d : %s", + warning ("Error trying to resume thread %d : %s", mid, mach_error_string (ret)); else if (mid != -1 && from_tty) - message ("Thread %d suspend count is %d", + warning ("Thread %d suspend count is %d", mid, --th_info.suspend_count); } @@ -3035,18 +3100,18 @@ thread_resume_command (args, from_tty) if (! th_info.suspend_count) { - message ("Thread %d is not suspended", mid); + warning ("Thread %d is not suspended", mid); goto out; } ret = thread_resume (current_thread); if (ret != KERN_SUCCESS) - message ("thread_resume failed : %s", + warning ("thread_resume failed : %s", mach_error_string (ret)); else { th_info.suspend_count--; - message ("Thread %d suspend count is %d", mid, th_info.suspend_count); + warning ("Thread %d suspend count is %d", mid, th_info.suspend_count); } out: @@ -3094,7 +3159,7 @@ thread_kill_command (args, from_tty) CHK ("Thread could not be terminated", ret); if (select_thread (inferior_task, 0, 1) != KERN_SUCCESS) - message ("Last thread was killed, use \"kill\" command to kill task"); + warning ("Last thread was killed, use \"kill\" command to kill task"); } else for (index = 0; index < thread_count; index++) @@ -3111,7 +3176,7 @@ thread_kill_command (args, from_tty) (thread_count * sizeof(mach_port_t))); CHK ("Error trying to deallocate thread list", ret); - message ("Thread %d killed", mid); + warning ("Thread %d killed", mid); } @@ -3151,14 +3216,14 @@ task_resume_command (args, from_tty) if (ta_info.suspend_count == 1) { - message ("Inferior task %d is no longer suspended", mid); + warning ("Inferior task %d is no longer suspended", mid); must_suspend_thread = 1; /* @@ This is not complete: Registers change all the time when not suspended! */ registers_changed (); } else - message ("Inferior task %d suspend count is now %d", + warning ("Inferior task %d suspend count is now %d", mid, ta_info.suspend_count-1); } @@ -3190,7 +3255,7 @@ task_suspend_command (args, from_tty) &infoCnt); CHK ("task_suspend_command: task_info failed", ret); - message ("Inferior task %d suspend count is now %d", + warning ("Inferior task %d suspend count is now %d", mid, ta_info.suspend_count); } @@ -3507,7 +3572,7 @@ gdb_register_port (name, port) if (! MACH_PORT_VALID (port) || !name || !*name) { - message ("Invalid registration request"); + warning ("Invalid registration request"); return; } @@ -3665,29 +3730,31 @@ do_mach_notify_dead_name (notify, name) switch (element->type) { case MACH_TYPE_THREAD: + target_terminal_ours_for_output (); if (name == current_thread) { - message ("\nCurrent thread %d died", element->mid); + printf_filtered ("\nCurrent thread %d died", element->mid); current_thread = MACH_PORT_NULL; } else - message ("\nThread %d died", element->mid); + printf_filtered ("\nThread %d died", element->mid); break; case MACH_TYPE_TASK: + target_terminal_ours_for_output (); if (name != inferior_task) - message ("Task %d died, but it was not the selected task", + printf_filtered ("Task %d died, but it was not the selected task", element->mid); else { - message ("Current task %d died", element->mid); + printf_filtered ("Current task %d died", element->mid); mach_port_destroy (mach_task_self(), name); inferior_task = MACH_PORT_NULL; if (notify_chain) - message("There were still unreceived dead_name_notifications???"); + warning ("There were still unreceived dead_name_notifications???"); /* Destroy the old notifications */ setup_notify_port (0); @@ -3709,7 +3776,7 @@ do_mach_notify_msg_accepted (notify, name) mach_port_t notify; mach_port_t name; { - message ("do_mach_notify_msg_accepted : notify %x, name %x", + warning ("do_mach_notify_msg_accepted : notify %x, name %x", notify, name); return KERN_SUCCESS; } @@ -3719,7 +3786,7 @@ do_mach_notify_no_senders (notify, mscount) mach_port_t notify; mach_port_mscount_t mscount; { - message ("do_mach_notify_no_senders : notify %x, mscount %x", + warning ("do_mach_notify_no_senders : notify %x, mscount %x", notify, mscount); return KERN_SUCCESS; } @@ -3729,7 +3796,7 @@ do_mach_notify_port_deleted (notify, name) mach_port_t notify; mach_port_t name; { - message ("do_mach_notify_port_deleted : notify %x, name %x", + warning ("do_mach_notify_port_deleted : notify %x, name %x", notify, name); return KERN_SUCCESS; } @@ -3739,7 +3806,7 @@ do_mach_notify_port_destroyed (notify, rights) mach_port_t notify; mach_port_t rights; { - message ("do_mach_notify_port_destroyed : notify %x, rights %x", + warning ("do_mach_notify_port_destroyed : notify %x, rights %x", notify, rights); return KERN_SUCCESS; } @@ -3750,7 +3817,7 @@ do_mach_notify_send_once (notify) { #ifdef DUMP_SYSCALL /* MANY of these are generated. */ - message ("do_mach_notify_send_once : notify %x", + warning ("do_mach_notify_send_once : notify %x", notify); #endif return KERN_SUCCESS; @@ -3882,7 +3949,7 @@ m3_resume (pid, step, signal) ret = task_resume (inferior_task); if (ret == KERN_FAILURE) - message ("Task was not suspended"); + warning ("Task was not suspended"); else CHK ("Resuming task", ret); @@ -4037,7 +4104,7 @@ deallocate_inferior_ports () ret = task_threads (inferior_task, &thread_list, &thread_count); if (ret != KERN_SUCCESS) { - message ("deallocate_inferior_ports: task_threads", + warning ("deallocate_inferior_ports: task_threads", mach_error_string(ret)); return; } @@ -4107,7 +4174,7 @@ m3_do_detach (signal) setup_notify_port (0); if (remove_breakpoints ()) - message ("Could not remove breakpoints when detaching"); + warning ("Could not remove breakpoints when detaching"); if (signal && inferior_pid > 0) kill (inferior_pid, signal); @@ -4435,9 +4502,9 @@ _initialize_m3_nat () { mid_server = MACH_PORT_NULL; - message ("initialize machid: netname_lookup_up(MachID) : %s", + warning ("initialize machid: netname_lookup_up(MachID) : %s", mach_error_string(ret)); - message ("Some (most?) features disabled..."); + warning ("Some (most?) features disabled..."); } mid_auth = mach_privileged_host_port(); @@ -4462,7 +4529,7 @@ _initialize_m3_nat () MACH_PORT_RIGHT_RECEIVE, &our_message_port); if (ret != KERN_SUCCESS) - message ("Creating message port %s", mach_error_string (ret)); + warning ("Creating message port %s", mach_error_string (ret)); else { char buf[ MAX_NAME_LEN ]; @@ -4470,7 +4537,7 @@ _initialize_m3_nat () our_message_port, inferior_wait_port_set); if (ret != KERN_SUCCESS) - message ("message move member %s", mach_error_string (ret)); + warning ("message move member %s", mach_error_string (ret)); /* @@@@ No way to change message port name currently */ |