Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/asm.S

    r8078180 rd029434  
    11/*
    2  * Copyright (c) 2001 Jakub Jermar
     2 * Copyright (c) 2010 Jakub Jermar
    33 * All rights reserved.
    44 *
     
    3232
    3333#include <arch/pm.h>
     34#include <arch/cpu.h>
    3435#include <arch/mm/page.h>
    3536
     
    190191.global sysenter_handler
    191192sysenter_handler:
    192         sti
    193193        subl $(ISTATE_REAL_SIZE), %esp
    194194
     
    227227         * Switch to kernel selectors.
    228228         */
    229         movw $16, %ax
     229        movw $(gdtselector(KDATA_DES)), %ax
    230230        movw %ax, %ds
    231231        movw %ax, %es
    232232       
    233         cld
     233        /*
     234         * Sanitize EFLAGS.
     235         *
     236         * SYSENTER does not clear the NT flag, which could thus proliferate
     237         * from here to the IRET instruction via a context switch and result
     238         * in crash.
     239         *
     240         * SYSENTER does not clear DF, which the ABI assumes to be cleared.
     241         *
     242         * SYSENTER clears IF, which we would like to be set for syscalls.
     243         *
     244         */
     245        pushl $(EFLAGS_IF)  /* specify EFLAGS bits that we want to set */
     246        popfl               /* set bits from the mask, clear or ignore others */
     247
    234248        call syscall_handler
    235249       
     
    294308         * Switch to kernel selectors.
    295309         */
    296         movl $16, %eax
     310        movl $(gdtselector(KDATA_DES)), %eax
    297311        movl %eax, %ds
    298312        movl %eax, %es
     
    358372                .if (1 << \i) & ERROR_WORD_INTERRUPT_LIST
    359373                        /*
    360                          * Exception with error word: do nothing
     374                         * Exception with error word.
    361375                         */
     376                        subl $ISTATE_SOFT_SIZE, %esp
    362377                .else
    363378                        /*
    364379                         * Exception without error word: fake up one
    365380                         */
    366                         pushl $0
     381                        subl $(ISTATE_SOFT_SIZE + 4), %esp
    367382                .endif
    368383        .else
    369384                /*
    370                  * Interrupt: fake up one
     385                 * Interrupt: fake up an error word
    371386                 */
    372                 pushl $0
     387                subl $(ISTATE_SOFT_SIZE + 4), %esp
    373388        .endif
    374        
    375         subl $ISTATE_SOFT_SIZE, %esp
    376389       
    377390        /*
     
    404417         * Switch to kernel selectors.
    405418         */
    406         movl $16, %eax
     419        movl $(gdtselector(KDATA_DES)), %eax
    407420        movl %eax, %ds
    408421        movl %eax, %es
     
    413426         */
    414427        xorl %eax, %eax
    415         cmpl $8, ISTATE_OFFSET_CS(%esp)
    416         cmovl %eax, %ebp
     428        cmpl $(gdtselector(KTEXT_DES)), ISTATE_OFFSET_CS(%esp)
     429        cmovnzl %eax, %ebp
    417430
    418431        movl %ebp, ISTATE_OFFSET_EBP_FRAME(%esp)
Note: See TracChangeset for help on using the changeset viewer.