[pypy-commit] stmgc c7-refactor: Add the shadowstack

arigo noreply at buildbot.pypy.org
Mon Feb 24 16:49:40 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: c7-refactor
Changeset: r836:62c2f89f90b9
Date: 2014-02-24 16:49 +0100
http://bitbucket.org/pypy/stmgc/changeset/62c2f89f90b9/

Log:	Add the shadowstack

diff --git a/c7/demo/demo2.c b/c7/demo/demo2.c
--- a/c7/demo/demo2.c
+++ b/c7/demo/demo2.c
@@ -21,8 +21,23 @@
 
 __thread stm_thread_local_t stm_thread_local;
 
-#define PUSH_ROOT(p)   (void)0 // XXX...
-#define POP_ROOT(p)    (void)0 // XXX...
+#define PUSH_ROOT(p)   (*stm_thread_local.shadowstack++ = (object_t *)(p))
+#define POP_ROOT(p)    ((p) = (typeof(p))*--stm_thread_local.shadowstack)
+
+void init_shadow_stack(void)
+{
+    object_t **s = (object_t **)malloc(1000 * sizeof(object_t *));
+    assert(s);
+    stm_thread_local.shadowstack = s;
+    stm_thread_local.shadowstack_base = s;
+}
+
+void done_shadow_stack(void)
+{
+    free(stm_thread_local.shadowstack);
+    stm_thread_local.shadowstack = NULL;
+    stm_thread_local.shadowstack_base = NULL;
+}
 
 
 ssize_t stmcb_size_rounded_up(struct object_s *ob)
@@ -181,6 +196,7 @@
 {
     int status;
     stm_register_thread_local(&stm_thread_local);
+    init_shadow_stack();
     PUSH_ROOT(global_chained_list);  /* remains forever in the shadow stack */
 
     while (check_sorted() == -1) {
@@ -189,6 +205,7 @@
 
     POP_ROOT(global_chained_list);
     assert(stm_thread_local.shadowstack == stm_thread_local.shadowstack_base);
+    done_shadow_stack();
     stm_unregister_thread_local(&stm_thread_local);
     status = sem_post(&done); assert(status == 0);
     return NULL;
@@ -230,6 +247,7 @@
 
     stm_setup();
     stm_register_thread_local(&stm_thread_local);
+    init_shadow_stack();
 
     setup_list();
 
@@ -241,6 +259,7 @@
 
     final_check();
 
+    done_shadow_stack();
     stm_unregister_thread_local(&stm_thread_local);
     stm_teardown();
 


More information about the pypy-commit mailing list