When CSM uses EFI_SEGMENT and EFI_OFFSET to call CSM16 function, some CSM16 use es:[offset + 0xabcd] to get data passed from CSM32, offset + 0xabcd could exceed 0xFFFF which is invalid in real mode. So added NORMALIZE_EFI_SEGMENT and NORMALIZE_EFI_OFFSET to keep offset as small as possible to avoid this issue during CSM16 function call.

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
This commit is contained in:
li-elvin 2012-03-01 11:16:42 +00:00
parent 916666c009
commit 81c0d6e9a7
3 changed files with 15 additions and 7 deletions

View File

@ -1,6 +1,6 @@
/** @file /** @file
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -352,8 +352,8 @@ LegacyBiosGetBbsInfo (
// Pass in handoff data // Pass in handoff data
// //
TempData = (UINTN) EfiToLegacy16BootTable; TempData = (UINTN) EfiToLegacy16BootTable;
Regs.X.ES = EFI_SEGMENT ((UINT32) TempData); Regs.X.ES = NORMALIZE_EFI_SEGMENT ((UINT32) TempData);
Regs.X.BX = EFI_OFFSET ((UINT32) TempData); Regs.X.BX = NORMALIZE_EFI_OFFSET ((UINT32) TempData);
Private->LegacyBios.FarCall86 ( Private->LegacyBios.FarCall86 (
This, This,

View File

@ -1,6 +1,6 @@
/** @file /** @file
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -93,6 +93,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#define PROTECTED_MODE_BASE_VECTOR_MASTER 0x68 #define PROTECTED_MODE_BASE_VECTOR_MASTER 0x68
#define PROTECTED_MODE_BASE_VECTOR_SLAVE 0x70 #define PROTECTED_MODE_BASE_VECTOR_SLAVE 0x70
//
// When we call CSM16 functions, some CSM16 use es:[offset + 0xabcd] to get data passed from CSM32,
// offset + 0xabcd could overflow which exceeds 0xFFFF which is invalid in real mode.
// So this will keep offset as small as possible to avoid offset overflow in real mode.
//
#define NORMALIZE_EFI_SEGMENT(_Adr) (UINT16) (((UINTN) (_Adr)) >> 4)
#define NORMALIZE_EFI_OFFSET(_Adr) (UINT16) (((UINT16) ((UINTN) (_Adr))) & 0xf)
// //
// Trace defines // Trace defines
// //

View File

@ -1,6 +1,6 @@
/** @file /** @file
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -1160,8 +1160,8 @@ GenericLegacyBoot (
// //
// Pass in handoff data // Pass in handoff data
// //
Regs.X.ES = EFI_SEGMENT ((UINTN)EfiToLegacy16BootTable); Regs.X.ES = NORMALIZE_EFI_SEGMENT ((UINTN)EfiToLegacy16BootTable);
Regs.X.BX = EFI_OFFSET ((UINTN)EfiToLegacy16BootTable); Regs.X.BX = NORMALIZE_EFI_OFFSET ((UINTN)EfiToLegacy16BootTable);
Private->LegacyBios.FarCall86 ( Private->LegacyBios.FarCall86 (
This, This,