[PATCH] x86 Boot enhancements, boot memory cleanup 5/9

From: Eric W. Biederman (ebiederm@xmission.com)
Date: Wed Apr 03 2002 - 11:26:14 EST


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/



This archive was generated by hypermail 2b29 : Sun Apr 07 2002 - 22:00:11 EST