aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/include/sys/exec.h4
-rw-r--r--sys/include/sys/proc.h4
-rw-r--r--sys/kern/exec_elf64.c1
-rw-r--r--sys/kern/kern_exec.c4
4 files changed, 10 insertions, 3 deletions
diff --git a/sys/include/sys/exec.h b/sys/include/sys/exec.h
index 810e89e..2c85010 100644
--- a/sys/include/sys/exec.h
+++ b/sys/include/sys/exec.h
@@ -30,7 +30,7 @@
#ifndef _SYS_EXEC_H_
#define _SYS_EXEC_H_
-#include <sys/proc.h>
+#include <sys/types.h>
#if defined(_KERNEL)
@@ -52,6 +52,8 @@
STACK_PUSH(PTR, VAL); \
STACK_PUSH(PTR, TAG);
+struct proc;
+
struct exec_range {
paddr_t start;
paddr_t end;
diff --git a/sys/include/sys/proc.h b/sys/include/sys/proc.h
index ab13536..cf76e80 100644
--- a/sys/include/sys/proc.h
+++ b/sys/include/sys/proc.h
@@ -36,6 +36,7 @@
#include <sys/param.h>
#include <sys/cdefs.h>
#include <sys/syscall.h>
+#include <sys/exec.h>
#if defined(_KERNEL)
#include <machine/frame.h>
#include <machine/pcb.h>
@@ -46,10 +47,9 @@
#define PROC_STACK_PAGES 8
#define PROC_STACK_SIZE (PROC_STACK_PAGES * DEFAULT_PAGESIZE)
-struct exec_prog;
-
struct proc {
pid_t pid;
+ struct exec_prog exec;
struct trapframe tf;
struct pcb pcb;
size_t priority;
diff --git a/sys/kern/exec_elf64.c b/sys/kern/exec_elf64.c
index b207fbb..d9a3bb9 100644
--- a/sys/kern/exec_elf64.c
+++ b/sys/kern/exec_elf64.c
@@ -31,6 +31,7 @@
#include <sys/exec.h>
#include <sys/param.h>
#include <sys/namei.h>
+#include <sys/proc.h>
#include <sys/vnode.h>
#include <sys/errno.h>
#include <vm/pmap.h>
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 1466159..ceb08f6 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -36,6 +36,7 @@
#include <vm/map.h>
#include <vm/physmem.h>
#include <machine/pcb.h>
+#include <string.h>
/*
* Release the memory of the old stack
@@ -84,6 +85,9 @@ execve(struct proc *td, const struct execve_args *args)
if (td->stack_base != 0)
release_stack(td);
+ /* Save program state */
+ memcpy(&td->exec, &prog, sizeof(td->exec));
+
/* Set new stack and map it to userspace */
td->stack_base = stack;
vm_map(pcbp->addrsp, td->stack_base, td->stack_base,