forked from Minki/linux
[x86 setup] Don't use EDD to get the MBR signature
At least one machine has been identified in the field which advertises EDD for all drives but locks up if one attempts an extended read from a non-primary drive. The MBR is always at CHS 0-0-1, so there is no reason to use an extended read, other than the possibility that the BIOS cannot handle it. Although this might break as many machines as it fixes (a small number either way), the current state is a regression but the reverse is not. Therefore revert to the previous state of not using extended read. Quite probably the Right Thing to do is to read using plain (CHS) read and extended read on failure, but that change would definitely have to go through -mm first. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
362cea339a
commit
c1a6e2b082
@ -19,40 +19,12 @@
|
|||||||
|
|
||||||
#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
|
#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
|
||||||
|
|
||||||
struct edd_dapa {
|
|
||||||
u8 pkt_size;
|
|
||||||
u8 rsvd;
|
|
||||||
u16 sector_cnt;
|
|
||||||
u16 buf_off, buf_seg;
|
|
||||||
u64 lba;
|
|
||||||
u64 buf_lin_addr;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read the MBR (first sector) from a specific device.
|
* Read the MBR (first sector) from a specific device.
|
||||||
*/
|
*/
|
||||||
static int read_mbr(u8 devno, void *buf)
|
static int read_mbr(u8 devno, void *buf)
|
||||||
{
|
{
|
||||||
struct edd_dapa dapa;
|
u16 ax, bx, cx, dx;
|
||||||
u16 ax, bx, cx, dx, si;
|
|
||||||
|
|
||||||
memset(&dapa, 0, sizeof dapa);
|
|
||||||
dapa.pkt_size = sizeof(dapa);
|
|
||||||
dapa.sector_cnt = 1;
|
|
||||||
dapa.buf_off = (size_t)buf;
|
|
||||||
dapa.buf_seg = ds();
|
|
||||||
/* dapa.lba = 0; */
|
|
||||||
|
|
||||||
ax = 0x4200; /* Extended Read */
|
|
||||||
si = (size_t)&dapa;
|
|
||||||
dx = devno;
|
|
||||||
asm("pushfl; stc; int $0x13; setc %%al; popfl"
|
|
||||||
: "+a" (ax), "+S" (si), "+d" (dx)
|
|
||||||
: "m" (dapa)
|
|
||||||
: "ebx", "ecx", "edi", "memory");
|
|
||||||
|
|
||||||
if (!(u8)ax)
|
|
||||||
return 0; /* OK */
|
|
||||||
|
|
||||||
ax = 0x0201; /* Legacy Read, one sector */
|
ax = 0x0201; /* Legacy Read, one sector */
|
||||||
cx = 0x0001; /* Sector 0-0-1 */
|
cx = 0x0001; /* Sector 0-0-1 */
|
||||||
|
Loading…
Reference in New Issue
Block a user