diff --git a/redox-rt/src/signal.rs b/redox-rt/src/signal.rs index 5fff5ae39ae37d02eb6f3b376a47bd9ee973bf00..fb3b4b095898ce8915a48f7e074de912bb6b63be 100644 --- a/redox-rt/src/signal.rs +++ b/redox-rt/src/signal.rs @@ -83,19 +83,17 @@ unsafe fn inner(stack: &mut SigStack) { SigactionKind::Handled { handler } => handler, }; - let mut sigallow_inside = !sigaction.mask; - if !sigaction.flags.contains(SigactionFlags::NODEFER) { - sigallow_inside &= !sig_bit(stack.sig_num); - } - let sigallow_inside_lo = sigallow_inside & 0xffff_ffff; - let sigallow_inside_hi = sigallow_inside >> 32; - // Set sigmask to sa_mask and unmark the signal as pending. let prev_sigallow_lo = os.control.word[0].load(Ordering::Relaxed) >> 32; let prev_sigallow_hi = os.control.word[1].load(Ordering::Relaxed) >> 32; let prev_sigallow = prev_sigallow_lo | (prev_sigallow_hi << 32); - let sig_group = stack.sig_num / 32; + let mut sigallow_inside = !sigaction.mask & prev_sigallow; + if !sigaction.flags.contains(SigactionFlags::NODEFER) { + sigallow_inside &= !sig_bit(stack.sig_num); + } + let sigallow_inside_lo = sigallow_inside & 0xffff_ffff; + let sigallow_inside_hi = sigallow_inside >> 32; //let _ = syscall::write(1, &alloc::format!("WORD0 {:x?}\n", os.control.word).as_bytes()); let prev_w0 = os.control.word[0].fetch_add((sigallow_inside_lo << 32).wrapping_sub(prev_sigallow_lo << 32), Ordering::Relaxed); @@ -125,6 +123,7 @@ unsafe fn inner(stack: &mut SigStack) { // Update allowset again. //let _ = syscall::write(1, &alloc::format!("WORD2 {:x?}\n", os.control.word).as_bytes()); + let prev_w0 = os.control.word[0].fetch_add((prev_sigallow_lo << 32).wrapping_sub(sigallow_inside_lo << 32), Ordering::Relaxed); let prev_w1 = os.control.word[1].fetch_add((prev_sigallow_hi << 32).wrapping_sub(sigallow_inside_hi << 32), Ordering::Relaxed); //let _ = syscall::write(1, &alloc::format!("WORD3 {:x?}\n", os.control.word).as_bytes());