Author: tfaber Date: Fri Sep 4 20:33:37 2015 New Revision: 69012
URL: http://svn.reactos.org/svn/reactos?rev=69012&view=rev Log: [NTOS:KE] - Fix KiGetCacheInformation for Intel processors according to the latest Intel Instruction Set Reference
Modified: trunk/reactos/ntoskrnl/ke/i386/cpu.c
Modified: trunk/reactos/ntoskrnl/ke/i386/cpu.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/cpu.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/cpu.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ke/i386/cpu.c [iso-8859-1] Fri Sep 4 20:33:37 2015 @@ -525,149 +525,114 @@ CurrentRegister >>= 8; if (!RegisterByte) continue;
- /* - * Valid values are from 0x40 (0 bytes) to 0x49 - * (32MB), or from 0x80 to 0x89 (same size but - * 8-way associative. - */ - if (((RegisterByte > 0x40) && (RegisterByte <= 0x47)) || - ((RegisterByte > 0x78) && (RegisterByte <= 0x7C)) || - ((RegisterByte > 0x80) && (RegisterByte <= 0x85))) + Size = 0; + switch (RegisterByte) { - /* Compute associativity */ - Associativity = 4; - if (RegisterByte >= 0x79) Associativity = 8; - - /* Mask out only the first nibble */ - RegisterByte &= 0x07; - - /* Check if this cache is bigger than the last */ - Size = 0x10000 << RegisterByte; - if ((Size / Associativity) > CurrentSize) - { - /* Set the L2 Cache Size and Associativity */ - CurrentSize = Size / Associativity; - Pcr->SecondLevelCacheSize = Size; - Pcr->SecondLevelCacheAssociativity = Associativity; - } + case 0x06: + case 0x08: + KePrefetchNTAGranularity = 32; + break; + case 0x09: + KePrefetchNTAGranularity = 64; + break; + case 0x0a: + case 0x0c: + KePrefetchNTAGranularity = 32; + break; + case 0x0d: + case 0x0e: + KePrefetchNTAGranularity = 64; + break; + case 0x1d: + Size = 128 * 1024; + Associativity = 2; + break; + case 0x21: + Size = 256 * 1024; + Associativity = 8; + break; + case 0x24: + Size = 1024 * 1024; + Associativity = 16; + break; + case 0x2c: + case 0x30: + KePrefetchNTAGranularity = 64; + break; + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + Size = (1 << (RegisterByte - 0x41)) * 128 * 1024; + Associativity = 4; + break; + case 0x48: + Size = 3 * 1024 * 1024; + Associativity = 12; + break; + case 0x49: + Size = 4 * 1024 * 1024; + Associativity = 16; + break; + case 0x4e: + Size = 6 * 1024 * 1024; + Associativity = 24; + break; + case 0x60: + case 0x66: + case 0x67: + case 0x68: + KePrefetchNTAGranularity = 64; + break; + case 0x78: + Size = 1024 * 1024; + Associativity = 4; + break; + case 0x79: + case 0x7a: + case 0x7b: + case 0x7c: + case 0x7d: + Size = (1 << (RegisterByte - 0x79)) * 128 * 1024; + Associativity = 8; + break; + case 0x7f: + Size = 512 * 1024; + Associativity = 2; + break; + case 0x80: + Size = 512 * 1024; + Associativity = 8; + break; + case 0x82: + case 0x83: + case 0x84: + case 0x85: + Size = (1 << (RegisterByte - 0x82)) * 256 * 1024; + Associativity = 8; + break; + case 0x86: + Size = 512 * 1024; + Associativity = 4; + break; + case 0x87: + Size = 1024 * 1024; + Associativity = 8; + break; + case 0xf0: + KePrefetchNTAGranularity = 64; + break; + case 0xf1: + KePrefetchNTAGranularity = 128; + break; } - else if ((RegisterByte > 0x21) && (RegisterByte <= 0x29)) + if (Size && (Size / Associativity) > CurrentSize) { - /* Set minimum cache line size */ - if (CacheLine < 128) CacheLine = 128; - - /* Hard-code size/associativity */ - Associativity = 8; - switch (RegisterByte) - { - case 0x22: - Size = 512 * 1024; - Associativity = 4; - break; - - case 0x23: - Size = 1024 * 1024; - break; - - case 0x25: - Size = 2048 * 1024; - break; - - case 0x29: - Size = 4096 * 1024; - break; - - default: - Size = 0; - break; - } - - /* Check if this cache is bigger than the last */ - if ((Size / Associativity) > CurrentSize) - { - /* Set the L2 Cache Size and Associativity */ - CurrentSize = Size / Associativity; - Pcr->SecondLevelCacheSize = Size; - Pcr->SecondLevelCacheAssociativity = Associativity; - } - } - else if (((RegisterByte > 0x65) && (RegisterByte < 0x69)) || - (RegisterByte == 0x2C) || (RegisterByte == 0xF0)) - { - /* Indicates L1 cache line of 64 bytes */ - KePrefetchNTAGranularity = 64; - } - else if (RegisterByte == 0xF1) - { - /* Indicates L1 cache line of 128 bytes */ - KePrefetchNTAGranularity = 128; - } - else if (((RegisterByte >= 0x4A) && (RegisterByte <= 0x4C)) || - (RegisterByte == 0x78) || - (RegisterByte == 0x7D) || - (RegisterByte == 0x7F) || - (RegisterByte == 0x86) || - (RegisterByte == 0x87)) - { - /* Set minimum cache line size */ - if (CacheLine < 64) CacheLine = 64; - - /* Hard-code size/associativity */ - switch (RegisterByte) - { - case 0x4A: - Size = 4 * 1024 * 1024; - Associativity = 8; - break; - - case 0x4B: - Size = 6 * 1024 * 1024; - Associativity = 12; - break; - - case 0x4C: - Size = 8 * 1024 * 1024; - Associativity = 16; - break; - - case 0x78: - Size = 1 * 1024 * 1024; - Associativity = 4; - break; - - case 0x7D: - Size = 2 * 1024 * 1024; - Associativity = 8; - break; - - case 0x7F: - Size = 512 * 1024; - Associativity = 2; - break; - - case 0x86: - Size = 512 * 1024; - Associativity = 4; - break; - - case 0x87: - Size = 1 * 1024 * 1024; - Associativity = 8; - break; - - default: - Size = 0; - break; - } - - /* Check if this cache is bigger than the last */ - if ((Size / Associativity) > CurrentSize) - { - /* Set the L2 Cache Size and Associativity */ - CurrentSize = Size / Associativity; - Pcr->SecondLevelCacheSize = Size; - Pcr->SecondLevelCacheAssociativity = Associativity; - } + /* Set the L2 Cache Size and Associativity */ + CurrentSize = Size / Associativity; + Pcr->SecondLevelCacheSize = Size; + Pcr->SecondLevelCacheAssociativity = Associativity; } } }