git: a03957a706a0 - main - efirt: mark dynamic region executing the RT code with the TDP_EFIRT flag

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Thu, 21 Nov 2024 22:05:58 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=a03957a706a05bb0c2f627183b19d84f6d96dbb7

commit a03957a706a05bb0c2f627183b19d84f6d96dbb7
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2024-11-21 19:40:18 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2024-11-21 22:05:28 +0000

    efirt: mark dynamic region executing the RT code with the TDP_EFIRT flag
    
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D47694
---
 sys/dev/efidev/efirt.c | 8 +++++++-
 sys/sys/proc.h         | 2 +-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/sys/dev/efidev/efirt.c b/sys/dev/efidev/efirt.c
index 2d45b4d6ac66..37b46ec38dad 100644
--- a/sys/dev/efidev/efirt.c
+++ b/sys/dev/efidev/efirt.c
@@ -309,6 +309,9 @@ efi_enter(void)
 		fpu_kern_leave(td, NULL);
 		mtx_unlock(&efi_lock);
 		PMAP_UNLOCK(curpmap);
+	} else {
+		MPASS((td->td_pflags & TDP_EFIRT) == 0);
+		td->td_pflags |= TDP_EFIRT;
 	}
 	return (error);
 }
@@ -319,10 +322,13 @@ efi_leave(void)
 	struct thread *td;
 	pmap_t curpmap;
 
+	td = curthread;
+	MPASS((td->td_pflags & TDP_EFIRT) == 0);
+	td->td_pflags &= ~TDP_EFIRT;
+
 	efi_arch_leave();
 
 	curpmap = &curproc->p_vmspace->vm_pmap;
-	td = curthread;
 	fpu_kern_leave(td, NULL);
 	mtx_unlock(&efi_lock);
 	PMAP_UNLOCK(curpmap);
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index a69eecbb4661..69b6c7a61da0 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -560,7 +560,7 @@ enum {
 #define	TDP_RESETSPUR	0x04000000 /* Reset spurious page fault history. */
 #define	TDP_NERRNO	0x08000000 /* Last errno is already in td_errno */
 #define	TDP_UIOHELD	0x10000000 /* Current uio has pages held in td_ma */
-#define	TDP_UNUSED0	0x20000000 /* UNUSED */
+#define	TDP_EFIRT	0x20000000 /* In firmware (EFI RT) call */
 #define	TDP_EXECVMSPC	0x40000000 /* Execve destroyed old vmspace */
 #define	TDP_SIGFASTPENDING 0x80000000 /* Pending signal due to sigfastblock */