git: e6a470ffcbd7 - stable/14 - efirt: add a tunable to disable printing faults during EFIRT calls

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Wed, 09 Apr 2025 00:53:47 UTC
The branch stable/14 has been updated by kib:

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

commit e6a470ffcbd708cf404472bb871c2cb76eaa7b39
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-03-31 18:38:36 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-04-09 00:53:17 +0000

    efirt: add a tunable to disable printing faults during EFIRT calls
    
    PR:     285797
    
    (cherry picked from commit fd748c7d5b7aefbeda604403f203637b12ae89df)
---
 sys/amd64/amd64/trap.c | 13 +++++++++++--
 sys/arm64/arm64/trap.c |  3 +++
 sys/dev/efidev/efirt.c | 11 ++++++++++-
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index 7f1175da41df..692491ecfc5a 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -165,6 +165,9 @@ SYSCTL_INT(_machdep, OID_AUTO, uprintf_signal, CTLFLAG_RWTUN,
     &uprintf_signal, 0,
     "Print debugging information on trap signal to ctty");
 
+u_long cnt_efirt_faults;
+int print_efirt_faults = 1;
+
 /*
  * Control L1D flush on return from NMI.
  *
@@ -453,8 +456,14 @@ trap(struct trapframe *frame)
 		 */
 		if ((td->td_pflags2 & TDP2_EFIRT) != 0 &&
 		    curpcb->pcb_onfault != NULL && type != T_PAGEFLT) {
-			trap_diag(frame, 0);
-			printf("EFI RT fault %s\n", traptype_to_msg(type));
+			u_long cnt = atomic_fetchadd_long(&cnt_efirt_faults, 1);
+
+			if ((print_efirt_faults == 1 && cnt == 1) ||
+			    print_efirt_faults == 2) {
+				trap_diag(frame, 0);
+				printf("EFI RT fault %s\n",
+				    traptype_to_msg(type));
+			}
 			frame->tf_rip = (long)curpcb->pcb_onfault;
 			return;
 		}
diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c
index fdcb7e708daf..9f792332a931 100644
--- a/sys/arm64/arm64/trap.c
+++ b/sys/arm64/arm64/trap.c
@@ -85,6 +85,9 @@ static void print_registers(struct trapframe *frame);
 
 int (*dtrace_invop_jump_addr)(struct trapframe *);
 
+u_long cnt_efirt_faults;
+int print_efirt_faults;
+
 typedef void (abort_handler)(struct thread *, struct trapframe *, uint64_t,
     uint64_t, int);
 
diff --git a/sys/dev/efidev/efirt.c b/sys/dev/efidev/efirt.c
index 1fb9b3bb01d1..4e630a5dde37 100644
--- a/sys/dev/efidev/efirt.c
+++ b/sys/dev/efidev/efirt.c
@@ -123,11 +123,20 @@ efi_status_to_errno(efi_status status)
 }
 
 static struct mtx efi_lock;
-static SYSCTL_NODE(_hw, OID_AUTO, efi, CTLFLAG_RWTUN | CTLFLAG_MPSAFE, NULL,
+SYSCTL_NODE(_hw, OID_AUTO, efi, CTLFLAG_RWTUN | CTLFLAG_MPSAFE, NULL,
     "EFI");
 static bool efi_poweroff = true;
 SYSCTL_BOOL(_hw_efi, OID_AUTO, poweroff, CTLFLAG_RWTUN, &efi_poweroff, 0,
     "If true, use EFI runtime services to power off in preference to ACPI");
+extern int print_efirt_faults;
+SYSCTL_INT(_hw_efi, OID_AUTO, print_faults, CTLFLAG_RWTUN,
+    &print_efirt_faults, 0,
+    "Print fault  information upon trap from EFIRT calls: "
+    "0 - never, 1 - once, 2 - always");
+extern u_long cnt_efirt_faults;
+SYSCTL_ULONG(_hw_efi, OID_AUTO, total_faults, CTLFLAG_RD,
+    &cnt_efirt_faults, 0,
+    "Total number of faults that occurred during EFIRT calls");
 
 static bool
 efi_is_in_map(struct efi_md *map, int ndesc, int descsz, vm_offset_t addr)