Add location hint to code block mmap call
This commit is contained in:
parent
c20066b24c
commit
304adba717
10
ujit_asm.c
10
ujit_asm.c
@ -117,7 +117,7 @@ void cb_init(codeblock_t* cb, size_t mem_size)
|
|||||||
{
|
{
|
||||||
// Map the memory as executable
|
// Map the memory as executable
|
||||||
cb->mem_block = (uint8_t*)mmap(
|
cb->mem_block = (uint8_t*)mmap(
|
||||||
NULL,
|
&cb_init,
|
||||||
mem_size,
|
mem_size,
|
||||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||||
MAP_PRIVATE | MAP_ANON,
|
MAP_PRIVATE | MAP_ANON,
|
||||||
@ -1083,15 +1083,13 @@ void jmp_rm(codeblock_t* cb, x86opnd_t opnd)
|
|||||||
cb_write_rm(cb, false, false, NO_OPND, opnd, 4, 1, 0xFF);
|
cb_write_rm(cb, false, false, NO_OPND, opnd, 4, 1, 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
/// Opcode for direct jump with relative 8-bit offset
|
|
||||||
const ubyte JMP_REL8_OPCODE = 0xEB;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
/// jmp - Jump with relative 8-bit offset
|
/// jmp - Jump with relative 8-bit offset
|
||||||
void jmp8(CodeBlock cb, int8_t offset)
|
void jmp8(CodeBlock cb, int8_t offset)
|
||||||
{
|
{
|
||||||
|
/// Opcode for direct jump with relative 8-bit offset
|
||||||
|
const ubyte JMP_REL8_OPCODE = 0xEB;
|
||||||
|
|
||||||
cb.writeASM("jmp", ((offset > 0)? "+":"-") ~ to!string(offset));
|
cb.writeASM("jmp", ((offset > 0)? "+":"-") ~ to!string(offset));
|
||||||
cb.writeByte(JMP_REL8_OPCODE);
|
cb.writeByte(JMP_REL8_OPCODE);
|
||||||
cb.writeByte(offset);
|
cb.writeByte(offset);
|
||||||
|
@ -170,6 +170,7 @@ ujit_compile_insn(rb_iseq_t *iseq, unsigned int insn_idx, unsigned int* next_uji
|
|||||||
st_data_t st_gen_fn;
|
st_data_t st_gen_fn;
|
||||||
if (!rb_st_lookup(gen_fns, opcode, &st_gen_fn))
|
if (!rb_st_lookup(gen_fns, opcode, &st_gen_fn))
|
||||||
{
|
{
|
||||||
|
//print_int(cb, imm_opnd(num_instrs));
|
||||||
//print_str(cb, insn_name(opcode));
|
//print_str(cb, insn_name(opcode));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -200,8 +201,6 @@ ujit_compile_insn(rb_iseq_t *iseq, unsigned int insn_idx, unsigned int* next_uji
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//print_int(cb, imm_opnd(num_instrs));
|
|
||||||
|
|
||||||
// Write the adjusted SP back into the CFP
|
// Write the adjusted SP back into the CFP
|
||||||
if (ctx.stack_diff != 0)
|
if (ctx.stack_diff != 0)
|
||||||
{
|
{
|
||||||
@ -217,6 +216,33 @@ ujit_compile_insn(rb_iseq_t *iseq, unsigned int insn_idx, unsigned int* next_uji
|
|||||||
// Write the post call bytes
|
// Write the post call bytes
|
||||||
ujit_instr_exit(cb);
|
ujit_instr_exit(cb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Hack to patch a relative 32-bit jump to the instruction handler
|
||||||
|
int next_opcode = (int)*ctx.pc;
|
||||||
|
const void * const *table = rb_vm_get_insns_address_table();
|
||||||
|
VALUE encoded = (VALUE)table[next_opcode];
|
||||||
|
uint8_t* p_handler = (uint8_t*)encoded;
|
||||||
|
|
||||||
|
uint8_t* p_code = &cb->mem_block[cb->write_pos];
|
||||||
|
int64_t rel64 = ((int64_t)p_handler) - ((int64_t)p_code - 2 + 5);
|
||||||
|
|
||||||
|
//printf("p_handler: %lld\n", (int64_t)p_handler);
|
||||||
|
//printf("rel64: %lld\n", rel64);
|
||||||
|
|
||||||
|
uint8_t byte0 = cb->mem_block[cb->write_pos - 2];
|
||||||
|
uint8_t byte1 = cb->mem_block[cb->write_pos - 1];
|
||||||
|
|
||||||
|
//printf("cb_init: %lld\n", (int64_t)&cb_init);
|
||||||
|
//printf("%lld\n", rel64);
|
||||||
|
|
||||||
|
if (byte0 == 0xFF && byte1 == 0x20 && rel64 >= -2147483648 && rel64 <= 2147483647)
|
||||||
|
{
|
||||||
|
//printf("%02X %02X\n", (int)byte0, (int)byte1);
|
||||||
|
cb->write_pos -= 2;
|
||||||
|
jmp32(cb, (int32_t)rel64);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
addr2insn_bookkeeping(code_ptr, first_opcode);
|
addr2insn_bookkeeping(code_ptr, first_opcode);
|
||||||
|
|
||||||
return code_ptr;
|
return code_ptr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user