Ed,
Attached is  patch for basic, get-it-going, support for freebsd arm to lldb.
lldb was cross built on 10.1 amd64 with llvm ToT.
Run on 10.1 arm/pandaboard.

Tom

>From 36465729a66b0fc13228a102e6855289a73afe5b Mon Sep 17 00:00:00 2001
From: Tom <t...@bumblecow.com>
Date: Mon, 13 Apr 2015 02:25:52 -0500
Subject: [PATCH] Add support for FreeBSD arm

Create class file for RegisterContextFreeBSD_arm
Define the general registers in the register interface

Add RegisterContextFreeBSD_arm.cpp to CMakeLists.txt to add to cmake build

Use the RegisterContextFreeBSD_arm in POSIXThread::GetRegisterContext
This hooks up the freebsd arm register interface to posix thread.

Fix RegisterContextPOSIX_arm::GetRegisterSet
The target triple should be 'arm' not 'aarch64'

Add arm sw brkpt insn to PlatformFreeBSD::GetSoftwareBreakpointTrapOpcode
---
 .../Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp   |   6 +
 source/Plugins/Process/POSIX/POSIXThread.cpp       |   7 +-
 source/Plugins/Process/Utility/CMakeLists.txt      |   1 +
 .../Process/Utility/RegisterContextFreeBSD_arm.cpp | 240 +++++++++++++++++++++
 .../Process/Utility/RegisterContextFreeBSD_arm.h   |  27 +++
 .../Process/Utility/RegisterContextPOSIX_arm.cpp   |   2 +-
 6 files changed, 281 insertions(+), 2 deletions(-)
 create mode 100644 source/Plugins/Process/Utility/RegisterContextFreeBSD_arm.cpp
 create mode 100644 source/Plugins/Process/Utility/RegisterContextFreeBSD_arm.h

diff --git a/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp b/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
index dd2ecfc..32b4bd3 100644
--- a/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
+++ b/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
@@ -344,6 +344,12 @@ PlatformFreeBSD::GetSoftwareBreakpointTrapOpcode (Target &target, BreakpointSite
             trap_opcode = g_ppc_opcode;
             trap_opcode_size = sizeof(g_ppc_opcode);
         }
+    case llvm::Triple::arm:
+    	{
+            static const uint8_t g_arm_opcode[] = { 0xfe, 0xde, 0xff, 0xe7 };
+            trap_opcode = g_arm_opcode;
+            trap_opcode_size = sizeof(g_arm_opcode);
+        }
     }
 
     if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size))
diff --git a/source/Plugins/Process/POSIX/POSIXThread.cpp b/source/Plugins/Process/POSIX/POSIXThread.cpp
index 6ae6683..931a2e4 100644
--- a/source/Plugins/Process/POSIX/POSIXThread.cpp
+++ b/source/Plugins/Process/POSIX/POSIXThread.cpp
@@ -41,6 +41,7 @@
 #include "Plugins/Process/Utility/RegisterContextLinux_arm64.h"
 #include "Plugins/Process/Utility/RegisterContextLinux_i386.h"
 #include "Plugins/Process/Utility/RegisterContextLinux_x86_64.h"
+#include "Plugins/Process/Utility/RegisterContextFreeBSD_arm.h"
 #include "Plugins/Process/Utility/RegisterContextFreeBSD_i386.h"
 #include "Plugins/Process/Utility/RegisterContextFreeBSD_mips64.h"
 #include "Plugins/Process/Utility/RegisterContextFreeBSD_powerpc.h"
@@ -171,7 +172,11 @@ POSIXThread::GetRegisterContext()
             case llvm::Triple::FreeBSD:
                 switch (target_arch.GetMachine())
                 {
-                    case llvm::Triple::ppc:
+                    case llvm::Triple::arm:
+                        reg_interface = new RegisterContextFreeBSD_arm(target_arch);
+                        break;
+
+		    case llvm::Triple::ppc:
 #ifndef __powerpc64__
                         reg_interface = new RegisterContextFreeBSD_powerpc32(target_arch);
                         break;
diff --git a/source/Plugins/Process/Utility/CMakeLists.txt b/source/Plugins/Process/Utility/CMakeLists.txt
index 00ed362..0b0b6ac 100644
--- a/source/Plugins/Process/Utility/CMakeLists.txt
+++ b/source/Plugins/Process/Utility/CMakeLists.txt
@@ -15,6 +15,7 @@ add_lldb_library(lldbPluginProcessUtility
   RegisterContextDarwin_i386.cpp
   RegisterContextDarwin_x86_64.cpp
   RegisterContextDummy.cpp
+  RegisterContextFreeBSD_arm.cpp
   RegisterContextFreeBSD_arm64.cpp
   RegisterContextFreeBSD_i386.cpp
   RegisterContextFreeBSD_mips64.cpp
diff --git a/source/Plugins/Process/Utility/RegisterContextFreeBSD_arm.cpp b/source/Plugins/Process/Utility/RegisterContextFreeBSD_arm.cpp
new file mode 100644
index 0000000..af8697f
--- /dev/null
+++ b/source/Plugins/Process/Utility/RegisterContextFreeBSD_arm.cpp
@@ -0,0 +1,240 @@
+//===-- RegisterContextFreeBSD_arm.cpp ------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===---------------------------------------------------------------------===//
+
+#include "RegisterContextFreeBSD_arm.h"
+
+using namespace lldb_private;
+using namespace lldb;
+
+// http://svnweb.freebsd.org/base/head/sys/arm/include/reg.h
+struct reg
+{
+    uint32_t r[13];
+    uint32_t r_sp;
+    uint32_t r_lr;
+    uint32_t r_pc;
+    uint32_t r_cpsr;
+};
+
+RegisterContextFreeBSD_arm::RegisterContextFreeBSD_arm(const ArchSpec &target_arch)
+    : RegisterInfoInterface(target_arch)
+{
+}
+
+size_t
+RegisterContextFreeBSD_arm::GetGPRSize() const
+{
+    return sizeof(reg);
+}
+
+#include "ARM_GCC_Registers.h"
+#include "ARM_DWARF_Registers.h"
+
+enum
+{
+    gpr_r0 = 0,
+    gpr_r1,
+    gpr_r2,
+    gpr_r3,
+    gpr_r4,
+    gpr_r5,
+    gpr_r6,
+    gpr_r7,
+    gpr_r8,
+    gpr_r9,
+    gpr_r10,
+    gpr_r11,
+    gpr_r12,
+    gpr_r13,
+    gpr_sp = gpr_r13,
+    gpr_r14,
+    gpr_lr = gpr_r14,
+    gpr_r15,
+    gpr_pc = gpr_r15,
+    gpr_cpsr,
+
+    k_num_registers
+};
+
+#define GPR_OFFSET(idx) ((idx)*4)
+static RegisterInfo g_register_infos_arm[] = {
+    // name, alt_name, byte_size, byte_offset, encoding, format, kinds, value_regs, invalidate_regs
+    {"r0",
+     NULL,
+     4,
+     GPR_OFFSET(0),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r0, dwarf_r0, LLDB_INVALID_REGNUM, gdb_arm_r0, gpr_r0},
+     NULL,
+     NULL},
+    {"r1",
+     NULL,
+     4,
+     GPR_OFFSET(1),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r1, dwarf_r1, LLDB_INVALID_REGNUM, gdb_arm_r1, gpr_r1},
+     NULL,
+     NULL},
+    {"r2",
+     NULL,
+     4,
+     GPR_OFFSET(2),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r2, dwarf_r2, LLDB_INVALID_REGNUM, gdb_arm_r2, gpr_r2},
+     NULL,
+     NULL},
+    {"r3",
+     NULL,
+     4,
+     GPR_OFFSET(3),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r3, dwarf_r3, LLDB_INVALID_REGNUM, gdb_arm_r3, gpr_r3},
+     NULL,
+     NULL},
+    {"r4",
+     NULL,
+     4,
+     GPR_OFFSET(4),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r4, dwarf_r4, LLDB_INVALID_REGNUM, gdb_arm_r4, gpr_r4},
+     NULL,
+     NULL},
+    {"r5",
+     NULL,
+     4,
+     GPR_OFFSET(5),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r5, dwarf_r5, LLDB_INVALID_REGNUM, gdb_arm_r5, gpr_r5},
+     NULL,
+     NULL},
+    {"r6",
+     NULL,
+     4,
+     GPR_OFFSET(6),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r6, dwarf_r6, LLDB_INVALID_REGNUM, gdb_arm_r6, gpr_r6},
+     NULL,
+     NULL},
+    {"r7",
+     NULL,
+     4,
+     GPR_OFFSET(7),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, gdb_arm_r7, gpr_r7},
+     NULL,
+     NULL},
+    {"r8",
+     NULL,
+     4,
+     GPR_OFFSET(8),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r8, dwarf_r8, LLDB_INVALID_REGNUM, gdb_arm_r8, gpr_r8},
+     NULL,
+     NULL},
+    {"r9",
+     NULL,
+     4,
+     GPR_OFFSET(9),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r9, dwarf_r9, LLDB_INVALID_REGNUM, gdb_arm_r9, gpr_r9},
+     NULL,
+     NULL},
+    {"r10",
+     NULL,
+     4,
+     GPR_OFFSET(10),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r10, dwarf_r10, LLDB_INVALID_REGNUM, gdb_arm_r10, gpr_r10},
+     NULL,
+     NULL},
+    {"r11",
+     NULL,
+     4,
+     GPR_OFFSET(11),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r11, dwarf_r11, LLDB_INVALID_REGNUM, gdb_arm_r11, gpr_r11},
+     NULL,
+     NULL},
+    {"r12",
+     NULL,
+     4,
+     GPR_OFFSET(12),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_r12, dwarf_r12, LLDB_INVALID_REGNUM, gdb_arm_r12, gpr_r12},
+     NULL,
+     NULL},
+    {"sp",
+     "r13",
+     4,
+     GPR_OFFSET(13),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, gdb_arm_sp, gpr_sp},
+     NULL,
+     NULL},
+    {"lr",
+     "r14",
+     4,
+     GPR_OFFSET(14),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, gdb_arm_lr, gpr_lr},
+     NULL,
+     NULL},
+    {"pc",
+     "r15",
+     4,
+     GPR_OFFSET(15),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, gdb_arm_pc, gpr_pc},
+     NULL,
+     NULL},
+    {"cpsr",
+     "psr",
+     4,
+     GPR_OFFSET(16),
+     eEncodingUint,
+     eFormatHex,
+     {gcc_cpsr, dwarf_cpsr, LLDB_REGNUM_GENERIC_FLAGS, gdb_arm_cpsr, gpr_cpsr},
+     NULL,
+     NULL},
+};
+
+const RegisterInfo *
+RegisterContextFreeBSD_arm::GetRegisterInfo() const
+{
+    switch (m_target_arch.GetMachine())
+    {
+        case llvm::Triple::arm:
+            return g_register_infos_arm;
+        default:
+            assert(false && "Unhandled target architecture.");
+            return NULL;
+    }
+}
+
+uint32_t
+RegisterContextFreeBSD_arm::GetRegisterCount() const
+{
+    return static_cast<uint32_t>(sizeof(g_register_infos_arm) / sizeof(g_register_infos_arm[0]));
+}
diff --git a/source/Plugins/Process/Utility/RegisterContextFreeBSD_arm.h b/source/Plugins/Process/Utility/RegisterContextFreeBSD_arm.h
new file mode 100644
index 0000000..f1f742a
--- /dev/null
+++ b/source/Plugins/Process/Utility/RegisterContextFreeBSD_arm.h
@@ -0,0 +1,27 @@
+//===-- RegisterContextFreeBSD_arm.h ---------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_RegisterContextFreeBSD_arm_H_
+#define liblldb_RegisterContextFreeBSD_arm_H_
+
+#include "RegisterContextPOSIX.h"
+
+class RegisterContextFreeBSD_arm : public lldb_private::RegisterInfoInterface
+{
+  public:
+    RegisterContextFreeBSD_arm(const lldb_private::ArchSpec &target_arch);
+
+    size_t GetGPRSize() const override;
+
+    const lldb_private::RegisterInfo *GetRegisterInfo() const override;
+
+    uint32_t GetRegisterCount() const override;
+};
+
+#endif
diff --git a/source/Plugins/Process/Utility/RegisterContextPOSIX_arm.cpp b/source/Plugins/Process/Utility/RegisterContextPOSIX_arm.cpp
index b79cc76..d306f86 100644
--- a/source/Plugins/Process/Utility/RegisterContextPOSIX_arm.cpp
+++ b/source/Plugins/Process/Utility/RegisterContextPOSIX_arm.cpp
@@ -229,7 +229,7 @@ RegisterContextPOSIX_arm::GetRegisterSet(size_t set)
     {
         switch (m_register_info_ap->m_target_arch.GetMachine())
         {
-            case llvm::Triple::aarch64:
+            case llvm::Triple::arm:
                 return &g_reg_sets_arm[set];
             default:
                 assert(false && "Unhandled target architecture.");
-- 
2.3.3

_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to