mirror of
https://github.com/copy/v86.git
synced 2025-12-31 04:23:15 +00:00
inlinde memory.js into cpu.js
This commit is contained in:
parent
48a71b04a1
commit
e9d5849afe
4 changed files with 97 additions and 104 deletions
2
Makefile
2
Makefile
|
|
@ -79,7 +79,7 @@ CARGO_FLAGS_SAFE=\
|
|||
CARGO_FLAGS=$(CARGO_FLAGS_SAFE) -C target-feature=+bulk-memory -C target-feature=+multivalue -C target-feature=+simd128
|
||||
|
||||
CORE_FILES=cjs.js const.js config.js io.js main.js lib.js buffer.js ide.js pci.js floppy.js \
|
||||
memory.js dma.js pit.js vga.js ps2.js rtc.js uart.js \
|
||||
dma.js pit.js vga.js ps2.js rtc.js uart.js \
|
||||
acpi.js apic.js ioapic.js \
|
||||
state.js ne2k.js sb16.js virtio.js virtio_console.js virtio_net.js virtio_balloon.js \
|
||||
bus.js log.js cpu.js \
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ import { EEXIST, ENOENT } from "../../lib/9p.js";
|
|||
|
||||
|
||||
// Decorates CPU
|
||||
import "../memory.js";
|
||||
import "../state.js";
|
||||
|
||||
/**
|
||||
|
|
|
|||
96
src/cpu.js
96
src/cpu.js
|
|
@ -238,6 +238,102 @@ export function CPU(bus, wm, stop_idling)
|
|||
//Object.seal(this);
|
||||
}
|
||||
|
||||
CPU.prototype.mmap_read8 = function(addr)
|
||||
{
|
||||
const value = this.memory_map_read8[addr >>> MMAP_BLOCK_BITS](addr);
|
||||
dbg_assert(value >= 0 && value <= 0xFF);
|
||||
return value;
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write8 = function(addr, value)
|
||||
{
|
||||
dbg_assert(value >= 0 && value <= 0xFF);
|
||||
this.memory_map_write8[addr >>> MMAP_BLOCK_BITS](addr, value);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_read16 = function(addr)
|
||||
{
|
||||
var fn = this.memory_map_read8[addr >>> MMAP_BLOCK_BITS];
|
||||
const value = fn(addr) | fn(addr + 1 | 0) << 8;
|
||||
dbg_assert(value >= 0 && value <= 0xFFFF);
|
||||
return value;
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write16 = function(addr, value)
|
||||
{
|
||||
var fn = this.memory_map_write8[addr >>> MMAP_BLOCK_BITS];
|
||||
|
||||
dbg_assert(value >= 0 && value <= 0xFFFF);
|
||||
fn(addr, value & 0xFF);
|
||||
fn(addr + 1 | 0, value >> 8);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_read32 = function(addr)
|
||||
{
|
||||
var aligned_addr = addr >>> MMAP_BLOCK_BITS;
|
||||
|
||||
return this.memory_map_read32[aligned_addr](addr);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write32 = function(addr, value)
|
||||
{
|
||||
var aligned_addr = addr >>> MMAP_BLOCK_BITS;
|
||||
|
||||
this.memory_map_write32[aligned_addr](addr, value);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write64 = function(addr, value0, value1)
|
||||
{
|
||||
var aligned_addr = addr >>> MMAP_BLOCK_BITS;
|
||||
// This should hold since writes across pages are split up
|
||||
dbg_assert(aligned_addr === (addr + 7) >>> MMAP_BLOCK_BITS);
|
||||
|
||||
var write_func32 = this.memory_map_write32[aligned_addr];
|
||||
write_func32(addr, value0);
|
||||
write_func32(addr + 4, value1);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write128 = function(addr, value0, value1, value2, value3)
|
||||
{
|
||||
var aligned_addr = addr >>> MMAP_BLOCK_BITS;
|
||||
// This should hold since writes across pages are split up
|
||||
dbg_assert(aligned_addr === (addr + 12) >>> MMAP_BLOCK_BITS);
|
||||
|
||||
var write_func32 = this.memory_map_write32[aligned_addr];
|
||||
write_func32(addr, value0);
|
||||
write_func32(addr + 4, value1);
|
||||
write_func32(addr + 8, value2);
|
||||
write_func32(addr + 12, value3);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Array.<number>|Uint8Array} blob
|
||||
* @param {number} offset
|
||||
*/
|
||||
CPU.prototype.write_blob = function(blob, offset)
|
||||
{
|
||||
dbg_assert(blob && blob.length >= 0);
|
||||
|
||||
if(blob.length)
|
||||
{
|
||||
dbg_assert(!this.in_mapped_range(offset));
|
||||
dbg_assert(!this.in_mapped_range(offset + blob.length - 1));
|
||||
|
||||
this.jit_dirty_cache(offset, offset + blob.length);
|
||||
this.mem8.set(blob, offset);
|
||||
}
|
||||
};
|
||||
|
||||
CPU.prototype.read_blob = function(offset, length)
|
||||
{
|
||||
if(length)
|
||||
{
|
||||
dbg_assert(!this.in_mapped_range(offset));
|
||||
dbg_assert(!this.in_mapped_range(offset + length - 1));
|
||||
}
|
||||
return this.mem8.subarray(offset, offset + length);
|
||||
};
|
||||
|
||||
CPU.prototype.clear_opstats = function()
|
||||
{
|
||||
new Uint8Array(this.wasm_memory.buffer, 0x8000, 0x20000).fill(0);
|
||||
|
|
|
|||
102
src/memory.js
102
src/memory.js
|
|
@ -1,102 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
import { MMAP_BLOCK_BITS } from "./const.js";
|
||||
import { CPU } from "./cpu.js";
|
||||
import { dbg_assert } from "./log.js";
|
||||
|
||||
|
||||
CPU.prototype.mmap_read8 = function(addr)
|
||||
{
|
||||
const value = this.memory_map_read8[addr >>> MMAP_BLOCK_BITS](addr);
|
||||
dbg_assert(value >= 0 && value <= 0xFF);
|
||||
return value;
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write8 = function(addr, value)
|
||||
{
|
||||
dbg_assert(value >= 0 && value <= 0xFF);
|
||||
this.memory_map_write8[addr >>> MMAP_BLOCK_BITS](addr, value);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_read16 = function(addr)
|
||||
{
|
||||
var fn = this.memory_map_read8[addr >>> MMAP_BLOCK_BITS];
|
||||
const value = fn(addr) | fn(addr + 1 | 0) << 8;
|
||||
dbg_assert(value >= 0 && value <= 0xFFFF);
|
||||
return value;
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write16 = function(addr, value)
|
||||
{
|
||||
var fn = this.memory_map_write8[addr >>> MMAP_BLOCK_BITS];
|
||||
|
||||
dbg_assert(value >= 0 && value <= 0xFFFF);
|
||||
fn(addr, value & 0xFF);
|
||||
fn(addr + 1 | 0, value >> 8);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_read32 = function(addr)
|
||||
{
|
||||
var aligned_addr = addr >>> MMAP_BLOCK_BITS;
|
||||
|
||||
return this.memory_map_read32[aligned_addr](addr);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write32 = function(addr, value)
|
||||
{
|
||||
var aligned_addr = addr >>> MMAP_BLOCK_BITS;
|
||||
|
||||
this.memory_map_write32[aligned_addr](addr, value);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write64 = function(addr, value0, value1)
|
||||
{
|
||||
var aligned_addr = addr >>> MMAP_BLOCK_BITS;
|
||||
// This should hold since writes across pages are split up
|
||||
dbg_assert(aligned_addr === (addr + 7) >>> MMAP_BLOCK_BITS);
|
||||
|
||||
var write_func32 = this.memory_map_write32[aligned_addr];
|
||||
write_func32(addr, value0);
|
||||
write_func32(addr + 4, value1);
|
||||
};
|
||||
|
||||
CPU.prototype.mmap_write128 = function(addr, value0, value1, value2, value3)
|
||||
{
|
||||
var aligned_addr = addr >>> MMAP_BLOCK_BITS;
|
||||
// This should hold since writes across pages are split up
|
||||
dbg_assert(aligned_addr === (addr + 12) >>> MMAP_BLOCK_BITS);
|
||||
|
||||
var write_func32 = this.memory_map_write32[aligned_addr];
|
||||
write_func32(addr, value0);
|
||||
write_func32(addr + 4, value1);
|
||||
write_func32(addr + 8, value2);
|
||||
write_func32(addr + 12, value3);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Array.<number>|Uint8Array} blob
|
||||
* @param {number} offset
|
||||
*/
|
||||
CPU.prototype.write_blob = function(blob, offset)
|
||||
{
|
||||
dbg_assert(blob && blob.length >= 0);
|
||||
|
||||
if(blob.length)
|
||||
{
|
||||
dbg_assert(!this.in_mapped_range(offset));
|
||||
dbg_assert(!this.in_mapped_range(offset + blob.length - 1));
|
||||
|
||||
this.jit_dirty_cache(offset, offset + blob.length);
|
||||
this.mem8.set(blob, offset);
|
||||
}
|
||||
};
|
||||
|
||||
CPU.prototype.read_blob = function(offset, length)
|
||||
{
|
||||
if(length)
|
||||
{
|
||||
dbg_assert(!this.in_mapped_range(offset));
|
||||
dbg_assert(!this.in_mapped_range(offset + length - 1));
|
||||
}
|
||||
return this.mem8.subarray(offset, offset + length);
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue