Ensure that the upper 16 bits of segment registers manually saved in

trapframes are cleared by explicitly pushing a zero and then moving
the segment register into the low 16 bits.  Certain Intel processors
treat a push of a segment register as a move of the segment register
into the low 16 bits leaving the upper 16 bits of the word in the
stack unchanged.

Reviewed by:	kib
MFC after:	1 month
This commit is contained in:
jhb 2015-06-12 15:06:17 +00:00
parent 06a33e037a
commit ac9b7e1fd0
2 changed files with 30 additions and 15 deletions

View File

@ -157,9 +157,12 @@ IDTVEC(xmm)
.type alltraps,@function
alltraps:
pushal
pushl %ds
pushl %es
pushl %fs
pushl $0
movl %ds,(%esp)
pushl $0
movl %es,(%esp)
pushl $0
movl %fs,(%esp)
alltraps_with_regs_pushed:
SET_KERNEL_SREGS
cld
@ -233,9 +236,12 @@ IDTVEC(lcall_syscall)
pushl $7 /* sizeof "lcall 7,0" */
subl $4,%esp /* skip over tf_trapno */
pushal
pushl %ds
pushl %es
pushl %fs
pushl $0
movl %ds,(%esp)
pushl $0
movl %es,(%esp)
pushl $0
movl %fs,(%esp)
SET_KERNEL_SREGS
cld
FAKE_MCOUNT(TF_EIP(%esp))
@ -259,9 +265,12 @@ IDTVEC(int0x80_syscall)
pushl $2 /* sizeof "int 0x80" */
subl $4,%esp /* skip over tf_trapno */
pushal
pushl %ds
pushl %es
pushl %fs
pushl $0
movl %ds,(%esp)
pushl $0
movl %es,(%esp)
pushl $0
movl %fs,(%esp)
SET_KERNEL_SREGS
cld
FAKE_MCOUNT(TF_EIP(%esp))
@ -416,13 +425,16 @@ doreti_iret:
doreti_iret_fault:
subl $8,%esp
pushal
pushl %ds
pushl $0
movl %ds,(%esp)
.globl doreti_popl_ds_fault
doreti_popl_ds_fault:
pushl %es
pushl $0
movl %es,(%esp)
.globl doreti_popl_es_fault
doreti_popl_es_fault:
pushl %fs
pushl $0
movl %fs,(%esp)
.globl doreti_popl_fs_fault
doreti_popl_fs_fault:
sti

View File

@ -146,9 +146,12 @@
pushl $0 ; /* dummy error code */ \
pushl $0 ; /* dummy trap type */ \
pushal ; /* 8 ints */ \
pushl %ds ; /* save data and extra segments ... */ \
pushl %es ; \
pushl %fs
pushl $0 ; /* save data and extra segments ... */ \
mov %ds,(%esp) ; \
pushl $0 ; \
mov %es,(%esp) ; \
pushl $0 ; \
mov %fs,(%esp)
#define POP_FRAME \
popl %fs ; \