aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorRichard Brooksby2012-05-23 15:56:52 +0100
committerRichard Brooksby2012-05-23 15:56:52 +0100
commitb9a050a08e5f1f4199df93ebe86a75c6c01dbbee (patch)
tree0b10f36c49cd3bb8a18e830b9f6262f6c013697b /mps/code
parentf2f702fc18e370d9367506bbf1e449e2c622618c (diff)
downloademacs-b9a050a08e5f1f4199df93ebe86a75c6c01dbbee.tar.gz
emacs-b9a050a08e5f1f4199df93ebe86a75c6c01dbbee.zip
Wrote stack scanner for xci6ll and other unix-like x86_64 platforms. more tests complete.
Copied from Perforce Change: 178294 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/mps.c2
-rw-r--r--mps/code/mps.xcodeproj/project.pbxproj4
-rw-r--r--mps/code/ssixi6.c111
3 files changed, 114 insertions, 3 deletions
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 @@
99#include "protsgix.c" 99#include "protsgix.c"
100#include "prmcan.c" 100#include "prmcan.c"
101#include "span.c" 101#include "span.c"
102#include "ssan.c" 102#include "ssixi6.c"
103 103
104#else 104#else
105 105
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 @@
104/* End PBXCopyFilesBuildPhase section */ 104/* End PBXCopyFilesBuildPhase section */
105 105
106/* Begin PBXFileReference section */ 106/* Begin PBXFileReference section */
107 3104AFA5156D27E7000A585A /* ssixi6.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ssixi6.c; sourceTree = "<group>"; };
107 3124CAB8156BE3EC00753214 /* awlut */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = awlut; sourceTree = BUILT_PRODUCTS_DIR; }; 108 3124CAB8156BE3EC00753214 /* awlut */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = awlut; sourceTree = BUILT_PRODUCTS_DIR; };
108 3124CAC2156BE40100753214 /* awlut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awlut.c; sourceTree = "<group>"; }; 109 3124CAC2156BE40100753214 /* awlut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awlut.c; sourceTree = "<group>"; };
109 3124CAC6156BE48D00753214 /* fmtdy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fmtdy.c; sourceTree = "<group>"; }; 110 3124CAC6156BE48D00753214 /* fmtdy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fmtdy.c; sourceTree = "<group>"; };
@@ -161,7 +162,6 @@
161 31EEAC4E156AB3E300714D05 /* prmcan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prmcan.c; sourceTree = "<group>"; }; 162 31EEAC4E156AB3E300714D05 /* prmcan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prmcan.c; sourceTree = "<group>"; };
162 31EEAC4F156AB3E300714D05 /* protix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = protix.c; sourceTree = "<group>"; }; 163 31EEAC4F156AB3E300714D05 /* protix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = protix.c; sourceTree = "<group>"; };
163 31EEAC50156AB3E300714D05 /* protsgix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = protsgix.c; sourceTree = "<group>"; }; 164 31EEAC50156AB3E300714D05 /* protsgix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = protsgix.c; sourceTree = "<group>"; };
164 31EEAC51156AB3E300714D05 /* ssan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ssan.c; sourceTree = "<group>"; };
165 31EEAC52156AB3E300714D05 /* than.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = than.c; sourceTree = "<group>"; }; 165 31EEAC52156AB3E300714D05 /* than.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = than.c; sourceTree = "<group>"; };
166 31EEAC53156AB3E300714D05 /* vmix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vmix.c; sourceTree = "<group>"; }; 166 31EEAC53156AB3E300714D05 /* vmix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vmix.c; sourceTree = "<group>"; };
167 31EEAC5B156AB41900714D05 /* poolamc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = poolamc.c; sourceTree = "<group>"; }; 167 31EEAC5B156AB41900714D05 /* poolamc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = poolamc.c; sourceTree = "<group>"; };
@@ -245,7 +245,7 @@
245 31A47BA7156C1E6E0039B1C2 /* I6 */ = { 245 31A47BA7156C1E6E0039B1C2 /* I6 */ = {
246 isa = PBXGroup; 246 isa = PBXGroup;
247 children = ( 247 children = (
248 31EEAC51156AB3E300714D05 /* ssan.c */, 248 3104AFA5156D27E7000A585A /* ssixi6.c */,
249 ); 249 );
250 name = I6; 250 name = I6;
251 sourceTree = "<group>"; 251 sourceTree = "<group>";
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 @@
1/* ssixi6.c: UNIX/INTEL STACK SCANNING
2 *
3 * $Id$
4 * Copyright (c) 2001 Ravenbrook Limited. See end of file for license.
5 *
6 * This scans the stack and fixes the registers which may contain
7 * roots. See <design/thread-manager/>
8 *
9 * This code was branched from ssixi3.c (32-bit Intel) initially for the
10 * port to W3I6LL (Mac OS X on x86_64 with Clang).
11 *
12 * This code is common to more than one Unix implementation on
13 * Intel hardware (but is not portable Unix code). According to Wikipedia,
14 * all the non-Windows platforms use the System V AMD64 ABI. See
15 * .sources.callees.saves.
16 *
17 * SOURCES
18 *
19 * .sources.callees.saves:
20 * "Registers %rbp, %rbx and %r12 through %r15 "belong" to the calling
21 * function and the called function is required to preserve their values.
22 * In other words, a called function must preserve these registers’ values
23 * for its caller." -- System V AMD64 ABI
24 * <http://x86-64.org/documentation/abi.pdf>
25 *
26 * ASSUMPTIONS
27 *
28 * .assume.align: The stack pointer is assumed to be aligned on a word
29 * boundary.
30 *
31 * .assume.asm.stack: The compiler must not do wacky things with the
32 * stack pointer around a call since we need to ensure that the
33 * callee-save regs are visible during TraceScanArea.
34 *
35 * .assume.asm.order: The volatile modifier should prevent movement
36 * of code, which might break .assume.asm.stack.
37 *
38 */
39
40
41#include "mpm.h"
42
43SRCID(ssixi6, "$Id$");
44
45
46/* .assume.asm.order */
47#define ASMV(x) __asm__ volatile (x)
48
49
50Res StackScan(ScanState ss, Addr *stackBot)
51{
52 Addr *stackTop;
53 Res res;
54
55 ASMV("push %rbp");
56 ASMV("push %rbx");
57 ASMV("push %r12");
58 ASMV("push %r13");
59 ASMV("push %r14");
60 ASMV("push %r15");
61 ASMV("mov %%rsp, %0" : "=r" (stackTop) :); /* stackTop = esp */
62
63 AVER(AddrIsAligned((Addr)stackTop, sizeof(Addr))); /* .assume.align */
64 res = TraceScanArea(ss, stackTop, stackBot);
65
66 ASMV("add $48, %rsp"); /* pop 6 regs to restore the stack pointer */
67
68 return res;
69}
70
71
72/* C. COPYRIGHT AND LICENSE
73 *
74 * Copyright (C) 2001-2002 Ravenbrook Limited <http://www.ravenbrook.com/>.
75 * All rights reserved. This is an open source license. Contact
76 * Ravenbrook for commercial licensing options.
77 *
78 * Redistribution and use in source and binary forms, with or without
79 * modification, are permitted provided that the following conditions are
80 * met:
81 *
82 * 1. Redistributions of source code must retain the above copyright
83 * notice, this list of conditions and the following disclaimer.
84 *
85 * 2. Redistributions in binary form must reproduce the above copyright
86 * notice, this list of conditions and the following disclaimer in the
87 * documentation and/or other materials provided with the distribution.
88 *
89 * 3. Redistributions in any form must be accompanied by information on how
90 * to obtain complete source code for this software and any accompanying
91 * software that uses this software. The source code must either be
92 * included in the distribution or be available for no more than the cost
93 * of distribution plus a nominal fee, and must be freely redistributable
94 * under reasonable conditions. For an executable file, complete source
95 * code means the source code for all modules it contains. It does not
96 * include source code for modules or files that typically accompany the
97 * major components of the operating system on which the executable file
98 * runs.
99 *
100 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
101 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
102 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
103 * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE
104 * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
105 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
106 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
107 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
108 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
109 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
110 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
111 */