[SeaBIOS] ipxe/seabios: segment register initialization
Michael S. Tsirkin
mst at redhat.com
Sun Feb 14 16:26:32 CET 2016
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
> >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.
More information about the SeaBIOS