| 1 | /* @title: TLB */ |
| 2 | #include <acpi/lapic.h> |
| 3 | #include <mem/page.h> |
| 4 | #include <stdatomic.h> |
| 5 | #include <stdint.h> |
| 6 | #include <types/types.h> |
| 7 | |
| 8 | /* per-cpu */ |
| 9 | #define TLB_QUEUE_SIZE 64 |
| 10 | |
| 11 | struct tlb_shootdown_cpu { |
| 12 | _Atomic uintptr_t queue[TLB_QUEUE_SIZE]; |
| 13 | _Atomic uint32_t head; |
| 14 | _Atomic uint32_t tail; |
| 15 | atomic_bool in_tlb_shootdown; |
| 16 | _Atomic uint8_t flush_all; |
| 17 | _Atomic uint64_t req_gen; /* last requested generation */ |
| 18 | _Atomic uint64_t done_gen; /* last completed generation */ |
| 19 | }; |
| 20 | |
| 21 | void tlb_init(void); |
| 22 | enum irq_result tlb_shootdown_isr(void *ctx, irq_t irq, |
| 23 | struct irq_context *rsp); |
| 24 | void tlb_shootdown(uintptr_t addr, bool synchronous); |
| 25 | |