cpu.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // TODO: Make this an instance, so we can plug in a fake cpu
  2. use page::Page;
  3. use state_flags::CachedStateFlags;
  4. mod unsafe_cpu {
  5. extern "C" {
  6. pub fn tlb_set_has_code(physical_page: u32, has_code: bool);
  7. pub fn read8(addr: u32) -> u8;
  8. pub fn read16(addr: u32) -> u16;
  9. pub fn read32(addr: u32) -> u32;
  10. pub fn check_tlb_invariants();
  11. pub fn codegen_finalize(
  12. wasm_table_index: u16,
  13. phys_addr: u32,
  14. end_addr: u32,
  15. first_opcode: u32,
  16. state_flags: u32,
  17. );
  18. }
  19. }
  20. pub fn read8(addr: u32) -> u8 { unsafe { unsafe_cpu::read8(addr) } }
  21. pub fn read16(addr: u32) -> u16 { unsafe { unsafe_cpu::read16(addr) } }
  22. pub fn read32(addr: u32) -> u32 { unsafe { unsafe_cpu::read32(addr) } }
  23. pub fn tlb_set_has_code(physical_page: Page, has_code: bool) {
  24. unsafe { unsafe_cpu::tlb_set_has_code(physical_page.to_u32(), has_code) }
  25. }
  26. pub fn check_tlb_invariants() { unsafe { unsafe_cpu::check_tlb_invariants() } }
  27. pub fn codegen_finalize(
  28. wasm_table_index: u16,
  29. phys_addr: u32,
  30. end_addr: u32,
  31. first_opcode: u32,
  32. state_flags: CachedStateFlags,
  33. ) {
  34. unsafe {
  35. unsafe_cpu::codegen_finalize(
  36. wasm_table_index,
  37. phys_addr,
  38. end_addr,
  39. first_opcode,
  40. state_flags.to_u32(),
  41. )
  42. }
  43. }