cpu.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #pragma once
  2. #include <assert.h>
  3. #include <stdbool.h>
  4. #include <stdint.h>
  5. #include "const.h"
  6. #include "config.h"
  7. #include "shared.h"
  8. union reg128 {
  9. int8_t i8[16];
  10. int16_t i16[8];
  11. int32_t i32[4];
  12. int64_t i64[2];
  13. uint8_t u8[16];
  14. uint16_t u16[8];
  15. uint32_t u32[4];
  16. uint64_t u64[2];
  17. };
  18. _Static_assert(sizeof(union reg128) == 16, "reg128 is 16 bytes");
  19. union reg64 {
  20. int8_t i8[8];
  21. int16_t i16[4];
  22. int32_t i32[2];
  23. int64_t i64[1];
  24. uint8_t u8[8];
  25. uint16_t u16[4];
  26. uint32_t u32[2];
  27. uint64_t u64[1];
  28. double f64[1];
  29. };
  30. _Static_assert(sizeof(union reg64) == 8, "reg64 is 8 bytes");
  31. typedef uint8_t cached_state_flags;
  32. // Flag indicating whether the instruction that just ran was at a block's boundary (jump,
  33. // state-altering, etc.)
  34. extern uint32_t jit_block_boundary;
  35. #define VALID_TLB_ENTRY_MAX 10000
  36. int32_t valid_tlb_entries[VALID_TLB_ENTRY_MAX];
  37. int32_t valid_tlb_entries_count;
  38. #define TLB_VALID (1 << 0)
  39. #define TLB_READONLY (1 << 1)
  40. #define TLB_NO_USER (1 << 2)
  41. #define TLB_IN_MAPPED_RANGE (1 << 3)
  42. #define TLB_GLOBAL (1 << 4)
  43. #define TLB_HAS_CODE (1 << 5)
  44. // defined in call-indirect.ll
  45. extern void call_indirect(int32_t index);
  46. extern void call_indirect1(int32_t index, int32_t arg);
  47. void after_block_boundary(void);
  48. bool same_page(int32_t, int32_t);
  49. int32_t get_eflags(void);
  50. uint32_t translate_address_read(int32_t address);
  51. uint32_t translate_address_write(int32_t address);
  52. void tlb_set_has_code(uint32_t physical_page, bool has_code);
  53. void check_tlb_invariants(void);
  54. void writable_or_pagefault(int32_t addr, int32_t size);
  55. int32_t read_imm8(void);
  56. int32_t read_imm8s(void);
  57. int32_t read_imm16(void);
  58. int32_t read_imm32s(void);
  59. bool is_osize_32(void);
  60. bool is_asize_32(void);
  61. int32_t get_seg(int32_t segment);
  62. int32_t get_seg_cs(void);
  63. int32_t get_seg_ss(void);
  64. int32_t get_seg_prefix(int32_t default_segment);
  65. int32_t get_seg_prefix_ds(int32_t offset);
  66. int32_t get_seg_prefix_ss(int32_t offset);
  67. int32_t get_seg_prefix_cs(int32_t offset);
  68. int32_t modrm_resolve(int32_t modrm_byte);
  69. void cycle_internal(void);
  70. void run_prefix_instruction(void);
  71. void clear_prefixes(void);
  72. void segment_prefix_op(int32_t seg);
  73. bool has_flat_segmentation(void);
  74. void do_many_cycles_unsafe(void);
  75. void raise_exception(int32_t interrupt_nr);
  76. void raise_exception_with_code(int32_t interrupt_nr, int32_t error_code);
  77. void trigger_de(void);
  78. void trigger_ud(void);
  79. void trigger_nm(void);
  80. void trigger_gp(int32_t code);
  81. int32_t virt_boundary_read16(int32_t low, int32_t high);
  82. int32_t virt_boundary_read32s(int32_t low, int32_t high);
  83. void virt_boundary_write16(int32_t low, int32_t high, int32_t value);
  84. void virt_boundary_write32(int32_t low, int32_t high, int32_t value);
  85. int32_t safe_read8(int32_t addr);
  86. int32_t safe_read16(int32_t addr);
  87. int32_t safe_read32s(int32_t address);
  88. union reg64 safe_read64s(int32_t addr);
  89. union reg128 safe_read128s(int32_t addr);
  90. void safe_write8(int32_t addr, int32_t value);
  91. void safe_write16(int32_t addr, int32_t value);
  92. void safe_write32(int32_t address, int32_t value);
  93. void safe_write64(int32_t addr, int64_t value);
  94. void safe_write128(int32_t addr, union reg128 value);
  95. int32_t get_reg8_index(int32_t index);
  96. int32_t read_reg8(int32_t index);
  97. void write_reg8(int32_t index, int32_t value);
  98. int32_t get_reg16_index(int32_t index);
  99. int32_t read_reg16(int32_t index);
  100. void write_reg16(int32_t index, int32_t value);
  101. int32_t read_reg32(int32_t index);
  102. void write_reg32(int32_t index, int32_t value);
  103. void write_reg_osize(int32_t index, int32_t value);
  104. int32_t read_mmx32s(int32_t r);
  105. union reg64 read_mmx64s(int32_t r);
  106. void write_mmx64(int32_t r, int32_t low, int32_t high);
  107. void write_mmx_reg64(int32_t r, union reg64 data);
  108. union reg64 read_xmm64s(int32_t r);
  109. union reg128 read_xmm128s(int32_t r);
  110. void write_xmm64(int32_t r, union reg64 data);
  111. void write_xmm128(int32_t r, int32_t i0, int32_t i1, int32_t i2, int32_t i3);
  112. void write_xmm_reg128(int32_t r, union reg128 data);
  113. void clear_tlb(void);
  114. void full_clear_tlb(void);
  115. void task_switch_test(void);
  116. void task_switch_test_mmx(void);
  117. int32_t read_moffs(void);
  118. int32_t get_real_eip(void);
  119. int32_t get_stack_reg(void);
  120. void set_stack_reg(int32_t value);
  121. int32_t get_reg_asize(int32_t reg);
  122. void set_ecx_asize(int32_t value);
  123. void add_reg_asize(int32_t reg, int32_t value);
  124. int32_t decr_ecx_asize(void);
  125. void set_tsc(uint32_t, uint32_t);
  126. uint64_t read_tsc(void);
  127. bool vm86_mode(void);
  128. int32_t getiopl(void);
  129. int32_t get_opstats_buffer(int32_t index);