@@ -47,6 +47,7 @@ impl Context {
47
47
48
48
let fp: * c_void = task_start_wrapper as * c_void ;
49
49
let argp: * c_void = unsafe { transmute :: < & ~fn ( ) , * c_void > ( & * start) } ;
50
+ let stack_base: * uint = stack. start ( ) ;
50
51
let sp: * uint = stack. end ( ) ;
51
52
let sp: * mut uint = unsafe { transmute_mut_unsafe ( sp) } ;
52
53
// Save and then immediately load the current context,
@@ -56,7 +57,7 @@ impl Context {
56
57
swap_registers ( transmute_mut_region ( & mut * regs) , transmute_region ( & * regs) ) ;
57
58
} ;
58
59
59
- initialize_call_frame ( & mut * regs, fp, argp, sp) ;
60
+ initialize_call_frame ( & mut * regs, fp, argp, sp, stack_base ) ;
60
61
61
62
return Context {
62
63
start : Some ( start) ,
@@ -107,7 +108,8 @@ fn new_regs() -> ~Registers {
107
108
}
108
109
109
110
#[ cfg( target_arch = "x86" ) ]
110
- fn initialize_call_frame ( regs : & mut Registers , fptr : * c_void , arg : * c_void , sp : * mut uint ) {
111
+ fn initialize_call_frame ( regs : & mut Registers , fptr : * c_void , arg : * c_void ,
112
+ sp : * mut uint , _stack_base : * uint ) {
111
113
112
114
let sp = align_down ( sp) ;
113
115
let sp = mut_offset ( sp, -4 ) ;
@@ -123,21 +125,41 @@ fn initialize_call_frame(regs: &mut Registers, fptr: *c_void, arg: *c_void, sp:
123
125
regs. ebp = 0 ;
124
126
}
125
127
126
- #[ cfg( target_arch = "x86_64" ) ]
128
+ #[ cfg( windows, target_arch = "x86_64" ) ]
129
+ type Registers = [ uint , ..34 ] ;
130
+ #[ cfg( not( windows) , target_arch = "x86_64" ) ]
127
131
type Registers = [ uint , ..22 ] ;
128
132
129
- #[ cfg( target_arch = "x86_64" ) ]
133
+ #[ cfg( windows, target_arch = "x86_64" ) ]
134
+ fn new_regs ( ) -> ~Registers { ~( [ 0 , .. 34 ] ) }
135
+ #[ cfg( not( windows) , target_arch = "x86_64" ) ]
130
136
fn new_regs ( ) -> ~Registers { ~( [ 0 , .. 22 ] ) }
131
137
132
138
#[ cfg( target_arch = "x86_64" ) ]
133
- fn initialize_call_frame ( regs : & mut Registers , fptr : * c_void , arg : * c_void , sp : * mut uint ) {
139
+ fn initialize_call_frame ( regs : & mut Registers , fptr : * c_void , arg : * c_void ,
140
+ sp : * mut uint , stack_base : * uint ) {
134
141
135
142
// Redefinitions from regs.h
136
143
static RUSTRT_ARG0 : uint = 3 ;
137
144
static RUSTRT_RSP : uint = 1 ;
138
145
static RUSTRT_IP : uint = 8 ;
139
146
static RUSTRT_RBP : uint = 2 ;
140
147
148
+ #[ cfg( windows) ]
149
+ fn initialize_tib ( regs : & mut Registers , sp : * mut uint , stack_base : * uint ) {
150
+ // Redefinitions from regs.h
151
+ static RUSTRT_ST1 : uint = 11 ; // stack bottom
152
+ static RUSTRT_ST2 : uint = 12 ; // stack top
153
+ regs[ RUSTRT_ST1 ] = sp as uint ;
154
+ regs[ RUSTRT_ST2 ] = stack_base as uint ;
155
+ }
156
+ #[ cfg( not( windows) ) ]
157
+ fn initialize_tib ( _: & mut Registers , _: * mut uint , _: * uint ) {
158
+ }
159
+
160
+ // Win64 manages stack range at TIB: %gs:0x08 (top) and %gs:0x10 (bottom)
161
+ initialize_tib ( regs, sp, stack_base) ;
162
+
141
163
let sp = align_down ( sp) ;
142
164
let sp = mut_offset ( sp, -1 ) ;
143
165
@@ -164,7 +186,8 @@ type Registers = [uint, ..32];
164
186
fn new_regs ( ) -> ~Registers { ~( [ 0 , .. 32 ] ) }
165
187
166
188
#[ cfg( target_arch = "arm" ) ]
167
- fn initialize_call_frame ( regs : & mut Registers , fptr : * c_void , arg : * c_void , sp : * mut uint ) {
189
+ fn initialize_call_frame ( regs : & mut Registers , fptr : * c_void , arg : * c_void ,
190
+ sp : * mut uint , _stack_base : * uint ) {
168
191
let sp = align_down ( sp) ;
169
192
// sp of arm eabi is 8-byte aligned
170
193
let sp = mut_offset ( sp, -2 ) ;
@@ -184,7 +207,8 @@ type Registers = [uint, ..32];
184
207
fn new_regs ( ) -> ~Registers { ~( [ 0 , .. 32 ] ) }
185
208
186
209
#[ cfg( target_arch = "mips" ) ]
187
- fn initialize_call_frame ( regs : & mut Registers , fptr : * c_void , arg : * c_void , sp : * mut uint ) {
210
+ fn initialize_call_frame ( regs : & mut Registers , fptr : * c_void , arg : * c_void ,
211
+ sp : * mut uint , _stack_base : * uint ) {
188
212
let sp = align_down ( sp) ;
189
213
// sp of mips o32 is 8-byte aligned
190
214
let sp = mut_offset ( sp, -2 ) ;
0 commit comments