OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
VerifyMemOpt.c
Go to the documentation of this file.
1
15#include <Uefi.h>
16#include <Library/BaseMemoryLib.h>
17#include <Library/BaseLib.h>
18#include <Library/DebugLib.h>
19#include <Library/OcMiscLib.h>
20#include <Library/UefiLib.h>
21#include <Library/UefiBootServicesTableLib.h>
22
23STATIC UINT8 mSource[64];
24STATIC UINT8 mDestination[64];
25
26EFI_STATUS
27EFIAPI
29 IN EFI_HANDLE ImageHandle,
30 IN EFI_SYSTEM_TABLE *SystemTable
31 )
32{
33 UINT8 *Src;
34 UINT8 *Dst;
35 UINT32 Size;
36 IA32_CR0 Cr0;
37 IA32_CR4 Cr4;
38 IA32_EFLAGS32 Flags;
39
40 Src = ALIGN_POINTER (mSource, 16);
41 Dst = ALIGN_POINTER (mDestination, 16);
42 Size = 32;
43
44 gST->ConOut->OutputString (gST->ConOut, L"VerifyMemOpt\r\n");
45 gBS->Stall (SECONDS_TO_MICROSECONDS (1));
46
47 Cr0.UintN = AsmReadCr0 ();
48 Cr4.UintN = AsmReadCr4 ();
49 Flags.UintN = AsmReadEflags ();
50
51 //
52 // CR0.MP bit (BIT1) must be set.
53 // CR0.EM bit (BIT2) must be cleared.
54 // CR4.OSFXSR bit (BIT9) must be set.
55 // CR4.OSXMMEXCPT bit (BIT10) must be set.
56 //
57 DEBUG ((DEBUG_WARN, "VMOPT: CR0 %08X CR4 %08X EFLAGS %08X\n", Cr0, Cr4, Flags));
58
59 if (Cr0.Bits.MP == 0) {
60 DEBUG ((DEBUG_WARN, "VMOPT: WARN CR0 MP is NOT set\n"));
61 }
62
63 if (Cr0.Bits.EM != 0) {
64 DEBUG ((DEBUG_WARN, "VMOPT: WARN CR0 EM is set\n"));
65 }
66
67 if (Cr4.Bits.OSFXSR == 0) {
68 DEBUG ((DEBUG_WARN, "VMOPT: WARN CR4 OSFXSR is NOT set\n"));
69 }
70
71 if (Cr4.Bits.OSXMMEXCPT == 0) {
72 DEBUG ((DEBUG_WARN, "VMOPT: WARN CR4 OSXMMEXCPT is NOT set\n"));
73 }
74
75 if (Flags.Bits.DF != 0) {
76 DEBUG ((DEBUG_WARN, "VMOPT: WARN EFLAGS DF is set\n"));
77 }
78
79 DEBUG ((DEBUG_WARN, "VMOPT: CopyMem aligned src %p/aligned dst %p/size %u\n", Src, Dst, Size));
80 gBS->Stall (SECONDS_TO_MICROSECONDS (1));
81 CopyMem (Dst, Src, Size);
82
83 Src += 6;
84 DEBUG ((DEBUG_WARN, "VMOPT: CopyMem unaligned src %p/aligned dst %p/size %u\n", Src, Dst, Size));
85 gBS->Stall (SECONDS_TO_MICROSECONDS (1));
86 CopyMem (Dst, Src, Size);
87
88 Size -= 12;
89 DEBUG ((DEBUG_WARN, "VMOPT: CopyMem unaligned src %p/aligned dst %p/size %u\n", Src, Dst, Size));
90 gBS->Stall (SECONDS_TO_MICROSECONDS (1));
91 CopyMem (Dst, Src, Size);
92
93 Dst += 6;
94 DEBUG ((DEBUG_WARN, "VMOPT: CopyMem unaligned src %p/unaligned dst %p/size %u\n", Src, Dst, Size));
95 gBS->Stall (SECONDS_TO_MICROSECONDS (1));
96 CopyMem (Dst, Src, Size);
97
98 DEBUG ((DEBUG_WARN, "VMOPT: Done testing\n"));
99 gBS->Stall (SECONDS_TO_MICROSECONDS (1));
100
101 return EFI_SUCCESS;
102}
DMG_SIZE_DEVICE_PATH Size
EFI_SYSTEM_TABLE * gST
EFI_BOOT_SERVICES * gBS
#define SECONDS_TO_MICROSECONDS(x)
Definition OcMiscLib.h:30
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
UINTN EFIAPI AsmReadEflags(VOID)
Definition UserMisc.c:214
UINTN EFIAPI AsmReadCr4(VOID)
Definition UserMisc.c:196
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC UINT8 mDestination[64]
STATIC UINT8 mSource[64]