diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2009-04-01 18:19:00 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-04-09 16:08:11 -0700 |
commit | 0a706db320768f8f6e43bbf73b58d2aabdc93354 (patch) | |
tree | 9e103e27c215a22fc8e10ffa2ef8deff1a5364e8 /arch/x86/boot | |
parent | 3435d3476c5ed955d56a6216ed2d156847b3a575 (diff) |
x86, setup: "glove box" BIOS interrupts in the MCA code
Impact: BIOS proofing
"Glove box" off BIOS interrupts in the MCA code.
LKML-Reference: <49DE7F79.4030106@zytor.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'arch/x86/boot')
-rw-r--r-- | arch/x86/boot/mca.c | 27 |
1 files changed, 12 insertions, 15 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; - - asm("pushw %%es ; " - "int $0x15 ; " - "setc %0 ; " - "movw %%es, %1 ; " - "popw %%es" - : "=acd" (err), "=acdSD" (es), "=b" (bx) - : "a" (0xc000)); - - if (err) + struct biosregs ireg, oreg; + u16 len; + + initregs(&ireg); + ireg.ah = 0xc0; + intcall(0x15, &ireg, &oreg); + + 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; } |