Browse Source

fix save state fails with large memory size (fix #960)

Fabian 4 months ago
parent
commit
8372a0d964
3 changed files with 37 additions and 29 deletions
  1. 1 0
      src/lib.js
  2. 1 1
      src/vga.js
  3. 35 28
      tests/api/state.js

+ 1 - 0
src/lib.js

@@ -34,6 +34,7 @@ v86util.range = function(size)
 
 v86util.view = function(constructor, memory, offset, length)
 {
+    dbg_assert(offset >= 0);
     return new Proxy({},
         {
             get: function(target, property, receiver)

+ 1 - 1
src/vga.js

@@ -362,7 +362,7 @@ function VGAScreen(cpu, bus, vga_memory_size)
     }
 
 
-    const vga_offset = cpu.svga_allocate_memory(this.vga_memory_size);
+    const vga_offset = cpu.svga_allocate_memory(this.vga_memory_size) >>> 0;
     this.svga_memory = v86util.view(Uint8Array, cpu.wasm_memory, vga_offset, this.vga_memory_size);
 
     this.diff_addr_min = this.vga_memory_size;

+ 35 - 28
tests/api/state.js

@@ -44,36 +44,43 @@ const config_filesystem = {
     log_level: 0,
 };
 
-function run_test(name, config, done)
+const config_large_memory = {
+    bios: { url: __dirname + "/../../bios/seabios.bin" },
+    vga_bios: { url: __dirname + "/../../bios/vgabios.bin" },
+    cdrom: { url: __dirname + "/../../images/linux4.iso", async: true },
+    autostart: true,
+    memory_size: 2048 * 1024 * 1024,
+    vga_memory_size: 512 * 1024 * 1024,
+    network_relay_url: "<UNUSED>",
+    disable_jit: +process.env.DISABLE_JIT,
+    log_level: 0,
+};
+
+async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
+
+async function run_test(name, config, done)
 {
     const emulator = new V86(config);
 
-    setTimeout(async function()
-        {
-            console.log("Saving: %s", name);
-            const state = await emulator.save_state();
-
-            setTimeout(async function()
-                {
-                    console.log("Restoring: %s", name);
-                    await emulator.restore_state(state);
-
-                    setTimeout(function()
-                        {
-                            console.log("Done: %s", name);
-                            emulator.stop();
-                            done && done();
-                        }, 1000);
-                }, 1000);
-        }, 5000);
+    await sleep(5000);
+
+    console.log("Saving: %s", name);
+    const state = await emulator.save_state();
+
+    await sleep(1000);
+
+    console.log("Restoring: %s", name);
+    await emulator.restore_state(state);
+
+    await sleep(1000);
+
+    console.log("Done: %s", name);
+    emulator.stop();
 }
 
-run_test("async cdrom", config_async_cdrom, function()
-    {
-        run_test("sync cdrom", config_sync_cdrom, function()
-        {
-            run_test("filesystem", config_filesystem, function()
-            {
-            });
-        });
-    });
+(async function() {
+    await run_test("async cdrom", config_async_cdrom);
+    await run_test("sync cdrom", config_sync_cdrom);
+    await run_test("filesystem", config_filesystem);
+    await run_test("large memory size", config_large_memory);
+})();