MOS Source Code
Loading...
Searching...
No Matches
riscv64_platform.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3// #include "mos/device/console.hpp"
7#include "mos/mm/mm.hpp"
13
15
17{
18 public:
26
27 public:
28 u8 read_byte() override
29 {
30 return mmio[0];
31 }
32
33 int write_byte(u8 data) override
34 {
35 mmio[0] = data;
36 return 0;
37 }
38
40 {
41 return mmio[reg];
42 }
43
44 void write_register(serial_register_t reg, u8 data) override
45 {
46 mmio[reg] = data;
47 }
48
49 bool get_data_ready() override
50 {
51 return true;
52 }
53
54 private:
55 volatile u8 *mmio;
56};
57
58static RiscV64UartDevice uart_serial_device{ (void *) pa_va(0x10000000) };
59
61
63 .boot_console = &uart_console,
64};
66
68{
69 platform_info->num_cpus = 1;
70
72
73 reg_t sstatus = read_csr(sstatus);
74 sstatus |= SSTATUS_SUM;
75 sstatus |= SSTATUS_FS_INITIAL; // enable sstatus.FS
76 write_csr(sstatus, sstatus);
77 write_csr(sie, SIE_SEIE | SIE_STIE | SIE_SSIE); // enable supervisor interrupts
78}
79
81{
82 // even SV39 supports 1 GB pages
83 const size_t STEP = 1 GB / MOS_PAGE_SIZE;
84 const size_t total_npages = ALIGN_UP(platform_info->max_pfn, STEP);
85
86 for (pfn_t pfn = 0; pfn < total_npages; pfn += STEP)
87 {
88 const ptr_t vaddr = pfn_va(pfn);
89 pml4e_t *pml4e = pml4_entry(platform_info->kernel_mm->pgd.max.next, vaddr);
90
91 // GB pages are at pml3e level
92 const pml3_t pml3 = pml4e_get_or_create_pml3(pml4e);
93 pml3e_t *const pml3e = pml3_entry(pml3, vaddr);
94 platform_pml3e_set_huge(pml3e, pfn);
96 }
97}
98
void platform_pml3e_set_flags(pml3e_t *pml3e, vm_flags flags)
Definition mm.cpp:175
void platform_pml3e_set_huge(pml3e_t *pml3e, pfn_t pfn)
Definition paging.cpp:251
#define MOS_PAGE_SIZE
Definition autoconf.h:6
serial_baudrate_t baudrate_divisor
Definition serial.hpp:88
serial_parity_t parity
Definition serial.hpp:91
serial_charlength_t char_length
Definition serial.hpp:89
serial_stopbits_t stop_bits
Definition serial.hpp:90
void write_register(serial_register_t reg, u8 data) override
int write_byte(u8 data) override
RiscV64UartDevice(void *mmio)
u8 read_register(serial_register_t reg) override
u8 read_byte() override
bool get_data_ready() override
@ CONSOLE_CAP_READ
console supports read
Definition console.hpp:21
@ LightBlue
Definition ansi_colors.h:28
@ Black
Definition ansi_colors.h:19
#define pa_va(pa)
Definition mm.hpp:81
#define pfn_va(pfn)
Definition mm.hpp:77
void interrupt_handler_register(u32 irq, irq_serve_t handler, void *data)
Register an interrupt handler.
Definition interrupt.cpp:35
#define GB
Definition mos_global.h:100
#define ALIGN_UP(addr, size)
Definition mos_global.h:74
@ VM_GLOBAL
Definition platform.hpp:51
@ VM_READ
Definition platform.hpp:44
@ VM_WRITE
Definition platform.hpp:45
void plic_enable_irq(u32 irq)
Definition plic.cpp:32
pml3e_t * pml3_entry(pml3_t pml3, ptr_t vaddr)
Definition pml3.cpp:21
pml3_t pml4e_get_or_create_pml3(pml4e_t *pml4e)
pml4e_t * pml4_entry(pml4_t pml4, ptr_t vaddr)
Definition pml4.cpp:22
pml3e_t pml4e_t
Definition pml_types.hpp:72
pml2e_t pml3e_t
Definition pml_types.hpp:60
#define SIE_SSIE
Definition cpu.hpp:44
#define read_csr(reg)
Definition cpu.hpp:23
#define SIE_SEIE
Definition cpu.hpp:42
#define SIE_STIE
Definition cpu.hpp:43
#define write_csr(reg, val)
Definition cpu.hpp:24
const char __riscv64_trap_entry[]
#define SSTATUS_SUM
Definition cpu.hpp:35
#define SSTATUS_FS_INITIAL
Definition cpu.hpp:38
#define UART0_IRQ
void platform_startup_setup_kernel_mm()
SerialConsole uart_console
static Buffer< MOS_PAGE_SIZE > uart_buf
void platform_startup_late()
static RiscV64UartDevice uart_serial_device
static mos_platform_info_t riscv64_platform_info
void platform_startup_early()
mos_platform_info_t *const platform_info
@ STOP_BITS_1
Definition serial.hpp:31
serial_register_t
Definition serial.hpp:8
@ CHAR_LENGTH_8
Definition serial.hpp:26
@ BAUD_RATE_115200
Definition serial.hpp:56
@ PARITY_NONE
Definition serial.hpp:37
bool serial_console_irq_handler(u32 irq, void *data)
uintn reg_t
Definition types.h:47
unsigned long long pfn_t
Definition types.h:37
unsigned long ptr_t
Definition types.h:21
unsigned char u8
Definition types.h:15