NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-i386/52266: Double fault early in boot with Transmeta Crusoe CPU
The following reply was made to PR port-i386/52266; it has been noted by GNATS.
From: Kimihiro Nonaka <nonakap%gmail.com@localhost>
To: "gnats-bugs%netbsd.org@localhost" <gnats-bugs%netbsd.org@localhost>
Cc: NONAKA Kimihiro <nonaka%netbsd.org@localhost>, "gnats-admin%netbsd.org@localhost" <gnats-admin%netbsd.org@localhost>,
"netbsd-bugs%netbsd.org@localhost" <netbsd-bugs%netbsd.org@localhost>, Andreas Gustafsson <gson%gson.org@localhost>
Subject: Re: port-i386/52266: Double fault early in boot with Transmeta Crusoe CPU
Date: Sat, 8 Jul 2017 20:06:04 +0900
Hi,
2017-07-08 18:15 GMT+09:00 Simon Burge <simonb%netbsd.org@localhost>:
> If I change lapic_is_x2apic() to unconditionally return false, my
> Soekris boots (at least to single user mode).
>
> I tried to get lapic_is_x2apic() to store the value of the MSR it
> reads by changing that function to:
>
> uint64_t x2apic_msr;
>
> bool
> lapic_is_x2apic(void)
> {
> x2apic_msr = rdmsr(MSR_APICBASE);
> return false;
> }
>
> but that just faulted/paniced too, but slightly differently:
>
> > boot net8 -s
> 17730720+696076+839124 [776736+802655]=0x13e1cbc
> fatal protection faufatal double fault in supervisor mode
> trap type 13 code 0xc0118298 eip 0x8 cs 0x246 eflags 0xc054bbf6 cr2 0 ilevel 0x8 esp 0xc11ea760
> curlwp 0xc125f360 pid 0 lid 1 lowest kstack 0xc14e32c0
> kernel: user trap double fault, code=0
> Stopped in pid 0.1 (system) at 8: invalid address
> db{0}>
>
> The chopped off "fatal protection fau" is new. Could the rdmsr() itself
> be faulting then??
>
> Is there any further info I get to help?
Could you try the following patch.
diff --git a/sys/arch/x86/x86/lapic.c b/sys/arch/x86/x86/lapic.c
index 20822a67184..372e9f8c0c2 100644
--- a/sys/arch/x86/x86/lapic.c
+++ b/sys/arch/x86/x86/lapic.c
@@ -235,10 +235,12 @@ lapic_enable_x2apic(void)
bool
lapic_is_x2apic(void)
{
- uint64_t r;
+ uint64_t msr;
- r = rdmsr(MSR_APICBASE);
- return (r & (APICBASE_EN | APICBASE_EXTD)) == (APICBASE_EN |
APICBASE_EXTD);
+ if (rdmsr_safe(MSR_APICBASE, &msr) == EFAULT)
+ return false;
+ return (msr & (APICBASE_EN | APICBASE_EXTD)) ==
+ (APICBASE_EN | APICBASE_EXTD);
}
/*
Regards,
--
Kimihiro Nonaka
Home |
Main Index |
Thread Index |
Old Index