You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
5.5 KiB
C

4 years ago
#ifndef MEM_H
#define MEM_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @file mem.h
* @brief Defines memory operations
*
* Provides all necessary methods to read and write memory in a VM
*/
#include "definitions.h"
#define PAGE_OFFSET_SIZE 12
#define MAX_BATCHED_RW 1024
typedef struct RWInfo
{
uint64_t local;
uint64_t remote;
size_t size;
} RWInfo;
/**
* @brief Read a piece of data in physical VM address space
*
* @param data VM process data
* @param local local data address
* @param remote remote data address
* @param size size of data
*
* @return
* Data moved on success;
* -1 otherwise
*/
ssize_t MemRead(const ProcessData* data, uint64_t local, uint64_t remote, size_t size);
/**
* @brief Write a piece of data in physical VM address space
*
* @param data VM process data
* @param local local data address
* @param remote remote data address
* @param size size of data
*
* @return
* Data moved on success;
* -1 otherwise
*/
ssize_t MemWrite(const ProcessData* data, uint64_t local, uint64_t remote, size_t size);
/**
* @brief Read multiple pieces of data in physical VM address space
*
* @param data VM process data
* @param info list of information for RW operations
* @param num number of info atoms
*
* @return
* Data moved on success;
* -1 otherwise
*/
ssize_t MemReadMul(const ProcessData* data, RWInfo* info, size_t num);
/**
* @brief Write multiple pieces of data in physical VM address space
*
* @param data VM process data
* @param info list of information for RW operations
* @param num number of info atoms
*
* @return
* Data moved on success;
* -1 otherwise
*/
ssize_t MemWriteMul(const ProcessData* data, RWInfo* info, size_t num);
/**
* @brief Read a unsigned 64-bit integer in virtual VM address space
*
* @param data VM process data
* @param dirBase page table directory base of a process
* @param remote remote data address
*
* @return
* Read value, undefined on failure
*/
uint64_t VMemReadU64(const ProcessData* data, uint64_t dirBase, uint64_t remote);
/**
* @brief Write a unsigned 64-bit integer in virtual VM address space
*
* @param data VM process data
* @param dirBase page table directory base of a process
* @param remote remote data address
* @param value value to be written
*
* @return
* 8 on success;
* -1 on failure
*/
ssize_t VMemWriteU64(const ProcessData* data, uint64_t dirBase, uint64_t remote, uint64_t value);
/**
* @brief Read a unsigned 64-bit integer in physical VM address space
*
* @param data VM process data
* @param remote remote data address
*
* @return
* Read value, undefined on failure
*/
uint64_t MemReadU64(const ProcessData* data, uint64_t remote);
/**
* @brief Write a unsigned 64-bit integer in physical VM address space
*
* @param data VM process data
* @param remote remote data address
* @param value value to be written
*
* @return
* 8 on success;
* -1 on failure
*/
ssize_t MemWriteU64(const ProcessData* data, uint64_t remote, uint64_t value);
/**
* @brief Read data in virtual VM address space
*
* @param data VM process data
* @param dirBase page table directory base of a process
* @param local local data address
* @param remote remote data address
* @param size size of data
*
* @return
* Data moved on success;
* -1 otherwise
*/
ssize_t VMemRead(const ProcessData* data, uint64_t dirBase, uint64_t local, uint64_t remote, size_t size);
/**
* @brief Write data in virtual addresss space
*
* @param data VM process data
* @param dirBase page table directory base of a process
* @param local local data address
* @param remote remote data address
* @param size size of data
*
* @return
* Data moved on success;
* -1 otherwise
*/
ssize_t VMemWrite(const ProcessData* data, uint64_t dirBase, uint64_t local, uint64_t remote, size_t size);
/**
* @brief Read multiple pieces of data in virtual VM address space
*
* @param data VM process data
* @param dirBase page table directory base of a process
* @param info list of information for RW operations
* @param num number of info atoms
*
* @return
* Data moved on success;
* -1 otherwise
*/
ssize_t VMemReadMul(const ProcessData* data, uint64_t dirBase, RWInfo* info, size_t num);
/**
* @brief Write multiple pieces of data in virtual VM address space
*
* @param data VM process data
* @param dirBase page table directory base of a process
* @param info list of information for RW operations
* @param num number of info atoms
*
* @return
* Data moved on success;
* -1 otherwise
*/
ssize_t VMemWriteMul(const ProcessData* data, uint64_t dirBase, RWInfo* info, size_t num);
/**
* @brief Translate a virtual VM address into a physical one
*
* @param data VM process data
* @param dirBase page table directory base of a process
* @param address virtual address to translate
*
* @return
* Translated linear address;
* 0 otherwise
*/
uint64_t VTranslate(const ProcessData* data, uint64_t dirBase, uint64_t address);
/**
* @brief Set translation cache validity time in msecs
*
* @param newTime new validity length for a cache entry
*
* Defines for how long translation caches (TLB and page buffer) should be valid. Higher values lead to higher
* performance, but could potentially lead to incorrect translation if the page tables update in that period.
* Especially dangerous if write operations are to be performed.
*/
void SetMemCacheTime(size_t newTime);
/**
* @brief Get the default cache validity
*
* @return
* Default cache validity time
*/
size_t GetDefaultMemCacheTime();
#ifdef __cplusplus
}
#endif
#endif