Reads 64-bit data form the memory address. @param VmPtr A pointer to VM context. @param Addr The memory address. @return The 64-bit value from the memory address. **/
| 5264 | |
| 5265 | **/ |
| 5266 | UINT64 |
| 5267 | VmReadMem64 ( |
| 5268 | IN VM_CONTEXT *VmPtr, |
| 5269 | IN UINTN Addr |
| 5270 | ) |
| 5271 | { |
| 5272 | UINT64 Data; |
| 5273 | UINT32 Data32; |
| 5274 | |
| 5275 | // |
| 5276 | // Convert the address if it's in the stack gap |
| 5277 | // |
| 5278 | Addr = ConvertStackAddr (VmPtr, Addr); |
| 5279 | |
| 5280 | // |
| 5281 | // Read direct if aligned |
| 5282 | // |
| 5283 | if (IS_ALIGNED (Addr, sizeof (UINT64))) { |
| 5284 | return * (UINT64 *) Addr; |
| 5285 | } |
| 5286 | // |
| 5287 | // Return unaligned data. Assume little endian. |
| 5288 | // |
| 5289 | Data32 = VmReadMem32 (VmPtr, Addr); |
| 5290 | Data = (UINT64) VmReadMem32 (VmPtr, Addr + sizeof (UINT32)); |
| 5291 | Data = LShiftU64 (Data, 32) | Data32; |
| 5292 | return Data; |
| 5293 | } |
| 5294 | |
| 5295 | |
| 5296 | /** |
no test coverage detected