diff --git a/include/kernel/kernel.h b/include/kernel/kernel.h index e0ed8da..caabcfe 100644 --- a/include/kernel/kernel.h +++ b/include/kernel/kernel.h @@ -5,8 +5,15 @@ extern "C" { #endif +#include extern void KernelCopyData(uint32_t dst, uint32_t src, uint32_t len); +void KernelReadPTE(uint32_t outputAddr, int32_t length); + +void KernelWritePTE(uint32_t inputAddr, int32_t length); + +void KernelNOPAtPhysicalAddress(uint32_t addr); + #ifdef __cplusplus } // extern "C" #endif \ No newline at end of file diff --git a/source/utils.cpp b/source/utils.cpp new file mode 100644 index 0000000..fdd0acc --- /dev/null +++ b/source/utils.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +#include "kernel/kernel.h" + +void KernelReadPTE(uint32_t outputAddr, int32_t length) { + uint32_t dst = (uint32_t) OSEffectiveToPhysical(outputAddr); + uint32_t src = 0xFFE20000; + ICInvalidateRange(&dst, 4); + DCFlushRange(&dst, 4); + DCFlushRange(&src, 4); + KernelCopyData(dst, src, length); + DCFlushRange((void *)outputAddr, length); + ICInvalidateRange((void *)outputAddr, length); +} + +void KernelWritePTE(uint32_t inputAddr, int32_t length) { + uint32_t dst = 0xFFE20000; + uint32_t src = (uint32_t) OSEffectiveToPhysical(inputAddr); + ICInvalidateRange(&src, 4); + DCFlushRange(&src, 4); + KernelCopyData(dst, src, length); +} + +void KernelNOPAtPhysicalAddress(uint32_t addr) { + uint32_t dst = 0x60000000; + ICInvalidateRange(&dst, 4); + DCFlushRange(&dst, 4); + KernelCopyData(addr,(uint32_t)OSEffectiveToPhysical((uint32_t)&dst),4); +} +