mirror of
https://github.com/BoredDevNL/BoredOS.git
synced 2026-05-15 10:48:38 +00:00
201 lines
6.5 KiB
C
201 lines
6.5 KiB
C
#include "kernel_subsystem.h"
|
|
#include "smp.h"
|
|
#include "pci.h"
|
|
#include "memory_manager.h"
|
|
#include "module_manager.h"
|
|
#include "io.h"
|
|
#include "core/kutils.h"
|
|
#include "wm/graphics.h"
|
|
#include "core/platform.h"
|
|
|
|
// --- Helper: itoa ---
|
|
static void sys_itoa(int n, char *s) {
|
|
k_itoa(n, s);
|
|
}
|
|
|
|
// --- Graphics Implementation ---
|
|
static int read_gfx_drm(char *buf, int size, int offset) {
|
|
char out[512];
|
|
k_memset(out, 0, 512);
|
|
k_strcpy(out, "Driver: Simple Framebuffer\n");
|
|
k_strcpy(out + k_strlen(out), "Resolution: ");
|
|
char s[32]; k_itoa(get_screen_width(), s);
|
|
k_strcpy(out + k_strlen(out), s);
|
|
k_strcpy(out + k_strlen(out), "x");
|
|
k_itoa(get_screen_height(), s);
|
|
k_strcpy(out + k_strlen(out), s);
|
|
k_strcpy(out + k_strlen(out), "\nDepth: ");
|
|
k_itoa(graphics_get_fb_bpp(), s);
|
|
k_strcpy(out + k_strlen(out), s);
|
|
k_strcpy(out + k_strlen(out), " bpp\nAddress: 0x");
|
|
k_itoa_hex(graphics_get_fb_addr(), s);
|
|
k_strcpy(out + k_strlen(out), s);
|
|
k_strcpy(out + k_strlen(out), "\n");
|
|
|
|
int len = (int)k_strlen(out);
|
|
if (offset >= len) return 0;
|
|
int to_copy = len - offset;
|
|
if (to_copy > size) to_copy = size;
|
|
k_memcpy(buf, out + offset, to_copy);
|
|
return to_copy;
|
|
}
|
|
|
|
// --- Memory Tracking Implementation ---
|
|
static int read_mem_tracking(char *buf, int size, int offset) {
|
|
MemStats stats = memory_get_stats();
|
|
char out[1024];
|
|
k_memset(out, 0, 1024);
|
|
|
|
k_strcpy(out, "--- Kernel Heap Tracking ---\n");
|
|
k_strcpy(out + k_strlen(out), "Allocated Blocks: ");
|
|
char s[32]; k_itoa(stats.allocated_blocks, s);
|
|
k_strcpy(out + k_strlen(out), s);
|
|
k_strcpy(out + k_strlen(out), "\nFragmentation: ");
|
|
k_itoa(stats.fragmentation_percent, s);
|
|
k_strcpy(out + k_strlen(out), s);
|
|
k_strcpy(out + k_strlen(out), "%\n");
|
|
|
|
int len = (int)k_strlen(out);
|
|
if (offset >= len) return 0;
|
|
int to_copy = len - offset;
|
|
if (to_copy > size) to_copy = size;
|
|
k_memcpy(buf, out + offset, to_copy);
|
|
return to_copy;
|
|
}
|
|
|
|
// --- Module Implementation ---
|
|
static int read_sys_modules(char *buf, int size, int offset) {
|
|
int count = module_manager_get_count();
|
|
char out[2048] = "Loaded Modules:\n";
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
kernel_module_t *mod = module_manager_get_index(i);
|
|
k_strcpy(out + k_strlen(out), " - ");
|
|
k_strcpy(out + k_strlen(out), mod->name);
|
|
k_strcpy(out + k_strlen(out), " (");
|
|
char sz_s[16]; k_itoa(mod->size / 1024, sz_s);
|
|
k_strcpy(out + k_strlen(out), sz_s);
|
|
k_strcpy(out + k_strlen(out), " KB)\n");
|
|
}
|
|
|
|
int len = k_strlen(out);
|
|
if (offset >= len) return 0;
|
|
int to_copy = len - offset;
|
|
if (to_copy > size) to_copy = size;
|
|
k_memcpy(buf, out + offset, to_copy);
|
|
return to_copy;
|
|
}
|
|
|
|
// --- PCI Bus Implementation ---
|
|
static int read_pci_bus(char *buf, int size, int offset) {
|
|
pci_device_t devices[64];
|
|
int count = pci_enumerate_devices(devices, 64);
|
|
|
|
char out[4096];
|
|
k_memset(out, 0, 4096);
|
|
k_strcpy(out, "PCI Bus Devices:\n");
|
|
for (int i = 0; i < count; i++) {
|
|
char line[128];
|
|
k_strcpy(line, " [");
|
|
char b_s[8]; k_itoa(devices[i].bus, b_s);
|
|
k_strcpy(line + k_strlen(line), b_s);
|
|
k_strcpy(line + k_strlen(line), ":");
|
|
k_itoa(devices[i].device, b_s);
|
|
k_strcpy(line + k_strlen(line), b_s);
|
|
k_strcpy(line + k_strlen(line), ":");
|
|
k_itoa(devices[i].function, b_s);
|
|
k_strcpy(line + k_strlen(line), b_s);
|
|
k_strcpy(line + k_strlen(line), "] Vendor:");
|
|
k_itoa_hex(devices[i].vendor_id, b_s);
|
|
k_strcpy(line + k_strlen(line), b_s);
|
|
k_strcpy(line + k_strlen(line), " Device:");
|
|
k_itoa_hex(devices[i].device_id, b_s);
|
|
k_strcpy(line + k_strlen(line), b_s);
|
|
k_strcpy(line + k_strlen(line), " Class:");
|
|
k_itoa_hex(devices[i].class_code, b_s);
|
|
k_strcpy(line + k_strlen(line), b_s);
|
|
k_strcpy(line + k_strlen(line), "\n");
|
|
|
|
if (k_strlen(out) + k_strlen(line) < 4095) {
|
|
k_strcpy(out + k_strlen(out), line);
|
|
}
|
|
}
|
|
|
|
int len = (int)k_strlen(out);
|
|
if (offset >= len) return 0;
|
|
int to_copy = len - offset;
|
|
if (to_copy > size) to_copy = size;
|
|
k_memcpy(buf, out + offset, to_copy);
|
|
return to_copy;
|
|
}
|
|
|
|
// --- CPU System Implementation ---
|
|
static int read_cpu_info(char *buf, int size, int offset) {
|
|
char out[1024];
|
|
k_memset(out, 0, 1024);
|
|
char vendor[16];
|
|
platform_get_cpu_vendor(vendor);
|
|
k_strcpy(out + k_strlen(out), vendor);
|
|
k_strcpy(out + k_strlen(out), "\nCores: ");
|
|
char c_s[16]; k_itoa(smp_cpu_count(), c_s);
|
|
k_strcpy(out + k_strlen(out), c_s);
|
|
k_strcpy(out + k_strlen(out), "\nSpeed: ~3.00 GHz\nFeatures: sse sse2 sse3 apic smp\n");
|
|
|
|
int len = (int)k_strlen(out);
|
|
if (offset >= len) return 0;
|
|
int to_copy = len - offset;
|
|
if (to_copy > size) to_copy = size;
|
|
k_memcpy(buf, out + offset, to_copy);
|
|
return to_copy;
|
|
}
|
|
|
|
// --- GPIO Implementation ---
|
|
static int read_gpio_debug(char *buf, int size, int offset) {
|
|
uint8_t p64 = inb(0x64);
|
|
char out[64] = "Port 0x64 Status: ";
|
|
char s[16]; k_itoa(p64, s);
|
|
k_strcpy(out + k_strlen(out), s);
|
|
k_strcpy(out + k_strlen(out), "\n");
|
|
|
|
int len = k_strlen(out);
|
|
if (offset >= len) return 0;
|
|
int to_copy = len - offset;
|
|
if (to_copy > size) to_copy = size;
|
|
k_memcpy(buf, out + offset, to_copy);
|
|
return to_copy;
|
|
}
|
|
|
|
void sysfs_init_subsystems(void) {
|
|
kernel_subsystem_t *kernel, *devices, *bus, *class, *debug, *mem_debug;
|
|
|
|
subsystem_register("kernel", &kernel);
|
|
subsystem_register("devices", &devices);
|
|
subsystem_register("bus", &bus);
|
|
subsystem_register("class", &class);
|
|
subsystem_register("kernel/debug", &debug);
|
|
|
|
// CPU info
|
|
subsystem_add_file(kernel, "cpuinfo", read_cpu_info, NULL);
|
|
|
|
// Bus info
|
|
kernel_subsystem_t *pci_bus;
|
|
subsystem_register("bus/pci", &pci_bus);
|
|
subsystem_add_file(pci_bus, "devices", read_pci_bus, NULL);
|
|
|
|
// Module info
|
|
kernel_subsystem_t *modules_sub;
|
|
subsystem_register("module", &modules_sub);
|
|
subsystem_add_file(modules_sub, "loaded", read_sys_modules, NULL);
|
|
|
|
// Memory Tracking
|
|
subsystem_register("kernel/debug/memory", &mem_debug);
|
|
subsystem_add_file(mem_debug, "tracking", read_mem_tracking, NULL);
|
|
|
|
// Graphics DRM
|
|
kernel_subsystem_t *gfx_debug;
|
|
subsystem_register("kernel/debug/graphics", &gfx_debug);
|
|
subsystem_add_file(gfx_debug, "drm", read_gfx_drm, NULL);
|
|
|
|
// GPIO
|
|
subsystem_add_file(debug, "gpio", read_gpio_debug, NULL);
|
|
}
|