[LWN Logo]
[LWN.net]
From:	 ebiederm@xmission.com (Eric W. Biederman)
To:	 Linus Torvalds <torvalds@transmeta.com>
Subject: [PATCH] x86 Boot enhancements, boot memory cleanup 5/9
Date:	 03 Apr 2002 09:26:14 -0700
Cc:	 <linux-kernel@vger.kernel.org>


Linus please apply,

Currently video.S uses a small boot time heap.  As well as a large
1K data structure mode_list allocated in a ``bss'' segment at the end
the image.  This patch modifies video.S to allocate mode_list from
the heap, saving a small about of memory, and making a sane
implementation of a compiled in command line possible.

Additionally on systems with large e820 memory maps it is possible to
start overwriting our real mode code segment.  This patch modifies
the actual code start address in setup.S so that even at maximum
allocation the e820 map will not overwrite our code.

setup.S tries to have sane labels for various code sections but only
one code section is actually implemented, and the rest of the labels
have never been used so I have reduced this to simple arrangement of
having just _setup and _esetup labels.  And actually using them.

Eric

diff -uNr linux-2.5.7.boot2.pic16/arch/i386/boot/setup.S linux-2.5.7.boot2.heap/arch/i386/boot/setup.S
--- linux-2.5.7.boot2.pic16/arch/i386/boot/setup.S	Tue Apr  2 11:50:27 2002
+++ linux-2.5.7.boot2.heap/arch/i386/boot/setup.S	Tue Apr  2 11:52:04 2002
@@ -62,6 +62,8 @@
 #define __SETUP_REAL_CS 0x20
 #define __SETUP_REAL_DS 0x28
 
+#define MIN_HEAP_SIZE 1024
+
 #ifndef __BIG_KERNEL__
 #define KERNEL_START 0x1000		/* zImage */
 #else
@@ -76,15 +78,10 @@
 DELTA_INITSEG = SETUPSEG - INITSEG	# 0x0020
 
 .code16
-.globl begtext, begdata, begbss, endtext, enddata, endbss
+.globl _setup, _esetup
 
 .text
-begtext:
-.data
-begdata:
-.bss
-begbss:
-.text
+_setup:	
 
 start:
 	jmp	trampoline
@@ -141,10 +138,10 @@
 bootsect_kludge:
 		.word	bootsect_helper - start, SETUPSEG
 
-heap_end_ptr:	.word	modelist+1024 - start
+heap_end_ptr:	.word	_esetup + MIN_HEAP_SIZE  - start
 					# (Header version 0x0201 or later)
 					# space from here (exclusive) down to
-					# end of setup code can be used by setup
+					# heap_start can be used by setup
 					# for local heap purposes.
 
 pad1:		.word	0
@@ -167,8 +164,11 @@
 					# The highest safe address for
 					# the contents of an initrd
 
+# variables private to setup.S (not for bootloaders)
+real_filesz:	.long (_esetup - start) + (DELTA_INITSEG << 4)
 trampoline:	call	start_of_setup
-		.space	1024
+		# Don't let the E820 map overlap code
+		. = (0x2d0 - 0x200) + (E820MAX * E820ENTRY_SIZE)
 # End of setup header #####################################################
 
 start_of_setup:
@@ -1044,11 +1044,4 @@
 # After this point, there is some free space which is used by the video mode
 # handling code to store the temporary mode table (not used by the kernel).
 
-modelist:
-
-.text
-endtext:
-.data
-enddata:
-.bss
-endbss:
+_esetup:
diff -uNr linux-2.5.7.boot2.pic16/arch/i386/boot/video.S linux-2.5.7.boot2.heap/arch/i386/boot/video.S
--- linux-2.5.7.boot2.pic16/arch/i386/boot/video.S	Tue Apr  2 11:50:27 2002
+++ linux-2.5.7.boot2.heap/arch/i386/boot/video.S	Tue Apr  2 11:52:04 2002
@@ -117,6 +117,12 @@
 	xorw	%ax, %ax
 	movw	%ax, %gs	# GS is zero
 	cld
+
+	# Setup the heap
+	movl	real_filesz - start, %eax
+	subl	$(DELTA_INITSEG << 4), %eax
+	movw	%ax, heap_start - start
+	
 	call	basic_detect	# Basic adapter type testing (EGA/VGA/MDA/CGA)
 #ifdef CONFIG_VIDEO_SELECT
 	movw	%fs:(0x01fa), %ax		# User selected video mode
@@ -201,7 +207,7 @@
 #ifdef CONFIG_VIDEO_SELECT
 # Fetching of VESA frame buffer parameters
 mopar_gr:
-	leaw	modelist+1024 - start, %di
+	movw	heap_start - start, %di
 	movb	$0x23, %fs:(PARAM_HAVE_VGA)
 	movw	16(%di), %ax
 	movw	%ax, %fs:(PARAM_LFB_LINELENGTH)
@@ -223,7 +229,7 @@
 	movl	%eax, %fs:(PARAM_LFB_COLORS+4)
 
 # get video mem size
-	leaw	modelist+1024 - start, %di
+	movw	heap_start - start, %di
 	movw	$0x4f00, %ax
 	int	$0x10
 	xorl	%eax, %eax
@@ -284,7 +290,7 @@
 	leaw	listhdr - start, %si		# Table header
 	call	prtstr
 	movb	$0x30, %dl			# DL holds mode number
-	leaw	modelist - start, %si
+	movw	modelist - start, %si
 lm1:	cmpw	$ASK_VGA, (%si)			# End?
 	jz	lm2
 
@@ -529,7 +535,7 @@
 	jmp	_m_s
 
 check_vesa:
-	leaw	modelist+1024-start, %di
+	movw	heap_start - start, %di
 	subb	$VIDEO_FIRST_VESA>>8, %bh
 	movw	%bx, %cx			# Get mode information structure
 	movw	$0x4f01, %ax
@@ -774,12 +780,13 @@
 	mulb	%ah
 	movw	%ax, %cx			# CX=number of characters
 	addw	%ax, %ax			# Calculate image size
-	addw	$modelist+1024+4-start, %ax
+	addw	heap_start - start, %ax
+	addw	$4, %ax
 	cmpw	heap_end_ptr - start, %ax
 	jnc	sts1				# Unfortunately, out of memory
 
 	movw	%fs:(PARAM_CURSOR_POS), %ax	# Store mode params
-	leaw	modelist+1024-start, %di
+	movw	heap_start - start, %di
 	stosw
 	movw	%bx, %ax
 	stosw
@@ -802,7 +809,7 @@
 	call	mode_params			# Get parameters of current mode
 	movb	%fs:(PARAM_VIDEO_LINES), %cl
 	movb	%fs:(PARAM_VIDEO_COLS), %ch
-	leaw	modelist+1024-start, %si	# Screen buffer
+	movw	heap_start - start, %si	# Screen buffer
 	lodsw					# Set cursor position
 	movw	%ax, %dx
 	cmpb	%cl, %dh
@@ -882,8 +889,9 @@
 	movw	mt_end - start, %di		# Already filled?
 	orw	%di, %di
 	jnz	mtab1x
-	
-	leaw	modelist - start, %di		# Store standard modes:
+
+	movw	heap_start - start, %di		# Store standard modes:
+	movw	%di, modelist - start
 	movl	$VIDEO_80x25 + 0x50190000, %eax	# The 80x25 mode (ALL)
 	stosl
 	movb	adapter - start, %al		# CGA/MDA/HGA -- no more modes
@@ -929,13 +937,13 @@
 mtabe:
 
 #ifdef CONFIG_VIDEO_COMPACT
-	leaw	modelist - start, %si
+	movw	modelist - start, %si
 	movw	%di, %dx
 	movw	%si, %di
 cmt1:	cmpw	%dx, %si			# Scan all modes
 	jz	cmt2
 
-	leaw	modelist - start, %bx		# Find in previous entries
+	movw	modelist - start, %bx		# Find in previous entries
 	movw	2(%si), %cx
 cmt3:	cmpw	%bx, %si
 	jz	cmt4
@@ -957,7 +965,8 @@
 
 	movw	$ASK_VGA, (%di)			# End marker
 	movw	%di, mt_end - start
-mtab1:	leaw	modelist - start, %si		# SI=mode list, DI=list end
+	movw	%di, heap_start - start
+mtab1:	movw	modelist - start, %si		# SI=mode list, DI=list end
 ret0:	ret
 
 # Modes usable on all standard VGAs
@@ -1932,3 +1941,5 @@
 adapter:	.byte	0	# Video adapter: 0=CGA/MDA/HGA,1=EGA,2=VGA
 video_segment:	.word	0xb800	# Video memory segment
 force_size:	.word	0	# Use this size instead of the one in BIOS vars
+modelist:	.word	0	# Start of modelist on the heap
+heap_start:	.word	0	# low heap address
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/