#include "ipc.hpp" #include "stdio.h" #include "stdlib.h" #include "string.h" #define UART_ENDPOINT 2 static void print_prompt() { puts("osh> "); } static void handle_command(const char *cmd) { if (strcmp(cmd, "help") == 0) { puts("Available opencoreC Shell Commands:"); puts(" help - Show this help menu"); puts(" ps - List active tasks and status"); puts(" mem - Test dynamic heap memory (malloc/free)"); puts(" shm - Test Zero-Copy Shared Memory (sys_mem_share)"); puts(" ping - Send synchronous Fast-Path IPC ping to kernel"); puts(" write - Send IPC write message to UART driver"); puts(" clear - Clear screen"); } else if (strcmp(cmd, "ps") == 0) { puts("PID TID STATE NAME SPACE"); puts("1 1 RUNNING init_server USER (0x400000)"); puts("2 2 READY uart_driver USER (0x400000)"); puts("3 3 RUNNING sh USER (0x400000)"); } else if (strcmp(cmd, "mem") == 0) { puts("[MEM-TEST] Allocating 1024 bytes with C++ malloc()..."); char *buf = (char *)malloc(1024); if (buf) { strcpy(buf, "Hello from Dynamic Heap in Ring 3!"); puts("[MEM-TEST] Allocated buffer successfully!"); puts(buf); free(buf); puts("[MEM-TEST] Free completed."); } else { puts("[MEM-TEST] Allocation failed!"); } } else if (strcmp(cmd, "shm") == 0) { puts("[SHM-TEST] Creating 4096-byte buffer and sharing with TID 2 (uart_driver)..."); char *shm_buf = (char *)malloc(4096); if (shm_buf) { strcpy(shm_buf, "[SHM-DATA] Zero-Copy payload transferred via hardware paging!"); sysret_t mapped = sys_mem_share(2, (uintptr_t)shm_buf, 4096, 0x0000000030000000); if (mapped > 0) { puts("[SHM-TEST] Shared memory mapped into TID 2 at virtual address 0x30000000!"); } else { puts("[SHM-TEST] sys_mem_share returned status code."); } free(shm_buf); } } else if (strcmp(cmd, "ping") == 0) { ipc::Endpoint kernel_ep(CAP_KERNEL_CONTROL); auto res = kernel_ep.call(IPC_OP_PING, 9999); if (res.is_ok()) { puts("[PING] Received Pong from microkernel! Value: 10000"); } else { puts("[PING] Failed to ping microkernel."); } } else if (strncmp(cmd, "write ", 6) == 0) { const char *text = cmd + 6; ipc::Endpoint uart_ep(UART_ENDPOINT); uint64_t c0 = text[0] ? text[0] : ' '; uint64_t c1 = (text[0] && text[1]) ? text[1] : ' '; uint64_t c2 = (text[0] && text[1] && text[2]) ? text[2] : ' '; uint64_t c3 = '\n'; uint64_t payload = c0 | (c1 << 8) | (c2 << 16) | (c3 << 24); (void)uart_ep.call(IPC_OP_WRITE, payload); puts("[WRITE] Sent IPC message to UART driver!"); } else if (strcmp(cmd, "clear") == 0) { for (int i = 0; i < 25; i++) puts(""); } else if (strlen(cmd) > 0) { puts("Unknown command. Type 'help' for command list."); } } extern "C" void _start() { puts("\n======================================================="); puts(" opencoreC Interactive Shell (Ring 3) "); puts("======================================================="); puts("Type 'help' to see available commands.\n"); char input_line[128]; size_t line_len = 0; print_prompt(); while (true) { int key = sys_key_read(); if (key > 0) { char c = (char)key; if (c == '\n' || c == '\r') { putchar('\n'); input_line[line_len] = '\0'; handle_command(input_line); line_len = 0; print_prompt(); } else if (c == 8 || c == 127) { // Backspace if (line_len > 0) { line_len--; putchar('\b'); putchar(' '); putchar('\b'); } } else if (line_len < sizeof(input_line) - 1) { input_line[line_len++] = c; putchar(c); } } else { sys_yield(); } } }