Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1a6e2b0 authored by H. Peter Anvin's avatar H. Peter Anvin
Browse files

[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: default avatarH. Peter Anvin <hpa@zytor.com>
parent 362cea33
Loading
Loading
Loading
Loading
+1 −29
Original line number Diff line number Diff line
@@ -19,40 +19,12 @@

#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.
 */
static int read_mbr(u8 devno, void *buf)
{
	struct edd_dapa dapa;
	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 */
	u16 ax, bx, cx, dx;

	ax = 0x0201;		/* Legacy Read, one sector */
	cx = 0x0001;		/* Sector 0-0-1 */