aboutsummaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/amd64/amd64/proc_machdep.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/sys/arch/amd64/amd64/proc_machdep.c b/sys/arch/amd64/amd64/proc_machdep.c
index eb3866a..d2eb599 100644
--- a/sys/arch/amd64/amd64/proc_machdep.c
+++ b/sys/arch/amd64/amd64/proc_machdep.c
@@ -46,12 +46,12 @@
* @ip: Instruction pointer.
*/
int
-md_td_init(struct proc *p, struct proc *parent, uintptr_t ip)
+md_fork(struct proc *p, struct proc *parent, uintptr_t ip)
{
uintptr_t stack_base;
- struct trapframe *tfp, *parent_tfp;
+ struct trapframe *tfp;
struct pcb *pcbp;
- uint8_t rpl;
+ uint8_t rpl = 0;
int error;
tfp = &p->tf;
@@ -61,18 +61,15 @@ md_td_init(struct proc *p, struct proc *parent, uintptr_t ip)
if ((error = pmap_new_vas(&pcbp->addrsp)) != 0)
return error;
+ memcpy(tfp, &parent->tf, sizeof(p->tf));
+
/*
- * If parent is NULL, assume kernel space and zero the
- * trapframe. Otherwise we can just set it up normally.
+ * Kernel threads cannot be on the lower half.
+ * If 'ip' is on the lower half, assume that it
+ * is a userspace program and set RPL to ring 3.
*/
- if (parent == NULL) {
- rpl = 0;
- memset(tfp, 0, sizeof(*tfp));
- } else {
- parent_tfp = &parent->tf;
- rpl = parent_tfp->cs & 3;
- memcpy(tfp, &parent->tf, sizeof(*tfp));
- }
+ if (ip < VM_HIGHER_HALF)
+ rpl = 3;
/*
* RPL being 3 indicates that the parent thread is in