#include "jit.h" #include #include #include #include using JitFunc = void (*)(); void JIT::translate_and_run(CPU &cpu) { uint8_t *code = (uint8_t *)mmap(nullptr, 64, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0); size_t offset = 0; // Decode mock instructions from cpu.memory if (cpu.memory[0] == 0x05) { // MOVZ placeholder code[offset++] = 0x48; // mov rax, imm64 code[offset++] = 0xB8; uint64_t imm = 5; std::memcpy(&code[offset], &imm, sizeof(imm)); offset += 8; } if (cpu.memory[4] == 0x03) { // ADD placeholder code[offset++] = 0x48; // add rax, imm32 code[offset++] = 0x05; uint32_t addval = 3; std::memcpy(&code[offset], &addval, sizeof(addval)); offset += 4; } code[offset++] = 0xC3; // ret JitFunc fn = reinterpret_cast(code); uint64_t result; asm volatile( "call *%1\n" "mov %%rax, %0\n" : "=r"(result) : "r"(fn) : "%rax"); cpu.regs[0] = result; }