Skip to content

Commit

Permalink
Merge pull request #244 from qnighy/dynamic-stack-probing
Browse files Browse the repository at this point in the history
Fix segfault on probestack with dynamic alloca.
  • Loading branch information
alexcrichton authored May 28, 2018
2 parents 28daccd + 1d15be6 commit 6eb8f8d
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/probestack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,21 @@ pub unsafe extern fn __rust_probestack() {
// bytes pushed on the stack orginally with our return address. Using
// `8(%rsp)` simulates us testing the stack pointer in the caller's
// context.
// It's usually called when %rax >= 0x1000, but that's not always true.
// Dynamic stack allocation, which is needed to implement unsized
// rvalues, triggers stackprobe even if %rax < 0x1000.
// Thus we have to check %r11 first to avoid segfault.
cmp $$0x1000,%r11
jna 3f
2:
sub $$0x1000,%rsp
test %rsp,8(%rsp)
sub $$0x1000,%r11
cmp $$0x1000,%r11
ja 2b
3:
// Finish up the last remaining stack space requested, getting the last
// bits out of r11
sub %r11,%rsp
Expand Down Expand Up @@ -98,13 +106,17 @@ pub unsafe extern fn __rust_probestack() {
asm!("
push %ecx
mov %eax,%ecx
cmp $$0x1000,%ecx
jna 3f
2:
sub $$0x1000,%esp
test %esp,8(%esp)
sub $$0x1000,%ecx
cmp $$0x1000,%ecx
ja 2b
3:
sub %ecx,%esp
test %esp,8(%esp)
Expand Down

0 comments on commit 6eb8f8d

Please sign in to comment.