]> git.corax.cc Git - corax/commitdiff
Implement sbrk() POSIX syscall
authorMatthias Kruk <m@m10k.eu>
Mon, 2 Dec 2019 08:12:40 +0000 (17:12 +0900)
committerMatthias Kruk <m@m10k.eu>
Mon, 2 Dec 2019 08:12:40 +0000 (17:12 +0900)
 - Implement sys_sbrk() syscall handler
 - Add brk() and sbrk() syscall stubs to klibc
 - Add prototypes for brk() and sbrk() to unistd.h

include/corax/syscall.h
include/unistd.h
kernel/core/posixcall.c
kernel/klibc/posixcall.S

index d8e20df84aeb004d1cdacfc8f680d4a26f057af3..ba3961876344ee8ef684e8e2ed1154d40b6d2bbc 100644 (file)
@@ -23,6 +23,7 @@
 #define SYS_WAITID     5
 #define SYS_SETSID     6
 #define SYS_SLEEP      7
+#define SYS_SBRK       8
 
 /* Corax-specific variations of POSIX syscalls */
 #define SYS_EXECFVE    128
index 5c9d92905bd0a52cc0059d8b38d4d630b0dae4f8..4b87539a4c218f6554834144e8b4267c2e55323a 100644 (file)
@@ -8,5 +8,7 @@ extern pid_t fork(void);
 extern pid_t vfork(void);
 extern int execfve(void*, const char**, const char**);
 extern unsigned int sleep(unsigned int);
+extern int brk(void*);
+extern void* sbrk(int);
 
 #endif /* _UNISTD_H */
index 76a8fcc324682c6cc137f8953d1863ac0e54845e..8d3985d5b2fbdd42d115900181415d23ec8db96a 100644 (file)
@@ -49,6 +49,27 @@ int sys_fork(stack_frame_t *stk)
        return(ret_val);
 }
 
+int sys_sbrk(ssize_t increment)
+{
+       process_t *cproc;
+       pg_dir_t *pgdir;
+       int ret_val;
+
+       cproc = process_get_current();
+
+       process_lock(cproc);
+
+       ret_val = process_get_pagedir(cproc, &pgdir);
+
+       if(!ret_val) {
+               ret_val = (int)pg_dir_sbrk(pgdir, increment);
+       }
+
+       process_unlock(cproc);
+
+       return(ret_val);
+}
+
 #if FEATURE(ELF)
 int sys_execelf(stack_frame_t *stk)
 {
@@ -366,6 +387,10 @@ int sys_posixcall(stack_frame_t *stk)
                ret_val = sys_sleep((unsigned int)stk->ebx);
                break;
 
+       case SYS_SBRK:
+               ret_val = sys_sbrk((ssize_t)stk->ebx);
+               break;
+
        case SYS_EXECFVE:
                ret_val = sys_execfve(stk);
                break;
index 0b455c272b6fa72050445688f1da5763eccdc281..f54608b778e516e70497c94cce1a25800ffa3d98 100644 (file)
@@ -9,6 +9,8 @@
 
        .global fork
        .global execfve
+       .global brk
+       .global sbrk
 
 fork:
        pushl   %ebx
@@ -31,4 +33,32 @@ execfve:
        popl    %ebx
        ret
 
+brk:
+       pushl   $0
+       call    sbrk
+
+       /*
+        * The eax register contains the current sbrk, 8(%esp) the desired sbrk.
+        * We have to pass the difference to sbrk() to increase or decrease it.
+        */
+       movl    8(%esp), %edx
+       subl    %eax, %edx
+
+       /* sbrk(8(%esp) - sbrk(0)) */
+       movl    %edx, (%esp)
+       call    sbrk
+
+       addl    $4, %esp
+       ret
+
+sbrk:
+       pushl   %ebx
+
+       movl    $SYS_SBRK, %eax
+       movl    8(%esp), %ebx
+       int             $SYSCALL_POSIX
+
+       popl    %ebx
+       ret
+
 #endif /* FEATURE(POSIX) */