From b9a050a08e5f1f4199df93ebe86a75c6c01dbbee Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Wed, 23 May 2012 15:56:52 +0100 Subject: Wrote stack scanner for xci6ll and other unix-like x86_64 platforms. more tests complete. Copied from Perforce Change: 178294 ServerID: perforce.ravenbrook.com --- mps/code/mps.c | 2 +- mps/code/mps.xcodeproj/project.pbxproj | 4 +- mps/code/ssixi6.c | 111 +++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 mps/code/ssixi6.c (limited to 'mps/code') diff --git a/mps/code/mps.c b/mps/code/mps.c index ae14469bda9..900f12877b2 100644 --- a/mps/code/mps.c +++ b/mps/code/mps.c @@ -99,7 +99,7 @@ #include "protsgix.c" #include "prmcan.c" #include "span.c" -#include "ssan.c" +#include "ssixi6.c" #else diff --git a/mps/code/mps.xcodeproj/project.pbxproj b/mps/code/mps.xcodeproj/project.pbxproj index 8c18f9c8edb..c5780878651 100644 --- a/mps/code/mps.xcodeproj/project.pbxproj +++ b/mps/code/mps.xcodeproj/project.pbxproj @@ -104,6 +104,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 3104AFA5156D27E7000A585A /* ssixi6.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ssixi6.c; sourceTree = ""; }; 3124CAB8156BE3EC00753214 /* awlut */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = awlut; sourceTree = BUILT_PRODUCTS_DIR; }; 3124CAC2156BE40100753214 /* awlut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awlut.c; sourceTree = ""; }; 3124CAC6156BE48D00753214 /* fmtdy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fmtdy.c; sourceTree = ""; }; @@ -161,7 +162,6 @@ 31EEAC4E156AB3E300714D05 /* prmcan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prmcan.c; sourceTree = ""; }; 31EEAC4F156AB3E300714D05 /* protix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = protix.c; sourceTree = ""; }; 31EEAC50156AB3E300714D05 /* protsgix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = protsgix.c; sourceTree = ""; }; - 31EEAC51156AB3E300714D05 /* ssan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ssan.c; sourceTree = ""; }; 31EEAC52156AB3E300714D05 /* than.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = than.c; sourceTree = ""; }; 31EEAC53156AB3E300714D05 /* vmix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vmix.c; sourceTree = ""; }; 31EEAC5B156AB41900714D05 /* poolamc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = poolamc.c; sourceTree = ""; }; @@ -245,7 +245,7 @@ 31A47BA7156C1E6E0039B1C2 /* I6 */ = { isa = PBXGroup; children = ( - 31EEAC51156AB3E300714D05 /* ssan.c */, + 3104AFA5156D27E7000A585A /* ssixi6.c */, ); name = I6; sourceTree = ""; diff --git a/mps/code/ssixi6.c b/mps/code/ssixi6.c new file mode 100644 index 00000000000..6732f850b3b --- /dev/null +++ b/mps/code/ssixi6.c @@ -0,0 +1,111 @@ +/* ssixi6.c: UNIX/INTEL STACK SCANNING + * + * $Id$ + * Copyright (c) 2001 Ravenbrook Limited. See end of file for license. + * + * This scans the stack and fixes the registers which may contain + * roots. See + * + * This code was branched from ssixi3.c (32-bit Intel) initially for the + * port to W3I6LL (Mac OS X on x86_64 with Clang). + * + * This code is common to more than one Unix implementation on + * Intel hardware (but is not portable Unix code). According to Wikipedia, + * all the non-Windows platforms use the System V AMD64 ABI. See + * .sources.callees.saves. + * + * SOURCES + * + * .sources.callees.saves: + * "Registers %rbp, %rbx and %r12 through %r15 "belong" to the calling + * function and the called function is required to preserve their values. + * In other words, a called function must preserve these registers’ values + * for its caller." -- System V AMD64 ABI + * + * + * ASSUMPTIONS + * + * .assume.align: The stack pointer is assumed to be aligned on a word + * boundary. + * + * .assume.asm.stack: The compiler must not do wacky things with the + * stack pointer around a call since we need to ensure that the + * callee-save regs are visible during TraceScanArea. + * + * .assume.asm.order: The volatile modifier should prevent movement + * of code, which might break .assume.asm.stack. + * + */ + + +#include "mpm.h" + +SRCID(ssixi6, "$Id$"); + + +/* .assume.asm.order */ +#define ASMV(x) __asm__ volatile (x) + + +Res StackScan(ScanState ss, Addr *stackBot) +{ + Addr *stackTop; + Res res; + + ASMV("push %rbp"); + ASMV("push %rbx"); + ASMV("push %r12"); + ASMV("push %r13"); + ASMV("push %r14"); + ASMV("push %r15"); + ASMV("mov %%rsp, %0" : "=r" (stackTop) :); /* stackTop = esp */ + + AVER(AddrIsAligned((Addr)stackTop, sizeof(Addr))); /* .assume.align */ + res = TraceScanArea(ss, stackTop, stackBot); + + ASMV("add $48, %rsp"); /* pop 6 regs to restore the stack pointer */ + + return res; +} + + +/* C. COPYRIGHT AND LICENSE + * + * Copyright (C) 2001-2002 Ravenbrook Limited . + * All rights reserved. This is an open source license. Contact + * Ravenbrook for commercial licensing options. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Redistributions in any form must be accompanied by information on how + * to obtain complete source code for this software and any accompanying + * software that uses this software. The source code must either be + * included in the distribution or be available for no more than the cost + * of distribution plus a nominal fee, and must be freely redistributable + * under reasonable conditions. For an executable file, complete source + * code means the source code for all modules it contains. It does not + * include source code for modules or files that typically accompany the + * major components of the operating system on which the executable file + * runs. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ -- cgit v1.2.1