Dirty page table. Not yet used.
This commit is contained in:
@@ -446,6 +446,11 @@ void X64Emitter::StoreEflags() {
|
||||
#endif // STORE_EFLAGS
|
||||
}
|
||||
|
||||
uint32_t X64Emitter::page_table_address() const {
|
||||
uint64_t addr = runtime_->memory()->page_table();
|
||||
return static_cast<uint32_t>(addr);
|
||||
}
|
||||
|
||||
bool X64Emitter::ConstantFitsIn32Reg(uint64_t v) {
|
||||
if ((v & ~0x7FFFFFFF) == 0) {
|
||||
// Fits under 31 bits, so just load using normal mov.
|
||||
|
||||
@@ -132,6 +132,8 @@ public:
|
||||
void LoadEflags();
|
||||
void StoreEflags();
|
||||
|
||||
uint32_t page_table_address() const;
|
||||
|
||||
// Moves a 64bit immediate into memory.
|
||||
bool ConstantFitsIn32Reg(uint64_t v);
|
||||
void MovMem64(const Xbyak::RegExp& addr, uint64_t v);
|
||||
|
||||
@@ -1563,6 +1563,12 @@ EMITTER_OPCODE_TABLE(
|
||||
// OPCODE_STORE
|
||||
// ============================================================================
|
||||
// Note: most *should* be aligned, but needs to be checked!
|
||||
void EmitMarkPageDirty(X64Emitter& e, RegExp& addr) {
|
||||
// 16KB pages.
|
||||
e.shr(e.eax, 14);
|
||||
e.and(e.eax, 0x7FFF);
|
||||
e.mov(e.byte[e.rdx + e.rax + e.page_table_address()], 1);
|
||||
}
|
||||
EMITTER(STORE_I8, MATCH(I<OPCODE_STORE, VoidOp, I64<>, I8<>>)) {
|
||||
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
||||
auto addr = ComputeMemoryAddress(e, i.src1);
|
||||
@@ -1571,7 +1577,9 @@ EMITTER(STORE_I8, MATCH(I<OPCODE_STORE, VoidOp, I64<>, I8<>>)) {
|
||||
} else {
|
||||
e.mov(e.byte[addr], i.src2);
|
||||
}
|
||||
EmitMarkPageDirty(e, addr);
|
||||
if (IsTracingData()) {
|
||||
auto addr = ComputeMemoryAddress(e, i.src1);
|
||||
e.mov(e.r8b, e.byte[addr]);
|
||||
e.lea(e.rdx, e.ptr[addr]);
|
||||
e.CallNative(TraceMemoryStoreI8);
|
||||
@@ -1586,7 +1594,9 @@ EMITTER(STORE_I16, MATCH(I<OPCODE_STORE, VoidOp, I64<>, I16<>>)) {
|
||||
} else {
|
||||
e.mov(e.word[addr], i.src2);
|
||||
}
|
||||
EmitMarkPageDirty(e, addr);
|
||||
if (IsTracingData()) {
|
||||
auto addr = ComputeMemoryAddress(e, i.src1);
|
||||
e.mov(e.r8w, e.word[addr]);
|
||||
e.lea(e.rdx, e.ptr[addr]);
|
||||
e.CallNative(TraceMemoryStoreI16);
|
||||
@@ -1601,7 +1611,9 @@ EMITTER(STORE_I32, MATCH(I<OPCODE_STORE, VoidOp, I64<>, I32<>>)) {
|
||||
} else {
|
||||
e.mov(e.dword[addr], i.src2);
|
||||
}
|
||||
EmitMarkPageDirty(e, addr);
|
||||
if (IsTracingData()) {
|
||||
auto addr = ComputeMemoryAddress(e, i.src1);
|
||||
e.mov(e.r8d, e.dword[addr]);
|
||||
e.lea(e.rdx, e.ptr[addr]);
|
||||
e.CallNative(TraceMemoryStoreI32);
|
||||
@@ -1616,7 +1628,9 @@ EMITTER(STORE_I64, MATCH(I<OPCODE_STORE, VoidOp, I64<>, I64<>>)) {
|
||||
} else {
|
||||
e.mov(e.qword[addr], i.src2);
|
||||
}
|
||||
EmitMarkPageDirty(e, addr);
|
||||
if (IsTracingData()) {
|
||||
auto addr = ComputeMemoryAddress(e, i.src1);
|
||||
e.mov(e.r8, e.qword[addr]);
|
||||
e.lea(e.rdx, e.ptr[addr]);
|
||||
e.CallNative(TraceMemoryStoreI64);
|
||||
@@ -1631,7 +1645,9 @@ EMITTER(STORE_F32, MATCH(I<OPCODE_STORE, VoidOp, I64<>, F32<>>)) {
|
||||
} else {
|
||||
e.vmovss(e.dword[addr], i.src2);
|
||||
}
|
||||
EmitMarkPageDirty(e, addr);
|
||||
if (IsTracingData()) {
|
||||
auto addr = ComputeMemoryAddress(e, i.src1);
|
||||
e.lea(e.r8, e.ptr[addr]);
|
||||
e.lea(e.rdx, e.ptr[addr]);
|
||||
e.CallNative(TraceMemoryStoreF32);
|
||||
@@ -1646,7 +1662,9 @@ EMITTER(STORE_F64, MATCH(I<OPCODE_STORE, VoidOp, I64<>, F64<>>)) {
|
||||
} else {
|
||||
e.vmovsd(e.qword[addr], i.src2);
|
||||
}
|
||||
EmitMarkPageDirty(e, addr);
|
||||
if (IsTracingData()) {
|
||||
auto addr = ComputeMemoryAddress(e, i.src1);
|
||||
e.lea(e.r8, e.ptr[addr]);
|
||||
e.lea(e.rdx, e.ptr[addr]);
|
||||
e.CallNative(TraceMemoryStoreF64);
|
||||
@@ -1662,7 +1680,9 @@ EMITTER(STORE_V128, MATCH(I<OPCODE_STORE, VoidOp, I64<>, V128<>>)) {
|
||||
} else {
|
||||
e.vmovaps(e.ptr[addr], i.src2);
|
||||
}
|
||||
EmitMarkPageDirty(e, addr);
|
||||
if (IsTracingData()) {
|
||||
auto addr = ComputeMemoryAddress(e, i.src1);
|
||||
e.lea(e.r8, e.ptr[addr]);
|
||||
e.lea(e.rdx, e.ptr[addr]);
|
||||
e.CallNative(TraceMemoryStoreV128);
|
||||
|
||||
Reference in New Issue
Block a user