| Index: Source/WTF/wtf/StackBounds.cpp
|
| diff --git a/Source/WTF/wtf/StackBounds.cpp b/Source/WTF/wtf/StackBounds.cpp
|
| deleted file mode 100644
|
| index a272ce3de90d7c4c318d36750ff9edace89de32f..0000000000000000000000000000000000000000
|
| --- a/Source/WTF/wtf/StackBounds.cpp
|
| +++ /dev/null
|
| @@ -1,261 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
|
| - * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
|
| - *
|
| - * This library is free software; you can redistribute it and/or
|
| - * modify it under the terms of the GNU Lesser General Public
|
| - * License as published by the Free Software Foundation; either
|
| - * version 2 of the License, or (at your option) any later version.
|
| - *
|
| - * This library is distributed in the hope that it will be useful,
|
| - * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| - * Lesser General Public License for more details.
|
| - *
|
| - * You should have received a copy of the GNU Lesser General Public
|
| - * License along with this library; if not, write to the Free Software
|
| - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
| - *
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "StackBounds.h"
|
| -
|
| -#if OS(DARWIN)
|
| -
|
| -#include <mach/task.h>
|
| -#include <mach/thread_act.h>
|
| -#include <pthread.h>
|
| -
|
| -#elif OS(WINDOWS)
|
| -
|
| -#include <windows.h>
|
| -
|
| -#elif OS(SOLARIS)
|
| -
|
| -#include <thread.h>
|
| -
|
| -#elif OS(QNX)
|
| -
|
| -#include <errno.h>
|
| -#include <fcntl.h>
|
| -#include <pthread.h>
|
| -#include <stdio.h>
|
| -#include <string.h>
|
| -#include <sys/procfs.h>
|
| -
|
| -#elif OS(UNIX)
|
| -
|
| -#include <pthread.h>
|
| -#if HAVE(PTHREAD_NP_H)
|
| -#include <pthread_np.h>
|
| -#endif
|
| -
|
| -#endif
|
| -
|
| -namespace WTF {
|
| -
|
| -// Bug 26276 - Need a mechanism to determine stack extent
|
| -//
|
| -// These platforms should now be working correctly:
|
| -// DARWIN, QNX, UNIX
|
| -// These platforms are not:
|
| -// WINDOWS, SOLARIS, OPENBSD, WINCE
|
| -//
|
| -// FIXME: remove this! - this code unsafely guesses at stack sizes!
|
| -#if OS(WINDOWS) || OS(SOLARIS) || OS(OPENBSD)
|
| -// Based on the current limit used by the JSC parser, guess the stack size.
|
| -static const ptrdiff_t estimatedStackSize = 128 * sizeof(void*) * 1024;
|
| -// This method assumes the stack is growing downwards.
|
| -static void* estimateStackBound(void* origin)
|
| -{
|
| - return static_cast<char*>(origin) - estimatedStackSize;
|
| -}
|
| -#endif
|
| -
|
| -#if OS(DARWIN)
|
| -
|
| -void StackBounds::initialize()
|
| -{
|
| - pthread_t thread = pthread_self();
|
| - m_origin = pthread_get_stackaddr_np(thread);
|
| - m_bound = static_cast<char*>(m_origin) - pthread_get_stacksize_np(thread);
|
| -}
|
| -
|
| -#elif OS(QNX)
|
| -
|
| -void StackBounds::initialize()
|
| -{
|
| - void* stackBase = 0;
|
| - size_t stackSize = 0;
|
| -
|
| - struct _debug_thread_info threadInfo;
|
| - memset(&threadInfo, 0, sizeof(threadInfo));
|
| - threadInfo.tid = pthread_self();
|
| - int fd = open("/proc/self", O_RDONLY);
|
| - if (fd == -1) {
|
| - LOG_ERROR("Unable to open /proc/self (errno: %d)", errno);
|
| - CRASH();
|
| - }
|
| - devctl(fd, DCMD_PROC_TIDSTATUS, &threadInfo, sizeof(threadInfo), 0);
|
| - close(fd);
|
| - stackBase = reinterpret_cast<void*>(threadInfo.stkbase);
|
| - stackSize = threadInfo.stksize;
|
| - ASSERT(stackBase);
|
| -
|
| - m_bound = static_cast<char*>(stackBase) + 0x1000; // 4kb guard page
|
| - m_origin = static_cast<char*>(stackBase) + stackSize;
|
| -}
|
| -
|
| -#elif OS(SOLARIS)
|
| -
|
| -void StackBounds::initialize()
|
| -{
|
| - stack_t s;
|
| - thr_stksegment(&s);
|
| - m_origin = s.ss_sp;
|
| - m_bound = estimateStackBound(m_origin);
|
| -}
|
| -
|
| -#elif OS(OPENBSD)
|
| -
|
| -void StackBounds::initialize()
|
| -{
|
| - pthread_t thread = pthread_self();
|
| - stack_t stack;
|
| - pthread_stackseg_np(thread, &stack);
|
| - m_origin = stack.ss_sp;
|
| - m_bound = estimateStackBound(m_origin);
|
| -}
|
| -
|
| -#elif OS(UNIX)
|
| -
|
| -void StackBounds::initialize()
|
| -{
|
| - void* stackBase = 0;
|
| - size_t stackSize = 0;
|
| -
|
| - pthread_t thread = pthread_self();
|
| - pthread_attr_t sattr;
|
| - pthread_attr_init(&sattr);
|
| -#if HAVE(PTHREAD_NP_H) || OS(NETBSD)
|
| - // e.g. on FreeBSD 5.4, neundorf@kde.org
|
| - pthread_attr_get_np(thread, &sattr);
|
| -#else
|
| - // FIXME: this function is non-portable; other POSIX systems may have different np alternatives
|
| - pthread_getattr_np(thread, &sattr);
|
| -#endif
|
| - int rc = pthread_attr_getstack(&sattr, &stackBase, &stackSize);
|
| - (void)rc; // FIXME: Deal with error code somehow? Seems fatal.
|
| - ASSERT(stackBase);
|
| - pthread_attr_destroy(&sattr);
|
| - m_bound = stackBase;
|
| - m_origin = static_cast<char*>(stackBase) + stackSize;
|
| -}
|
| -
|
| -#elif OS(WINCE)
|
| -
|
| -static bool detectGrowingDownward(void* previousFrame)
|
| -{
|
| - // Find the address of this stack frame by taking the address of a local variable.
|
| - int thisFrame;
|
| - return previousFrame > &thisFrame;
|
| -}
|
| -
|
| -static inline bool isPageWritable(void* page)
|
| -{
|
| - MEMORY_BASIC_INFORMATION memoryInformation;
|
| - DWORD result = VirtualQuery(page, &memoryInformation, sizeof(memoryInformation));
|
| -
|
| - // return false on error, including ptr outside memory
|
| - if (result != sizeof(memoryInformation))
|
| - return false;
|
| -
|
| - DWORD protect = memoryInformation.Protect & ~(PAGE_GUARD | PAGE_NOCACHE);
|
| - return protect == PAGE_READWRITE
|
| - || protect == PAGE_WRITECOPY
|
| - || protect == PAGE_EXECUTE_READWRITE
|
| - || protect == PAGE_EXECUTE_WRITECOPY;
|
| -}
|
| -
|
| -static inline void* getLowerStackBound(char* currentPage, DWORD pageSize)
|
| -{
|
| - while (currentPage > 0) {
|
| - // check for underflow
|
| - if (currentPage >= reinterpret_cast<char*>(pageSize))
|
| - currentPage -= pageSize;
|
| - else
|
| - currentPage = 0;
|
| -
|
| - if (!isPageWritable(currentPage))
|
| - return currentPage + pageSize;
|
| - }
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -static inline void* getUpperStackBound(char* currentPage, DWORD pageSize)
|
| -{
|
| - do {
|
| - // guaranteed to complete because isPageWritable returns false at end of memory
|
| - currentPage += pageSize;
|
| - } while (isPageWritable(currentPage));
|
| -
|
| - return currentPage - pageSize;
|
| -}
|
| -
|
| -void StackBounds::initialize()
|
| -{
|
| - // find the address of this stack frame by taking the address of a local variable
|
| - void* thisFrame = &thisFrame;
|
| - bool isGrowingDownward = detectGrowingDownward(thisFrame);
|
| -
|
| - SYSTEM_INFO systemInfo;
|
| - GetSystemInfo(&systemInfo);
|
| - DWORD pageSize = systemInfo.dwPageSize;
|
| -
|
| - // scan all of memory starting from this frame, and return the last writeable page found
|
| - char* currentPage = reinterpret_cast<char*>(reinterpret_cast<DWORD>(thisFrame) & ~(pageSize - 1));
|
| - void* lowerStackBound = getLowerStackBound(currentPage, pageSize);
|
| - void* upperStackBound = getUpperStackBound(currentPage, pageSize);
|
| -
|
| - m_origin = isGrowingDownward ? upperStackBound : lowerStackBound;
|
| - m_bound = isGrowingDownward ? lowerStackBound : upperStackBound;
|
| -}
|
| -
|
| -#elif OS(WINDOWS)
|
| -
|
| -void StackBounds::initialize()
|
| -{
|
| -#if CPU(X86) && COMPILER(MSVC)
|
| - // offset 0x18 from the FS segment register gives a pointer to
|
| - // the thread information block for the current thread
|
| - NT_TIB* pTib;
|
| - __asm {
|
| - MOV EAX, FS:[18h]
|
| - MOV pTib, EAX
|
| - }
|
| - m_origin = static_cast<void*>(pTib->StackBase);
|
| -#elif CPU(X86) && COMPILER(GCC)
|
| - // offset 0x18 from the FS segment register gives a pointer to
|
| - // the thread information block for the current thread
|
| - NT_TIB* pTib;
|
| - asm ( "movl %%fs:0x18, %0\n"
|
| - : "=r" (pTib)
|
| - );
|
| - m_origin = static_cast<void*>(pTib->StackBase);
|
| -#elif CPU(X86_64)
|
| - PNT_TIB64 pTib = reinterpret_cast<PNT_TIB64>(NtCurrentTeb());
|
| - m_origin = reinterpret_cast<void*>(pTib->StackBase);
|
| -#else
|
| -#error Need a way to get the stack bounds on this platform (Windows)
|
| -#endif
|
| - // Looks like we should be able to get pTib->StackLimit
|
| - m_bound = estimateStackBound(m_origin);
|
| -}
|
| -
|
| -#else
|
| -#error Need a way to get the stack bounds on this platform
|
| -#endif
|
| -
|
| -} // namespace WTF
|
|
|