On Wed, Jun 30, 2010 at 07:27:10AM -0700, Phil Staub wrote: > >I'm having a problem with kernel mode stack on my box. It seems that > >STACKOVERFLOW happened to Linux kernel. However, I can't prove it > >because the lack of any detection in __do_IRQ() function just like on > >the other architectures. If you know something about, please help me > >on following two questions. > >- Is there any possible to do this on MIPS? > > The mechanisms I know about for detecting stack overflow include: > > 1. Use of the MMU - stack ends at a page boundary, adjacent page is > either unmapped or mapped read-only and causes an exception if violated. Won't easily work on MIPS as the stack is allocated in KSEG0 / XKPHYS which are unmapped segments. It would be necessary to relocate the stack into a mapped space. Ultra-ancient Linux/MIPS kernels actually used to do that but that code may well even predate everything that still exists on linux-mips.org. > 2. Hooks inserted into toolchain to cause any stack decrement to be > first tested against a limit. > > 3. Fill entire stack with a recognizable pattern before first > use. After suspected stack overflow, check to see if the pattern has > been disturbed in the area of the stack limit. This was afaik never ported to MIPS though that'd be easy. > (Disclaimer: I've used all of these in some form on other OSes, but > not on Linux. Someone else may have a more directly relevant answer.) > > >- or, more simple question, how could I get the address $sp pointed by > >asm() notation in C? > > How about something like: > > { > long x; > ... > asm("move %0,$29":"=g"(x)); > ... > } That will do. Or even something portable like: { unsigned long foo; return &foo; } which used to work (GNU alloca and others were using this) but I'm sure GCC has learned how to optimize this to shreds. Ralf