Re: [PATCH v4] x86/umip: Add emulation/spoofing for SLDT and STR instructions
From: Ricardo Neri
Date: Tue Jun 09 2020 - 20:13:00 EST
On Tue, Jun 09, 2020 at 10:54:23AM -0700, Brendan Shanks wrote:
> Add emulation/spoofing of SLDT and STR for both 32- and 64-bit
> processes.
>
> Wine users have found a small number of Windows apps using SLDT that
> were crashing when run on UMIP-enabled systems.
>
> Reported-by: Andreas Rammhold <andi@xxxxxxxxxxxxx>
> Originally-by: Ricardo Neri <ricardo.neri-calderon@xxxxxxxxxxxxxxx>
> Signed-off-by: Brendan Shanks <bshanks@xxxxxxxxxxxxxxx>
> ---
>
> v4: Use braces for every clause of the conditional. I tried a switch(),
> but it takes more lines and looks more cluttered (especially with the
> #ifdef).
> Also replace out-of-date comment at top of file.
>
> arch/x86/kernel/umip.c | 38 ++++++++++++++++++++++++++------------
> 1 file changed, 26 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/kernel/umip.c b/arch/x86/kernel/umip.c
> index 8d5cbe1bbb3b..62f4f0afb979 100644
> --- a/arch/x86/kernel/umip.c
> +++ b/arch/x86/kernel/umip.c
> @@ -45,11 +45,12 @@
> * value that, lies close to the top of the kernel memory. The limit for the GDT
> * and the IDT are set to zero.
> *
> - * Given that SLDT and STR are not commonly used in programs that run on WineHQ
> - * or DOSEMU2, they are not emulated.
> - *
> * The instruction smsw is emulated to return the value that the register CR0
> * has at boot time as set in the head_32.
> + * sldt and str are emulated to return the values that the kernel programmatically
> + * assigns:
> + * - sldt returns (GDT_ENTRY_LDT * 8) if an LDT has been set, 0 if not.
> + * - str returns (GDT_ENTRY_TSS * 8).
Probably for consistency with the rest of the document the instruction
names should be capitalized (I know that smsw was not capitalized before
:/). Maybe maintainers can fix this when applying?
Other than that, FWIW:
Reviewed-by: Ricardo Neri <ricardo.neri-calderon@xxxxxxxxxxxxxxx>
Tested-by: Ricardo Neri <ricardo.neri-calderon@xxxxxxxxxxxxxxx>