From: Tulio A M Mendes Date: Sun, 8 Feb 2026 02:37:16 +0000 (-0300) Subject: posix: getppid syscall X-Git-Url: https://projects.tadryanom.me/?a=commitdiff_plain;h=5ee615e7a651313933d344dc67f0a7822ccfe0ea;p=AdrOS.git posix: getppid syscall Add SYSCALL_GETPPID and userland wrappers. Include a simple fork-based smoke test validating getppid() in init.elf. --- diff --git a/include/syscall.h b/include/syscall.h index fd59cc3..47eda77 100644 --- a/include/syscall.h +++ b/include/syscall.h @@ -25,6 +25,7 @@ enum { SYSCALL_PIPE = 14, SYSCALL_EXECVE = 15, SYSCALL_FORK = 16, + SYSCALL_GETPPID = 17, }; #endif diff --git a/src/kernel/syscall.c b/src/kernel/syscall.c index ae466aa..dd58b7a 100644 --- a/src/kernel/syscall.c +++ b/src/kernel/syscall.c @@ -654,6 +654,11 @@ static void syscall_handler(struct registers* regs) { return; } + if (syscall_no == SYSCALL_GETPPID) { + regs->eax = current_process ? current_process->parent_pid : 0; + return; + } + if (syscall_no == SYSCALL_OPEN) { const char* path = (const char*)regs->ebx; uint32_t flags = regs->ecx; diff --git a/user/init.c b/user/init.c index 5af0955..9f067e4 100644 --- a/user/init.c +++ b/user/init.c @@ -3,6 +3,7 @@ enum { SYSCALL_WRITE = 1, SYSCALL_EXIT = 2, + SYSCALL_GETPID = 3, SYSCALL_OPEN = 4, SYSCALL_READ = 5, SYSCALL_CLOSE = 6, @@ -16,6 +17,7 @@ enum { SYSCALL_PIPE = 14, SYSCALL_EXECVE = 15, SYSCALL_FORK = 16, + SYSCALL_GETPPID = 17, }; enum { @@ -49,6 +51,28 @@ static int sys_write(int fd, const void* buf, uint32_t len) { return ret; } +static int sys_getpid(void) { + int ret; + __asm__ volatile( + "int $0x80" + : "=a"(ret) + : "a"(SYSCALL_GETPID) + : "memory" + ); + return ret; +} + +static int sys_getppid(void) { + int ret; + __asm__ volatile( + "int $0x80" + : "=a"(ret) + : "a"(SYSCALL_GETPPID) + : "memory" + ); + return ret; +} + static int sys_fork(void) { int ret; __asm__ volatile( @@ -582,6 +606,24 @@ void _start(void) { children[i] = pid; } + { + int parent_pid = sys_getpid(); + int pid = sys_fork(); + if (pid == 0) { + int ppid = sys_getppid(); + if (ppid == parent_pid) { + static const char msg[] = "[init] getppid OK\n"; + (void)sys_write(1, msg, (uint32_t)(sizeof(msg) - 1)); + sys_exit(0); + } + static const char msg[] = "[init] getppid failed\n"; + (void)sys_write(1, msg, (uint32_t)(sizeof(msg) - 1)); + sys_exit(1); + } + int st = 0; + (void)sys_waitpid(pid, &st, 0); + } + { int pid = sys_fork(); if (pid == 0) {