Kernel Loader: Difference between revisions
No edit summary |
|||
Line 63: | Line 63: | ||
== KernelLdr_LoadKernel == | == KernelLdr_LoadKernel == | ||
TODO: | |||
First, it backs up the original kernel base, and then relocates the kernel for | |||
<pre> | |||
// Backup kernel_base argument for use later | |||
original_kernel_base = kernel_base; | |||
// Move kernel elsewhere in DRAM if needed (unused in practice?) | |||
// This is maybe to support reserving unused memory for a second OS/hypervisor? | |||
KernelLdr_RelocateKernelPhysically(&kernel_base, &kernel_map); | |||
</pre> | |||
TODO: More stuff | |||
== KernelLdr_RelocateKernelPhysically == | |||
This retrieves memory layout information from the secure monitor, and adjusts the kernel's physical location if necessary. | |||
<pre> | |||
adjusted_kernel_base = KernelLdr_GetAdjustedKernelPhysicalBase(*p_kernel_base); | |||
if (adjusted_kernel_base != *p_kernel_base) { | |||
// Copy data to adjusted destination | |||
memmove(adjusted_kernel_base, *p_kernel_base, (*p_kernel_map)->data_end_offset); | |||
// Adjust pointers. | |||
kernel_base_diff = adjusted_kernel_base - *p_kernel_base; | |||
*p_kernel_base = (uintptr_t)*p_kernel_base + kernel_base_diff; | |||
*p_kernel_map = (uintptr_t)*p_kernel_map + kernel_base_diff; | |||
} | |||
</pre> | |||
== KernelLdr_GetAdjustedKernelPhysicalBase == | |||
TODO: secmon calls here | |||
== KInitialPageAllocator::KInitialPageAllocator == | == KInitialPageAllocator::KInitialPageAllocator == |