From e44c112a76cc60f38e262a892f3548a706926c40 Mon Sep 17 00:00:00 2001 From: ergo720 <45463469+ergo720@users.noreply.github.com> Date: Sun, 17 Mar 2024 22:21:48 +0100 Subject: [PATCH] Fixed calling convention problems in Linux builds occurring in gcc 13 --- lib86cpu/core/emitter/emitter_common.h | 2 +- lib86cpu/core/emitter/x64/jit.cpp | 2 +- lib86cpu/core/fpu.cpp | 28 +++++++-------- lib86cpu/core/fpu.h | 4 +-- lib86cpu/core/instructions.cpp | 24 ++++++------- lib86cpu/core/instructions.h | 46 ++++++++++++------------ lib86cpu/core/internal.h | 6 ++-- lib86cpu/core/linux/clock.h | 2 +- lib86cpu/core/memory_management.cpp | 50 +++++++++++++------------- lib86cpu/core/memory_management.h | 8 ++--- lib86cpu/core/translate.cpp | 16 ++++----- lib86cpu/core/windows/clock.h | 2 +- lib86cpu/dbg/debugger.h | 2 +- lib86cpu/lib86cpu_priv.h | 10 +++--- lib86cpu/support.h | 2 +- 15 files changed, 102 insertions(+), 102 deletions(-) diff --git a/lib86cpu/core/emitter/emitter_common.h b/lib86cpu/core/emitter/emitter_common.h index be59d5b..5705f32 100644 --- a/lib86cpu/core/emitter/emitter_common.h +++ b/lib86cpu/core/emitter/emitter_common.h @@ -129,7 +129,7 @@ #define REG_pair(reg) get_reg_pair(reg) -entry_t JIT_API link_indirect_handler(cpu_ctx_t *cpu_ctx, translated_code_t *tc); +JIT_API entry_t link_indirect_handler(cpu_ctx_t *cpu_ctx, translated_code_t *tc); size_t get_reg_offset(ZydisRegister reg); size_t get_seg_prfx_offset(decoded_instr *instr); int get_reg_idx(ZydisRegister reg); diff --git a/lib86cpu/core/emitter/x64/jit.cpp b/lib86cpu/core/emitter/x64/jit.cpp index 9c26e14..1977fba 100644 --- a/lib86cpu/core/emitter/x64/jit.cpp +++ b/lib86cpu/core/emitter/x64/jit.cpp @@ -161,7 +161,7 @@ static const std::unordered_map reg_to_sized_reg = { template consteval std::integral_constant -get_arg_count(R(JIT_API *f)(Args...)) +get_arg_count(JIT_API R(*f)(Args...)) { return std::integral_constant{}; } diff --git a/lib86cpu/core/fpu.cpp b/lib86cpu/core/fpu.cpp index 1399da8..4e77154 100644 --- a/lib86cpu/core/fpu.cpp +++ b/lib86cpu/core/fpu.cpp @@ -113,17 +113,17 @@ uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val) return ftop; } -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); -template void fpu_update_tag(cpu_ctx_t *cpu_ctx, uint32_t idx); -template void fpu_update_tag(cpu_ctx_t *cpu_ctx, uint32_t idx); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +template JIT_API void fpu_update_tag(cpu_ctx_t *cpu_ctx, uint32_t idx); +template JIT_API void fpu_update_tag(cpu_ctx_t *cpu_ctx, uint32_t idx); diff --git a/lib86cpu/core/fpu.h b/lib86cpu/core/fpu.h index ed47769..6240392 100644 --- a/lib86cpu/core/fpu.h +++ b/lib86cpu/core/fpu.h @@ -18,6 +18,6 @@ enum class fpu_instr_t : int { void fpu_init(cpu_t *cpu); template -void JIT_API fpu_update_tag(cpu_ctx_t *cpu_ctx, uint32_t idx); +JIT_API void fpu_update_tag(cpu_ctx_t *cpu_ctx, uint32_t idx); template -uint32_t JIT_API fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); +JIT_API uint32_t fpu_stack_check(cpu_ctx_t *cpu_ctx, uint32_t *sw, uint80_t *inv_val); diff --git a/lib86cpu/core/instructions.cpp b/lib86cpu/core/instructions.cpp index d20c7ba..487a8e3 100644 --- a/lib86cpu/core/instructions.cpp +++ b/lib86cpu/core/instructions.cpp @@ -1423,18 +1423,18 @@ hlt_helper(cpu_ctx_t *cpu_ctx) return 0; } -template uint32_t lret_pe_helper(cpu_ctx_t *cpu_ctx, uint8_t size_mode, uint32_t eip); -template uint32_t lret_pe_helper(cpu_ctx_t *cpu_ctx, uint8_t size_mode, uint32_t eip); +template JIT_API uint32_t lret_pe_helper(cpu_ctx_t *cpu_ctx, uint8_t size_mode, uint32_t eip); +template JIT_API uint32_t lret_pe_helper(cpu_ctx_t *cpu_ctx, uint8_t size_mode, uint32_t eip); -template void verrw_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -template void verrw_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +template JIT_API void verrw_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +template JIT_API void verrw_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -template uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -template uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -template uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -template uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -template uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +template JIT_API uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +template JIT_API uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +template JIT_API uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +template JIT_API uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +template JIT_API uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -template uint32_t update_crN_helper<0>(cpu_ctx_t* cpu_ctx, uint32_t new_cr, uint8_t idx); -template uint32_t update_crN_helper<1>(cpu_ctx_t* cpu_ctx, uint32_t new_cr, uint8_t idx); -template uint32_t update_crN_helper<2>(cpu_ctx_t* cpu_ctx, uint32_t new_cr, uint8_t idx); +template JIT_API uint32_t update_crN_helper<0>(cpu_ctx_t* cpu_ctx, uint32_t new_cr, uint8_t idx); +template JIT_API uint32_t update_crN_helper<1>(cpu_ctx_t* cpu_ctx, uint32_t new_cr, uint8_t idx); +template JIT_API uint32_t update_crN_helper<2>(cpu_ctx_t* cpu_ctx, uint32_t new_cr, uint8_t idx); diff --git a/lib86cpu/core/instructions.h b/lib86cpu/core/instructions.h index 314cf8c..1d5e672 100644 --- a/lib86cpu/core/instructions.h +++ b/lib86cpu/core/instructions.h @@ -7,26 +7,26 @@ #include "helpers.h" -template uint32_t JIT_API lret_pe_helper(cpu_ctx_t *cpu_ctx, uint8_t size_mode, uint32_t eip); -void JIT_API iret_real_helper(cpu_ctx_t *cpu_ctx, uint8_t size_mode, uint32_t eip); -uint32_t JIT_API ljmp_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint8_t size_mode, uint32_t jmp_eip, uint32_t eip); -uint32_t JIT_API lcall_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t call_eip, uint8_t size_mode, uint32_t ret_eip, uint32_t eip); -template void JIT_API verrw_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -template uint32_t JIT_API mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -uint32_t JIT_API ltr_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -uint32_t JIT_API lldt_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); -template uint32_t JIT_API update_crN_helper(cpu_ctx_t *cpu_ctx, uint32_t new_cr, uint8_t idx); -void JIT_API update_drN_helper(cpu_ctx_t *cpu_ctx, uint8_t dr_idx, uint32_t new_dr); -uint32_t JIT_API divd_helper(cpu_ctx_t *cpu_ctx, uint32_t d, uint32_t eip); -uint32_t JIT_API divw_helper(cpu_ctx_t *cpu_ctx, uint16_t d, uint32_t eip); -uint32_t JIT_API divb_helper(cpu_ctx_t *cpu_ctx, uint8_t d, uint32_t eip); -uint32_t JIT_API idivd_helper(cpu_ctx_t *cpu_ctx, uint32_t d, uint32_t eip); -uint32_t JIT_API idivw_helper(cpu_ctx_t *cpu_ctx, uint16_t d, uint32_t eip); -uint32_t JIT_API idivb_helper(cpu_ctx_t *cpu_ctx, uint8_t d, uint32_t eip); -void JIT_API cpuid_helper(cpu_ctx_t *cpu_ctx); -void JIT_API cpu_rdtsc_helper(cpu_ctx_t *cpu_ctx); -uint32_t JIT_API msr_read_helper(cpu_ctx_t *cpu_ctx); -uint32_t JIT_API msr_write_helper(cpu_ctx_t *cpu_ctx); -uint32_t JIT_API hlt_helper(cpu_ctx_t *cpu_ctx); -void JIT_API fxsave_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip); -uint32_t JIT_API fxrstor_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip); +template JIT_API uint32_t lret_pe_helper(cpu_ctx_t *cpu_ctx, uint8_t size_mode, uint32_t eip); +JIT_API void iret_real_helper(cpu_ctx_t *cpu_ctx, uint8_t size_mode, uint32_t eip); +JIT_API uint32_t ljmp_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint8_t size_mode, uint32_t jmp_eip, uint32_t eip); +JIT_API uint32_t lcall_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t call_eip, uint8_t size_mode, uint32_t ret_eip, uint32_t eip); +template JIT_API void verrw_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +template JIT_API uint32_t mov_sel_pe_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +JIT_API uint32_t ltr_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +JIT_API uint32_t lldt_helper(cpu_ctx_t *cpu_ctx, uint16_t sel, uint32_t eip); +template JIT_API uint32_t update_crN_helper(cpu_ctx_t *cpu_ctx, uint32_t new_cr, uint8_t idx); +JIT_API void update_drN_helper(cpu_ctx_t *cpu_ctx, uint8_t dr_idx, uint32_t new_dr); +JIT_API uint32_t divd_helper(cpu_ctx_t *cpu_ctx, uint32_t d, uint32_t eip); +JIT_API uint32_t divw_helper(cpu_ctx_t *cpu_ctx, uint16_t d, uint32_t eip); +JIT_API uint32_t divb_helper(cpu_ctx_t *cpu_ctx, uint8_t d, uint32_t eip); +JIT_API uint32_t idivd_helper(cpu_ctx_t *cpu_ctx, uint32_t d, uint32_t eip); +JIT_API uint32_t idivw_helper(cpu_ctx_t *cpu_ctx, uint16_t d, uint32_t eip); +JIT_API uint32_t idivb_helper(cpu_ctx_t *cpu_ctx, uint8_t d, uint32_t eip); +JIT_API void cpuid_helper(cpu_ctx_t *cpu_ctx); +JIT_API void cpu_rdtsc_helper(cpu_ctx_t *cpu_ctx); +JIT_API uint32_t msr_read_helper(cpu_ctx_t *cpu_ctx); +JIT_API uint32_t msr_write_helper(cpu_ctx_t *cpu_ctx); +JIT_API uint32_t hlt_helper(cpu_ctx_t *cpu_ctx); +JIT_API void fxsave_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip); +JIT_API uint32_t fxrstor_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip); diff --git a/lib86cpu/core/internal.h b/lib86cpu/core/internal.h index c9ec7f6..dc6e56f 100644 --- a/lib86cpu/core/internal.h +++ b/lib86cpu/core/internal.h @@ -20,10 +20,10 @@ void tc_cache_clear(cpu_t *cpu); void tc_cache_purge(cpu_t *cpu); addr_t get_pc(cpu_ctx_t *cpu_ctx); template -translated_code_t * JIT_API cpu_raise_exception(cpu_ctx_t *cpu_ctx); -uint32_t JIT_API cpu_do_int(cpu_ctx_t *cpu_ctx, uint32_t int_flg); +JIT_API translated_code_t *cpu_raise_exception(cpu_ctx_t *cpu_ctx); +JIT_API uint32_t cpu_do_int(cpu_ctx_t *cpu_ctx, uint32_t int_flg); void halt_loop(cpu_t *cpu); -void JIT_API tlb_invalidate_(cpu_ctx_t *cpu_ctx, addr_t addr); +JIT_API void tlb_invalidate_(cpu_ctx_t *cpu_ctx, addr_t addr); // cpu hidden flags (assumed to be constant during exec of a tc, together with a flag subset of eflags) diff --git a/lib86cpu/core/linux/clock.h b/lib86cpu/core/linux/clock.h index abf0fd3..a27f8c0 100644 --- a/lib86cpu/core/linux/clock.h +++ b/lib86cpu/core/linux/clock.h @@ -12,4 +12,4 @@ uint64_t get_current_time(); void tsc_init(cpu_t *cpu); void cpu_timer_set_now(cpu_t *cpu); -uint32_t JIT_API cpu_timer_helper(cpu_ctx_t *cpu_ctx); +JIT_API uint32_t cpu_timer_helper(cpu_ctx_t *cpu_ctx); diff --git a/lib86cpu/core/memory_management.cpp b/lib86cpu/core/memory_management.cpp index 00523cc..44a03d4 100644 --- a/lib86cpu/core/memory_management.cpp +++ b/lib86cpu/core/memory_management.cpp @@ -703,31 +703,31 @@ void io_write_helper(cpu_ctx_t *cpu_ctx, port_t port, T val, uint32_t eip) io_write(cpu_ctx->cpu, port, val); } -template uint8_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); -template uint16_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); -template uint32_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); -template uint64_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); -template uint80_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); -template uint128_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint8_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint16_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint64_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint80_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint128_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint8_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint16_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint64_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint80_t val, uint32_t eip, uint8_t is_priv); -template void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint128_t val, uint32_t eip, uint8_t is_priv); - -template uint8_t io_read_helper(cpu_ctx_t *cpu_ctx, port_t port, uint32_t eip); -template uint16_t io_read_helper(cpu_ctx_t *cpu_ctx, port_t port, uint32_t eip); -template uint32_t io_read_helper(cpu_ctx_t *cpu_ctx, port_t port, uint32_t eip); -template void io_write_helper(cpu_ctx_t *cpu_ctx, port_t port, uint8_t val, uint32_t eip); -template void io_write_helper(cpu_ctx_t *cpu_ctx, port_t port, uint16_t val, uint32_t eip); -template void io_write_helper(cpu_ctx_t *cpu_ctx, port_t port, uint32_t val, uint32_t eip); +template JIT_API uint8_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); +template JIT_API uint16_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); +template JIT_API uint32_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); +template JIT_API uint64_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); +template JIT_API uint80_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); +template JIT_API uint128_t mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint8_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint16_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint64_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint80_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint128_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint8_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint16_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint64_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint80_t val, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint128_t val, uint32_t eip, uint8_t is_priv); + +template JIT_API uint8_t io_read_helper(cpu_ctx_t *cpu_ctx, port_t port, uint32_t eip); +template JIT_API uint16_t io_read_helper(cpu_ctx_t *cpu_ctx, port_t port, uint32_t eip); +template JIT_API uint32_t io_read_helper(cpu_ctx_t *cpu_ctx, port_t port, uint32_t eip); +template JIT_API void io_write_helper(cpu_ctx_t *cpu_ctx, port_t port, uint8_t val, uint32_t eip); +template JIT_API void io_write_helper(cpu_ctx_t *cpu_ctx, port_t port, uint16_t val, uint32_t eip); +template JIT_API void io_write_helper(cpu_ctx_t *cpu_ctx, port_t port, uint32_t val, uint32_t eip); template addr_t get_code_addr(cpu_t *cpu, addr_t addr, uint32_t eip, disas_ctx_t *disas_ctx); template addr_t get_code_addr(cpu_t *cpu, addr_t addr, uint32_t eip, disas_ctx_t *disas_ctx); diff --git a/lib86cpu/core/memory_management.h b/lib86cpu/core/memory_management.h index c9848df..b90a498 100644 --- a/lib86cpu/core/memory_management.h +++ b/lib86cpu/core/memory_management.h @@ -30,10 +30,10 @@ template T ram_read(cpu_t *cpu, void *ram_ptr); template void ram_write(cpu_t *cpu, void *ram_ptr, T value); void ram_fetch(cpu_t *cpu, disas_ctx_t *disas_ctx, uint8_t *buffer); uint64_t as_ram_dispatch_read(cpu_t *cpu, addr_t addr, uint64_t size, const memory_region_t *region, uint8_t *buffer); -template T JIT_API mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); -template void JIT_API mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, T val, uint32_t eip, uint8_t is_priv); -template T JIT_API io_read_helper(cpu_ctx_t * cpu_ctx, port_t port, uint32_t eip); -template void JIT_API io_write_helper(cpu_ctx_t * cpu_ctx, port_t port, T val, uint32_t eip); +template JIT_API T mem_read_helper(cpu_ctx_t *cpu_ctx, addr_t addr, uint32_t eip, uint8_t is_priv); +template JIT_API void mem_write_helper(cpu_ctx_t *cpu_ctx, addr_t addr, T val, uint32_t eip, uint8_t is_priv); +template JIT_API T io_read_helper(cpu_ctx_t * cpu_ctx, port_t port, uint32_t eip); +template JIT_API void io_write_helper(cpu_ctx_t * cpu_ctx, port_t port, T val, uint32_t eip); inline constexpr uint64_t tlb_access[2][4] = { { TLB_SUP_READ, TLB_SUP_READ, TLB_SUP_READ, TLB_USER_READ }, diff --git a/lib86cpu/core/translate.cpp b/lib86cpu/core/translate.cpp index f10f048..55bf440 100644 --- a/lib86cpu/core/translate.cpp +++ b/lib86cpu/core/translate.cpp @@ -2015,14 +2015,14 @@ dbg_exec_original_instr(cpu_t *cpu) cpu_main_loop(cpu, [&i]() { return i++ == 0; }); } -template translated_code_t *cpu_raise_exception<0, true>(cpu_ctx_t *cpu_ctx); -template translated_code_t *cpu_raise_exception<1, true>(cpu_ctx_t *cpu_ctx); -template translated_code_t *cpu_raise_exception<2, true>(cpu_ctx_t *cpu_ctx); -template translated_code_t *cpu_raise_exception<3, true>(cpu_ctx_t *cpu_ctx); -template translated_code_t *cpu_raise_exception<0, false>(cpu_ctx_t *cpu_ctx); -template translated_code_t *cpu_raise_exception<1, false>(cpu_ctx_t *cpu_ctx); -template translated_code_t *cpu_raise_exception<2, false>(cpu_ctx_t *cpu_ctx); -template translated_code_t *cpu_raise_exception<3, false>(cpu_ctx_t *cpu_ctx); +template JIT_API translated_code_t *cpu_raise_exception<0, true>(cpu_ctx_t *cpu_ctx); +template JIT_API translated_code_t *cpu_raise_exception<1, true>(cpu_ctx_t *cpu_ctx); +template JIT_API translated_code_t *cpu_raise_exception<2, true>(cpu_ctx_t *cpu_ctx); +template JIT_API translated_code_t *cpu_raise_exception<3, true>(cpu_ctx_t *cpu_ctx); +template JIT_API translated_code_t *cpu_raise_exception<0, false>(cpu_ctx_t *cpu_ctx); +template JIT_API translated_code_t *cpu_raise_exception<1, false>(cpu_ctx_t *cpu_ctx); +template JIT_API translated_code_t *cpu_raise_exception<2, false>(cpu_ctx_t *cpu_ctx); +template JIT_API translated_code_t *cpu_raise_exception<3, false>(cpu_ctx_t *cpu_ctx); template void tc_should_clear_cache_and_tlb(cpu_t *cpu, addr_t start, addr_t end); template lc86_status cpu_start(cpu_t *cpu); template lc86_status cpu_start(cpu_t *cpu); diff --git a/lib86cpu/core/windows/clock.h b/lib86cpu/core/windows/clock.h index 5c49020..9b2fc99 100644 --- a/lib86cpu/core/windows/clock.h +++ b/lib86cpu/core/windows/clock.h @@ -11,5 +11,5 @@ void tsc_init(cpu_t *cpu); void cpu_timer_set_now(cpu_t *cpu); -uint32_t JIT_API cpu_timer_helper(cpu_ctx_t *cpu_ctx); +JIT_API uint32_t cpu_timer_helper(cpu_ctx_t *cpu_ctx); uint64_t get_current_time(); diff --git a/lib86cpu/dbg/debugger.h b/lib86cpu/dbg/debugger.h index da2d110..981bbe7 100644 --- a/lib86cpu/dbg/debugger.h +++ b/lib86cpu/dbg/debugger.h @@ -19,7 +19,7 @@ void dbg_apply_sw_breakpoints(cpu_t *cpu); void dbg_apply_sw_breakpoints(cpu_t *cpu, addr_t addr); void dbg_remove_sw_breakpoints(cpu_t *cpu); void dbg_remove_sw_breakpoints(cpu_t *cpu, addr_t addr); -void JIT_API dbg_update_exp_hook(cpu_ctx_t *cpu_ctx); +JIT_API void dbg_update_exp_hook(cpu_ctx_t *cpu_ctx); void dbg_add_exp_hook(cpu_ctx_t *cpu_ctx); std::vector> dbg_disas_code_block(cpu_t *cpu, addr_t pc, unsigned instr_num); void dbg_exp_handler(cpu_ctx_t *cpu_ctx); diff --git a/lib86cpu/lib86cpu_priv.h b/lib86cpu/lib86cpu_priv.h index 3ff8a15..083a179 100644 --- a/lib86cpu/lib86cpu_priv.h +++ b/lib86cpu/lib86cpu_priv.h @@ -20,7 +20,7 @@ #ifdef _MSC_VER # define MS_ABI /* Nothing */ #else -# define MS_ABI __attribute__((__ms_abi__)) +# define MS_ABI [[gnu::ms_abi]] #endif # define JIT_API MS_ABI #endif @@ -103,10 +103,10 @@ struct exp_info_t { struct cpu_ctx_t; struct translated_code_t; -using entry_t = translated_code_t *(JIT_API *)(cpu_ctx_t *cpu_ctx); -using read_int_t = uint32_t(JIT_API *)(cpu_ctx_t *cpu_ctx); -using raise_int_t = void(JIT_API *)(cpu_ctx_t *cpu_ctx, uint32_t int_flg); -using clear_int_t = void(JIT_API *)(cpu_ctx_t *cpu_ctx, uint32_t int_flg); +using entry_t = JIT_API translated_code_t *(*)(cpu_ctx_t *cpu_ctx); +using read_int_t = JIT_API uint32_t(*)(cpu_ctx_t *cpu_ctx); +using raise_int_t = JIT_API void(*)(cpu_ctx_t *cpu_ctx, uint32_t int_flg); +using clear_int_t = JIT_API void(*)(cpu_ctx_t *cpu_ctx, uint32_t int_flg); // jmp_offset functions: 0,1 -> used for direct linking (either points to exit or &next_tc), 2 -> exit struct translated_code_t { diff --git a/lib86cpu/support.h b/lib86cpu/support.h index 5bc998f..c576795 100644 --- a/lib86cpu/support.h +++ b/lib86cpu/support.h @@ -48,7 +48,7 @@ class lc86_exp_abort : public std::runtime_error void cpu_reset(cpu_t *cpu); template lc86_status cpu_start(cpu_t *cpu); -[[noreturn]] void JIT_API cpu_runtime_abort(const char *msg); +[[noreturn]] JIT_API void cpu_runtime_abort(const char *msg); [[noreturn]] void cpu_abort(int32_t code, const char *msg, ...); void discard_log(log_level lv, const unsigned count, const char *msg, ...); lc86_status set_last_error(lc86_status status);