blob: b31dda6fc427c0d726d22c88270633bb271ecf6d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <cstdint>
#define PAGE_SIZE 4096
#define PAGING_PRESENT (1 << 0)
#define PAGING_RW (1 << 1)
#define PAGING_USER (1 << 2)
#define PAGING_NC (1 << 3)
#define PAGING_WC (1 << 4)
#define PTE_INDEX(address, bit) ((address & (uint64_t) 0x1FF << bit) >> bit)
#define ARCH_INIT_EARLY 0
#define ARCH_INIT_COMMON 1
#define ARCH_INIT_MP 2
#define IRQ_TYPE_OTHER 0
#define IRQ_TYPE_LEGACY 1
#define IRQ_TYPE_MSI 2
namespace arch {
extern void init(int stage);
extern void disable_interrupts();
extern void enable_interrupts();
extern void wait_for_interrupt();
extern void hcf();
extern void pause();
extern void tlb_flush(std::uintptr_t hint, std::uintptr_t len);
extern const char* name();
extern void enable_paging(std::uintptr_t root);
extern void map_page(std::uintptr_t root, std::uint64_t phys, std::uintptr_t virt, int flags);
extern std::uint64_t get_phys_from_page(std::uintptr_t root, std::uintptr_t virt);
extern void destroy_root(std::uintptr_t root, int level);
extern void copy_higher_half(std::uintptr_t root, std::uintptr_t src_root);
extern int level_paging();
extern bool test_interrupts();
extern std::uint64_t current_root();
extern void memory_barrier();
extern int register_handler(int irq, int type, std::uint64_t flags, void (*func)(void* arg), void* arg);
extern void panic(char* msg);
};
|