git: 95f773e59482 - main - i386 copyout_fast: improve detection of a fault on accessing userspace
Date: Wed, 24 Aug 2022 19:25:09 UTC
The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=95f773e59482b1a3462d2fe3901532d51fb053b3 commit 95f773e59482b1a3462d2fe3901532d51fb053b3 Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2022-08-09 00:56:54 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2022-08-24 19:11:40 +0000 i386 copyout_fast: improve detection of a fault on accessing userspace Do not blindly account a page fault occuring on the trampoline area, as the userspace access fault. Check that it occured exactly in the instruction that does that. This avoids unneeded switches of address space on faults not needing the switch, effectively converting machine resets due to tripple faults, into regular panics. Reviewed by: jhb Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D36302 --- sys/i386/i386/copyout_fast.s | 16 ++++++++-------- sys/i386/i386/exception.s | 32 ++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/sys/i386/i386/copyout_fast.s b/sys/i386/i386/copyout_fast.s index 715952f5fe20..d1d17f775872 100644 --- a/sys/i386/i386/copyout_fast.s +++ b/sys/i386/i386/copyout_fast.s @@ -93,7 +93,7 @@ ENTRY(copyout_fast) popl %ecx popl %edi popl %esi - rep; movsb +pf_x1: rep; movsb movl %ebx,%cr3 movl %eax,%esp @@ -150,7 +150,7 @@ ENTRY(copyin_fast) popl %ecx popl %edi popl %esi - rep; movsb +pf_x2: rep; movsb movl %ebx,%cr3 @@ -197,7 +197,7 @@ ENTRY(fueword_fast) cli movl PCPU(TRAMPSTK),%esp movl %eax,%cr3 - movl (%ecx),%eax +pf_x3: movl (%ecx),%eax movl %ebx,%cr3 movl %esi,%esp sti @@ -226,7 +226,7 @@ ENTRY(fuword16_fast) cli movl PCPU(TRAMPSTK),%esp movl %eax,%cr3 - movzwl (%ecx),%eax +pf_x4: movzwl (%ecx),%eax movl %ebx,%cr3 movl %esi,%esp sti @@ -252,7 +252,7 @@ ENTRY(fubyte_fast) cli movl PCPU(TRAMPSTK),%esp movl %eax,%cr3 - movzbl (%ecx),%eax +pf_x5: movzbl (%ecx),%eax movl %ebx,%cr3 movl %esi,%esp sti @@ -291,7 +291,7 @@ ENTRY(suword_fast) cli movl PCPU(TRAMPSTK),%esp movl %eax,%cr3 - movl %edi,(%ecx) +pf_x6: movl %edi,(%ecx) movl %ebx,%cr3 movl %esi,%esp sti @@ -319,7 +319,7 @@ ENTRY(suword16_fast) cli movl PCPU(TRAMPSTK),%esp movl %eax,%cr3 - movw %di,(%ecx) +pf_x7: movw %di,(%ecx) movl %ebx,%cr3 movl %esi,%esp sti @@ -348,7 +348,7 @@ ENTRY(subyte_fast) movl PCPU(TRAMPSTK),%esp movl %eax,%cr3 movl %edi,%eax - movb %al,(%ecx) +pf_x8: movb %al,(%ecx) movl %ebx,%cr3 movl %esi,%esp sti diff --git a/sys/i386/i386/exception.s b/sys/i386/i386/exception.s index f4135548fd81..42e9c474c3cd 100644 --- a/sys/i386/i386/exception.s +++ b/sys/i386/i386/exception.s @@ -130,17 +130,41 @@ IDTVEC(prot) jmp irettraps IDTVEC(page) testl $PSL_VM, TF_EFLAGS-TF_ERR(%esp) - jnz 1f + jnz 4f testb $SEL_RPL_MASK, TF_CS-TF_ERR(%esp) - jnz 1f + jnz 4f cmpl $PMAP_TRM_MIN_ADDRESS, TF_EIP-TF_ERR(%esp) - jb 1f + jb 4f + pushl %eax + movl TF_EIP-TF_ERR+4(%esp), %eax + addl $1f, %eax + call 5f +1: cmpl $pf_x1, %eax + je 2f + cmpl $pf_x2, %eax + je 2f + cmpl $pf_x3, %eax + je 2f + cmpl $pf_x4, %eax + je 2f + cmpl $pf_x5, %eax + je 2f + cmpl $pf_x6, %eax + je 2f + cmpl $pf_x7, %eax + je 2f + cmpl $pf_x8, %eax + jne 3f +2: popl %eax movl %ebx, %cr3 movl %edx, TF_EIP-TF_ERR(%esp) addl $4, %esp iret -1: pushl $T_PAGEFLT +3: popl %eax +4: pushl $T_PAGEFLT jmp alltraps +5: subl (%esp), %eax + retl IDTVEC(rsvd_pti) IDTVEC(rsvd) pushl $0; TRAP(T_RESERVED)