diff options
Diffstat (limited to 'com32/lib/syslinux/disk.c')
| -rw-r--r-- | com32/lib/syslinux/disk.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/com32/lib/syslinux/disk.c b/com32/lib/syslinux/disk.c index 2a286e4f..7be59f2b 100644 --- a/com32/lib/syslinux/disk.c +++ b/com32/lib/syslinux/disk.c @@ -34,3 +34,26 @@ */ #include <syslinux/disk.h> + +/** + * Call int 13h, but with retry on failure. Especially floppies need this. + * + * @v inreg CPU register settings upon INT call + * @v outreg CPU register settings returned by INT call + */ +int disk_int13_retry(const com32sys_t * inreg, com32sys_t * outreg) +{ + int retry = 6; /* Number of retries */ + com32sys_t tmpregs; + + if (!outreg) + outreg = &tmpregs; + + while (retry--) { + __intcall(0x13, inreg, outreg); + if (!(outreg->eflags.l & EFLAGS_CF)) + return 0; /* CF=0, OK */ + } + + return -1; /* Error */ +} |
