aboutsummaryrefslogtreecommitdiffstats
path: root/test/autowasm.c
diff options
context:
space:
mode:
authorbloodstalker <thabogre@gmail.com>2018-07-21 11:41:40 +0000
committerbloodstalker <thabogre@gmail.com>2018-07-21 11:41:40 +0000
commit2c2c46f481ea93cc8292319b13fc7ad0ea08232f (patch)
treec831cb28b43f161ba827c2838ffc084d19113a20 /test/autowasm.c
parentupdate (diff)
downloadfaultreiber-2c2c46f481ea93cc8292319b13fc7ad0ea08232f.tar.gz
faultreiber-2c2c46f481ea93cc8292319b13fc7ad0ea08232f.zip
update
Diffstat (limited to 'test/autowasm.c')
-rw-r--r--test/autowasm.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/test/autowasm.c b/test/autowasm.c
new file mode 100644
index 0000000..5151898
--- /dev/null
+++ b/test/autowasm.c
@@ -0,0 +1,72 @@
+
+#include <fcntl.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+uint64_t read_leb128_u(int _fd, int max_size) {
+ uint8_t read_bytes = 0U;
+ uint8_t byte = 0;
+ uint64_t result = 0U;
+ uint32_t shift = 0U;
+ do {
+ read(_fd, &byte, 1);read_bytes++;read_bytes++;
+ result |= (byte & 0x7f) << shift;
+ shift += 7;
+ } while(((byte & 0x80) != 0) && (read_bytes < max_size));
+ return result;
+}
+
+int64_t read_leb128_s(int _fd, int max_size) {
+ uint8_t byte;
+ uint8_t read_bytes = 0U;
+ uint8_t last_byte;
+ int64_t result = 0;
+ uint32_t shift = 0U;
+ read(_fd, &byte, 1);
+ do {
+ read(_fd, &byte, 1);read_bytes++;
+ result |= (byte & 0x7f) << shift;
+ last_byte = byte;
+ shift += 7;
+ } while(((byte & 0x80) != 0) && read_bytes < max_size);
+ if ((last_byte & 0x40) != 0) result |= -(1 << shift);
+ return result;
+}
+
+#define READ_VAR_UINT_1(FD) read_leb128_u(FD, 1)
+#define READ_VAR_UINT_7(FD) read_leb128_u(FD, 1)
+#define READ_VAR_UINT_32(FD) read_leb128_u(FD, 5)
+#define READ_VAR_INT_1(FD) read_leb128_s(FD, 1)
+#define READ_VAR_INT_7(FD) read_leb128_s(FD, 1)
+#define READ_VAR_INT_32(FD) read_leb128_s(FD, 5)
+
+#pragma weak main
+int main (int argc, char** argv) {
+ int wasm = open("./test.wasm", O_RDONLY);
+ uint64_t test_u = 0U;
+ int64_t test_s = 0;
+ unsigned char test_byte;
+ unsigned char byte;
+ uint32_t word;
+ uint32_t counter = 0U;
+
+ read(wasm, &word, 8);
+ printf("test_byte:%08x\n", word);
+
+ lseek(wasm, 9, SEEK_SET);
+ read(wasm, &word, 8);
+ printf("test_byte:%08x\n", word);
+
+ lseek(wasm, 9, SEEK_SET);
+ test_u = READ_VAR_UINT_32(wasm);
+ printf("read u res is: %lu.\n", test_u);
+ lseek(wasm, 0, SEEK_SET);
+ while(read(wasm, &word, sizeof(uint32_t))) {
+ //printf("%d:%02x\t", counter, word);
+ counter++;
+ }
+ printf("\n");
+ return 0;
+}