diff -NBaur gdb-8.2/gdb/arm-3ds-tdep.c gdb-8.2-3ds/gdb/arm-3ds-tdep.c
--- gdb-8.2/gdb/arm-3ds-tdep.c	1970-01-01 01:00:00.000000000 +0100
+++ gdb-8.2-3ds/gdb/arm-3ds-tdep.c	2018-11-15 22:55:21.916968907 +0000
@@ -0,0 +1,157 @@
+/* Target-dependent code for 3DS. */
+
+/* This uses code from GDB, which license is: */
+
+/*
+   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 <http://www.gnu.org/licenses/>.  */
+
+#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 LONGEST
+arm_3ds_get_syscall_number (struct gdbarch *gdbarch,
+			      thread_info *thread)
+{
+  struct regcache *regs = get_thread_regcache (thread);
+
+  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_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);
+}
+
+void
+_initialize_arm_3ds_tdep (void)
+{
+  gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_3DS,
+                          arm_3ds_init_abi);
+}
diff -NBaur gdb-8.2/gdb/configure.tgt gdb-8.2-3ds/gdb/configure.tgt
--- gdb-8.2/gdb/configure.tgt	2018-09-05 08:44:28.000000000 +0100
+++ gdb-8.2-3ds/gdb/configure.tgt	2018-11-15 22:47:17.337689978 +0000
@@ -61,7 +61,7 @@
 	;;
 
 arm*-*-*)
-	cpu_obs="arch/arm.o arch/arm-get-next-pcs.o arm-tdep.o";;
+	cpu_obs="arch/arm.o arch/arm-get-next-pcs.o arm-tdep.o arm-3ds-tdep.o";;
 
 hppa*-*-*)
 	# Target: HP PA-RISC
diff -NBaur gdb-8.2/gdb/data-directory/Makefile.in gdb-8.2-3ds/gdb/data-directory/Makefile.in
--- gdb-8.2/gdb/data-directory/Makefile.in	2018-01-05 04:07:23.000000000 +0000
+++ gdb-8.2-3ds/gdb/data-directory/Makefile.in	2018-11-15 22:42:36.840956065 +0000
@@ -63,7 +63,7 @@
 	sparc-linux.xml \
 	sparc64-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 -NBaur gdb-8.2/gdb/defs.h gdb-8.2-3ds/gdb/defs.h
--- gdb-8.2/gdb/defs.h	2018-09-05 08:27:32.000000000 +0100
+++ gdb-8.2-3ds/gdb/defs.h	2018-11-15 22:42:36.840956065 +0000
@@ -495,6 +495,7 @@
   GDB_OSABI_LYNXOS178,
   GDB_OSABI_NEWLIB,
   GDB_OSABI_SDE,
+  GDB_OSABI_3DS,
 
   GDB_OSABI_INVALID		/* keep this last */
 };
diff -NBaur gdb-8.2/gdb/Makefile.in gdb-8.2-3ds/gdb/Makefile.in
--- gdb-8.2/gdb/Makefile.in	2018-09-05 08:44:28.000000000 +0100
+++ gdb-8.2-3ds/gdb/Makefile.in	2018-11-15 22:45:01.628931262 +0000
@@ -684,6 +684,7 @@
 	arch/arm-linux.o \
 	arch/i386.o \
 	arch/ppc-linux-common.o \
+	arm-3ds-tdep.o \
 	arm-bsd-tdep.o \
 	arm-fbsd-tdep.o \
 	arm-linux-tdep.o \
@@ -2213,6 +2214,7 @@
 	amd64-tdep.c \
 	arc-tdep.c \
 	arm.c \
+	arm-3ds-tdep.c \
 	arm-bsd-tdep.c \
 	arm-fbsd-nat.c \
 	arm-fbsd-tdep.c \
diff -NBaur gdb-8.2/gdb/osabi.c gdb-8.2-3ds/gdb/osabi.c
--- gdb-8.2/gdb/osabi.c	2018-09-05 08:27:13.000000000 +0100
+++ gdb-8.2-3ds/gdb/osabi.c	2018-11-15 22:42:36.840956065 +0000
@@ -80,6 +80,7 @@
   { "LynxOS178", NULL },
   { "Newlib", NULL },
   { "SDE", NULL },
+  { "3DS", NULL },
 
   { "<invalid>", NULL }
 };
diff -NBaur gdb-8.2/gdb/syscalls/arm-3ds.xml gdb-8.2-3ds/gdb/syscalls/arm-3ds.xml
--- gdb-8.2/gdb/syscalls/arm-3ds.xml	1970-01-01 01:00:00.000000000 +0100
+++ gdb-8.2-3ds/gdb/syscalls/arm-3ds.xml	2018-11-15 22:42:36.840956065 +0000
@@ -0,0 +1,159 @@
+<?xml version="1.0"?>
+<!DOCTYPE syscalls_info SYSTEM "gdb-syscalls.dtd">
+<!-- This file is located inside GDB and is based on files which license are: -->
+<!-- Copyright (C) 2009-2017 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  This file is offered as-is,
+     without any warranty. -->
+<syscalls_info>
+  <syscall name="ControlMemory" number="1" groups="memory"/>
+  <syscall name="QueryMemory" number="2" groups="memory"/>
+
+  <syscall name="ExitProcess" number="3" groups="process"/>
+  <syscall name="GetProcessAffinityMask" number="4" groups="process"/>
+  <syscall name="SetProcessAffinityMask" number="5" groups="process"/>
+  <syscall name="GetProcessIdealProcessor" number="6" groups="process"/>
+  <syscall name="SetProcessIdealProcessor" number="7" groups="process"/>
+
+  <syscall name="CreateThread" number="8" groups="thread"/>
+  <syscall name="ExitThread" number="9" groups="thread"/>
+  <syscall name="SleepThread" number="10" groups="thread"/>
+  <syscall name="GetThreadPriority" number="11" groups="thread"/>
+  <syscall name="SetThreadPriority" number="12" groups="thread"/>
+  <syscall name="GetThreadAffinityMask" number="13" groups="thread"/>
+  <syscall name="SetThreadAffinityMask" number="14" groups="thread"/> <!-- removed -->
+  <syscall name="GetThreadIdealProcessor" number="15" groups="thread"/>
+  <syscall name="SetThreadIdealProcessor" number="16" groups="thread"/> <!-- removed -->
+  <syscall name="GetCurrentProcessorNumber" number="17" groups="thread"/>
+  <syscall name="Run" number="18" groups="thread"/>
+
+  <syscall name="CreateMutex" number="19" groups="synchronization"/>
+  <syscall name="ReleaseMutex" number="20" groups="synchronization"/>
+  <syscall name="CreateSemaphore" number="21" groups="synchronization"/>
+  <syscall name="ReleaseSemaphore" number="22" groups="synchronization"/>
+  <syscall name="CreateEvent" number="23" groups="synchronization"/>
+  <syscall name="SignalEvent" number="24" groups="synchronization"/>
+  <syscall name="ClearEvent" number="25" groups="synchronization"/>
+  <syscall name="CreateTimer" number="26" groups="synchronization"/>
+  <syscall name="SetTimer" number="27" groups="synchronization"/>
+  <syscall name="CancelTimer" number="28" groups="synchronization"/>
+  <syscall name="ClearTimer" number="29" groups="synchronization"/>
+
+  <syscall name="CreateMemoryBlock" number="30" groups="memory,ipc"/>
+  <syscall name="MapMemoryBlock" number="31" groups="memory,ipc"/>
+  <syscall name="UnmapMemoryBlock" number="32" groups="memory,ipc"/>
+
+  <syscall name="CreateAddressArbiter" number="33" groups="memory,synchronization"/>
+  <syscall name="ArbitrateAddress" number="34" groups="memory,synchronization"/>
+
+  <syscall name="CloseHandle" number="35" groups="synchronization,ipc,memory,thread,process,debug"/>
+  <syscall name="WaitSynchronization" number="36" groups="synchronization,ipc,thread,process,debug"/>
+  <syscall name="WaitSynchronizationN" number="37" groups="synchronization,ipc,thread,process,debug"/>
+  <syscall name="SignalAndWait" number="38" groups="synchronization"/> <!-- removed -->
+  <syscall name="DuplicateHandle" number="39" groups="synchronization,ipc,memory,thread,process,debug"/>
+
+  <syscall name="GetSystemTick" number="40" groups="information"/>
+  <syscall name="GetHandleInfo" number="41" groups="information,synchronization,ipc,memory,thread,process,debug"/>
+  <syscall name="GetSystemInfo" number="42" groups="information"/>
+  <syscall name="GetProcessInfo" number="43" groups="information,process"/>
+  <syscall name="GetThreadInfo" number="44" groups="information,thread"/>
+
+  <syscall name="ConnectToPort" number="45" groups="ipc"/>
+  <syscall name="GetCFWInfo" number="46" groups="custom,information"/> <!-- deprecated -->
+  <syscall name="SendSyncRequest2" number="47" groups="ipc"/> <!-- removed -->
+  <syscall name="SendSyncRequest3" number="48" groups="ipc"/> <!-- removed -->
+  <syscall name="SendSyncRequest4" number="49" groups="ipc"/> <!-- removed -->
+  <syscall name="SendSyncRequest" number="50" groups="ipc"/> <!-- removed -->
+
+  <syscall name="OpenProcess" number="51" groups="process"/>
+  <syscall name="OpenThread" number="52" groups="thread"/>
+
+  <syscall name="GetProcessId" number="53" groups="process"/>
+  <syscall name="GetProcessIdOfThread" number="54" groups="process,thread"/>
+  <syscall name="GetThreadId" number="55" groups="thread"/>
+
+  <syscall name="GetResourceLimit" number="56" groups="process"/>
+  <syscall name="GetResourceLimitLimitValues" number="57" groups="process"/>
+  <syscall name="GetResourceLimitCurrentValues" number="58" groups="process"/>
+
+  <syscall name="GetThreadContext" number="59" groups="debug,thread"/> <!-- removed -->
+  <syscall name="Break" number="60" groups="debug"/>
+  <syscall name="OutputDebugString" number="61" groups="debug"/>
+  <syscall name="ControlPerformanceCounter" number="62" groups="debug"/>
+
+  <syscall name="CreatePort" number="71" groups="ipc"/>
+  <syscall name="CreateSessionToPort" number="72" groups="ipc"/>
+  <syscall name="CreateSession" number="73" groups="ipc"/>
+  <syscall name="AcceptSession" number="74" groups="ipc"/>
+  <syscall name="ReplyAndReceive1" number="75" groups="ipc"/>
+  <syscall name="ReplyAndReceive2" number="76" groups="ipc"/>
+  <syscall name="ReplyAndReceive3" number="77" groups="ipc"/>
+  <syscall name="ReplyAndReceive4" number="78" groups="ipc"/>
+  <syscall name="ReplyAndReceive" number="79" groups="ipc"/>
+
+  <syscall name="BindInterrupt" number="80" groups="io,synchronization"/>
+  <syscall name="UnbindInterrupt" number="81" groups="io,synchronization"/>
+  <syscall name="InvalidateProcessDataCache" number="82" groups="io,memory,process"/>
+  <syscall name="StoreProcessDataCache" number="83" groups="io,memory,process"/>
+  <syscall name="FlushProcessDataCache" number="84" groups="io,memory,process"/>
+
+  <syscall name="StartInterprocessDma" number="85" groups="io,memory,ipc"/>
+  <syscall name="StopDma" number="86" groups="io,memory,ipc"/>
+  <syscall name="GetDmaState" number="87" groups="io,memory,ipc"/>
+  <syscall name="RestartDma" number="88" groups="io,memory,ipc"/>
+
+  <syscall name="SetGpuProt" number="89" groups="io"/>
+  <syscall name="SetWifiEnabled" number="90" groups="io"/>
+
+  <syscall name="DebugActiveProcess" number="96" groups="debug,process"/>
+  <syscall name="BreakDebugProcess" number="97" groups="debug,process"/>
+  <syscall name="TerminateDebugProcess" number="98" groups="debug,process"/>
+  <syscall name="GetProcessDebugEvent" number="99" groups="debug"/>
+  <syscall name="ContinueDebugEvent" number="100" groups="debug"/>
+  <syscall name="GetProcessList" number="101" groups="information,debug,process"/>
+  <syscall name="GetThreadList" number="102" groups="information,debug,thread"/>
+  <syscall name="GetDebugThreadContext" number="103" groups="debug,thread"/>
+  <syscall name="SetDebugThreadContext" number="104" groups="debug,thread"/>
+  <syscall name="QueryDebugProcessMemory" number="105" groups="debug,process,memory"/>
+  <syscall name="ReadProcessMemory" number="106" groups="debug,process,memory"/>
+  <syscall name="WriteProcessMemory" number="107" groups="debug,process,memory"/>
+  <syscall name="SetHardwareBreakPoint" number="108" group="debug"/>
+  <syscall name="GetDebugThreadParam" number="109" group="debug,thread"/>
+
+  <syscall name="ControlProcessMemory" number="112" group="process,memory"/>
+  <syscall name="MapProcessMemory" number="113" group="process,memory"/>
+  <syscall name="UnmapProcessMemory" number="114" group="process,memory"/>
+
+  <syscall name="CreateCodeSet" number="115" group="process,memory"/>
+  <syscall name="RandomStub" number="116" group="process,memory"/> <!-- removed -->
+  <syscall name="CreateProcess" number="117" group="process"/>
+  <syscall name="TerminateProcess" number="118" group="process"/>
+  <syscall name="SetProcessResourceLimits" number="119" group="process"/>
+  <syscall name="CreateResourceLimit" number="120" group="process"/>
+  <syscall name="SetResourceLimitValues" number="121" group="process"/>
+  <syscall name="AddCodeSegment" number="122" group="process"/> <!-- removed -->
+
+  <syscall name="Backdoor" number="123" group="kernel"/>
+  <syscall name="KernelSetState" number="124" group="kernel"/>
+
+  <syscall name="QueryProcessMemory" number="125" group="process,memory"/>
+
+  <syscall name="CustomBackdoor" number="128" group="custom,kernel"/>
+
+  <syscall name="ConvertVAToPA" number="144" group="custom,io,memory"/>
+  <syscall name="FlushDataCacheRange" number="145" group="custom,io,memory"/>
+  <syscall name="FlushEntireDataCache" number="146" group="custom,io,memory"/>
+  <syscall name="InvalidateInstructionCacheRange" number="147" group="custom,io,memory"/>
+  <syscall name="InvalidateEntireInstructionCache" number="148" group="custom,io,memory"/>
+
+  <syscall name="MapProcessMemoryEx" number="160" group="custom,process,memory"/>
+  <syscall name="UnmapProcessMemoryEx" number="161" group="custom,process,memory"/>
+  <syscall name="ControlMemoryEx" number="162" group="custom,memory"/>
+
+  <syscall name="ControlService" number="176" group="custom,ipc"/>
+  <syscall name="CopyHandle" number="177" groups="custom,synchronization,ipc,thread,process,debug"/>
+  <syscall name="TranslateHandle" number="178" groups="custom,synchronization,ipc,thread,process,debug"/>
+
+</syscalls_info>
