[SeaBIOS] [PATCH] support T13 EDD3.0 spec
Kevin O'Connor
kevin at koconnor.net
Thu Jan 6 03:32:33 CET 2011
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.
> 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);
[...]
> + if (13) {
That looks like a typo.
-Kevin
More information about the SeaBIOS
mailing list