[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH v2 3/7] kernel2: Fuer Syscalls keinen Userspacestack benutzen



On Sun, Jan 03 17:03, Kevin Wolf wrote:
> ! kernel2: Auf dem Userspacestack zu arbeiten hat einen Haufen negative
>   Konsequenzen. Und wenn man den Task grad zerstoert hat, hat man sich
>   seinen eigenen Stack unter den Fuessen weggezogen. Lieber kopieren
>   statt direkt benutzen.
> 
> Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
> ---
>  src/kernel2/src/arch/i386/syscall.c |   30 ++++++++++--------------------
>  1 files changed, 10 insertions(+), 20 deletions(-)
> 
> diff --git a/src/kernel2/src/arch/i386/syscall.c b/src/kernel2/src/arch/i386/syscall.c
> index e8d71dc..7d5724e 100644
> --- a/src/kernel2/src/arch/i386/syscall.c
> +++ b/src/kernel2/src/arch/i386/syscall.c
> @@ -97,28 +97,18 @@ void syscall_arch(machine_state_t* isf)
>  
>      } else {
>          uint32_t eax, edx;
> -        dword stack_backup;
>  
> -
> -        // 512 Bytes Sicherheitsabstand auf dem Stack, denn wenn der Kernel
> -        // hier einen Stack Overflow produziert, haben wir ein Problem.
> -        if ((void*) (isf->esp - 0x200) < current_thread->user_stack_bottom) {
> -            increase_user_stack_size(current_thread, 1);
> -        }
> -
> -         // Die Syscallhandler werden mit dem Userspace-Stack aufgerufen, damit
> -        // keine Parameter kopiert werden muessen.
> -        asm("pusha;"
> -            // Den original-Stackpointer retten
> -            "movl %%esp, %3;"
> -            // Stack wechseln
> -            "movl %2, %%esp;"
> +        asm volatile(
> +            "sub %%ecx, %%esp;"
> +            "shr $0x2, %%ecx;"
> +            "mov %%esp, %%edi;"
> +            "rep movsd;"
>              "call *%4;"
> -            "movl %%eax, %0;"
> -            "movl %%edx, %1;"
> -            "movl %3, %%esp;"
> -            "popa;"
> -            : "=m" (eax), "=m" (edx) : "r" (stack), "m" (stack_backup), "r" (handler));
> +            "shl $0x2, %%ecx;"
> +            "add %%ecx, %%esp;"
> +            : "=a" (eax), "=d" (edx), "=S" (stack)
> +            : "S" (stack), "r" (handler), "c" (syscalls[number].arg_count * 4)
> +            : "edi");
>  
>          isf->eax = eax;
>          if (handler == syscall_get_tick_count) {

Ich glaube das sieht brauchbar aus.

Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx>

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgpZpjGGbstDW.pgp
Description: PGP signature