main.c

Commit: e6209518 Author: jokerz Raw Copy
1
/* Pactor64 — Raspberry Pi 5 Kernel Main (AArch64) */
2
#include "uart.h"
3
4
#define CMD_BUF_SIZE 128
5
6
static int kstrcmp(const char *a, const char *b) {
7
    while (*a && *a == *b) { a++; b++; }
8
    return (unsigned char)*a - (unsigned char)*b;
9
}
10
11
static void kprintf(const char *fmt, ...) {
12
    __builtin_va_list ap;
13
    __builtin_va_start(ap, fmt);
14
    for (int i = 0; fmt[i]; i++) {
15
        if (fmt[i] == '%' && fmt[i+1]) {
16
            i++;
17
            switch (fmt[i]) {
18
                case 'd': {
19
                    long v = __builtin_va_arg(ap, long);
20
                    if (v < 0) { uart_putc('-'); v = -v; }
21
                    char b[21]; int j = 0;
22
                    if (v == 0) { uart_putc('0'); break; }
23
                    while (v > 0) { b[j++] = '0' + (v % 10); v /= 10; }
24
                    while (j > 0) uart_putc(b[--j]);
25
                    break;
26
                }
27
                case 's': {
28
                    const char *s = __builtin_va_arg(ap, const char *);
29
                    uart_puts(s ? s : "(null)");
30
                    break;
31
                }
32
                case '%': uart_putc('%'); break;
33
                default: uart_putc('%'); uart_putc(fmt[i]); break;
34
            }
35
        } else {
36
            uart_putc(fmt[i]);
37
        }
38
    }
39
    __builtin_va_end(ap);
40
}
41
42
static void cmd_help(void) {
43
    uart_puts("  Available commands:\r\n");
44
    uart_puts("    help    - Show this help\r\n");
45
    uart_puts("    sysinfo - System information\r\n");
46
    uart_puts("    halt    - Halt the system\r\n");
47
}
48
49
static void cmd_sysinfo(void) {
50
    uart_puts("  ================================\r\n");
51
    uart_puts("  Pactor64 System Information\r\n");
52
    uart_puts("  ================================\r\n");
53
    uart_puts("  Architecture:  AArch64 (ARMv8.2-A)\r\n");
54
    uart_puts("  CPU:           Cortex-A76\r\n");
55
    uart_puts("  Board:         Raspberry Pi 5\r\n");
56
    uart_puts("  SoC:           BCM2712\r\n");
57
    uart_puts("  Console:       PL011 UART @ 115200 baud\r\n");
58
    uart_puts("  ================================\r\n");
59
}
60
61
static void execute_command(const char *cmd) {
62
    while (*cmd == ' ') cmd++;
63
    if (*cmd == '\0') return;
64
    if (kstrcmp(cmd, "help") == 0) cmd_help();
65
    else if (kstrcmp(cmd, "sysinfo") == 0) cmd_sysinfo();
66
    else if (kstrcmp(cmd, "halt") == 0) {
67
        uart_puts("  System halted.\r\n");
68
        for (;;) __asm__ volatile("wfe");
69
    } else {
70
        kprintf("  Unknown: '%s'\r\n", cmd);
71
    }
72
}
73
74
static void shell_run(void) {
75
    char buf[CMD_BUF_SIZE];
76
    int pos = 0;
77
    uart_puts("pactor64> ");
78
    for (;;) {
79
        int c = uart_getc();
80
        if (c < 0) continue;
81
        char ch = (char)c;
82
        if (ch == '\r' || ch == '\n') {
83
            uart_puts("\r\n");
84
            buf[pos] = '\0';
85
            execute_command(buf);
86
            pos = 0;
87
            uart_puts("pactor64> ");
88
        } else if (ch == 0x7F || ch == '\b') {
89
            if (pos > 0) { pos--; uart_puts("\b \b"); }
90
        } else if (pos < CMD_BUF_SIZE - 1) {
91
            buf[pos++] = ch;
92
            uart_putc(ch);
93
        }
94
    }
95
}
96
97
void kernel_main(void) {
98
    uart_puts("\r\n");
99
    uart_puts("  ================================\r\n");
100
    uart_puts("  Pactor64 on Raspberry Pi 5\r\n");
101
    uart_puts("  Cortex A76 (AArch64)\r\n");
102
    uart_puts("  ================================\r\n");
103
    uart_puts("\r\n  [OK] Kernel initialized\r\n");
104
    uart_puts("  [OK] UART console ready\r\n");
105
    uart_puts("\r\n  Type 'help' for available commands.\r\n\r\n");
106
    shell_run();
107
}
108