components/python/greenlet/patches/01-slp_switch-sparc-multi-thread.patch
author Mike Sullivan <Mike.Sullivan@Oracle.COM>
Mon, 09 Jun 2014 10:38:56 -0700
changeset 1941 f0078a0c258e
parent 1735 2c35e21b08a3
permissions -rw-r--r--
Close of build 50.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1735
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
     1
The following patch comes from the upstream 0.4.2 distribution and
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
     2
addresses the stated problem. It will be removed here once we update to
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
     3
a later version of greenlet.
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
     4
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
     5
commit 3b03825089384f86842032ec1476ad3031908d43
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
     6
Author: Floris Bruynooghe <[email protected]>
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
     7
Date:   Mon Sep 2 10:25:14 2013 +0100
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
     8
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
     9
    Fix slp_switch on SPARC for multi-threaded environments
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    10
    
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    11
    The CLEAN_WINDOWS trap was wrongly removed previously.  It is not
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    12
    required in a single-threaded environment but does need to be present
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    13
    for the switching code to not mess up the register windows in a multi-
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    14
    threaded environment.
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    15
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    16
diff --git a/platform/switch_sparc_sun_gcc.h b/platform/switch_sparc_sun_gcc.h
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    17
index 1f701a2..5c67205 100644
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    18
--- a/platform/switch_sparc_sun_gcc.h
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    19
+++ b/platform/switch_sparc_sun_gcc.h
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    20
@@ -2,6 +2,11 @@
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    21
  * this is the internal transfer function.
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    22
  *
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    23
  * HISTORY
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    24
+ * 30-Aug-13  Floris Bruynooghe <[email protected]>
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    25
+        Clean the register windows again before returning.
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    26
+        This does not clobber the PIC register as it leaves
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    27
+        the current window intact and is required for multi-
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    28
+        threaded code to work correctly.
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    29
  * 08-Mar-11  Floris Bruynooghe <[email protected]>
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    30
  *      No need to set return value register explicitly
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    31
  *      before the stack and framepointer are adjusted
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    32
@@ -28,7 +33,8 @@
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    33
 
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    34
 
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    35
 #define STACK_MAGIC 0
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    36
-#define ST_FLUSH_WINDOWS 3
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    37
+#define ST_FLUSH_WINDOWS 0x03
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    38
+#define ST_CLEAN_WINDOWS 0x04
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    39
 
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    40
 static int
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    41
 slp_switch(void)
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    42
@@ -37,7 +43,17 @@ slp_switch(void)
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    43
 
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    44
     /* Flush SPARC register windows onto the stack, so they can be used to
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    45
      * restore the registers after the stack has been switched out and
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    46
-     * restored.  Then put the stack pointer into stackref. */
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    47
+     * restored.  This also ensures the current window (pointed at by
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    48
+     * the CWP register) is the only window left in the registers
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    49
+     * (CANSAVE=0, CANRESTORE=0), that means the registers of our
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    50
+     * caller are no longer there and when we return they will always
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    51
+     * be loaded from the stack by a window underflow/fill trap.
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    52
+     *
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    53
+     * On SPARC v9 and above it might be more efficient to use the
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    54
+     * FLUSHW instruction instead of TA ST_FLUSH_WINDOWS.  But that
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    55
+     * requires the correct -mcpu flag to gcc.
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    56
+     *
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    57
+     * Then put the stack pointer into stackref. */
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    58
     __asm__ volatile (
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    59
         "ta %1\n\t"
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    60
         "mov %%sp, %0"
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    61
@@ -57,11 +73,13 @@ slp_switch(void)
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    62
         /* Copy new stack from it's save store on the heap */
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    63
         SLP_RESTORE_STATE();
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    64
 
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    65
-        /* No need to restore any registers from the stack nor clear them: the
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    66
-         * frame pointer has just been set and the return value register is
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    67
-         * also being set by the return statement below.  After returning a
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    68
-         * restore instruction is given and the frame below us will load all
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    69
-         * it's registers using a fill_trap if required. */
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    70
+        /* No need to set the return value register, the return
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    71
+         * statement below does this just fine.  After returning a restore
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    72
+         * instruction is given and a fill-trap will load all the registers
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    73
+         * from the stack if needed.  However in a multi-threaded environment
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    74
+         * we can't guarantee the other register windows are fine to use by
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    75
+         * their threads anymore, so tell the CPU to clean them. */
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    76
+        __asm__ volatile ("ta %0" : : "i" (ST_CLEAN_WINDOWS));
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    77
 
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    78
         return 0;
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    79
     }
2c35e21b08a3 18143276 greenlet can crash with register window corruption on MP SPARC
david.comay@oracle.com
parents:
diff changeset
    80