Files
opencoreC/servers/sh/main.cpp
T

114 lines
4.3 KiB
C++

#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 <str> - 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();
}
}
}