- Implement sys_sbrk() syscall handler
- Add brk() and sbrk() syscall stubs to klibc
- Add prototypes for brk() and sbrk() to unistd.h
#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
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 */
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)
{
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;
.global fork
.global execfve
+ .global brk
+ .global sbrk
fork:
pushl %ebx
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) */