diff options
Diffstat (limited to '')
| -rwxr-xr-x | main.py | 6 | ||||
| -rwxr-xr-x | run.sh | 1 | ||||
| -rw-r--r-- | test/autowasm.c | 72 | ||||
| -rw-r--r-- | text.py | 47 | 
4 files changed, 124 insertions, 2 deletions
@@ -286,11 +286,14 @@ class CodeGen(object):          if self.argparser.args.datetime: struct_source.write("// " + self.dnt + "\n")          struct_source.write(text.header_guard_begin.replace("XXX", "structs".upper()))          struct_source.write(text.header_inttype) +        struct_source.write(text.c_read_leb_u_def + "\n") +        struct_source.write(text.c_read_leb_s_def + "\n") +        struct_source.write(text.c_read_leb_macro_defs + "\n")          if self.argparser.args.structsinclude:              copy(self.argparser.args.structsinclude, self.argparser.args.outdir)              pos = self.argparser.args.structsinclude.rfind("/")              sub = self.argparser.args.structsinclude[pos+1:] -            struct_source.write('#include "' + sub + '"\n') +            struct_source.write('#include "' + sub + '"\n\n')          for child in self.def_elems + self.read_elems:              struct_source.write("typedef struct {\n")              for childer in child: @@ -308,7 +311,6 @@ class CodeGen(object):          struct_source.write(text.pragma_endif)          struct_source.write(text.last_comment) -      def gen_struct_header(self):          struct_source = open(get_full_path(self.argparser.args.outdir, "structs.h"), "w")          struct_source_c = open(get_full_path(self.argparser.args.outdir, "structs.c"), "w") @@ -1,3 +1,4 @@  #!/bin/sh  cd $(dirname $0)  "./faultreiber.py" --targetname autowasm --outdir ./test/ --structs ./test/struct.json --datetime --structsinclude ./resources/structsinclude.h --xml ./resources/wasm.xml --inline +"less" ./test/structs.h 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; +} @@ -29,3 +29,50 @@ class text():      c_read_gen_2 = "read(_fd, &XXX, YYY);\n"      c_assign_struct = "XXX.YYY = ZZZ;\n"      simple_loop = "for (int i = 0; i < XXX; ++i) {\nYYY}\n" +    c_read_leb_u_def = """ +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; +}""" + +    c_read_leb_s_def = """ +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; +}""" + +    c_read_leb_macro_defs = """ +#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) +""" + +    c_read_leb_macro_varuin1 = "READ_VAR_UINT_1(XXX)" +    c_read_leb_macro_varuin7 = "READ_VAR_UINT_7(XXX)" +    c_read_leb_macro_varuin32 = "READ_VAR_UINT_32(XXX)" +    c_read_leb_macro_varin1 = "READ_VAR_INT_1(XXX)" +    c_read_leb_macro_varin7 = "READ_VAR_INT_7(XXX)" +    c_read_leb_macro_varin32 = "READ_VAR_INT_32(XXX)" +  | 
