├── chrome-bug ├── README.md ├── bios-256k.bin ├── efi-e1000.rom ├── kvmvapic.bin ├── linuxboot_dma.bin ├── memtest86+.elf ├── multiboot.bin ├── openwrt-18.06.0-rc2-x86-generic-vmlinuz ├── presets.json ├── qemu-loader.js ├── qemu-system-i386.js ├── qemu-system-i386.wasm ├── shell.html ├── stats.json └── vgabios-stdvga.bin ├── index.html ├── kolibri.raw ├── new ├── README.md ├── bios-256k.bin ├── efi-e1000.rom ├── kvmvapic.bin ├── linuxboot_dma.bin ├── memtest86+.elf ├── multiboot.bin ├── openwrt-18.06.0-rc2-x86-generic-vmlinuz ├── presets.json ├── qemu-loader.js ├── qemu-system-i386.js ├── qemu-system-i386.wasm ├── shell.html ├── stats.json └── vgabios-stdvga.bin ├── openwrt-10.03.1-x86-generic-combined-squashfs.raw ├── openwrt-15.05.1-malta-be-vmlinux-initramfs.elf ├── openwrt-15.05.1-malta-be-vmlinux.elf ├── presets.json ├── qemu-system-i386.data ├── qemu-system-i386.html.mem ├── qemu-system-i386.js ├── qemu-system-mips.data ├── qemu-system-mips.html.mem └── qemu-system-mips.js /chrome-bug/README.md: -------------------------------------------------------------------------------- 1 | Test of Binaryen TCG backend -------------------------------------------------------------------------------- /chrome-bug/bios-256k.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/chrome-bug/bios-256k.bin -------------------------------------------------------------------------------- /chrome-bug/efi-e1000.rom: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/chrome-bug/efi-e1000.rom -------------------------------------------------------------------------------- /chrome-bug/kvmvapic.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/chrome-bug/kvmvapic.bin -------------------------------------------------------------------------------- /chrome-bug/linuxboot_dma.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/chrome-bug/linuxboot_dma.bin -------------------------------------------------------------------------------- /chrome-bug/memtest86+.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/chrome-bug/memtest86+.elf -------------------------------------------------------------------------------- /chrome-bug/multiboot.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/chrome-bug/multiboot.bin -------------------------------------------------------------------------------- /chrome-bug/openwrt-18.06.0-rc2-x86-generic-vmlinuz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/chrome-bug/openwrt-18.06.0-rc2-x86-generic-vmlinuz -------------------------------------------------------------------------------- /chrome-bug/presets.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": { 3 | "_type": "select", 4 | "_title": "QEMU target", 5 | "x86": [ 6 | { 7 | "js": "qemu-system-i386.js", 8 | "emterpreter-bc": "qemu-system-i386.emterpreter", 9 | "args": [ 10 | "-serial", "none", 11 | "-parallel", "none", 12 | "-monitor", "none" 13 | ] 14 | }, 15 | { 16 | "_type": "checkbox", 17 | "_title": "Dummy network", 18 | "iftrue": { 19 | "files": [ "efi-e1000.rom" ] 20 | }, 21 | "iffalse": { 22 | "args": [ "-net", "none", "-tb-size", "1"] 23 | } 24 | }, 25 | { 26 | "files": [ 27 | "bios-256k.bin", 28 | "vgabios-stdvga.bin", 29 | "multiboot.bin", 30 | "kvmvapic.bin" 31 | ] 32 | }, 33 | { 34 | "_type": "select", 35 | "_title": "OS", 36 | "Memtest86+": { 37 | "files": [ "memtest86+.elf" ], 38 | "args": [ "-kernel", "memtest86+.elf"] 39 | }, 40 | "OpenWRT": { 41 | "files": [ "openwrt-18.06.0-rc2-x86-generic-vmlinuz", "linuxboot_dma.bin" ], 42 | "args": [ "-kernel", "openwrt-18.06.0-rc2-x86-generic-vmlinuz" ] 43 | } 44 | } 45 | ] 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /chrome-bug/qemu-loader.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function config_update_progress() { 4 | var unknown = false; 5 | var loaded = 0; 6 | var total = 0; 7 | for (var i = 0; i < config_xhr.length; ++i) { 8 | var progress = config_xhr[i].last_progress; 9 | if (!progress || !progress.lengthComputable) { 10 | unknown = true; 11 | } else { 12 | loaded += progress.loaded; 13 | total += progress.total; 14 | } 15 | } 16 | if (unknown) { 17 | Module.setStatus('Loading...'); 18 | } else { 19 | Module.setStatus('Loaded ' + ((loaded / 1e6)|0) + ' Mb (' + loaded + '/' + total + ')'); 20 | } 21 | } 22 | 23 | function config_load_file(name, format, onload) { 24 | var xhr = new XMLHttpRequest(); 25 | 26 | if (window.config_xhr === false) { 27 | return; // an error already occurred 28 | } 29 | if (!window.config_xhr) { 30 | window.config_xhr = []; 31 | config_xhr.done = 0; 32 | } 33 | config_xhr.push(xhr); 34 | 35 | xhr._real_onload = onload; 36 | xhr.addEventListener('progress', function(event) { 37 | xhr.last_progress = event; 38 | config_update_progress(); 39 | }); 40 | function loaded(event) { 41 | if (config_xhr === false) 42 | return; 43 | config_xhr.done += 1; 44 | if (config_xhr.length == config_xhr.done && window.config_on_load) { 45 | Module.setStatus(''); 46 | for (var i = 0; i < config_xhr.length; ++i) { 47 | config_xhr[i]._real_onload(config_xhr[i].response); 48 | } 49 | config_on_load(); 50 | window.config_xhr = null; 51 | window.config_on_load = null; 52 | } 53 | }; 54 | function failed(event) { 55 | for (var i = 0; i < config_xhr.length; ++i) 56 | config_xhr[i].abort(); 57 | window.config_xhr = false; 58 | Module.setStatus('Cannot download ' + name); 59 | }; 60 | xhr.addEventListener('load', loaded); 61 | xhr.addEventListener('error', failed); 62 | xhr.open('GET', name); 63 | xhr.responseType = format; 64 | xhr.send(null); 65 | } 66 | 67 | function initialize_qemu_shell() { 68 | config_load_file('presets.json', 'json', function(response) { 69 | window.qemu_presets = response; 70 | }); 71 | config_load_file('stats.json', 'json', function(response) { 72 | window.qemu_stats = response; 73 | }); 74 | window.config_on_load = update_menu; 75 | } 76 | 77 | function initialize_size_hints() { 78 | 79 | } 80 | 81 | function fixup_opts(opts) { 82 | if (Array.isArray(opts)) { 83 | opts = { 84 | "_type": "coll", 85 | "vals": opts 86 | }; 87 | } 88 | if (!opts['_type']) { 89 | opts['_type'] = 'leaf'; 90 | } 91 | return opts; 92 | } 93 | 94 | function create_config_node(elem) { 95 | var opts = elem._opts; 96 | var type = opts['_type']; 97 | 98 | var title = opts['_title']; 99 | if (title) { 100 | var titleElement = document.createElement('span'); 101 | titleElement.innerHTML = title; 102 | elem.appendChild(titleElement); 103 | } 104 | 105 | if (type == 'select') { 106 | var selectElement = document.createElement('select'); 107 | selectElement.onchange = function() { config_node_changed(elem); } 108 | var keys = Object.keys(opts); 109 | for (var i = 0; i < keys.length; ++i) { 110 | var k = keys[i]; 111 | if (k[0] == '_') 112 | continue; 113 | 114 | var opt = new Option(k); 115 | opt.selected = i == 0; 116 | opt._val = opts[k]; 117 | selectElement.add(opt); 118 | } 119 | elem._select = selectElement; 120 | elem.append(selectElement); 121 | elem._content = document.createElement('div') 122 | elem.append(elem._content); 123 | } else if (type == 'checkbox') { 124 | var checkboxElement = document.createElement('input'); 125 | checkboxElement.onchange = function() { config_node_changed(elem); } 126 | checkboxElement.type = 'checkbox'; 127 | checkboxElement.value = title; 128 | elem._checkbox = checkboxElement; 129 | elem.append(checkboxElement); 130 | elem._content = document.createElement('div') 131 | elem.append(elem._content); 132 | } else if (type == 'coll') { 133 | var vals = opts['vals']; 134 | elem._contents = []; 135 | for (var i = 0; i < vals.length; ++i) { 136 | var x = document.createElement('div'); 137 | elem._contents.push(x); 138 | elem.append(x); 139 | populate_config_node(x, vals[i]); 140 | } 141 | } else if (type == 'leaf') { 142 | // do nothing 143 | } else { 144 | Module.printErr('Unknown config node type: ' + type); 145 | } 146 | config_node_changed(elem); 147 | } 148 | 149 | function config_node_changed(elem) { 150 | var opts = elem._opts; 151 | if (!opts) { 152 | Module.printErr('Updating config node without _opts!'); 153 | return; 154 | } 155 | var type = opts['_type']; 156 | 157 | if (type == 'select') { 158 | var selected = elem._select.options[elem._select.selectedIndex]; 159 | populate_config_node(elem._content, selected._val); 160 | } else if (type == 'checkbox') { 161 | populate_config_node(elem._content, elem._checkbox.checked ? opts['iftrue'] : opts['iffalse']); 162 | } 163 | } 164 | 165 | function populate_config_node(elem, opts, isRoot) { 166 | opts = fixup_opts(opts); 167 | if (elem._opts != opts) { 168 | while (elem.firstChild) { elem.removeChild(elem.firstChild); } 169 | elem._opts = opts; 170 | if (opts) { 171 | create_config_node(elem); 172 | } 173 | if (isRoot) { 174 | var runButtonElement = document.createElement('input'); 175 | runButtonElement.type = 'button'; 176 | runButtonElement.value = 'Download & run'; 177 | runButtonElement.onclick = run_program; 178 | elem.append(runButtonElement); 179 | } 180 | } 181 | } 182 | 183 | function update_menu() { 184 | var rootElement = document.getElementById('config__root'); 185 | populate_config_node(rootElement, qemu_presets['root'], true); 186 | } 187 | 188 | function config_parameters() { 189 | var rootElement = document.getElementById('config__root'); 190 | var args = []; 191 | var files = []; 192 | var js = ''; 193 | function recur(elem) { 194 | var i; 195 | var opts = elem._opts; 196 | if (opts && opts['_type'] == 'leaf') { 197 | if (opts.files) { 198 | for (i = 0; i < opts.files.length; ++i) 199 | files.push(opts.files[i]); 200 | } 201 | if (opts.args) { 202 | for (i = 0; i < opts.args.length; ++i) 203 | args.push(opts.args[i]); 204 | } 205 | if (opts.js) 206 | js = opts.js; 207 | } else { 208 | if (elem._content) { 209 | recur(elem._content); 210 | } 211 | if (elem._contents) { 212 | for (var i = 0; i < elem._contents.length; ++i) { 213 | recur(elem._contents[i]); 214 | } 215 | } 216 | } 217 | } 218 | recur(rootElement); 219 | return { 220 | 'js': js, 221 | 'files': files, 222 | 'args': args 223 | } 224 | } 225 | 226 | function config_load_js(jsname) { 227 | config_load_file(jsname, 'text', function(text) { 228 | var script = document.createElement('script'); 229 | script.text = text; 230 | document.body.appendChild(script); 231 | }); 232 | } 233 | 234 | function config_preload_file(name) { 235 | var fname = "//" + name; 236 | var ind = fname.lastIndexOf('/'); 237 | config_load_file(name, 'arraybuffer', function(data) { 238 | FS.createPath( 239 | '/', 240 | fname.substr(0, ind), 241 | true, 242 | true); 243 | FS.createDataFile( 244 | fname.substr(0, ind), 245 | fname.substr(ind + 1), 246 | new Int8Array(data), 247 | true, true, true 248 | ) 249 | }); 250 | } 251 | 252 | function run_program() { 253 | var how_to_run = config_parameters(); 254 | Module.printErr(JSON.stringify(how_to_run)); 255 | var files = how_to_run.files; 256 | config_load_js(how_to_run.js); 257 | for (var i = 0; i < files.length; ++i) { 258 | config_preload_file(files[i]); 259 | } 260 | window.config_on_load = function() { 261 | document.getElementById('startup').style.display = 'none'; 262 | document.getElementById('started').style.display = 'block'; 263 | 264 | Module.onRuntimeInitialized = function () { 265 | Module.callMain(how_to_run.args); 266 | }; 267 | }; 268 | } 269 | 270 | initialize_qemu_shell(); 271 | -------------------------------------------------------------------------------- /chrome-bug/qemu-system-i386.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/chrome-bug/qemu-system-i386.wasm -------------------------------------------------------------------------------- /chrome-bug/stats.json: -------------------------------------------------------------------------------- 1 | { 2 | } 3 | -------------------------------------------------------------------------------- /chrome-bug/vgabios-stdvga.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/chrome-bug/vgabios-stdvga.bin -------------------------------------------------------------------------------- /kolibri.raw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/kolibri.raw -------------------------------------------------------------------------------- /new/README.md: -------------------------------------------------------------------------------- 1 | Test of Binaryen TCG backend -------------------------------------------------------------------------------- /new/bios-256k.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/new/bios-256k.bin -------------------------------------------------------------------------------- /new/efi-e1000.rom: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/new/efi-e1000.rom -------------------------------------------------------------------------------- /new/kvmvapic.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/new/kvmvapic.bin -------------------------------------------------------------------------------- /new/linuxboot_dma.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/new/linuxboot_dma.bin -------------------------------------------------------------------------------- /new/memtest86+.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/new/memtest86+.elf -------------------------------------------------------------------------------- /new/multiboot.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/new/multiboot.bin -------------------------------------------------------------------------------- /new/openwrt-18.06.0-rc2-x86-generic-vmlinuz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/new/openwrt-18.06.0-rc2-x86-generic-vmlinuz -------------------------------------------------------------------------------- /new/presets.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": { 3 | "_type": "select", 4 | "_title": "QEMU target", 5 | "x86": [ 6 | { 7 | "js": "qemu-system-i386.js", 8 | "emterpreter-bc": "qemu-system-i386.emterpreter", 9 | "args": [ 10 | "-serial", "none", 11 | "-parallel", "none", 12 | "-monitor", "none" 13 | ] 14 | }, 15 | { 16 | "_type": "checkbox", 17 | "_title": "Dummy network", 18 | "iftrue": { 19 | "files": [ "efi-e1000.rom" ] 20 | }, 21 | "iffalse": { 22 | "args": [ "-net", "none", "-tb-size", "1"] 23 | } 24 | }, 25 | { 26 | "files": [ 27 | "bios-256k.bin", 28 | "vgabios-stdvga.bin", 29 | "multiboot.bin", 30 | "kvmvapic.bin" 31 | ] 32 | }, 33 | { 34 | "_type": "select", 35 | "_title": "OS", 36 | "Memtest86+": { 37 | "files": [ "memtest86+.elf" ], 38 | "args": [ "-kernel", "memtest86+.elf"] 39 | }, 40 | "OpenWRT": { 41 | "files": [ "openwrt-18.06.0-rc2-x86-generic-vmlinuz", "linuxboot_dma.bin" ], 42 | "args": [ "-kernel", "openwrt-18.06.0-rc2-x86-generic-vmlinuz" ] 43 | } 44 | } 45 | ] 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /new/qemu-loader.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function config_update_progress() { 4 | var unknown = false; 5 | var loaded = 0; 6 | var total = 0; 7 | for (var i = 0; i < config_xhr.length; ++i) { 8 | var progress = config_xhr[i].last_progress; 9 | if (!progress || !progress.lengthComputable) { 10 | unknown = true; 11 | } else { 12 | loaded += progress.loaded; 13 | total += progress.total; 14 | } 15 | } 16 | if (unknown) { 17 | Module.setStatus('Loading...'); 18 | } else { 19 | Module.setStatus('Loaded ' + ((loaded / 1e6)|0) + ' Mb (' + loaded + '/' + total + ')'); 20 | } 21 | } 22 | 23 | function config_load_file(name, format, onload) { 24 | var xhr = new XMLHttpRequest(); 25 | 26 | if (window.config_xhr === false) { 27 | return; // an error already occurred 28 | } 29 | if (!window.config_xhr) { 30 | window.config_xhr = []; 31 | config_xhr.done = 0; 32 | } 33 | config_xhr.push(xhr); 34 | 35 | xhr._real_onload = onload; 36 | xhr.addEventListener('progress', function(event) { 37 | xhr.last_progress = event; 38 | config_update_progress(); 39 | }); 40 | function loaded(event) { 41 | if (config_xhr === false) 42 | return; 43 | config_xhr.done += 1; 44 | if (config_xhr.length == config_xhr.done && window.config_on_load) { 45 | Module.setStatus(''); 46 | for (var i = 0; i < config_xhr.length; ++i) { 47 | config_xhr[i]._real_onload(config_xhr[i].response); 48 | } 49 | config_on_load(); 50 | window.config_xhr = null; 51 | window.config_on_load = null; 52 | } 53 | }; 54 | function failed(event) { 55 | for (var i = 0; i < config_xhr.length; ++i) 56 | config_xhr[i].abort(); 57 | window.config_xhr = false; 58 | Module.setStatus('Cannot download ' + name); 59 | }; 60 | xhr.addEventListener('load', loaded); 61 | xhr.addEventListener('error', failed); 62 | xhr.open('GET', name); 63 | xhr.responseType = format; 64 | xhr.send(null); 65 | } 66 | 67 | function initialize_qemu_shell() { 68 | config_load_file('presets.json', 'json', function(response) { 69 | window.qemu_presets = response; 70 | }); 71 | config_load_file('stats.json', 'json', function(response) { 72 | window.qemu_stats = response; 73 | }); 74 | window.config_on_load = update_menu; 75 | } 76 | 77 | function initialize_size_hints() { 78 | 79 | } 80 | 81 | function fixup_opts(opts) { 82 | if (Array.isArray(opts)) { 83 | opts = { 84 | "_type": "coll", 85 | "vals": opts 86 | }; 87 | } 88 | if (!opts['_type']) { 89 | opts['_type'] = 'leaf'; 90 | } 91 | return opts; 92 | } 93 | 94 | function create_config_node(elem) { 95 | var opts = elem._opts; 96 | var type = opts['_type']; 97 | 98 | var title = opts['_title']; 99 | if (title) { 100 | var titleElement = document.createElement('span'); 101 | titleElement.innerHTML = title; 102 | elem.appendChild(titleElement); 103 | } 104 | 105 | if (type == 'select') { 106 | var selectElement = document.createElement('select'); 107 | selectElement.onchange = function() { config_node_changed(elem); } 108 | var keys = Object.keys(opts); 109 | for (var i = 0; i < keys.length; ++i) { 110 | var k = keys[i]; 111 | if (k[0] == '_') 112 | continue; 113 | 114 | var opt = new Option(k); 115 | opt.selected = i == 0; 116 | opt._val = opts[k]; 117 | selectElement.add(opt); 118 | } 119 | elem._select = selectElement; 120 | elem.append(selectElement); 121 | elem._content = document.createElement('div') 122 | elem.append(elem._content); 123 | } else if (type == 'checkbox') { 124 | var checkboxElement = document.createElement('input'); 125 | checkboxElement.onchange = function() { config_node_changed(elem); } 126 | checkboxElement.type = 'checkbox'; 127 | checkboxElement.value = title; 128 | elem._checkbox = checkboxElement; 129 | elem.append(checkboxElement); 130 | elem._content = document.createElement('div') 131 | elem.append(elem._content); 132 | } else if (type == 'coll') { 133 | var vals = opts['vals']; 134 | elem._contents = []; 135 | for (var i = 0; i < vals.length; ++i) { 136 | var x = document.createElement('div'); 137 | elem._contents.push(x); 138 | elem.append(x); 139 | populate_config_node(x, vals[i]); 140 | } 141 | } else if (type == 'leaf') { 142 | // do nothing 143 | } else { 144 | Module.printErr('Unknown config node type: ' + type); 145 | } 146 | config_node_changed(elem); 147 | } 148 | 149 | function config_node_changed(elem) { 150 | var opts = elem._opts; 151 | if (!opts) { 152 | Module.printErr('Updating config node without _opts!'); 153 | return; 154 | } 155 | var type = opts['_type']; 156 | 157 | if (type == 'select') { 158 | var selected = elem._select.options[elem._select.selectedIndex]; 159 | populate_config_node(elem._content, selected._val); 160 | } else if (type == 'checkbox') { 161 | populate_config_node(elem._content, elem._checkbox.checked ? opts['iftrue'] : opts['iffalse']); 162 | } 163 | } 164 | 165 | function populate_config_node(elem, opts, isRoot) { 166 | opts = fixup_opts(opts); 167 | if (elem._opts != opts) { 168 | while (elem.firstChild) { elem.removeChild(elem.firstChild); } 169 | elem._opts = opts; 170 | if (opts) { 171 | create_config_node(elem); 172 | } 173 | if (isRoot) { 174 | var runButtonElement = document.createElement('input'); 175 | runButtonElement.type = 'button'; 176 | runButtonElement.value = 'Download & run'; 177 | runButtonElement.onclick = run_program; 178 | elem.append(runButtonElement); 179 | } 180 | } 181 | } 182 | 183 | function update_menu() { 184 | var rootElement = document.getElementById('config__root'); 185 | populate_config_node(rootElement, qemu_presets['root'], true); 186 | } 187 | 188 | function config_parameters() { 189 | var rootElement = document.getElementById('config__root'); 190 | var args = []; 191 | var files = []; 192 | var js = ''; 193 | function recur(elem) { 194 | var i; 195 | var opts = elem._opts; 196 | if (opts && opts['_type'] == 'leaf') { 197 | if (opts.files) { 198 | for (i = 0; i < opts.files.length; ++i) 199 | files.push(opts.files[i]); 200 | } 201 | if (opts.args) { 202 | for (i = 0; i < opts.args.length; ++i) 203 | args.push(opts.args[i]); 204 | } 205 | if (opts.js) 206 | js = opts.js; 207 | } else { 208 | if (elem._content) { 209 | recur(elem._content); 210 | } 211 | if (elem._contents) { 212 | for (var i = 0; i < elem._contents.length; ++i) { 213 | recur(elem._contents[i]); 214 | } 215 | } 216 | } 217 | } 218 | recur(rootElement); 219 | return { 220 | 'js': js, 221 | 'files': files, 222 | 'args': args 223 | } 224 | } 225 | 226 | function config_load_js(jsname) { 227 | config_load_file(jsname, 'text', function(text) { 228 | var script = document.createElement('script'); 229 | script.text = text; 230 | document.body.appendChild(script); 231 | }); 232 | } 233 | 234 | function config_preload_file(name) { 235 | var fname = "//" + name; 236 | var ind = fname.lastIndexOf('/'); 237 | config_load_file(name, 'arraybuffer', function(data) { 238 | FS.createPath( 239 | '/', 240 | fname.substr(0, ind), 241 | true, 242 | true); 243 | FS.createDataFile( 244 | fname.substr(0, ind), 245 | fname.substr(ind + 1), 246 | new Int8Array(data), 247 | true, true, true 248 | ) 249 | }); 250 | } 251 | 252 | function run_program() { 253 | var how_to_run = config_parameters(); 254 | Module.printErr(JSON.stringify(how_to_run)); 255 | var files = how_to_run.files; 256 | config_load_js(how_to_run.js); 257 | for (var i = 0; i < files.length; ++i) { 258 | config_preload_file(files[i]); 259 | } 260 | window.config_on_load = function() { 261 | document.getElementById('startup').style.display = 'none'; 262 | document.getElementById('started').style.display = 'block'; 263 | 264 | Module.onRuntimeInitialized = function () { 265 | Module.callMain(how_to_run.args); 266 | }; 267 | }; 268 | } 269 | 270 | initialize_qemu_shell(); 271 | -------------------------------------------------------------------------------- /new/qemu-system-i386.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atrosinenko/qemujs-demo/11f4fbfdbf06deb1eb7b516203177217d2883665/new/qemu-system-i386.wasm -------------------------------------------------------------------------------- /new/shell.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |