Ivy Bridge i5-3570K ohne rdrand

16/06/2012 - 17:23 von Mario Andretti | Report spam
Gerade frisch einen i5-3570K in ein GA-Z68MA-D2H-B3 gesetzt: Das Feature
RDRAND fehlt!

cpuid zeigt es nicht an, der Opcode löst "illgeal instruction" aus.

Hier sind die Feature Flags, Bit 30 ist wirklich clear.
Da gibt es doch nicht, oder?

Feature flags bfebfbff:
FPU Floating Point Unit
VME Virtual 8086 Mode Enhancements
DE Debugging Extensions
PSE Page Size Extensions
TSC Time Stamp Counter
MSR Model Specific Registers
PAE Physical Address Extension
MCE Machine Check Exception
CX8 COMPXCHG8B Instruction
APIC On-chip Advanced Programmable Interrupt Controller present and
enabled
SEP Fast System Call
MTRR Memory Type Range Registers
PGE PTE Global Flag
MCA Machine Check Architecture
CMOV Conditional Move and Compare Instructions
FGPAT Page Attribute Table
PSE-36 36-bit Page Size Extension
CLFSH CFLUSH instruction
DS Debug store
ACPI Thermal Monitor and Clock Ctrl
MMX MMX instruction set
FXSR Fast FP/MMX Streaming SIMD Extensions save/restore
SSE Streaming SIMD Extensions instruction set
SSE2 SSE2 extensions
SS Self Snoop
HT Hyper Threading
TM Thermal monitor
31 reserved
 

Lesen sie die antworten

#1 Mario Andretti
16/06/2012 - 18:03 | Warnen spam
Noch eine kleine Ergànzung: cpuid ist wohl nicht wirklich rdrand aware,
ich habe gerade einmal einen Blick in den Source geworfen.

arch/x86/kernel/cpu/rdrand.c

Ich hatte zum Test wie folgt modifiziert und erhalte

$ dmesg | fgrep -i rdrand
[ 0.002413] rdrand: init
[ 0.002414] rdrand: feature unavailable
[ 0.171771] rdrand: init
[ 0.173910] rdrand: feature unavailable
[ 0.184932] rdrand: init
[ 0.187064] rdrand: feature unavailable
[ 0.197987] rdrand: init
[ 0.212277] rdrand: feature unavailable


void __cpuinit x86_init_rdrand(struct cpuinfo_x86 *c)
{
#ifdef CONFIG_ARCH_RANDOM
unsigned long tmp;
int i, count, ok;

printk(KERN_INFO "rdrand: init");
if (!cpu_has(c, X86_FEATURE_RDRAND)) {
printk(KERN_INFO "rdrand: feature unavailable");
return; /* Nothing to do */
}

for (count = i = 0; i < RESEED_LOOP; i++) {
ok = rdrand_long(&tmp);
if (ok)
count++;
}

if (count != RESEED_LOOP) {
clear_cpu_cap(c, X86_FEATURE_RDRAND);
printk(KERN_INFO "rdrand: feature cleared, reseed failed");
}

printk(KERN_INFO "rdrand: ok");
#endif
}

Ähnliche fragen