提交 070c2e4e 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

Better uthread.S?

上级 6dd79c01
...@@ -42,5 +42,4 @@ void free(void*); ...@@ -42,5 +42,4 @@ void free(void*);
int atoi(const char*); int atoi(const char*);
// uthread.S // uthread.S
int forkt(void *sp, void *pc); int forkt(void *sp, void *pc, void *arg);
#include "syscall.h"
#include "traps.h"
# We assume that the kernel follows the amd64 ABI, but not
# that it saves caller-saved registers.
.globl forkt .globl forkt
forkt: forkt:
pushq %rdi ## new stack ptr pushq %r12
pushq %rsi ## function ptr andq $(~0xf), %rdi # new stack ptr amd64 ABI alignment
movq $1, %rdi ## flag for sys_fork movq %rdi, %r12
callq fork movq %rdx, -16(%r12) # arg
popq %r10 ## function ptr movq %rsi, -8(%r12) # function ptr
popq %r11 ## new stack ptr
cmpl $0, %eax ## pid/tid movq $1, %rdi # flag for sys_fork
movq $SYS_fork, %rax
int $T_SYSCALL
cmpq $0, %rax # pid/tid
jne 1f jne 1f
movq %r11, %rsp
andq $(~0xf), %rsp ## alignment for amd64 ABI # child
movq %rax, %rdi movq -8(%r12), %rax
call *%r10 movq -16(%r12), %rdi
movq %r12, %rsp
call *%rax
call exit call exit
1: 1: # parent
popq %r12
ret ret
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论