/*-
* Copyright (c) 2002-2018 The UbixOS Project.
* All rights reserved.
*
* This was developed by Christopher W. Olsen for the UbixOS Project.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
*
* 1) Redistributions of source code must retain the above copyright notice, this list of
* conditions, the following disclaimer and the list of authors.
* 2) Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions, the following disclaimer and the list of authors in the documentation and/or
* other materials provided with the distribution.
* 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <ubixos/fork.h>
#include <ubixos/types.h>
#include <ubixos/sched.h>
#include <ubixos/tty.h>
#include <ubixos/vitals.h>
#include <vmm/vmm.h>
#include <string.h>
#include <assert.h>
/*****************************************************************************************
Functoin: static int fork_copyProcess(struct taskStruct *newProcess,long ebp,long edi,
long esi, long none,long ebx,long ecx,long edx,long eip,long cs,long eflags,
long esp,long ss)
Desc: This function will copy a process
Notes:
*****************************************************************************************/
/* Had to remove static though tihs function is only used in this file */
int fork_copyProcess(struct taskStruct *newProcess, long ebp, long edi, long esi, long none, long ebx, long ecx, long edx, long eip, long cs, long eflags, long esp, long ss) {
volatile struct taskStruct * tmpProcPtr = newProcess;
assert(newProcess);
assert(_current);
/* Set Up New Tasks Information */
memcpy(newProcess->oInfo.cwd, _current->oInfo.cwd, 1024);
newProcess->tss.eip = eip;
newProcess->oInfo.vmStart = _current->oInfo.vmStart;
newProcess->term = _current->term;
newProcess->term->owner = newProcess->id;
newProcess->uid = _current->uid;
newProcess->gid = _current->gid;
newProcess->tss.back_link = 0x0;
newProcess->tss.esp0 = _current->tss.esp0;
newProcess->tss.ss0 = 0x10;
newProcess->tss.esp1 = 0x0;
newProcess->tss.ss1 = 0x0;
newProcess->tss.esp2 = 0x0;
newProcess->tss.ss2 = 0x0;
newProcess->tss.eflags = eflags;
newProcess->tss.eax = 0x0;
newProcess->tss.ebx = ebx;
newProcess->tss.ecx = ecx;
newProcess->tss.edx = edx;
newProcess->tss.esi = esi;
newProcess->tss.edi = edi;
newProcess->tss.ebp = ebp;
newProcess->tss.esp = esp;
newProcess->tss.cs = cs & 0xFF;
newProcess->tss.ss = ss & 0xFF;
newProcess->tss.ds = _current->tss.ds & 0xFF;
newProcess->tss.fs = _current->tss.fs & 0xFF;
newProcess->tss.gs = _current->tss.gs & 0xFF;
newProcess->tss.es = _current->tss.es & 0xFF;
newProcess->tss.ldt = 0x18;
newProcess->tss.trace_bitmap = 0x0000;
newProcess->tss.io_map = 0x8000;
/* Create A Copy Of The VM Space For New Task */
newProcess->tss.cr3 = (uInt32) vmmCopyVirtualSpace(newProcess->id);
newProcess->state = FORK;
/* Fix gcc optimization problems */
while (tmpProcPtr->state == FORK)
sched_yield();
/* Return Id of Proccess */
return (newProcess->id);
}
/*****************************************************************************************
Functoin: void sysFork();
Desc: This function will fork a new task
Notes:
08/01/02 - This Seems To Be Working Fine However I'm Not Sure If I
Chose The Best Path To Impliment It I Guess We Will See
What The Future May Bring
*****************************************************************************************/
asm(
".globl sysFork \n"
"sysFork: \n"
" xor %eax,%eax \n"
" call schedNewTask \n"
" testl %eax,%eax \n"
" je fork_ret \n"
" pushl %esi \n"
" pushl %edi \n"
" pushl %ebp \n"
" pushl %eax \n"
" call fork_copyProcess \n"
" movl %eax,(%ebx) \n"
" addl $16,%esp \n"
"fork_ret: \n"
" ret \n"
);