]> 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 fd59cc3de8640873b7a15fd5bb0b66f9542d8d41..47eda77ee1203f940bbd65fd05048a789601a537 100644 (file)
@@ -25,6 +25,7 @@ enum {
     SYSCALL_PIPE = 14,
     SYSCALL_EXECVE = 15,
     SYSCALL_FORK = 16,
+    SYSCALL_GETPPID = 17,
 };
 
 #endif
index ae466aa38c5ea60305234a09036b549dad2e63e6..dd58b7aebc87857da5852df430e8c2d04005f08c 100644 (file)
@@ -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;
index 5af095523169d3dab3923035af7663f4fb10cb0e..9f067e4b31d7175daf4668fdb9fff40efcc33c2a 100644 (file)
@@ -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) {