blob: 7da036aa638fe6939dac5f1a6dc4aadcc96039ef (
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
|
#pragma once
#include <klibc/stdio.hpp>
#include <cstdint>
namespace riscv64 {
#define SATP64_MODE 0xF000000000000000
#define PAGING_3LEVEL 8
#define PAGING_4LEVEL 9
#define PAGING_5LEVEL 10
inline int level_paging = 0;
inline int raw_level_paging = 0;
static inline int get_paging_level() {
if (level_paging == 0) {
std::uint64_t satp_value = 0;
asm volatile("csrr %0, satp" : "=r"(satp_value));
std::uint64_t current_mode = (satp_value & SATP64_MODE) >> 60;
raw_level_paging = current_mode;
switch (current_mode) {
case PAGING_3LEVEL: riscv64::level_paging = 3; break;
case PAGING_4LEVEL: riscv64::level_paging = 4; break;
case PAGING_5LEVEL: riscv64::level_paging = 5; break;
default: klibc::printf("Unsupported level paging for riscv64 ! (%d)\n", current_mode); return 0;
};
}
return riscv64::level_paging;
}
}; // namespace riscv64
|