On Tue, Apr 23, 2013 at 08:57:31AM -0400, Kenneth R Westerback wrote:
> On Tue, Apr 23, 2013 at 03:40:58AM -0600, Landry Breuil wrote:
> > CVSROOT:    /cvs
> > Module name:        ports
> > Changes by: [email protected]  2013/04/23 03:40:58
> > 
> > Modified files:
> >     www/webkit     : Makefile 
> > Added files:
> >     www/webkit/patches: patch-Source_WTF_wtf_StackBounds_cpp 
> > 
> > Log message:
> > Add a patch to fix stack bounds computation, from David Hill (also
> > pushed upstream as https://bugs.webkit.org/show_bug.cgi?id=114978)
> > 
> > Seems to fix xombrero/surf crashes on amd64, and seems to magically make
> > webkit sort-of usable (ie dead-slow, but js seems to work) on powerpc.
> > (symptom : ** Message: console message: undefined @0: RangeError: Maximum
> > call stack size exceeded.)
> > 
> > Note : webkit still fails to build on mips64* and hppa. sigh.
> > 
> > ok jasper@
> > 
> 
> So the logic was not checked/fixed where the bounds are actually
> checked on architectures that have upward growing stacks? Where
> m_bound and m_origin have their meanings swapped?

The previous logic was doing (note the lovely FIXME) :

 67 // FIXME: remove this! - this code unsafely guesses at stack sizes!
 68 static const ptrdiff_t estimatedStackSize = 128 * sizeof(void*) * 1024;
 69 // This method assumes the stack is growing downwards.
 70 static void* estimateStackBound(void* origin)
 71 {
 72     return static_cast<char*>(origin) - estimatedStackSize;
 73 }

122 void StackBounds::initialize()
123 {
124     pthread_t thread = pthread_self();
125     stack_t stack;
126     pthread_stackseg_np(thread, &stack);
127     m_origin = stack.ss_sp;
128     m_bound = estimateStackBound(m_origin);
129 }

The new logic does :

122 void StackBounds::initialize()
123 {
124     pthread_t thread = pthread_self();
125     stack_t stack;
126     pthread_stackseg_np(thread, &stack);
127     m_origin = stack.ss_sp;
128 #if defined(__hppa__) || defined(__hppa64__)
129     // hppa's stack grows up
130     m_bound = static_cast<char*>(m_origin) + stack.ss_size;
131 #else
132     m_bound = static_cast<char*>(m_origin) - stack.ss_size;
133 #endif
134 }

> I only see MACHINE_STACK_GROWS_UP defined on hppa and hppa64. Are
> these really the only archs with upward growing stacks?

It seems so. Do you mean we should pull that #define from a header
instead of hardcoding hppa* here ?

Landry

Reply via email to