mirror of https://github.com/acidanthera/audk.git
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:
parent
916666c009
commit
81c0d6e9a7
|
@ -1,6 +1,6 @@
|
|||
/** @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
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -352,8 +352,8 @@ LegacyBiosGetBbsInfo (
|
|||
// Pass in handoff data
|
||||
//
|
||||
TempData = (UINTN) EfiToLegacy16BootTable;
|
||||
Regs.X.ES = EFI_SEGMENT ((UINT32) TempData);
|
||||
Regs.X.BX = EFI_OFFSET ((UINT32) TempData);
|
||||
Regs.X.ES = NORMALIZE_EFI_SEGMENT ((UINT32) TempData);
|
||||
Regs.X.BX = NORMALIZE_EFI_OFFSET ((UINT32) TempData);
|
||||
|
||||
Private->LegacyBios.FarCall86 (
|
||||
This,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/** @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
|
||||
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_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
|
||||
//
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/** @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
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -1160,8 +1160,8 @@ GenericLegacyBoot (
|
|||
//
|
||||
// Pass in handoff data
|
||||
//
|
||||
Regs.X.ES = EFI_SEGMENT ((UINTN)EfiToLegacy16BootTable);
|
||||
Regs.X.BX = EFI_OFFSET ((UINTN)EfiToLegacy16BootTable);
|
||||
Regs.X.ES = NORMALIZE_EFI_SEGMENT ((UINTN)EfiToLegacy16BootTable);
|
||||
Regs.X.BX = NORMALIZE_EFI_OFFSET ((UINTN)EfiToLegacy16BootTable);
|
||||
|
||||
Private->LegacyBios.FarCall86 (
|
||||
This,
|
||||
|
|
Loading…
Reference in New Issue