@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.
- package/LICENSE +22 -0
- package/LICENSE.MIT +22 -0
- package/Readme.md +237 -0
- package/dist/v86.browser.js +26666 -0
- package/dist/v86.browser.js.map +7 -0
- package/dist/v86.js +26632 -0
- package/dist/v86.js.map +7 -0
- package/gen/generate_analyzer.ts +512 -0
- package/gen/generate_interpreter.ts +522 -0
- package/gen/generate_jit.ts +624 -0
- package/gen/rust_ast.ts +107 -0
- package/gen/util.ts +35 -0
- package/gen/x86_table.ts +1836 -0
- package/lib/9p.ts +1547 -0
- package/lib/filesystem.ts +1879 -0
- package/lib/marshall.ts +168 -0
- package/lib/softfloat/softfloat.c +32501 -0
- package/lib/zstd/zstddeclib.c +13520 -0
- package/package.json +75 -0
- package/src/acpi.ts +267 -0
- package/src/browser/dummy_screen.ts +106 -0
- package/src/browser/fake_network.ts +1771 -0
- package/src/browser/fetch_network.ts +361 -0
- package/src/browser/filestorage.ts +124 -0
- package/src/browser/inbrowser_network.ts +57 -0
- package/src/browser/keyboard.ts +564 -0
- package/src/browser/main.ts +3415 -0
- package/src/browser/mouse.ts +255 -0
- package/src/browser/network.ts +142 -0
- package/src/browser/print_stats.ts +336 -0
- package/src/browser/screen.ts +978 -0
- package/src/browser/serial.ts +316 -0
- package/src/browser/speaker.ts +1223 -0
- package/src/browser/starter.ts +1688 -0
- package/src/browser/wisp_network.ts +332 -0
- package/src/browser/worker_bus.ts +64 -0
- package/src/buffer.ts +652 -0
- package/src/bus.ts +78 -0
- package/src/const.ts +128 -0
- package/src/cpu.ts +2891 -0
- package/src/dma.ts +474 -0
- package/src/elf.ts +251 -0
- package/src/floppy.ts +1778 -0
- package/src/ide.ts +3455 -0
- package/src/io.ts +504 -0
- package/src/iso9660.ts +317 -0
- package/src/kernel.ts +250 -0
- package/src/lib.ts +645 -0
- package/src/log.ts +149 -0
- package/src/main.ts +199 -0
- package/src/ne2k.ts +1589 -0
- package/src/pci.ts +815 -0
- package/src/pit.ts +406 -0
- package/src/ps2.ts +820 -0
- package/src/rtc.ts +537 -0
- package/src/rust/analysis.rs +101 -0
- package/src/rust/codegen.rs +2660 -0
- package/src/rust/config.rs +3 -0
- package/src/rust/control_flow.rs +425 -0
- package/src/rust/cpu/apic.rs +658 -0
- package/src/rust/cpu/arith.rs +1207 -0
- package/src/rust/cpu/call_indirect.rs +2 -0
- package/src/rust/cpu/cpu.rs +4501 -0
- package/src/rust/cpu/fpu.rs +923 -0
- package/src/rust/cpu/global_pointers.rs +112 -0
- package/src/rust/cpu/instructions.rs +2486 -0
- package/src/rust/cpu/instructions_0f.rs +5261 -0
- package/src/rust/cpu/ioapic.rs +316 -0
- package/src/rust/cpu/memory.rs +351 -0
- package/src/rust/cpu/misc_instr.rs +613 -0
- package/src/rust/cpu/mod.rs +16 -0
- package/src/rust/cpu/modrm.rs +133 -0
- package/src/rust/cpu/pic.rs +402 -0
- package/src/rust/cpu/sse_instr.rs +361 -0
- package/src/rust/cpu/string.rs +701 -0
- package/src/rust/cpu/vga.rs +175 -0
- package/src/rust/cpu_context.rs +69 -0
- package/src/rust/dbg.rs +98 -0
- package/src/rust/gen/analyzer.rs +3807 -0
- package/src/rust/gen/analyzer0f.rs +3992 -0
- package/src/rust/gen/interpreter.rs +4447 -0
- package/src/rust/gen/interpreter0f.rs +5404 -0
- package/src/rust/gen/jit.rs +5080 -0
- package/src/rust/gen/jit0f.rs +5547 -0
- package/src/rust/gen/mod.rs +14 -0
- package/src/rust/jit.rs +2443 -0
- package/src/rust/jit_instructions.rs +7881 -0
- package/src/rust/js_api.rs +6 -0
- package/src/rust/leb.rs +46 -0
- package/src/rust/lib.rs +29 -0
- package/src/rust/modrm.rs +330 -0
- package/src/rust/opstats.rs +249 -0
- package/src/rust/page.rs +15 -0
- package/src/rust/paging.rs +25 -0
- package/src/rust/prefix.rs +15 -0
- package/src/rust/profiler.rs +155 -0
- package/src/rust/regs.rs +38 -0
- package/src/rust/softfloat.rs +286 -0
- package/src/rust/state_flags.rs +27 -0
- package/src/rust/wasmgen/mod.rs +2 -0
- package/src/rust/wasmgen/wasm_builder.rs +1047 -0
- package/src/rust/wasmgen/wasm_opcodes.rs +221 -0
- package/src/rust/zstd.rs +105 -0
- package/src/sb16.ts +1928 -0
- package/src/state.ts +359 -0
- package/src/uart.ts +472 -0
- package/src/vga.ts +2791 -0
- package/src/virtio.ts +1756 -0
- package/src/virtio_balloon.ts +273 -0
- package/src/virtio_console.ts +372 -0
- package/src/virtio_net.ts +326 -0
package/lib/marshall.ts
ADDED
|
@@ -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
|
+
}
|