diff --git a/dkarm-eabi/patches/gdb-7.12.1.patch b/dkarm-eabi/patches/gdb-7.12.1.patch
new file mode 100644
index 0000000..3357f84
--- /dev/null
+++ b/dkarm-eabi/patches/gdb-7.12.1.patch
@@ -0,0 +1,439 @@
+diff --git a/gdb/Makefile.in b/gdb/Makefile.in
+index bb7da14..d883835 100644
+--- a/gdb/Makefile.in
++++ b/gdb/Makefile.in
+@@ -658,6 +658,7 @@ ALL_64_TARGET_OBS = \
+ # All other target-dependent objects files (used with --enable-targets=all).
+ ALL_TARGET_OBS = \
+ armbsd-tdep.o arm.o arm-linux.o arm-linux-tdep.o \
++ arm-3ds-tdep.o \
+ arm-get-next-pcs.o arm-symbian-tdep.o \
+ armnbsd-tdep.o armobsd-tdep.o \
+ arm-tdep.o arm-wince-tdep.o \
+@@ -1679,6 +1680,7 @@ ALLDEPFILES = \
+ amd64-sol2-tdep.c \
+ arm.c arm-get-next-pcs.c \
+ arm-linux.c arm-linux-nat.c arm-linux-tdep.c \
++ arm-3ds-tdep.c \
+ arm-symbian-tdep.c arm-tdep.c \
+ armnbsd-nat.c armbsd-tdep.c armnbsd-tdep.c armobsd-tdep.c \
+ avr-tdep.c \
+diff --git a/gdb/arm-3ds-tdep.c b/gdb/arm-3ds-tdep.c
+new file mode 100644
+index 0000000..9fd9f41
+--- /dev/null
++++ b/gdb/arm-3ds-tdep.c
+@@ -0,0 +1,196 @@
++/* Target-dependent code for 3DS. */
++
++/* This uses code from GDB, which license is (copied from another file): */
++
++/*
++ Copyright (C) 2002-2017 Free Software Foundation, 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 . */
++
++#include "defs.h"
++#include "gdbcore.h"
++#include "target.h"
++#include "osabi.h"
++#include "xml-syscall.h"
++
++#include "arch/arm.h"
++#include "arch/arm-get-next-pcs.h"
++#include "arm-tdep.h"
++
++static const gdb_byte arm_3ds_arm_le_breakpoint[] = {0xff, 0x00, 0x00, 0xef};
++static const gdb_byte arm_3ds_thumb_le_breakpoint[] = {0xff, 0xdf};
++
++static CORE_ADDR
++ arm_3ds_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self);
++
++/* Operation function pointers for get_next_pcs. */
++static struct arm_get_next_pcs_ops arm_3ds_get_next_pcs_ops = {
++ arm_get_next_pcs_read_memory_unsigned_integer,
++ arm_3ds_get_next_pcs_syscall_next_pc,
++ arm_get_next_pcs_addr_bits_remove,
++ arm_get_next_pcs_is_thumb,
++ NULL,
++};
++
++static CORE_ADDR
++arm_3ds_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self)
++{
++ CORE_ADDR next_pc = 0;
++ CORE_ADDR pc = regcache_read_pc (self->regcache);
++ int is_thumb = arm_is_thumb (self->regcache);
++ ULONGEST svc_number = 0;
++
++ if (is_thumb)
++ {
++ next_pc = pc + 2;
++ }
++ else
++ {
++ next_pc = pc + 4;
++ }
++
++ /* Addresses for calling Thumb functions have the bit 0 set. */
++ if (is_thumb)
++ next_pc = MAKE_THUMB_ADDR (next_pc);
++
++ return next_pc;
++}
++
++static int
++arm_3ds_software_single_step (struct frame_info *frame)
++{
++ struct regcache *regcache = get_current_regcache ();
++ struct gdbarch *gdbarch = get_regcache_arch (regcache);
++ struct address_space *aspace = get_regcache_aspace (regcache);
++ struct arm_get_next_pcs next_pcs_ctx;
++ CORE_ADDR pc;
++ int i;
++ VEC (CORE_ADDR) *next_pcs = NULL;
++ struct cleanup *old_chain;
++
++ /* If the target does have hardware single step, GDB doesn't have
++ to bother software single step. */
++ if (target_can_do_single_step () == 1)
++ return 0;
++
++ old_chain = make_cleanup (VEC_cleanup (CORE_ADDR), &next_pcs);
++
++ arm_get_next_pcs_ctor (&next_pcs_ctx,
++ &arm_3ds_get_next_pcs_ops,
++ gdbarch_byte_order (gdbarch),
++ gdbarch_byte_order_for_code (gdbarch),
++ 1,
++ regcache);
++
++ next_pcs = arm_get_next_pcs (&next_pcs_ctx);
++
++ for (i = 0; VEC_iterate (CORE_ADDR, next_pcs, i, pc); i++)
++ arm_insert_single_step_breakpoint (gdbarch, aspace, pc);
++
++ do_cleanups (old_chain);
++
++ return 1;
++}
++
++static LONGEST
++arm_3ds_get_syscall_number (struct gdbarch *gdbarch,
++ ptid_t ptid)
++{
++ struct regcache *regs = get_thread_regcache (ptid);
++
++ ULONGEST pc;
++ ULONGEST cpsr;
++ ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
++ int is_thumb;
++ ULONGEST svc_number = -1;
++
++ regcache_cooked_read_unsigned (regs, ARM_PC_REGNUM, &pc);
++ regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &cpsr);
++ is_thumb = (cpsr & t_bit) != 0;
++
++ if (is_thumb)
++ {
++ enum bfd_endian byte_order_for_code =
++ gdbarch_byte_order_for_code (gdbarch);
++
++ /* PC gets incremented before the syscall-stop, so read the
++ previous instruction. */
++ unsigned long this_instr =
++ read_memory_unsigned_integer (pc - 2, 2, byte_order_for_code);
++
++ unsigned long svc_operand = (0x00ff & this_instr);
++ svc_number = svc_operand;
++ }
++ else
++ {
++ enum bfd_endian byte_order_for_code =
++ gdbarch_byte_order_for_code (gdbarch);
++
++ /* PC gets incremented before the syscall-stop, so read the
++ previous instruction. */
++ unsigned long this_instr =
++ read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
++
++ unsigned long svc_operand = (0x000000ff & this_instr);
++ svc_number = svc_operand;
++ }
++
++ if (svc_number == 0xfe)
++ {
++ regcache_cooked_read_unsigned (regs, 12, &svc_number);
++ }
++
++ return svc_number;
++}
++
++static void
++arm_3ds_init_abi (struct gdbarch_info info,
++ struct gdbarch *gdbarch)
++{
++ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
++
++ switch (info.byte_order)
++ {
++ case BFD_ENDIAN_LITTLE:
++ tdep->arm_breakpoint = arm_3ds_arm_le_breakpoint;
++ tdep->thumb_breakpoint = arm_3ds_thumb_le_breakpoint;
++ tdep->arm_breakpoint_size = sizeof (arm_3ds_arm_le_breakpoint);
++ tdep->thumb_breakpoint_size = sizeof (arm_3ds_thumb_le_breakpoint);
++ break;
++
++ default:
++ internal_error (__FILE__, __LINE__,
++ _("arm_gdbarch_init: bad byte order"));
++ }
++ tdep->fp_model = ARM_FLOAT_VFP;
++
++ /* Single stepping. */
++ set_gdbarch_software_single_step (gdbarch, arm_3ds_software_single_step);
++
++ /* `catch syscall' */
++ set_xml_syscall_file_name (gdbarch, "syscalls/arm-3ds.xml");
++ set_gdbarch_get_syscall_number (gdbarch, arm_3ds_get_syscall_number);
++}
++
++/* Provide a prototype to silence -Wmissing-prototypes. */
++extern initialize_file_ftype _initialize_arm_3ds_tdep;
++
++void
++_initialize_arm_3ds_tdep (void)
++{
++ gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_3DS,
++ arm_3ds_init_abi);
++}
+diff --git a/gdb/configure.tgt b/gdb/configure.tgt
+index 7f1aac3..8c213c0 100644
+--- a/gdb/configure.tgt
++++ b/gdb/configure.tgt
+@@ -111,8 +111,8 @@ arm*-*-symbianelf*)
+ gdb_target_obs="arm.o arm-get-next-pcs.o arm-tdep.o arm-symbian-tdep.o"
+ ;;
+ arm*-*-*)
+- # Target: ARM embedded system
+- gdb_target_obs="arm.o arm-get-next-pcs.o arm-tdep.o"
++ # Target: ARM embedded system (+ 3DS)
++ gdb_target_obs="arm.o arm-get-next-pcs.o arm-tdep.o arm-3ds-tdep.o"
+ gdb_sim=../sim/arm/libsim.a
+ ;;
+
+diff --git a/gdb/data-directory/Makefile.in b/gdb/data-directory/Makefile.in
+index 2597b3e..ae17d60 100644
+--- a/gdb/data-directory/Makefile.in
++++ b/gdb/data-directory/Makefile.in
+@@ -52,7 +52,7 @@ GEN_SYSCALLS_FILES = arm-linux.xml aarch64-linux.xml \
+ mips-o32-linux.xml mips-n32-linux.xml mips-n64-linux.xml \
+ s390-linux.xml s390x-linux.xml
+
+-SYSCALLS_FILES = gdb-syscalls.dtd freebsd.xml $(GEN_SYSCALLS_FILES)
++SYSCALLS_FILES = gdb-syscalls.dtd freebsd.xml arm-3ds.xml $(GEN_SYSCALLS_FILES)
+
+ PYTHON_DIR = python
+ PYTHON_INSTALL_DIR = $(DESTDIR)$(GDB_DATADIR)/$(PYTHON_DIR)
+diff --git a/gdb/defs.h b/gdb/defs.h
+index 66082c0..1b36f8a 100644
+--- a/gdb/defs.h
++++ b/gdb/defs.h
+@@ -616,6 +616,7 @@ enum gdb_osabi
+ GDB_OSABI_LYNXOS178,
+ GDB_OSABI_NEWLIB,
+ GDB_OSABI_SDE,
++ GDB_OSABI_3DS,
+
+ GDB_OSABI_INVALID /* keep this last */
+ };
+diff --git a/gdb/osabi.c b/gdb/osabi.c
+index 93c7b61..737029b 100644
+--- a/gdb/osabi.c
++++ b/gdb/osabi.c
+@@ -84,6 +84,7 @@ static const struct osabi_names gdb_osabi_names[] =
+ { "LynxOS178", NULL },
+ { "Newlib", NULL },
+ { "SDE", NULL },
++ { "3DS", NULL },
+
+ { "", NULL }
+ };
+diff --git a/gdb/syscalls/arm-3ds.xml b/gdb/syscalls/arm-3ds.xml
+new file mode 100644
+index 0000000..3414913
+--- /dev/null
++++ b/gdb/syscalls/arm-3ds.xml
+@@ -0,0 +1,159 @@
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
diff --git a/select_toolchain.sh b/select_toolchain.sh
index 7061b0d..6b32949 100755
--- a/select_toolchain.sh
+++ b/select_toolchain.sh
@@ -32,7 +32,7 @@ case "$VERSION" in
GCC_VER=7.1.0
BINUTILS_VER=2.28
NEWLIB_VER=2.5.0
- GDB_VER=7.12
+ GDB_VER=7.12.1
basedir='dkarm-eabi'
package=devkitARM
target=arm-none-eabi