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"
8#include "mos/mm/mm.hpp"
14
16
18{
19 public:
27
28 public:
29 u8 ReadByte() override
30 {
31 return mmio[0];
32 }
33
34 int WriteByte(u8 data) override
35 {
36 mmio[0] = data;
37 return 0;
38 }
39
41 {
42 return mmio[reg];
43 }
44
45 void write_register(serial_register_t reg, u8 data) override
46 {
47 mmio[reg] = data;
48 }
49
50 bool get_data_ready() override
51 {
52 return true;
53 }
54
55 private:
56 volatile u8 *mmio;
57};
58
59static RiscV64UartDevice uart_serial_device{ (void *) pa_va(0x10000000) };
60
62
64 .boot_console = &uart_console,
65};
67
69{
70 platform_info->num_cpus = 1;
71
73
74 reg_t sstatus = read_csr(sstatus);
75 sstatus |= SSTATUS_SUM;
76 sstatus |= SSTATUS_FS_INITIAL; // enable sstatus.FS
77 write_csr(sstatus, sstatus);
78 write_csr(sie, SIE_SEIE | SIE_STIE | SIE_SSIE); // enable supervisor interrupts
79}
80
82{
83 // even SV39 supports 1 GB pages
84 const size_t STEP = 1 GB / MOS_PAGE_SIZE;
85 const size_t total_npages = ALIGN_UP(platform_info->max_pfn, STEP);
86
87 for (pfn_t pfn = 0; pfn < total_npages; pfn += STEP)
88 {
89 const ptr_t vaddr = pfn_va(pfn);
90 pml4e_t *pml4e = pml4_entry(platform_info->kernel_mm->pgd.max.next, vaddr);
91
92 // GB pages are at pml3e level
93 const pml3_t pml3 = pml4e_get_or_create_pml3(pml4e);
94 pml3e_t *const pml3e = pml3_entry(pml3, vaddr);
95 platform_pml3e_set_huge(pml3e, pfn);
97 }
98}
99
101 .name = "goldfish",
102 .ticks = 0,
103 .frequency = 500,
104};
105
void platform_pml3e_set_flags(pml3e_t *pml3e, VMFlags flags)
Definition mm.cpp:176
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
RiscV64UartDevice(void *mmio)
u8 read_register(serial_register_t reg) override
int WriteByte(u8 data) override
bool get_data_ready() override
void clocksource_register(clocksource_t *clocksource)
@ CONSOLE_CAP_READ
console supports read
Definition console.hpp:22
@ LightBlue
Definition ansi_colors.h:28
@ Black
Definition ansi_colors.h:19
#define pa_va(pa)
Definition mm.hpp:87
#define pfn_va(pfn)
Definition mm.hpp:83
void interrupt_handler_register(u32 irq, irq_serve_t handler, void *data)
Register an interrupt handler.
Definition interrupt.cpp:35
@ VM_GLOBAL
Definition mm_types.hpp:20
@ VM_READ
Definition mm_types.hpp:13
@ VM_WRITE
Definition mm_types.hpp:14
#define GB
Definition mos_global.h:100
#define ALIGN_UP(addr, size)
Definition mos_global.h:74
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:33
#define read_csr(reg)
Definition cpu.hpp:12
#define SIE_SEIE
Definition cpu.hpp:31
#define SIE_STIE
Definition cpu.hpp:32
#define write_csr(reg, val)
Definition cpu.hpp:13
const char __riscv64_trap_entry[]
#define SSTATUS_SUM
Definition cpu.hpp:24
#define SSTATUS_FS_INITIAL
Definition cpu.hpp:27
#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)
clocksource_t goldfish
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