VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/Firmware/OvmfPkg/PlatformPei/MemDetect.c@ 58174

Last change on this file since 58174 was 58173, checked in by vboxsync, 9 years ago

EFI: Remove VBoxPkg PlatformPei module and merge changes into OvmfPkg PlatformPei

  • Property svn:eol-style set to native
File size: 3.7 KB
Line 
1/**@file
2 Memory Detection for Virtual Machines.
3
4 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13Module Name:
14
15 MemDetect.c
16
17**/
18
19//
20// The package level header files this module uses
21//
22#include <PiPei.h>
23
24//
25// The Library classes this module consumes
26//
27#include <Library/DebugLib.h>
28#include <Library/HobLib.h>
29#include <Library/IoLib.h>
30#include <Library/PcdLib.h>
31#include <Library/PeimEntryPoint.h>
32#include <Library/ResourcePublicationLib.h>
33#include <Library/MtrrLib.h>
34
35#include "Platform.h"
36#include "Cmos.h"
37
38STATIC
39UINTN
40GetSystemMemorySizeBelow4gb (
41 )
42{
43 UINT8 Cmos0x34;
44 UINT8 Cmos0x35;
45
46 //
47 // CMOS 0x34/0x35 specifies the system memory above 16 MB.
48 // * CMOS(0x35) is the high byte
49 // * CMOS(0x34) is the low byte
50 // * The size is specified in 64kb chunks
51 // * Since this is memory above 16MB, the 16MB must be added
52 // into the calculation to get the total memory size.
53 //
54
55 Cmos0x34 = (UINT8) CmosRead8 (0x34);
56 Cmos0x35 = (UINT8) CmosRead8 (0x35);
57
58 return (((UINTN)((Cmos0x35 << 8) + Cmos0x34) << 16) + SIZE_16MB);
59}
60
61
62STATIC
63UINT64
64GetSystemMemorySizeAbove4gb (
65 )
66{
67 UINT32 Size;
68 UINTN CmosIndex;
69
70 //
71 // CMOS 0x5b-0x5d specifies the system memory above 4GB MB.
72 // * CMOS(0x5d) is the most significant size byte
73 // * CMOS(0x5c) is the middle size byte
74 // * CMOS(0x5b) is the least significant size byte
75 // * The size is specified in 64kb chunks
76 //
77
78 Size = 0;
79 for (CmosIndex = 0x5d; CmosIndex >= 0x5b; CmosIndex--) {
80 Size = (UINT32) (Size << 8) + (UINT32) CmosRead8 (CmosIndex);
81 }
82
83 return LShiftU64 (Size, 16);
84}
85
86
87/**
88 Peform Memory Detection
89
90 @return EFI_SUCCESS The PEIM initialized successfully.
91
92**/
93EFI_PHYSICAL_ADDRESS
94MemDetect (
95 )
96{
97 EFI_STATUS Status;
98 EFI_PHYSICAL_ADDRESS MemoryBase;
99 UINT64 MemorySize;
100 UINT64 LowerMemorySize;
101 UINT64 UpperMemorySize;
102
103 DEBUG ((EFI_D_ERROR, "MemDetect called\n"));
104
105 //
106 // Determine total memory size available
107 //
108 LowerMemorySize = GetSystemMemorySizeBelow4gb ();
109 UpperMemorySize = GetSystemMemorySizeAbove4gb ();
110
111 //
112 // Determine the range of memory to use during PEI
113 //
114 MemoryBase = PcdGet32 (PcdOvmfMemFvBase) + PcdGet32 (PcdOvmfMemFvSize);
115 MemorySize = LowerMemorySize - MemoryBase;
116 if (MemorySize > SIZE_64MB) {
117 MemoryBase = LowerMemorySize - SIZE_64MB;
118 MemorySize = SIZE_64MB;
119 }
120#ifdef VBOX
121 MemorySize -= BASE_64KB; /* Reserves 64KB for ACPI tables. */
122#endif
123
124 //
125 // Publish this memory to the PEI Core
126 //
127 Status = PublishSystemMemory(MemoryBase, MemorySize);
128 ASSERT_EFI_ERROR (Status);
129
130 //
131 // Create memory HOBs
132 //
133 AddMemoryBaseSizeHob (MemoryBase, MemorySize);
134 AddMemoryRangeHob (BASE_1MB, MemoryBase);
135#ifndef VBOX
136 AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);
137#endif
138
139 MtrrSetMemoryAttribute (BASE_1MB, MemoryBase + MemorySize - BASE_1MB, CacheWriteBack);
140
141#ifdef VBOX
142 AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);
143#endif
144 MtrrSetMemoryAttribute (0, BASE_512KB + BASE_128KB, CacheWriteBack);
145
146 if (UpperMemorySize != 0) {
147 AddUntestedMemoryBaseSizeHob (BASE_4GB, UpperMemorySize);
148
149 MtrrSetMemoryAttribute (BASE_4GB, UpperMemorySize, CacheWriteBack);
150 }
151
152 return MemoryBase + MemorySize;
153}
154
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette