pavone@178: #{ pavone@178: includeSystemHeader: "unistd.h" pavone@178: includeSystemHeader: "sys/mman.h" pavone@178: pavone@178: executable <- :size { pavone@178: buf <- #{ pavone@178: llProperty: bytes withType: uint32_t pavone@178: llProperty: buffer withType: (void ptr) pavone@178: llMessage: _init withVars: { pavone@178: sz <- obj_int32 ptr pavone@178: } andCode: :sz { pavone@178: bytes <- sz num pavone@178: buffer <- sbrk: bytes pavone@178: mprotect: buffer bytes (PROT_READ or PROT_WRITE or PROT_EXEC) pavone@178: self pavone@178: } pavone@178: llMessage: set withVars: { pavone@178: offset <- obj_int32 ptr pavone@178: newval <- obj_uint8 ptr pavone@178: } andCode: :offset newval { pavone@178: (buffer castTo: (uint8_t ptr)) set: (offset num) (newval num) pavone@178: self pavone@178: } pavone@178: llMessage: get withVars: { pavone@178: offset <- obj_int32 ptr pavone@178: ret <- obj_uint8 ptr pavone@178: } andCode: :offset { pavone@178: ret <- make_object: (addr_of: obj_uint8_meta) NULL 0 pavone@178: ret num!: ((buffer castTo: (uint8_t ptr)) get: (offset num)) pavone@178: ret pavone@178: } pavone@178: llMessage: run withVars: { pavone@178: fun <- uint64_t funptr pavone@178: funret <- obj_uint64 ptr pavone@178: } andCode: { pavone@178: funret <- make_object: (addr_of: obj_uint64_meta) NULL 0 pavone@178: fun <- buffer pavone@178: funret num!: ( fun: ) pavone@178: funret pavone@178: } pavone@178: pavone@178: llMessage: runWithArg withVars: { pavone@178: fun <- uint64_t funptr: uint64_t pavone@178: funret <- obj_uint64 ptr pavone@178: arg <- obj_uint64 ptr pavone@178: } andCode: :arg { pavone@178: fun <- buffer pavone@178: funret <- make_object: (addr_of: obj_uint64_meta) NULL 0 pavone@178: funret num!: ( fun: (arg num) ) pavone@178: funret pavone@178: } pavone@178: } pavone@258: buf _init: size pavone@178: } pavone@178: pavone@178: executableFromBytes <- :bytes { pavone@178: totalSize <- bytes fold: 0 with: :acc el { pavone@178: acc + (el length) pavone@178: } pavone@178: ba <- executable: totalSize pavone@178: bytes fold: 0 with: :idx el { pavone@180: el flattenTo: ba at: idx pavone@178: } pavone@178: ba pavone@178: } pavone@178: }