114 lines
4.3 KiB
C++
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();
|
|
}
|
|
}
|
|
}
|