* "Can't analyze prologue code ..." at boot time
@ 2004-09-24 8:52 Thomas Petazzoni
2004-09-24 10:06 ` Atsushi Nemoto
0 siblings, 1 reply; 7+ messages in thread
From: Thomas Petazzoni @ 2004-09-24 8:52 UTC (permalink / raw)
To: linux-mips; +Cc: mentre
Hello,
In arch/mips/kernel/process.c, the function frame_info_init() called
at boot time, calls the get_frame_info() to a analyze the prologue of
a few functions (I don't know why, does anyone know ?).
At boot time, I have the following message on the console :
Can't analyze prologue code at 80315308
At 80315308 is the beginning of the schedule_timeout() function which
is one of the functions analyzed by the frame_info_init().
The get_frame_info() seems to search a sw or sd instruction, but here
is the beginning of the schedule_timeout() function :
80315308 <schedule_timeout>:
80315308: 3c027fff lui v0,0x7fff
8031530c: 27bdffc0 addiu sp,sp,-64
80315310: 3442ffff ori v0,v0,0xffff
80315314: afb10034 sw s1,52(sp)
80315318: afbf003c sw ra,60(sp)
8031531c: afb20038 sw s2,56(sp)
80315320: afb00030 sw s0,48(sp)
80315324: 1082002c beq a0,v0,803153d8 <schedule_timeout+0xd0>
80315328: 00808821 move s1,a0
This error isn't fatal, the kernel perfectly boots, and I can use my
shell perfectly. I just wanted to know why it is reporting a problem,
why the kernel needs to analyze the prologues of a couple of
functions, and maybe report a possible problem ?
I'm using a quite outdated linux-mips CVS (from the beginning of the
month, a 2.6.9-rc1). I compiled using gcc 3.3.4, for an RM9000
processor.
Don't hesitate to ask for details,
Thomas
--
PETAZZONI Thomas - thomas.petazzoni@enix.org
http://thomas.enix.org - Jabber: kos_tom@sourcecode.de
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E 1624 F653 CB30 98D3 F7A7
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "Can't analyze prologue code ..." at boot time
2004-09-24 8:52 "Can't analyze prologue code ..." at boot time Thomas Petazzoni
@ 2004-09-24 10:06 ` Atsushi Nemoto
2004-09-24 12:11 ` Thomas Petazzoni
2004-10-28 15:07 ` Atsushi Nemoto
0 siblings, 2 replies; 7+ messages in thread
From: Atsushi Nemoto @ 2004-09-24 10:06 UTC (permalink / raw)
To: thomas.petazzoni; +Cc: linux-mips, mentre
>>>>> On Fri, 24 Sep 2004 10:52:40 +0200, Thomas Petazzoni <thomas.petazzoni@enix.org> said:
thomas> In arch/mips/kernel/process.c, the function frame_info_init()
thomas> called at boot time, calls the get_frame_info() to a analyze
thomas> the prologue of a few functions (I don't know why, does anyone
thomas> know ?).
Because thread_saved_pc(), get_wchan() needs those information.
The information of 'schedule' function is required, others are
optional ("ps -l" shows better output with those informations).
thomas> The get_frame_info() seems to search a sw or sd instruction,
thomas> but here is the beginning of the schedule_timeout() function :
This is because now schedule_timeout is in kernel/timer.c (not
kernel/sched.c) which is compiled without -fno-omit-frame-pointer
option.
I rewrote get_wchan() to handle this problem. Please try this patch.
Note that this patch still depends on order of address of sched
functions, so not gcc-3.4 proof. Sorting minfo[] array will make it
more robust. If anyone interested in, I will implement it.
diff -u linux-mips/arch/mips/kernel/process.c linux/arch/mips/kernel/process.c
--- linux-mips/arch/mips/kernel/process.c Wed Sep 22 13:27:59 2004
+++ linux/arch/mips/kernel/process.c Wed Sep 22 17:03:10 2004
@@ -177,21 +177,41 @@
}
struct mips_frame_info {
+ void *func;
+ int omit_fp; /* compiled without fno-omit-frame-pointer */
int frame_offset;
int pc_offset;
+} mfinfo [] = {
+ /* must be in address order */
+ { __down_interruptible, 1 },
+ { schedule, 0 },
+#define schedule_frame 1
+#ifdef CONFIG_PREEMPT
+ { preempt_schedule, 0 },
+#endif
+ { wait_for_completion, 0 },
+ { interruptible_sleep_on, 0 },
+ { interruptible_sleep_on_timeout, 0 },
+ { sleep_on, 0 },
+ { sleep_on_timeout, 0 },
+ { __cond_resched, 0 },
+ { yield, 0 },
+ { io_schedule, 0 },
+ { io_schedule_timeout, 0 },
+ { schedule_timeout, 1 },
+/* { nanosleep_restart, 1 }, */
+ { __down_read, 1 },
+ { __down_write, 1 },
};
-static struct mips_frame_info schedule_frame;
-static struct mips_frame_info schedule_timeout_frame;
-static struct mips_frame_info sleep_on_frame;
-static struct mips_frame_info sleep_on_timeout_frame;
-static struct mips_frame_info wait_for_completion_frame;
+
static int mips_frame_info_initialized;
-static int __init get_frame_info(struct mips_frame_info *info, void *func)
+static int __init get_frame_info(struct mips_frame_info *info)
{
int i;
+ void *func = info->func;
union mips_instruction *ip = (union mips_instruction *)func;
info->pc_offset = -1;
- info->frame_offset = -1;
+ info->frame_offset = info->omit_fp ? 0 : -1;
for (i = 0; i < 128; i++, ip++) {
/* if jal, jalr, jr, stop. */
if (ip->j_format.opcode == jal_op ||
@@ -237,13 +257,11 @@
static int __init frame_info_init(void)
{
- mips_frame_info_initialized =
- !get_frame_info(&schedule_frame, schedule) &&
- !get_frame_info(&schedule_timeout_frame, schedule_timeout) &&
- !get_frame_info(&sleep_on_frame, sleep_on) &&
- !get_frame_info(&sleep_on_timeout_frame, sleep_on_timeout) &&
- !get_frame_info(&wait_for_completion_frame, wait_for_completion);
-
+ int i;
+ for (i = 0; i < ARRAY_SIZE(mfinfo); i++)
+ if (get_frame_info(&mfinfo[i]))
+ return -1;
+ mips_frame_info_initialized = 1;
return 0;
}
@@ -261,9 +279,9 @@
if (t->reg31 == (unsigned long) ret_from_fork)
return t->reg31;
- if (schedule_frame.pc_offset < 0)
+ if (mfinfo[schedule_frame].pc_offset < 0)
return 0;
- return ((unsigned long *)t->reg29)[schedule_frame.pc_offset];
+ return ((unsigned long *)t->reg29)[mfinfo[schedule_frame].pc_offset];
}
/* get_wchan - a maintenance nightmare^W^Wpain in the ass ... */
@@ -277,48 +295,27 @@
if (!mips_frame_info_initialized)
return 0;
pc = thread_saved_pc(p);
+
if (!in_sched_functions(pc))
goto out;
- if (pc >= (unsigned long) sleep_on_timeout)
- goto schedule_timeout_caller;
- if (pc >= (unsigned long) sleep_on)
- goto schedule_caller;
- if (pc >= (unsigned long) interruptible_sleep_on_timeout)
- goto schedule_timeout_caller;
- if (pc >= (unsigned long)interruptible_sleep_on)
- goto schedule_caller;
- if (pc >= (unsigned long)wait_for_completion)
- goto schedule_caller;
- goto schedule_timeout_caller;
-
-schedule_caller:
- frame = ((unsigned long *)p->thread.reg30)[schedule_frame.frame_offset];
- if (pc >= (unsigned long) sleep_on)
- pc = ((unsigned long *)frame)[sleep_on_frame.pc_offset];
- else
- pc = ((unsigned long *)frame)[wait_for_completion_frame.pc_offset];
- goto out;
-
-schedule_timeout_caller:
- /*
- * The schedule_timeout frame
- */
- frame = ((unsigned long *)p->thread.reg30)[schedule_frame.frame_offset];
-
- /*
- * frame now points to sleep_on_timeout's frame
- */
- pc = ((unsigned long *)frame)[schedule_timeout_frame.pc_offset];
-
- if (in_sched_functions(pc)) {
- /* schedule_timeout called by [interruptible_]sleep_on_timeout */
- frame = ((unsigned long *)frame)[schedule_timeout_frame.frame_offset];
- pc = ((unsigned long *)frame)[sleep_on_timeout_frame.pc_offset];
- }
+ frame = ((unsigned long *)p->thread.reg30)[mfinfo[schedule_frame].frame_offset];
+ do {
+ int i;
+ for (i = ARRAY_SIZE(mfinfo) - 1; i >= 0; i--) {
+ if (pc >= (unsigned long) mfinfo[i].func)
+ break;
+ }
+ if (i < 0)
+ break;
-out:
+ if (mfinfo[i].omit_fp)
+ break;
+ pc = ((unsigned long *)frame)[mfinfo[i].pc_offset];
+ frame = ((unsigned long *)frame)[mfinfo[i].frame_offset];
+ } while (in_sched_functions(pc));
+out:
#ifdef CONFIG_MIPS64
if (current->thread.mflags & MF_32BIT_REGS) /* Kludge for 32-bit ps */
pc &= 0xffffffffUL;
---
Atsushi Nemoto
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "Can't analyze prologue code ..." at boot time
2004-09-24 10:06 ` Atsushi Nemoto
@ 2004-09-24 12:11 ` Thomas Petazzoni
2004-09-24 22:15 ` Filip Onkelinx
2004-10-28 15:07 ` Atsushi Nemoto
1 sibling, 1 reply; 7+ messages in thread
From: Thomas Petazzoni @ 2004-09-24 12:11 UTC (permalink / raw)
To: Atsushi Nemoto; +Cc: linux-mips, mentre
Hello,
On Fri, Sep 24, 2004 at 07:06:40PM +0900, Atsushi Nemoto wrote :
> I rewrote get_wchan() to handle this problem. Please try this patch.
This patch works for me. At least, the "Couldn't analyze prologue code
at ..." message doesn't appear anymore.
Thanks,
Thomas
--
PETAZZONI Thomas - thomas.petazzoni@enix.org
http://thomas.enix.org - Jabber: kos_tom@sourcecode.de
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E 1624 F653 CB30 98D3 F7A7
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "Can't analyze prologue code ..." at boot time
2004-09-24 12:11 ` Thomas Petazzoni
@ 2004-09-24 22:15 ` Filip Onkelinx
2004-09-25 14:03 ` Atsushi Nemoto
0 siblings, 1 reply; 7+ messages in thread
From: Filip Onkelinx @ 2004-09-24 22:15 UTC (permalink / raw)
To: linux-mips; +Cc: Atsushi Nemoto
Hi Atsushi,
I just applied your patch to our current 2.6.9-rc2 kernel for the BE300
project (Casio BE300/BE500 PDA with NEC vr4131 rev1.2), and the
"Couldn't analyze prologue code .." message is gone as well.
Before, the kernel was very unreliable, but I also sync'ed with the
latest from CVS and switched gcc version , so I'm not sure if it is your
patch that's responsible for the stabiltity or one of the other changes.
thanks,
Filip.
Thomas Petazzoni wrote:
>Hello,
>
>On Fri, Sep 24, 2004 at 07:06:40PM +0900, Atsushi Nemoto wrote :
>
>
>
>>I rewrote get_wchan() to handle this problem. Please try this patch.
>>
>>
>
>This patch works for me. At least, the "Couldn't analyze prologue code
>at ..." message doesn't appear anymore.
>
>Thanks,
>
>Thomas
>
>
--
----
Do not follow where the path may lead. Go instead where there is no path and leave a trail - Ralph Waldo Emerson
----
Filip Onkelinx
Heidebloemstraat 20, B-3500 Hasselt, BELGIUM
fax: +32 11 65 65 97, mobile: +32 475 69 47 63
filip@onkelinx.com
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "Can't analyze prologue code ..." at boot time
2004-09-24 22:15 ` Filip Onkelinx
@ 2004-09-25 14:03 ` Atsushi Nemoto
0 siblings, 0 replies; 7+ messages in thread
From: Atsushi Nemoto @ 2004-09-25 14:03 UTC (permalink / raw)
To: Filip; +Cc: linux-mips
>>>>> On Sat, 25 Sep 2004 00:15:16 +0200, Filip Onkelinx <Filip@Linux4.Be> said:
Filip> I just applied your patch to our current 2.6.9-rc2 kernel for
Filip> the BE300 project (Casio BE300/BE500 PDA with NEC vr4131
Filip> rev1.2), and the "Couldn't analyze prologue code .." message is
Filip> gone as well.
Good to hear that.
Filip> Before, the kernel was very unreliable, but I also sync'ed with
Filip> the latest from CVS and switched gcc version , so I'm not sure
Filip> if it is your patch that's responsible for the stabiltity or
Filip> one of the other changes.
I'm pretty sure it is not my patch. The problem fixed by my patch
should not be a so fatal. Congratulation anyway.
---
Atsushi Nemoto
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "Can't analyze prologue code ..." at boot time
2004-09-24 10:06 ` Atsushi Nemoto
2004-09-24 12:11 ` Thomas Petazzoni
@ 2004-10-28 15:07 ` Atsushi Nemoto
2004-10-29 11:18 ` Atsushi Nemoto
1 sibling, 1 reply; 7+ messages in thread
From: Atsushi Nemoto @ 2004-10-28 15:07 UTC (permalink / raw)
To: thomas.petazzoni; +Cc: linux-mips, mentre, ralf
>>>>> On Fri, 24 Sep 2004 19:06:40 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> said:
anemo> This is because now schedule_timeout is in kernel/timer.c (not
anemo> kernel/sched.c) which is compiled without
anemo> -fno-omit-frame-pointer option.
anemo> I rewrote get_wchan() to handle this problem. Please try this
anemo> patch.
anemo> Note that this patch still depends on order of address of sched
anemo> functions, so not gcc-3.4 proof. Sorting minfo[] array will
anemo> make it more robust. If anyone interested in, I will implement
anemo> it.
Here is a revised patch which can work with gcc 3.4.
Ralf, how about this patch? No more maintenance nightmare :-)
diff -u linux-mips-cvs/arch/mips/kernel/process.c linux-mips/arch/mips/kernel/
--- linux-mips-cvs/arch/mips/kernel/process.c Wed Oct 27 23:28:25 2004
+++ linux-mips/arch/mips/kernel/process.c Thu Oct 28 23:04:20 2004
@@ -186,21 +186,48 @@
}
struct mips_frame_info {
+ void *func;
+ int omit_fp; /* compiled without fno-omit-frame-pointer */
int frame_offset;
int pc_offset;
+} schedule_frame, mfinfo[] = {
+ { schedule, 0 }, /* must be first */
+ /* arch/mips/kernel/semaphore.c */
+ { __down, 1 },
+ { __down_interruptible, 1 },
+ /* kernel/sched.c */
+#ifdef CONFIG_PREEMPT
+ { preempt_schedule, 0 },
+#endif
+ { wait_for_completion, 0 },
+ { interruptible_sleep_on, 0 },
+ { interruptible_sleep_on_timeout, 0 },
+ { sleep_on, 0 },
+ { sleep_on_timeout, 0 },
+ { __cond_resched, 0 },
+ { yield, 0 },
+ { io_schedule, 0 },
+ { io_schedule_timeout, 0 },
+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT)
+ { __preempt_spin_lock, 0 },
+ { __preempt_write_lock, 0 },
+#endif
+ /* kernel/timer.c */
+ { schedule_timeout, 1 },
+/* { nanosleep_restart, 1 }, */
+ /* lib/rwsem-spinlock.c */
+ { __down_read, 1 },
+ { __down_write, 1 },
};
-static struct mips_frame_info schedule_frame;
-static struct mips_frame_info schedule_timeout_frame;
-static struct mips_frame_info sleep_on_frame;
-static struct mips_frame_info sleep_on_timeout_frame;
-static struct mips_frame_info wait_for_completion_frame;
+
static int mips_frame_info_initialized;
-static int __init get_frame_info(struct mips_frame_info *info, void *func)
+static int __init get_frame_info(struct mips_frame_info *info)
{
int i;
+ void *func = info->func;
union mips_instruction *ip = (union mips_instruction *)func;
info->pc_offset = -1;
- info->frame_offset = -1;
+ info->frame_offset = info->omit_fp ? 0 : -1;
for (i = 0; i < 128; i++, ip++) {
/* if jal, jalr, jr, stop. */
if (ip->j_format.opcode == jal_op ||
@@ -246,13 +273,25 @@
static int __init frame_info_init(void)
{
- mips_frame_info_initialized =
- !get_frame_info(&schedule_frame, schedule) &&
- !get_frame_info(&schedule_timeout_frame, schedule_timeout) &&
- !get_frame_info(&sleep_on_frame, sleep_on) &&
- !get_frame_info(&sleep_on_timeout_frame, sleep_on_timeout) &&
- !get_frame_info(&wait_for_completion_frame, wait_for_completion);
-
+ int i, found;
+ for (i = 0; i < ARRAY_SIZE(mfinfo); i++)
+ if (get_frame_info(&mfinfo[i]))
+ return -1;
+ schedule_frame = mfinfo[0];
+ /* bubble sort */
+ do {
+ struct mips_frame_info tmp;
+ found = 0;
+ for (i = 1; i < ARRAY_SIZE(mfinfo); i++) {
+ if (mfinfo[i-1].func > mfinfo[i].func) {
+ tmp = mfinfo[i];
+ mfinfo[i] = mfinfo[i-1];
+ mfinfo[i-1] = tmp;
+ found = 1;
+ }
+ }
+ } while (found);
+ mips_frame_info_initialized = 1;
return 0;
}
@@ -286,45 +325,25 @@
if (!mips_frame_info_initialized)
return 0;
pc = thread_saved_pc(p);
+
if (!in_sched_functions(pc))
goto out;
- if (pc >= (unsigned long) sleep_on_timeout)
- goto schedule_timeout_caller;
- if (pc >= (unsigned long) sleep_on)
- goto schedule_caller;
- if (pc >= (unsigned long) interruptible_sleep_on_timeout)
- goto schedule_timeout_caller;
- if (pc >= (unsigned long)interruptible_sleep_on)
- goto schedule_caller;
- if (pc >= (unsigned long)wait_for_completion)
- goto schedule_caller;
- goto schedule_timeout_caller;
-
-schedule_caller:
- frame = ((unsigned long *)p->thread.reg30)[schedule_frame.frame_offset];
- if (pc >= (unsigned long) sleep_on)
- pc = ((unsigned long *)frame)[sleep_on_frame.pc_offset];
- else
- pc = ((unsigned long *)frame)[wait_for_completion_frame.pc_offset];
- goto out;
-
-schedule_timeout_caller:
- /*
- * The schedule_timeout frame
- */
frame = ((unsigned long *)p->thread.reg30)[schedule_frame.frame_offset];
+ do {
+ int i;
+ for (i = ARRAY_SIZE(mfinfo) - 1; i >= 0; i--) {
+ if (pc >= (unsigned long) mfinfo[i].func)
+ break;
+ }
+ if (i < 0)
+ break;
- /*
- * frame now points to sleep_on_timeout's frame
- */
- pc = ((unsigned long *)frame)[schedule_timeout_frame.pc_offset];
-
- if (in_sched_functions(pc)) {
- /* schedule_timeout called by [interruptible_]sleep_on_timeout */
- frame = ((unsigned long *)frame)[schedule_timeout_frame.frame_offset];
- pc = ((unsigned long *)frame)[sleep_on_timeout_frame.pc_offset];
- }
+ if (mfinfo[i].omit_fp)
+ break;
+ pc = ((unsigned long *)frame)[mfinfo[i].pc_offset];
+ frame = ((unsigned long *)frame)[mfinfo[i].frame_offset];
+ } while (in_sched_functions(pc));
out:
---
Atsushi Nemoto
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "Can't analyze prologue code ..." at boot time
2004-10-28 15:07 ` Atsushi Nemoto
@ 2004-10-29 11:18 ` Atsushi Nemoto
0 siblings, 0 replies; 7+ messages in thread
From: Atsushi Nemoto @ 2004-10-29 11:18 UTC (permalink / raw)
To: thomas.petazzoni; +Cc: linux-mips, mentre, ralf
>>>>> On Fri, 29 Oct 2004 00:07:57 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> said:
anemo> Here is a revised patch which can work with gcc 3.4.
anemo> Ralf, how about this patch? No more maintenance nightmare :-)
I found that still "Can't analyze" message displayed with gcc 3.4.
Revised again.
diff -u linux-mips-cvs/arch/mips/kernel/process.c linux-mips/arch/mips/kernel/process.c
--- linux-mips-cvs/arch/mips/kernel/process.c Fri Oct 29 20:14:01 2004
+++ linux-mips/arch/mips/kernel/process.c Fri Oct 29 20:13:18 2004
@@ -185,22 +185,49 @@
return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL);
}
-struct mips_frame_info {
+static struct mips_frame_info {
+ void *func;
+ int omit_fp; /* compiled without fno-omit-frame-pointer */
int frame_offset;
int pc_offset;
+} schedule_frame, mfinfo[] = {
+ { schedule, 0 }, /* must be first */
+ /* arch/mips/kernel/semaphore.c */
+ { __down, 1 },
+ { __down_interruptible, 1 },
+ /* kernel/sched.c */
+#ifdef CONFIG_PREEMPT
+ { preempt_schedule, 0 },
+#endif
+ { wait_for_completion, 0 },
+ { interruptible_sleep_on, 0 },
+ { interruptible_sleep_on_timeout, 0 },
+ { sleep_on, 0 },
+ { sleep_on_timeout, 0 },
+ { __cond_resched, 0 },
+ { yield, 0 },
+ { io_schedule, 0 },
+ { io_schedule_timeout, 0 },
+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT)
+ { __preempt_spin_lock, 0 },
+ { __preempt_write_lock, 0 },
+#endif
+ /* kernel/timer.c */
+ { schedule_timeout, 1 },
+/* { nanosleep_restart, 1 }, */
+ /* lib/rwsem-spinlock.c */
+ { __down_read, 1 },
+ { __down_write, 1 },
};
-static struct mips_frame_info schedule_frame;
-static struct mips_frame_info schedule_timeout_frame;
-static struct mips_frame_info sleep_on_frame;
-static struct mips_frame_info sleep_on_timeout_frame;
-static struct mips_frame_info wait_for_completion_frame;
+
static int mips_frame_info_initialized;
-static int __init get_frame_info(struct mips_frame_info *info, void *func)
+static int __init get_frame_info(struct mips_frame_info *info)
{
int i;
+ void *func = info->func;
union mips_instruction *ip = (union mips_instruction *)func;
info->pc_offset = -1;
- info->frame_offset = -1;
+ info->frame_offset = info->omit_fp ? 0 : -1;
for (i = 0; i < 128; i++, ip++) {
/* if jal, jalr, jr, stop. */
if (ip->j_format.opcode == jal_op ||
@@ -227,8 +254,10 @@
}
/* sw / sd $s8, offset($sp) */
if (ip->i_format.rt == 30) {
+#if 0 /* gcc 3.4 does aggressive optimization... */
if (info->frame_offset != -1)
break;
+#endif
info->frame_offset =
ip->i_format.simmediate / sizeof(long);
}
@@ -246,13 +275,25 @@
static int __init frame_info_init(void)
{
- mips_frame_info_initialized =
- !get_frame_info(&schedule_frame, schedule) &&
- !get_frame_info(&schedule_timeout_frame, schedule_timeout) &&
- !get_frame_info(&sleep_on_frame, sleep_on) &&
- !get_frame_info(&sleep_on_timeout_frame, sleep_on_timeout) &&
- !get_frame_info(&wait_for_completion_frame, wait_for_completion);
-
+ int i, found;
+ for (i = 0; i < ARRAY_SIZE(mfinfo); i++)
+ if (get_frame_info(&mfinfo[i]))
+ return -1;
+ schedule_frame = mfinfo[0];
+ /* bubble sort */
+ do {
+ struct mips_frame_info tmp;
+ found = 0;
+ for (i = 1; i < ARRAY_SIZE(mfinfo); i++) {
+ if (mfinfo[i-1].func > mfinfo[i].func) {
+ tmp = mfinfo[i];
+ mfinfo[i] = mfinfo[i-1];
+ mfinfo[i-1] = tmp;
+ found = 1;
+ }
+ }
+ } while (found);
+ mips_frame_info_initialized = 1;
return 0;
}
@@ -286,45 +327,25 @@
if (!mips_frame_info_initialized)
return 0;
pc = thread_saved_pc(p);
+
if (!in_sched_functions(pc))
goto out;
- if (pc >= (unsigned long) sleep_on_timeout)
- goto schedule_timeout_caller;
- if (pc >= (unsigned long) sleep_on)
- goto schedule_caller;
- if (pc >= (unsigned long) interruptible_sleep_on_timeout)
- goto schedule_timeout_caller;
- if (pc >= (unsigned long)interruptible_sleep_on)
- goto schedule_caller;
- if (pc >= (unsigned long)wait_for_completion)
- goto schedule_caller;
- goto schedule_timeout_caller;
-
-schedule_caller:
- frame = ((unsigned long *)p->thread.reg30)[schedule_frame.frame_offset];
- if (pc >= (unsigned long) sleep_on)
- pc = ((unsigned long *)frame)[sleep_on_frame.pc_offset];
- else
- pc = ((unsigned long *)frame)[wait_for_completion_frame.pc_offset];
- goto out;
-
-schedule_timeout_caller:
- /*
- * The schedule_timeout frame
- */
frame = ((unsigned long *)p->thread.reg30)[schedule_frame.frame_offset];
+ do {
+ int i;
+ for (i = ARRAY_SIZE(mfinfo) - 1; i >= 0; i--) {
+ if (pc >= (unsigned long) mfinfo[i].func)
+ break;
+ }
+ if (i < 0)
+ break;
- /*
- * frame now points to sleep_on_timeout's frame
- */
- pc = ((unsigned long *)frame)[schedule_timeout_frame.pc_offset];
-
- if (in_sched_functions(pc)) {
- /* schedule_timeout called by [interruptible_]sleep_on_timeout */
- frame = ((unsigned long *)frame)[schedule_timeout_frame.frame_offset];
- pc = ((unsigned long *)frame)[sleep_on_timeout_frame.pc_offset];
- }
+ if (mfinfo[i].omit_fp)
+ break;
+ pc = ((unsigned long *)frame)[mfinfo[i].pc_offset];
+ frame = ((unsigned long *)frame)[mfinfo[i].frame_offset];
+ } while (in_sched_functions(pc));
out:
---
Atsushi Nemoto
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2004-10-29 11:42 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-09-24 8:52 "Can't analyze prologue code ..." at boot time Thomas Petazzoni
2004-09-24 10:06 ` Atsushi Nemoto
2004-09-24 12:11 ` Thomas Petazzoni
2004-09-24 22:15 ` Filip Onkelinx
2004-09-25 14:03 ` Atsushi Nemoto
2004-10-28 15:07 ` Atsushi Nemoto
2004-10-29 11:18 ` Atsushi Nemoto
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox