feat: initial scalable x86_64 microkernel skeleton with Limine, Rust, C HAL, and C++20 IPC

This commit is contained in:
RarDog
2026-09-02 16:47:37 +03:00
commit 9cffb01889
47 changed files with 2432 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
#pragma once
#include "stdint.h"
#define LAPIC_ID_REG 0x020
#define LAPIC_VERSION_REG 0x030
#define LAPIC_TPR_REG 0x080
#define LAPIC_EOI_REG 0x0B0
#define LAPIC_SVR_REG 0x0F0
#define LAPIC_ICR_LOW_REG 0x300
#define LAPIC_ICR_HIGH_REG 0x310
#define LAPIC_LVT_TIMER_REG 0x320
#define LAPIC_TIMER_INIT_REG 0x380
#define LAPIC_TIMER_CURR_REG 0x390
#define LAPIC_TIMER_DIV_REG 0x3E0
#ifdef __cplusplus
extern "C" {
#endif
void lapic_init(uintptr_t lapic_base_vaddr);
void lapic_eoi(void);
uint32_t lapic_read(uint32_t reg);
void lapic_write(uint32_t reg, uint32_t value);
uint32_t lapic_get_id(void);
#ifdef __cplusplus
}
#endif
+34
View File
@@ -0,0 +1,34 @@
#pragma once
#include "stdint.h"
#define PCI_CONFIG_ADDRESS 0xCF8
#define PCI_CONFIG_DATA 0xCFC
typedef struct pci_device {
uint8_t bus;
uint8_t slot;
uint8_t func;
uint16_t vendor_id;
uint16_t device_id;
uint8_t class_code;
uint8_t subclass;
uint8_t prog_if;
uint8_t header_type;
} pci_device_t;
#ifdef __cplusplus
extern "C" {
#endif
uint32_t pci_read_config_dword(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset);
void pci_write_config_dword(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset, uint32_t val);
uint16_t pci_get_vendor_id(uint8_t bus, uint8_t slot, uint8_t func);
uint16_t pci_get_device_id(uint8_t bus, uint8_t slot, uint8_t func);
typedef void (*pci_scan_callback_t)(const pci_device_t *dev);
void pci_scan_bus(pci_scan_callback_t callback);
#ifdef __cplusplus
}
#endif
+36
View File
@@ -0,0 +1,36 @@
#pragma once
#include "stdint.h"
#include "stddef.h"
#define UART_COM1_PORT 0x3F8
#define UART_COM2_PORT 0x2F8
#ifdef __cplusplus
extern "C" {
#endif
/* Initialize 16550 UART port with target baud rate */
int uart_init(uint16_t port, uint32_t baud);
/* Check if transmit buffer is empty */
int uart_is_tx_empty(uint16_t port);
/* Transmit a single character */
void uart_putc(uint16_t port, char c);
/* Transmit a null-terminated string */
void uart_puts(uint16_t port, const char *s);
/* Transmit a buffer of given length */
void uart_write(uint16_t port, const char *buf, size_t len);
/* Check if data received */
int uart_has_data(uint16_t port);
/* Read a single character (blocking) */
char uart_getc(uint16_t port);
#ifdef __cplusplus
}
#endif