[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Lost] [Patch] kernel2: RPC: Genug Stack mappen
! kernel2: Beim Mappen des Stacks einberechnen, dass der aktuelle Stackpointer
nicht unbedingt auf einer Pagegrenze liegt und man deswegen manchmal eine
Page mehr braucht
Index: trunk/src/kernel2/src/syscalls/rpc.c
===================================================================
--- trunk.orig/src/kernel2/src/syscalls/rpc.c
+++ trunk/src/kernel2/src/syscalls/rpc.c
@@ -126,7 +126,6 @@ static void adjust_stack_size(pm_thread_
* sonst. Bei FALSE als Rückgabe sollte der aufrufende Task den RPC-Syscall
* wiederholen.
*/
-#include "kprintf.h"
int syscall_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
size_t data_size, void* data)
{
@@ -232,7 +231,7 @@ int syscall_fastrpc(pid_t callee_pid, si
&cpu_get_current()->thread->process->context,
&callee->process->context,
(vaddr_t) PAGE_ALIGN_ROUND_DOWN(callee_isf->esp),
- NUM_PAGES(rounded_data_size),
+ NUM_PAGES(rounded_data_size + ((uintptr_t) callee_isf->esp % PAGE_SIZE)),
KERNEL_MEM_START, KERNEL_MEM_END,
MM_FLAGS_KERNEL_DATA);
void* stack = first_stack_page + ((uintptr_t) callee_isf->esp % PAGE_SIZE);
@@ -263,9 +262,9 @@ int syscall_fastrpc(pid_t callee_pid, si
vmm_kernel_unmap(callee_isf, sizeof(*callee_isf));
- kprintf("[%d => %d] RPC durchgefuehrt.\n",
- cpu_get_current()->thread->process->pid,
- callee->process->pid);
+// kprintf("[%d => %d] RPC durchgefuehrt.\n",
+// cpu_get_current()->thread->process->pid,
+// callee->process->pid);
// Der aufgerufene Task darf wieder laufen
if (callee->status == PM_STATUS_WAIT_FOR_RPC) {
@@ -359,9 +358,9 @@ void syscall_fastrpc_ret(void)
callee_isf->eax = rpc->eax;
callee_isf->eflags = rpc->eflags;
- kprintf("[%d => %d] RPC fertig.\n",
- rpc->caller->process->pid,
- cpu_get_current()->thread->process->pid);
+// kprintf("[%d => %d] RPC fertig.\n",
+// rpc->caller->process->pid,
+// cpu_get_current()->thread->process->pid);
// TODO Wechsel zum aufrufenden Task
#if 0