On Tue, 11 Jun 2002, admiral coeyman wrote:
> Ove Kaaven,
> >
> > On Mon, 10 Jun 2002, admiral coeyman wrote:
> >
> > > This patch adds the self-modifying code part of the FPU interrupts 34->3b and
> > > moves int 3d into the winedos section.
> >
> > Oh, I've been meaning to reply, but hadn't got around to it yet... it
> > makes no sense to use MapDosToLinear(MapRealToLinear()). It should be
> > obvious from its name that MapRealToLinear already converted to a linear
> > address, so that's all you need. And MapLinearToDos will probably *not* do
> > what you want, you should change the real-mode pointer directly instead,
> > as in general you just can't convert a linear address back to real mode.
> > Otherwise, the code is probably OK...
> >
> I was unsure of the memory handling functions. Both of these functions report
> that they return linear addresses, but I read one as a dos linear address and
> the other as a wine linear address. It was a mistake on my part. I read it as
> though I had to convert the seg:offset code to a dos linear address, then
> convert it to a wine linear address. It may have made more sense to me if I
> hadn't been worried about the addresses being in the wrong order.
Well, the meanings of these address types are, if I remember right:
Real = 16-bit real mode seg:ofs address
Dos = 32-bit offset from DOSMEM_dosmem (aka DOSMEM_MemoryBase()) (unless
it's above 1MB, then it's considered a linear pointer) (after the DOS
restructure, DOSMEM_dosmem is always 0, which is probably why it worked
for you)
Linear = 32-bit linear pointer that you can dereference in Wine code
I consider the "Dos" memory type pretty useless, there's almost never a
reason to use it instead of linear memory or something...
> What I read says that the stack's lowest address contains IP and the word
> above that is the code segment for the return. IP:CS I'm not sure that I
> could just point a segment:offset converting function at an address in that
> format and get the linear address.
Well, you can, as long as we stick to x86 (might be trickier if we were to
write a CPU emulator, but I guess there would be lots of places to change
then anyway).
> I've done the reverse conversion be backing IP up 2 bytes.
You have two versions of the Int3dHandler in your patch. One of them isn't
changed...
Anyway, if it helps, here's how I might have written your routine (without
the error checking), if I thought that perhaps these interrupts are also
used by win16 apps (otherwise the second CTX_SEG_OFF_TO_LIN(...) can be
replaced with PTR_REAL_TO_LIN(stack[1], stack[0]))
void FPU_ModifyCode(CONTEXT86 *context, BYTE Opcode)
{
WORD *stack = CTX_SEG_OFF_TO_LIN(context, context->SegSs, context->Esp)
BYTE *code = CTX_SEG_OFF_TO_LIN(context, stack[1], stack[0]);
code[-2] = 0x9b;
code[-1] = Opcode;
stack[0] -= 2;
}