From 2b122562add3b91b969acd615d37d0c20b1d4a44 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Sat, 14 Oct 2006 14:55:10 -0700 Subject: [PATCH] new file i386-linux.kernel.head-vmlinux.S --- src/stub/src/i386-linux.kernel.head-vmlinux.S | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/stub/src/i386-linux.kernel.head-vmlinux.S diff --git a/src/stub/src/i386-linux.kernel.head-vmlinux.S b/src/stub/src/i386-linux.kernel.head-vmlinux.S new file mode 100644 index 00000000..a4f6fdbd --- /dev/null +++ b/src/stub/src/i386-linux.kernel.head-vmlinux.S @@ -0,0 +1,62 @@ +/* +; i386-linux.kernel.vmlinux-head.S -- set up stack for vmlinux/i386 format +; +; This file is part of the UPX executable compressor. +; +; Copyright (C) 2006 John Reiser +; All Rights Reserved. +; +; UPX and the UCL library are free software; you can redistribute them +; and/or modify them under the terms of the GNU General Public License as +; published by the Free Software Foundation; either version 2 of +; the License, or (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; see the file COPYING. +; If not, write to the Free Software Foundation, Inc., +; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +; +; John Reiser +; +*/ +// In: %esi=0x90000 setup data "real_mode pointer" + #cli # this must be true already +//// .byte 0xf1 # qemu debug only + + /* 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]. + + 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 + + push %cs +// PackVmlinuxI386::pack knows the format of the next two instructions. + movl $ ENTRY_POINT,%eax # destination of uncompression (and entry point) + call COMPRESSED_LENGTH +// Compressed data appears >here<, then decompressor. + +// vi:ts=8:et:nowrap