1 #include <rtthread.h>
2 #include <rthw.h>
3 #include <lwp.h>
4 
dbg_thread_in_debug(void)5 int dbg_thread_in_debug(void)
6 {
7     int ret = 0;
8     struct rt_lwp *lwp = lwp_self();
9 
10     if (lwp && lwp->debug)
11     {
12         ret = 1;
13     }
14     return ret;
15 }
16 
17 struct dbg_ops_t *rt_dbg_ops = RT_NULL;
18 RTM_EXPORT(rt_dbg_ops);
19 
dbg_register(struct dbg_ops_t * dbg_ops)20 void dbg_register(struct dbg_ops_t *dbg_ops)
21 {
22     rt_dbg_ops = dbg_ops;
23 }
24 RTM_EXPORT(dbg_register);
25 
dbg(int argc,char ** argv)26 static int dbg(int argc, char **argv)
27 {
28     int ret = -1;
29 
30     if (rt_dbg_ops)
31     {
32         ret = rt_dbg_ops->dbg(argc, argv);
33     }
34     else
35     {
36         rt_kprintf("Error: DBG command is not enabled!\n");
37     }
38     return ret;
39 }
40 MSH_CMD_EXPORT(dbg, dbg);
41 
dbg_get_ins(void)42 uint32_t dbg_get_ins(void)
43 {
44     uint32_t ins = 0;
45 
46     if (rt_dbg_ops)
47     {
48         ins = rt_dbg_ops->arch_get_ins();
49     }
50     return ins;
51 }
52 
dbg_activate_step(void)53 void dbg_activate_step(void)
54 {
55     if (rt_dbg_ops)
56     {
57         rt_dbg_ops->arch_activate_step();
58     }
59 }
60 
dbg_deactivate_step(void)61 void dbg_deactivate_step(void)
62 {
63     if (rt_dbg_ops)
64     {
65         rt_dbg_ops->arch_deactivate_step();
66     }
67 }
68 
dbg_check_event(struct rt_hw_exp_stack * regs,unsigned long esr)69 int dbg_check_event(struct rt_hw_exp_stack *regs, unsigned long esr)
70 {
71     int ret = 0;
72 
73     if (rt_dbg_ops)
74     {
75         ret = rt_dbg_ops->check_debug_event(regs, esr);
76     }
77     return ret;
78 }
79 
gdb_server_channel(void)80 rt_channel_t gdb_server_channel(void)
81 {
82     rt_channel_t ret = RT_NULL;
83 
84     if (rt_dbg_ops)
85     {
86         ret = rt_dbg_ops->gdb_get_server_channel();
87     }
88     return ret;
89 }
90 
dbg_step_type(void)91 int dbg_step_type(void)
92 {
93     int ret = 0;
94 
95     if (rt_dbg_ops)
96     {
97         ret = rt_dbg_ops->gdb_get_step_type();
98     }
99     return ret;
100 }
101 
dbg_attach_req(void * pc)102 void dbg_attach_req(void *pc)
103 {
104     if (rt_dbg_ops)
105     {
106         rt_dbg_ops->lwp_check_debug_attach_req(pc);
107     }
108 }
109 
dbg_check_suspend(void)110 int dbg_check_suspend(void)
111 {
112     int ret = 0;
113 
114     if (rt_dbg_ops)
115     {
116         ret = rt_dbg_ops->lwp_check_debug_suspend();
117     }
118     return ret;
119 }
120