Mark pages as written. Preparation for dynamic translation

This commit is contained in:
Fabian 2014-05-08 22:47:56 +02:00
parent 6f974f6889
commit 58ebb650b0
2 changed files with 38 additions and 5 deletions

View file

@ -161,6 +161,10 @@ var
MMAP_BLOCK_SIZE = 1 << MMAP_BLOCK_BITS;
/** @const */
var MEM_PAGE_WRITTEN = 1;
/** @const */
var MAGIC_CPU_EXCEPTION = 0xDEADBEE;

View file

@ -29,6 +29,9 @@ function Memory(buffer, memory_size)
this.memory_map_read = memory_map_read;
this.memory_map_write = memory_map_write;
// use by dynamic translator
this.mem_page_infos = new Uint8Array(1 << 20);
dbg_assert((memory_size & MMAP_BLOCK_SIZE - 1) === 0);
}
@ -198,7 +201,10 @@ Memory.prototype.write8 = function(addr, value)
{
this.debug_write(addr, 1, value);
if(this.memory_map_registered[addr >>> MMAP_BLOCK_BITS])
var page = addr >>> MMAP_BLOCK_BITS;
this.mem_page_infos[page] |= MEM_PAGE_WRITTEN;
if(this.memory_map_registered[page])
{
this.mmap_write8(addr, value);
}
@ -216,7 +222,11 @@ Memory.prototype.write16 = function(addr, value)
{
this.debug_write(addr, 2, value);
if(this.memory_map_registered[addr >>> MMAP_BLOCK_BITS])
var page = addr >>> MMAP_BLOCK_BITS;
this.mem_page_infos[page] |= MEM_PAGE_WRITTEN;
this.mem_page_infos[addr + 1 >>> MMAP_BLOCK_BITS] |= MEM_PAGE_WRITTEN;
if(this.memory_map_registered[page])
{
this.mmap_write8(addr, value & 0xff);
this.mmap_write8(addr + 1, value >> 8 & 0xff);
@ -236,7 +246,10 @@ Memory.prototype.write_aligned16 = function(addr, value)
{
this.debug_write(addr << 1, 2, value);
if(this.memory_map_registered[addr >>> MMAP_BLOCK_BITS - 1])
var page = addr >>> MMAP_BLOCK_BITS - 1;
this.mem_page_infos[page] |= MEM_PAGE_WRITTEN;
if(this.memory_map_registered[page])
{
addr <<= 1;
this.mmap_write8(addr, value & 0xff);
@ -256,7 +269,11 @@ Memory.prototype.write32 = function(addr, value)
{
this.debug_write(addr, 4, value);
if(this.memory_map_registered[addr >>> MMAP_BLOCK_BITS])
var page = addr >>> MMAP_BLOCK_BITS;
this.mem_page_infos[page] |= MEM_PAGE_WRITTEN;
this.mem_page_infos[addr + 3 >>> MMAP_BLOCK_BITS] |= MEM_PAGE_WRITTEN;
if(this.memory_map_registered[page])
{
this.mmap_write32(addr, value);
}
@ -273,7 +290,10 @@ Memory.prototype.write_aligned32 = function(addr, value)
{
this.debug_write(addr << 2, 4, value);
if(this.memory_map_registered[addr >>> MMAP_BLOCK_BITS - 2])
var page = addr >>> MMAP_BLOCK_BITS - 2;
this.mem_page_infos[page] |= MEM_PAGE_WRITTEN;
if(this.memory_map_registered[page])
{
this.mmap_write32(addr << 2, value);
}
@ -290,7 +310,16 @@ Memory.prototype.write_aligned32 = function(addr, value)
Memory.prototype.write_blob = function(blob, offset)
{
dbg_assert(blob && blob.length);
this.mem8.set(blob, offset);
var page = offset >>> 12,
end = (offset + blob) >>> 12;
for(; page <= end; page++)
{
this.mem_page_infos[page] |= MEM_PAGE_WRITTEN;
}
};
/**