]> Projects (at) Tadryanom (dot) Me - AdrOS.git/commitdiff
posix: getppid syscall
authorTulio A M Mendes <[email protected]>
Sun, 8 Feb 2026 02:37:16 +0000 (23:37 -0300)
committerTulio A M Mendes <[email protected]>
Sun, 8 Feb 2026 02:37:16 +0000 (23:37 -0300)
Add SYSCALL_GETPPID and userland wrappers. Include a simple fork-based smoke test validating getppid() in init.elf.

include/syscall.h
src/kernel/syscall.c
user/init.c

index a7e6780d4f2f75ebd60d7e7f750cadf7f0a03c8a..b1522aa629ed96459343b5d2a6daf6cd22964a54 100644 (file)
@@ -34,6 +34,7 @@ enum {
     SYSCALL_PIPE = 14,
     SYSCALL_EXECVE = 15,
     SYSCALL_FORK = 16,
+    SYSCALL_GETPPID = 17,
 };
 
 #endif
index aee0eb94e5b290eb2514b49e7e1e263a0d207268..a25c0cbc25f375117ca00660dd6501881d46cb5f 100644 (file)
@@ -663,6 +663,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;
index 8713b2d845efafe7ee2dfc519b1faf8ce6a49339..1081c31d067b89b8a14c75cb2d203678eb2d0448 100644 (file)
@@ -12,6 +12,7 @@
 enum {
     SYSCALL_WRITE = 1,
     SYSCALL_EXIT  = 2,
+    SYSCALL_GETPID = 3,
     SYSCALL_OPEN  = 4,
     SYSCALL_READ  = 5,
     SYSCALL_CLOSE = 6,
@@ -25,6 +26,7 @@ enum {
     SYSCALL_PIPE = 14,
     SYSCALL_EXECVE = 15,
     SYSCALL_FORK = 16,
+    SYSCALL_GETPPID = 17,
 };
 
 enum {
@@ -58,6 +60,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(
@@ -591,6 +615,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) {