]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/BaseSynchronizationLib/Ia32/InternalGetSpinLockProperties.c
MdePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdePkg / Library / BaseSynchronizationLib / Ia32 / InternalGetSpinLockProperties.c
CommitLineData
5f0a17d8
JF
1/** @file\r
2 Internal function to get spin lock alignment.\r
3\r
9095d37b 4 Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>\r
9344f092 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
5f0a17d8
JF
6\r
7**/\r
8\r
9#include "BaseSynchronizationLibInternals.h"\r
10\r
11/**\r
12 Internal function to retrieve the architecture specific spin lock alignment\r
13 requirements for optimal spin lock performance.\r
14\r
15 @return The architecture specific spin lock alignment.\r
9095d37b 16\r
5f0a17d8
JF
17**/\r
18UINTN\r
19InternalGetSpinLockProperties (\r
20 VOID\r
21 )\r
22{\r
23 UINT32 RegEax;\r
24 UINT32 RegEbx;\r
25 UINTN FamilyId;\r
26 UINTN ModelId;\r
27 UINTN CacheLineSize;\r
28\r
29 //\r
30 // Retrieve CPUID Version Information\r
31 //\r
32 AsmCpuid (0x01, &RegEax, &RegEbx, NULL, NULL);\r
33 //\r
34 // EBX: Bits 15 - 08: CLFLUSH line size (Value * 8 = cache line size)\r
35 //\r
36 CacheLineSize = ((RegEbx >> 8) & 0xff) * 8;\r
37 //\r
38 // Retrieve CPU Family and Model\r
39 //\r
40 FamilyId = (RegEax >> 8) & 0xf;\r
41 ModelId = (RegEax >> 4) & 0xf;\r
42 if (FamilyId == 0x0f) {\r
43 //\r
44 // In processors based on Intel NetBurst microarchitecture, use two cache lines\r
9095d37b 45 //\r
5f0a17d8
JF
46 ModelId = ModelId | ((RegEax >> 12) & 0xf0);\r
47 if (ModelId <= 0x04 || ModelId == 0x06) {\r
48 CacheLineSize *= 2;\r
49 }\r
50 }\r
51\r
52f5bd26
JF
52 if (CacheLineSize < 32) {\r
53 CacheLineSize = 32;\r
54 }\r
55\r
5f0a17d8
JF
56 return CacheLineSize;\r
57}\r
58\r