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:
parent
0031bf7501
commit
9f9d9cf33e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=284324
@ -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
|
||||
|
@ -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 ; \
|
||||
|
Loading…
Reference in New Issue
Block a user