/** @file\r
Supporting functions for IA32 architecture.\r
\r
- Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
IA32_DESCRIPTOR IdtDescriptor;\r
UINTN Index;\r
UINT16 CodeSegment;\r
+ UINT32 RegEdx;\r
\r
AsmReadIdtr (&IdtDescriptor);\r
\r
IdtEntry[DEBUG_TIMER_VECTOR].Bits.GateType = IA32_IDT_GATE_TYPE_INTERRUPT_32;\r
\r
//\r
+ // If the CPU supports Debug Extensions(CPUID:01 EDX:BIT2), then \r
// Set DE flag in CR4 to enable IO breakpoint\r
//\r
- AsmWriteCr4 (AsmReadCr4 () | BIT3);\r
+ AsmCpuid (1, NULL, NULL, NULL, &RegEdx);\r
+ if ((RegEdx & BIT2) != 0) {\r
+ AsmWriteCr4 (AsmReadCr4 () | BIT3);\r
+ }\r
}\r
\r
/**\r
#------------------------------------------------------------------------------\r
#\r
-# Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# which accompanies this distribution. The full text of the license may be found at\r
pushl %edi\r
\r
## UINT32 Cr0, Cr1, Cr2, Cr3, Cr4;\r
+## insure FXSAVE/FXRSTOR is enabled in CR4...\r
+## ... while we're at it, make sure DE is also enabled...\r
+ mov $1, %eax\r
+ pushl %ebx # temporarily save value of ebx on stack \r
+ cpuid # use CPUID to determine if FXSAVE/FXRESTOR \r
+ # and DE are supported\r
+ popl %ebx # retore value of ebx that was overwritten\r
+ # by CPUID \r
movl %cr4, %eax\r
- orl $0x208,%eax\r
+ pushl %eax # push cr4 firstly\r
+ testl $BIT24, %edx # Test for FXSAVE/FXRESTOR support\r
+ jz L1\r
+ orl $BIT9, %eax # Set CR4.OSFXSR\r
+L1: \r
+ testl $BIT2, %edx # Test for Debugging Extensions support\r
+ jz L2\r
+ orl $BIT3, %eax # Set CR4.DE\r
+L2: \r
movl %eax, %cr4\r
- pushl %eax\r
movl %cr3, %eax\r
pushl %eax\r
movl %cr2, %eax\r
## FX_SAVE_STATE_IA32 FxSaveState;\r
subl $512,%esp\r
movl %esp,%edi\r
+ testl $BIT24, %edx # Test for FXSAVE/FXRESTOR support.\r
+ # edx still contains result from CPUID above\r
+ jz L3\r
.byte 0x0f, 0xae, 0x07 # fxsave [edi]\r
+L3: \r
\r
## save the exception data\r
pushl 8(%esp)\r
\r
## FX_SAVE_STATE_IA32 FxSaveState;\r
movl %esp,%esi\r
+ movl $1, %eax\r
+ cpuid # use CPUID to determine if FXSAVE/FXRESTOR\r
+ # are supported\r
+ testl $BIT24, %edx # Test for FXSAVE/FXRESTOR support\r
+ jz L4\r
.byte 0x0f, 0xae, 0x0e # fxrstor [esi]\r
+L4: \r
addl $512,%esp\r
\r
## UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;\r
;; UINT32 Cr0, Cr1, Cr2, Cr3, Cr4;\r
;; insure FXSAVE/FXRSTOR is enabled in CR4...\r
;; ... while we're at it, make sure DE is also enabled...\r
+ mov eax, 1\r
+ push ebx ; temporarily save value of ebx on stack \r
+ cpuid ; use CPUID to determine if FXSAVE/FXRESTOR and\r
+ ; DE are supported\r
+ pop ebx ; retore value of ebx that was overwritten by CPUID \r
mov eax, cr4\r
- push eax ; push cr4 firstly\r
- or eax, 208h\r
+ push eax ; push cr4 firstly\r
+ test edx, BIT24 ; Test for FXSAVE/FXRESTOR support\r
+ jz @F\r
+ or eax, BIT9 ; Set CR4.OSFXSR\r
+@@: \r
+ test edx, BIT2 ; Test for Debugging Extensions support\r
+ jz @F\r
+ or eax, BIT3 ; Set CR4.DE\r
+@@: \r
mov cr4, eax\r
mov eax, cr3\r
push eax\r
mov ecx, 128 ;= 512 / 4\r
rep stosd\r
mov edi, esp\r
+\r
+ test edx, BIT24 ; Test for FXSAVE/FXRESTOR support.\r
+ ; edx still contains result from CPUID above\r
+ jz @F\r
db 0fh, 0aeh, 00000111y ;fxsave [edi]\r
+@@: \r
\r
;; save the exception data\r
push dword ptr [ebp + 8]\r
\r
;; FX_SAVE_STATE_IA32 FxSaveState;\r
mov esi, esp\r
+ mov eax, 1\r
+ cpuid ; use CPUID to determine if FXSAVE/FXRESTOR are supported\r
+ test edx, BIT24 ; Test for FXSAVE/FXRESTOR support\r
+ jz @F\r
db 0fh, 0aeh, 00001110y ; fxrstor [esi]\r
+@@: \r
add esp, 512\r
\r
;; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;\r
/** @file\r
Supporting functions for X64 architecture.\r
\r
- Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
IA32_DESCRIPTOR IdtDescriptor;\r
UINTN Index;\r
UINT16 CodeSegment;\r
+ UINT32 RegEdx;\r
\r
AsmReadIdtr (&IdtDescriptor);\r
\r
IdtEntry[DEBUG_TIMER_VECTOR].Bits.GateType = IA32_IDT_GATE_TYPE_INTERRUPT_32;\r
\r
//\r
+ // If the CPU supports Debug Extensions(CPUID:01 EDX:BIT2), then \r
// Set DE flag in CR4 to enable IO breakpoint\r
//\r
- AsmWriteCr4 (AsmReadCr4 () | BIT3);\r
+ AsmCpuid (1, NULL, NULL, NULL, &RegEdx);\r
+ if ((RegEdx & BIT2) != 0) {\r
+ AsmWriteCr4 (AsmReadCr4 () | BIT3);\r
+ }\r
}\r
\r
/**\r
## @file\r
# Debug Agent library instance for Dxe Core and Dxe modules.\r
#\r
-# Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>\r
#\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
MODULE_UNI_FILE = DxeDebugAgentLib.uni\r
FILE_GUID = BA6BAD25-B814-4747-B0B0-0FBB61D40B90\r
MODULE_TYPE = DXE_DRIVER\r
- VERSION_STRING = 0.7\r
+ VERSION_STRING = 0.8\r
LIBRARY_CLASS = DebugAgentLib|DXE_CORE DXE_DRIVER\r
\r
CONSTRUCTOR = DxeDebugAgentLibConstructor\r
## @file\r
# Debug Agent library instance for SEC Core and PEI modules.\r
#\r
-# Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>\r
#\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
MODULE_UNI_FILE = SecPeiDebugAgentLib.uni\r
FILE_GUID = 508B7D59-CD4E-4a6b-A45B-6D3B2D90111E\r
MODULE_TYPE = PEIM\r
- VERSION_STRING = 0.7\r
+ VERSION_STRING = 0.8\r
LIBRARY_CLASS = DebugAgentLib|SEC PEIM\r
\r
#\r
MODULE_UNI_FILE = SmmDebugAgentLib.uni\r
FILE_GUID = CB07D74C-598F-4268-A5D1-644FB4A481E8\r
MODULE_TYPE = DXE_SMM_DRIVER\r
- VERSION_STRING = 0.7\r
+ VERSION_STRING = 0.8\r
LIBRARY_CLASS = DebugAgentLib|DXE_SMM_DRIVER\r
\r
#\r