Correctly set the DAIF bits in new threads
We should only unmask interrupts when creating a new thread and leave the other exceptions in teh same state as before creating the thread. Reported by: jhibbits Reviewed by: jhibbits MFC after: 1 month Sponsored by: https://reviews.freebsd.org/D17497
This commit is contained in:
parent
da4e7cad13
commit
71374d5d99
@ -111,7 +111,7 @@ cpu_fork(struct thread *td1, struct proc *p2, struct thread *td2, int flags)
|
||||
|
||||
/* Setup to release spin count in fork_exit(). */
|
||||
td2->td_md.md_spinlock_count = 1;
|
||||
td2->td_md.md_saved_daif = 0;
|
||||
td2->td_md.md_saved_daif = td1->td_md.md_saved_daif & ~DAIF_I_MASKED;
|
||||
}
|
||||
|
||||
void
|
||||
@ -182,7 +182,7 @@ cpu_copy_thread(struct thread *td, struct thread *td0)
|
||||
|
||||
/* Setup to release spin count in fork_exit(). */
|
||||
td->td_md.md_spinlock_count = 1;
|
||||
td->td_md.md_saved_daif = 0;
|
||||
td->td_md.md_saved_daif = td0->td_md.md_saved_daif & ~DAIF_I_MASKED;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -66,6 +66,12 @@
|
||||
#define CTR_ILINE_MASK (0xf << CTR_ILINE_SHIFT)
|
||||
#define CTR_ILINE_SIZE(reg) (((reg) & CTR_ILINE_MASK) >> CTR_ILINE_SHIFT)
|
||||
|
||||
/* DAIF - Interrupt Mask Bits */
|
||||
#define DAIF_D_MASKED (1 << 9)
|
||||
#define DAIF_A_MASKED (1 << 8)
|
||||
#define DAIF_I_MASKED (1 << 7)
|
||||
#define DAIF_F_MASKED (1 << 6)
|
||||
|
||||
/* DCZID_EL0 - Data Cache Zero ID register */
|
||||
#define DCZID_DZP (1 << 4) /* DC ZVA prohibited if non-0 */
|
||||
#define DCZID_BS_SHIFT 0
|
||||
|
Loading…
Reference in New Issue
Block a user