@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
|
@@ -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);
|
package/src/rust/zstd.rs
ADDED
|
@@ -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
|
+
}
|