/* EFI library includes */
#include <EfiBind.h>
#include <EfiTypes.h>
#include <EfiCommon.h>
#include <EfiApi.h>
#include <EfiDriverLib.h>
#include <EfiDevicePath.h>
#include "OSXP.h"
#include "thunk.h"
/* A stack for real mode code to use. */
UINT16 RealStack[2048];
SegmentDescriptor RealGDT[] = {
{ // Selector 0x00 - NULL
0, // LimitLow
0, // BaseLow
0, // BaseMid
0, // Attribute
0, // LimitHi
0 // BaseHi
},
{ // Selector 0x08 - NULL
0, // LimitLow
0, // BaseLow
0, // BaseMid
0, // Attribute
0, // LimitHi
0 // BaseHi
},
{ // Selector 0x10 - Real Code
0xffff, // LimitLow
0x0000, // BaseLow
0x00, // BaseMid
0x9a, // Attribute
0x0f, // LimitHi
0x00 // BaseHi
},
{ // Selector 0x18 - Real Data
0xffff, // LimitLow
0x0000, // BaseLow
0x00, // BaseMid
0x92, // Attribute
0x8f, // LimitHi
0x00 // BaseHi
}
};
SystemTableRegister ProtectedIDTR;
SystemTableRegister ProtectedGDTR;
UINT32 ProtectedESP;
SystemTableRegister RealIDTR = {
0x3FFF, // Limit
0x0 // Base
};
SystemTableRegister RealGDTR = {
sizeof(RealGDT) - 1, // Limit
(UINT32) &RealGDT // Base
};
EFI_TPL ProtectedTPL;
void ThunkMBR()
{
ProtectedTPL = gBS->RaiseTPL(EFI_TPL_HIGH_LEVEL);
asmThunk();
gBS->RestoreTPL(ProtectedTPL);
}