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
This commit is contained in:
Konstantin Belousov 2024-11-21 21:40:18 +02:00
parent 38e3125d6d
commit a03957a706
2 changed files with 8 additions and 2 deletions

View File

@ -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);

View File

@ -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 */