From c2500458732251c8e96f2eaad81702975074356f Mon Sep 17 00:00:00 2001 From: bernard Date: Sun, 18 Oct 2026 19:33:57 +0800 Subject: [PATCH 1/2] [components][lwp] fix signal ordering and ELF segment protection - keep FIFO order for signals carrying the same signal number - map ELF segments with permissions derived from p_flags - keep the scheduler usable while handling signals on RISC-V --- components/lwp/arch/risc-v/rv64/lwp_gcc.S | 6 ++++++ components/lwp/lwp_elf.c | 14 +++++++++++--- components/lwp/lwp_signal.c | 5 +++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/components/lwp/arch/risc-v/rv64/lwp_gcc.S b/components/lwp/arch/risc-v/rv64/lwp_gcc.S index b74abe5da12e..4f7b59c4cee1 100644 --- a/components/lwp/arch/risc-v/rv64/lwp_gcc.S +++ b/components/lwp/arch/risc-v/rv64/lwp_gcc.S @@ -109,6 +109,8 @@ arch_ret_to_user_impl: // TODO: we don't support kernel gdb server in risc-v yet // so we don't check debug state here and handle debugging bussiness + /* Signal handling takes sleeping locks and must remain schedulable. */ + OPEN_INTERRUPT call lwp_check_exit_request beqz a0, 1f mv a0, x0 @@ -121,6 +123,7 @@ arch_ret_to_user_impl: call lwp_thread_signal_catch ret_to_user_exit: + CLOSE_INTERRUPT RESTORE_ALL // `RESTORE_ALL` also reset sp to user sp, and setup sscratch sret @@ -130,8 +133,10 @@ ret_to_user_exit: * And handle pending signals; */ arch_signal_quit: + OPEN_INTERRUPT LOAD a0, FRAME_OFF_SP(sp) call arch_signal_ucontext_restore + CLOSE_INTERRUPT /* reset kernel sp to the stack */ addi sp, sp, CTX_REG_NR * REGBYTES @@ -167,6 +172,7 @@ arch_thread_signal_enter: LOAD t0, FRAME_OFF_SP(a2) mv a3, t0 call arch_signal_ucontext_save + CLOSE_INTERRUPT /** restore kernel sp */ addi sp, s3, CTX_REG_NR * REGBYTES diff --git a/components/lwp/lwp_elf.c b/components/lwp/lwp_elf.c index c6809f8cae23..3ec49bd227e3 100644 --- a/components/lwp/lwp_elf.c +++ b/components/lwp/lwp_elf.c @@ -616,6 +616,15 @@ static int elf_zero_bss(struct rt_lwp *lwp, int fd, const Elf_Phdr *phdr, rt_uba * @return -RT_ERROR if memory mapping fails. * @return -ENOMEM if memory allocation fails. */ +static size_t elf_prot_from_pflags(uint32_t p_flags) +{ + size_t prot = PROT_NONE; + if (p_flags & PF_R) prot |= PROT_READ; + if (p_flags & PF_W) prot |= PROT_WRITE; + if (p_flags & PF_X) prot |= PROT_EXEC; + return prot; +} + static int elf_file_mmap(elf_load_info_t *load_info, elf_info_t *elf_info, rt_ubase_t *elfload_addr, rt_uint32_t map_size, rt_ubase_t *load_base) { @@ -626,7 +635,6 @@ static int elf_file_mmap(elf_load_info_t *load_info, elf_info_t *elf_info, rt_ub const Elf_Phdr *tmp_phdr = phdr; /* Current program header */ int fd = elf_info->fd; /* File descriptor for ELF file */ rt_ubase_t load_addr; /* Calculated load address */ - size_t prot = PROT_READ | PROT_WRITE; /* Memory protection flags */ size_t flags = MAP_FIXED | MAP_PRIVATE; /* Memory mapping flags */ /* Iterate through all program headers */ @@ -659,8 +667,8 @@ static int elf_file_mmap(elf_load_info_t *load_info, elf_info_t *elf_info, rt_ub flags &= ~MAP_FIXED; } - /* Map the segment into memory */ - map_va = elf_map(load_info->lwp, tmp_phdr, fd, load_addr, prot, flags, map_size); + /* Map the segment into memory with correct permissions */ + map_va = elf_map(load_info->lwp, tmp_phdr, fd, load_addr, elf_prot_from_pflags(tmp_phdr->p_flags), flags, map_size); if (!map_va) { LOG_E("%s : elf_map failed", __func__); diff --git a/components/lwp/lwp_signal.c b/components/lwp/lwp_signal.c index 8c88e68151ee..b42455dfce17 100644 --- a/components/lwp/lwp_signal.c +++ b/components/lwp/lwp_signal.c @@ -255,9 +255,10 @@ static void sigqueue_enqueue(lwp_sigqueue_t sigqueue, lwp_siginfo_t siginfo) rt_bool_t inserted = RT_FALSE; rt_list_for_each_entry(idx, &sigqueue->siginfo_list, node) { - if (idx->ksiginfo.signo >= siginfo->ksiginfo.signo) + /* Keep ascending signal order and FIFO order for equal signals. */ + if (idx->ksiginfo.signo > siginfo->ksiginfo.signo) { - rt_list_insert_after(&idx->node, &siginfo->node); + rt_list_insert_before(&idx->node, &siginfo->node); inserted = RT_TRUE; break; } From 5fc0bd6a4eee308e23a2057d1eb0440743ce1cbe Mon Sep 17 00:00:00 2001 From: bernard Date: Sun, 18 Oct 2026 21:02:07 +0800 Subject: [PATCH 2/2] [components][lwp] apply clang-format to ELF protection helper - expand the protection flag checks to braced statements - no functional change --- components/lwp/lwp_elf.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/components/lwp/lwp_elf.c b/components/lwp/lwp_elf.c index 3ec49bd227e3..00cf13e4080f 100644 --- a/components/lwp/lwp_elf.c +++ b/components/lwp/lwp_elf.c @@ -619,9 +619,18 @@ static int elf_zero_bss(struct rt_lwp *lwp, int fd, const Elf_Phdr *phdr, rt_uba static size_t elf_prot_from_pflags(uint32_t p_flags) { size_t prot = PROT_NONE; - if (p_flags & PF_R) prot |= PROT_READ; - if (p_flags & PF_W) prot |= PROT_WRITE; - if (p_flags & PF_X) prot |= PROT_EXEC; + if (p_flags & PF_R) + { + prot |= PROT_READ; + } + if (p_flags & PF_W) + { + prot |= PROT_WRITE; + } + if (p_flags & PF_X) + { + prot |= PROT_EXEC; + } return prot; }