2013-12-07 06:57:16 +00:00
|
|
|
/**
|
|
|
|
******************************************************************************
|
|
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
|
|
******************************************************************************
|
|
|
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
|
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
|
|
******************************************************************************
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef ALLOY_MEMORY_H_
|
|
|
|
#define ALLOY_MEMORY_H_
|
|
|
|
|
|
|
|
#include <alloy/core.h>
|
|
|
|
|
|
|
|
namespace alloy {
|
|
|
|
|
|
|
|
enum {
|
2014-07-11 03:20:00 +00:00
|
|
|
MEMORY_FLAG_64KB_PAGES = (1 << 1),
|
|
|
|
MEMORY_FLAG_ZERO = (1 << 2),
|
|
|
|
MEMORY_FLAG_PHYSICAL = (1 << 3),
|
2013-12-07 06:57:16 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class Memory {
|
2014-07-11 03:20:00 +00:00
|
|
|
public:
|
2013-12-07 06:57:16 +00:00
|
|
|
Memory();
|
|
|
|
virtual ~Memory();
|
|
|
|
|
|
|
|
inline uint8_t* membase() const { return membase_; }
|
|
|
|
inline uint8_t* Translate(uint64_t guest_address) const {
|
|
|
|
return membase_ + guest_address;
|
|
|
|
};
|
2013-12-08 22:15:28 +00:00
|
|
|
inline uint32_t* reserve_address() { return &reserve_address_; }
|
2013-12-07 06:57:16 +00:00
|
|
|
|
2014-06-02 14:49:45 +00:00
|
|
|
virtual uint64_t page_table() const = 0;
|
|
|
|
|
2013-12-07 06:57:16 +00:00
|
|
|
virtual int Initialize();
|
|
|
|
|
|
|
|
void Zero(uint64_t address, size_t size);
|
|
|
|
void Fill(uint64_t address, size_t size, uint8_t value);
|
|
|
|
void Copy(uint64_t dest, uint64_t src, size_t size);
|
|
|
|
|
2014-07-11 03:20:00 +00:00
|
|
|
uint64_t SearchAligned(uint64_t start, uint64_t end, const uint32_t* values,
|
|
|
|
size_t value_count);
|
2013-12-07 06:57:16 +00:00
|
|
|
|
2014-06-02 06:36:18 +00:00
|
|
|
virtual uint8_t LoadI8(uint64_t address) = 0;
|
|
|
|
virtual uint16_t LoadI16(uint64_t address) = 0;
|
|
|
|
virtual uint32_t LoadI32(uint64_t address) = 0;
|
|
|
|
virtual uint64_t LoadI64(uint64_t address) = 0;
|
|
|
|
virtual void StoreI8(uint64_t address, uint8_t value) = 0;
|
|
|
|
virtual void StoreI16(uint64_t address, uint16_t value) = 0;
|
|
|
|
virtual void StoreI32(uint64_t address, uint32_t value) = 0;
|
|
|
|
virtual void StoreI64(uint64_t address, uint64_t value) = 0;
|
|
|
|
|
2014-07-11 03:20:00 +00:00
|
|
|
virtual uint64_t HeapAlloc(uint64_t base_address, size_t size, uint32_t flags,
|
|
|
|
uint32_t alignment = 0x20) = 0;
|
2013-12-07 06:57:16 +00:00
|
|
|
virtual int HeapFree(uint64_t address, size_t size) = 0;
|
|
|
|
|
2014-08-15 06:14:57 +00:00
|
|
|
virtual size_t QueryInformation(uint64_t base_address, MEMORY_BASIC_INFORMATION mem_info) = 0;
|
2014-01-05 19:19:02 +00:00
|
|
|
virtual size_t QuerySize(uint64_t base_address) = 0;
|
|
|
|
|
2013-12-07 06:57:16 +00:00
|
|
|
virtual int Protect(uint64_t address, size_t size, uint32_t access) = 0;
|
|
|
|
virtual uint32_t QueryProtect(uint64_t address) = 0;
|
|
|
|
|
2014-07-11 03:20:00 +00:00
|
|
|
protected:
|
|
|
|
size_t system_page_size_;
|
|
|
|
uint8_t* membase_;
|
|
|
|
uint32_t reserve_address_;
|
2013-12-07 06:57:16 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace alloy
|
|
|
|
|
|
|
|
#endif // ALLOY_MEMORY_H_
|