diff options
Diffstat (limited to 'arch/x86/boot/video.c')
| -rw-r--r-- | arch/x86/boot/video.c | 42 | 
1 files changed, 19 insertions, 23 deletions
diff --git a/arch/x86/boot/video.c b/arch/x86/boot/video.c index 3bef2c1febe..bad728b76fc 100644 --- a/arch/x86/boot/video.c +++ b/arch/x86/boot/video.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. @@ -18,33 +19,29 @@  static void store_cursor_position(void)  { -	u16 curpos; -	u16 ax, bx; +	struct biosregs ireg, oreg; -	ax = 0x0300; -	bx = 0; -	asm(INT10 -	    : "=d" (curpos), "+a" (ax), "+b" (bx) -	    : : "ecx", "esi", "edi"); +	initregs(&ireg); +	ireg.ah = 0x03; +	intcall(0x10, &ireg, &oreg); -	boot_params.screen_info.orig_x = curpos; -	boot_params.screen_info.orig_y = curpos >> 8; +	boot_params.screen_info.orig_x = oreg.dl; +	boot_params.screen_info.orig_y = oreg.dh;  }  static void store_video_mode(void)  { -	u16 ax, page; +	struct biosregs ireg, oreg;  	/* N.B.: the saving of the video page here is a bit silly,  	   since we pretty much assume page 0 everywhere. */ -	ax = 0x0f00; -	asm(INT10 -	    : "+a" (ax), "=b" (page) -	    : : "ecx", "edx", "esi", "edi"); +	initregs(&ireg); +	ireg.ah = 0x0f; +	intcall(0x10, &ireg, &oreg);  	/* Not all BIOSes are clean with respect to the top bit */ -	boot_params.screen_info.orig_video_mode = ax & 0x7f; -	boot_params.screen_info.orig_video_page = page >> 8; +	boot_params.screen_info.orig_video_mode = oreg.al & 0x7f; +	boot_params.screen_info.orig_video_page = oreg.bh;  }  /* @@ -257,7 +254,7 @@ static void restore_screen(void)  	int y;  	addr_t dst = 0;  	u16 *src = saved.data; -	u16 ax, bx, dx; +	struct biosregs ireg;  	if (graphic_mode)  		return;		/* Can't restore onto a graphic mode */ @@ -296,12 +293,11 @@ static void restore_screen(void)  	}  	/* Restore cursor position */ -	ax = 0x0200;		/* Set cursor position */ -	bx = 0;			/* Page number (<< 8) */ -	dx = (saved.cury << 8)+saved.curx; -	asm volatile(INT10 -		     : "+a" (ax), "+b" (bx), "+d" (dx) -		     : : "ecx", "esi", "edi"); +	initregs(&ireg); +	ireg.ah = 0x02;		/* Set cursor position */ +	ireg.dh = saved.cury; +	ireg.dl = saved.curx; +	intcall(0x10, &ireg, NULL);  }  #else  #define save_screen()		((void)0)  |