46 lines
1.1 KiB
C
46 lines
1.1 KiB
C
/* ----------------------------------------------------------------------- *
|
|
*
|
|
* Copyright 2009 Pierre-Alexandre Meyer
|
|
*
|
|
* Some parts borrowed from chain.c32:
|
|
*
|
|
* Copyright 2003-2009 H. Peter Anvin - All Rights Reserved
|
|
* Copyright 2009 Intel Corporation; author: H. Peter Anvin
|
|
*
|
|
* This file is part of Syslinux, and is made available under
|
|
* the terms of the GNU General Public License version 2.
|
|
*
|
|
* ----------------------------------------------------------------------- */
|
|
|
|
#include <com32.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <disk/geom.h>
|
|
|
|
#define MAX_NB_RETRIES 6
|
|
|
|
/**
|
|
* int13_retry - int13h with error handling
|
|
* @inreg: int13h function parameters
|
|
* @outreg: output registers
|
|
*
|
|
* Call int 13h, but with retry on failure. Especially floppies need this.
|
|
**/
|
|
int int13_retry(const com32sys_t * inreg, com32sys_t * outreg)
|
|
{
|
|
int retry = MAX_NB_RETRIES; /* 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 */
|
|
}
|
|
|
|
/* If we get here: error */
|
|
return -1;
|
|
}
|