/* Pactor64 — Raspberry Pi 5 Kernel Main (AArch64) */ #include "uart.h" #define CMD_BUF_SIZE 128 static int kstrcmp(const char *a, const char *b) { while (*a && *a == *b) { a++; b++; } return (unsigned char)*a - (unsigned char)*b; } static void kprintf(const char *fmt, ...) { __builtin_va_list ap; __builtin_va_start(ap, fmt); for (int i = 0; fmt[i]; i++) { if (fmt[i] == '%' && fmt[i+1]) { i++; switch (fmt[i]) { case 'd': { long v = __builtin_va_arg(ap, long); if (v < 0) { uart_putc('-'); v = -v; } char b[21]; int j = 0; if (v == 0) { uart_putc('0'); break; } while (v > 0) { b[j++] = '0' + (v % 10); v /= 10; } while (j > 0) uart_putc(b[--j]); break; } case 's': { const char *s = __builtin_va_arg(ap, const char *); uart_puts(s ? s : "(null)"); break; } case '%': uart_putc('%'); break; default: uart_putc('%'); uart_putc(fmt[i]); break; } } else { uart_putc(fmt[i]); } } __builtin_va_end(ap); } static void cmd_help(void) { uart_puts(" Available commands:\r\n"); uart_puts(" help - Show this help\r\n"); uart_puts(" sysinfo - System information\r\n"); uart_puts(" halt - Halt the system\r\n"); } static void cmd_sysinfo(void) { uart_puts(" ================================\r\n"); uart_puts(" Pactor64 System Information\r\n"); uart_puts(" ================================\r\n"); uart_puts(" Architecture: AArch64 (ARMv8.2-A)\r\n"); uart_puts(" CPU: Cortex-A76\r\n"); uart_puts(" Board: Raspberry Pi 5\r\n"); uart_puts(" SoC: BCM2712\r\n"); uart_puts(" Console: PL011 UART @ 115200 baud\r\n"); uart_puts(" ================================\r\n"); } static void execute_command(const char *cmd) { while (*cmd == ' ') cmd++; if (*cmd == '\0') return; if (kstrcmp(cmd, "help") == 0) cmd_help(); else if (kstrcmp(cmd, "sysinfo") == 0) cmd_sysinfo(); else if (kstrcmp(cmd, "halt") == 0) { uart_puts(" System halted.\r\n"); for (;;) __asm__ volatile("wfe"); } else { kprintf(" Unknown: '%s'\r\n", cmd); } } static void shell_run(void) { char buf[CMD_BUF_SIZE]; int pos = 0; uart_puts("pactor64> "); for (;;) { int c = uart_getc(); if (c < 0) continue; char ch = (char)c; if (ch == '\r' || ch == '\n') { uart_puts("\r\n"); buf[pos] = '\0'; execute_command(buf); pos = 0; uart_puts("pactor64> "); } else if (ch == 0x7F || ch == '\b') { if (pos > 0) { pos--; uart_puts("\b \b"); } } else if (pos < CMD_BUF_SIZE - 1) { buf[pos++] = ch; uart_putc(ch); } } } void kernel_main(void) { uart_puts("\r\n"); uart_puts(" ================================\r\n"); uart_puts(" Pactor64 on Raspberry Pi 5\r\n"); uart_puts(" Cortex A76 (AArch64)\r\n"); uart_puts(" ================================\r\n"); uart_puts("\r\n [OK] Kernel initialized\r\n"); uart_puts(" [OK] UART console ready\r\n"); uart_puts("\r\n Type 'help' for available commands.\r\n\r\n"); shell_run(); }