-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86, setup: "glove box" BIOS calls -- infrastructure
Impact: new interfaces (not yet used) For all the platforms out there, there is an infinite number of buggy BIOSes. This adds infrastructure to treat BIOS interrupts more like toxic waste and "glove box" them -- we switch out the register set, perform the BIOS interrupt, and then restore the previous state. LKML-Reference: <49DE7F79.4030106@zytor.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Cc: Pavel Machek <pavel@ucw.cz> Cc: Rafael J. Wysocki <rjw@sisk.pl>
- Loading branch information
H. Peter Anvin
authored and
H. Peter Anvin
committed
Apr 9, 2009
1 parent
62b8e68
commit 7a734e7
Showing
9 changed files
with
172 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
/* ----------------------------------------------------------------------- | ||
* | ||
* 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 or (at your | ||
* option) any later version; incorporated herein by reference. | ||
* | ||
* ----------------------------------------------------------------------- */ | ||
|
||
/* | ||
* "Glove box" for BIOS calls. Avoids the constant problems with BIOSes | ||
* touching memory they shouldn't be. | ||
*/ | ||
|
||
.code16 | ||
.text | ||
.globl intcall | ||
.type intcall, @function | ||
intcall: | ||
/* Self-modify the INT instruction. Ugly, but works. */ | ||
cmpb %al, 3f | ||
je 1f | ||
movb %al, 3f | ||
jmp 1f /* Synchronize pipeline */ | ||
1: | ||
/* Save state */ | ||
pushfl | ||
pushw %fs | ||
pushw %gs | ||
pushal | ||
|
||
/* Copy input state to stack frame */ | ||
subw $44, %sp | ||
movw %dx, %si | ||
movw %sp, %di | ||
movw $11, %cx | ||
rep; movsd | ||
|
||
/* Pop full state from the stack */ | ||
popal | ||
popw %gs | ||
popw %fs | ||
popw %es | ||
popw %ds | ||
popfl | ||
|
||
/* Actual INT */ | ||
.byte 0xcd /* INT opcode */ | ||
3: .byte 0 | ||
|
||
/* Push full state to the stack */ | ||
pushfl | ||
pushw %ds | ||
pushw %es | ||
pushw %fs | ||
pushw %gs | ||
pushal | ||
|
||
/* Re-establish C environment invariants */ | ||
cld | ||
movzwl %sp, %esp | ||
movw %cs, %ax | ||
movw %ax, %ds | ||
movw %ax, %es | ||
|
||
/* Copy output state from stack frame */ | ||
movw 68(%esp), %di /* Original %cx == 3rd argument */ | ||
andw %di, %di | ||
jz 4f | ||
movw %sp, %si | ||
movw $11, %cx | ||
rep; movsd | ||
4: addw $44, %sp | ||
|
||
/* Restore state and return */ | ||
popal | ||
popw %gs | ||
popw %fs | ||
popfl | ||
retl | ||
.size intcall, .-intcall |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/* ----------------------------------------------------------------------- | ||
* | ||
* 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 or (at your | ||
* option) any later version; incorporated herein by reference. | ||
* | ||
* ----------------------------------------------------------------------- */ | ||
|
||
/* | ||
* Simple helper function for initializing a register set. | ||
* | ||
* Note that this sets EFLAGS_CF in the input register set; this | ||
* makes it easier to catch functions which do nothing but don't | ||
* explicitly set CF. | ||
*/ | ||
|
||
#include "boot.h" | ||
|
||
void initregs(struct biosregs *reg) | ||
{ | ||
memset(reg, 0, sizeof *reg); | ||
reg->eflags |= X86_EFLAGS_CF; | ||
reg->ds = ds(); | ||
reg->es = ds(); | ||
reg->fs = fs(); | ||
reg->gs = gs(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
#include "../../../boot/bioscall.S" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
#include "../../../boot/regs.c" |