aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/process.c
diff options
context:
space:
mode:
authorFranck Bui-Huu <vagabon.xyz@gmail.com>2006-08-18 10:18:08 -0400
committerRalf Baechle <ralf@linux-mips.org>2006-09-27 08:37:58 -0400
commit29b376ff10aaea69ee4d93b70d0fbb2ebfd80f4e (patch)
treeb498fe6a70b26fe9a3dd79d51eaf744951b74583 /arch/mips/kernel/process.c
parent1fd6909802b837ed5510603846c0ce5938d296a1 (diff)
[MIPS] get_frame_info(): null function size means size is unknown
This patch adds 2 sanity checks. The first one test that the start address of the function to analyze has been set by the caller. If not return an error since nothing usefull can be done without. The second one checks that the function's size has been set. A null size can happen if CONFIG_KALLSYMS is not set and it means that we don't know the size of the function to analyze. In this case, we make it equal to 128 instructions by default. Signed-off-by: Franck Bui-Huu <vagabon.xyz@gmail.com> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/process.c')
-rw-r--r--arch/mips/kernel/process.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
index e7b0b385fb2b..b160ea30de0f 100644
--- a/arch/mips/kernel/process.c
+++ b/arch/mips/kernel/process.c
@@ -311,12 +311,19 @@ static inline int is_sp_move_ins(union mips_instruction *ip)
311static int get_frame_info(struct mips_frame_info *info) 311static int get_frame_info(struct mips_frame_info *info)
312{ 312{
313 union mips_instruction *ip = info->func; 313 union mips_instruction *ip = info->func;
314 int i, max_insns = 314 unsigned max_insns = info->func_size / sizeof(union mips_instruction);
315 min(128UL, info->func_size / sizeof(union mips_instruction)); 315 unsigned i;
316 316
317 info->pc_offset = -1; 317 info->pc_offset = -1;
318 info->frame_size = 0; 318 info->frame_size = 0;
319 319
320 if (!ip)
321 goto err;
322
323 if (max_insns == 0)
324 max_insns = 128U; /* unknown function size */
325 max_insns = min(128U, max_insns);
326
320 for (i = 0; i < max_insns; i++, ip++) { 327 for (i = 0; i < max_insns; i++, ip++) {
321 328
322 if (is_jal_jalr_jr_ins(ip)) 329 if (is_jal_jalr_jr_ins(ip))
@@ -337,6 +344,7 @@ static int get_frame_info(struct mips_frame_info *info)
337 if (info->pc_offset < 0) /* leaf */ 344 if (info->pc_offset < 0) /* leaf */
338 return 1; 345 return 1;
339 /* prologue seems boggus... */ 346 /* prologue seems boggus... */
347err:
340 return -1; 348 return -1;
341} 349}
342 350