[SeaBIOS] [PATCH] support T13 EDD3.0 spec

Gleb Natapov gleb at redhat.com
Thu Jan 6 06:09:27 CET 2011


On Wed, Jan 05, 2011 at 09:32:33PM -0500, Kevin O'Connor wrote:
> On Wed, Jan 05, 2011 at 05:18:38PM +0200, Gleb Natapov wrote:
> > Some guests (such as Linux) expect BIOS to behave according to T13
> > EDD3.0 spec. T13 spec is much better then Phoenix since it provides
> > more information about interface and device paths. This patch adds
> > support for the spec. If guest provides buffer with enough space for
> > T13 EDD info return EDD according to T13 spec otherwise use Phoenix
> > one.
> 
> I think Sebastian has looked at this as well.
> 
Yes, I saw the thread. You suggested there to handle both specs
simultaneously and this is what I did here.

> > Signed-off-by: Gleb Natapov <gleb at redhat.com>
> > diff --git a/src/disk.c b/src/disk.c
> > index f7bfe9c..fb7833a 100644
> > --- a/src/disk.c
> > +++ b/src/disk.c
> > @@ -503,6 +503,7 @@ static void
> >  disk_1348(struct bregs *regs, struct drive_s *drive_g)
> >  {
> >      u16 size = GET_INT13DPT(regs, size);
> > +    u16 t13 = size == 74;
> >  
> >      // Buffer is too small
> >      if (size < 26) {
> > @@ -553,8 +554,9 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
> >      // EDD 2.x
> >  
> >      int bdf;
> > -    u16 iobase1;
> > -    u64 device_path;
> > +    u16 iobase1 = 0;
> > +    u64 device_path = 0;
> > +    u8 channel = 0;
> >      SET_INT13DPT(regs, size, 30);
> >      if (type == DTYPE_ATA || type == DTYPE_ATAPI) {
> >          u16 ebda_seg = get_ebda_seg();
> > @@ -573,6 +575,7 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
> >          iobase1 = GET_GLOBALFLAT(chan_gf->iobase1);
> >          bdf = GET_GLOBALFLAT(chan_gf->pci_bdf);
> >          device_path = slave;
> > +        channel = GET_GLOBALFLAT(chan_gf->chanid);
> >  
> >          u16 options = 0;
> >          if (type == DTYPE_ATA) {
> > @@ -613,8 +616,6 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
> >          SET_INT13DPT(regs, dpte_segment, 0);
> >          SET_INT13DPT(regs, dpte_offset, 0);
> >          bdf = GET_GLOBAL(drive_g->cntl_id);
> > -        device_path = 0;
> > -        iobase1 = 0;
> >      }
> >  
> >      if (size < 66) {
> > @@ -632,17 +633,20 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
> >          SET_INT13DPT(regs, host_bus[0], 'P');
> >          SET_INT13DPT(regs, host_bus[1], 'C');
> >          SET_INT13DPT(regs, host_bus[2], 'I');
> > -        SET_INT13DPT(regs, host_bus[3], 0);
> > +        SET_INT13DPT(regs, host_bus[3], ' ');
> 
> What if we're not in t13 mode?  Should this be:
>   u8 fillchar = t13 ? ' ' : 0;
>   SET_INT13DPT(regs, host_bus[3], fillchar);
> 
Phoenix does not specify padding. Are you sure phoenix has to have zero
padding?

> [...]
> > +    if (13) {
> 
> That looks like a typo.
> 
Oops. Will resend.

--
			Gleb.



More information about the SeaBIOS mailing list