Ignore:
File:
1 edited

Legend:

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

    rd029434 r8078180  
    11/*
    2  * Copyright (c) 2010 Jakub Jermar
     2 * Copyright (c) 2001 Jakub Jermar
    33 * All rights reserved.
    44 *
     
    3232
    3333#include <arch/pm.h>
    34 #include <arch/cpu.h>
    3534#include <arch/mm/page.h>
    3635
     
    191190.global sysenter_handler
    192191sysenter_handler:
     192        sti
    193193        subl $(ISTATE_REAL_SIZE), %esp
    194194
     
    227227         * Switch to kernel selectors.
    228228         */
    229         movw $(gdtselector(KDATA_DES)), %ax
     229        movw $16, %ax
    230230        movw %ax, %ds
    231231        movw %ax, %es
    232232       
    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 
     233        cld
    248234        call syscall_handler
    249235       
     
    308294         * Switch to kernel selectors.
    309295         */
    310         movl $(gdtselector(KDATA_DES)), %eax
     296        movl $16, %eax
    311297        movl %eax, %ds
    312298        movl %eax, %es
     
    372358                .if (1 << \i) & ERROR_WORD_INTERRUPT_LIST
    373359                        /*
    374                          * Exception with error word.
     360                         * Exception with error word: do nothing
    375361                         */
    376                         subl $ISTATE_SOFT_SIZE, %esp
    377362                .else
    378363                        /*
    379364                         * Exception without error word: fake up one
    380365                         */
    381                         subl $(ISTATE_SOFT_SIZE + 4), %esp
     366                        pushl $0
    382367                .endif
    383368        .else
    384369                /*
    385                  * Interrupt: fake up an error word
     370                 * Interrupt: fake up one
    386371                 */
    387                 subl $(ISTATE_SOFT_SIZE + 4), %esp
     372                pushl $0
    388373        .endif
     374       
     375        subl $ISTATE_SOFT_SIZE, %esp
    389376       
    390377        /*
     
    417404         * Switch to kernel selectors.
    418405         */
    419         movl $(gdtselector(KDATA_DES)), %eax
     406        movl $16, %eax
    420407        movl %eax, %ds
    421408        movl %eax, %es
     
    426413         */
    427414        xorl %eax, %eax
    428         cmpl $(gdtselector(KTEXT_DES)), ISTATE_OFFSET_CS(%esp)
    429         cmovnzl %eax, %ebp
     415        cmpl $8, ISTATE_OFFSET_CS(%esp)
     416        cmovl %eax, %ebp
    430417
    431418        movl %ebp, ISTATE_OFFSET_EBP_FRAME(%esp)
Note: See TracChangeset for help on using the changeset viewer.