diff options
Diffstat (limited to 'arch/x86/boot/mca.c')
| -rw-r--r-- | arch/x86/boot/mca.c | 23 | 
1 files changed, 10 insertions, 13 deletions
diff --git a/arch/x86/boot/mca.c b/arch/x86/boot/mca.c index 911eaae5d69..a95a531148e 100644 --- a/arch/x86/boot/mca.c +++ b/arch/x86/boot/mca.c @@ -2,6 +2,7 @@   *   *   Copyright (C) 1991, 1992 Linus Torvalds   *   Copyright 2007 rPath, Inc. - All Rights Reserved + *   Copyright 2009 Intel Corporation; author H. Peter Anvin   *   *   This file is part of the Linux kernel, and is made available under   *   the terms of the GNU General Public License version 2. @@ -16,26 +17,22 @@  int query_mca(void)  { -	u8 err; -	u16 es, bx, len; +	struct biosregs ireg, oreg; +	u16 len; -	asm("pushw %%es ; " -	    "int $0x15 ; " -	    "setc %0 ; " -	    "movw %%es, %1 ; " -	    "popw %%es" -	    : "=acd" (err), "=acdSD" (es), "=b" (bx) -	    : "a" (0xc000)); +	initregs(&ireg); +	ireg.ah = 0xc0; +	intcall(0x15, &ireg, &oreg); -	if (err) +	if (oreg.eflags & X86_EFLAGS_CF)  		return -1;	/* No MCA present */ -	set_fs(es); -	len = rdfs16(bx); +	set_fs(oreg.es); +	len = rdfs16(oreg.bx);  	if (len > sizeof(boot_params.sys_desc_table))  		len = sizeof(boot_params.sys_desc_table); -	copy_from_fs(&boot_params.sys_desc_table, bx, len); +	copy_from_fs(&boot_params.sys_desc_table, oreg.bx, len);  	return 0;  }  |