mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Refactor user-space stack creation.
This commit is contained in:
parent
f441066d02
commit
8e867908ab
5 changed files with 22 additions and 37 deletions
|
@ -115,7 +115,6 @@ private:
|
||||||
size_t zombiewaiting;
|
size_t zombiewaiting;
|
||||||
bool iszombie;
|
bool iszombie;
|
||||||
bool nozombify;
|
bool nozombify;
|
||||||
addr_t mmapfrom;
|
|
||||||
int exitstatus;
|
int exitstatus;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -182,7 +181,6 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void ResetForExecute();
|
void ResetForExecute();
|
||||||
addr_t AllocVirtualAddr(size_t size);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static Process* Get(pid_t pid);
|
static Process* Get(pid_t pid);
|
||||||
|
|
|
@ -106,8 +106,6 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
addr_t addrspace;
|
addr_t addrspace;
|
||||||
addr_t stackpos;
|
|
||||||
size_t stacksize;
|
|
||||||
sighandler_t sighandler;
|
sighandler_t sighandler;
|
||||||
addr_t kernelstackpos;
|
addr_t kernelstackpos;
|
||||||
size_t kernelstacksize;
|
size_t kernelstacksize;
|
||||||
|
|
|
@ -632,7 +632,6 @@ static void InitThread(void* /*user*/)
|
||||||
// the init ramdisk and transfer execution to it. We will then become a
|
// the init ramdisk and transfer execution to it. We will then become a
|
||||||
// regular user-space program with root permissions.
|
// regular user-space program with root permissions.
|
||||||
|
|
||||||
Thread* thread = CurrentThread();
|
|
||||||
Process* process = CurrentProcess();
|
Process* process = CurrentProcess();
|
||||||
|
|
||||||
const char* initpath = "/" CPUTYPE_STR "/bin/init";
|
const char* initpath = "/" CPUTYPE_STR "/bin/init";
|
||||||
|
@ -666,21 +665,6 @@ static void InitThread(void* /*user*/)
|
||||||
|
|
||||||
init.Reset();
|
init.Reset();
|
||||||
|
|
||||||
const size_t DEFAULT_STACK_SIZE = 512UL * 1024UL;
|
|
||||||
|
|
||||||
size_t stacksize = 0;
|
|
||||||
if ( !stacksize ) { stacksize = DEFAULT_STACK_SIZE; }
|
|
||||||
|
|
||||||
addr_t stackpos = process->AllocVirtualAddr(stacksize);
|
|
||||||
if ( !stackpos ) { Panic("Could not allocate init stack space"); }
|
|
||||||
|
|
||||||
int prot = PROT_FORK | PROT_READ | PROT_WRITE | PROT_KREAD | PROT_KWRITE;
|
|
||||||
if ( !Memory::MapRange(stackpos, stacksize, prot) )
|
|
||||||
Panic("Could not allocate init stack memory");
|
|
||||||
|
|
||||||
thread->stackpos = stackpos;
|
|
||||||
thread->stacksize = stacksize;
|
|
||||||
|
|
||||||
int argc = 1;
|
int argc = 1;
|
||||||
const char* argv[] = { "init", NULL };
|
const char* argv[] = { "init", NULL };
|
||||||
const char* cputype = "cputype=" CPUTYPE_STR;
|
const char* cputype = "cputype=" CPUTYPE_STR;
|
||||||
|
|
|
@ -98,7 +98,6 @@ Process::Process()
|
||||||
segments_used = 0;
|
segments_used = 0;
|
||||||
segments_length = 0;
|
segments_length = 0;
|
||||||
segment_lock = KTHREAD_MUTEX_INITIALIZER;
|
segment_lock = KTHREAD_MUTEX_INITIALIZER;
|
||||||
mmapfrom = 0x80000000UL;
|
|
||||||
exitstatus = -1;
|
exitstatus = -1;
|
||||||
pid = AllocatePID();
|
pid = AllocatePID();
|
||||||
uid = euid = 0;
|
uid = euid = 0;
|
||||||
|
@ -648,8 +647,6 @@ Process* Process::Fork()
|
||||||
kthread_mutex_unlock(&groupchildlock);
|
kthread_mutex_unlock(&groupchildlock);
|
||||||
|
|
||||||
// Initialize everything that is safe and can't fail.
|
// Initialize everything that is safe and can't fail.
|
||||||
clone->mmapfrom = mmapfrom;
|
|
||||||
|
|
||||||
kthread_mutex_lock(&ptrlock);
|
kthread_mutex_lock(&ptrlock);
|
||||||
clone->root = root;
|
clone->root = root;
|
||||||
clone->cwd = cwd;
|
clone->cwd = cwd;
|
||||||
|
@ -745,10 +742,29 @@ int Process::Execute(const char* programname, const uint8_t* program,
|
||||||
delete[] program_image_path;
|
delete[] program_image_path;
|
||||||
program_image_path = programname_clone; programname_clone = NULL;
|
program_image_path = programname_clone; programname_clone = NULL;
|
||||||
|
|
||||||
// TODO: This may be an ugly hack!
|
uintptr_t userspace_addr;
|
||||||
// TODO: Move this to x86/process.cpp.
|
size_t userspace_size;
|
||||||
|
Memory::GetUserVirtualArea(&userspace_addr, &userspace_size);
|
||||||
|
|
||||||
addr_t stackpos = CurrentThread()->stackpos + CurrentThread()->stacksize;
|
const size_t DEFAULT_STACK_SIZE = 512UL * 1024UL;
|
||||||
|
void* const PREFERRED_STACK_LOCATION =
|
||||||
|
(void*) (userspace_addr + userspace_size - DEFAULT_STACK_SIZE);
|
||||||
|
const int STACK_PROTECTION = PROT_READ | PROT_WRITE | PROT_KREAD |
|
||||||
|
PROT_KWRITE | PROT_FORK;
|
||||||
|
|
||||||
|
// Attempt to allocate a stack for the new process.
|
||||||
|
kthread_mutex_lock(&segment_lock);
|
||||||
|
struct segment stack_segment;
|
||||||
|
if ( !PlaceSegment(&stack_segment, this, PREFERRED_STACK_LOCATION, DEFAULT_STACK_SIZE, 0) ||
|
||||||
|
!Memory::MapMemory(this, stack_segment.addr, stack_segment.size, stack_segment.prot = STACK_PROTECTION) )
|
||||||
|
{
|
||||||
|
kthread_mutex_unlock(&segment_lock);
|
||||||
|
ResetForExecute();
|
||||||
|
return errno = ENOMEM, -1;
|
||||||
|
}
|
||||||
|
kthread_mutex_unlock(&segment_lock);
|
||||||
|
|
||||||
|
addr_t stackpos = stack_segment.addr + stack_segment.size;
|
||||||
|
|
||||||
// Alright, move argv onto the new stack! First figure out exactly how
|
// Alright, move argv onto the new stack! First figure out exactly how
|
||||||
// big argv actually is.
|
// big argv actually is.
|
||||||
|
@ -929,8 +945,6 @@ pid_t sys_tfork(int flags, tforkregs_t* regs)
|
||||||
thread->kernelstackpos = (addr_t) newkernelstack;
|
thread->kernelstackpos = (addr_t) newkernelstack;
|
||||||
thread->kernelstacksize = curthread->kernelstacksize;
|
thread->kernelstacksize = curthread->kernelstacksize;
|
||||||
thread->kernelstackmalloced = true;
|
thread->kernelstackmalloced = true;
|
||||||
thread->stackpos = curthread->stackpos;
|
|
||||||
thread->stacksize = curthread->stacksize;
|
|
||||||
thread->sighandler = curthread->sighandler;
|
thread->sighandler = curthread->sighandler;
|
||||||
|
|
||||||
StartKernelThread(thread);
|
StartKernelThread(thread);
|
||||||
|
@ -1194,9 +1208,4 @@ void Process::Init()
|
||||||
Panic("could not allocate pidlist\n");
|
Panic("could not allocate pidlist\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
addr_t Process::AllocVirtualAddr(size_t size)
|
|
||||||
{
|
|
||||||
return mmapfrom -= size;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Sortix
|
} // namespace Sortix
|
||||||
|
|
|
@ -51,8 +51,6 @@ Thread::Thread()
|
||||||
schedulerlistnext = NULL;
|
schedulerlistnext = NULL;
|
||||||
state = NONE;
|
state = NONE;
|
||||||
memset(®isters, 0, sizeof(registers));
|
memset(®isters, 0, sizeof(registers));
|
||||||
stackpos = 0;
|
|
||||||
stacksize = 0;
|
|
||||||
kernelstackpos = 0;
|
kernelstackpos = 0;
|
||||||
kernelstacksize = 0;
|
kernelstacksize = 0;
|
||||||
kernelstackmalloced = false;
|
kernelstackmalloced = false;
|
||||||
|
@ -90,8 +88,6 @@ addr_t Thread::SwitchAddressSpace(addr_t newaddrspace)
|
||||||
// Last chance to clean up user-space things before this thread dies.
|
// Last chance to clean up user-space things before this thread dies.
|
||||||
void Thread::LastPrayer()
|
void Thread::LastPrayer()
|
||||||
{
|
{
|
||||||
Memory::UnmapRange(stackpos, stacksize);
|
|
||||||
Memory::Flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void BootstrapKernelThread(void* user, ThreadEntry entry)
|
extern "C" void BootstrapKernelThread(void* user, ThreadEntry entry)
|
||||||
|
|
Loading…
Reference in a new issue