aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386/boot
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/boot')
-rw-r--r--arch/i386/boot/Makefile2
-rw-r--r--arch/i386/boot/boot.h2
-rw-r--r--arch/i386/boot/cpucheck.c4
-rw-r--r--arch/i386/boot/mca.c2
-rw-r--r--arch/i386/boot/pm.c2
-rw-r--r--arch/i386/boot/tools/build.c2
-rw-r--r--arch/i386/boot/tty.c2
-rw-r--r--arch/i386/boot/video.c9
-rw-r--r--arch/i386/boot/video.h9
-rw-r--r--arch/i386/boot/voyager.c2
10 files changed, 24 insertions, 12 deletions
diff --git a/arch/i386/boot/Makefile b/arch/i386/boot/Makefile
index 08678a0..93386a4 100644
--- a/arch/i386/boot/Makefile
+++ b/arch/i386/boot/Makefile
@@ -39,7 +39,7 @@ setup-y += printf.o string.o tty.o video.o version.o voyager.o
setup-y += video-vga.o
setup-y += video-vesa.o
setup-y += video-bios.o
-
+targets += $(setup-y)
hostprogs-y := tools/build
HOSTCFLAGS_build.o := $(LINUXINCLUDE)
diff --git a/arch/i386/boot/boot.h b/arch/i386/boot/boot.h
index 0329c4f..dec70c9 100644
--- a/arch/i386/boot/boot.h
+++ b/arch/i386/boot/boot.h
@@ -56,7 +56,7 @@ static inline u16 inw(u16 port)
static inline void outl(u32 v, u16 port)
{
- asm volatile("outl %0,%1" : : "a" (v), "dn" (port));
+ asm volatile("outl %0,%1" : : "a" (v), "dN" (port));
}
static inline u32 inl(u32 port)
{
diff --git a/arch/i386/boot/cpucheck.c b/arch/i386/boot/cpucheck.c
index 8b0f447..991e8ce 100644
--- a/arch/i386/boot/cpucheck.c
+++ b/arch/i386/boot/cpucheck.c
@@ -115,8 +115,8 @@ static int has_eflag(u32 mask)
"pushfl ; "
"popl %1 ; "
"popfl"
- : "=r" (f0), "=r" (f1)
- : "g" (mask));
+ : "=&r" (f0), "=&r" (f1)
+ : "ri" (mask));
return !!((f0^f1) & mask);
}
diff --git a/arch/i386/boot/mca.c b/arch/i386/boot/mca.c
index 9b68bd1..68222f2 100644
--- a/arch/i386/boot/mca.c
+++ b/arch/i386/boot/mca.c
@@ -26,7 +26,7 @@ int query_mca(void)
"setc %0 ; "
"movw %%es, %1 ; "
"popw %%es"
- : "=acdSDm" (err), "=acdSDm" (es), "=b" (bx)
+ : "=acd" (err), "=acdSD" (es), "=b" (bx)
: "a" (0xc000));
if (err)
diff --git a/arch/i386/boot/pm.c b/arch/i386/boot/pm.c
index 3fa53e1..1df025c 100644
--- a/arch/i386/boot/pm.c
+++ b/arch/i386/boot/pm.c
@@ -65,7 +65,7 @@ static void move_kernel_around(void)
"popw %%ds ; "
"popw %%es"
: "+c" (dwords)
- : "rm" (dst_seg), "rm" (src_seg)
+ : "r" (dst_seg), "r" (src_seg)
: "esi", "edi");
syssize -= paras;
diff --git a/arch/i386/boot/tools/build.c b/arch/i386/boot/tools/build.c
index 886f47d..b424874 100644
--- a/arch/i386/boot/tools/build.c
+++ b/arch/i386/boot/tools/build.c
@@ -5,7 +5,7 @@
*/
/*
- * This file builds a disk-image from three different files:
+ * This file builds a disk-image from two different files:
*
* - setup: 8086 machine code, sets up system parm
* - system: 80386 code for actual system
diff --git a/arch/i386/boot/tty.c b/arch/i386/boot/tty.c
index a8db787..9c668aa 100644
--- a/arch/i386/boot/tty.c
+++ b/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/arch/i386/boot/video.c b/arch/i386/boot/video.c
index 3bb3573..958130e 100644
--- a/arch/i386/boot/video.c
+++ b/arch/i386/boot/video.c
@@ -195,7 +195,7 @@ static void vga_recalc_vertical(void)
{
unsigned int font_size, rows;
u16 crtc;
- u8 ov;
+ u8 pt, ov;
set_fs(0);
font_size = rdfs8(0x485); /* BIOS: font size (pixels) */
@@ -206,7 +206,12 @@ static void vga_recalc_vertical(void)
crtc = vga_crtc();
+ pt = in_idx(crtc, 0x11);
+ pt &= ~0x80; /* Unlock CR0-7 */
+ out_idx(pt, crtc, 0x11);
+
out_idx((u8)rows, crtc, 0x12); /* Lower height register */
+
ov = in_idx(crtc, 0x07); /* Overflow register */
ov &= 0xbd;
ov |= (rows >> (8-1)) & 0x02;
@@ -411,7 +416,7 @@ static void restore_screen(void)
"1: rep;stosl ; "
"popw %%es"
: "+D" (dst), "+c" (npad)
- : "bdSm" (video_segment),
+ : "bdS" (video_segment),
"a" (0x07200720));
}
diff --git a/arch/i386/boot/video.h b/arch/i386/boot/video.h
index 29eca17..b92447d 100644
--- a/arch/i386/boot/video.h
+++ b/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)
diff --git a/arch/i386/boot/voyager.c b/arch/i386/boot/voyager.c
index 9221614..61c8fe0 100644
--- a/arch/i386/boot/voyager.c
+++ b/arch/i386/boot/voyager.c
@@ -32,7 +32,7 @@ int query_voyager(void)
"setc %0 ; "
"movw %%es, %1 ; "
"popw %%es"
- : "=qm" (err), "=rm" (es), "=D" (di)
+ : "=q" (err), "=r" (es), "=D" (di)
: "a" (0xffc0));
if (err)