diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-01-29 01:41:54 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-01-29 01:41:54 +0000 |
commit | f969d69ba9f952e5bdd38278e25e26a3e4a61a70 (patch) | |
tree | b3530d803df59d726afaabebc6626987dee1ca05 /arch/alpha | |
parent | a10ce7ef2066b455d69187643ddf2073bfc4db24 (diff) |
Merge with 2.3.27.
Diffstat (limited to 'arch/alpha')
-rw-r--r-- | arch/alpha/config.in | 7 | ||||
-rw-r--r-- | arch/alpha/defconfig | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/alpha_ksyms.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/process.c | 32 |
4 files changed, 42 insertions, 1 deletions
diff --git a/arch/alpha/config.in b/arch/alpha/config.in index 7cb20bee3..f6dc93f61 100644 --- a/arch/alpha/config.in +++ b/arch/alpha/config.in @@ -172,6 +172,11 @@ bool 'Networking support' CONFIG_NET bool 'System V IPC' CONFIG_SYSVIPC bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT bool 'Sysctl support' CONFIG_SYSCTL +if [ "$CONFIG_PROC_FS" = "y" ]; then + choice 'Kernel core (/proc/kcore) format' \ + "ELF CONFIG_KCORE_ELF \ + A.OUT CONFIG_KCORE_AOUT" ELF +fi tristate 'Kernel support for a.out (ECOFF) binaries' CONFIG_BINFMT_AOUT tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC @@ -263,7 +268,7 @@ comment 'Kernel hacking' if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then tristate 'Kernel FP software completion' CONFIG_MATHEMU else - define_bool CONFIG_MATHEMU y + define_tristate CONFIG_MATHEMU y fi bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ diff --git a/arch/alpha/defconfig b/arch/alpha/defconfig index 186505eda..54a05ea5a 100644 --- a/arch/alpha/defconfig +++ b/arch/alpha/defconfig @@ -47,6 +47,8 @@ CONFIG_PCI=y CONFIG_NET=y CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set CONFIG_SYSCTL=y CONFIG_BINFMT_AOUT=y CONFIG_BINFMT_ELF=y diff --git a/arch/alpha/kernel/alpha_ksyms.c b/arch/alpha/kernel/alpha_ksyms.c index f280e4541..ffd93ca9d 100644 --- a/arch/alpha/kernel/alpha_ksyms.c +++ b/arch/alpha/kernel/alpha_ksyms.c @@ -206,3 +206,5 @@ EXPORT_SYMBOL_NOVERS(__remq); EXPORT_SYMBOL_NOVERS(__remqu); EXPORT_SYMBOL_NOVERS(memcpy); EXPORT_SYMBOL_NOVERS(memset); + +EXPORT_SYMBOL(get_wchan); diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index 354597ba2..0390e3138 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -406,3 +406,35 @@ out: unlock_kernel(); return error; } + +/* + * These bracket the sleeping functions.. + */ +extern void scheduling_functions_start_here(void); +extern void scheduling_functions_end_here(void); +#define first_sched ((unsigned long) scheduling_functions_start_here) +#define last_sched ((unsigned long) scheduling_functions_end_here) + +unsigned long get_wchan(struct task_struct *p) +{ + unsigned long schedule_frame; + unsigned long pc; + if (!p || p == current || p->state == TASK_RUNNING) + return 0; + /* + * This one depends on the frame size of schedule(). Do a + * "disass schedule" in gdb to find the frame size. Also, the + * code assumes that sleep_on() follows immediately after + * interruptible_sleep_on() and that add_timer() follows + * immediately after interruptible_sleep(). Ugly, isn't it? + * Maybe adding a wchan field to task_struct would be better, + * after all... + */ + + pc = thread_saved_pc(&p->thread); + if (pc >= first_sched && pc < last_sched) { + schedule_frame = ((unsigned long *)p->thread.ksp)[6]; + return ((unsigned long *)schedule_frame)[12]; + } + return pc; +} |