|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v8 08/12] x86emul: support FLDENV and FRSTOR
On 08.05.2020 18:21, Roger Pau Monné wrote:
> On Fri, May 08, 2020 at 05:04:02PM +0200, Jan Beulich wrote:
>> On 08.05.2020 15:37, Roger Pau Monné wrote:
>>> On Tue, May 05, 2020 at 10:16:20AM +0200, Jan Beulich wrote:
>>>> --- a/tools/tests/x86_emulator/test_x86_emulator.c
>>>> +++ b/tools/tests/x86_emulator/test_x86_emulator.c
>>>> @@ -11648,6 +11651,89 @@ int x86_emul_blk(
>>>>
>>>> #ifndef X86EMUL_NO_FPU
>>>>
>>>> + case blk_fld:
>>>> + ASSERT(!data);
>>>> +
>>>> + /* state->rex_prefix carries CR0.PE && !EFLAGS.VM setting */
>>>> + switch ( bytes )
>>>> + {
>>>> + case sizeof(fpstate.env):
>>>> + case sizeof(fpstate):
>>>> + memcpy(&fpstate.env, ptr, sizeof(fpstate.env));
>>>> + if ( !state->rex_prefix )
>>>> + {
>>>> + unsigned int fip = fpstate.env.mode.real.fip_lo +
>>>> + (fpstate.env.mode.real.fip_hi << 16);
>>>> + unsigned int fdp = fpstate.env.mode.real.fdp_lo +
>>>> + (fpstate.env.mode.real.fdp_hi << 16);
>>>> + unsigned int fop = fpstate.env.mode.real.fop;
>>>> +
>>>> + fpstate.env.mode.prot.fip = fip & 0xf;
>>>> + fpstate.env.mode.prot.fcs = fip >> 4;
>>>> + fpstate.env.mode.prot.fop = fop;
>>>> + fpstate.env.mode.prot.fdp = fdp & 0xf;
>>>> + fpstate.env.mode.prot.fds = fdp >> 4;
>>>
>>> I've found the layouts in the SDM vol. 1, but I haven't been able to
>>> found the translation mechanism from real to protected. Could you
>>> maybe add a reference here?
>>
>> A reference to some piece of documentation? I don't think this
>> is spelled out anywhere. It's also only one of various possible
>> ways of doing the translation, but among them the most flexible
>> one for possible consumers of the data (because of using the
>> smallest possible offsets into the segments).
>
> Having this written down as a comment would help, but maybe that's
> just because I'm not familiar at all with all this stuff.
>
> Again, likely a very stupid question, but I would expect:
>
> fpstate.env.mode.prot.fip = fip;
>
> Without the mask.
How that? A linear address has many ways of decomposing into a
real/vm86 mode ssss:oooo pair, but what you suggest is not one
of them. The other extreme to the one chosen would be
fpstate.env.mode.prot.fip = fip & 0xffff;
fpstate.env.mode.prot.fcs = (fip >> 4) & 0xf000;
Except that when doing it this way, even the full insn (or for
fcs:fdp the full operand) may not be accessible through the
resulting ssss, due to segment wraparound.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |