Port-i386 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: rng padlock changes causes NetBSD to crash
Hi,
I have tested the fix. lcr4(rcr4() | CR4_OSFXSR); helps indeed and
system boots but if statement seems to be not correct, at least on
VT-310DP board it ended up in the same error.
On Wed, Feb 15, 2017 at 6:35 PM, Thor Lancelot Simon <tls%panix.com@localhost> wrote:
> On Wed, Feb 15, 2017 at 10:25:36AM +0200, Andrius V wrote:
>>
>> Crash looks like this:
>>
>> cpu_rng: VIA
>> fatal privileged instruction fault in supervisor mode
>> trap type 0 code 0 eip c0132377 cs 8 eflags 10046 cr2 0 ilevel 8 esp 80050033
>> curlwp 0xc12427e0 pid 0 lid 1 lowest kstack 0xc14d82c0
>> kernel: supervisor trap privileged instruction fault, code=0
>> Stopped in pid 0.1 (system) at netbsd:cpu_rng+0x4a: xstore-rng.
>
> Jonathan Kollasch found the bug: cpu_rng is called before the FPU
> detection code, which would normally enable SSE. SSE must be enabled
> the PadLock instructions to actually work, regardless of what the MSR
> values say.
>
> Can you test the following patch, before I commit it?
>
>
> Index: identcpu.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/x86/x86/identcpu.c,v
> retrieving revision 1.52
> diff -u -p -r1.52 identcpu.c
> --- identcpu.c 2 Feb 2017 08:57:04 -0000 1.52
> +++ identcpu.c 15 Feb 2017 16:32:15 -0000
> @@ -551,7 +551,20 @@ cpu_probe_c3(struct cpu_info *ci)
> }
> }
>
> - /* Actually do the enables. */
> + /*
> + * Actually do the enables. It's a little gross,
> + * but per the PadLock programming guide, "Enabling
> + * PadLock", condition 3, we must enable SSE too or
> + * else the first use of RNG or ACE instructions
> + * will generate a trap.
> + *
> + * We must do this early because of kernel RNG
> + * initialization but it is safe without the full
> + * FPU-detect as all these CPUs have SSE.
> + */
> + if (cpu_feature[0] & CPUID_FXSR)
> + lcr4(rcr4() | CR4_OSFXSR);
> +
> if (rng_enable) {
> msr = rdmsr(MSR_VIA_RNG);
> msr |= MSR_VIA_RNG_ENABLE;
Home |
Main Index |
Thread Index |
Old Index