From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id C227E38515CD for ; Sat, 25 Jun 2022 02:21:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C227E38515CD Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from localhost.localdomain (unknown [117.136.87.28]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dx39o1cbZiBKFYAA--.3192S3; Sat, 25 Jun 2022 10:21:45 +0800 (CST) From: Tiezhu Yang To: gdb-patches@sourceware.org Subject: [COMMITTED PATCH 2/2] gdb: LoongArch: Implement loongarch_linux_syscall_next_pc() Date: Sat, 25 Jun 2022 10:21:21 +0800 Message-Id: <20220625022121.5684-2-yangtiezhu@loongson.cn> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220625022121.5684-1-yangtiezhu@loongson.cn> References: <20220625022121.5684-1-yangtiezhu@loongson.cn> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: AQAAf9Dx39o1cbZiBKFYAA--.3192S3 X-Coremail-Antispam: 1UD129KBjvJXoWxJF1xCrWxZrWrGF18XF4rGrg_yoWrJr1kpr Wxu3ZxJr48JrnrCr9xXw15Zrn8Zrs7urWaqF43tw4Skr4DJw18WF4vqa4q9FnFk3Z7Kry2 gF4ktayUuF4rZFJanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU90b7Iv0xC_Kw4lb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I2 0VC2zVCF04k26cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28IrcIa0xkI8VA2jI 8067AKxVWUGwA2048vs2IY020Ec7CjxVAFwI0_Jr4l8cAvFVAK0II2c7xJM28CjxkF64kE wVA0rcxSw2x7M28EF7xvwVC0I7IYx2IY67AKxVWUJVWUCwA2z4x0Y4vE2Ix0cI8IcVCY1x 0267AKxVW8JVWxJwA2z4x0Y4vEx4A2jsIE14v26r4j6F4UM28EF7xvwVC2z280aVCY1x02 67AKxVW8JVW8Jr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrV C2j2WlYx0E2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE 7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7x kEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E 67AF67kF1VAFwI0_Jr0_JrylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCw CI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1x MIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIda VFxhVjvjDU0xZFpf9x07bOPfdUUUUU= X-CM-SenderInfo: p1dqw3xlh2x3gn0dqz5rrqw2lrqou0/ X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Jun 2022 02:21:49 -0000 When FRAME is at a syscall instruction, return the PC of the next instruction to be executed. Signed-off-by: Tiezhu Yang --- gdb/loongarch-linux-tdep.c | 26 ++++++++++++++++++++++++++ gdb/loongarch-tdep.c | 7 +++++++ gdb/loongarch-tdep.h | 3 +++ 3 files changed, 36 insertions(+) diff --git a/gdb/loongarch-linux-tdep.c b/gdb/loongarch-linux-tdep.c index 5da48a4e0a5..21fc67f9323 100644 --- a/gdb/loongarch-linux-tdep.c +++ b/gdb/loongarch-linux-tdep.c @@ -161,11 +161,35 @@ loongarch_iterate_over_regset_sections (struct gdbarch *gdbarch, LOONGARCH_LINUX_NUM_GREGSET * regsize, &loongarch_gregset, NULL, cb_data); } +/* The following value is derived from __NR_rt_sigreturn in + from the Linux source tree. */ + +#define LOONGARCH_NR_rt_sigreturn 139 + +/* When FRAME is at a syscall instruction, return the PC of the next + instruction to be executed. */ + +static CORE_ADDR +loongarch_linux_syscall_next_pc (struct frame_info *frame) +{ + const CORE_ADDR pc = get_frame_pc (frame); + ULONGEST a7 = get_frame_register_unsigned (frame, LOONGARCH_A7_REGNUM); + + /* If we are about to make a sigreturn syscall, use the unwinder to + decode the signal frame. */ + if (a7 == LOONGARCH_NR_rt_sigreturn) + return frame_unwind_caller_pc (frame); + + return pc + 4; +} + /* Initialize LoongArch Linux ABI info. */ static void loongarch_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { + loongarch_gdbarch_tdep *tdep = (loongarch_gdbarch_tdep *) gdbarch_tdep (gdbarch); + linux_init_abi (info, gdbarch, 0); set_solib_svr4_fetch_link_map_offsets (gdbarch, @@ -187,6 +211,8 @@ loongarch_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* Core file support. */ set_gdbarch_iterate_over_regset_sections (gdbarch, loongarch_iterate_over_regset_sections); + + tdep->syscall_next_pc = loongarch_linux_syscall_next_pc; } /* Initialize LoongArch Linux target support. */ diff --git a/gdb/loongarch-tdep.c b/gdb/loongarch-tdep.c index 3c02449a5e6..f2f4e3be909 100644 --- a/gdb/loongarch-tdep.c +++ b/gdb/loongarch-tdep.c @@ -224,6 +224,8 @@ loongarch_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) static CORE_ADDR loongarch_next_pc (struct regcache *regcache, CORE_ADDR cur_pc) { + struct gdbarch *gdbarch = regcache->arch (); + loongarch_gdbarch_tdep *tdep = (loongarch_gdbarch_tdep *) gdbarch_tdep (gdbarch); insn_t insn = loongarch_fetch_instruction (cur_pc); size_t insn_len = loongarch_insn_length (insn); CORE_ADDR next_pc = cur_pc + insn_len; @@ -307,6 +309,11 @@ loongarch_next_pc (struct regcache *regcache, CORE_ADDR cur_pc) if (rj != 0) next_pc = cur_pc + loongarch_decode_imm ("0:5|10:16<<2", insn, 1); } + else if ((insn & 0xffff8000) == 0x002b0000) /* syscall */ + { + if (tdep->syscall_next_pc != nullptr) + next_pc = tdep->syscall_next_pc (get_current_frame ()); + } return next_pc; } diff --git a/gdb/loongarch-tdep.h b/gdb/loongarch-tdep.h index f3efa4601ef..54b34af1d66 100644 --- a/gdb/loongarch-tdep.h +++ b/gdb/loongarch-tdep.h @@ -48,6 +48,9 @@ struct loongarch_gdbarch_tdep : gdbarch_tdep { /* Features about the abi that impact how the gdbarch is configured. */ struct loongarch_gdbarch_features abi_features; + + /* Return the expected next PC if FRAME is stopped at a syscall instruction. */ + CORE_ADDR (*syscall_next_pc) (struct frame_info *frame) = nullptr; }; #endif /* LOONGARCH_TDEP_H */ -- 2.27.0