add lwIP TCP/IP stack as a runtime driver, native socket syscalls, SysGetMemoryStatus replacing CatchAllDebugBucket, fix timeGetTime to return milliseconds, fix SysSleep to interpret argument as milliseconds, SysGetTick now returns microseconds, harden all syscalls against bad user pointers with CopyFromUser/CopyToUser/MmProbeUser throughout, add networking test apps, port-forward 8080 in runa.bat, split LWIP_DRIVER_CFLAGS, add settings.ini to deploy, remove ethernet.c stub
This commit is contained in:
1 parent
18b4dd0f61
commit
df13b8056c
365 files changed
+143263
-1362
No files matched your search
@@ -24,25 +24,6 @@ static void printInt(int32_t n) {
|
||||
else { printUInt((uint32_t)n); }
|
||||
}
|
||||
|
||||
static uint64_t parseUInt64(const char* s) {
|
||||
uint64_t v = 0;
|
||||
while (*s == ' ') s++;
|
||||
while (*s >= '0' && *s <= '9') v = v * 10 + (uint64_t)(*s++ - '0');
|
||||
return v;
|
||||
}
|
||||
|
||||
// Parse up to 6 comma-separated uint64 values.
|
||||
// Returns the number of values actually parsed.
|
||||
static int parseArgs(const char* line, uint64_t args[6]) {
|
||||
int count = 0;
|
||||
while (*line && count < 6) {
|
||||
args[count++] = parseUInt64(line);
|
||||
while (*line && *line != ',') line++; // skip to next comma
|
||||
if (*line == ',') line++; // consume comma
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static void printUInt64(uint64_t n) {
|
||||
if (n == 0) { print("0"); return; }
|
||||
char buf[20]; int i = 0;
|
||||
@@ -80,7 +61,7 @@ static char* trim(char* s) {
|
||||
static void cmd_help() {
|
||||
print("Available commands:\n"
|
||||
" help - Show this list\n"
|
||||
" debug - Enter debug bucket mode\n"
|
||||
" mem - Show memory usage\n"
|
||||
" dir [path] - List directory contents\n"
|
||||
" cd <path> - Change directory\n"
|
||||
" type <file> - Display file contents\n"
|
||||
@@ -90,30 +71,26 @@ static void cmd_help() {
|
||||
" exit - Close the shell\n");
|
||||
}
|
||||
|
||||
static void cmd_debug(void) {
|
||||
print("Entered debug mode. Type args as: a0,a1,a2,a3,a4,a5\n");
|
||||
print("Type 'exit' to leave.\n");
|
||||
static void printSizeKiB(uint64_t bytes) {
|
||||
printUInt64(bytes / 1024u);
|
||||
print(" KiB");
|
||||
}
|
||||
|
||||
char line[MAX_CMD];
|
||||
while (true) {
|
||||
print("debug> ");
|
||||
readLine(line, MAX_CMD);
|
||||
char* t = trim(line);
|
||||
|
||||
if (strcmp(t, "exit") == 0) {
|
||||
print("Exit debug.\n");
|
||||
break;
|
||||
}
|
||||
if (*t == '\0') continue;
|
||||
|
||||
uint64_t args[6] = {0, 0, 0, 0, 0, 0};
|
||||
parseArgs(t, args);
|
||||
|
||||
uint64_t ret = SysCatchAllDebugBucket(args[0], args[1], args[2],
|
||||
args[3], args[4], args[5]);
|
||||
printUInt64(ret);
|
||||
print("\n");
|
||||
static void cmd_mem(void) {
|
||||
SYS_MEMORY_STATUS st;
|
||||
if (SysGetMemoryStatus(&st) != 0) {
|
||||
print("mem: failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
print("Memory Status:\n");
|
||||
print(" Free physical: ");
|
||||
printSizeKiB(st.FreePhysicalBytes);
|
||||
print("\n Kernel pool: ");
|
||||
printSizeKiB(st.KernelPoolBytes);
|
||||
print("\n User heap: ");
|
||||
printSizeKiB(st.UserHeapBytes);
|
||||
print("\n");
|
||||
}
|
||||
|
||||
static void cmd_write(const char* args) {
|
||||
@@ -203,7 +180,7 @@ static int runCommand(const char* cmd) {
|
||||
if (strcmp(cmd, "help") == 0) { cmd_help(); return 0; }
|
||||
if (strcmp(cmd, "clear") == 0) { SysScreenClear(0); return 0; }
|
||||
if (strcmp(cmd, "crash") == 0) { *(int*)0 = 42; return 0; }
|
||||
if (strcmp(cmd, "debug") == 0) { cmd_debug(); return 0; }
|
||||
if (strcmp(cmd, "mem") == 0) { cmd_mem(); return 0; }
|
||||
if (strcmp(cmd, "dir") == 0) { cmd_dir("."); return 0; }
|
||||
if (strncmp(cmd, "dir ", 4) == 0) { cmd_dir(cmd + 4); return 0; }
|
||||
if (strncmp(cmd, "cd ", 3) == 0) { if (SysSetCwd(cmd + 3) != 0) print("cd: failed\n"); return 0; }
|
||||
|
||||
Reference in new issue
Block a user