From 03f199195b48c51cc43716b20c86b2eaff364ea0 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Mon, 7 Feb 2022 17:12:39 +0800 Subject: [PATCH 1/2] =?UTF-8?q?gdb=E5=8A=9F=E8=83=BD=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=87=BD=E6=95=B0ops?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/finsh/msh.c | 16 --- .../lwp/arch/aarch64/cortex-a/lwp_gcc.S | 32 +++-- components/lwp/arch/arm/cortex-a/lwp_gcc.S | 24 ++-- components/lwp/lwp.c | 33 +---- components/lwp/lwp.h | 29 ++++- components/lwp/lwp_dbg.c | 119 ++++++++++++++++++ components/lwp/lwp_pid.c | 10 +- components/lwp/lwp_syscall.c | 8 -- components/lwp/lwp_tid.c | 6 - components/lwp/lwp_user_mm.c | 5 - include/rtdef.h | 2 - libcpu/aarch64/common/context_gcc.S | 4 +- libcpu/aarch64/common/trap.c | 97 +------------- libcpu/arm/cortex-a/context_gcc.S | 2 - libcpu/arm/cortex-a/start_gcc.S | 2 - libcpu/arm/cortex-a/trap.c | 101 +-------------- 16 files changed, 192 insertions(+), 298 deletions(-) create mode 100644 components/lwp/lwp_dbg.c diff --git a/components/finsh/msh.c b/components/finsh/msh.c index 7a4a3a887f..2f86260904 100644 --- a/components/finsh/msh.c +++ b/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; } diff --git a/components/lwp/arch/aarch64/cortex-a/lwp_gcc.S b/components/lwp/arch/aarch64/cortex-a/lwp_gcc.S index c06c298049..3a64d71412 100644 --- a/components/lwp/arch/aarch64/cortex-a/lwp_gcc.S +++ b/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 diff --git a/components/lwp/arch/arm/cortex-a/lwp_gcc.S b/components/lwp/arch/arm/cortex-a/lwp_gcc.S index 009c751945..6284442c89 100644 --- a/components/lwp/arch/arm/cortex-a/lwp_gcc.S +++ b/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 diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index 11fcdc41ea..02b08d4856 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -30,11 +30,6 @@ #include #ifdef RT_USING_USERSPACE -#ifdef RT_USING_GDBSERVER -#include -#include -#endif - #include #include #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 */ diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index 99db3f0363..823231240c 100644 --- a/components/lwp/lwp.h +++ b/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 diff --git a/components/lwp/lwp_dbg.c b/components/lwp/lwp_dbg.c new file mode 100644 index 0000000000..c630f3291e --- /dev/null +++ b/components/lwp/lwp_dbg.c @@ -0,0 +1,119 @@ +#include +#include +#include + +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; +} diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index 6d635c7fdb..3b926de236 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -19,12 +19,6 @@ #ifdef RT_USING_USERSPACE #include "lwp_user_mm.h" - -#ifdef RT_USING_GDBSERVER -#include -#include -#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 diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 1826d0defb..4d8476bd4e 100644 --- a/components/lwp/lwp_syscall.c +++ b/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) diff --git a/components/lwp/lwp_tid.c b/components/lwp/lwp_tid.c index 3caa9207d5..0a77c5308c 100644 --- a/components/lwp/lwp_tid.c +++ b/components/lwp/lwp_tid.c @@ -15,12 +15,6 @@ #ifdef RT_USING_USERSPACE #include "lwp_user_mm.h" - -#ifdef RT_USING_GDBSERVER -#include -#include -#endif - #endif #define DBG_TAG "LWP_TID" diff --git a/components/lwp/lwp_user_mm.c b/components/lwp/lwp_user_mm.c index c71f16a9c3..a370178292 100644 --- a/components/lwp/lwp_user_mm.c +++ b/components/lwp/lwp_user_mm.c @@ -23,11 +23,6 @@ #include #include -#ifdef RT_USING_GDBSERVER -#include -#include -#endif - int lwp_user_space_init(struct rt_lwp *lwp) { return arch_user_space_init(lwp); diff --git a/include/rtdef.h b/include/rtdef.h index 3931767650..89638b4618 100644 --- a/include/rtdef.h +++ b/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 diff --git a/libcpu/aarch64/common/context_gcc.S b/libcpu/aarch64/common/context_gcc.S index 6f6323abe9..36bb2adcac 100644 --- a/libcpu/aarch64/common/context_gcc.S +++ b/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 diff --git a/libcpu/aarch64/common/trap.c b/libcpu/aarch64/common/trap.c index e8e7323de4..b9e9f04e75 100644 --- a/libcpu/aarch64/common/trap.c +++ b/libcpu/aarch64/common/trap.c @@ -31,99 +31,6 @@ extern long list_thread(void); #include #endif -#ifdef RT_USING_GDBSERVER -#include -#include - -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 ? */ { diff --git a/libcpu/arm/cortex-a/context_gcc.S b/libcpu/arm/cortex-a/context_gcc.S index 38008facdc..a64790b584 100644 --- a/libcpu/arm/cortex-a/context_gcc.S +++ b/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 diff --git a/libcpu/arm/cortex-a/start_gcc.S b/libcpu/arm/cortex-a/start_gcc.S index 60feb8c314..c20f2fa13d 100644 --- a/libcpu/arm/cortex-a/start_gcc.S +++ b/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 diff --git a/libcpu/arm/cortex-a/trap.c b/libcpu/arm/cortex-a/trap.c index 706f809e5f..91ae1d6163 100644 --- a/libcpu/arm/cortex-a/trap.c +++ b/libcpu/arm/cortex-a/trap.c @@ -27,99 +27,6 @@ extern long list_thread(void); #include #endif -#ifdef RT_USING_GDBSERVER -#include -#include - -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; -- Gitee From b5c36560b04a6dbda9e3f29d745a6d00cbd31215 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Wed, 9 Feb 2022 17:36:37 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=E6=B6=88=E9=99=A4sys=5Fgetrandom?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E7=BC=BA=E9=99=B7=E6=89=AB=E6=8F=8F=E8=AD=A6?= =?UTF-8?q?=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp_syscall.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 4d8476bd4e..7c568b9d90 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -3925,7 +3925,7 @@ int sys_getrandom(void *buf, size_t buflen, unsigned int flags) { return -EFAULT; } - + if (rt_device_open(rd_dev, RT_DEVICE_OFLAG_RDONLY) != RT_EOK) { return -EFAULT; @@ -3947,7 +3947,7 @@ int sys_getrandom(void *buf, size_t buflen, unsigned int flags) while (count < buflen) { - ret = rt_device_read(rd_dev, count, kmem + count, buflen - count); + ret = rt_device_read(rd_dev, count, (char *)kmem + count, buflen - count); if (ret <= 0) break; count += ret; @@ -3963,7 +3963,7 @@ int sys_getrandom(void *buf, size_t buflen, unsigned int flags) #else while (count < buflen) { - ret = rt_device_read(rd_dev, count, kmem + count, buflen - count); + ret = rt_device_read(rd_dev, count, (char *)kmem + count, buflen - count); if (ret <= 0) break; count += ret; -- Gitee