On Sun, Feb 14, 2016 at 12:41:31PM +0000, Michael Brown wrote:
On 14/02/16 10:52, Victor Kaplansky wrote:
I've created a boot-sector which works just fine when loaded directly from BIOS, but doesn't work when loaded by ipxe:
0: b8 ad de mov ax,0xdead 3: a3 10 7c mov ds:0x7c10,ax
0xdead is not written to 0000:7c10. The reason is that BIOS have data segment register initialized to zero, while ipxe leaves it dirty before the jump to boot sector code.
After adding to boot sector some code to initialize DS register, my code works well:
0: b8 00 00 mov ax,0x0 3: 8e d8 mov ds,ax 5: b8 ad de mov ax,0xdead 8: a3 10 7c mov ds:0x7c10,ax
Is such behaviour intentional, or it is a bug? Who is responsible for segment registers initialization?
I'm not aware of any standard describing the content of %ds when jumping to a boot sector at 0000:7c00. Every boot sector that I have encountered explicitly initialises %ds (and %es, and %ss:%sp) to known values.
Sounds reasonable wrt %ds, but I think %ss:%sp at least is initialized by PXE, isn't it?
PXE spec says (4.4.5 Client State at Bootstrap Execution Time (Remote.0)):
On entry to the NBP: ! CS:IP must contain the value 0:7C00h. ! ES:BX must contain the address of the PXENV+ structure. ! SS:[SP+4] must contain the segment:offset address of the !PXE structure. ! EDX is no longer used. ! SS:SP is to contain the address of the beginning of the unused portion of the PXE services stack. ! There must be at least 1.5KB of free stack space for the NBP.
Your boot sector should probably do likewise.
Michael