88 lines
2.4 KiB
C
88 lines
2.4 KiB
C
/*!
|
|
@file HostInitialization.h
|
|
|
|
@brief Functions for host environment initialization.
|
|
|
|
@author Satoshi Tanda
|
|
|
|
@copyright Copyright (c) 2020 - , Satoshi Tanda. All rights reserved.
|
|
*/
|
|
#pragma once
|
|
#include "Common.h"
|
|
|
|
/*!
|
|
@brief Initializes the host environment.
|
|
*/
|
|
VOID
|
|
InitializeHostEnvironment (
|
|
);
|
|
|
|
/*!
|
|
@brief Returns the host CR3.
|
|
|
|
@return The host CR3.
|
|
*/
|
|
CR3
|
|
GetHostCr3 (
|
|
);
|
|
|
|
/*!
|
|
@brief Returns the pointer to the host IDTR.
|
|
|
|
@return The pointer to the host IDTR.
|
|
*/
|
|
CONST IDTR*
|
|
GetHostIdtr (
|
|
);
|
|
|
|
/*!
|
|
@brief Sets up the task state segment (TSS) and the TR register.
|
|
|
|
@details On EFI, this functions takes a copy of the existing GDT into NewGdt,
|
|
adds a new entry into it, which points to NewTss, then, updates the GDTR
|
|
and TR to point to the NewGdt and the newly added entry. Those updated
|
|
GDTR and TR may be used as both host and guest GDTR/TR.
|
|
|
|
On Windows, this function is no-op.
|
|
|
|
@param[in,out] NewTss - The pointer to buffer to be used as the task state
|
|
segment.
|
|
|
|
@param[out] NewGdt - The pointer to the buffet to be used as the new GDT.
|
|
This will be initialized with the contents of the current GDT with the
|
|
new entry for TSS.
|
|
|
|
@param[in] NewGdtSize - The size of NewGdt in bytes.
|
|
|
|
@param[out] OriginalGdtr - The pointer to the GDTR to receive the value before
|
|
this function updates.
|
|
*/
|
|
VOID
|
|
InitializeGdt (
|
|
_Inout_ TASK_STATE_SEGMENT_64* NewTss,
|
|
_Out_writes_bytes_(NewGdtSize) SEGMENT_DESCRIPTOR_64* NewGdt,
|
|
_In_ UINT64 NewGdtSize,
|
|
_Out_ GDTR* OriginalGdtr
|
|
);
|
|
|
|
/*!
|
|
@brief Restores the GDTR to the specified value.
|
|
|
|
@details On EFI, this function updates the current GDTR, however, does not
|
|
restore the TR to the original value. This is because the original value
|
|
is expected to be zero, which cannot write to TR anymore (causes #GP).
|
|
Because of this, TR will point to an invalid entry in the restored GDT.
|
|
This is an unsolvable issue unless we reuse the existing GDT instead of
|
|
creating a copy, which does not work on VMware Workstation due to the
|
|
physical address hosting the GDT is not modifiable. The only sane
|
|
workaround would be to disallow unloading of the MiniVisor module.
|
|
|
|
On Windows, this function is no-op.
|
|
|
|
@param[in] OriginalGdtr - The pointer to the GDTR to restore to.
|
|
*/
|
|
VOID
|
|
CleanupGdt (
|
|
_In_ CONST GDTR* OriginalGdtr
|
|
);
|