More exec hacking, userspace crt.S to help with testing

上级 4ce84865
...@@ -33,7 +33,7 @@ UPROGS := $(addprefix $(O)/bin/, $(UPROGS)) ...@@ -33,7 +33,7 @@ UPROGS := $(addprefix $(O)/bin/, $(UPROGS))
$(O)/bin/%.unstripped: $(O)/bin/%.o $(ULIB) $(O)/bin/%.unstripped: $(O)/bin/%.o $(ULIB)
@echo " LD $@" @echo " LD $@"
$(Q)mkdir -p $(@D) $(Q)mkdir -p $(@D)
$(Q)$(LD) $(LDFLAGS) -N -e main -Ttext 0x100000 -o $@ $^ $(Q)$(LD) $(LDFLAGS) -N -Ttext 0x100000 -o $@ $^
$(O)/bin/%: $(O)/bin/%.unstripped $(O)/bin/%: $(O)/bin/%.unstripped
@echo " STRIP $@" @echo " STRIP $@"
......
...@@ -68,7 +68,7 @@ static void ...@@ -68,7 +68,7 @@ static void
dostack(struct eargs *args) dostack(struct eargs *args)
{ {
struct vmnode *vmn = nullptr; struct vmnode *vmn = nullptr;
uptr ustack[1+MAXARG+1]; uptr argstck[1+MAXARG];
const char *s, *last; const char *s, *last;
s64 argc; s64 argc;
uptr sp; uptr sp;
...@@ -91,9 +91,6 @@ dostack(struct eargs *args) ...@@ -91,9 +91,6 @@ dostack(struct eargs *args)
if(argc >= MAXARG) if(argc >= MAXARG)
goto bad; goto bad;
// Fake return %rip between stack
ustack[0] = 0ull;
// Push argument strings // Push argument strings
sp = USERTOP; sp = USERTOP;
for(int i = argc-1; i >= 0; i--) { for(int i = argc-1; i >= 0; i--) {
...@@ -101,15 +98,19 @@ dostack(struct eargs *args) ...@@ -101,15 +98,19 @@ dostack(struct eargs *args)
sp &= ~7; sp &= ~7;
if(args->vmap->copyout(sp, args->argv[i], strlen(args->argv[i]) + 1) < 0) if(args->vmap->copyout(sp, args->argv[i], strlen(args->argv[i]) + 1) < 0)
goto bad; goto bad;
ustack[1+i] = sp; argstck[i] = sp;
} }
ustack[1+argc] = 0; argstck[argc] = 0;
args->proc->tf->rdi = argc; args->proc->tf->rdi = argc;
args->proc->tf->rsi = sp - (argc+1)*8; args->proc->tf->rsi = sp - (argc+1)*8;
sp -= (1+argc+1) * 8; sp -= (argc+1) * 8;
if(args->vmap->copyout(sp, ustack, (1+argc+1)*8) < 0) if(args->vmap->copyout(sp, argstck, (argc+1)*8) < 0)
goto bad;
sp -= 8;
if(args->vmap->copyout(sp, &argc, 8) < 0)
goto bad; goto bad;
// Save program name for debugging. // Save program name for debugging.
......
ULIB = ulib.o usys.o printf.o umalloc.o uthread.o fmt.o stream.o ipc.o \ ULIB = ulib.o usys.o printf.o umalloc.o uthread.o fmt.o stream.o ipc.o \
threads.o threads.o crt.o
ULIB := $(addprefix $(O)/lib/, $(ULIB)) ULIB := $(addprefix $(O)/lib/, $(ULIB))
.PRECIOUS: $(O)/lib/%.o .PRECIOUS: $(O)/lib/%.o
......
.code64
.align 8
.globl _start
_start:
call main
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论