- } else {
- Uint tmp_rbp, old_rsp = rsp;
-
- // Set CR3
- newThread->MemState.CR3 = cur->MemState.CR3;
-
- // Create new KStack
- newThread->KernelStack = MM_NewKStack();
- Log("Proc_Clone: newKStack = %p", newThread->KernelStack);
- // Check for errors
- if(newThread->KernelStack == 0) {
- free(newThread);
- return -1;
- }
-
- // Get ESP as a used size
- rsp = cur->KernelStack - rsp;
- // Copy used stack
- memcpy(
- (void*)(newThread->KernelStack - rsp),
- (void*)(cur->KernelStack - rsp),
- rsp
- );
- // Get ESP as an offset in the new stack
- rsp = newThread->KernelStack - rsp;
- // Adjust EBP
- rbp = newThread->KernelStack - (cur->KernelStack - rbp);
-
- // Repair EBPs & Stack Addresses
- // Catches arguments also, but may trash stack-address-like values
- for(tmp_rbp = rsp; tmp_rbp < newThread->KernelStack; tmp_rbp += sizeof(Uint))
- {
- if(old_rsp < *(Uint*)tmp_rbp && *(Uint*)tmp_rbp < cur->KernelStack)
- *(Uint*)tmp_rbp += newThread->KernelStack - cur->KernelStack;
- }