[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [tyndur-devel] [PATCH] kernel2: Kernel-Interrupts moeglich machen
On Tue, Sep 21, 2010 at 08:39:08PM +0200, Antoine Kaufmann wrote:
> * kernel2: Anpassungen damit kernel-Interrupts nicht mehr den Stack
> durcheinander bringen.
> * kernel2: Neues Feld user_isf eingefuehrt, damit im Kernel jederzeit
> auf den ISF des Userspace-Interrupts zugegriffen werden
> kann, auch nach einem Kernel-Interrupt.
> ! kernel2: Keine RPCs zu Tasks die in Kernel-Interrupts sind
>
> Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
> ---
> src/kernel2/include/tasks.h | 3 +++
> src/kernel2/src/arch/i386/vm86.c | 2 +-
> src/kernel2/src/interrupts/im.c | 24 ++++++++++++++----------
> src/kernel2/src/syscalls/rpc.c | 12 ++++++++++--
> src/kernel2/src/tasks/thread.c | 1 +
> 5 files changed, 29 insertions(+), 13 deletions(-)
>
> diff --git a/src/kernel2/include/tasks.h b/src/kernel2/include/tasks.h
> index dfd0ea5..d1b031c 100644
> --- a/src/kernel2/include/tasks.h
> +++ b/src/kernel2/include/tasks.h
> @@ -106,6 +106,9 @@ typedef struct {
> /// Groesse des Kernelstacks
> size_t kernel_stack_size;
>
> + /// Aktueller Stackframe des Userspace-Interrupts
> + vaddr_t user_isf;
> +
> /// Anfang des Usermode-Stacks
> vaddr_t user_stack_bottom;
>
> diff --git a/src/kernel2/src/arch/i386/vm86.c b/src/kernel2/src/arch/i386/vm86.c
> index cdee6f1..c5d1e05 100644
> --- a/src/kernel2/src/arch/i386/vm86.c
> +++ b/src/kernel2/src/arch/i386/vm86.c
> @@ -150,7 +150,7 @@ static int create_vm86_task(int intr, vm86_regs_t* regs, uintptr_t stack)
> visf.es = regs->es;
>
> // Und das ganze auf den Stack
> - task->kernel_stack = ((uint8_t*) task->kernel_stack)
> + task->user_isf = task->kernel_stack = ((uint8_t*) task->kernel_stack)
> + sizeof(*isf) - sizeof(visf);
Eine Anweisung pro Zeile? Ich weiß, Grenzfall...
> memcpy(task->kernel_stack, &visf, sizeof(visf));
>
> diff --git a/src/kernel2/src/interrupts/im.c b/src/kernel2/src/interrupts/im.c
> index 1930c0d..0379d30 100644
> --- a/src/kernel2/src/interrupts/im.c
> +++ b/src/kernel2/src/interrupts/im.c
> @@ -133,9 +133,14 @@ interrupt_stack_frame_t* im_handler(interrupt_stack_frame_t* isf)
> // Pointer auf den aktuellen Thread holen
> pm_thread_t* thread = current_thread;
> pm_thread_t* old_thread = thread;
> - thread->kernel_stack = (vaddr_t) isf;
> uint8_t int_num = isf->interrupt_number;
> -
> + interrupt_stack_frame_t* new_isf = isf;
> +
> + // Wenn der Int aus dem Userspace kommt, legen wir den zugehoerigen ISF ab
> + if (isf->cs != 0x8) {
> + thread->user_isf = isf;
> + }
Wäre (isf->cs & 0x3) || (isf->eflags & 0x20000) nicht korrekter? Nicht
dass uns irgendwann noch irgendein BIOS (oder sonstiger VM86-Code)
reinlegt...
Ansonsten sehe ich keinen Fehler, was aber bei diesem Patch vermutlich
nicht viel heißt. ;-)