summaryrefslogtreecommitdiff
path: root/kernel/src/generic/arch.hpp
blob: b983a1bd71a99d0b03f140d2ebedf5fec4c5f9b0 (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
#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 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);

};