| From 0acf6625688b62a6c0d23c1db39b4a758c65b58c Mon Sep 17 00:00:00 2001 |
| From: Jun-Ru Chang <jrjang@realtek.com> |
| Date: Tue, 29 Jan 2019 11:56:07 +0800 |
| Subject: MIPS: Remove function size check in get_frame_info() |
| |
| [ Upstream commit 2b424cfc69728224fcb5fad138ea7260728e0901 ] |
| |
| Patch (b6c7a324df37b "MIPS: Fix get_frame_info() handling of |
| microMIPS function size.") introduces additional function size |
| check for microMIPS by only checking insn between ip and ip + func_size. |
| However, func_size in get_frame_info() is always 0 if KALLSYMS is not |
| enabled. This causes get_frame_info() to return immediately without |
| calculating correct frame_size, which in turn causes "Can't analyze |
| schedule() prologue" warning messages at boot time. |
| |
| This patch removes func_size check, and let the frame_size check run |
| up to 128 insns for both MIPS and microMIPS. |
| |
| Signed-off-by: Jun-Ru Chang <jrjang@realtek.com> |
| Signed-off-by: Tony Wu <tonywu@realtek.com> |
| Signed-off-by: Paul Burton <paul.burton@mips.com> |
| Fixes: b6c7a324df37b ("MIPS: Fix get_frame_info() handling of microMIPS function size.") |
| Cc: <ralf@linux-mips.org> |
| Cc: <jhogan@kernel.org> |
| Cc: <macro@mips.com> |
| Cc: <yamada.masahiro@socionext.com> |
| Cc: <peterz@infradead.org> |
| Cc: <mingo@kernel.org> |
| Cc: <linux-mips@vger.kernel.org> |
| Cc: <linux-kernel@vger.kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/mips/kernel/process.c | 7 +++---- |
| 1 file changed, 3 insertions(+), 4 deletions(-) |
| |
| diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c |
| index d4f7fd4550e1..85522c137f19 100644 |
| --- a/arch/mips/kernel/process.c |
| +++ b/arch/mips/kernel/process.c |
| @@ -371,7 +371,7 @@ static inline int is_sp_move_ins(union mips_instruction *ip, int *frame_size) |
| static int get_frame_info(struct mips_frame_info *info) |
| { |
| bool is_mmips = IS_ENABLED(CONFIG_CPU_MICROMIPS); |
| - union mips_instruction insn, *ip, *ip_end; |
| + union mips_instruction insn, *ip; |
| const unsigned int max_insns = 128; |
| unsigned int last_insn_size = 0; |
| unsigned int i; |
| @@ -384,10 +384,9 @@ static int get_frame_info(struct mips_frame_info *info) |
| if (!ip) |
| goto err; |
| |
| - ip_end = (void *)ip + info->func_size; |
| - |
| - for (i = 0; i < max_insns && ip < ip_end; i++) { |
| + for (i = 0; i < max_insns; i++) { |
| ip = (void *)ip + last_insn_size; |
| + |
| if (is_mmips && mm_insn_16bit(ip->halfword[0])) { |
| insn.word = ip->halfword[0] << 16; |
| last_insn_size = 2; |
| -- |
| 2.19.1 |
| |