%cs at entry to decompressor varies a _lot_ among Linux 2.4.x, 2.6.y kernels.

Decompressor must adapt; no universal constants exist for __BOOT_CS, _BOOT_DS.
	p_vmlinx.cpp stub/l_vmlinz.asm

committer: jreiser <jreiser> 1103605278 +0000
This commit is contained in:
John Reiser
2004-12-21 05:01:18 +00:00
parent f0c21c7203
commit 36b852e6bf
2 changed files with 53 additions and 41 deletions
+26 -27
View File
@@ -487,39 +487,38 @@ void PackVmlinuxI386::unpack(OutputFile *fo)
//-----
//
//----- arch/i386/boot/compressed/upx-head.S
//#include <asm/segment.h>
//#ifndef __BOOT_CS /* Linux 2.4.x */
//#define __BOOT_CS __KERNEL_CS
//#define __BOOT_DS __KERNEL_DS
//#endif
//
// .text
// .text
//startup_32: .globl startup_32 # In: %esi=0x90000 setup data "real_mode pointer"
// cli # but if it matters, then there is a race!
// #cli # this must be true already
//
// movl $ __BOOT_DS,%eax
// movl %eax,%ss; leal 0x9000(%esi),%esp # 0x99000 typical
// /* Linux Documentation/i386/boot.txt "SAMPLE BOOT CONFIGURATION" says
// 0x8000-0x8FFF Stack and heap [inside the "real mode segment",
// just below the command line at offset 0x9000].
// /* The only facts about segments here, that are true for all kernels:
// * %cs is a valid "flat" code segment; no other segment reg is valid;
// * the next segment after %cs is a valid "flat" data segment, but
// * no segment register designates it yet.
// */
// movl %cs,%eax; addl $1<<3,%eax # the next segment after %cs
// movl %eax,%ds
// movl %eax,%es
// leal 0x9000(%esi),%ecx # 0x99000 typical
// movl %ecx,-8(%ecx) # 32-bit offset for stack pointer
// movl %eax,-4(%ecx) # segment for stack pointer
// lss -8(%ecx),%esp # %ss:%esp= %ds:0x99000
// /* Linux Documentation/i386/boot.txt "SAMPLE BOOT CONFIGURATION" says
// 0x8000-0x8FFF Stack and heap [inside the "real mode segment",
// just below the command line at offset 0x9000].
//
// arch/i386/boot/compressed/head.S "Do the decompression ..." says
// %esi contains the "real mode pointer" [as a 32-bit addr].
// arch/i386/boot/compressed/head.S "Do the decompression ..." says
// %esi contains the "real mode pointer" [as a 32-bit addr].
//
// In any case, avoid EBDA (Extended BIOS Data Area) below 0xA0000.
// boot.txt says 0x9A000 is the limit. LILO goes up to 0x9B000.
// */
// In any case, avoid EBDA (Extended BIOS Data Area) below 0xA0000.
// boot.txt says 0x9A000 is the limit. LILO goes up to 0x9B000.
// */
//
// pushl $0; popf # subsumes "cli; cld"; also clears NT for buggy BIOS
// pushl $0; popf # subsumes "cli; cld"; also clears NT for buggy BIOS
//
// movl %eax,%ds # all non-code segments identical
// movl %eax,%es
// movl %eax,%fs
// movl %eax,%gs
//
// movl $ 0x100000,%eax # destination of uncompression (and entry point)
// pushl $ __BOOT_CS
///* Fall into .text of upx-compressed vmlinux. */
// movl $ 0x100000,%eax # destination of uncompression (and entry point)
// push %cs
/* Fall into .text of upx-compressed vmlinux. */
//-----
// Approximate translation for Linux 2.4.x: