From 5a14f03528bc48012639659acc61392131d243f4 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Mon, 16 Jul 2007 11:58:24 -0700 Subject: [PATCH] --- yaml --- r: 61392 b: refs/heads/master c: 8c027ae2dcfa7b9130941a2a743c735c1fee04ee h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/i386/boot/tty.c | 2 +- trunk/arch/i386/boot/video.h | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index f688ff6b2aba..dcd54556e374 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7ad37df02c529525c4ad19035359af89d2d2a5bd +refs/heads/master: 8c027ae2dcfa7b9130941a2a743c735c1fee04ee diff --git a/trunk/arch/i386/boot/tty.c b/trunk/arch/i386/boot/tty.c index a8db78736b02..9c668aad3515 100644 --- a/trunk/arch/i386/boot/tty.c +++ b/trunk/arch/i386/boot/tty.c @@ -31,7 +31,7 @@ void __attribute__((section(".inittext"))) putchar(int ch) /* int $0x10 is known to have bugs involving touching registers it shouldn't. Be extra conservative... */ - asm volatile("pushal; int $0x10; popal" + asm volatile("pushal; pushw %%ds; int $0x10; popw %%ds; popal" : : "b" (0x0007), "c" (0x0001), "a" (0x0e00|ch)); } diff --git a/trunk/arch/i386/boot/video.h b/trunk/arch/i386/boot/video.h index 29eca1710b2c..b92447d51213 100644 --- a/trunk/arch/i386/boot/video.h +++ b/trunk/arch/i386/boot/video.h @@ -117,8 +117,15 @@ extern int graphic_mode; /* Graphics mode with linear frame buffer */ * int $0x10 is notorious for touching registers it shouldn't. * gcc doesn't like %ebp being clobbered, so define it as a push/pop * sequence here. + * + * A number of systems, including the original PC can clobber %bp in + * certain circumstances, like when scrolling. There exists at least + * one Trident video card which could clobber DS under a set of + * circumstances that we are unlikely to encounter (scrolling when + * using an extended graphics mode of more than 800x600 pixels), but + * it's cheap insurance to deal with that here. */ -#define INT10 "pushl %%ebp; int $0x10; popl %%ebp" +#define INT10 "pushl %%ebp; pushw %%ds; int $0x10; popw %%ds; popl %%ebp" /* Accessing VGA indexed registers */ static inline u8 in_idx(u16 port, u8 index)