Preparing the CPB
The CPB for the S/W UNDI Start command (shown below) must be filled in and the size and
address of the CPB must be given in the CDB.
#pragma pack(1)
typedef struct s_pxe_cpb_start {
// PXE_VOID Delay(PXE_UINT64 microseconds);
// UNDI will never request a delay smaller than 10 microseconds
// and will always request delays in increments of 10
// microseconds.
// n and n + 10 microseconds before returning control to the
// UNDI.
// This field cannot be set to zero.
PXE_UINT64 Delay;
// PXE_VOID Block(PXE_UINT32 enable);
// UNDI may need to block multi-threaded/multi-processor access
// to critical code sections when programming or accessing the
// network device.
// the UNDI.
// passing a non-zero value.
// it will call Block() with a zero value.
// Block() is already enabled, do not return control to the UNDI
// until the previous Block() is disabled.
// This field cannot be set to zero.
PXE_UINT64 Block;
// PXE_VOID Virt2Phys(PXE_UINT64 virtual, PXE_UINT64
// physical_ptr);
// UNDI will pass the virtual address of a buffer and the virtual
// address of a 64-bit physical buffer.
// address to a physical address and write the result to the
// physical address buffer.
// are the same, just copy the virtual address to the physical
// address buffer.
Version 1.02
The Delay() CallBack routine must delay between
To this end, a blocking service is needed by
When UNDI needs a block, it will call Block()
When UNDI no longer needs a block,
If virtual and physical addresses
32/64-bit UNDI Specification
When called, if the
Convert the virtual
12/12/00
421
Need help?
Do you have a question about the Extensible Firmware Interface and is the answer not in the manual?