@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,168 @@
1
+ // -------------------------------------------------
2
+ // ------------------ Marshall ---------------------
3
+ // -------------------------------------------------
4
+ // helper functions for virtio and 9p.
5
+
6
+ import { dbg_log } from './../src/log.js'
7
+
8
+ const textde = new TextDecoder()
9
+ const texten = new TextEncoder()
10
+
11
+ // QID structure used in the 9P protocol.
12
+ export interface QID {
13
+ type: number
14
+ version: number
15
+ path: number
16
+ }
17
+
18
+ // Tracks the current read offset during unmarshalling.
19
+ export interface MarshallState {
20
+ offset: number
21
+ }
22
+
23
+ // Type codes used by Marshall/Unmarshall:
24
+ // 'w' = word (4 bytes), 'd' = double word (8 bytes, only low 32 bits written),
25
+ // 'h' = half word (2 bytes), 'b' = byte, 's' = length-prefixed string, 'Q' = QID (13 bytes).
26
+ export type MarshallTypeCode = 'w' | 'd' | 'h' | 'b' | 's' | 'Q'
27
+
28
+ type MarshallInput = any
29
+
30
+ // Inserts data from an array to a byte aligned struct in memory
31
+ export function Marshall(
32
+ typelist: MarshallTypeCode[],
33
+ input: MarshallInput[],
34
+ struct: Uint8Array,
35
+ offset: number,
36
+ ): number {
37
+ let item: MarshallInput
38
+ let size = 0
39
+ for (let i = 0; i < typelist.length; i++) {
40
+ item = input[i]
41
+ switch (typelist[i]) {
42
+ case 'w':
43
+ struct[offset++] = item & 0xff
44
+ struct[offset++] = (item >> 8) & 0xff
45
+ struct[offset++] = (item >> 16) & 0xff
46
+ struct[offset++] = (item >> 24) & 0xff
47
+ size += 4
48
+ break
49
+ case 'd': // double word
50
+ struct[offset++] = item & 0xff
51
+ struct[offset++] = (item >> 8) & 0xff
52
+ struct[offset++] = (item >> 16) & 0xff
53
+ struct[offset++] = (item >> 24) & 0xff
54
+ struct[offset++] = 0x0
55
+ struct[offset++] = 0x0
56
+ struct[offset++] = 0x0
57
+ struct[offset++] = 0x0
58
+ size += 8
59
+ break
60
+ case 'h':
61
+ struct[offset++] = item & 0xff
62
+ struct[offset++] = item >> 8
63
+ size += 2
64
+ break
65
+ case 'b':
66
+ struct[offset++] = item
67
+ size += 1
68
+ break
69
+ case 's': {
70
+ const lengthoffset = offset
71
+ let length = 0
72
+ struct[offset++] = 0 // set the length later
73
+ struct[offset++] = 0
74
+ size += 2
75
+
76
+ const stringBytes = texten.encode(item)
77
+ size += stringBytes.byteLength
78
+ length += stringBytes.byteLength
79
+ struct.set(stringBytes, offset)
80
+ offset += stringBytes.byteLength
81
+
82
+ struct[lengthoffset + 0] = length & 0xff
83
+ struct[lengthoffset + 1] = (length >> 8) & 0xff
84
+ break
85
+ }
86
+ case 'Q':
87
+ Marshall(
88
+ ['b', 'w', 'd'],
89
+ [item.type, item.version, item.path],
90
+ struct,
91
+ offset,
92
+ )
93
+ offset += 13
94
+ size += 13
95
+ break
96
+ default:
97
+ dbg_log('Marshall: Unknown type=' + typelist[i])
98
+ break
99
+ }
100
+ }
101
+ return size
102
+ }
103
+
104
+ // Extracts data from a byte aligned struct in memory to an array
105
+
106
+ export function Unmarshall(
107
+ typelist: MarshallTypeCode[],
108
+ struct: Uint8Array,
109
+ state: MarshallState,
110
+ ): any[] {
111
+ let offset = state.offset
112
+
113
+ const output: any[] = []
114
+ for (let i = 0; i < typelist.length; i++) {
115
+ switch (typelist[i]) {
116
+ case 'w': {
117
+ let val = struct[offset++]
118
+ val += struct[offset++] << 8
119
+ val += struct[offset++] << 16
120
+ val += (struct[offset++] << 24) >>> 0
121
+ output.push(val)
122
+ break
123
+ }
124
+ case 'd': {
125
+ let val = struct[offset++]
126
+ val += struct[offset++] << 8
127
+ val += struct[offset++] << 16
128
+ val += (struct[offset++] << 24) >>> 0
129
+ offset += 4
130
+ output.push(val)
131
+ break
132
+ }
133
+ case 'h': {
134
+ const val = struct[offset++]
135
+ output.push(val + (struct[offset++] << 8))
136
+ break
137
+ }
138
+ case 'b':
139
+ output.push(struct[offset++])
140
+ break
141
+ case 's': {
142
+ let len = struct[offset++]
143
+ len += struct[offset++] << 8
144
+
145
+ const stringBytes = struct.slice(offset, offset + len)
146
+ offset += len
147
+ output.push(textde.decode(stringBytes))
148
+ break
149
+ }
150
+ case 'Q': {
151
+ state.offset = offset
152
+ const qid = Unmarshall(['b', 'w', 'd'], struct, state)
153
+ offset = state.offset
154
+ output.push({
155
+ type: qid[0],
156
+ version: qid[1],
157
+ path: qid[2],
158
+ })
159
+ break
160
+ }
161
+ default:
162
+ dbg_log('Error in Unmarshall: Unknown type=' + typelist[i])
163
+ break
164
+ }
165
+ }
166
+ state.offset = offset
167
+ return output
168
+ }