redo boot around an explicit system volume and fixed kernel/HAL images, redo volumes and filesystem paths around capabilities instead of drive numbers and kernel CWD state, add a capability/security model with derived and revocable handles and security contexts, add port IPC and rssrv to manage the userspace resource namespace and publish the system volume, move process, dll and path loading to userspace and add process builder syscalls, init now supervises rssrv and the session process, redo the syscall ABI around request structs and four arguments, add a volume manager and proper partition arrival/removal handling so FAT and NTFS mount dynamically, clean up the HAL/DDK boundary so drivers don't depend on HAL internals, save fpu state properly now, the serial driver doesn't hang on a missing port, fix AHCI startup races, fix timeout accounting, fix shared mmap writeback, more smoke tests

This commit is contained in:
maksw committed 2026-08-20 12:33:17 +02:00
1 parent 4add6789ba
commit f882d339fb
232 files changed
+20934 -8898

No files matched your search

+48 -42
View File
@@ -5,6 +5,8 @@
#include <stdbool.h>
#include <string.h>
#include <ntlite/syscall.h>
#include <ntlite/process_loader.h>
#include <ntlite/path.h>
#include <ntlite/status.h>
#define MAX_CMD 256
@@ -20,50 +22,55 @@
#define SHELL_CURSOR_BACKGROUND 0x00E0E0E0u
// Output helpers.
static void print(const char* s) { SYS_WRITE_CONSOLE_REQUEST req = { SysSvFromCstr(s) }; SysWriteConsole(&req); }
static void print(const char* s) { SYS_WRITE_CONSOLE_REQUEST req = { sizeof(SYS_WRITE_CONSOLE_REQUEST), SysSvFromCstr(s) }; SysWriteConsole(&req); }
// Opens file.
static uint32_t open_file(const char* path, uint32_t* handleOut) {
SYS_OPEN_FILE_REQUEST req = SysMakeOpenFileRequest(SysSvFromCstr(path),
SYS_FILE_ACCESS_READ | SYS_FILE_ACCESS_QUERY,
SYS_FILE_OPEN_EXISTING,
SYS_FILE_FLAG_NONE,
handleOut);
return SysOpenFile(&req);
return NtlOpenFile(SysSvFromCstr(path), SYS_FILE_ACCESS_READ | SYS_FILE_ACCESS_QUERY,
SYS_FILE_OPEN_EXISTING, SYS_FILE_FLAG_NONE, handleOut);
}
// Creates file.
static uint32_t create_file(const char* path, uint32_t* handleOut) {
SYS_OPEN_FILE_REQUEST req = SysMakeOpenFileRequest(SysSvFromCstr(path),
SYS_FILE_ACCESS_WRITE | SYS_FILE_ACCESS_QUERY,
SYS_FILE_CREATE_ALWAYS,
SYS_FILE_FLAG_NONE,
handleOut);
return SysOpenFile(&req);
return NtlOpenFile(SysSvFromCstr(path), SYS_FILE_ACCESS_WRITE | SYS_FILE_ACCESS_QUERY,
SYS_FILE_CREATE_ALWAYS, SYS_FILE_FLAG_NONE, handleOut);
}
// Opens dir.
static uint32_t open_dir(const char* path, uint32_t* handleOut) {
SYS_PATH_HANDLE_REQUEST req = { SysSvFromCstr(path), handleOut };
return SysOpenDir(&req);
return NtlOpenDir(SysSvFromCstr(path), SYS_DIR_ACCESS_ENUMERATE | SYS_DIR_ACCESS_OPEN,
SYS_DIR_FLAG_NONE, handleOut);
}
// Updates cwd.
static uint32_t set_cwd(const char* path) {
SYS_PATH_REQUEST req = { SysSvFromCstr(path) };
return SysSetCwd(&req);
return NtlSetCurrentDirectory(SysSvFromCstr(path));
}
// Releases file.
static uint32_t delete_file(const char* path) {
SYS_PATH_REQUEST req = { SysSvFromCstr(path) };
return SysDeleteFile(&req);
return NtlDeleteFile(SysSvFromCstr(path));
}
// Creates process.
static uint32_t create_process(const char* path, uint32_t* handleOut, const char* cmdline) {
SYS_CREATE_PROCESS_REQUEST req = { SysSvFromCstr(path), SysSvFromCstr(cmdline), handleOut };
return SysCreateProcess(&req);
uint32_t imageFile = SYS_HANDLE_INVALID;
uint32_t status = open_file(path, &imageFile);
if (status != NTLSTATUS_SUCCESS) return status;
NTL_CREATE_SYSTEM_PROCESS_REQUEST req;
memset(&req, 0, sizeof(req));
req.Size = sizeof(req);
req.Flags = NTL_PROCESS_LOAD_FLAG_NONE;
req.ImageFile = imageFile;
req.Path = SysSvFromCstr(path);
req.CommandLine = SysSvFromCstr(cmdline);
req.SecurityContext = SYS_SECURITY_CONTEXT_CURRENT;
req.ResolveModuleName = NtlResolveSystemModuleName;
req.ProcessHandleOut = handleOut;
status = NtlCreateSystemProcess(&req);
(void)SysCloseHandle(imageFile);
return status;
}
// Prints u Int.
@@ -306,11 +313,13 @@ static void shellHistoryAdd(const char* cmd) {
static void shellEditorHideVisibleCursor(SHELL_VISIBLE_CURSOR* cursor) {
if (!cursor || !cursor->Visible) return;
(void)SysPutScreenChar(cursor->Character,
cursor->Column * SHELL_GLYPH_WIDTH,
cursor->Row * SHELL_GLYPH_HEIGHT,
SHELL_TEXT_FOREGROUND,
SHELL_TEXT_BACKGROUND);
SYS_PUT_SCREEN_CHAR_REQUEST request = {
sizeof(SYS_PUT_SCREEN_CHAR_REQUEST), cursor->Character, { 0, 0, 0 },
cursor->Column * SHELL_GLYPH_WIDTH,
cursor->Row * SHELL_GLYPH_HEIGHT,
SHELL_TEXT_FOREGROUND, SHELL_TEXT_BACKGROUND
};
(void)SysPutScreenChar(&request);
cursor->Visible = false;
}
@@ -325,11 +334,13 @@ static void shellEditorShowVisibleCursor(SHELL_VISIBLE_CURSOR* cursor, const SHE
char character = editor->Cursor < editor->Length
? editor->Buffer[editor->Cursor]
: ' ';
if (SysPutScreenChar(character,
(int)info.CursorX * SHELL_GLYPH_WIDTH,
(int)info.CursorY * SHELL_GLYPH_HEIGHT,
SHELL_CURSOR_FOREGROUND,
SHELL_CURSOR_BACKGROUND) != NTLSTATUS_SUCCESS)
SYS_PUT_SCREEN_CHAR_REQUEST request = {
sizeof(SYS_PUT_SCREEN_CHAR_REQUEST), character, { 0, 0, 0 },
(int)info.CursorX * SHELL_GLYPH_WIDTH,
(int)info.CursorY * SHELL_GLYPH_HEIGHT,
SHELL_CURSOR_FOREGROUND, SHELL_CURSOR_BACKGROUND
};
if (SysPutScreenChar(&request) != NTLSTATUS_SUCCESS)
return;
cursor->Column = (int)info.CursorX;
@@ -775,7 +786,7 @@ static void printPagesKiB(uint64_t pages) {
// Prints cpu Flags.
static void printCpuFlags(uint32_t flags) {
if (flags & SYS_CPU_FLAG_BSP) print("bsp ");
if (flags & SYS_CPU_FLAG_BOOT_PROCESSOR) print("boot ");
if (flags & SYS_CPU_FLAG_ONLINE) print("online ");
if (flags & SYS_CPU_FLAG_PARKED) print("parked ");
if (flags & SYS_CPU_FLAG_PRIMARY) print("primary ");
@@ -1078,7 +1089,7 @@ static void cmd_stats(void) {
for (uint32_t i = 0; i < n; i++) {
const SYS_CPU_STAT* c = &cpuRecords[i];
print(" cpu"); printUInt(c->CpuIndex);
print(" lapic="); printUInt(c->LapicId);
print(" hardware="); printUInt(c->HardwareId);
print(" current=");
if (c->CurrentThreadFlags & SYS_CPU_THREAD_FLAG_IDLE) {
print("idle/"); printUInt(c->CpuIndex);
@@ -1621,6 +1632,7 @@ static const char* processStateName(uint32_t state) {
case SYS_PROCESS_STATE_RUNNING: return "run";
case SYS_PROCESS_STATE_TERMINATING: return "term";
case SYS_PROCESS_STATE_EXITED: return "exit";
case SYS_PROCESS_STATE_CONSTRUCTING: return "build";
default: return "?";
}
}
@@ -1691,7 +1703,7 @@ static void cmd_ps(void) {
print("Processes (Count: ");
printUInt((uint32_t)count);
print("):\n");
print(" PID State Thr Hnd Mod UserKiB ImageKiB Flags Name\n");
print(" PID State Thr Hnd UserKiB ImageKiB Flags Name\n");
print(" Flags: S=system I=idle P=protected *=current T=terminating X=exited.\n");
size_t displayCount = count < MAX_PROCS ? count : MAX_PROCS;
@@ -1718,8 +1730,6 @@ static void cmd_ps(void) {
print(" ");
printUIntWidth(p->HandleCount, 3);
print(" ");
printUIntWidth(p->ModuleCount, 3);
print(" ");
printUInt64Width((uint64_t)p->UserCommittedBytes / 1024u, 7);
print(" ");
printUInt64Width((uint64_t)p->ImageSize / 1024u, 8);
@@ -1727,10 +1737,6 @@ static void cmd_ps(void) {
printStringWidth(flags, 5);
print(" ");
print(p->Name);
if (p->CurrentDirectory[0]) {
print(" cwd=");
print(p->CurrentDirectory);
}
print("\n");
}
@@ -1813,7 +1819,7 @@ static void cmd_kill(const char* args) {
if (!parseUInt(args, &pid)) { print("kill: usage: kill <pid>\n"); return; }
uint32_t hProc = 0;
uint32_t status = SysOpenProcess(pid, &hProc);
uint32_t status = SysOpenProcess(pid, SYS_PROCESS_RIGHT_TERMINATE, &hProc);
if (status == 0) {
status = SysKillProcess(hProc, (int32_t)NTLSTATUS_PROCESS_KILLED);
SysCloseHandle(hProc);
@@ -2094,7 +2100,7 @@ static int runCommand(const char* cmd) {
}
else if (strcmp(cmd + 6, "noncanonical") == 0) {
// Non-canonical pointer dereference.
volatile int *ptr = (volatile int*)0x4242424242424242ULL;
volatile int* ptr = (volatile int*)0x4242424242424242ULL;
*ptr = 1337;
return 0;
}