@@ -61,7 +61,17 @@ LEAF_END RtlCaptureContext, _TEXT
61
61
62
62
LEAF_ENTRY RtlRestoreContext, _TEXT
63
63
64
+ // Set %r1 and %r0 to hold the target return address and stack pointer.
65
+ // These will be installed only at the very end, to avoid potentially
66
+ // clobbering the context structure on the local stack.
64
67
lgr %r1, %r14
68
+ lgr %r0, %r15
69
+ tm CONTEXT_ContextFlags+3 (%r2), CONTEXT_CONTROL
70
+ je LOCAL_LABEL(Done_Restore_CONTEXT_CONTROL)
71
+ // We do *not* attempt to restore the PSW mask here!
72
+ lg %r1, CONTEXT_PSWAddr(%r2)
73
+ lg %r0, CONTEXT_R15(%r2)
74
+ LOCAL_LABEL(Done_Restore_CONTEXT_CONTROL):
65
75
66
76
tm CONTEXT_ContextFlags+3 (%r2), CONTEXT_FLOATING_POINT
67
77
je LOCAL_LABEL(Done_Restore_CONTEXT_FLOATING_POINT)
@@ -83,19 +93,13 @@ LEAF_ENTRY RtlRestoreContext, _TEXT
83
93
ld %f15, CONTEXT_F15(%r2)
84
94
LOCAL_LABEL(Done_Restore_CONTEXT_FLOATING_POINT):
85
95
86
- tm CONTEXT_ContextFlags+3 (%r2), CONTEXT_CONTROL
87
- je LOCAL_LABEL(Done_Restore_CONTEXT_CONTROL)
88
- // We do *not* attempt to restore the PSW mask here!
89
- lg %r1, CONTEXT_PSWAddr(%r2)
90
- lg %r15 , CONTEXT_R15(%r2)
91
- LOCAL_LABEL(Done_Restore_CONTEXT_CONTROL):
92
-
93
96
tm CONTEXT_ContextFlags+3 (%r2), CONTEXT_INTEGER
94
97
je LOCAL_LABEL(Done_Restore_CONTEXT_INTEGER)
95
98
// We do *not* restore %r0 and %r1 here!
96
99
lmg %r2, %r14 , CONTEXT_R2(%r2)
97
100
LOCAL_LABEL(Done_Restore_CONTEXT_INTEGER):
98
101
102
+ lgr %r15 , %r0
99
103
br %r1
100
104
LEAF_END RtlRestoreContext, _TEXT
101
105
0 commit comments