Browse Source

gdb功能改为函数ops

shaojinchun 3 years ago
parent
commit
03f199195b

+ 0 - 16
components/finsh/msh.c

@@ -297,18 +297,10 @@ static int _msh_exec_cmd(char *cmd, rt_size_t length, int *retp)
     return 0;
 }
 
-#ifdef RT_USING_GDBSERVER
 pid_t exec(char*, int, int, char**);
-#else
-pid_t exec(char*, int, char**);
-#endif
 
 #if defined(RT_USING_LWP) && defined(RT_USING_DFS)
-#ifdef RT_USING_GDBSERVER
 int _msh_exec_lwp(int debug, char *cmd, rt_size_t length)
-#else
-int _msh_exec_lwp(char *cmd, rt_size_t length)
-#endif
 {
     int argc;
     int cmd0_size = 0;
@@ -365,11 +357,7 @@ int _msh_exec_lwp(char *cmd, rt_size_t length)
     /* found program */
     close(fd);
 
-#ifdef RT_USING_GDBSERVER
     ret = exec(pg_name, debug, argc, argv);
-#else
-    ret = exec(pg_name, argc, argv);
-#endif
     if (pg_name != argv[0])
         rt_free(pg_name);
 
@@ -543,13 +531,9 @@ int msh_exec(char *cmd, rt_size_t length)
 #endif
 
 #ifdef RT_USING_LWP
-#ifdef RT_USING_GDBSERVER
     /* exec from msh_exec , debug = 0*/
     /* _msh_exec_lwp return is pid , <= 0 means failed */
     if (_msh_exec_lwp(0, cmd, length) > 0)
-#else
-    if (_msh_exec_lwp(cmd, length) > 0)
-#endif
     {
         return 0;
     }

+ 19 - 13
components/lwp/arch/aarch64/cortex-a/lwp_gcc.S

@@ -215,10 +215,8 @@ SVC_Handler:
     cmp x0, #0xe000
     beq lwp_signal_quit
 
-#ifdef RT_USING_GDBSERVER
     cmp x0, #0xf000
     beq ret_from_user
-#endif
 
     uxtb x0, w8
     bl lwp_get_sys_api
@@ -280,8 +278,10 @@ ret_to_user:
     stp x0, x1, [sp, #-0x10]!
     stp x29, x30, [sp, #-0x10]!
 
-#ifdef RT_USING_GDBSERVER
-    bl thread_is_in_debug
+    ldr x0, =rt_dbg_ops
+    ldr x0, [x0]
+    cbz x0, 3f
+    bl dbg_thread_in_debug
     mov x1, #(1 << 21)
     mrs x2, spsr_el1
     cbz w0, 1f
@@ -291,7 +291,7 @@ ret_to_user:
     bic x2, x2, x1
 2:
     msr spsr_el1, x2
-#endif
+3:
 
     bl lwp_signal_check
     cmp x0, xzr
@@ -320,7 +320,12 @@ ret_to_user:
 
     bne user_do_signal
 
-#ifdef RT_USING_GDBSERVER
+    stp x0, x1, [sp, #-0x10]!
+    ldr x0, =rt_dbg_ops
+    ldr x0, [x0]
+    cmp x0, xzr
+    ldp x0, x1, [sp], #0x10
+    beq 1f
     SAVE_FPU sp
     stp x0, x1, [sp, #-0x10]!
     stp x2, x3, [sp, #-0x10]!
@@ -342,7 +347,7 @@ ret_to_user:
     stp x0, x1, [sp, #-0x10]!
     stp x29, x30, [sp, #-0x10]!
     mrs x0, elr_el1
-    bl lwp_check_debug_attach_req
+    bl dbg_attach_req
     ldp x29, x30, [sp], #0x10
     ldp x0, x1, [sp], #0x10
     msr fpcr, x0
@@ -363,7 +368,7 @@ ret_to_user:
     ldp x2, x3, [sp], #0x10
     ldp x0, x1, [sp], #0x10
     RESTORE_FPU sp
-#endif
+1:
     eret
 
 .global lwp_check_exit
@@ -460,9 +465,13 @@ struct rt_hw_exp_stack
                                 0x220 = 0x120 + 0x10 * 0x10
 };
 */
-#ifdef RT_USING_GDBSERVER
 .global lwp_check_debug
 lwp_check_debug:
+    ldr x0, =rt_dbg_ops
+    ldr x0, [x0]
+    cbnz x0, 1f
+    ret
+1:
     SAVE_FPU sp
     stp x0, x1, [sp, #-0x10]!
     stp x2, x3, [sp, #-0x10]!
@@ -484,7 +493,7 @@ lwp_check_debug:
     stp x0, x1, [sp, #-0x10]!
     stp x29, x30, [sp, #-0x10]!
 
-    bl lwp_check_debug_suspend
+    bl dbg_check_suspend
     cmp w0, wzr
     beq lwp_check_debug_quit
 
@@ -546,7 +555,6 @@ lwp_check_debug_quit:
     ldp x0, x1, [sp], #0x10
     RESTORE_FPU sp
     ret
-#endif
 
 lwp_signal_quit:
     msr daifset, #3
@@ -646,11 +654,9 @@ user_do_signal:
     mov x30, x20
     eret
 
-#ifdef RT_USING_GDBSERVER
 lwp_debugreturn:
     mov x9, 0xf000
     svc #0
-#endif
 
 lwp_sigreturn:
     mov x8, #0xe000

+ 16 - 8
components/lwp/arch/arm/cortex-a/lwp_gcc.S

@@ -169,10 +169,8 @@ vector_swi:
     cmp r0, #0xe000
     beq lwp_signal_quit
 
-#ifdef RT_USING_GDBSERVER
     cmp r0, #0xf000
     beq ret_from_user
-#endif
     and r0, r7, #0xff
     bl lwp_get_sys_api
     cmp r0, #0           /* r0 = api */
@@ -195,12 +193,18 @@ ret_to_user:
     cmp r0, #0
     pop {r0-r3, r12, lr}
     bne user_do_signal
-#ifdef RT_USING_GDBSERVER
+
+    push {r0}
+    ldr r0, =rt_dbg_ops
+    ldr r0, [r0]
+    cmp r0, #0
+    pop  {r0}
+    beq 1f
     push {r0-r3, r12, lr}
     mov r0, lr
-    bl lwp_check_debug_attach_req
+    bl dbg_attach_req
     pop {r0-r3, r12, lr}
-#endif
+1:
     movs pc, lr
 
 #ifdef RT_USING_LWP
@@ -216,11 +220,16 @@ lwp_check_exit:
     pop {r0 - r12, pc}
 #endif
 
-#ifdef RT_USING_GDBSERVER
 .global lwp_check_debug
 lwp_check_debug:
+    ldr r0, =rt_dbg_ops
+    ldr r0, [r0]
+    cmp r0, #0
+    bne 1f
+    bx  lr
+1:
     push {r0 - r12, lr}
-    bl lwp_check_debug_suspend
+    bl dbg_check_suspend
     cmp r0, #0
     beq lwp_check_debug_quit
 
@@ -263,7 +272,6 @@ ret_from_user:
     msr spsr_cxsf, r4
 lwp_check_debug_quit:
     pop {r0 - r12, pc}
-#endif
 
 lwp_signal_quit:
     cpsid i

+ 6 - 27
components/lwp/lwp.c

@@ -30,11 +30,6 @@
 #include <rtdbg.h>
 
 #ifdef RT_USING_USERSPACE
-#ifdef RT_USING_GDBSERVER
-#include <hw_breakpoint.h>
-#include <lwp_gdbserver.h>
-#endif
-
 #include <lwp_mm_area.h>
 #include <lwp_user_mm.h>
 #endif /* end of RT_USING_USERSPACE */
@@ -1059,15 +1054,13 @@ static void lwp_thread_entry(void *parameter)
     tid->cleanup = lwp_cleanup;
     tid->user_stack = RT_NULL;
 
-#ifdef RT_USING_GDBSERVER
     if (lwp->debug)
     {
         lwp->bak_first_ins = *(uint32_t *)lwp->text_entry;
-        *(uint32_t *)lwp->text_entry = INS_BREAK_CONNECT;
+        *(uint32_t *)lwp->text_entry = dbg_get_ins();
         rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, lwp->text_entry, sizeof(uint32_t));
         icache_invalid_all();
     }
-#endif
 
 #ifdef ARCH_MM_MMU
     lwp_user_entry(lwp->args, lwp->text_entry, (void *)USER_STACK_VEND, tid->stack_addr + tid->stack_size);
@@ -1089,11 +1082,7 @@ struct rt_lwp *lwp_self(void)
     return RT_NULL;
 }
 
-#ifdef RT_USING_GDBSERVER
 pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp)
-#else
-pid_t lwp_execve(char *filename, int argc, char **argv, char **envp)
-#endif
 {
     int result;
     rt_base_t level;
@@ -1248,12 +1237,10 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp)
 #endif /* not defined ARCH_MM_MMU */
             rt_list_insert_after(&lwp->t_grp, &thread->sibling);
 
-#ifdef RT_USING_GDBSERVER
-            if (debug)
+            if (debug && rt_dbg_ops)
             {
                 lwp->debug = debug;
             }
-#endif
             rt_hw_interrupt_enable(level);
 
             rt_thread_startup(thread);
@@ -1273,17 +1260,10 @@ extern char **__environ;
 char __environ = 0;
 #endif
 
-#ifdef RT_USING_GDBSERVER
 pid_t exec(char *filename, int debug, int argc, char **argv)
 {
     return lwp_execve(filename, debug, argc, argv, __environ);
 }
-#else
-pid_t exec(char *filename, int argc, char **argv)
-{
-    return lwp_execve(filename, argc, argv, __environ);
-}
-#endif
 
 #ifdef ARCH_MM_MMU
 void lwp_user_setting_save(rt_thread_t thread)
@@ -1302,7 +1282,7 @@ void lwp_user_setting_restore(rt_thread_t thread)
     }
     rt_cpu_set_thread_idr(thread->thread_idr);
 
-#ifdef RT_USING_GDBSERVER
+    if (rt_dbg_ops)
     {
         struct rt_lwp *l = (struct rt_lwp *)thread->lwp;
 
@@ -1318,18 +1298,17 @@ void lwp_user_setting_restore(rt_thread_t thread)
         {
             uint32_t step_type = 0;
 
-            step_type = gdb_get_step_type();
+            step_type = dbg_step_type();
 
             if ((step_type == 2) || (thread->step_exec && (step_type == 1)))
             {
-                arch_activate_step();
+                dbg_activate_step();
             }
             else
             {
-                arch_deactivate_step();
+                dbg_deactivate_step();
             }
         }
     }
-#endif
 }
 #endif /* ARCH_MM_MMU */

+ 27 - 2
components/lwp/lwp.h

@@ -113,10 +113,8 @@ struct rt_lwp
 
     struct lwp_avl_struct *address_search_head; /* for addressed object fast rearch */
     char working_directory[DFS_PATH_MAX];
-#ifdef RT_USING_GDBSERVER
     int debug;
     uint32_t bak_first_ins;
-#endif
 };
 
 struct rt_lwp *lwp_self(void);
@@ -263,4 +261,31 @@ struct lwp_args_info
     int size;
 };
 
+struct dbg_ops_t
+{
+    int (*dbg)(int argc, char **argv);
+    uint32_t (*arch_get_ins)(void);
+    void (*arch_activate_step)(void);
+    void (*arch_deactivate_step)(void);
+    int (*check_debug_event)(struct rt_hw_exp_stack *regs, unsigned long esr);
+    rt_channel_t (*gdb_get_server_channel)(void);
+    int (*gdb_get_step_type)(void);
+    void (*lwp_check_debug_attach_req)(void *pc);
+    int (*lwp_check_debug_suspend)(void);
+};
+extern struct dbg_ops_t *rt_dbg_ops;
+
+int dbg_thread_in_debug(void);
+void dbg_register(struct dbg_ops_t *dbg_ops);
+
+uint32_t dbg_get_ins(void);
+void dbg_activate_step(void);
+void dbg_deactivate_step(void);
+int dbg_check_event(struct rt_hw_exp_stack *regs, unsigned long arg);
+rt_channel_t gdb_server_channel(void);
+int dbg_step_type(void);
+void dbg_attach_req(void *pc);
+int dbg_check_suspend(void);
+void set_process_id(int pid);
+
 #endif

+ 119 - 0
components/lwp/lwp_dbg.c

@@ -0,0 +1,119 @@
+#include <rtthread.h>
+#include <rthw.h>
+#include <lwp.h>
+
+int dbg_thread_in_debug(void)
+{
+    int ret = 0;
+    struct rt_lwp *lwp = lwp_self();
+
+    if (lwp && lwp->debug)
+    {
+        ret = 1;
+    }
+    return ret;
+}
+
+struct dbg_ops_t *rt_dbg_ops = RT_NULL;
+RTM_EXPORT(rt_dbg_ops);
+
+void dbg_register(struct dbg_ops_t *dbg_ops)
+{
+    rt_dbg_ops = dbg_ops;
+}
+RTM_EXPORT(dbg_register);
+
+static int dbg(int argc, char **argv)
+{
+    int ret = -1;
+
+    if (rt_dbg_ops)
+    {
+        ret = rt_dbg_ops->dbg(argc, argv);
+    }
+    else
+    {
+        rt_kprintf("Error: DBG command is not enabled!\n");
+    }
+    return ret;
+}
+MSH_CMD_EXPORT(dbg, dbg);
+
+uint32_t dbg_get_ins(void)
+{
+    uint32_t ins = 0;
+
+    if (rt_dbg_ops)
+    {
+        ins = rt_dbg_ops->arch_get_ins();
+    }
+    return ins;
+}
+
+void dbg_activate_step(void)
+{
+    if (rt_dbg_ops)
+    {
+        rt_dbg_ops->arch_activate_step();
+    }
+}
+
+void dbg_deactivate_step(void)
+{
+    if (rt_dbg_ops)
+    {
+        rt_dbg_ops->arch_deactivate_step();
+    }
+}
+
+int dbg_check_event(struct rt_hw_exp_stack *regs, unsigned long esr)
+{
+    int ret = 0;
+
+    if (rt_dbg_ops)
+    {
+        ret = rt_dbg_ops->check_debug_event(regs, esr);
+    }
+    return ret;
+}
+
+rt_channel_t gdb_server_channel(void)
+{
+    rt_channel_t ret = RT_NULL;
+
+    if (rt_dbg_ops)
+    {
+        ret = rt_dbg_ops->gdb_get_server_channel();
+    }
+    return ret;
+}
+
+int dbg_step_type(void)
+{
+    int ret = 0;
+
+    if (rt_dbg_ops)
+    {
+        ret = rt_dbg_ops->gdb_get_step_type();
+    }
+    return ret;
+}
+
+void dbg_attach_req(void *pc)
+{
+    if (rt_dbg_ops)
+    {
+        rt_dbg_ops->lwp_check_debug_attach_req(pc);
+    }
+}
+
+int dbg_check_suspend(void)
+{
+    int ret = 0;
+
+    if (rt_dbg_ops)
+    {
+        ret = rt_dbg_ops->lwp_check_debug_suspend();
+    }
+    return ret;
+}

+ 1 - 9
components/lwp/lwp_pid.c

@@ -19,12 +19,6 @@
 
 #ifdef RT_USING_USERSPACE
 #include "lwp_user_mm.h"
-
-#ifdef RT_USING_GDBSERVER
-#include <hw_breakpoint.h>
-#include <lwp_gdbserver.h>
-#endif
-
 #endif
 
 #define DBG_TAG    "LWP_PID"
@@ -503,15 +497,13 @@ void lwp_ref_dec(struct rt_lwp *lwp)
         ref = lwp->ref;
         if (!ref)
         {
-#ifdef RT_USING_GDBSERVER
             struct rt_channel_msg msg;
 
             if (lwp->debug)
             {
                 memset(&msg, 0, sizeof msg);
-                rt_raw_channel_send(gdb_get_server_channel(), &msg);
+                rt_raw_channel_send(gdb_server_channel(), &msg);
             }
-#endif /* RT_USING_GDBSERVER */
 
 #ifndef ARCH_MM_MMU
 #ifdef RT_LWP_USING_SHM

+ 0 - 8
components/lwp/lwp_syscall.c

@@ -1005,19 +1005,11 @@ int sys_settimeofday(const struct timeval *tv, const struct timezone *tzp)
     return 0;
 }
 
-#ifdef RT_USING_GDBSERVER
 int lwp_execve(char *filename, int debug, int argc, char **argv, char **envp);
-#else
-int lwp_execve(char *filename, int argc, char **argv, char **envp);
-#endif
 
 int sys_exec(char *filename, int argc, char **argv, char **envp)
 {
-#ifdef RT_USING_GDBSERVER
     return lwp_execve(filename, 0, argc, argv, envp);
-#else
-    return lwp_execve(filename, argc, argv, envp);
-#endif
 }
 
 int sys_kill(int pid, int sig)

+ 0 - 6
components/lwp/lwp_tid.c

@@ -15,12 +15,6 @@
 
 #ifdef RT_USING_USERSPACE
 #include "lwp_user_mm.h"
-
-#ifdef RT_USING_GDBSERVER
-#include <hw_breakpoint.h>
-#include <lwp_gdbserver.h>
-#endif
-
 #endif
 
 #define DBG_TAG    "LWP_TID"

+ 0 - 5
components/lwp/lwp_user_mm.c

@@ -23,11 +23,6 @@
 #include <lwp_user_mm.h>
 #include <lwp_arch.h>
 
-#ifdef RT_USING_GDBSERVER
-#include <lwp_gdbserver.h>
-#include <hw_breakpoint.h>
-#endif
-
 int lwp_user_space_init(struct rt_lwp *lwp)
 {
     return arch_user_space_init(lwp);

+ 0 - 2
include/rtdef.h

@@ -745,13 +745,11 @@ struct rt_thread
     struct rt_wakeup wakeup;                            /**< wakeup data */
     int exit_request;
 #ifdef RT_USING_USERSPACE
-#ifdef RT_USING_GDBSERVER
     int step_exec;
     int debug_attach_req;
     int debug_ret_user;
     int debug_suspend;
     struct rt_hw_exp_stack *regs;
-#endif
     void * thread_idr;                                 /** lwp thread indicator */
     int *clear_child_tid;
 #endif

+ 1 - 3
libcpu/aarch64/common/context_gcc.S

@@ -144,9 +144,7 @@ rt_hw_get_gtimer_frq:
     /* Set the SP to point to the stack of the task being restored. */
     MOV     SP, X0
 
-#ifdef RT_USING_GDBSERVER
-    bl lwp_check_debug
-#endif
+    bl      lwp_check_debug
 
     BL      lwp_check_exit
 

+ 1 - 96
libcpu/aarch64/common/trap.c

@@ -31,99 +31,6 @@ extern long list_thread(void);
 #include <lwp_core_dump.h>
 #endif
 
-#ifdef RT_USING_GDBSERVER
-#include <lwp_gdbserver.h>
-#include <hw_breakpoint.h>
-
-gdb_thread_info wp_thread_info = {
-    RT_NULL,
-    GDB_NOTIFIY_NR,
-    0, RT_NULL, 0
-};
-
-static int check_debug_event(struct rt_hw_exp_stack *regs, unsigned long esr)
-{
-    uint32_t elx = regs->cpsr & 0x1fUL;
-    unsigned char ec;
-
-    ec = (unsigned char)((esr >> 26) & 0x3fU);
-    if (elx == 0x00) /* is EL0 */
-    {
-        struct rt_channel_msg msg;
-        gdb_thread_info thread_info;
-        int ret;
-
-        if (ec == 0x3c || ec == 0x30 /* breakpoint event */
-                || ec == 0x32) /* step event */
-        {
-            if (wp_thread_info.notify_type == GDB_NOTIFIY_WATCHPOINT)
-            {
-                thread_info.watch_addr = (uint32_t *)regs->pc;
-                thread_info.rw = wp_thread_info.rw;
-                thread_info.notify_type = GDB_NOTIFIY_WATCHPOINT;
-                wp_thread_info.notify_type = GDB_NOTIFIY_NR;
-                ret = 2;
-            }
-            else
-            {
-                /* is breakpoint event */
-                do {
-                    struct rt_lwp *gdb_lwp = gdb_get_dbg_lwp();
-                    struct rt_lwp *lwp;
-
-                    if (!gdb_lwp)
-                    {
-                        break;
-                    }
-                    lwp = lwp_self();
-                    if (lwp == gdb_lwp)
-                    {
-                        break;
-                    }
-                    *(uint32_t *)regs->pc = lwp->bak_first_ins;
-                    rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)regs->pc, 4);
-                    icache_invalid_all();
-                    lwp->debug = 0;
-                    return 1;
-                } while (0);
-
-                thread_info.notify_type = GDB_NOTIFIY_BREAKPOINT;
-                thread_info.abt_ins = *(uint32_t *)regs->pc;
-                ret = 1;
-            }
-        }
-        else if (ec == 0x35 || ec == 0x34) /* watchpoint event */
-        {
-            /* is watchpoint event */
-            arch_deactivate_breakpoints();
-            arch_activate_step();
-            wp_thread_info.rw = (esr >> 6) & 1UL;
-            wp_thread_info.notify_type = GDB_NOTIFIY_WATCHPOINT;
-            return 3;
-        }
-        else
-        {
-            return 0; /* not support */
-        }
-        thread_info.thread = rt_thread_self();
-        thread_info.thread->regs = regs;
-        msg.u.d = (void *)&thread_info;
-        rt_hw_dmb();
-        thread_info.thread->debug_suspend = 1;
-        rt_hw_dsb();
-        rt_thread_suspend_with_flag(thread_info.thread, RT_UNINTERRUPTIBLE);
-        rt_raw_channel_send(gdb_get_server_channel(), &msg);
-        rt_schedule();
-        while (thread_info.thread->debug_suspend)
-        {
-            rt_thread_suspend_with_flag(thread_info.thread, RT_UNINTERRUPTIBLE);
-            rt_schedule();
-        }
-        return ret;
-    }
-    return 0;
-}
-#endif
 void sys_exit(int value);
 void check_user_fault(struct rt_hw_exp_stack *regs, uint32_t pc_adj, char *info)
 {
@@ -318,13 +225,11 @@ void rt_hw_trap_exception(struct rt_hw_exp_stack *regs)
     ec = (unsigned char)((esr >> 26) & 0x3fU);
 
 #ifdef RT_USING_LWP
-#ifdef RT_USING_GDBSERVER
-    if (check_debug_event(regs, esr))
+    if (dbg_check_event(regs, esr))
     {
         return;
     }
     else
-#endif
 #endif
     if (ec == 0x15) /* is 64bit syscall ? */
     {

+ 0 - 2
libcpu/arm/cortex-a/context_gcc.S

@@ -246,9 +246,7 @@ rt_hw_context_switch_exit:
     ldmfd   sp!, {r1}
     msr     spsr_cxsf, r1        /* original mode */
 
-#ifdef RT_USING_GDBSERVER
     bl lwp_check_debug
-#endif
 
 #ifdef RT_USING_LWP
     bl lwp_check_exit

+ 0 - 2
libcpu/arm/cortex-a/start_gcc.S

@@ -505,9 +505,7 @@ rt_hw_context_switch_interrupt_do:
     ldmfd   sp!, {r4}        /* pop new task's cpsr to spsr */
     msr     spsr_cxsf, r4
 
-#ifdef RT_USING_GDBSERVER
     bl      lwp_check_debug
-#endif
 
 #ifdef RT_USING_LWP
     bl      lwp_check_exit

+ 2 - 99
libcpu/arm/cortex-a/trap.c

@@ -27,99 +27,6 @@ extern long list_thread(void);
 #include <lwp_core_dump.h>
 #endif
 
-#ifdef RT_USING_GDBSERVER
-#include <lwp_gdbserver.h>
-#include <hw_breakpoint.h>
-
-static int check_debug_event(struct rt_hw_exp_stack *regs, uint32_t pc_adj)
-{
-    uint32_t mode = regs->cpsr;
-
-    if ((mode & 0x1f) == 0x10) /* is user mode */
-    {
-        struct rt_channel_msg msg;
-        gdb_thread_info thread_info;
-        uint32_t ifsr, dfar, dfsr;
-        int ret;
-
-        if (pc_adj == 4) /* pabt */
-        {
-            /* check breakpoint event */
-            asm volatile ("MRC p15, 0, %0, c5, c0, 1":"=r"(ifsr));
-            ifsr &= ((1UL << 12) | 0x3fUL); /* status */
-            if (ifsr == 0x2UL)
-            {
-                /* is breakpoint event */
-                regs->pc -= pc_adj;
-                do {
-                    struct rt_lwp *gdb_lwp = gdb_get_dbg_lwp();
-                    struct rt_lwp *lwp;
-
-                    if (!gdb_lwp)
-                    {
-                        break;
-                    }
-                    lwp = lwp_self();
-                    if (lwp == gdb_lwp)
-                    {
-                        break;
-                    }
-                    *(uint32_t *)regs->pc = lwp->bak_first_ins;
-                    rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)regs->pc, 4);
-                    icache_invalid_all();
-                    lwp->debug = 0;
-                    return 1;
-                } while (0);
-
-                thread_info.notify_type = GDB_NOTIFIY_BREAKPOINT;
-                thread_info.abt_ins = *(uint32_t *)regs->pc;
-                ret = 1;
-            }
-            else
-            {
-                return 0; /* not debug pabt */
-            }
-        }
-        else
-        {
-            /* watchpoing event */
-            asm volatile ("MRC p15, 0, %0, c5, c0, 0":"=r"(dfsr));
-            dfsr = (((dfsr & (1UL << 10)) >> 6) | (dfsr & 0xfUL)); /* status */
-            if (dfsr == 0x2UL)
-            {
-                /* is watchpoint event */
-                regs->pc -= pc_adj;
-                asm volatile ("MRC p15, 0, %0, c6, c0, 0":"=r"(dfar));
-                thread_info.watch_addr = (void *)dfar;
-                thread_info.rw = (1UL << (((~*(uint32_t *)regs->pc) >> 20) & 1UL));
-                thread_info.notify_type = GDB_NOTIFIY_WATCHPOINT;
-                ret =  2;
-            }
-            else
-            {
-                return 0; /* not debug dabt */
-            }
-        }
-        thread_info.thread = rt_thread_self();
-        thread_info.thread->regs = regs;
-        msg.u.d = (void *)&thread_info;
-        rt_hw_dmb();
-        thread_info.thread->debug_suspend = 1;
-        rt_hw_dsb();
-        rt_thread_suspend_with_flag(thread_info.thread, RT_UNINTERRUPTIBLE);
-        rt_raw_channel_send(gdb_get_server_channel(), &msg);
-        rt_schedule();
-        while (thread_info.thread->debug_suspend)
-        {
-            rt_thread_suspend_with_flag(thread_info.thread, RT_UNINTERRUPTIBLE);
-            rt_schedule();
-        }
-        return ret;
-    }
-    return 0;
-}
-#endif
-
 void sys_exit(int value);
 void check_user_fault(struct rt_hw_exp_stack *regs, uint32_t pc_adj, char *info)
 {
@@ -263,12 +170,10 @@ void rt_hw_trap_swi(struct rt_hw_exp_stack *regs)
 void rt_hw_trap_pabt(struct rt_hw_exp_stack *regs)
 {
 #ifdef RT_USING_LWP
-#ifdef RT_USING_GDBSERVER
-    if (check_debug_event(regs, 4))
+    if (dbg_check_event(regs, 4))
     {
         return;
     }
-#endif
     check_user_fault(regs, 4, "User prefetch abort");
 #endif
     rt_unwind(regs, 4);
@@ -291,12 +196,10 @@ void rt_hw_trap_pabt(struct rt_hw_exp_stack *regs)
 void rt_hw_trap_dabt(struct rt_hw_exp_stack *regs)
 {
 #ifdef RT_USING_LWP
-#ifdef RT_USING_GDBSERVER
-    if (check_debug_event(regs, 8))
+    if (dbg_check_event(regs, 8))
     {
         return;
     }
-#endif
     if (check_user_stack(regs))
     {
         return;