On Sat, Dec 20 23:49, Kevin Wolf wrote: > + kernel2: Syscall pm_exit_process > --- > src/kernel2/include/syscall.h | 3 +++ > src/kernel2/src/syscall.c | 1 + > src/kernel2/src/syscalls/pm.c | 24 ++++++++++++++++++++++++ > src/kernel2/src/tasks/pm.c | 6 ++++-- > src/kernel2/src/tasks/thread.c | 11 ++++++----- > 5 files changed, 38 insertions(+), 7 deletions(-) > > diff --git a/src/kernel2/include/syscall.h b/src/kernel2/include/syscall.h > index b30b389..160cbf3 100644 > --- a/src/kernel2/include/syscall.h > +++ b/src/kernel2/include/syscall.h > @@ -109,6 +109,9 @@ void syscall_pm_wait_for_rpc(void); > PID_T SYSCALL_PM_CREATE_PROCESS(VADDR_T START, UID_T UID, > const char* cmdline, pid_t parent_pid); > > +/// Aktuellen Prozess beenden > +void syscall_pm_exit_process(void); > + > /// Speicher an einen anderen Prozess uebergeben > void syscall_init_child_page(pid_t pid, vaddr_t src, vaddr_t dest, > size_t size); > diff --git a/src/kernel2/src/syscall.c b/src/kernel2/src/syscall.c > index 836d1e7..1749c7e 100644 > --- a/src/kernel2/src/syscall.c > +++ b/src/kernel2/src/syscall.c > @@ -67,6 +67,7 @@ void syscall_init() > > syscall_register(SYSCALL_PM_CREATE_PROCESS, &syscall_pm_create_process, 4); > syscall_register(SYSCALL_PM_INIT_PAGE, &syscall_init_child_page, 4); > + syscall_register(SYSCALL_PM_EXIT_PROCESS, &syscall_pm_exit_process, 0); > > syscall_register(SYSCALL_SET_RPC_HANDLER, &syscall_set_rpc_handler, 1); > #if CONFIG_ARCH == ARCH_I386 > diff --git a/src/kernel2/src/syscalls/pm.c b/src/kernel2/src/syscalls/pm.c > index 93845b3..34e1888 100644 > --- a/src/kernel2/src/syscalls/pm.c > +++ b/src/kernel2/src/syscalls/pm.c > @@ -64,6 +64,30 @@ pid_t syscall_pm_create_process(vaddr_t start, uid_t uid, const char* cmdline, > return process->pid; > } > > +/** > + * Beendet den aktuellen Prozess. > + */ > +void syscall_pm_exit_process(void) > +{ > + pm_process_t* old_task = cpu_get_current()->thread->process; > + pm_thread_t* thread; > + > + // Task abgeben > + pm_scheduler_push(cpu_get_current()->thread); > + > + // Genau jetzt muss der Prozess geloescht werden: Der Thread ist nicht mehr > + // aktiv, und er darf auch nicht wieder aktiviert werden. > + pm_destroy(old_task); > + > + // Einen neuen Task holen. > + // FIXME Da braucht es endlich eine Funktion dafuer > + thread = pm_scheduler_pop(); > + > + cpu_get_current()->tss.esp0 = (uintptr_t) thread->kernel_stack + sizeof(interrupt_stack_frame_t); > + cpu_get_current()->tss.ss0 = 2 << 3; > + > + cpu_get_current()->thread = thread; Hier wäre es nett, wenn das dann in der nächsten Zeit durch eine Funktion ersetzt würde, irgendwie glaube ich nämlich, dass das irgendwann zu seltsamen Bugs führt... ;-) Aber jo das ist was fuer einen anderen Patch. > +} > > /** > * PID des aktuellen Prozesses ausfindig machen > diff --git a/src/kernel2/src/tasks/pm.c b/src/kernel2/src/tasks/pm.c > index 3f43688..74a0f67 100644 > --- a/src/kernel2/src/tasks/pm.c > +++ b/src/kernel2/src/tasks/pm.c > @@ -221,11 +221,13 @@ bool pm_block(pm_process_t* process) > > // Die einzelnen Threads sperren > while ((thread = list_get_element_at(process->threads, i++))) { > - if (pm_thread_block(thread) != TRUE) { > + if ((thread->status != PM_STATUS_BLOCKED) > + && pm_thread_block(thread) != TRUE) > + { > result = FALSE; > } > } > - > + > process->status = PM_STATUS_BLOCKED; > > return result; > diff --git a/src/kernel2/src/tasks/thread.c b/src/kernel2/src/tasks/thread.c > index 6324b2a..d869595 100644 > --- a/src/kernel2/src/tasks/thread.c > +++ b/src/kernel2/src/tasks/thread.c > @@ -143,8 +143,11 @@ void pm_thread_destroy(pm_thread_t* thread) > // TODO: Den Userspacestack auch freigeben > > // Kernelstack freigeben > + /* > + * FIXME Wieder freigeben, und dieses Mal dann auch physisch > mmc_unmap(&thread->process->context, thread->kernel_stack_bottom, > NUM_PAGES(thread->kernel_stack_size)); > + */ > > // Aus der Threadliste enfernen > pm_thread_t* thread_; > @@ -177,8 +180,7 @@ bool pm_thread_block(pm_thread_t* thread) > // TODO: In SMP-Systemen sollte hier ein IPI kommen, falls der Thread auf > // einer anderen CPU am laufen ist, der sie dazu zwingt, den Thread > // abzugeben. > - bool result = FALSE; > - > + > // Wenn der Thread gesperrt ist, muss garnicht weiter probiert werden > if (locked(&thread->lock) == TRUE) { > return FALSE; > @@ -188,12 +190,11 @@ bool pm_thread_block(pm_thread_t* thread) > > if (thread->status == PM_STATUS_READY) { > thread->status = PM_STATUS_BLOCKED; > - result = TRUE; > } > - > + > unlock(&thread->lock); > > - return result; > + return (thread->status == PM_STATUS_BLOCKED); > } > > /** Sieht zwar nicht gut aus, kann aber rein. ;-) -- Antoine Kaufmann <toni@xxxxxxxxxxxxxxxx>
Attachment:
pgpDsNdsosfJB.pgp
Description: PGP signature