Andy Alex
2014-Feb-20 09:23 UTC
[syslinux] [PATCH] core: Incorrect detection of EDD in /core/fs/diskio_bios.c
DL register is not set to drive number when detecting EDD for drive, so detection may fail. Signed-off-by: Andy Alex<andy at r-tt.com> --- diff -uprN syslinux-6.02.orig/core/fs/diskio_bios.c syslinux-6.02/core/fs/diskio_bios.c --- syslinux-6.02.orig/core/fs/diskio_bios.c 2013-10-13 21:59:03.000000000 +0400 +++ syslinux-6.02/core/fs/diskio_bios.c 2014-02-20 12:15:08.000000000 +0400 @@ -337,7 +337,7 @@ struct disk *bios_disk_init(void *privat /* Get EBIOS support */ ireg.eax.b[1] = 0x41; ireg.ebx.w[0] = 0x55aa; - ireg.eflags.b[0] = 0x3; /* CF set */ + ireg.edx.b[0] = devno; __intcall(0x13,&ireg,&oreg); @@ -353,6 +353,7 @@ struct disk *bios_disk_init(void *privat edd_params.len = sizeof edd_params; ireg.eax.b[1] = 0x48; + ireg.edx.b[0] = devno; ireg.ds = SEG(&edd_params); ireg.esi.w[0] = OFFS(&edd_params); __intcall(0x13,&ireg,&oreg);
Geert Stappers
2014-Feb-22 12:59 UTC
[syslinux] [PATCH] core: Incorrect detection of EDD in /core/fs/diskio_bios.c
Op 2014-02-20 om 13:23 schreef Andy Alex:> DL register is not set to drive number when detecting EDD for drive, so detection may fail. > > Signed-off-by: Andy Alex<andy at r-tt.com> > --- > diff -uprN syslinux-6.02.orig/core/fs/diskio_bios.c syslinux-6.02/core/fs/diskio_bios.c > --- syslinux-6.02.orig/core/fs/diskio_bios.c 2013-10-13 21:59:03.000000000 +0400 > +++ syslinux-6.02/core/fs/diskio_bios.c 2014-02-20 12:15:08.000000000 +0400 > @@ -337,7 +337,7 @@ struct disk *bios_disk_init(void *privat > /* Get EBIOS support */ > ireg.eax.b[1] = 0x41; > ireg.ebx.w[0] = 0x55aa; > - ireg.eflags.b[0] = 0x3; /* CF set */I don't understand where the removal of that line matches with 'DL register is not set' from the description of this patch.> + ireg.edx.b[0] = devno; > > __intcall(0x13,&ireg,&oreg); > > @@ -353,6 +353,7 @@ struct disk *bios_disk_init(void *privat > edd_params.len = sizeof edd_params; > > ireg.eax.b[1] = 0x48; > + ireg.edx.b[0] = devno; > ireg.ds = SEG(&edd_params); > ireg.esi.w[0] = OFFS(&edd_params); > __intcall(0x13,&ireg,&oreg); >Groeten Geert Stappers -- Leven en laten leven
Andy Alex
2014-Feb-23 19:16 UTC
[syslinux] [PATCH] core: Incorrect detection of EDD in /core/fs/diskio_bios.c
I agree. This line was removed during testing because it didn't make big sense (EFLAGS_CF, ebx, and ecx are checked after int 0x13). But it's better to leave it in code to make sure that BIOS conforms standards and clears CF flag on successful call. Adjusted patch is given below. Andy Alex Signed-off-by: Andy Alex <andy at r-tt.com> --- diff -uprN syslinux-6.02.orig/core/fs/diskio_bios.c syslinux-6.02/core/fs/diskio_bios.c --- syslinux-6.02.orig/core/fs/diskio_bios.c 2013-10-13 13:59:03.000000000 -0400 +++ syslinux-6.02/core/fs/diskio_bios.c 2014-02-23 14:04:17.876084866 -0500 @@ -337,6 +337,7 @@ struct disk *bios_disk_init(void *privat /* Get EBIOS support */ ireg.eax.b[1] = 0x41; ireg.ebx.w[0] = 0x55aa; + ireg.edx.b[0] = devno; ireg.eflags.b[0] = 0x3; /* CF set */ __intcall(0x13, &ireg, &oreg); @@ -353,6 +354,7 @@ struct disk *bios_disk_init(void *privat edd_params.len = sizeof edd_params; ireg.eax.b[1] = 0x48; + ireg.edx.b[0] = devno; ireg.ds = SEG(&edd_params); ireg.esi.w[0] = OFFS(&edd_params); __intcall(0x13, &ireg, &oreg); --- On 22.02.2014 16:59, Geert Stappers wrote:> Op 2014-02-20 om 13:23 schreef Andy Alex: >> DL register is not set to drive number when detecting EDD for drive, so detection may fail. >> >> Signed-off-by: Andy Alex<andy at r-tt.com> >> --- >> diff -uprN syslinux-6.02.orig/core/fs/diskio_bios.c syslinux-6.02/core/fs/diskio_bios.c >> --- syslinux-6.02.orig/core/fs/diskio_bios.c 2013-10-13 21:59:03.000000000 +0400 >> +++ syslinux-6.02/core/fs/diskio_bios.c 2014-02-20 12:15:08.000000000 +0400 >> @@ -337,7 +337,7 @@ struct disk *bios_disk_init(void *privat >> /* Get EBIOS support */ >> ireg.eax.b[1] = 0x41; >> ireg.ebx.w[0] = 0x55aa; >> - ireg.eflags.b[0] = 0x3; /* CF set */ > I don't understand where the removal of that line matches > with 'DL register is not set' from the description of this patch. > > >> + ireg.edx.b[0] = devno; >> >> __intcall(0x13,&ireg,&oreg); >> >> @@ -353,6 +353,7 @@ struct disk *bios_disk_init(void *privat >> edd_params.len = sizeof edd_params; >> >> ireg.eax.b[1] = 0x48; >> + ireg.edx.b[0] = devno; >> ireg.ds = SEG(&edd_params); >> ireg.esi.w[0] = OFFS(&edd_params); >> __intcall(0x13,&ireg,&oreg); >> > > > Groeten > Geert Stappers