[PATCH v3 1/2] ntdll: Add emulation for UMIP instructions.
Alexandre Julliard
julliard at winehq.org
Mon Nov 25 11:29:15 CST 2019
Brendan Shanks <bshanks at codeweavers.com> writes:
> +extern int have_cpuid (void );
> +
> +extern void do_cpuid_cx( unsigned int ax, unsigned int cx, unsigned int *p );
> +__ASM_GLOBAL_FUNC( do_cpuid_cx,
> + "pushl %esi\n\t"
> + "pushl %ebx\n\t"
> + "movl 12(%esp),%eax\n\t"
> + "movl 16(%esp),%ecx\n\t"
> + "movl 20(%esp),%esi\n\t"
> + "cpuid\n\t"
> + "movl %eax,(%esi)\n\t"
> + "movl %ebx,4(%esi)\n\t"
> + "movl %ecx,8(%esi)\n\t"
> + "movl %edx,12(%esi)\n\t"
> + "popl %ebx\n\t"
> + "popl %esi\n\t"
> + "ret" )
> +
> +static int umip_enabled( void )
> +{
> + /* Check cpuid to see if UMIP is supported.
> + * UMIP bit is EAX=0x07,ECX=0x0, ECX bit 2
> + * (CPUID.07H.0H:ECX:UMIP[bit 2] in Intel syntax)
> + *
> + * It would be preferable to check if UMIP is actually enabled
> + * (CR4.UMIP), but that can't be done from userspace.
> + */
> + unsigned int regs[4];
> +
> + if (!have_cpuid()) return 0;
> +
> + do_cpuid_cx( 0x00000000, 0, regs ); /* get standard cpuid level and vendor name */
> + if (regs[0] >= 0x00000007) /* Check for supported cpuid version */
> + {
> + do_cpuid_cx( 0x00000007, 0, regs );
> + if (regs[2] & (1 << 2))
> + return 1;
> + }
> +
> + return 0;
> +}
> +#endif
There shouldn't be any reason to check this. If UMIP is not enabled you
won't get a fault in the first place.
Also I don't see why you use #ifdef linux, surely that code could work
on other platforms too.
--
Alexandre Julliard
julliard at winehq.org
More information about the wine-devel
mailing list