From bc5570ae608e8b0b5749c21ff63eaf89adfeedcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 4 Jun 2021 16:46:10 +0200 Subject: [PATCH] kernel/x86: set initial user thread IOPL to zero User threads aren't supposed to be able to adjust the interrupt flag (IF). A few apps for instance DOSBox would just use the popf instruction and disable the flag, expecting the change to be ignored. Quote from the Intel manual: "The interrupt flag (IF) is altered only when executing at a level at least as privileged as the IOPL. If a POPF/POPFD instruction is executed with insufficient privilege, an exception does not occur, but the privileged bits do not change." fix #14711 Change-Id: I0519312c1151a1dd76541f60283c6c210a5b21a6 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4046 Reviewed-by: Adrien Destugues --- src/system/kernel/arch/x86/32/thread.cpp | 3 +-- src/system/kernel/arch/x86/64/thread.cpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/system/kernel/arch/x86/32/thread.cpp b/src/system/kernel/arch/x86/32/thread.cpp index 0a5e05b3fe..7043b7d1cd 100644 --- a/src/system/kernel/arch/x86/32/thread.cpp +++ b/src/system/kernel/arch/x86/32/thread.cpp @@ -251,8 +251,7 @@ arch_thread_enter_userspace(Thread* thread, addr_t entry, void* args1, frame.ds = USER_DATA_SELECTOR; frame.ip = entry; frame.cs = USER_CODE_SELECTOR; - frame.flags = X86_EFLAGS_RESERVED1 | X86_EFLAGS_INTERRUPT - | (3 << X86_EFLAGS_IO_PRIVILEG_LEVEL_SHIFT); + frame.flags = X86_EFLAGS_RESERVED1 | X86_EFLAGS_INTERRUPT; frame.user_sp = stackTop; frame.user_ss = USER_DATA_SELECTOR; diff --git a/src/system/kernel/arch/x86/64/thread.cpp b/src/system/kernel/arch/x86/64/thread.cpp index b1c94c813b..25df19b8ac 100644 --- a/src/system/kernel/arch/x86/64/thread.cpp +++ b/src/system/kernel/arch/x86/64/thread.cpp @@ -265,8 +265,7 @@ arch_thread_enter_userspace(Thread* thread, addr_t entry, void* args1, frame.di = (uint64)args1; frame.ip = entry; frame.cs = USER_CODE_SELECTOR; - frame.flags = X86_EFLAGS_RESERVED1 | X86_EFLAGS_INTERRUPT - | (3 << X86_EFLAGS_IO_PRIVILEG_LEVEL_SHIFT); + frame.flags = X86_EFLAGS_RESERVED1 | X86_EFLAGS_INTERRUPT; frame.sp = stackTop; frame.ss = USER_DATA_SELECTOR;