Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 May 2019 21:35:19 +0300
From:      Konstantin Belousov <kib@freebsd.org>
To:        Jan Martin Mikkelsen <janm@transactionware.com>
Cc:        FreeBSD-STABLE Mailing List <freebsd-stable@freebsd.org>, Christian Ullrich <chris@chrullrich.net>
Subject:   Re: efirtc causing panic (was Re: Panic booting 12-RC2 on amd64)
Message-ID:  <20190531183519.GF27392@kib.kiev.ua>
In-Reply-To: <7E738A9B-A0B6-49D3-86A8-8E2F9ED8A098@transactionware.com>
References:  <6e985fa2-c372-67ef-1cd5-dd8894cca908@chrullrich.net> <187B6A1E-5C61-415A-A9F2-B4E3142375C7@transactionware.com> <7E738A9B-A0B6-49D3-86A8-8E2F9ED8A098@transactionware.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, May 31, 2019 at 04:19:57PM +0200, Jan Martin Mikkelsen wrote:
> Hi,
> 
> Christian has pointed me at this https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=233534 which he raised after his email. The workaround was to boot with “efi.rt.disabled=1”. 
> 
> I took a closer look at what is going on. The problem is that the EFI rt_gettime call is faulting, and the fault is handled in efirt_support.S and a failure is reported. These messages is in the kernel output:
> 
> kernel trap 12 with interrupts disabled
> kernel trap 12 with interrupts disabled
> EFI rt_gettime call faulted, error 14
> efirtc0: cannot read EFI realtime clock, error 14
> 
> So far, so good. The problem is that that later in startup the "smp_targeted_tlb_shootdown: interrupts disabled” panic occurs, if the SMP is enabled. With SMP disabled this does not occur and the system runs.
> 
> I’m not sure whether this is a BIOS problem (seems likely) or something that could handled after dealing with the fault in efirt_support.S.
> 
> While looking I found the code below that looks wrong in efi_enter(), but that is not the problem in this case.
> 
> Just adding this to the archive in case someone else looks more closely later.

Try this.  Only compile-time tested.

diff --git a/sys/amd64/amd64/efirt_support.S b/sys/amd64/amd64/efirt_support.S
index cd578eddcfb..b54b13b01fe 100644
--- a/sys/amd64/amd64/efirt_support.S
+++ b/sys/amd64/amd64/efirt_support.S
@@ -47,6 +47,9 @@ ENTRY(efi_rt_arch_call)
 	movq	%r13, EC_R13(%rdi)
 	movq	%r14, EC_R14(%rdi)
 	movq	%r15, EC_R15(%rdi)
+	pushfq
+	popq	%rax
+	movq	%rax, EC_RFLAGS(%rdi)
 	movq	PCPU(CURTHREAD), %rax
 	movq	%rdi, TD_MD+MD_EFIRT_TMP(%rax)
 	movq	PCPU(CURPCB), %rsi
@@ -98,6 +101,8 @@ efi_rt_arch_call_tail:
 	movq	EC_RBP(%rdi), %rbp
 	movq	EC_RSP(%rdi), %rsp
 	movq	EC_RBX(%rdi), %rbx
+	pushq	EC_RFLAGS(%rdi)
+	popfq
 
 	popq	%rbp
 	ret
diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c
index de3969734a1..2e81b823262 100644
--- a/sys/amd64/amd64/genassym.c
+++ b/sys/amd64/amd64/genassym.c
@@ -272,3 +272,4 @@ ASSYM(EC_R12, offsetof(struct efirt_callinfo, ec_r12));
 ASSYM(EC_R13, offsetof(struct efirt_callinfo, ec_r13));
 ASSYM(EC_R14, offsetof(struct efirt_callinfo, ec_r14));
 ASSYM(EC_R15, offsetof(struct efirt_callinfo, ec_r15));
+ASSYM(EC_RFLAGS, offsetof(struct efirt_callinfo, ec_rflags));
diff --git a/sys/amd64/include/efi.h b/sys/amd64/include/efi.h
index 082223792ac..e630a338c17 100644
--- a/sys/amd64/include/efi.h
+++ b/sys/amd64/include/efi.h
@@ -72,6 +72,7 @@ struct efirt_callinfo {
 	register_t	ec_r13;
 	register_t	ec_r14;
 	register_t	ec_r15;
+	register_t	ec_rflags;
 };
 
 #endif /* __AMD64_INCLUDE_EFI_H_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20190531183519.GF27392>