]> git.proxmox.com Git - mirror_edk2.git/commitdiff
When CSM uses EFI_SEGMENT and EFI_OFFSET to call CSM16 function, some CSM16 use es...
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 1 Mar 2012 11:16:42 +0000 (11:16 +0000)
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 1 Mar 2012 11:16:42 +0000 (11:16 +0000)
Signed-off-by: li-elvin
Reviewed-by: rsun3
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13074 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBbs.c
IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBiosInterface.h
IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c

index c15e59972dc54a050fcd1229b8dd58026923b2cc..6ee43ad676f54209d8a74214f97a1c976d00d272 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2012, 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\r
@@ -352,8 +352,8 @@ LegacyBiosGetBbsInfo (
     // Pass in handoff data\r
     //\r
     TempData  = (UINTN) EfiToLegacy16BootTable;\r
-    Regs.X.ES = EFI_SEGMENT ((UINT32) TempData);\r
-    Regs.X.BX = EFI_OFFSET ((UINT32) TempData);\r
+    Regs.X.ES = NORMALIZE_EFI_SEGMENT ((UINT32) TempData);\r
+    Regs.X.BX = NORMALIZE_EFI_OFFSET ((UINT32) TempData);\r
 \r
     Private->LegacyBios.FarCall86 (\r
       This,\r
index 71522a0ba4a5fd9499784cadd1aafb7bf833d4c8..a42e847250b814c2e4eb9d99bbe06304d69ca0d4 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2012, 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\r
@@ -93,6 +93,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define PROTECTED_MODE_BASE_VECTOR_MASTER  0x68\r
 #define PROTECTED_MODE_BASE_VECTOR_SLAVE   0x70\r
 \r
+//\r
+// When we call CSM16 functions, some CSM16 use es:[offset + 0xabcd] to get data passed from CSM32, \r
+// offset + 0xabcd could overflow which exceeds 0xFFFF which is invalid in real mode. \r
+// So this will keep offset as small as possible to avoid offset overflow in real mode. \r
+//\r
+#define NORMALIZE_EFI_SEGMENT(_Adr)      (UINT16) (((UINTN) (_Adr)) >> 4)\r
+#define NORMALIZE_EFI_OFFSET(_Adr)       (UINT16) (((UINT16) ((UINTN) (_Adr))) & 0xf)\r
+\r
 //\r
 // Trace defines\r
 //\r
index 04013d9708cb5b5cd0897242f5ef19b7ebb8838a..4e16880bd6360e8e67e2311ffce410d3b7495b7b 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2012, 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\r
@@ -1160,8 +1160,8 @@ GenericLegacyBoot (
   //\r
   // Pass in handoff data\r
   //\r
-  Regs.X.ES = EFI_SEGMENT ((UINTN)EfiToLegacy16BootTable);\r
-  Regs.X.BX = EFI_OFFSET ((UINTN)EfiToLegacy16BootTable);\r
+  Regs.X.ES = NORMALIZE_EFI_SEGMENT ((UINTN)EfiToLegacy16BootTable);\r
+  Regs.X.BX = NORMALIZE_EFI_OFFSET ((UINTN)EfiToLegacy16BootTable);\r
 \r
   Private->LegacyBios.FarCall86 (\r
     This,\r