[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. ;-)