@aptre/v86 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +22 -0
  2. package/LICENSE.MIT +22 -0
  3. package/Readme.md +237 -0
  4. package/dist/v86.browser.js +26666 -0
  5. package/dist/v86.browser.js.map +7 -0
  6. package/dist/v86.js +26632 -0
  7. package/dist/v86.js.map +7 -0
  8. package/gen/generate_analyzer.ts +512 -0
  9. package/gen/generate_interpreter.ts +522 -0
  10. package/gen/generate_jit.ts +624 -0
  11. package/gen/rust_ast.ts +107 -0
  12. package/gen/util.ts +35 -0
  13. package/gen/x86_table.ts +1836 -0
  14. package/lib/9p.ts +1547 -0
  15. package/lib/filesystem.ts +1879 -0
  16. package/lib/marshall.ts +168 -0
  17. package/lib/softfloat/softfloat.c +32501 -0
  18. package/lib/zstd/zstddeclib.c +13520 -0
  19. package/package.json +75 -0
  20. package/src/acpi.ts +267 -0
  21. package/src/browser/dummy_screen.ts +106 -0
  22. package/src/browser/fake_network.ts +1771 -0
  23. package/src/browser/fetch_network.ts +361 -0
  24. package/src/browser/filestorage.ts +124 -0
  25. package/src/browser/inbrowser_network.ts +57 -0
  26. package/src/browser/keyboard.ts +564 -0
  27. package/src/browser/main.ts +3415 -0
  28. package/src/browser/mouse.ts +255 -0
  29. package/src/browser/network.ts +142 -0
  30. package/src/browser/print_stats.ts +336 -0
  31. package/src/browser/screen.ts +978 -0
  32. package/src/browser/serial.ts +316 -0
  33. package/src/browser/speaker.ts +1223 -0
  34. package/src/browser/starter.ts +1688 -0
  35. package/src/browser/wisp_network.ts +332 -0
  36. package/src/browser/worker_bus.ts +64 -0
  37. package/src/buffer.ts +652 -0
  38. package/src/bus.ts +78 -0
  39. package/src/const.ts +128 -0
  40. package/src/cpu.ts +2891 -0
  41. package/src/dma.ts +474 -0
  42. package/src/elf.ts +251 -0
  43. package/src/floppy.ts +1778 -0
  44. package/src/ide.ts +3455 -0
  45. package/src/io.ts +504 -0
  46. package/src/iso9660.ts +317 -0
  47. package/src/kernel.ts +250 -0
  48. package/src/lib.ts +645 -0
  49. package/src/log.ts +149 -0
  50. package/src/main.ts +199 -0
  51. package/src/ne2k.ts +1589 -0
  52. package/src/pci.ts +815 -0
  53. package/src/pit.ts +406 -0
  54. package/src/ps2.ts +820 -0
  55. package/src/rtc.ts +537 -0
  56. package/src/rust/analysis.rs +101 -0
  57. package/src/rust/codegen.rs +2660 -0
  58. package/src/rust/config.rs +3 -0
  59. package/src/rust/control_flow.rs +425 -0
  60. package/src/rust/cpu/apic.rs +658 -0
  61. package/src/rust/cpu/arith.rs +1207 -0
  62. package/src/rust/cpu/call_indirect.rs +2 -0
  63. package/src/rust/cpu/cpu.rs +4501 -0
  64. package/src/rust/cpu/fpu.rs +923 -0
  65. package/src/rust/cpu/global_pointers.rs +112 -0
  66. package/src/rust/cpu/instructions.rs +2486 -0
  67. package/src/rust/cpu/instructions_0f.rs +5261 -0
  68. package/src/rust/cpu/ioapic.rs +316 -0
  69. package/src/rust/cpu/memory.rs +351 -0
  70. package/src/rust/cpu/misc_instr.rs +613 -0
  71. package/src/rust/cpu/mod.rs +16 -0
  72. package/src/rust/cpu/modrm.rs +133 -0
  73. package/src/rust/cpu/pic.rs +402 -0
  74. package/src/rust/cpu/sse_instr.rs +361 -0
  75. package/src/rust/cpu/string.rs +701 -0
  76. package/src/rust/cpu/vga.rs +175 -0
  77. package/src/rust/cpu_context.rs +69 -0
  78. package/src/rust/dbg.rs +98 -0
  79. package/src/rust/gen/analyzer.rs +3807 -0
  80. package/src/rust/gen/analyzer0f.rs +3992 -0
  81. package/src/rust/gen/interpreter.rs +4447 -0
  82. package/src/rust/gen/interpreter0f.rs +5404 -0
  83. package/src/rust/gen/jit.rs +5080 -0
  84. package/src/rust/gen/jit0f.rs +5547 -0
  85. package/src/rust/gen/mod.rs +14 -0
  86. package/src/rust/jit.rs +2443 -0
  87. package/src/rust/jit_instructions.rs +7881 -0
  88. package/src/rust/js_api.rs +6 -0
  89. package/src/rust/leb.rs +46 -0
  90. package/src/rust/lib.rs +29 -0
  91. package/src/rust/modrm.rs +330 -0
  92. package/src/rust/opstats.rs +249 -0
  93. package/src/rust/page.rs +15 -0
  94. package/src/rust/paging.rs +25 -0
  95. package/src/rust/prefix.rs +15 -0
  96. package/src/rust/profiler.rs +155 -0
  97. package/src/rust/regs.rs +38 -0
  98. package/src/rust/softfloat.rs +286 -0
  99. package/src/rust/state_flags.rs +27 -0
  100. package/src/rust/wasmgen/mod.rs +2 -0
  101. package/src/rust/wasmgen/wasm_builder.rs +1047 -0
  102. package/src/rust/wasmgen/wasm_opcodes.rs +221 -0
  103. package/src/rust/zstd.rs +105 -0
  104. package/src/sb16.ts +1928 -0
  105. package/src/state.ts +359 -0
  106. package/src/uart.ts +472 -0
  107. package/src/vga.ts +2791 -0
  108. package/src/virtio.ts +1756 -0
  109. package/src/virtio_balloon.ts +273 -0
  110. package/src/virtio_console.ts +372 -0
  111. package/src/virtio_net.ts +326 -0
@@ -0,0 +1,221 @@
1
+ macro_rules! c {
2
+ ($x:ident, $y:expr) => {
3
+ #[allow(dead_code)]
4
+ pub const $x: u8 = $y;
5
+ };
6
+ }
7
+
8
+ // https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#high-level-structure
9
+ c!(WASM_VERSION, 0x1);
10
+
11
+ // Section codes
12
+ c!(SC_TYPE, 1);
13
+ c!(SC_IMPORT, 2);
14
+ c!(SC_FUNCTION, 3);
15
+ c!(SC_TABLE, 4);
16
+ c!(SC_MEMORY, 5);
17
+ c!(SC_GLOBAL, 6);
18
+ c!(SC_EXPORT, 7);
19
+ c!(SC_START, 8);
20
+ c!(SC_ELEMENT, 9);
21
+ c!(SC_CODE, 10);
22
+ c!(SC_DATA, 11);
23
+
24
+ // https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#language-types
25
+ c!(TYPE_I32, 0x7f);
26
+ c!(TYPE_I64, 0x7e);
27
+ c!(TYPE_F32, 0x7d);
28
+ c!(TYPE_F64, 0x7c);
29
+ c!(TYPE_ANYFUNC, 0x70);
30
+ c!(TYPE_FUNC, 0x60);
31
+ c!(TYPE_VOID_BLOCK, 0x40);
32
+
33
+ // https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#external_kind
34
+ c!(EXT_FUNCTION, 0);
35
+ c!(EXT_TABLE, 1);
36
+ c!(EXT_MEMORY, 2);
37
+ c!(EXT_GLOBAL, 3);
38
+
39
+ // Taken from wasm2ast's source code and modified with vim magic
40
+ c!(OP_UNREACHABLE, 0x00);
41
+ c!(OP_NOP, 0x01);
42
+ c!(OP_BLOCK, 0x02);
43
+ c!(OP_LOOP, 0x03);
44
+ c!(OP_IF, 0x04);
45
+ c!(OP_ELSE, 0x05);
46
+ c!(OP_TRY, 0x06);
47
+ c!(OP_CATCH, 0x07);
48
+ c!(OP_THROW, 0x08);
49
+ c!(OP_RETHROW, 0x09);
50
+ c!(OP_CATCHALL, 0x0a);
51
+ c!(OP_END, 0x0b);
52
+ c!(OP_BR, 0x0c);
53
+ c!(OP_BRIF, 0x0d);
54
+ c!(OP_BRTABLE, 0x0e);
55
+ c!(OP_RETURN, 0x0f);
56
+ c!(OP_CALL, 0x10);
57
+ c!(OP_CALLINDIRECT, 0x11);
58
+ c!(OP_DROP, 0x1a);
59
+ c!(OP_SELECT, 0x1b);
60
+ c!(OP_GETLOCAL, 0x20);
61
+ c!(OP_SETLOCAL, 0x21);
62
+ c!(OP_TEELOCAL, 0x22);
63
+ c!(OP_GETGLOBAL, 0x23);
64
+ c!(OP_SETGLOBAL, 0x24);
65
+ c!(OP_I32LOAD, 0x28);
66
+ c!(OP_I64LOAD, 0x29);
67
+ c!(OP_F32LOAD, 0x2a);
68
+ c!(OP_F64LOAD, 0x2b);
69
+ c!(OP_I32LOAD8S, 0x2c);
70
+ c!(OP_I32LOAD8U, 0x2d);
71
+ c!(OP_I32LOAD16S, 0x2e);
72
+ c!(OP_I32LOAD16U, 0x2f);
73
+ c!(OP_I64LOAD8S, 0x30);
74
+ c!(OP_I64LOAD8U, 0x31);
75
+ c!(OP_I64LOAD16S, 0x32);
76
+ c!(OP_I64LOAD16U, 0x33);
77
+ c!(OP_I64LOAD32S, 0x34);
78
+ c!(OP_I64LOAD32U, 0x35);
79
+ c!(OP_I32STORE, 0x36);
80
+ c!(OP_I64STORE, 0x37);
81
+ c!(OP_F32STORE, 0x38);
82
+ c!(OP_F64STORE, 0x39);
83
+ c!(OP_I32STORE8, 0x3a);
84
+ c!(OP_I32STORE16, 0x3b);
85
+ c!(OP_I64STORE8, 0x3c);
86
+ c!(OP_I64STORE16, 0x3d);
87
+ c!(OP_I64STORE32, 0x3e);
88
+ c!(OP_CURRENTMEMORY, 0x3f);
89
+ c!(OP_GROWMEMORY, 0x40);
90
+ c!(OP_I32CONST, 0x41);
91
+ c!(OP_I64CONST, 0x42);
92
+ c!(OP_F32CONST, 0x43);
93
+ c!(OP_F64CONST, 0x44);
94
+ c!(OP_I32EQZ, 0x45);
95
+ c!(OP_I32EQ, 0x46);
96
+ c!(OP_I32NE, 0x47);
97
+ c!(OP_I32LTS, 0x48);
98
+ c!(OP_I32LTU, 0x49);
99
+ c!(OP_I32GTS, 0x4a);
100
+ c!(OP_I32GTU, 0x4b);
101
+ c!(OP_I32LES, 0x4c);
102
+ c!(OP_I32LEU, 0x4d);
103
+ c!(OP_I32GES, 0x4e);
104
+ c!(OP_I32GEU, 0x4f);
105
+ c!(OP_I64EQZ, 0x50);
106
+ c!(OP_I64EQ, 0x51);
107
+ c!(OP_I64NE, 0x52);
108
+ c!(OP_I64LTS, 0x53);
109
+ c!(OP_I64LTU, 0x54);
110
+ c!(OP_I64GTS, 0x55);
111
+ c!(OP_I64GTU, 0x56);
112
+ c!(OP_I64LES, 0x57);
113
+ c!(OP_I64LEU, 0x58);
114
+ c!(OP_I64GES, 0x59);
115
+ c!(OP_I64GEU, 0x5a);
116
+ c!(OP_F32EQ, 0x5b);
117
+ c!(OP_F32NE, 0x5c);
118
+ c!(OP_F32LT, 0x5d);
119
+ c!(OP_F32GT, 0x5e);
120
+ c!(OP_F32LE, 0x5f);
121
+ c!(OP_F32GE, 0x60);
122
+ c!(OP_F64EQ, 0x61);
123
+ c!(OP_F64NE, 0x62);
124
+ c!(OP_F64LT, 0x63);
125
+ c!(OP_F64GT, 0x64);
126
+ c!(OP_F64LE, 0x65);
127
+ c!(OP_F64GE, 0x66);
128
+ c!(OP_I32CLZ, 0x67);
129
+ c!(OP_I32CTZ, 0x68);
130
+ c!(OP_I32POPCNT, 0x69);
131
+ c!(OP_I32ADD, 0x6a);
132
+ c!(OP_I32SUB, 0x6b);
133
+ c!(OP_I32MUL, 0x6c);
134
+ c!(OP_I32DIVS, 0x6d);
135
+ c!(OP_I32DIVU, 0x6e);
136
+ c!(OP_I32REMS, 0x6f);
137
+ c!(OP_I32REMU, 0x70);
138
+ c!(OP_I32AND, 0x71);
139
+ c!(OP_I32OR, 0x72);
140
+ c!(OP_I32XOR, 0x73);
141
+ c!(OP_I32SHL, 0x74);
142
+ c!(OP_I32SHRS, 0x75);
143
+ c!(OP_I32SHRU, 0x76);
144
+ c!(OP_I32ROTL, 0x77);
145
+ c!(OP_I32ROTR, 0x78);
146
+ c!(OP_I64CLZ, 0x79);
147
+ c!(OP_I64CTZ, 0x7a);
148
+ c!(OP_I64POPCNT, 0x7b);
149
+ c!(OP_I64ADD, 0x7c);
150
+ c!(OP_I64SUB, 0x7d);
151
+ c!(OP_I64MUL, 0x7e);
152
+ c!(OP_I64DIVS, 0x7f);
153
+ c!(OP_I64DIVU, 0x80);
154
+ c!(OP_I64REMS, 0x81);
155
+ c!(OP_I64REMU, 0x82);
156
+ c!(OP_I64AND, 0x83);
157
+ c!(OP_I64OR, 0x84);
158
+ c!(OP_I64XOR, 0x85);
159
+ c!(OP_I64SHL, 0x86);
160
+ c!(OP_I64SHRS, 0x87);
161
+ c!(OP_I64SHRU, 0x88);
162
+ c!(OP_I64ROTL, 0x89);
163
+ c!(OP_I64ROTR, 0x8a);
164
+ c!(OP_F32ABS, 0x8b);
165
+ c!(OP_F32NEG, 0x8c);
166
+ c!(OP_F32CEIL, 0x8d);
167
+ c!(OP_F32FLOOR, 0x8e);
168
+ c!(OP_F32TRUNC, 0x8f);
169
+ c!(OP_F32NEAREST, 0x90);
170
+ c!(OP_F32SQRT, 0x91);
171
+ c!(OP_F32ADD, 0x92);
172
+ c!(OP_F32SUB, 0x93);
173
+ c!(OP_F32MUL, 0x94);
174
+ c!(OP_F32DIV, 0x95);
175
+ c!(OP_F32MIN, 0x96);
176
+ c!(OP_F32MAX, 0x97);
177
+ c!(OP_F32COPYSIGN, 0x98);
178
+ c!(OP_F64ABS, 0x99);
179
+ c!(OP_F64NEG, 0x9a);
180
+ c!(OP_F64CEIL, 0x9b);
181
+ c!(OP_F64FLOOR, 0x9c);
182
+ c!(OP_F64TRUNC, 0x9d);
183
+ c!(OP_F64NEAREST, 0x9e);
184
+ c!(OP_F64SQRT, 0x9f);
185
+ c!(OP_F64ADD, 0xa0);
186
+ c!(OP_F64SUB, 0xa1);
187
+ c!(OP_F64MUL, 0xa2);
188
+ c!(OP_F64DIV, 0xa3);
189
+ c!(OP_F64MIN, 0xa4);
190
+ c!(OP_F64MAX, 0xa5);
191
+ c!(OP_F64COPYSIGN, 0xa6);
192
+ c!(OP_I32WRAPI64, 0xa7);
193
+ c!(OP_I32TRUNCSF32, 0xa8);
194
+ c!(OP_I32TRUNCUF32, 0xa9);
195
+ c!(OP_I32TRUNCSF64, 0xaa);
196
+ c!(OP_I32TRUNCUF64, 0xab);
197
+ c!(OP_I64EXTENDSI32, 0xac);
198
+ c!(OP_I64EXTENDUI32, 0xad);
199
+ c!(OP_I64TRUNCSF32, 0xae);
200
+ c!(OP_I64TRUNCUF32, 0xaf);
201
+ c!(OP_I64TRUNCSF64, 0xb0);
202
+ c!(OP_I64TRUNCUF64, 0xb1);
203
+ c!(OP_F32CONVERTSI32, 0xb2);
204
+ c!(OP_F32CONVERTUI32, 0xb3);
205
+ c!(OP_F32CONVERTSI64, 0xb4);
206
+ c!(OP_F32CONVERTUI64, 0xb5);
207
+ c!(OP_F32DEMOTEF64, 0xb6);
208
+ c!(OP_F64CONVERTSI32, 0xb7);
209
+ c!(OP_F64CONVERTUI32, 0xb8);
210
+ c!(OP_F64CONVERTSI64, 0xb9);
211
+ c!(OP_F64CONVERTUI64, 0xba);
212
+ c!(OP_F64PROMOTEF32, 0xbb);
213
+ c!(OP_I32REINTERPRETF32, 0xbc);
214
+ c!(OP_I64REINTERPRETF64, 0xbd);
215
+ c!(OP_F32REINTERPRETI32, 0xbe);
216
+ c!(OP_F64REINTERPRETI64, 0xbf);
217
+
218
+ c!(MEM_NO_ALIGN, 0);
219
+ c!(MEM_ALIGN16, 1);
220
+ c!(MEM_ALIGN32, 2);
221
+ c!(MEM_ALIGN64, 3);
@@ -0,0 +1,105 @@
1
+ use std::alloc;
2
+
3
+ extern "C" {
4
+ fn ZSTD_createDStream() -> u32;
5
+ fn ZSTD_freeDStream(ctx: u32) -> i32;
6
+ fn ZSTD_decompressStream_simpleArgs(
7
+ ctx: u32,
8
+ dst: *mut u8,
9
+ dstCapacity: u32,
10
+ dstPos: *mut u32,
11
+ src: *const u8,
12
+ srcSize: u32,
13
+ srcPos: *mut u32,
14
+ ) -> i32;
15
+
16
+ fn ZSTD_isError(err: i32) -> bool;
17
+ }
18
+
19
+ const MALLOC_ALIGN: usize = 16;
20
+
21
+ // malloc and free are needed by the zstd library
22
+ #[no_mangle]
23
+ pub unsafe fn v86_malloc(size: u32) -> u32 {
24
+ let layout = alloc::Layout::from_size_align(size as usize + 4, MALLOC_ALIGN).unwrap();
25
+ let addr = alloc::alloc(layout);
26
+ *(addr as *mut u32) = size as u32;
27
+ addr as u32 + 4
28
+ }
29
+ #[no_mangle]
30
+ pub unsafe fn v86_free(addr: u32) {
31
+ let size = *((addr - 4) as *mut u32);
32
+ let layout = alloc::Layout::from_size_align(size as usize + 4, MALLOC_ALIGN).unwrap();
33
+ alloc::dealloc((addr - 4) as *mut u8, layout)
34
+ }
35
+
36
+ pub struct ZstdContext {
37
+ ctx: u32,
38
+ src: *mut u8,
39
+ src_size: u32,
40
+ src_pos: u32,
41
+ }
42
+
43
+ #[no_mangle]
44
+ pub unsafe fn zstd_create_ctx(src_size: u32) -> *mut ZstdContext {
45
+ let src = alloc::alloc(alloc::Layout::from_size_align(src_size as usize, 1).unwrap());
46
+ let ctx = ZSTD_createDStream();
47
+ let result = alloc::alloc(alloc::Layout::new::<ZstdContext>()) as *mut ZstdContext;
48
+ *result = ZstdContext {
49
+ ctx,
50
+ src,
51
+ src_size,
52
+ src_pos: 0,
53
+ };
54
+ result
55
+ }
56
+
57
+ #[no_mangle]
58
+ pub unsafe fn zstd_get_src_ptr(ctx: *mut ZstdContext) -> *mut u8 { (*ctx).src }
59
+
60
+ #[no_mangle]
61
+ pub unsafe fn zstd_free_ctx(ctx: *mut ZstdContext) {
62
+ alloc::dealloc(
63
+ (*ctx).src,
64
+ alloc::Layout::from_size_align((*ctx).src_size as usize, 1).unwrap(),
65
+ );
66
+ ZSTD_freeDStream((*ctx).ctx);
67
+ std::ptr::drop_in_place(ctx);
68
+ }
69
+
70
+ #[no_mangle]
71
+ pub unsafe fn zstd_read(ctx: *mut ZstdContext, length: u32) -> *mut u8 {
72
+ let dst = alloc::alloc(alloc::Layout::from_size_align(length as usize, 1).unwrap());
73
+ let mut dst_pos = 0;
74
+ let result = ZSTD_decompressStream_simpleArgs(
75
+ (*ctx).ctx,
76
+ dst,
77
+ length,
78
+ &mut dst_pos,
79
+ (*ctx).src,
80
+ (*ctx).src_size,
81
+ &mut (*ctx).src_pos,
82
+ );
83
+ if ZSTD_isError(result) {
84
+ dbg_log!(
85
+ "ZSTD_decompressStream_simpleArgs returned error: {}",
86
+ result
87
+ );
88
+ dbg_assert!(false);
89
+ zstd_read_free(dst, length);
90
+ return std::ptr::null_mut::<u8>();
91
+ }
92
+ if dst_pos != length {
93
+ dbg_assert!(false, "ZSTD: Partial read");
94
+ zstd_read_free(dst, length);
95
+ return std::ptr::null_mut::<u8>();
96
+ }
97
+ dst
98
+ }
99
+ #[no_mangle]
100
+ pub unsafe fn zstd_read_free(ptr: *mut u8, length: u32) {
101
+ alloc::dealloc(
102
+ ptr,
103
+ alloc::Layout::from_size_align(length as usize, 1).unwrap(),
104
+ );
105
+ }