68 lines
1.9 KiB
JavaScript
Executable file
68 lines
1.9 KiB
JavaScript
Executable file
#!/usr/bin/env node
|
|
"use strict";
|
|
|
|
const QEMU = "qemu-system-x86_64";
|
|
|
|
const assert = require("assert").strict;
|
|
const fs = require("fs");
|
|
const { spawn, spawnSync } = require("child_process");
|
|
const path = require("path");
|
|
|
|
const share_dir_9p = fs.mkdtempSync("/tmp/v86-test-qemu-9p");
|
|
|
|
fs.copyFileSync(path.join(__dirname, "/test-i386"), path.join(share_dir_9p, "/test-i386"));
|
|
|
|
const qemu_version = spawnSync(QEMU, ["--version"]);
|
|
assert(qemu_version.status === 0, "QEMU not found, return code: " + qemu_version.status);
|
|
console.error("Using QEMU:");
|
|
console.error(qemu_version.stdout.toString("utf8"));
|
|
|
|
const qemu = spawn(QEMU,
|
|
[
|
|
"-serial", "stdio",
|
|
"-cdrom", path.join(__dirname, "/../../images/linux4.iso"),
|
|
"-device", "virtio-9p-pci,fsdev=fs9p,mount_tag=host9p",
|
|
"-fsdev", `local,id=fs9p,path=${share_dir_9p},security_model=none`,
|
|
"-display", "none",
|
|
"-cpu", "Westmere", // default doesn't support popcnt
|
|
|
|
//"-monitor", "telnet:127.0.0.1:1235,server,nowait",
|
|
]
|
|
);
|
|
|
|
let qemu_output = "";
|
|
let ran_command = false;
|
|
let finished = false;
|
|
|
|
qemu.stdout.on("data", data => {
|
|
process.stderr.write(data);
|
|
qemu_output += data.toString().replace(/\r/, "");
|
|
|
|
if(!ran_command && qemu_output.endsWith("~% "))
|
|
{
|
|
ran_command = true;
|
|
qemu.stdin.write("chmod +x /mnt/test-i386\n");
|
|
qemu.stdin.write("/mnt/test-i386 > /mnt/result\n");
|
|
qemu.stdin.write("echo test fini''shed\n");
|
|
}
|
|
|
|
if(ran_command && !finished && qemu_output.includes("test finished"))
|
|
{
|
|
const result_file = path.join(share_dir_9p, "result");
|
|
|
|
finished = true;
|
|
console.error("Finished");
|
|
process.stdout.write(fs.readFileSync(result_file));
|
|
|
|
fs.unlinkSync(result_file);
|
|
fs.unlinkSync(path.join(share_dir_9p, "test-i386"));
|
|
fs.rmdirSync(share_dir_9p);
|
|
|
|
qemu.kill();
|
|
}
|
|
});
|
|
|
|
qemu.stderr.on("data", data => {
|
|
process.stderr.write(data);
|
|
});
|