Page MenuHomeFreeBSD

[PPC64] Fix mismatch between thread flags and MSR
ClosedPublic

Authored by luporl on Feb 12 2019, 6:50 PM.

Details

Summary

When sigreturn() restored a thread's context, SRR1 was being restored
to its previous value, but pcb_flags was not being touched.

This could cause a mismatch between the thread's MSR and its pcb_flags.
For instance, when the thread used the FPU for the first time inside
the signal handler, sigreturn() would clear SRR1, but not pcb_flags.
Then, the thread would return with the FPU bit cleared in MSR and,
the next time it tried to use the FPU, it would fail on a KASSERT
that checked if the FPU was disabled.

This change clears the FPU bit in both pcb_flags and frame->srr1,
as the code that restores the context expects to use the FPU trap
to re-enable it.

Diff Detail

Repository
rS FreeBSD src repository
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

luporl created this revision.Feb 12 2019, 6:50 PM
sbruno added a subscriber: swills.Feb 12 2019, 11:16 PM
sbruno added a subscriber: sbruno.EditedFeb 12 2019, 11:32 PM

Patched the build tree in the freebsd.org cluster and installed -current + this review on the pkg build server. You can track builds here when it starts spinning up in about an hour.

sbruno accepted this revision.Feb 14 2019, 12:40 PM

This looks good from the user side as the machine is humming along quite nicely. Thank you for digging into this!

This revision is now accepted and ready to land.Feb 14 2019, 12:40 PM
jhibbits accepted this revision.Feb 14 2019, 3:02 PM
This revision was automatically updated to reflect the committed changes.