summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2025-12-28 02:30:21 +0800
committerRichard Qin <richard.qin.x@gmail.com>2025-12-28 02:30:21 +0800
commit26f4b6e6ba7b2d542130c9abf5cdc005b6014e65 (patch)
tree52c97bb12cc5765be9e2dc0fc2353ea68fcf2112 /src
parentd782a7a8127db041ec4ba1098740f7f49085ef8a (diff)
downloadlume-26f4b6e6ba7b2d542130c9abf5cdc005b6014e65.tar.gz
lume-26f4b6e6ba7b2d542130c9abf5cdc005b6014e65.tar.xz
fixed(proc):Fix the page table mapping error during process fork
Diffstat (limited to 'src')
-rw-r--r--src/kernel/proc/proc.cc15
-rw-r--r--src/kernel/syscall.cc1
2 files changed, 11 insertions, 5 deletions
diff --git a/src/kernel/proc/proc.cc b/src/kernel/proc/proc.cc
index 008f740..b0ab370 100644
--- a/src/kernel/proc/proc.cc
+++ b/src/kernel/proc/proc.cc
@@ -144,17 +144,22 @@ int fork()
}
np->pagetable = VM::uvmcreate();
+
if (VM::uvmcopy(p->pagetable, np->pagetable, p->sz) < 0)
{
- PMM::free_page(np->kstack);
- PMM::free_page(np->tf);
- Spinlock::acquire(&proc_lock);
- np->state = UNUSED;
+ freeproc(np);
Spinlock::release(&proc_lock);
return -1;
}
np->sz = p->sz;
+ if (VM::mappages(np->pagetable, TRAPFRAME, PGSIZE,
+ (uint64)np->tf, PTE_R | PTE_W) < 0)
+ {
+ freeproc(np);
+ return -1;
+ }
+
*(np->tf) = *(p->tf);
np->tf->a0 = 0;
@@ -272,7 +277,7 @@ namespace ProcManager
}
p->pagetable = VM::uvmcreate();
-
+
uint64 initcode_sz = initcode_end - initcode_start;
VM::uvminit(p->pagetable, (uchar *)initcode_start, initcode_sz);
p->sz = PGSIZE;
diff --git a/src/kernel/syscall.cc b/src/kernel/syscall.cc
index 13bdbac..92b1a1b 100644
--- a/src/kernel/syscall.cc
+++ b/src/kernel/syscall.cc
@@ -99,6 +99,7 @@ uint64 sys_write()
if (VM::copyin(proc->pagetable, buf, p + i, len) < 0)
{
+ Drivers::uart_puts("sys_write: copyin failed\n");
return -1;
}