OSDev.org
https://forum.osdev.org/

absence of PXE+ structure
https://forum.osdev.org/viewtopic.php?f=15&t=33804
Page 1 of 1

Author:  eminus [ Thu Aug 01, 2019 2:08 am ]
Post subject:  absence of PXE+ structure

Hi,

I faced issue about PXE structure. I couldn't found !PXE in pxe pointer of PXENV+ structure. My structure for PXENV+:
Code:
    // The Signature of the PXENV+ structure - contains "PXENV+".
    uint8_t  Signature[6];

    // The MSB contains the Major version number, while the LSB contains the minor version number.
    uint16_t Version;

    // The Length and the checksum of the structure, used for calculating the checksum.
    uint8_t  Length;
    uint8_t  Checksum;

    // A Far Pointer to the real mode PXE API entry point.
    uint32_t RMEntry;

    // 32-bit offset to the protected mode API entry point. Instead of this, the !PXE structure is recommended.
    uint32_t PMOffset;

    // The rest of the fields don't matter much, and the Specifications can be referred.
    uint16_t PMSelector;
    uint16_t StackSeg;
    uint16_t StackSize;
    uint16_t BCCodeSeg;
    uint16_t BCCodeSize;
    uint16_t BCDataSeg;
    uint16_t BCDataSize;

    uint16_t UNDIDataSeg;
    uint16_t UNDIDataSize;
    uint16_t UNDICodeSeg;
    uint16_t UNDICodeSize;

    // This is a far pointer to the "!PXE" structure, only present when the structure is present.
    uint32_t PXEPtr;

When I was in the Protected mode, I switched to real mode for PXE interrupt. After that es and ebx registers got the address of PXENV+ structure.
Then I want to use PXEPtr that has incorrect address. But there is correct Signature, Length, Checksum in PXENV+ structure but PXEPtr has incorrect address or in VMWare workstation PXEPtr has address of PXENV+ structure.

Author:  Octocontrabass [ Thu Aug 01, 2019 2:50 am ]
Post subject:  Re: absence of PXE+ structure

Did you tell your compiler that the PXENV+ structure doesn't follow C struct alignment rules?

Author:  eminus [ Thu Aug 01, 2019 4:15 am ]
Post subject:  Re: absence of PXE+ structure

Yes, I've configured like this:

Code:
struct __attribute__((__packed__)) PXE_ENV{
    // The Signature of the PXENV+ structure - contains "PXENV+".
    uint8_t  Signature[6];

    // The MSB contains the Major version number, while the LSB contains the minor version number.
    uint16_t Version;

    // The Length and the checksum of the structure, used for calculating the checksum.
    uint8_t  Length;
    uint8_t  Checksum;

    // A Far Pointer to the real mode PXE API entry point.
    uint32_t RMEntry;

    // 32-bit offset to the protected mode API entry point. Instead of this, the !PXE structure is recommended.
    uint32_t PMOffset;

    // The rest of the fields don't matter much, and the Specifications can be referred.
    uint16_t PMSelector;
    uint16_t StackSeg;
    uint16_t StackSize;
    uint16_t BCCodeSeg;
    uint16_t BCCodeSize;
    uint16_t BCDataSeg;
    uint16_t BCDataSize;

    uint16_t UNDIDataSeg;
    uint16_t UNDIDataSize;
    uint16_t UNDICodeSeg;
    uint16_t UNDICodeSize;

    // This is a far pointer to the "!PXE" structure, only present when the structure is present.
    uint32_t PXEPtr;
};

Author:  eminus [ Thu Aug 01, 2019 4:44 am ]
Post subject:  Re: absence of PXE+ structure

I found a problem. I have to translate segment:offset to physical address in this field (PXEPtr). That's worked well!

Thanks.

Page 1 of 1 All times are UTC - 6 hours
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/