Kernel entry from vm86 mode, where PCB_VM86CALL pcb flag is not set,

is executed on the right stack already.  No copy from the entry stack
to the kstack must be performed for vm86 bios call code to function.

To access the pcb flags on kernel entry, unconditionally switch to
kernel address space if vm86 mode is detected.

This fixes very early vm86 bios calls, typically done when boot is
performed by boot2 without loader, and kernel falls back to BIOS calls
to get SMAP.

Reported by:	bde
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
kib 2018-05-12 11:06:59 +00:00
parent 20d1e9d505
commit 99b8ab0632

View File

@ -212,11 +212,17 @@
.macro KENTER
testl $PSL_VM, TF_EFLAGS(%esp)
jnz 1f
testb $SEL_RPL_MASK, TF_CS(%esp)
jz 2f
1: MOVE_STACKS
2:
jz 1f
LOAD_KCR3
movl PCPU(CURPCB), %eax
testl $PCB_VM86CALL, PCB_FLAGS(%eax)
jnz 3f
NMOVE_STACKS
jmp 2f
1: testb $SEL_RPL_MASK, TF_CS(%esp)
jz 3f
2: MOVE_STACKS
3:
.endm
#endif /* LOCORE */