X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fgdbserver%2Flinux-low.c;h=067a63290f30b38660761b83dcfcf4df84872dfd;hb=58eb693ef13be6d0fb010269bac6942ebf8ab12f;hp=83a56aa1faa84aaacb68fc7b827123c1fbddb953;hpb=89be2091496d2a3166460875fea2a2778686f8d3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 83a56aa1fa..067a63290f 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -1,7 +1,6 @@ /* Low level interface to ptrace, for the remote server for GDB. Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 - Free Software Foundation, Inc. + 2006, 2007 Free Software Foundation, Inc. This file is part of GDB. @@ -43,6 +42,12 @@ # define PTRACE_SETSIGINFO 0x4203 #endif +#ifdef __UCLIBC__ +#if !(defined(__UCLIBC_HAS_MMU__) || defined(__ARCH_HAS_MMU__)) +#define HAS_NOMMU +#endif +#endif + /* ``all_threads'' is keyed by the LWP ID - it should be the thread ID instead, however. This requires changing the ID in place when we go from !using_threads to using_threads, immediately. @@ -78,8 +83,6 @@ struct pending_signals static int use_regsets_p = 1; #endif -int debug_threads = 0; - #define pid_of(proc) ((proc)->head.id) /* FIXME: Delete eventually. */ @@ -146,7 +149,7 @@ linux_create_inferior (char *program, char **allargs) void *new_process; int pid; -#if defined(__UCLIBC__) && !defined(__UCLIBC_HAS_MMU__) +#if defined(__UCLIBC__) && defined(HAS_NOMMU) pid = vfork (); #else pid = fork (); @@ -163,6 +166,8 @@ linux_create_inferior (char *program, char **allargs) setpgid (0, 0); execv (program, allargs); + if (errno == ENOENT) + execvp (program, allargs); fprintf (stderr, "Cannot exec %s: %s.\n", program, strerror (errno)); @@ -255,13 +260,17 @@ static void linux_kill (void) { struct thread_info *thread = (struct thread_info *) all_threads.head; - struct process_info *process = get_thread_process (thread); + struct process_info *process; int wstat; + if (thread == NULL) + return; + for_each_inferior (&all_threads, linux_kill_one_process); /* See the comment in linux_kill_one_process. We did not kill the first thread in the list, so do so now. */ + process = get_thread_process (thread); do { ptrace (PTRACE_KILL, pid_of (process), 0, 0); @@ -280,10 +289,24 @@ linux_detach_one_process (struct inferior_list_entry *entry) ptrace (PTRACE_DETACH, pid_of (process), 0, 0); } -static void +static int linux_detach (void) { for_each_inferior (&all_threads, linux_detach_one_process); + return 0; +} + +static void +linux_join (void) +{ + extern unsigned long signal_pid; + int status, ret; + + do { + ret = waitpid (signal_pid, &status, 0); + if (WIFEXITED (status) || WIFSIGNALED (status)) + break; + } while (ret != -1 || errno != ECHILD); } /* Return nonzero if the given thread is still alive. */ @@ -1511,7 +1534,7 @@ linux_look_up_symbols (void) } static void -linux_send_signal (int signum) +linux_request_interrupt (void) { extern unsigned long signal_pid; @@ -1520,10 +1543,10 @@ linux_send_signal (int signum) struct process_info *process; process = get_thread_process (current_inferior); - kill_lwp (process->lwpid, signum); + kill_lwp (process->lwpid, SIGINT); } else - kill_lwp (signal_pid, signum); + kill_lwp (signal_pid, SIGINT); } /* Copy LEN bytes from inferior's auxiliary vector starting at OFFSET @@ -1593,7 +1616,7 @@ linux_stopped_data_address (void) return 0; } -#if defined(__UCLIBC__) && !defined(__UCLIBC_HAS_MMU__) +#if defined(__UCLIBC__) && defined(HAS_NOMMU) #if defined(__mcoldfire__) /* These should really be defined in the kernel's ptrace.h header. */ #define PT_TEXT_ADDR 49*4 @@ -1638,11 +1661,18 @@ linux_read_offsets (CORE_ADDR *text_p, CORE_ADDR *data_p) } #endif +static const char * +linux_arch_string (void) +{ + return the_low_target.arch_string; +} + static struct target_ops linux_target_ops = { linux_create_inferior, linux_attach, linux_kill, linux_detach, + linux_join, linux_thread_alive, linux_resume, linux_wait, @@ -1651,13 +1681,13 @@ static struct target_ops linux_target_ops = { linux_read_memory, linux_write_memory, linux_look_up_symbols, - linux_send_signal, + linux_request_interrupt, linux_read_auxv, linux_insert_watchpoint, linux_remove_watchpoint, linux_stopped_by_watchpoint, linux_stopped_data_address, -#if defined(__UCLIBC__) && !defined(__UCLIBC_HAS_MMU__) +#if defined(__UCLIBC__) && defined(HAS_NOMMU) linux_read_offsets, #else NULL, @@ -1667,6 +1697,7 @@ static struct target_ops linux_target_ops = { #else NULL, #endif + linux_arch_string, }; static void