You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
* 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6: (156 commits) [PATCH] x86-64: Export smp_call_function_single [PATCH] i386: Clean up smp_tune_scheduling() [PATCH] unwinder: move .eh_frame to RODATA [PATCH] unwinder: fully support linker generated .eh_frame_hdr section [PATCH] x86-64: don't use set_irq_regs() [PATCH] x86-64: check vector in setup_ioapic_dest to verify if need setup_IO_APIC_irq [PATCH] x86-64: Make ix86 default to HIGHMEM4G instead of NOHIGHMEM [PATCH] i386: replace kmalloc+memset with kzalloc [PATCH] x86-64: remove remaining pc98 code [PATCH] x86-64: remove unused variable [PATCH] x86-64: Fix constraints in atomic_add_return() [PATCH] x86-64: fix asm constraints in i386 atomic_add_return [PATCH] x86-64: Correct documentation for bzImage protocol v2.05 [PATCH] x86-64: replace kmalloc+memset with kzalloc in MTRR code [PATCH] x86-64: Fix numaq build error [PATCH] x86-64: include/asm-x86_64/cpufeature.h isn't a userspace header [PATCH] unwinder: Add debugging output to the Dwarf2 unwinder [PATCH] x86-64: Clarify error message in GART code [PATCH] x86-64: Fix interrupt race in idle callback (3rd try) [PATCH] x86-64: Remove unwind stack pointer alignment forcing again ... Fixed conflict in include/linux/uaccess.h manually Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
----------------------------
|
||||
|
||||
H. Peter Anvin <hpa@zytor.com>
|
||||
Last update 2005-09-02
|
||||
Last update 2006-11-17
|
||||
|
||||
On the i386 platform, the Linux kernel uses a rather complicated boot
|
||||
convention. This has evolved partially due to historical aspects, as
|
||||
@@ -35,6 +35,8 @@ Protocol 2.03: (Kernel 2.4.18-pre1) Explicitly makes the highest possible
|
||||
initrd address available to the bootloader.
|
||||
|
||||
Protocol 2.04: (Kernel 2.6.14) Extend the syssize field to four bytes.
|
||||
Protocol 2.05: (Kernel 2.6.20) Make protected mode kernel relocatable.
|
||||
Introduce relocatable_kernel and kernel_alignment fields.
|
||||
|
||||
|
||||
**** MEMORY LAYOUT
|
||||
@@ -129,6 +131,8 @@ Offset Proto Name Meaning
|
||||
0226/2 N/A pad1 Unused
|
||||
0228/4 2.02+ cmd_line_ptr 32-bit pointer to the kernel command line
|
||||
022C/4 2.03+ initrd_addr_max Highest legal initrd address
|
||||
0230/4 2.05+ kernel_alignment Physical addr alignment required for kernel
|
||||
0234/1 2.05+ relocatable_kernel Whether kernel is relocatable or not
|
||||
|
||||
(1) For backwards compatibility, if the setup_sects field contains 0, the
|
||||
real value is 4.
|
||||
|
||||
@@ -599,8 +599,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
hugepages= [HW,IA-32,IA-64] Maximal number of HugeTLB pages.
|
||||
|
||||
noirqbalance [IA-32,SMP,KNL] Disable kernel irq balancing
|
||||
|
||||
i8042.direct [HW] Put keyboard port into non-translated mode
|
||||
i8042.dumbkbd [HW] Pretend that controller can only read data from
|
||||
keyboard and cannot control its state
|
||||
@@ -1065,9 +1063,14 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
in certain environments such as networked servers or
|
||||
real-time systems.
|
||||
|
||||
noirqbalance [IA-32,SMP,KNL] Disable kernel irq balancing
|
||||
|
||||
noirqdebug [IA-32] Disables the code which attempts to detect and
|
||||
disable unhandled interrupt sources.
|
||||
|
||||
no_timer_check [IA-32,X86_64,APIC] Disables the code which tests for
|
||||
broken timer IRQ sources.
|
||||
|
||||
noisapnp [ISAPNP] Disables ISA PnP code.
|
||||
|
||||
noinitrd [RAM] Tells the kernel not to load any configured
|
||||
@@ -1752,6 +1755,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
norandmaps Don't use address space randomization
|
||||
Equivalent to echo 0 > /proc/sys/kernel/randomize_va_space
|
||||
|
||||
unwind_debug=N N > 0 will enable dwarf2 unwinder debugging
|
||||
This is useful to get more information why
|
||||
you got a "dwarf2 unwinder stuck"
|
||||
|
||||
______________________________________________________________________
|
||||
|
||||
|
||||
@@ -62,9 +62,6 @@ consider the following facts about the Linux kernel:
|
||||
- different structures can contain different fields
|
||||
- Some functions may not be implemented at all, (i.e. some locks
|
||||
compile away to nothing for non-SMP builds.)
|
||||
- Parameter passing of variables from function to function can be
|
||||
done in different ways (the CONFIG_REGPARM option controls
|
||||
this.)
|
||||
- Memory within the kernel can be aligned in different ways,
|
||||
depending on the build options.
|
||||
- Linux runs on a wide range of different processor architectures.
|
||||
|
||||
@@ -27,6 +27,7 @@ show up in /proc/sys/kernel:
|
||||
- hotplug
|
||||
- java-appletviewer [ binfmt_java, obsolete ]
|
||||
- java-interpreter [ binfmt_java, obsolete ]
|
||||
- kstack_depth_to_print [ X86 only ]
|
||||
- l2cr [ PPC only ]
|
||||
- modprobe ==> Documentation/kmod.txt
|
||||
- msgmax
|
||||
@@ -170,6 +171,13 @@ This flag controls the L2 cache of G3 processor boards. If
|
||||
|
||||
==============================================================
|
||||
|
||||
kstack_depth_to_print: (X86 only)
|
||||
|
||||
Controls the number of words to print when dumping the raw
|
||||
kernel stack.
|
||||
|
||||
==============================================================
|
||||
|
||||
osrelease, ostype & version:
|
||||
|
||||
# cat osrelease
|
||||
|
||||
@@ -52,10 +52,6 @@ APICs
|
||||
apicmaintimer. Useful when your PIT timer is totally
|
||||
broken.
|
||||
|
||||
disable_8254_timer / enable_8254_timer
|
||||
Enable interrupt 0 timer routing over the 8254 in addition to over
|
||||
the IO-APIC. The kernel tries to set a sensible default.
|
||||
|
||||
Early Console
|
||||
|
||||
syntax: earlyprintk=vga
|
||||
@@ -183,7 +179,7 @@ PCI
|
||||
IOMMU
|
||||
|
||||
iommu=[size][,noagp][,off][,force][,noforce][,leak][,memaper[=order]][,merge]
|
||||
[,forcesac][,fullflush][,nomerge][,noaperture]
|
||||
[,forcesac][,fullflush][,nomerge][,noaperture][,calgary]
|
||||
size set size of iommu (in bytes)
|
||||
noagp don't initialize the AGP driver and use full aperture.
|
||||
off don't use the IOMMU
|
||||
@@ -204,6 +200,7 @@ IOMMU
|
||||
buffering.
|
||||
nodac Forbid DMA >4GB
|
||||
panic Always panic when IOMMU overflows
|
||||
calgary Use the Calgary IOMMU if it is available
|
||||
|
||||
swiotlb=pages[,force]
|
||||
|
||||
|
||||
@@ -70,6 +70,7 @@ SECTIONS
|
||||
#endif
|
||||
.text :
|
||||
{
|
||||
_text = .;
|
||||
#if defined(CONFIG_ROMKERNEL)
|
||||
*(.int_redirect)
|
||||
#endif
|
||||
|
||||
+45
-31
@@ -182,6 +182,17 @@ config X86_ES7000
|
||||
|
||||
endchoice
|
||||
|
||||
config PARAVIRT
|
||||
bool "Paravirtualization support (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
Paravirtualization is a way of running multiple instances of
|
||||
Linux on the same machine, under a hypervisor. This option
|
||||
changes the kernel so it can modify itself when it is run
|
||||
under a hypervisor, improving performance significantly.
|
||||
However, when run without a hypervisor the kernel is
|
||||
theoretically slower. If in doubt, say N.
|
||||
|
||||
config ACPI_SRAT
|
||||
bool
|
||||
default y
|
||||
@@ -443,7 +454,8 @@ source "drivers/firmware/Kconfig"
|
||||
|
||||
choice
|
||||
prompt "High Memory Support"
|
||||
default NOHIGHMEM
|
||||
default HIGHMEM4G if !X86_NUMAQ
|
||||
default HIGHMEM64G if X86_NUMAQ
|
||||
|
||||
config NOHIGHMEM
|
||||
bool "off"
|
||||
@@ -710,20 +722,6 @@ config BOOT_IOREMAP
|
||||
depends on (((X86_SUMMIT || X86_GENERICARCH) && NUMA) || (X86 && EFI))
|
||||
default y
|
||||
|
||||
config REGPARM
|
||||
bool "Use register arguments"
|
||||
default y
|
||||
help
|
||||
Compile the kernel with -mregparm=3. This instructs gcc to use
|
||||
a more efficient function call ABI which passes the first three
|
||||
arguments of a function call via registers, which results in denser
|
||||
and faster code.
|
||||
|
||||
If this option is disabled, then the default ABI of passing
|
||||
arguments via the stack is used.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config SECCOMP
|
||||
bool "Enable seccomp to safely compute untrusted bytecode"
|
||||
depends on PROC_FS
|
||||
@@ -773,23 +771,39 @@ config CRASH_DUMP
|
||||
PHYSICAL_START.
|
||||
For more details see Documentation/kdump/kdump.txt
|
||||
|
||||
config PHYSICAL_START
|
||||
hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP)
|
||||
|
||||
default "0x1000000" if CRASH_DUMP
|
||||
default "0x100000"
|
||||
config RELOCATABLE
|
||||
bool "Build a relocatable kernel(EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
This gives the physical address where the kernel is loaded. Normally
|
||||
for regular kernels this value is 0x100000 (1MB). But in the case
|
||||
of kexec on panic the fail safe kernel needs to run at a different
|
||||
address than the panic-ed kernel. This option is used to set the load
|
||||
address for kernels used to capture crash dump on being kexec'ed
|
||||
after panic. The default value for crash dump kernels is
|
||||
0x1000000 (16MB). This can also be set based on the "X" value as
|
||||
specified in the "crashkernel=YM@XM" command line boot parameter
|
||||
passed to the panic-ed kernel. Typically this parameter is set as
|
||||
crashkernel=64M@16M. Please take a look at
|
||||
Documentation/kdump/kdump.txt for more details about crash dumps.
|
||||
This build a kernel image that retains relocation information
|
||||
so it can be loaded someplace besides the default 1MB.
|
||||
The relocations tend to the kernel binary about 10% larger,
|
||||
but are discarded at runtime.
|
||||
|
||||
One use is for the kexec on panic case where the recovery kernel
|
||||
must live at a different physical address than the primary
|
||||
kernel.
|
||||
|
||||
config PHYSICAL_ALIGN
|
||||
hex "Alignment value to which kernel should be aligned"
|
||||
default "0x100000"
|
||||
range 0x2000 0x400000
|
||||
help
|
||||
This value puts the alignment restrictions on physical address
|
||||
where kernel is loaded and run from. Kernel is compiled for an
|
||||
address which meets above alignment restriction.
|
||||
|
||||
If bootloader loads the kernel at a non-aligned address and
|
||||
CONFIG_RELOCATABLE is set, kernel will move itself to nearest
|
||||
address aligned to above value and run from there.
|
||||
|
||||
If bootloader loads the kernel at a non-aligned address and
|
||||
CONFIG_RELOCATABLE is not set, kernel will ignore the run time
|
||||
load address and decompress itself to the address it has been
|
||||
compiled for and run from there. The address for which kernel is
|
||||
compiled already meets above alignment restrictions. Hence the
|
||||
end result is that kernel runs from a physical address meeting
|
||||
above alignment restrictions.
|
||||
|
||||
Don't change this unless you know what you are doing.
|
||||
|
||||
|
||||
+13
-6
@@ -103,8 +103,15 @@ config MPENTIUMM
|
||||
Select this for Intel Pentium M (not Pentium-4 M)
|
||||
notebook chips.
|
||||
|
||||
config MCORE2
|
||||
bool "Core 2/newer Xeon"
|
||||
help
|
||||
Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and 53xx)
|
||||
CPUs. You can distingush newer from older Xeons by the CPU family
|
||||
in /proc/cpuinfo. Newer ones have 6.
|
||||
|
||||
config MPENTIUM4
|
||||
bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon"
|
||||
bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon"
|
||||
help
|
||||
Select this for Intel Pentium 4 chips. This includes the
|
||||
Pentium 4, P4-based Celeron and Xeon, and Pentium-4 M
|
||||
@@ -229,7 +236,7 @@ config X86_L1_CACHE_SHIFT
|
||||
default "7" if MPENTIUM4 || X86_GENERIC
|
||||
default "4" if X86_ELAN || M486 || M386 || MGEODEGX1
|
||||
default "5" if MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX
|
||||
default "6" if MK7 || MK8 || MPENTIUMM
|
||||
default "6" if MK7 || MK8 || MPENTIUMM || MCORE2
|
||||
|
||||
config RWSEM_GENERIC_SPINLOCK
|
||||
bool
|
||||
@@ -287,17 +294,17 @@ config X86_ALIGNMENT_16
|
||||
|
||||
config X86_GOOD_APIC
|
||||
bool
|
||||
depends on MK7 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || MK8 || MEFFICEON
|
||||
depends on MK7 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || MK8 || MEFFICEON || MCORE2
|
||||
default y
|
||||
|
||||
config X86_INTEL_USERCOPY
|
||||
bool
|
||||
depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON
|
||||
depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2
|
||||
default y
|
||||
|
||||
config X86_USE_PPRO_CHECKSUM
|
||||
bool
|
||||
depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MEFFICEON || MGEODE_LX
|
||||
depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MEFFICEON || MGEODE_LX || MCORE2
|
||||
default y
|
||||
|
||||
config X86_USE_3DNOW
|
||||
@@ -312,5 +319,5 @@ config X86_OOSTORE
|
||||
|
||||
config X86_TSC
|
||||
bool
|
||||
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1 || MGEODE_LX) && !X86_NUMAQ
|
||||
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1 || MGEODE_LX || MCORE2) && !X86_NUMAQ
|
||||
default y
|
||||
|
||||
@@ -85,4 +85,14 @@ config DOUBLEFAULT
|
||||
option saves about 4k and might cause you much additional grey
|
||||
hair.
|
||||
|
||||
config DEBUG_PARAVIRT
|
||||
bool "Enable some paravirtualization debugging"
|
||||
default y
|
||||
depends on PARAVIRT && DEBUG_KERNEL
|
||||
help
|
||||
Currently deliberately clobbers regs which are allowed to be
|
||||
clobbered in inlined paravirt hooks, even in native mode.
|
||||
If turning this off solves a problem, then DISABLE_INTERRUPTS() or
|
||||
ENABLE_INTERRUPTS() is lying about what registers can be clobbered.
|
||||
|
||||
endmenu
|
||||
|
||||
+4
-4
@@ -26,10 +26,12 @@ endif
|
||||
|
||||
LDFLAGS := -m elf_i386
|
||||
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
|
||||
LDFLAGS_vmlinux :=
|
||||
ifdef CONFIG_RELOCATABLE
|
||||
LDFLAGS_vmlinux := --emit-relocs
|
||||
endif
|
||||
CHECKFLAGS += -D__i386__
|
||||
|
||||
CFLAGS += -pipe -msoft-float
|
||||
CFLAGS += -pipe -msoft-float -mregparm=3
|
||||
|
||||
# prevent gcc from keeping the stack 16 byte aligned
|
||||
CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2)
|
||||
@@ -37,8 +39,6 @@ CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2)
|
||||
# CPU-specific tuning. Anything which can be shared with UML should go here.
|
||||
include $(srctree)/arch/i386/Makefile.cpu
|
||||
|
||||
cflags-$(CONFIG_REGPARM) += -mregparm=3
|
||||
|
||||
# temporary until string.h is fixed
|
||||
cflags-y += -ffreestanding
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ cflags-$(CONFIG_MWINCHIP2) += $(call cc-option,-march=winchip2,-march=i586)
|
||||
cflags-$(CONFIG_MWINCHIP3D) += $(call cc-option,-march=winchip2,-march=i586)
|
||||
cflags-$(CONFIG_MCYRIXIII) += $(call cc-option,-march=c3,-march=i486) $(align)-functions=0 $(align)-jumps=0 $(align)-loops=0
|
||||
cflags-$(CONFIG_MVIAC3_2) += $(call cc-option,-march=c3-2,-march=i686)
|
||||
cflags-$(CONFIG_MCORE2) += -march=i686 $(call cc-option,-mtune=core2,$(call cc-option,-mtune=generic,-mtune=i686))
|
||||
|
||||
# AMD Elan support
|
||||
cflags-$(CONFIG_X86_ELAN) += -march=i486
|
||||
|
||||
@@ -4,22 +4,42 @@
|
||||
# create a compressed vmlinux image from the original vmlinux
|
||||
#
|
||||
|
||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o piggy.o
|
||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o piggy.o \
|
||||
vmlinux.bin.all vmlinux.relocs
|
||||
EXTRA_AFLAGS := -traditional
|
||||
|
||||
LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup_32
|
||||
LDFLAGS_vmlinux := -T
|
||||
CFLAGS_misc.o += -fPIC
|
||||
hostprogs-y := relocs
|
||||
|
||||
$(obj)/vmlinux: $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o FORCE
|
||||
$(obj)/vmlinux: $(src)/vmlinux.lds $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o FORCE
|
||||
$(call if_changed,ld)
|
||||
@:
|
||||
|
||||
$(obj)/vmlinux.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
quiet_cmd_relocs = RELOCS $@
|
||||
cmd_relocs = $(obj)/relocs $< > $@;$(obj)/relocs --abs-relocs $<
|
||||
$(obj)/vmlinux.relocs: vmlinux $(obj)/relocs FORCE
|
||||
$(call if_changed,relocs)
|
||||
|
||||
vmlinux.bin.all-y := $(obj)/vmlinux.bin
|
||||
vmlinux.bin.all-$(CONFIG_RELOCATABLE) += $(obj)/vmlinux.relocs
|
||||
quiet_cmd_relocbin = BUILD $@
|
||||
cmd_relocbin = cat $(filter-out FORCE,$^) > $@
|
||||
$(obj)/vmlinux.bin.all: $(vmlinux.bin.all-y) FORCE
|
||||
$(call if_changed,relocbin)
|
||||
|
||||
ifdef CONFIG_RELOCATABLE
|
||||
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin.all FORCE
|
||||
$(call if_changed,gzip)
|
||||
else
|
||||
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
||||
$(call if_changed,gzip)
|
||||
endif
|
||||
|
||||
LDFLAGS_piggy.o := -r --format binary --oformat elf32-i386 -T
|
||||
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
|
||||
$(obj)/piggy.o: $(src)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
|
||||
$(call if_changed,ld)
|
||||
|
||||
@@ -26,9 +26,11 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/boot.h>
|
||||
|
||||
.section ".text.head"
|
||||
.globl startup_32
|
||||
|
||||
|
||||
startup_32:
|
||||
cld
|
||||
cli
|
||||
@@ -37,93 +39,142 @@ startup_32:
|
||||
movl %eax,%es
|
||||
movl %eax,%fs
|
||||
movl %eax,%gs
|
||||
movl %eax,%ss
|
||||
|
||||
lss stack_start,%esp
|
||||
xorl %eax,%eax
|
||||
1: incl %eax # check that A20 really IS enabled
|
||||
movl %eax,0x000000 # loop forever if it isn't
|
||||
cmpl %eax,0x100000
|
||||
je 1b
|
||||
/* Calculate the delta between where we were compiled to run
|
||||
* at and where we were actually loaded at. This can only be done
|
||||
* with a short local call on x86. Nothing else will tell us what
|
||||
* address we are running at. The reserved chunk of the real-mode
|
||||
* data at 0x34-0x3f are used as the stack for this calculation.
|
||||
* Only 4 bytes are needed.
|
||||
*/
|
||||
leal 0x40(%esi), %esp
|
||||
call 1f
|
||||
1: popl %ebp
|
||||
subl $1b, %ebp
|
||||
|
||||
/* %ebp contains the address we are loaded at by the boot loader and %ebx
|
||||
* contains the address where we should move the kernel image temporarily
|
||||
* for safe in-place decompression.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
movl %ebp, %ebx
|
||||
addl $(CONFIG_PHYSICAL_ALIGN - 1), %ebx
|
||||
andl $(~(CONFIG_PHYSICAL_ALIGN - 1)), %ebx
|
||||
#else
|
||||
movl $LOAD_PHYSICAL_ADDR, %ebx
|
||||
#endif
|
||||
|
||||
/* Replace the compressed data size with the uncompressed size */
|
||||
subl input_len(%ebp), %ebx
|
||||
movl output_len(%ebp), %eax
|
||||
addl %eax, %ebx
|
||||
/* Add 8 bytes for every 32K input block */
|
||||
shrl $12, %eax
|
||||
addl %eax, %ebx
|
||||
/* Add 32K + 18 bytes of extra slack */
|
||||
addl $(32768 + 18), %ebx
|
||||
/* Align on a 4K boundary */
|
||||
addl $4095, %ebx
|
||||
andl $~4095, %ebx
|
||||
|
||||
/* Copy the compressed kernel to the end of our buffer
|
||||
* where decompression in place becomes safe.
|
||||
*/
|
||||
pushl %esi
|
||||
leal _end(%ebp), %esi
|
||||
leal _end(%ebx), %edi
|
||||
movl $(_end - startup_32), %ecx
|
||||
std
|
||||
rep
|
||||
movsb
|
||||
cld
|
||||
popl %esi
|
||||
|
||||
/* Compute the kernel start address.
|
||||
*/
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
addl $(CONFIG_PHYSICAL_ALIGN - 1), %ebp
|
||||
andl $(~(CONFIG_PHYSICAL_ALIGN - 1)), %ebp
|
||||
#else
|
||||
movl $LOAD_PHYSICAL_ADDR, %ebp
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initialize eflags. Some BIOS's leave bits like NT set. This would
|
||||
* confuse the debugger if this code is traced.
|
||||
* XXX - best to initialize before switching to protected mode.
|
||||
* Jump to the relocated address.
|
||||
*/
|
||||
pushl $0
|
||||
popfl
|
||||
leal relocated(%ebx), %eax
|
||||
jmp *%eax
|
||||
.section ".text"
|
||||
relocated:
|
||||
|
||||
/*
|
||||
* Clear BSS
|
||||
*/
|
||||
xorl %eax,%eax
|
||||
movl $_edata,%edi
|
||||
movl $_end,%ecx
|
||||
leal _edata(%ebx),%edi
|
||||
leal _end(%ebx), %ecx
|
||||
subl %edi,%ecx
|
||||
cld
|
||||
rep
|
||||
stosb
|
||||
|
||||
/*
|
||||
* Setup the stack for the decompressor
|
||||
*/
|
||||
leal stack_end(%ebx), %esp
|
||||
|
||||
/*
|
||||
* Do the decompression, and jump to the new kernel..
|
||||
*/
|
||||
subl $16,%esp # place for structure on the stack
|
||||
movl %esp,%eax
|
||||
movl output_len(%ebx), %eax
|
||||
pushl %eax
|
||||
pushl %ebp # output address
|
||||
movl input_len(%ebx), %eax
|
||||
pushl %eax # input_len
|
||||
leal input_data(%ebx), %eax
|
||||
pushl %eax # input_data
|
||||
leal _end(%ebx), %eax
|
||||
pushl %eax # end of the image as third argument
|
||||
pushl %esi # real mode pointer as second arg
|
||||
pushl %eax # address of structure as first arg
|
||||
call decompress_kernel
|
||||
orl %eax,%eax
|
||||
jnz 3f
|
||||
popl %esi # discard address
|
||||
popl %esi # real mode pointer
|
||||
xorl %ebx,%ebx
|
||||
ljmp $(__BOOT_CS), $__PHYSICAL_START
|
||||
addl $20, %esp
|
||||
popl %ecx
|
||||
|
||||
#if CONFIG_RELOCATABLE
|
||||
/* Find the address of the relocations.
|
||||
*/
|
||||
movl %ebp, %edi
|
||||
addl %ecx, %edi
|
||||
|
||||
/* Calculate the delta between where vmlinux was compiled to run
|
||||
* and where it was actually loaded.
|
||||
*/
|
||||
movl %ebp, %ebx
|
||||
subl $LOAD_PHYSICAL_ADDR, %ebx
|
||||
jz 2f /* Nothing to be done if loaded at compiled addr. */
|
||||
/*
|
||||
* Process relocations.
|
||||
*/
|
||||
|
||||
1: subl $4, %edi
|
||||
movl 0(%edi), %ecx
|
||||
testl %ecx, %ecx
|
||||
jz 2f
|
||||
addl %ebx, -__PAGE_OFFSET(%ebx, %ecx)
|
||||
jmp 1b
|
||||
2:
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We come here, if we were loaded high.
|
||||
* We need to move the move-in-place routine down to 0x1000
|
||||
* and then start it with the buffer addresses in registers,
|
||||
* which we got from the stack.
|
||||
* Jump to the decompressed kernel.
|
||||
*/
|
||||
3:
|
||||
movl $move_routine_start,%esi
|
||||
movl $0x1000,%edi
|
||||
movl $move_routine_end,%ecx
|
||||
subl %esi,%ecx
|
||||
addl $3,%ecx
|
||||
shrl $2,%ecx
|
||||
cld
|
||||
rep
|
||||
movsl
|
||||
|
||||
popl %esi # discard the address
|
||||
popl %ebx # real mode pointer
|
||||
popl %esi # low_buffer_start
|
||||
popl %ecx # lcount
|
||||
popl %edx # high_buffer_start
|
||||
popl %eax # hcount
|
||||
movl $__PHYSICAL_START,%edi
|
||||
cli # make sure we don't get interrupted
|
||||
ljmp $(__BOOT_CS), $0x1000 # and jump to the move routine
|
||||
|
||||
/*
|
||||
* Routine (template) for moving the decompressed kernel in place,
|
||||
* if we were high loaded. This _must_ PIC-code !
|
||||
*/
|
||||
move_routine_start:
|
||||
movl %ecx,%ebp
|
||||
shrl $2,%ecx
|
||||
rep
|
||||
movsl
|
||||
movl %ebp,%ecx
|
||||
andl $3,%ecx
|
||||
rep
|
||||
movsb
|
||||
movl %edx,%esi
|
||||
movl %eax,%ecx # NOTE: rep movsb won't move if %ecx == 0
|
||||
addl $3,%ecx
|
||||
shrl $2,%ecx
|
||||
rep
|
||||
movsl
|
||||
movl %ebx,%esi # Restore setup pointer
|
||||
xorl %ebx,%ebx
|
||||
ljmp $(__BOOT_CS), $__PHYSICAL_START
|
||||
move_routine_end:
|
||||
jmp *%ebp
|
||||
|
||||
.bss
|
||||
.balign 4
|
||||
stack:
|
||||
.fill 4096, 1, 0
|
||||
stack_end:
|
||||
|
||||
+135
-129
@@ -9,11 +9,94 @@
|
||||
* High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
|
||||
*/
|
||||
|
||||
#undef CONFIG_PARAVIRT
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/screen_info.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/boot.h>
|
||||
|
||||
/* WARNING!!
|
||||
* This code is compiled with -fPIC and it is relocated dynamically
|
||||
* at run time, but no relocation processing is performed.
|
||||
* This means that it is not safe to place pointers in static structures.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Getting to provable safe in place decompression is hard.
|
||||
* Worst case behaviours need to be analized.
|
||||
* Background information:
|
||||
*
|
||||
* The file layout is:
|
||||
* magic[2]
|
||||
* method[1]
|
||||
* flags[1]
|
||||
* timestamp[4]
|
||||
* extraflags[1]
|
||||
* os[1]
|
||||
* compressed data blocks[N]
|
||||
* crc[4] orig_len[4]
|
||||
*
|
||||
* resulting in 18 bytes of non compressed data overhead.
|
||||
*
|
||||
* Files divided into blocks
|
||||
* 1 bit (last block flag)
|
||||
* 2 bits (block type)
|
||||
*
|
||||
* 1 block occurs every 32K -1 bytes or when there 50% compression has been achieved.
|
||||
* The smallest block type encoding is always used.
|
||||
*
|
||||
* stored:
|
||||
* 32 bits length in bytes.
|
||||
*
|
||||
* fixed:
|
||||
* magic fixed tree.
|
||||
* symbols.
|
||||
*
|
||||
* dynamic:
|
||||
* dynamic tree encoding.
|
||||
* symbols.
|
||||
*
|
||||
*
|
||||
* The buffer for decompression in place is the length of the
|
||||
* uncompressed data, plus a small amount extra to keep the algorithm safe.
|
||||
* The compressed data is placed at the end of the buffer. The output
|
||||
* pointer is placed at the start of the buffer and the input pointer
|
||||
* is placed where the compressed data starts. Problems will occur
|
||||
* when the output pointer overruns the input pointer.
|
||||
*
|
||||
* The output pointer can only overrun the input pointer if the input
|
||||
* pointer is moving faster than the output pointer. A condition only
|
||||
* triggered by data whose compressed form is larger than the uncompressed
|
||||
* form.
|
||||
*
|
||||
* The worst case at the block level is a growth of the compressed data
|
||||
* of 5 bytes per 32767 bytes.
|
||||
*
|
||||
* The worst case internal to a compressed block is very hard to figure.
|
||||
* The worst case can at least be boundined by having one bit that represents
|
||||
* 32764 bytes and then all of the rest of the bytes representing the very
|
||||
* very last byte.
|
||||
*
|
||||
* All of which is enough to compute an amount of extra data that is required
|
||||
* to be safe. To avoid problems at the block level allocating 5 extra bytes
|
||||
* per 32767 bytes of data is sufficient. To avoind problems internal to a block
|
||||
* adding an extra 32767 bytes (the worst case uncompressed block size) is
|
||||
* sufficient, to ensure that in the worst case the decompressed data for
|
||||
* block will stop the byte before the compressed data for a block begins.
|
||||
* To avoid problems with the compressed data's meta information an extra 18
|
||||
* bytes are needed. Leading to the formula:
|
||||
*
|
||||
* extra_bytes = (uncompressed_size >> 12) + 32768 + 18 + decompressor_size.
|
||||
*
|
||||
* Adding 8 bytes per 32K is a bit excessive but much easier to calculate.
|
||||
* Adding 32768 instead of 32767 just makes for round numbers.
|
||||
* Adding the decompressor_size is necessary as it musht live after all
|
||||
* of the data as well. Last I measured the decompressor is about 14K.
|
||||
* 10K of actuall data and 4K of bss.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* gzip declarations
|
||||
@@ -30,15 +113,20 @@ typedef unsigned char uch;
|
||||
typedef unsigned short ush;
|
||||
typedef unsigned long ulg;
|
||||
|
||||
#define WSIZE 0x8000 /* Window size must be at least 32k, */
|
||||
/* and a power of two */
|
||||
#define WSIZE 0x80000000 /* Window size must be at least 32k,
|
||||
* and a power of two
|
||||
* We don't actually have a window just
|
||||
* a huge output buffer so I report
|
||||
* a 2G windows size, as that should
|
||||
* always be larger than our output buffer.
|
||||
*/
|
||||
|
||||
static uch *inbuf; /* input buffer */
|
||||
static uch window[WSIZE]; /* Sliding window buffer */
|
||||
static uch *inbuf; /* input buffer */
|
||||
static uch *window; /* Sliding window buffer, (and final output buffer) */
|
||||
|
||||
static unsigned insize = 0; /* valid bytes in inbuf */
|
||||
static unsigned inptr = 0; /* index of next byte to be processed in inbuf */
|
||||
static unsigned outcnt = 0; /* bytes in output buffer */
|
||||
static unsigned insize; /* valid bytes in inbuf */
|
||||
static unsigned inptr; /* index of next byte to be processed in inbuf */
|
||||
static unsigned outcnt; /* bytes in output buffer */
|
||||
|
||||
/* gzip flag byte */
|
||||
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */
|
||||
@@ -89,8 +177,6 @@ extern unsigned char input_data[];
|
||||
extern int input_len;
|
||||
|
||||
static long bytes_out = 0;
|
||||
static uch *output_data;
|
||||
static unsigned long output_ptr = 0;
|
||||
|
||||
static void *malloc(int size);
|
||||
static void free(void *where);
|
||||
@@ -100,24 +186,17 @@ static void *memcpy(void *dest, const void *src, unsigned n);
|
||||
|
||||
static void putstr(const char *);
|
||||
|
||||
extern int end;
|
||||
static long free_mem_ptr = (long)&end;
|
||||
static long free_mem_end_ptr;
|
||||
static unsigned long free_mem_ptr;
|
||||
static unsigned long free_mem_end_ptr;
|
||||
|
||||
#define INPLACE_MOVE_ROUTINE 0x1000
|
||||
#define LOW_BUFFER_START 0x2000
|
||||
#define LOW_BUFFER_MAX 0x90000
|
||||
#define HEAP_SIZE 0x3000
|
||||
static unsigned int low_buffer_end, low_buffer_size;
|
||||
static int high_loaded =0;
|
||||
static uch *high_buffer_start /* = (uch *)(((ulg)&end) + HEAP_SIZE)*/;
|
||||
|
||||
static char *vidmem = (char *)0xb8000;
|
||||
static int vidport;
|
||||
static int lines, cols;
|
||||
|
||||
#ifdef CONFIG_X86_NUMAQ
|
||||
static void * xquad_portio = NULL;
|
||||
void *xquad_portio;
|
||||
#endif
|
||||
|
||||
#include "../../../../lib/inflate.c"
|
||||
@@ -151,7 +230,7 @@ static void gzip_mark(void **ptr)
|
||||
|
||||
static void gzip_release(void **ptr)
|
||||
{
|
||||
free_mem_ptr = (long) *ptr;
|
||||
free_mem_ptr = (unsigned long) *ptr;
|
||||
}
|
||||
|
||||
static void scroll(void)
|
||||
@@ -179,7 +258,7 @@ static void putstr(const char *s)
|
||||
y--;
|
||||
}
|
||||
} else {
|
||||
vidmem [ ( x + cols * y ) * 2 ] = c;
|
||||
vidmem [ ( x + cols * y ) * 2 ] = c;
|
||||
if ( ++x >= cols ) {
|
||||
x = 0;
|
||||
if ( ++y >= lines ) {
|
||||
@@ -224,58 +303,31 @@ static void* memcpy(void* dest, const void* src, unsigned n)
|
||||
*/
|
||||
static int fill_inbuf(void)
|
||||
{
|
||||
if (insize != 0) {
|
||||
error("ran out of input data");
|
||||
}
|
||||
|
||||
inbuf = input_data;
|
||||
insize = input_len;
|
||||
inptr = 1;
|
||||
return inbuf[0];
|
||||
error("ran out of input data");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
* Write the output window window[0..outcnt-1] and update crc and bytes_out.
|
||||
* (Used for the decompressed data only.)
|
||||
*/
|
||||
static void flush_window_low(void)
|
||||
{
|
||||
ulg c = crc; /* temporary variable */
|
||||
unsigned n;
|
||||
uch *in, *out, ch;
|
||||
|
||||
in = window;
|
||||
out = &output_data[output_ptr];
|
||||
for (n = 0; n < outcnt; n++) {
|
||||
ch = *out++ = *in++;
|
||||
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
|
||||
}
|
||||
crc = c;
|
||||
bytes_out += (ulg)outcnt;
|
||||
output_ptr += (ulg)outcnt;
|
||||
outcnt = 0;
|
||||
}
|
||||
|
||||
static void flush_window_high(void)
|
||||
{
|
||||
ulg c = crc; /* temporary variable */
|
||||
unsigned n;
|
||||
uch *in, ch;
|
||||
in = window;
|
||||
for (n = 0; n < outcnt; n++) {
|
||||
ch = *output_data++ = *in++;
|
||||
if ((ulg)output_data == low_buffer_end) output_data=high_buffer_start;
|
||||
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
|
||||
}
|
||||
crc = c;
|
||||
bytes_out += (ulg)outcnt;
|
||||
outcnt = 0;
|
||||
}
|
||||
|
||||
static void flush_window(void)
|
||||
{
|
||||
if (high_loaded) flush_window_high();
|
||||
else flush_window_low();
|
||||
/* With my window equal to my output buffer
|
||||
* I only need to compute the crc here.
|
||||
*/
|
||||
ulg c = crc; /* temporary variable */
|
||||
unsigned n;
|
||||
uch *in, ch;
|
||||
|
||||
in = window;
|
||||
for (n = 0; n < outcnt; n++) {
|
||||
ch = *in++;
|
||||
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
|
||||
}
|
||||
crc = c;
|
||||
bytes_out += (ulg)outcnt;
|
||||
outcnt = 0;
|
||||
}
|
||||
|
||||
static void error(char *x)
|
||||
@@ -287,66 +339,8 @@ static void error(char *x)
|
||||
while(1); /* Halt */
|
||||
}
|
||||
|
||||
#define STACK_SIZE (4096)
|
||||
|
||||
long user_stack [STACK_SIZE];
|
||||
|
||||
struct {
|
||||
long * a;
|
||||
short b;
|
||||
} stack_start = { & user_stack [STACK_SIZE] , __BOOT_DS };
|
||||
|
||||
static void setup_normal_output_buffer(void)
|
||||
{
|
||||
#ifdef STANDARD_MEMORY_BIOS_CALL
|
||||
if (RM_EXT_MEM_K < 1024) error("Less than 2MB of memory");
|
||||
#else
|
||||
if ((RM_ALT_MEM_K > RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) < 1024) error("Less than 2MB of memory");
|
||||
#endif
|
||||
output_data = (unsigned char *)__PHYSICAL_START; /* Normally Points to 1M */
|
||||
free_mem_end_ptr = (long)real_mode;
|
||||
}
|
||||
|
||||
struct moveparams {
|
||||
uch *low_buffer_start; int lcount;
|
||||
uch *high_buffer_start; int hcount;
|
||||
};
|
||||
|
||||
static void setup_output_buffer_if_we_run_high(struct moveparams *mv)
|
||||
{
|
||||
high_buffer_start = (uch *)(((ulg)&end) + HEAP_SIZE);
|
||||
#ifdef STANDARD_MEMORY_BIOS_CALL
|
||||
if (RM_EXT_MEM_K < (3*1024)) error("Less than 4MB of memory");
|
||||
#else
|
||||
if ((RM_ALT_MEM_K > RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) < (3*1024)) error("Less than 4MB of memory");
|
||||
#endif
|
||||
mv->low_buffer_start = output_data = (unsigned char *)LOW_BUFFER_START;
|
||||
low_buffer_end = ((unsigned int)real_mode > LOW_BUFFER_MAX
|
||||
? LOW_BUFFER_MAX : (unsigned int)real_mode) & ~0xfff;
|
||||
low_buffer_size = low_buffer_end - LOW_BUFFER_START;
|
||||
high_loaded = 1;
|
||||
free_mem_end_ptr = (long)high_buffer_start;
|
||||
if ( (__PHYSICAL_START + low_buffer_size) > ((ulg)high_buffer_start)) {
|
||||
high_buffer_start = (uch *)(__PHYSICAL_START + low_buffer_size);
|
||||
mv->hcount = 0; /* say: we need not to move high_buffer */
|
||||
}
|
||||
else mv->hcount = -1;
|
||||
mv->high_buffer_start = high_buffer_start;
|
||||
}
|
||||
|
||||
static void close_output_buffer_if_we_run_high(struct moveparams *mv)
|
||||
{
|
||||
if (bytes_out > low_buffer_size) {
|
||||
mv->lcount = low_buffer_size;
|
||||
if (mv->hcount)
|
||||
mv->hcount = bytes_out - low_buffer_size;
|
||||
} else {
|
||||
mv->lcount = bytes_out;
|
||||
mv->hcount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
asmlinkage int decompress_kernel(struct moveparams *mv, void *rmode)
|
||||
asmlinkage void decompress_kernel(void *rmode, unsigned long end,
|
||||
uch *input_data, unsigned long input_len, uch *output)
|
||||
{
|
||||
real_mode = rmode;
|
||||
|
||||
@@ -361,13 +355,25 @@ asmlinkage int decompress_kernel(struct moveparams *mv, void *rmode)
|
||||
lines = RM_SCREEN_INFO.orig_video_lines;
|
||||
cols = RM_SCREEN_INFO.orig_video_cols;
|
||||
|
||||
if (free_mem_ptr < 0x100000) setup_normal_output_buffer();
|
||||
else setup_output_buffer_if_we_run_high(mv);
|
||||
window = output; /* Output buffer (Normally at 1M) */
|
||||
free_mem_ptr = end; /* Heap */
|
||||
free_mem_end_ptr = end + HEAP_SIZE;
|
||||
inbuf = input_data; /* Input buffer */
|
||||
insize = input_len;
|
||||
inptr = 0;
|
||||
|
||||
if ((u32)output & (CONFIG_PHYSICAL_ALIGN -1))
|
||||
error("Destination address not CONFIG_PHYSICAL_ALIGN aligned");
|
||||
if (end > ((-__PAGE_OFFSET-(512 <<20)-1) & 0x7fffffff))
|
||||
error("Destination address too large");
|
||||
#ifndef CONFIG_RELOCATABLE
|
||||
if ((u32)output != LOAD_PHYSICAL_ADDR)
|
||||
error("Wrong destination address");
|
||||
#endif
|
||||
|
||||
makecrc();
|
||||
putstr("Uncompressing Linux... ");
|
||||
gunzip();
|
||||
putstr("Ok, booting the kernel.\n");
|
||||
if (high_loaded) close_output_buffer_if_we_run_high(mv);
|
||||
return high_loaded;
|
||||
return;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,43 @@
|
||||
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
|
||||
OUTPUT_ARCH(i386)
|
||||
ENTRY(startup_32)
|
||||
SECTIONS
|
||||
{
|
||||
/* Be careful parts of head.S assume startup_32 is at
|
||||
* address 0.
|
||||
*/
|
||||
. = 0 ;
|
||||
.text.head : {
|
||||
_head = . ;
|
||||
*(.text.head)
|
||||
_ehead = . ;
|
||||
}
|
||||
.data.compressed : {
|
||||
*(.data.compressed)
|
||||
}
|
||||
.text : {
|
||||
_text = .; /* Text */
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
_etext = . ;
|
||||
}
|
||||
.rodata : {
|
||||
_rodata = . ;
|
||||
*(.rodata) /* read-only data */
|
||||
*(.rodata.*)
|
||||
_erodata = . ;
|
||||
}
|
||||
.data : {
|
||||
_data = . ;
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
_edata = . ;
|
||||
}
|
||||
.bss : {
|
||||
_bss = . ;
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(COMMON)
|
||||
_end = . ;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
SECTIONS
|
||||
{
|
||||
.data : {
|
||||
.data.compressed : {
|
||||
input_len = .;
|
||||
LONG(input_data_end - input_data) input_data = .;
|
||||
*(.data)
|
||||
output_len = . - 4;
|
||||
input_data_end = .;
|
||||
}
|
||||
}
|
||||
|
||||
+33
-9
@@ -81,7 +81,7 @@ start:
|
||||
# This is the setup header, and it must start at %cs:2 (old 0x9020:2)
|
||||
|
||||
.ascii "HdrS" # header signature
|
||||
.word 0x0204 # header version number (>= 0x0105)
|
||||
.word 0x0205 # header version number (>= 0x0105)
|
||||
# or else old loadlin-1.5 will fail)
|
||||
realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
|
||||
start_sys_seg: .word SYSSEG
|
||||
@@ -160,6 +160,17 @@ ramdisk_max: .long (-__PAGE_OFFSET-(512 << 20)-1) & 0x7fffffff
|
||||
# The highest safe address for
|
||||
# the contents of an initrd
|
||||
|
||||
kernel_alignment: .long CONFIG_PHYSICAL_ALIGN #physical addr alignment
|
||||
#required for protected mode
|
||||
#kernel
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
relocatable_kernel: .byte 1
|
||||
#else
|
||||
relocatable_kernel: .byte 0
|
||||
#endif
|
||||
pad2: .byte 0
|
||||
pad3: .word 0
|
||||
|
||||
trampoline: call start_of_setup
|
||||
.align 16
|
||||
# The offset at this point is 0x240
|
||||
@@ -588,11 +599,6 @@ rmodeswtch_normal:
|
||||
call default_switch
|
||||
|
||||
rmodeswtch_end:
|
||||
# we get the code32 start address and modify the below 'jmpi'
|
||||
# (loader may have changed it)
|
||||
movl %cs:code32_start, %eax
|
||||
movl %eax, %cs:code32
|
||||
|
||||
# Now we move the system to its rightful place ... but we check if we have a
|
||||
# big-kernel. In that case we *must* not move it ...
|
||||
testb $LOADED_HIGH, %cs:loadflags
|
||||
@@ -788,11 +794,12 @@ a20_err_msg:
|
||||
a20_done:
|
||||
|
||||
#endif /* CONFIG_X86_VOYAGER */
|
||||
# set up gdt and idt
|
||||
# set up gdt and idt and 32bit start address
|
||||
lidt idt_48 # load idt with 0,0
|
||||
xorl %eax, %eax # Compute gdt_base
|
||||
movw %ds, %ax # (Convert %ds:gdt to a linear ptr)
|
||||
shll $4, %eax
|
||||
addl %eax, code32
|
||||
addl $gdt, %eax
|
||||
movl %eax, (gdt_48+2)
|
||||
lgdt gdt_48 # load gdt with whatever is
|
||||
@@ -851,9 +858,26 @@ flush_instr:
|
||||
# Manual, Mixing 16-bit and 32-bit code, page 16-6)
|
||||
|
||||
.byte 0x66, 0xea # prefix + jmpi-opcode
|
||||
code32: .long 0x1000 # will be set to 0x100000
|
||||
# for big kernels
|
||||
code32: .long startup_32 # will be set to %cs+startup_32
|
||||
.word __BOOT_CS
|
||||
.code32
|
||||
startup_32:
|
||||
movl $(__BOOT_DS), %eax
|
||||
movl %eax, %ds
|
||||
movl %eax, %es
|
||||
movl %eax, %fs
|
||||
movl %eax, %gs
|
||||
movl %eax, %ss
|
||||
|
||||
xorl %eax, %eax
|
||||
1: incl %eax # check that A20 really IS enabled
|
||||
movl %eax, 0x00000000 # loop forever if it isn't
|
||||
cmpl %eax, 0x00100000
|
||||
je 1b
|
||||
|
||||
# Jump to the 32bit entry point
|
||||
jmpl *(code32_start - start + (DELTA_INITSEG << 4))(%esi)
|
||||
.code16
|
||||
|
||||
# Here's a bunch of information about your current kernel..
|
||||
kernel_version: .ascii UTS_RELEASE
|
||||
|
||||
+13
-9
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.19-rc2-git4
|
||||
# Sat Oct 21 03:38:56 2006
|
||||
# Linux kernel version: 2.6.19-git7
|
||||
# Wed Dec 6 23:50:49 2006
|
||||
#
|
||||
CONFIG_X86_32=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
@@ -40,13 +40,14 @@ CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_CPUSETS is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_UID16=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
@@ -110,6 +111,7 @@ CONFIG_SMP=y
|
||||
# CONFIG_X86_VISWS is not set
|
||||
CONFIG_X86_GENERICARCH=y
|
||||
# CONFIG_X86_ES7000 is not set
|
||||
# CONFIG_PARAVIRT is not set
|
||||
CONFIG_X86_CYCLONE_TIMER=y
|
||||
# CONFIG_M386 is not set
|
||||
# CONFIG_M486 is not set
|
||||
@@ -120,6 +122,7 @@ CONFIG_X86_CYCLONE_TIMER=y
|
||||
# CONFIG_MPENTIUMII is not set
|
||||
CONFIG_MPENTIUMIII=y
|
||||
# CONFIG_MPENTIUMM is not set
|
||||
# CONFIG_MCORE2 is not set
|
||||
# CONFIG_MPENTIUM4 is not set
|
||||
# CONFIG_MK6 is not set
|
||||
# CONFIG_MK7 is not set
|
||||
@@ -197,7 +200,6 @@ CONFIG_RESOURCES_64BIT=y
|
||||
CONFIG_MTRR=y
|
||||
# CONFIG_EFI is not set
|
||||
# CONFIG_IRQBALANCE is not set
|
||||
CONFIG_REGPARM=y
|
||||
CONFIG_SECCOMP=y
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
@@ -205,7 +207,8 @@ CONFIG_HZ_250=y
|
||||
CONFIG_HZ=250
|
||||
# CONFIG_KEXEC is not set
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
CONFIG_PHYSICAL_START=0x100000
|
||||
# CONFIG_RELOCATABLE is not set
|
||||
CONFIG_PHYSICAL_ALIGN=0x100000
|
||||
# CONFIG_HOTPLUG_CPU is not set
|
||||
CONFIG_COMPAT_VDSO=y
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
@@ -367,6 +370,7 @@ CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_TCP_MD5SIG is not set
|
||||
CONFIG_IPV6=y
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
# CONFIG_IPV6_ROUTER_PREF is not set
|
||||
@@ -677,6 +681,7 @@ CONFIG_SATA_INTEL_COMBINED=y
|
||||
# CONFIG_PATA_IT821X is not set
|
||||
# CONFIG_PATA_JMICRON is not set
|
||||
# CONFIG_PATA_TRIFLEX is not set
|
||||
# CONFIG_PATA_MARVELL is not set
|
||||
# CONFIG_PATA_MPIIX is not set
|
||||
# CONFIG_PATA_OLDPIIX is not set
|
||||
# CONFIG_PATA_NETCELL is not set
|
||||
@@ -850,6 +855,7 @@ CONFIG_BNX2=y
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
# CONFIG_MYRI10GE is not set
|
||||
# CONFIG_NETXEN_NIC is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
@@ -984,10 +990,6 @@ CONFIG_RTC=y
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
# CONFIG_SONYPI is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
CONFIG_AGP=y
|
||||
# CONFIG_AGP_ALI is not set
|
||||
# CONFIG_AGP_ATI is not set
|
||||
@@ -1108,6 +1110,7 @@ CONFIG_USB_DEVICEFS=y
|
||||
# CONFIG_USB_BANDWIDTH is not set
|
||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||
# CONFIG_USB_SUSPEND is not set
|
||||
# CONFIG_USB_MULTITHREAD_PROBE is not set
|
||||
# CONFIG_USB_OTG is not set
|
||||
|
||||
#
|
||||
@@ -1185,6 +1188,7 @@ CONFIG_USB_HIDINPUT=y
|
||||
# CONFIG_USB_KAWETH is not set
|
||||
# CONFIG_USB_PEGASUS is not set
|
||||
# CONFIG_USB_RTL8150 is not set
|
||||
# CONFIG_USB_USBNET_MII is not set
|
||||
# CONFIG_USB_USBNET is not set
|
||||
CONFIG_USB_MON=y
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ extra-y := head.o init_task.o vmlinux.lds
|
||||
|
||||
obj-y := process.o signal.o entry.o traps.o irq.o \
|
||||
ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
|
||||
pci-dma.o i386_ksyms.o i387.o bootflag.o \
|
||||
pci-dma.o i386_ksyms.o i387.o bootflag.o e820.o\
|
||||
quirks.o i8237.o topology.o alternative.o i8253.o tsc.o
|
||||
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
@@ -40,6 +40,9 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_HPET_TIMER) += hpet.o
|
||||
obj-$(CONFIG_K8_NB) += k8.o
|
||||
|
||||
# Make sure this is linked after any other paravirt_ops structs: see head.S
|
||||
obj-$(CONFIG_PARAVIRT) += paravirt.o
|
||||
|
||||
EXTRA_AFLAGS := -traditional
|
||||
|
||||
obj-$(CONFIG_SCx200) += scx200.o
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user