feat: initial scalable x86_64 microkernel skeleton with Limine, Rust, C HAL, and C++20 IPC
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user