aboutsummaryrefslogtreecommitdiffstats
path: root/executor/executor.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-04-15 12:36:31 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-04-15 13:23:33 +0000
commitb6f969371dc1e824c76636c0d3754a91b55d69b9 (patch)
tree92dd3d2c06c03a9247b0da72c1f962841f5dd81d /executor/executor.cc
parentf887b0490140a0c80dd49d2c549ac57ac2adc2b9 (diff)
prog: more compact exec encoding for addresses
1. Don't write size/flags for addresses. 2. Write address w/o data offset (fewer bytes in leb128 encoding). Median exec size shrinks by 25%: - exec sizes: 10%:584 50%:1423 90%:7076 + exec sizes: 10%:448 50%:1065 90%:6319
Diffstat (limited to 'executor/executor.cc')
-rw-r--r--executor/executor.cc26
1 files changed, 21 insertions, 5 deletions
diff --git a/executor/executor.cc b/executor/executor.cc
index ba2fb4bff..4c24520e7 100644
--- a/executor/executor.cc
+++ b/executor/executor.cc
@@ -200,9 +200,11 @@ const uint64 instr_copyout = -3;
const uint64 instr_setprops = -4;
const uint64 arg_const = 0;
-const uint64 arg_result = 1;
-const uint64 arg_data = 2;
-const uint64 arg_csum = 3;
+const uint64 arg_addr32 = 1;
+const uint64 arg_addr64 = 2;
+const uint64 arg_result = 3;
+const uint64 arg_data = 4;
+const uint64 arg_csum = 5;
const uint64 binary_format_native = 0;
const uint64 binary_format_bigendian = 1;
@@ -762,7 +764,7 @@ void execute_one()
if (call_num == instr_eof)
break;
if (call_num == instr_copyin) {
- char* addr = (char*)read_input(&input_pos);
+ char* addr = (char*)(read_input(&input_pos) + SYZ_DATA_OFFSET);
uint64 typ = read_input(&input_pos);
switch (typ) {
case arg_const: {
@@ -771,6 +773,15 @@ void execute_one()
copyin(addr, arg, size, bf, bf_off, bf_len);
break;
}
+ case arg_addr32:
+ case arg_addr64: {
+ uint64 val = read_input(&input_pos) + SYZ_DATA_OFFSET;
+ if (typ == arg_addr32)
+ NONFAILING(*(uint32*)addr = val);
+ else
+ NONFAILING(*(uint64*)addr = val);
+ break;
+ }
case arg_result: {
uint64 meta = read_input(&input_pos);
uint64 size = meta & 0xff;
@@ -808,6 +819,7 @@ void execute_one()
uint64 chunk_size = read_input(&input_pos);
switch (chunk_kind) {
case arg_csum_chunk_data:
+ chunk_value += SYZ_DATA_OFFSET;
debug_verbose("#%lld: data chunk, addr: %llx, size: %llu\n",
chunk, chunk_value, chunk_size);
NONFAILING(csum_inet_update(&csum, (const uint8*)chunk_value, chunk_size));
@@ -1082,7 +1094,7 @@ void copyout_call_results(thread_t* th)
uint64 index = read_input(&th->copyout_pos);
if (index >= kMaxCommands)
failmsg("result overflows kMaxCommands", "index=%lld", index);
- char* addr = (char*)read_input(&th->copyout_pos);
+ char* addr = (char*)(read_input(&th->copyout_pos) + SYZ_DATA_OFFSET);
uint64 size = read_input(&th->copyout_pos);
uint64 val = 0;
if (copyout(addr, size, &val)) {
@@ -1434,6 +1446,10 @@ uint64 read_arg(uint8** input_posp)
failmsg("bad argument bitfield", "off=%llu, len=%llu", bf_off, bf_len);
return swap(val, size, bf);
}
+ case arg_addr32:
+ case arg_addr64: {
+ return read_input(input_posp) + SYZ_DATA_OFFSET;
+ }
case arg_result: {
uint64 meta = read_input(input_posp);
uint64 bf = meta >> 8;