Clear DF bit in eflags/rflags on the kernel entry. The i386 and amd64

ABI specifies the DF should be zero, and newer compilers do not clear
DF before using DF-sensitive instructions.

The DF clearing for signal handlers was done some time ago.

MFC after:	1 week
This commit is contained in:
kib 2010-06-23 20:44:07 +00:00
parent 1cd81ae693
commit 8dcd1daee8
6 changed files with 19 additions and 1 deletions

View File

@ -191,6 +191,7 @@ alltraps_pushregs_no_rdi:
movq %r14,TF_R14(%rsp)
movq %r15,TF_R15(%rsp)
movl $TF_HASSEGS,TF_FLAGS(%rsp)
cld
FAKE_MCOUNT(TF_RIP(%rsp))
#ifdef KDTRACE_HOOKS
/*
@ -270,6 +271,7 @@ IDTVEC(dblfault)
movw %es,TF_ES(%rsp)
movw %ds,TF_DS(%rsp)
movl $TF_HASSEGS,TF_FLAGS(%rsp)
cld
testb $SEL_RPL_MASK,TF_CS(%rsp) /* Did we come from kernel? */
jz 1f /* already running with kernel GS.base */
swapgs
@ -369,6 +371,7 @@ IDTVEC(fast_syscall)
movq %r14,TF_R14(%rsp) /* C preserved */
movq %r15,TF_R15(%rsp) /* C preserved */
movl $TF_HASSEGS,TF_FLAGS(%rsp)
cld
FAKE_MCOUNT(TF_RIP(%rsp))
movq %rsp,%rdi
call syscall
@ -434,6 +437,7 @@ IDTVEC(nmi)
movw %es,TF_ES(%rsp)
movw %ds,TF_DS(%rsp)
movl $TF_HASSEGS,TF_FLAGS(%rsp)
cld
xorl %ebx,%ebx
testb $SEL_RPL_MASK,TF_CS(%rsp)
jnz nmi_fromuserspace

View File

@ -67,6 +67,7 @@ IDTVEC(int0x80_syscall)
movq %r14,TF_R14(%rsp)
movq %r15,TF_R15(%rsp)
movl $TF_HASSEGS,TF_FLAGS(%rsp)
cld
FAKE_MCOUNT(TF_RIP(%rsp))
movq %rsp, %rdi
call ia32_syscall

View File

@ -166,7 +166,8 @@
movw %gs,TF_GS(%rsp) ; \
movw %es,TF_ES(%rsp) ; \
movw %ds,TF_DS(%rsp) ; \
movl $TF_HASSEGS,TF_FLAGS(%rsp)
movl $TF_HASSEGS,TF_FLAGS(%rsp) ; \
cld
#define POP_FRAME \
movq TF_RDI(%rsp),%rdi ; \

View File

@ -56,6 +56,7 @@
IDTVEC(vec_name) ; \
PUSH_FRAME ; \
SET_KERNEL_SREGS ; \
cld ; \
FAKE_MCOUNT(TF_EIP(%esp)) ; \
movl lapic, %edx ; /* pointer to local APIC */ \
movl LA_ISR + 16 * (index)(%edx), %eax ; /* load ISR */ \
@ -103,6 +104,7 @@ IDTVEC(spuriousint)
IDTVEC(timerint)
PUSH_FRAME
SET_KERNEL_SREGS
cld
FAKE_MCOUNT(TF_EIP(%esp))
pushl %esp
call lapic_handle_timer
@ -118,6 +120,7 @@ IDTVEC(timerint)
IDTVEC(cmcint)
PUSH_FRAME
SET_KERNEL_SREGS
cld
FAKE_MCOUNT(TF_EIP(%esp))
call lapic_handle_cmc
MEXITCOUNT
@ -131,6 +134,7 @@ IDTVEC(cmcint)
IDTVEC(errorint)
PUSH_FRAME
SET_KERNEL_SREGS
cld
FAKE_MCOUNT(TF_EIP(%esp))
call lapic_handle_error
MEXITCOUNT
@ -302,6 +306,7 @@ IDTVEC(invlcache)
IDTVEC(ipi_intr_bitmap_handler)
PUSH_FRAME
SET_KERNEL_SREGS
cld
movl lapic, %edx
movl $0, LA_EOI(%edx) /* End Of Interrupt to APIC */
@ -320,6 +325,7 @@ IDTVEC(ipi_intr_bitmap_handler)
IDTVEC(cpustop)
PUSH_FRAME
SET_KERNEL_SREGS
cld
movl lapic, %eax
movl $0, LA_EOI(%eax) /* End Of Interrupt to APIC */
@ -339,6 +345,7 @@ IDTVEC(cpustop)
IDTVEC(rendezvous)
PUSH_FRAME
SET_KERNEL_SREGS
cld
#ifdef COUNT_IPIS
movl PCPU(CPUID), %eax
@ -360,6 +367,7 @@ IDTVEC(rendezvous)
IDTVEC(lazypmap)
PUSH_FRAME
SET_KERNEL_SREGS
cld
call pmap_lazyfix_action

View File

@ -49,6 +49,7 @@
IDTVEC(vec_name) ; \
PUSH_FRAME ; \
SET_KERNEL_SREGS ; \
cld ; \
; \
FAKE_MCOUNT(TF_EIP(%esp)) ; \
pushl %esp ; \

View File

@ -159,6 +159,7 @@ alltraps:
pushl %fs
alltraps_with_regs_pushed:
SET_KERNEL_SREGS
cld
FAKE_MCOUNT(TF_EIP(%esp))
calltrap:
pushl %esp
@ -233,6 +234,7 @@ IDTVEC(lcall_syscall)
pushl %es
pushl %fs
SET_KERNEL_SREGS
cld
FAKE_MCOUNT(TF_EIP(%esp))
pushl %esp
call syscall
@ -256,6 +258,7 @@ IDTVEC(int0x80_syscall)
pushl %es
pushl %fs
SET_KERNEL_SREGS
cld
FAKE_MCOUNT(TF_EIP(%esp))
pushl %esp
call syscall