aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/gdb/gdb-6.8
diff options
context:
space:
mode:
authorDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
committerDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
commit709c4d66e0b107ca606941b988bad717c0b45d9b (patch)
tree37ee08b1eb308f3b2b6426d5793545c38396b838 /recipes/gdb/gdb-6.8
parentfa6cd5a3b993f16c27de4ff82b42684516d433ba (diff)
downloadopenembedded-709c4d66e0b107ca606941b988bad717c0b45d9b.tar.gz
rename packages/ to recipes/ per earlier agreement
See links below for more details: http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326 http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816 Signed-off-by: Denys Dmytriyenko <denis@denix.org> Acked-by: Mike Westerhof <mwester@dls.net> Acked-by: Philip Balister <philip@balister.org> Acked-by: Khem Raj <raj.khem@gmail.com> Acked-by: Marcin Juszkiewicz <hrw@openembedded.org> Acked-by: Koen Kooi <koen@openembedded.org> Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'recipes/gdb/gdb-6.8')
-rw-r--r--recipes/gdb/gdb-6.8/gcc-4.3-build-error.patch129
-rw-r--r--recipes/gdb/gdb-6.8/gdb-6.8-mingw-3.patch425
-rw-r--r--recipes/gdb/gdb-6.8/gdb-6.8-mips-mingw-sim-fixup.patch17
-rw-r--r--recipes/gdb/gdb-6.8/gdb-6.8-pr9638-ppc-canadian-configh.patch179
4 files changed, 750 insertions, 0 deletions
diff --git a/recipes/gdb/gdb-6.8/gcc-4.3-build-error.patch b/recipes/gdb/gdb-6.8/gcc-4.3-build-error.patch
new file mode 100644
index 0000000000..36e501af1a
--- /dev/null
+++ b/recipes/gdb/gdb-6.8/gcc-4.3-build-error.patch
@@ -0,0 +1,129 @@
+http://patches.ubuntu.com/g/gdb/extracted/gcc-4.3-build-error.patch
+
+--- gdb/cli/cli-cmds.c~ 2008-06-24 16:07:25.000000000 +0200
++++ gdb/cli/cli-cmds.c 2008-06-24 16:22:31.000000000 +0200
+@@ -323,7 +323,8 @@
+ {
+ if (args)
+ error (_("The \"pwd\" command does not take an argument: %s"), args);
+- getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
++ if (!getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
++ error (_("Unable to determine current directory"));
+
+ if (strcmp (gdb_dirbuf, current_directory) != 0)
+ printf_unfiltered (_("Working directory %s\n (canonically %s).\n"),
+--- gdb/linux-nat.c~ 2008-01-29 23:47:20.000000000 +0100
++++ gdb/linux-nat.c 2008-06-24 16:18:57.000000000 +0200
+@@ -2876,7 +2876,8 @@
+ sprintf (fname1, "/proc/%lld/cmdline", pid);
+ if ((procfile = fopen (fname1, "r")) != NULL)
+ {
+- fgets (buffer, sizeof (buffer), procfile);
++ if (!fgets (buffer, sizeof (buffer), procfile))
++ error(_("Unable to read '%s'"), fname1);
+ printf_filtered ("cmdline = '%s'\n", buffer);
+ fclose (procfile);
+ }
+--- gdb/inflow.c~ 2008-01-01 23:53:11.000000000 +0100
++++ gdb/inflow.c 2008-06-24 16:32:10.000000000 +0200
+@@ -512,7 +512,7 @@
+ void
+ new_tty (void)
+ {
+- int tty;
++ int tty, rv;
+
+ if (inferior_thisrun_terminal == 0)
+ return;
+@@ -545,17 +545,17 @@
+ if (tty != 0)
+ {
+ close (0);
+- dup (tty);
++ rv = dup (tty);
+ }
+ if (tty != 1)
+ {
+ close (1);
+- dup (tty);
++ rv = dup (tty);
+ }
+ if (tty != 2)
+ {
+ close (2);
+- dup (tty);
++ rv = dup (tty);
+ }
+ if (tty > 2)
+ close (tty);
+--- gdb/mi/mi-cmd-env.c~ 2008-01-01 23:53:14.000000000 +0100
++++ gdb/mi/mi-cmd-env.c 2008-06-24 16:23:25.000000000 +0200
+@@ -78,7 +78,8 @@
+
+ /* Otherwise the mi level is 2 or higher. */
+
+- getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
++ if (!getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
++ error (_("Unable to determine current directory"));
+ ui_out_field_string (uiout, "cwd", gdb_dirbuf);
+
+ return MI_CMD_DONE;
+--- gdb/utils.c~ 2008-01-01 23:53:13.000000000 +0100
++++ gdb/utils.c 2008-06-24 16:29:13.000000000 +0200
+@@ -688,6 +688,7 @@
+ static int dejavu;
+ int quit_p;
+ int dump_core_p;
++ int rv;
+ char *reason;
+
+ /* Don't allow infinite error/warning recursion. */
+@@ -704,7 +705,7 @@
+ abort (); /* NOTE: GDB has only three calls to abort(). */
+ default:
+ dejavu = 3;
+- write (STDERR_FILENO, msg, sizeof (msg));
++ rv = write (STDERR_FILENO, msg, sizeof (msg));
+ exit (1);
+ }
+ }
+--- gdb/top.c~ 2008-01-01 23:53:13.000000000 +0100
++++ gdb/top.c 2008-06-24 16:26:51.000000000 +0200
+@@ -1628,7 +1628,8 @@
+
+ /* Run the init function of each source file */
+
+- getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
++ if (!getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
++ error (_("Unable to determine current directory"));
+ current_directory = gdb_dirbuf;
+
+ #ifdef __MSDOS__
+--- gdb/ui-file.c~ 2008-01-01 23:53:13.000000000 +0100
++++ gdb/ui-file.c 2008-06-24 16:30:16.000000000 +0200
+@@ -477,11 +477,12 @@
+ static void
+ stdio_file_write (struct ui_file *file, const char *buf, long length_buf)
+ {
++ int rv;
+ struct stdio_file *stdio = ui_file_data (file);
+ if (stdio->magic != &stdio_file_magic)
+ internal_error (__FILE__, __LINE__,
+ _("stdio_file_write: bad magic number"));
+- fwrite (buf, length_buf, 1, stdio->file);
++ rv = fwrite (buf, length_buf, 1, stdio->file);
+ }
+
+ static void
+--- gdb/main.c~ 2008-06-24 16:07:25.000000000 +0200
++++ gdb/main.c 2008-06-24 16:25:05.000000000 +0200
+@@ -188,7 +188,8 @@
+ line[0] = '\0'; /* Terminate saved (now empty) cmd line */
+ instream = stdin;
+
+- getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
++ if (!getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
++ error (_("Unable to determine current directory"));
+ current_directory = gdb_dirbuf;
+
+ gdb_stdout = stdio_fileopen (stdout);
diff --git a/recipes/gdb/gdb-6.8/gdb-6.8-mingw-3.patch b/recipes/gdb/gdb-6.8/gdb-6.8-mingw-3.patch
new file mode 100644
index 0000000000..7bfcca7518
--- /dev/null
+++ b/recipes/gdb/gdb-6.8/gdb-6.8-mingw-3.patch
@@ -0,0 +1,425 @@
+diff -urp gdb-6.8_orig/gdb/gdbserver/remote-utils.c gdb-6.8/gdb/gdbserver/remote-utils.c
+--- gdb-6.8_orig/gdb/gdbserver/remote-utils.c 2008-01-29 16:51:50.000000000 -0800
++++ gdb-6.8/gdb/gdbserver/remote-utils.c 2008-04-09 14:04:30.000000000 -0700
+@@ -617,7 +617,12 @@ input_interrupt (int unused)
+
+ cc = read (remote_desc, &c, 1);
+
++#ifdef _WIN32_WINNT
++ // its normal in windows for current_inferior to be null.
++ if (cc != 1 || c != '\003' /*|| current_inferior == NULL*/)
++#else
+ if (cc != 1 || c != '\003' || current_inferior == NULL)
++#endif
+ {
+ fprintf (stderr, "input_interrupt, count = %d c = %d ('%c')\n",
+ cc, c, c);
+diff -urp gdb-6.8_orig/gdb/gdbserver/server.c gdb-6.8/gdb/gdbserver/server.c
+--- gdb-6.8_orig/gdb/gdbserver/server.c 2008-02-19 13:36:54.000000000 -0800
++++ gdb-6.8/gdb/gdbserver/server.c 2008-04-23 13:56:51.000000000 -0700
+@@ -29,6 +29,10 @@
+ #include <sys/wait.h>
+ #endif
+
++#ifdef _WIN32
++#include <windows.h>
++#endif
++
+ unsigned long cont_thread;
+ unsigned long general_thread;
+ unsigned long step_thread;
+@@ -268,6 +272,20 @@ monitor_show_help (void)
+ monitor_output (" Enable general debugging messages\n");
+ monitor_output (" set remote-debug <0|1>\n");
+ monitor_output (" Enable remote protocol debugging messages\n");
++#ifdef _WIN32
++ monitor_output (" get processlist\n");
++ monitor_output (" List remote processes with names and pid\n");
++ monitor_output (" get processlistmi\n");
++ monitor_output (" Process list in an MI-like format\n");
++#endif
++ monitor_output (" set env <name=value>\n");
++ monitor_output (" Set environment variable in remote environment\n");
++ monitor_output (" cd <directory>\n");
++ monitor_output (" Change current working directory\n");
++ monitor_output (" pwd\n");
++ monitor_output (" Print current working directory\n");
++ monitor_output (" shell <command line>\n");
++ monitor_output (" Execute command on remote target\n");
+ monitor_output (" exit\n");
+ monitor_output (" Quit GDBserver\n");
+ }
+@@ -279,6 +297,47 @@ monitor_show_help (void)
+ return; \
+ }
+
++#ifdef _WIN32
++typedef DWORD (__stdcall *GETPROCESSIMAGEFILENAME)(HANDLE hProcess, LPTSTR lpImageFileName, DWORD nSize);
++typedef BOOL (__stdcall *ENUMPROCESSES)(DWORD* pProcessIds, DWORD cb, DWORD* pBytesReturned);
++
++# define HAS_DEVICE(P) \
++((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
++&& (P)[1] == ':')
++# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
++# define ISSLASH(C) ((C) == '/' || (C) == '\\')
++
++char *
++__basename (char const *name)
++{
++ char const *base = name += FILE_SYSTEM_PREFIX_LEN (name);
++ int all_slashes = 1;
++ char const *p;
++
++ for (p = name; *p; p++)
++ {
++ if (ISSLASH (*p))
++ base = p + 1;
++ else
++ all_slashes = 0;
++ }
++
++ /* If NAME is all slashes, arrange to return `/'. */
++ if (*base == '\0' && ISSLASH (*name) && all_slashes)
++ --base;
++
++ /* Make sure the last byte is not a slash. */
++ //assert (all_slashes || !ISSLASH (*(p - 1)));
++
++ return (char *) base;
++}
++#endif
++
++#ifndef _POSIX_PATH_MAX
++#define _POSIX_PATH_MAX 1024
++#define _POSIX_PATH_MAX_WAS_UNDEFINED
++#endif
++
+ /* Handle all of the extended 'q' packets. */
+ void
+ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
+@@ -664,6 +723,158 @@ handle_query (char *own_buf, int packet_
+ debug_threads = 1;
+ monitor_output ("Debug output enabled.\n");
+ }
++#ifdef _WIN32
++ else if (strncmp (mon, "get processlist", 15) == 0)
++ {
++ HINSTANCE lib = LoadLibrary("PSAPI.DLL");
++ GETPROCESSIMAGEFILENAME imageFilename = (GETPROCESSIMAGEFILENAME)GetProcAddress(lib, "GetProcessImageFileNameA");
++ ENUMPROCESSES enumProcesses = (ENUMPROCESSES)GetProcAddress(lib, "EnumProcesses");
++
++ char* name = (char*)malloc(MAX_PATH);
++
++ int miMode = (strcmp(mon, "get processlistmi") == 0);
++
++ DWORD* pids = (DWORD*)malloc(sizeof(DWORD)*1024);
++ memset(pids, 0, sizeof(pids));
++ DWORD size = 0;
++
++ if (!enumProcesses(pids, 1024 * sizeof(DWORD), &size))
++ {
++ free(pids);
++ free(mon);
++ return;
++ }
++
++ int cnt = 0;
++ int number = size / sizeof(DWORD);
++
++ char* miOutput = NULL;
++
++ if (!miMode)
++ monitor_output("Remote process list:\n");
++ else
++ {
++ miOutput = (char*)malloc((number * 255) * sizeof(char));
++ strcpy(miOutput, "^done,processlist=[");
++ }
++
++ for (cnt = 0; cnt < number; cnt++)
++ {
++ HMODULE hProcess = (HMODULE)OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pids[cnt]);
++ strcpy(name, "");
++ printf(name);
++
++ imageFilename(hProcess, name, MAX_PATH);
++
++ if (pids[cnt] > 4 && strcmp(name, "") != 0)
++ {
++ char item[2048] = "";
++ char tmp[24] = "0";
++ itoa(pids[cnt], tmp, 10);
++ strcat(item, tmp);
++ strcat(item, "=");
++ strcat(item, __basename(name));
++
++ if (!miMode)
++ {
++ strcat(item, "\n");
++ monitor_output(item);
++ }
++ else
++ {
++ strcat(miOutput, item);
++ strcat(miOutput, ",");
++ }
++ }
++
++ CloseHandle(hProcess);
++ }
++
++ if (miMode)
++ {
++ strcat(miOutput, "]\n");
++ monitor_output(miOutput);
++ free(miOutput);
++ }
++
++ FreeLibrary(lib);
++
++ free(pids);
++ free(name);
++ }
++#endif
++ else if (strncmp (mon, "set env ", 8) == 0)
++ {
++ char* envLine = mon + 8;
++ char* envName = strtok(envLine, "= ");
++ char* envValue = strtok(NULL, "= ");
++ if (envName && envValue)
++ {
++#ifdef _WIN32
++ SetEnvironmentVariable(envName, envValue);
++#else
++ setenv(envName, envValue, 1);
++#endif
++ monitor_output("Target environment variable set (");
++ monitor_output(envName);
++ monitor_output(" = ");
++ monitor_output(envValue);
++ monitor_output(").\n");
++ }
++ else
++ monitor_output("Incorrect format for environment variable.\n");
++ }
++ else if (strncmp (mon, "cd ", 3) == 0)
++ {
++ char* dir = mon + 3;
++ if (strlen(dir) > 0)
++ chdir(dir);
++ }
++ else if (strcmp(mon, "pwd") == 0)
++ {
++ long size = _POSIX_PATH_MAX;
++ char* current_directory = (char*)malloc(size);
++ getcwd(current_directory, size);
++ if (strlen(current_directory) > 0)
++ {
++ monitor_output(current_directory);
++ monitor_output("\n");
++ }
++ free(current_directory);
++ }
++ else if (strncmp (mon, "shell ", 6) == 0)
++ {
++ char* arg = mon + 6;
++
++ if (strlen(arg) == 0)
++ {
++ monitor_output("Inferior shells are not supported.");
++ free(mon);
++ return;
++ }
++
++ long size = _POSIX_PATH_MAX;
++ char* current_directory = (char*)malloc(size);
++ getcwd(current_directory, size);
++
++ int rc = system (arg);
++ char msg[255];
++ if (rc == -1)
++ {
++ sprintf(msg, "Cannot execute '%s': %s.\n", arg, strerror(errno));
++ monitor_output(msg);
++ }
++ else if (rc != -1)
++ {
++ sprintf(msg, "'%s' exited with status %d.\n", arg, rc);
++ monitor_output(msg);
++ }
++
++ /* Make sure to return to the directory GDB thinks it is, in case the
++ shell command we just ran changed it. */
++ chdir(current_directory);
++ free(current_directory);
++ }
+ else if (strcmp (mon, "set debug 0") == 0)
+ {
+ debug_threads = 0;
+@@ -699,6 +910,11 @@ handle_query (char *own_buf, int packet_
+ own_buf[0] = 0;
+ }
+
++#ifdef _POSIX_PATH_MAX_WAS_UNDEFINED
++#undef _POSIX_PATH_MAX
++#undef _POSIX_PATH_MAX_WAS_UNDEFINED
++#endif
++
+ /* Parse vCont packets. */
+ void
+ handle_v_cont (char *own_buf, char *status, int *signal)
+@@ -1503,6 +1719,8 @@ main (int argc, char *argv[])
+ fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n",
+ target_signal_to_host (signal),
+ target_signal_to_name (signal));
++
++ kill_inferior();
+
+ if (extended_protocol)
+ goto restart;
+diff -urp gdb-6.8_orig/gdb/gdbserver/win32-low.c gdb-6.8/gdb/gdbserver/win32-low.c
+--- gdb-6.8_orig/gdb/gdbserver/win32-low.c 2008-02-14 14:41:39.000000000 -0800
++++ gdb-6.8/gdb/gdbserver/win32-low.c 2008-04-22 23:24:38.000000000 -0700
+@@ -38,7 +38,7 @@
+ #include <sys/cygwin.h>
+ #endif
+
+-#define LOG 0
++#define LOG 1
+
+ #define OUTMSG(X) do { printf X; fflush (stdout); } while (0)
+ #if LOG
+@@ -543,9 +543,9 @@ win32_create_inferior (char *program, ch
+ }
+ OUTMSG2 (("Command line is \"%s\"\n", args));
+
+-#ifdef CREATE_NEW_PROCESS_GROUP
++//#ifdef CREATE_NEW_PROCESS_GROUP
+ flags |= CREATE_NEW_PROCESS_GROUP;
+-#endif
++//#endif
+
+ ret = create_process (program, args, flags, &pi);
+ err = GetLastError ();
+@@ -684,8 +684,37 @@ win32_kill (void)
+ if (current_process_handle == NULL)
+ return;
+
+- TerminateProcess (current_process_handle, 0);
+- for (;;)
++ TerminateProcess (current_process_handle, 0);
++
++ // BKS - fix for terminating apps prior to their exit, lets go of execs.
++ winapi_DebugActiveProcessStop DebugActiveProcessStop = NULL;
++ winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit = NULL;
++#ifdef _WIN32_WCE
++ HMODULE dll = GetModuleHandle (_T("COREDLL.DLL"));
++#else
++ HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
++#endif
++ DebugActiveProcessStop = GETPROCADDRESS (dll, DebugActiveProcessStop);
++ DebugSetProcessKillOnExit = GETPROCADDRESS (dll, DebugSetProcessKillOnExit);
++
++ if (DebugSetProcessKillOnExit != NULL
++ && DebugActiveProcessStop != NULL)
++ {
++ {
++ struct thread_resume resume;
++ resume.thread = -1;
++ resume.step = 0;
++ resume.sig = 0;
++ resume.leave_stopped = 0;
++ win32_resume (&resume);
++ }
++
++ DebugActiveProcessStop (current_process_id);
++ DebugSetProcessKillOnExit (FALSE);
++ }
++ // end BKS
++
++ for (;;)
+ {
+ if (!child_continue (DBG_CONTINUE, -1))
+ break;
+@@ -1186,6 +1215,7 @@ handle_exception (struct target_waitstat
+
+ ourstatus->kind = TARGET_WAITKIND_STOPPED;
+
++ //printf("handle exception....................%X\n", (unsigned int)code);
+ switch (code)
+ {
+ case EXCEPTION_ACCESS_VIOLATION:
+@@ -1196,7 +1226,13 @@ handle_exception (struct target_waitstat
+ OUTMSG2 (("STATUS_STACK_OVERFLOW"));
+ ourstatus->value.sig = TARGET_SIGNAL_SEGV;
+ break;
+- case STATUS_FLOAT_DENORMAL_OPERAND:
++ // BKS
++ case STATUS_INVALID_HANDLE:
++ OUTMSG2 (("STATUS_INVALID_HANDLE"));
++ ourstatus->value.sig = TARGET_SIGNAL_TRAP;
++ break;
++ // BKS
++ case STATUS_FLOAT_DENORMAL_OPERAND:
+ OUTMSG2 (("STATUS_FLOAT_DENORMAL_OPERAND"));
+ ourstatus->value.sig = TARGET_SIGNAL_FPE;
+ break;
+@@ -1453,7 +1489,8 @@ get_child_debug_event (struct target_wai
+ (unsigned) current_event.dwThreadId));
+ ourstatus->kind = TARGET_WAITKIND_EXITED;
+ ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
+- CloseHandle (current_process_handle);
++ win32_kill(); // fixed problem with exec's not being let go after completion.
++ //CloseHandle (current_process_handle); // let this get done by win32_kill().
+ current_process_handle = NULL;
+ break;
+
+diff -urp gdb-6.8_orig/gdb/linespec.c gdb-6.8/gdb/linespec.c
+--- gdb-6.8_orig/gdb/linespec.c 2008-01-01 14:53:11.000000000 -0800
++++ gdb-6.8/gdb/linespec.c 2008-04-23 11:15:58.000000000 -0700
+@@ -1534,11 +1534,11 @@ symtab_from_filename (char **argptr, cha
+ file_symtab = lookup_symtab (copy);
+ if (file_symtab == 0)
+ {
+- if (!have_full_symbols () && !have_partial_symbols ())
+- error (_("No symbol table is loaded. Use the \"file\" command."));
++// if (!have_full_symbols () && !have_partial_symbols ())
++// error (_("No symbol table is loaded. Use the \"file\" command."));
+ if (not_found_ptr)
+ *not_found_ptr = 1;
+- throw_error (NOT_FOUND_ERROR, _("No source file named %s."), copy);
++ throw_error (NOT_FOUND_ERROR, _("No source file named %s in loaded symbols."), copy);
+ }
+
+ /* Discard the file name from the arg. */
+@@ -1744,13 +1744,13 @@ decode_variable (char *copy, int funfirs
+ if (msymbol != NULL)
+ return minsym_found (funfirstline, msymbol);
+
+- if (!have_full_symbols () &&
++ /*if (!have_full_symbols () &&
+ !have_partial_symbols () && !have_minimal_symbols ())
+- error (_("No symbol table is loaded. Use the \"file\" command."));
++ error (_("No symbol table is loaded. Use the \"file\" command."));*/
+
+ if (not_found_ptr)
+ *not_found_ptr = 1;
+- throw_error (NOT_FOUND_ERROR, _("Function \"%s\" not defined."), copy);
++ throw_error (NOT_FOUND_ERROR, _("Function \"%s\" not defined in loaded symbols."), copy);
+ }
+
+
+diff -urp gdb-6.8_orig/gdb/win32-nat.c gdb-6.8/gdb/win32-nat.c
+--- gdb-6.8_orig/gdb/win32-nat.c 2008-01-29 13:11:24.000000000 -0800
++++ gdb-6.8/gdb/win32-nat.c 2008-04-18 17:45:52.000000000 -0700
+@@ -1031,6 +1031,10 @@ handle_exception (struct target_waitstat
+ DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
+ ourstatus->value.sig = TARGET_SIGNAL_SEGV;
+ break;
++ case STATUS_INVALID_HANDLE:
++ DEBUG_EXCEPTION_SIMPLE ("STATUS_INVALID_HANDLE");
++ ourstatus->value.sig = TARGET_SIGNAL_TRAP;
++ break;
+ case STATUS_FLOAT_DENORMAL_OPERAND:
+ DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
+ ourstatus->value.sig = TARGET_SIGNAL_FPE;
diff --git a/recipes/gdb/gdb-6.8/gdb-6.8-mips-mingw-sim-fixup.patch b/recipes/gdb/gdb-6.8/gdb-6.8-mips-mingw-sim-fixup.patch
new file mode 100644
index 0000000000..2a31e29174
--- /dev/null
+++ b/recipes/gdb/gdb-6.8/gdb-6.8-mips-mingw-sim-fixup.patch
@@ -0,0 +1,17 @@
+---
+ sim/common/sim-signal.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: gdb-6.8/sim/common/sim-signal.c
+===================================================================
+--- gdb-6.8.orig/sim/common/sim-signal.c
++++ gdb-6.8/sim/common/sim-signal.c
+@@ -26,7 +26,7 @@ along with this program. If not, see <h
+ to not think the process has died (so it can be debugged at the point of
+ failure). */
+
+-#ifdef _MSC_VER
++#ifdef __WIN32
+ #ifndef SIGTRAP
+ #define SIGTRAP 5
+ #endif
diff --git a/recipes/gdb/gdb-6.8/gdb-6.8-pr9638-ppc-canadian-configh.patch b/recipes/gdb/gdb-6.8/gdb-6.8-pr9638-ppc-canadian-configh.patch
new file mode 100644
index 0000000000..83e85ba3cd
--- /dev/null
+++ b/recipes/gdb/gdb-6.8/gdb-6.8-pr9638-ppc-canadian-configh.patch
@@ -0,0 +1,179 @@
+diff -urN gdb-6.8-pl1/sim/ppc/Makefile.in gdb-6.8-pl2/sim/ppc/Makefile.in
+--- gdb-6.8-pl1/sim/ppc/Makefile.in 2006-05-31 17:14:45.000000000 +0200
++++ gdb-6.8-pl2/sim/ppc/Makefile.in 2008-09-30 15:56:33.000000000 +0200
+@@ -61,7 +61,7 @@
+ AR = @AR@
+ AR_FLAGS = rc
+ CC = @CC@
+-CFLAGS = @CFLAGS@
++CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H
+ CC_FOR_BUILD = @CC_FOR_BUILD@
+ CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
+ BISON = bison
+@@ -115,8 +115,8 @@
+ $(DEVZERO_CFLAGS)
+ SIM_FPU_CFLAGS = @sim_fpu_cflags@
+
+-STD_CFLAGS = $(CFLAGS) $(INLINE_CFLAGS) $(CONFIG_CFLAGS) $(WARNING_CFLAGS) $(SIM_CFLAGS) $(HDEFINES) $(TDEFINES) $(INCLUDES) $(INTL_CFLAGS) $(SIM_FPU_CFLAGS)
+-NOWARN_CFLAGS = $(CFLAGS) $(INLINE_CFLAGS) $(CONFIG_CFLAGS) $(SIM_CFLAGS) $(HDEFINES) $(TDEFINES) $(INCLUDES) $(SIM_FPU_CFLAGS)
++STD_CFLAGS = $(CFLAGS) -DHAVE_CONFIG_H $(INLINE_CFLAGS) $(CONFIG_CFLAGS) $(WARNING_CFLAGS) $(SIM_CFLAGS) $(HDEFINES) $(TDEFINES) $(INCLUDES) $(INTL_CFLAGS) $(SIM_FPU_CFLAGS)
++NOWARN_CFLAGS = $(CFLAGS) -DHAVE_CONFIG_H $(INLINE_CFLAGS) $(CONFIG_CFLAGS) $(SIM_CFLAGS) $(HDEFINES) $(TDEFINES) $(INCLUDES) $(SIM_FPU_CFLAGS)
+ BUILD_CFLAGS = $(CFLAGS_FOR_BUILD) $(INCLUDES) $(WARNING_CFLAGS)
+
+ BUILD_LDFLAGS =
+diff -urN gdb-6.8-orig/sim/ppc/basics.h gdb-6.8-pl1/sim/ppc/basics.h
+--- gdb-6.8-orig/sim/ppc/basics.h 1999-04-16 03:35:08.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/basics.h 2008-09-30 15:12:32.000000000 +0200
+@@ -86,7 +86,9 @@
+
+ /* Basic configuration */
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+ #include "ppc-config.h"
+ #include "inline.h"
+
+diff -urN gdb-6.8-orig/sim/ppc/debug.c gdb-6.8-pl1/sim/ppc/debug.c
+--- gdb-6.8-orig/sim/ppc/debug.c 1999-04-16 03:35:08.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/debug.c 2008-09-30 15:12:27.000000000 +0200
+@@ -22,7 +22,9 @@
+ #ifndef _DEBUG_C_
+ #define _DEBUG_C_
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+ #include "basics.h"
+
+ #ifdef HAVE_STDLIB_H
+diff -urN gdb-6.8-orig/sim/ppc/dgen.c gdb-6.8-pl1/sim/ppc/dgen.c
+--- gdb-6.8-orig/sim/ppc/dgen.c 1999-04-16 03:35:08.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/dgen.c 2008-09-30 15:12:22.000000000 +0200
+@@ -27,7 +27,9 @@
+ #include <ctype.h>
+ #include <stdarg.h>
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+ #include "misc.h"
+ #include "lf.h"
+ #include "table.h"
+diff -urN gdb-6.8-orig/sim/ppc/filter.c gdb-6.8-pl1/sim/ppc/filter.c
+--- gdb-6.8-orig/sim/ppc/filter.c 1999-04-16 03:35:09.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/filter.c 2008-09-30 15:12:15.000000000 +0200
+@@ -21,7 +21,9 @@
+
+ #include <stdio.h>
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+
+ #ifdef HAVE_STRING_H
+ #include <string.h>
+diff -urN gdb-6.8-orig/sim/ppc/filter_filename.c gdb-6.8-pl1/sim/ppc/filter_filename.c
+--- gdb-6.8-orig/sim/ppc/filter_filename.c 1999-04-16 03:35:08.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/filter_filename.c 2008-09-30 15:12:11.000000000 +0200
+@@ -18,7 +18,9 @@
+
+ */
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+ #include "ppc-config.h"
+ #include "filter_filename.h"
+
+diff -urN gdb-6.8-orig/sim/ppc/igen.c gdb-6.8-pl1/sim/ppc/igen.c
+--- gdb-6.8-orig/sim/ppc/igen.c 2003-06-20 05:59:33.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/igen.c 2008-09-30 15:12:06.000000000 +0200
+@@ -25,7 +25,9 @@
+ #include "misc.h"
+ #include "lf.h"
+ #include "table.h"
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+
+ #include "filter.h"
+
+diff -urN gdb-6.8-orig/sim/ppc/inline.c gdb-6.8-pl1/sim/ppc/inline.c
+--- gdb-6.8-orig/sim/ppc/inline.c 1999-04-16 03:35:10.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/inline.c 2008-09-30 15:11:58.000000000 +0200
+@@ -22,7 +22,9 @@
+ #ifndef _INLINE_C_
+ #define _INLINE_C_
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+ #include "ppc-config.h"
+
+ #include "inline.h"
+diff -urN gdb-6.8-orig/sim/ppc/lf.c gdb-6.8-pl1/sim/ppc/lf.c
+--- gdb-6.8-orig/sim/ppc/lf.c 2002-05-30 17:07:06.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/lf.c 2008-09-30 15:33:35.000000000 +0200
+@@ -23,7 +23,9 @@
+ #include <stdarg.h>
+ #include <ctype.h>
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+ #include "misc.h"
+ #include "lf.h"
+
+diff -urN gdb-6.8-orig/sim/ppc/misc.c gdb-6.8-pl1/sim/ppc/misc.c
+--- gdb-6.8-orig/sim/ppc/misc.c 1999-04-16 03:35:11.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/misc.c 2008-09-30 15:11:54.000000000 +0200
+@@ -23,7 +23,9 @@
+ #include <stdarg.h>
+ #include <ctype.h>
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+ #include "misc.h"
+
+ #ifdef HAVE_STDLIB_H
+diff -urN gdb-6.8-orig/sim/ppc/misc.h gdb-6.8-pl1/sim/ppc/misc.h
+--- gdb-6.8-orig/sim/ppc/misc.h 2002-01-12 11:21:12.000000000 +0100
++++ gdb-6.8-pl1/sim/ppc/misc.h 2008-09-30 15:11:49.000000000 +0200
+@@ -21,7 +21,9 @@
+
+ /* Frustrating header junk */
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+
+ #include <stdio.h>
+ #include <ctype.h>
+diff -urN gdb-6.8-orig/sim/ppc/sim-endian.c gdb-6.8-pl1/sim/ppc/sim-endian.c
+--- gdb-6.8-orig/sim/ppc/sim-endian.c 1999-04-16 03:35:11.000000000 +0200
++++ gdb-6.8-pl1/sim/ppc/sim-endian.c 2008-09-30 15:11:44.000000000 +0200
+@@ -22,7 +22,9 @@
+ #ifndef _SIM_ENDIAN_C_
+ #define _SIM_ENDIAN_C_
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+ #include "basics.h"
+
+
+diff -urN gdb-6.8-orig/sim/ppc/table.c gdb-6.8-pl1/sim/ppc/table.c
+--- gdb-6.8-orig/sim/ppc/table.c 2002-01-12 11:21:12.000000000 +0100
++++ gdb-6.8-pl1/sim/ppc/table.c 2008-09-30 15:11:38.000000000 +0200
+@@ -25,7 +25,9 @@
+ #include <fcntl.h>
+ #include <ctype.h>
+
++#ifdef HAVE_CONFIG_H
+ #include "config.h"
++#endif
+ #include "misc.h"
+ #include "lf.h"
+ #include "table.h"