patch-2.3.35 linux/include/asm-sparc/processor.h
Next file: linux/include/asm-sparc/resource.h
Previous file: linux/include/asm-sparc/poll.h
Back to the patch index
Back to the overall index
- Lines: 42
- Date:
Mon Dec 20 22:05:52 1999
- Orig file:
v2.3.34/linux/include/asm-sparc/processor.h
- Orig date:
Thu Nov 11 20:11:52 1999
diff -u --recursive --new-file v2.3.34/linux/include/asm-sparc/processor.h linux/include/asm-sparc/processor.h
@@ -1,4 +1,4 @@
-/* $Id: processor.h,v 1.72 1999/08/14 03:52:04 anton Exp $
+/* $Id: processor.h,v 1.73 1999/12/15 14:18:52 davem Exp $
* include/asm-sparc/processor.h
*
* Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu)
@@ -161,7 +161,34 @@
#define release_segments(mm) do { } while (0)
#define forget_segments() do { } while (0)
-unsigned long get_wchan(struct task_struct *p);
+#define get_wchan(__TSK) \
+({ extern void scheduling_functions_start_here(void); \
+ extern void scheduling_functions_end_here(void); \
+ unsigned long pc, fp, bias = 0; \
+ unsigned long task_base = (unsigned long) (__TSK); \
+ unsigned long __ret = 0; \
+ struct reg_window *rw; \
+ int count = 0; \
+ if (!(__TSK) || (__TSK) == current || \
+ (__TSK)->state == TASK_RUNNING) \
+ goto __out; \
+ fp = (__TSK)->thread.ksp + bias; \
+ do { \
+ /* Bogus frame pointer? */ \
+ if (fp < (task_base + sizeof(struct task_struct)) || \
+ fp >= (task_base + (2 * PAGE_SIZE))) \
+ break; \
+ rw = (struct reg_window *) fp; \
+ pc = rw->ins[7]; \
+ if (pc < ((unsigned long) scheduling_functions_start_here) || \
+ pc >= ((unsigned long) scheduling_functions_end_here)) { \
+ __ret = pc; \
+ goto __out; \
+ } \
+ fp = rw->ins[6] + bias; \
+ } while (++count < 16); \
+__out: __ret; \
+})
#define KSTK_EIP(tsk) ((tsk)->thread.kregs->pc)
#define KSTK_ESP(tsk) ((tsk)->thread.kregs->u_regs[UREG_FP])
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)