diff --git a/Makefile b/Makefile index c2d9875d..8914e144 100644 --- a/Makefile +++ b/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 \ diff --git a/src/browser/starter.js b/src/browser/starter.js index 5c0de3c2..606ba062 100644 --- a/src/browser/starter.js +++ b/src/browser/starter.js @@ -27,7 +27,6 @@ import { EEXIST, ENOENT } from "../../lib/9p.js"; // Decorates CPU -import "../memory.js"; import "../state.js"; /** diff --git a/src/cpu.js b/src/cpu.js index 4f55e064..e92f8604 100644 --- a/src/cpu.js +++ b/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.|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); diff --git a/src/memory.js b/src/memory.js deleted file mode 100644 index 521ec189..00000000 --- a/src/memory.js +++ /dev/null @@ -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.|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); -};