c_api.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. use std::mem;
  2. use std::ptr::NonNull;
  3. use jit::{cached_code, JitState};
  4. use page::Page;
  5. use state_flags::CachedStateFlags;
  6. static mut MODULE_PTR: NonNull<JitState> =
  7. unsafe { NonNull::new_unchecked(mem::align_of::<JitState>() as *mut _) };
  8. fn get_module<'a>() -> &'a mut JitState { unsafe { MODULE_PTR.as_mut() } }
  9. #[no_mangle]
  10. /// Called from JS, not C
  11. pub fn rust_setup() {
  12. let x = Box::new(JitState::create_and_initialise());
  13. unsafe {
  14. MODULE_PTR = NonNull::new(Box::into_raw(x)).expect("assigning module ptr");
  15. }
  16. use std::panic;
  17. panic::set_hook(Box::new(|panic_info| {
  18. if let Some(location) = panic_info.location() {
  19. dbg_log!(
  20. "panic occurred in file '{}' at line {}",
  21. location.file(),
  22. location.line()
  23. );
  24. }
  25. else {
  26. dbg_log!("panic occurred but can't get location information...");
  27. }
  28. }));
  29. }
  30. #[no_mangle]
  31. pub fn jit_find_cache_entry(phys_address: u32, state_flags: u32) -> u32 {
  32. let cached_code {
  33. wasm_table_index,
  34. initial_state,
  35. } = ::jit::jit_find_cache_entry(phys_address, CachedStateFlags::of_u32(state_flags));
  36. wasm_table_index as u32 | (initial_state as u32) << 16
  37. }
  38. #[no_mangle]
  39. /// Called from JS, not C
  40. pub fn codegen_finalize_finished(
  41. wasm_table_index: u16,
  42. phys_addr: u32,
  43. end_addr: u32,
  44. first_opcode: u32,
  45. state_flags: u32,
  46. ) {
  47. ::jit::codegen_finalize_finished(
  48. get_module(),
  49. wasm_table_index,
  50. phys_addr,
  51. end_addr,
  52. first_opcode,
  53. CachedStateFlags::of_u32(state_flags),
  54. )
  55. }
  56. #[no_mangle]
  57. pub fn jit_increase_hotness_and_maybe_compile(phys_address: u32, cs_offset: u32, state_flags: u32) {
  58. ::jit::jit_increase_hotness_and_maybe_compile(
  59. get_module(),
  60. phys_address,
  61. cs_offset,
  62. CachedStateFlags::of_u32(state_flags),
  63. )
  64. }
  65. #[no_mangle]
  66. #[cfg(debug_assertions)]
  67. pub fn jit_force_generate_unsafe(phys_addr: u32, cs_offset: u32, state_flags: u32) {
  68. ::jit::jit_force_generate_unsafe(
  69. get_module(),
  70. phys_addr,
  71. cs_offset,
  72. CachedStateFlags::of_u32(state_flags),
  73. )
  74. }
  75. #[no_mangle]
  76. pub fn jit_dirty_cache(start_addr: u32, end_addr: u32) {
  77. ::jit::jit_dirty_cache(get_module(), start_addr, end_addr);
  78. }
  79. #[no_mangle]
  80. pub fn jit_dirty_cache_small(start_addr: u32, end_addr: u32) {
  81. ::jit::jit_dirty_cache_small(get_module(), start_addr, end_addr);
  82. }
  83. #[no_mangle]
  84. pub fn jit_dirty_cache_single(addr: u32) { ::jit::jit_dirty_cache_single(get_module(), addr); }
  85. #[no_mangle]
  86. pub fn jit_page_has_code(page: u32) -> bool {
  87. ::jit::jit_page_has_code(get_module(), Page::page_of(page << 12))
  88. }
  89. #[no_mangle]
  90. /// Called from JS, not C
  91. pub fn jit_empty_cache() { ::jit::jit_empty_cache(get_module()) }
  92. #[no_mangle]
  93. /// Called from JS, not C
  94. pub fn jit_get_op_ptr() -> *const u8 { ::jit::jit_get_op_ptr(get_module()) }
  95. #[no_mangle]
  96. /// Called from JS, not C
  97. pub fn jit_get_op_len() -> u32 { ::jit::jit_get_op_len(get_module()) }
  98. #[no_mangle]
  99. #[cfg(debug_assertions)]
  100. pub fn jit_unused_cache_stat() -> u32 { ::jit::jit_unused_cache_stat() }
  101. #[no_mangle]
  102. #[cfg(debug_assertions)]
  103. pub fn jit_get_entry_length(i: u32) -> u32 { ::jit::jit_get_entry_length(i) }
  104. #[no_mangle]
  105. #[cfg(debug_assertions)]
  106. pub fn jit_get_entry_address(i: u32) -> u32 { ::jit::jit_get_entry_address(i) }
  107. #[no_mangle]
  108. #[cfg(debug_assertions)]
  109. pub fn jit_get_entry_pending(i: u32) -> bool { ::jit::jit_get_entry_pending(i) }
  110. #[no_mangle]
  111. #[cfg(debug_assertions)]
  112. pub fn jit_get_wasm_table_index_free_list_count() -> u32 {
  113. ::jit::jit_get_wasm_table_index_free_list_count(get_module())
  114. }