absence of PXE+ structure

Discussions on more advanced topics such as monolithic vs micro-kernels, transactional memory models, and paging vs segmentation should go here. Use this forum to expand and improve the wiki!
Post Reply
eminus
Posts: 5
Joined: Thu Aug 01, 2019 1:50 am

absence of PXE+ structure

Post by eminus »

Hi,

I faced issue about PXE structure. I couldn't found !PXE in pxe pointer of PXENV+ structure. My structure for PXENV+:

Code: Select all

    // 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.
Octocontrabass
Member
Member
Posts: 5512
Joined: Mon Mar 25, 2013 7:01 pm

Re: absence of PXE+ structure

Post by Octocontrabass »

Did you tell your compiler that the PXENV+ structure doesn't follow C struct alignment rules?
eminus
Posts: 5
Joined: Thu Aug 01, 2019 1:50 am

Re: absence of PXE+ structure

Post by eminus »

Yes, I've configured like this:

Code: Select all

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;
};
eminus
Posts: 5
Joined: Thu Aug 01, 2019 1:50 am

Re: absence of PXE+ structure

Post by eminus »

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

Thanks.
Post Reply