8 typedef struct __attribute__((packed)) {
18 // rdi, rsi, rdx, rcx, r8, r9
19 static const uint16_t mov[6] = {0xbf48, 0xbe48, 0xba48, 0xb948, 0xb849, 0xb949};
22 __attribute__((constructor)) static void init()
24 size = sysconf(_SC_PAGESIZE);
27 void *closure_create(void *self, ClosureParam *param, size_t num)
29 Closure *block = mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
31 for (size_t i = 0; i < num; i++) {
32 if (param[i].arg >= 6)
35 block[i].opcode_0 = 0xb848;
36 block[i].operand_0 = param[i].fun;
38 block[i].opcode_1 = mov[param[i].arg];
39 block[i].operand_1 = self;
41 block[i].opcode_2 = 0xe0ff;
43 *((void **) param[i].ptr) = &block[i];
46 mprotect(block, size, PROT_READ | PROT_EXEC);
50 void closure_destroy(void *closure)
52 munmap(closure, size);