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: (231 commits) [PATCH] i386: Don't delete cpu_devs data to identify different x86 types in late_initcall [PATCH] i386: type may be unused [PATCH] i386: Some additional chipset register values validation. [PATCH] i386: Add missing !X86_PAE dependincy to the 2G/2G split. [PATCH] x86-64: Don't exclude asm-offsets.c in Documentation/dontdiff [PATCH] i386: avoid redundant preempt_disable in __unlazy_fpu [PATCH] i386: white space fixes in i387.h [PATCH] i386: Drop noisy e820 debugging printks [PATCH] x86-64: Fix allnoconfig error in genapic_flat.c [PATCH] x86-64: Shut up warnings for vfat compat ioctls on other file systems [PATCH] x86-64: Share identical video.S between i386 and x86-64 [PATCH] x86-64: Remove CONFIG_REORDER [PATCH] x86-64: Print type and size correctly for unknown compat ioctls [PATCH] i386: Remove copy_*_user BUG_ONs for (size < 0) [PATCH] i386: Little cleanups in smpboot.c [PATCH] x86-64: Don't enable NUMA for a single node in K8 NUMA scanning [PATCH] x86: Use RDTSCP for synchronous get_cycles if possible [PATCH] i386: Add X86_FEATURE_RDTSCP [PATCH] i386: Implement X86_FEATURE_SYNC_RDTSC on i386 [PATCH] i386: Implement alternative_io for i386 ... Fix up trivial conflict in include/linux/highmem.h manually. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
+43
-18
@@ -415,13 +415,13 @@ config OUT_OF_LINE_PFN_TO_PAGE
|
||||
depends on DISCONTIGMEM
|
||||
|
||||
config NR_CPUS
|
||||
int "Maximum number of CPUs (2-256)"
|
||||
int "Maximum number of CPUs (2-255)"
|
||||
range 2 255
|
||||
depends on SMP
|
||||
default "8"
|
||||
help
|
||||
This allows you to specify the maximum number of CPUs which this
|
||||
kernel will support. Current maximum is 256 CPUs due to
|
||||
kernel will support. Current maximum is 255 CPUs due to
|
||||
APIC addressing limits. Less depending on the hardware.
|
||||
|
||||
This is purely to save memory - each supported CPU requires
|
||||
@@ -565,23 +565,56 @@ config CRASH_DUMP
|
||||
PHYSICAL_START.
|
||||
For more details see Documentation/kdump/kdump.txt
|
||||
|
||||
config RELOCATABLE
|
||||
bool "Build a relocatable kernel(EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
Builds a relocatable kernel. This enables loading and running
|
||||
a kernel binary from a different physical address than it has
|
||||
been compiled for.
|
||||
|
||||
One use is for the kexec on panic case where the recovery kernel
|
||||
must live at a different physical address than the primary
|
||||
kernel.
|
||||
|
||||
Note: If CONFIG_RELOCATABLE=y, then kernel run from the address
|
||||
it has been loaded at and compile time physical address
|
||||
(CONFIG_PHYSICAL_START) is ignored.
|
||||
|
||||
config PHYSICAL_START
|
||||
hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP)
|
||||
default "0x1000000" if CRASH_DUMP
|
||||
default "0x200000"
|
||||
help
|
||||
This gives the physical address where the kernel is loaded. Normally
|
||||
for regular kernels this value is 0x200000 (2MB). 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
|
||||
This gives the physical address where the kernel is loaded. It
|
||||
should be aligned to 2MB boundary.
|
||||
|
||||
If kernel is a not relocatable (CONFIG_RELOCATABLE=n) then
|
||||
bzImage will decompress itself to above physical address and
|
||||
run from there. Otherwise, bzImage will run from the address where
|
||||
it has been loaded by the boot loader and will ignore above physical
|
||||
address.
|
||||
|
||||
In normal kdump cases one does not have to set/change this option
|
||||
as now bzImage can be compiled as a completely relocatable image
|
||||
(CONFIG_RELOCATABLE=y) and be used to load and run from a different
|
||||
address. This option is mainly useful for the folks who don't want
|
||||
to use a bzImage for capturing the crash dump and want to use a
|
||||
vmlinux instead.
|
||||
|
||||
So if you are using bzImage for capturing the crash dump, leave
|
||||
the value here unchanged to 0x200000 and set CONFIG_RELOCATABLE=y.
|
||||
Otherwise if you plan to use vmlinux for capturing the crash dump
|
||||
change this value to start of the reserved region (Typically 16MB
|
||||
0x1000000). In other words, it can 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.
|
||||
|
||||
Usage of bzImage for capturing the crash dump is advantageous as
|
||||
one does not have to build two kernels. Same kernel can be used
|
||||
as production kernel and capture kernel.
|
||||
|
||||
Don't change this unless you know what you are doing.
|
||||
|
||||
config SECCOMP
|
||||
@@ -627,14 +660,6 @@ config CC_STACKPROTECTOR_ALL
|
||||
|
||||
source kernel/Kconfig.hz
|
||||
|
||||
config REORDER
|
||||
bool "Function reordering"
|
||||
default n
|
||||
help
|
||||
This option enables the toolchain to reorder functions for a more
|
||||
optimal TLB usage. If you have pretty much any version of binutils,
|
||||
this can increase your kernel build time by roughly one minute.
|
||||
|
||||
config K8_NB
|
||||
def_bool y
|
||||
depends on AGP_AMD64 || IOMMU || (PCI && NUMA)
|
||||
|
||||
@@ -40,10 +40,6 @@ cflags-y += -m64
|
||||
cflags-y += -mno-red-zone
|
||||
cflags-y += -mcmodel=kernel
|
||||
cflags-y += -pipe
|
||||
cflags-kernel-$(CONFIG_REORDER) += -ffunction-sections
|
||||
# this makes reading assembly source easier, but produces worse code
|
||||
# actually it makes the kernel smaller too.
|
||||
cflags-y += -fno-reorder-blocks
|
||||
cflags-y += -Wno-sign-compare
|
||||
cflags-y += -fno-asynchronous-unwind-tables
|
||||
ifneq ($(CONFIG_DEBUG_INFO),y)
|
||||
|
||||
@@ -36,7 +36,7 @@ subdir- := compressed/ #Let make clean descend in compressed/
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
$(obj)/bzImage: IMAGE_OFFSET := 0x100000
|
||||
$(obj)/bzImage: EXTRA_AFLAGS := -traditional $(SVGA_MODE) $(RAMDISK) -D__BIG_KERNEL__
|
||||
$(obj)/bzImage: EXTRA_AFLAGS := $(SVGA_MODE) $(RAMDISK) -D__BIG_KERNEL__
|
||||
$(obj)/bzImage: BUILDFLAGS := -b
|
||||
|
||||
quiet_cmd_image = BUILD $@
|
||||
|
||||
@@ -8,16 +8,14 @@
|
||||
|
||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o piggy.o
|
||||
EXTRA_AFLAGS := -traditional
|
||||
AFLAGS := $(subst -m64,-m32,$(AFLAGS))
|
||||
|
||||
# cannot use EXTRA_CFLAGS because base CFLAGS contains -mkernel which conflicts with
|
||||
# -m32
|
||||
CFLAGS := -m32 -D__KERNEL__ -Iinclude -O2 -fno-strict-aliasing
|
||||
LDFLAGS := -m elf_i386
|
||||
CFLAGS := -m64 -D__KERNEL__ -Iinclude -O2 -fno-strict-aliasing -fPIC -mcmodel=small -fno-builtin
|
||||
LDFLAGS := -m elf_x86_64
|
||||
|
||||
LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup_32 -m elf_i386
|
||||
|
||||
$(obj)/vmlinux: $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o FORCE
|
||||
LDFLAGS_vmlinux := -T
|
||||
$(obj)/vmlinux: $(src)/vmlinux.lds $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o FORCE
|
||||
$(call if_changed,ld)
|
||||
@:
|
||||
|
||||
@@ -27,7 +25,7 @@ $(obj)/vmlinux.bin: vmlinux FORCE
|
||||
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
LDFLAGS_piggy.o := -r --format binary --oformat elf32-i386 -T
|
||||
LDFLAGS_piggy.o := -r --format binary --oformat elf64-x86-64 -T
|
||||
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
|
||||
$(call if_changed,ld)
|
||||
|
||||
@@ -26,116 +26,279 @@
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/msr.h>
|
||||
|
||||
.section ".text.head"
|
||||
.code32
|
||||
.globl startup_32
|
||||
|
||||
|
||||
startup_32:
|
||||
cld
|
||||
cli
|
||||
movl $(__KERNEL_DS),%eax
|
||||
movl %eax,%ds
|
||||
movl %eax,%es
|
||||
movl %eax,%fs
|
||||
movl %eax,%gs
|
||||
movl $(__KERNEL_DS), %eax
|
||||
movl %eax, %ds
|
||||
movl %eax, %es
|
||||
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
|
||||
|
||||
/* setup a stack and make sure cpu supports long mode. */
|
||||
movl $user_stack_end, %eax
|
||||
addl %ebp, %eax
|
||||
movl %eax, %esp
|
||||
|
||||
call verify_cpu
|
||||
testl %eax, %eax
|
||||
jnz no_longmode
|
||||
|
||||
/* Compute the delta between where we were compiled to run at
|
||||
* and where the code will actually run at.
|
||||
*/
|
||||
/* %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 $(LARGE_PAGE_SIZE -1), %ebx
|
||||
andl $LARGE_PAGE_MASK, %ebx
|
||||
#else
|
||||
movl $CONFIG_PHYSICAL_START, %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 and align on a 4K boundary */
|
||||
addl $(32768 + 18 + 4095), %ebx
|
||||
andl $~4095, %ebx
|
||||
|
||||
/*
|
||||
* 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.
|
||||
* Prepare for entering 64 bit mode
|
||||
*/
|
||||
pushl $0
|
||||
popfl
|
||||
|
||||
/* Load new GDT with the 64bit segments using 32bit descriptor */
|
||||
leal gdt(%ebp), %eax
|
||||
movl %eax, gdt+2(%ebp)
|
||||
lgdt gdt(%ebp)
|
||||
|
||||
/* Enable PAE mode */
|
||||
xorl %eax, %eax
|
||||
orl $(1 << 5), %eax
|
||||
movl %eax, %cr4
|
||||
|
||||
/*
|
||||
* Build early 4G boot pagetable
|
||||
*/
|
||||
/* Initialize Page tables to 0*/
|
||||
leal pgtable(%ebx), %edi
|
||||
xorl %eax, %eax
|
||||
movl $((4096*6)/4), %ecx
|
||||
rep stosl
|
||||
|
||||
/* Build Level 4 */
|
||||
leal pgtable + 0(%ebx), %edi
|
||||
leal 0x1007 (%edi), %eax
|
||||
movl %eax, 0(%edi)
|
||||
|
||||
/* Build Level 3 */
|
||||
leal pgtable + 0x1000(%ebx), %edi
|
||||
leal 0x1007(%edi), %eax
|
||||
movl $4, %ecx
|
||||
1: movl %eax, 0x00(%edi)
|
||||
addl $0x00001000, %eax
|
||||
addl $8, %edi
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
|
||||
/* Build Level 2 */
|
||||
leal pgtable + 0x2000(%ebx), %edi
|
||||
movl $0x00000183, %eax
|
||||
movl $2048, %ecx
|
||||
1: movl %eax, 0(%edi)
|
||||
addl $0x00200000, %eax
|
||||
addl $8, %edi
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
|
||||
/* Enable the boot page tables */
|
||||
leal pgtable(%ebx), %eax
|
||||
movl %eax, %cr3
|
||||
|
||||
/* Enable Long mode in EFER (Extended Feature Enable Register) */
|
||||
movl $MSR_EFER, %ecx
|
||||
rdmsr
|
||||
btsl $_EFER_LME, %eax
|
||||
wrmsr
|
||||
|
||||
/* Setup for the jump to 64bit mode
|
||||
*
|
||||
* When the jump is performend we will be in long mode but
|
||||
* in 32bit compatibility mode with EFER.LME = 1, CS.L = 0, CS.D = 1
|
||||
* (and in turn EFER.LMA = 1). To jump into 64bit mode we use
|
||||
* the new gdt/idt that has __KERNEL_CS with CS.L = 1.
|
||||
* We place all of the values on our mini stack so lret can
|
||||
* used to perform that far jump.
|
||||
*/
|
||||
pushl $__KERNEL_CS
|
||||
leal startup_64(%ebp), %eax
|
||||
pushl %eax
|
||||
|
||||
/* Enter paged protected Mode, activating Long Mode */
|
||||
movl $0x80000001, %eax /* Enable Paging and Protected mode */
|
||||
movl %eax, %cr0
|
||||
|
||||
/* Jump from 32bit compatibility mode into 64bit mode. */
|
||||
lret
|
||||
|
||||
no_longmode:
|
||||
/* This isn't an x86-64 CPU so hang */
|
||||
1:
|
||||
hlt
|
||||
jmp 1b
|
||||
|
||||
#include "../../kernel/verify_cpu.S"
|
||||
|
||||
/* Be careful here startup_64 needs to be at a predictable
|
||||
* address so I can export it in an ELF header. Bootloaders
|
||||
* should look at the ELF header to find this address, as
|
||||
* it may change in the future.
|
||||
*/
|
||||
.code64
|
||||
.org 0x200
|
||||
ENTRY(startup_64)
|
||||
/* We come here either from startup_32 or directly from a
|
||||
* 64bit bootloader. If we come here from a bootloader we depend on
|
||||
* an identity mapped page table being provied that maps our
|
||||
* entire text+data+bss and hopefully all of memory.
|
||||
*/
|
||||
|
||||
/* Setup data segments. */
|
||||
xorl %eax, %eax
|
||||
movl %eax, %ds
|
||||
movl %eax, %es
|
||||
movl %eax, %ss
|
||||
|
||||
/* Compute the decompressed kernel start address. It is where
|
||||
* we were loaded at aligned to a 2M boundary. %rbp contains the
|
||||
* decompressed kernel start address.
|
||||
*
|
||||
* If it is a relocatable kernel then decompress and run the kernel
|
||||
* from load address aligned to 2MB addr, otherwise decompress and
|
||||
* run the kernel from CONFIG_PHYSICAL_START
|
||||
*/
|
||||
|
||||
/* Start with the delta to where the kernel will run at. */
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
leaq startup_32(%rip) /* - $startup_32 */, %rbp
|
||||
addq $(LARGE_PAGE_SIZE - 1), %rbp
|
||||
andq $LARGE_PAGE_MASK, %rbp
|
||||
movq %rbp, %rbx
|
||||
#else
|
||||
movq $CONFIG_PHYSICAL_START, %rbp
|
||||
movq %rbp, %rbx
|
||||
#endif
|
||||
|
||||
/* Replace the compressed data size with the uncompressed size */
|
||||
movl input_len(%rip), %eax
|
||||
subq %rax, %rbx
|
||||
movl output_len(%rip), %eax
|
||||
addq %rax, %rbx
|
||||
/* Add 8 bytes for every 32K input block */
|
||||
shrq $12, %rax
|
||||
addq %rax, %rbx
|
||||
/* Add 32K + 18 bytes of extra slack and align on a 4K boundary */
|
||||
addq $(32768 + 18 + 4095), %rbx
|
||||
andq $~4095, %rbx
|
||||
|
||||
/* Copy the compressed kernel to the end of our buffer
|
||||
* where decompression in place becomes safe.
|
||||
*/
|
||||
leaq _end(%rip), %r8
|
||||
leaq _end(%rbx), %r9
|
||||
movq $_end /* - $startup_32 */, %rcx
|
||||
1: subq $8, %r8
|
||||
subq $8, %r9
|
||||
movq 0(%r8), %rax
|
||||
movq %rax, 0(%r9)
|
||||
subq $8, %rcx
|
||||
jnz 1b
|
||||
|
||||
/*
|
||||
* Jump to the relocated address.
|
||||
*/
|
||||
leaq relocated(%rbx), %rax
|
||||
jmp *%rax
|
||||
|
||||
.section ".text"
|
||||
relocated:
|
||||
|
||||
/*
|
||||
* Clear BSS
|
||||
*/
|
||||
xorl %eax,%eax
|
||||
movl $_edata,%edi
|
||||
movl $_end,%ecx
|
||||
subl %edi,%ecx
|
||||
xorq %rax, %rax
|
||||
leaq _edata(%rbx), %rdi
|
||||
leaq _end(%rbx), %rcx
|
||||
subq %rdi, %rcx
|
||||
cld
|
||||
rep
|
||||
stosb
|
||||
|
||||
/* Setup the stack */
|
||||
leaq user_stack_end(%rip), %rsp
|
||||
|
||||
/* zero EFLAGS after setting rsp */
|
||||
pushq $0
|
||||
popfq
|
||||
|
||||
/*
|
||||
* Do the decompression, and jump to the new kernel..
|
||||
*/
|
||||
subl $16,%esp # place for structure on the stack
|
||||
movl %esp,%eax
|
||||
pushl %esi # real mode pointer as second arg
|
||||
pushl %eax # address of structure as first arg
|
||||
call decompress_kernel
|
||||
orl %eax,%eax
|
||||
jnz 3f
|
||||
addl $8,%esp
|
||||
xorl %ebx,%ebx
|
||||
ljmp $(__KERNEL_CS), $__PHYSICAL_START
|
||||
pushq %rsi # Save the real mode argument
|
||||
movq %rsi, %rdi # real mode address
|
||||
leaq _heap(%rip), %rsi # _heap
|
||||
leaq input_data(%rip), %rdx # input_data
|
||||
movl input_len(%rip), %eax
|
||||
movq %rax, %rcx # input_len
|
||||
movq %rbp, %r8 # output
|
||||
call decompress_kernel
|
||||
popq %rsi
|
||||
|
||||
|
||||
/*
|
||||
* 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 %esi,%ebx
|
||||
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
|
||||
jmp *%rbp
|
||||
|
||||
popl %esi # discard the address
|
||||
addl $4,%esp # 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 $(__KERNEL_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 $(__KERNEL_CS), $__PHYSICAL_START
|
||||
move_routine_end:
|
||||
|
||||
|
||||
/* Stack for uncompression */
|
||||
.align 32
|
||||
user_stack:
|
||||
.data
|
||||
gdt:
|
||||
.word gdt_end - gdt
|
||||
.long gdt
|
||||
.word 0
|
||||
.quad 0x0000000000000000 /* NULL descriptor */
|
||||
.quad 0x00af9a000000ffff /* __KERNEL_CS */
|
||||
.quad 0x00cf92000000ffff /* __KERNEL_DS */
|
||||
gdt_end:
|
||||
.bss
|
||||
/* Stack for uncompression */
|
||||
.balign 4
|
||||
user_stack:
|
||||
.fill 4096,4,0
|
||||
stack_start:
|
||||
.long user_stack+4096
|
||||
.word __KERNEL_DS
|
||||
|
||||
user_stack_end:
|
||||
|
||||
+130
-117
@@ -9,10 +9,95 @@
|
||||
* High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
|
||||
*/
|
||||
|
||||
#define _LINUX_STRING_H_ 1
|
||||
#define __LINUX_BITMAP_H 1
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/screen_info.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/page.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
|
||||
*/
|
||||
@@ -28,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 */
|
||||
@@ -87,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);
|
||||
@@ -98,17 +186,10 @@ 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_ptr;
|
||||
static 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)*/;
|
||||
#define HEAP_SIZE 0x7000
|
||||
|
||||
static char *vidmem = (char *)0xb8000;
|
||||
static int vidport;
|
||||
@@ -218,58 +299,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)
|
||||
@@ -281,57 +335,8 @@ static void error(char *x)
|
||||
while(1); /* Halt */
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
int decompress_kernel(struct moveparams *mv, void *rmode)
|
||||
asmlinkage void decompress_kernel(void *rmode, unsigned long heap,
|
||||
uch *input_data, unsigned long input_len, uch *output)
|
||||
{
|
||||
real_mode = rmode;
|
||||
|
||||
@@ -346,13 +351,21 @@ 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 = heap; /* Heap */
|
||||
free_mem_end_ptr = heap + HEAP_SIZE;
|
||||
inbuf = input_data; /* Input buffer */
|
||||
insize = input_len;
|
||||
inptr = 0;
|
||||
|
||||
if ((ulg)output & (__KERNEL_ALIGN - 1))
|
||||
error("Destination address not 2M aligned");
|
||||
if ((ulg)output >= 0xffffffffffUL)
|
||||
error("Destination address too large");
|
||||
|
||||
makecrc();
|
||||
putstr(".\nDecompressing Linux...");
|
||||
gunzip();
|
||||
putstr("done.\nBooting the kernel.\n");
|
||||
if (high_loaded) close_output_buffer_if_we_run_high(mv);
|
||||
return high_loaded;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
|
||||
OUTPUT_ARCH(i386:x86-64)
|
||||
ENTRY(startup_64)
|
||||
SECTIONS
|
||||
{
|
||||
/* Be careful parts of head.S assume startup_32 is at
|
||||
* address 0.
|
||||
*/
|
||||
. = 0;
|
||||
.text : {
|
||||
_head = . ;
|
||||
*(.text.head)
|
||||
_ehead = . ;
|
||||
*(.text.compressed)
|
||||
_text = .; /* Text */
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
_etext = . ;
|
||||
}
|
||||
.rodata : {
|
||||
_rodata = . ;
|
||||
*(.rodata) /* read-only data */
|
||||
*(.rodata.*)
|
||||
_erodata = . ;
|
||||
}
|
||||
.data : {
|
||||
_data = . ;
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
_edata = . ;
|
||||
}
|
||||
.bss : {
|
||||
_bss = . ;
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(COMMON)
|
||||
. = ALIGN(8);
|
||||
_end = . ;
|
||||
. = ALIGN(4096);
|
||||
pgtable = . ;
|
||||
. = . + 4096 * 6;
|
||||
_heap = .;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
SECTIONS
|
||||
{
|
||||
.data : {
|
||||
.text.compressed : {
|
||||
input_len = .;
|
||||
LONG(input_data_end - input_data) input_data = .;
|
||||
*(.data)
|
||||
input_data_end = .;
|
||||
LONG(input_data_end - input_data) input_data = .;
|
||||
*(.data)
|
||||
output_len = . - 4;
|
||||
input_data_end = .;
|
||||
}
|
||||
}
|
||||
|
||||
+22
-61
@@ -51,6 +51,7 @@
|
||||
#include <asm/boot.h>
|
||||
#include <asm/e820.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
/* Signature words to ensure LILO loaded us right */
|
||||
#define SIG1 0xAA55
|
||||
@@ -80,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 0x0206 # 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
|
||||
@@ -155,7 +156,20 @@ cmd_line_ptr: .long 0 # (Header version 0x0202 or later)
|
||||
# low memory 0x10000 or higher.
|
||||
|
||||
ramdisk_max: .long 0xffffffff
|
||||
|
||||
kernel_alignment: .long 0x200000 # physical addr alignment required for
|
||||
# protected mode relocatable kernel
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
relocatable_kernel: .byte 1
|
||||
#else
|
||||
relocatable_kernel: .byte 0
|
||||
#endif
|
||||
pad2: .byte 0
|
||||
pad3: .word 0
|
||||
|
||||
cmdline_size: .long COMMAND_LINE_SIZE-1 #length of the command line,
|
||||
#added with boot protocol
|
||||
#version 2.06
|
||||
|
||||
trampoline: call start_of_setup
|
||||
.align 16
|
||||
# The offset at this point is 0x240
|
||||
@@ -290,64 +304,10 @@ loader_ok:
|
||||
movw %cs,%ax
|
||||
movw %ax,%ds
|
||||
|
||||
/* minimum CPUID flags for x86-64 */
|
||||
/* see http://www.x86-64.org/lists/discuss/msg02971.html */
|
||||
#define SSE_MASK ((1<<25)|(1<<26))
|
||||
#define REQUIRED_MASK1 ((1<<0)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<8)|\
|
||||
(1<<13)|(1<<15)|(1<<24))
|
||||
#define REQUIRED_MASK2 (1<<29)
|
||||
call verify_cpu
|
||||
testl %eax,%eax
|
||||
jz sse_ok
|
||||
|
||||
pushfl /* standard way to check for cpuid */
|
||||
popl %eax
|
||||
movl %eax,%ebx
|
||||
xorl $0x200000,%eax
|
||||
pushl %eax
|
||||
popfl
|
||||
pushfl
|
||||
popl %eax
|
||||
cmpl %eax,%ebx
|
||||
jz no_longmode /* cpu has no cpuid */
|
||||
movl $0x0,%eax
|
||||
cpuid
|
||||
cmpl $0x1,%eax
|
||||
jb no_longmode /* no cpuid 1 */
|
||||
xor %di,%di
|
||||
cmpl $0x68747541,%ebx /* AuthenticAMD */
|
||||
jnz noamd
|
||||
cmpl $0x69746e65,%edx
|
||||
jnz noamd
|
||||
cmpl $0x444d4163,%ecx
|
||||
jnz noamd
|
||||
mov $1,%di /* cpu is from AMD */
|
||||
noamd:
|
||||
movl $0x1,%eax
|
||||
cpuid
|
||||
andl $REQUIRED_MASK1,%edx
|
||||
xorl $REQUIRED_MASK1,%edx
|
||||
jnz no_longmode
|
||||
movl $0x80000000,%eax
|
||||
cpuid
|
||||
cmpl $0x80000001,%eax
|
||||
jb no_longmode /* no extended cpuid */
|
||||
movl $0x80000001,%eax
|
||||
cpuid
|
||||
andl $REQUIRED_MASK2,%edx
|
||||
xorl $REQUIRED_MASK2,%edx
|
||||
jnz no_longmode
|
||||
sse_test:
|
||||
movl $1,%eax
|
||||
cpuid
|
||||
andl $SSE_MASK,%edx
|
||||
cmpl $SSE_MASK,%edx
|
||||
je sse_ok
|
||||
test %di,%di
|
||||
jz no_longmode /* only try to force SSE on AMD */
|
||||
movl $0xc0010015,%ecx /* HWCR */
|
||||
rdmsr
|
||||
btr $15,%eax /* enable SSE */
|
||||
wrmsr
|
||||
xor %di,%di /* don't loop */
|
||||
jmp sse_test /* try again */
|
||||
no_longmode:
|
||||
call beep
|
||||
lea long_mode_panic,%si
|
||||
@@ -357,7 +317,8 @@ no_longmode_loop:
|
||||
long_mode_panic:
|
||||
.string "Your CPU does not support long mode. Use a 32bit distribution."
|
||||
.byte 0
|
||||
|
||||
|
||||
#include "../kernel/verify_cpu.S"
|
||||
sse_ok:
|
||||
popw %ds
|
||||
|
||||
@@ -846,7 +807,7 @@ gdt_48:
|
||||
|
||||
# Include video setup & detection code
|
||||
|
||||
#include "video.S"
|
||||
#include "../../i386/boot/video.S"
|
||||
|
||||
# Setup signature -- must be last
|
||||
setup_sig1: .word SIG1
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+49
-134
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.21-rc3
|
||||
# Wed Mar 7 15:29:47 2007
|
||||
# Linux kernel version: 2.6.21-git3
|
||||
# Tue May 1 07:30:48 2007
|
||||
#
|
||||
CONFIG_X86_64=y
|
||||
CONFIG_64BIT=y
|
||||
@@ -118,11 +118,11 @@ CONFIG_X86_PC=y
|
||||
# CONFIG_X86_VSMP is not set
|
||||
# CONFIG_MK8 is not set
|
||||
# CONFIG_MPSC is not set
|
||||
# CONFIG_MCORE2 is not set
|
||||
CONFIG_GENERIC_CPU=y
|
||||
CONFIG_X86_L1_CACHE_BYTES=128
|
||||
CONFIG_X86_L1_CACHE_SHIFT=7
|
||||
CONFIG_X86_INTERNODE_CACHE_BYTES=128
|
||||
CONFIG_MCORE2=y
|
||||
# CONFIG_GENERIC_CPU is not set
|
||||
CONFIG_X86_L1_CACHE_BYTES=64
|
||||
CONFIG_X86_L1_CACHE_SHIFT=6
|
||||
CONFIG_X86_INTERNODE_CACHE_BYTES=64
|
||||
CONFIG_X86_TSC=y
|
||||
CONFIG_X86_GOOD_APIC=y
|
||||
# CONFIG_MICROCODE is not set
|
||||
@@ -174,6 +174,7 @@ CONFIG_X86_MCE_INTEL=y
|
||||
CONFIG_X86_MCE_AMD=y
|
||||
# CONFIG_KEXEC is not set
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
# CONFIG_RELOCATABLE is not set
|
||||
CONFIG_PHYSICAL_START=0x200000
|
||||
CONFIG_SECCOMP=y
|
||||
# CONFIG_CC_STACKPROTECTOR is not set
|
||||
@@ -182,7 +183,6 @@ CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_300 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
# CONFIG_REORDER is not set
|
||||
CONFIG_K8_NB=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
@@ -218,7 +218,6 @@ CONFIG_ACPI_HOTPLUG_CPU=y
|
||||
CONFIG_ACPI_THERMAL=y
|
||||
CONFIG_ACPI_NUMA=y
|
||||
# CONFIG_ACPI_ASUS is not set
|
||||
# CONFIG_ACPI_IBM is not set
|
||||
# CONFIG_ACPI_TOSHIBA is not set
|
||||
CONFIG_ACPI_BLACKLIST_YEAR=0
|
||||
# CONFIG_ACPI_DEBUG is not set
|
||||
@@ -243,7 +242,7 @@ CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
|
||||
#
|
||||
# CPUFreq processor drivers
|
||||
@@ -299,7 +298,6 @@ CONFIG_NET=y
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
@@ -334,6 +332,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
CONFIG_IPV6=y
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
# CONFIG_IPV6_ROUTER_PREF is not set
|
||||
# CONFIG_IPV6_OPTIMISTIC_DAD is not set
|
||||
# CONFIG_INET6_AH is not set
|
||||
# CONFIG_INET6_ESP is not set
|
||||
# CONFIG_INET6_IPCOMP is not set
|
||||
@@ -389,6 +388,13 @@ CONFIG_IPV6_SIT=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
|
||||
#
|
||||
# Wireless
|
||||
#
|
||||
# CONFIG_CFG80211 is not set
|
||||
# CONFIG_WIRELESS_EXT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
@@ -409,10 +415,6 @@ CONFIG_FW_LOADER=y
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
@@ -459,6 +461,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
# CONFIG_SONY_LAPTOP is not set
|
||||
# CONFIG_THINKPAD_ACPI is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
@@ -494,7 +497,6 @@ CONFIG_BLK_DEV_IDEPCI=y
|
||||
# CONFIG_BLK_DEV_RZ1000 is not set
|
||||
CONFIG_BLK_DEV_IDEDMA_PCI=y
|
||||
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
|
||||
CONFIG_IDEDMA_PCI_AUTO=y
|
||||
# CONFIG_IDEDMA_ONLYDISK is not set
|
||||
# CONFIG_BLK_DEV_AEC62XX is not set
|
||||
# CONFIG_BLK_DEV_ALI15X3 is not set
|
||||
@@ -525,7 +527,6 @@ CONFIG_BLK_DEV_PDC202XX_NEW=y
|
||||
# CONFIG_IDE_ARM is not set
|
||||
CONFIG_BLK_DEV_IDEDMA=y
|
||||
# CONFIG_IDEDMA_IVB is not set
|
||||
CONFIG_IDEDMA_AUTO=y
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
|
||||
#
|
||||
@@ -584,11 +585,9 @@ CONFIG_AIC79XX_DEBUG_MASK=0
|
||||
# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
|
||||
# CONFIG_SCSI_AIC94XX is not set
|
||||
# CONFIG_SCSI_ARCMSR is not set
|
||||
CONFIG_MEGARAID_NEWGEN=y
|
||||
CONFIG_MEGARAID_MM=y
|
||||
CONFIG_MEGARAID_MAILBOX=y
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
CONFIG_MEGARAID_SAS=y
|
||||
# CONFIG_MEGARAID_SAS is not set
|
||||
# CONFIG_SCSI_HPTIOP is not set
|
||||
# CONFIG_SCSI_BUSLOGIC is not set
|
||||
# CONFIG_SCSI_DMX3191D is not set
|
||||
@@ -608,6 +607,7 @@ CONFIG_MEGARAID_SAS=y
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
# CONFIG_SCSI_ESP_CORE is not set
|
||||
# CONFIG_SCSI_SRP is not set
|
||||
|
||||
#
|
||||
@@ -636,6 +636,7 @@ CONFIG_SATA_ACPI=y
|
||||
# CONFIG_PATA_AMD is not set
|
||||
# CONFIG_PATA_ARTOP is not set
|
||||
# CONFIG_PATA_ATIIXP is not set
|
||||
# CONFIG_PATA_CMD640_PCI is not set
|
||||
# CONFIG_PATA_CMD64X is not set
|
||||
# CONFIG_PATA_CS5520 is not set
|
||||
# CONFIG_PATA_CS5530 is not set
|
||||
@@ -687,7 +688,7 @@ CONFIG_BLK_DEV_DM=y
|
||||
CONFIG_FUSION=y
|
||||
CONFIG_FUSION_SPI=y
|
||||
# CONFIG_FUSION_FC is not set
|
||||
CONFIG_FUSION_SAS=y
|
||||
# CONFIG_FUSION_SAS is not set
|
||||
CONFIG_FUSION_MAX_SGE=128
|
||||
# CONFIG_FUSION_CTL is not set
|
||||
|
||||
@@ -700,19 +701,22 @@ CONFIG_IEEE1394=y
|
||||
# Subsystem Options
|
||||
#
|
||||
# CONFIG_IEEE1394_VERBOSEDEBUG is not set
|
||||
# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
# Controllers
|
||||
#
|
||||
|
||||
#
|
||||
# Texas Instruments PCILynx requires I2C
|
||||
#
|
||||
# CONFIG_IEEE1394_PCILYNX is not set
|
||||
CONFIG_IEEE1394_OHCI1394=y
|
||||
|
||||
#
|
||||
# Protocol Drivers
|
||||
# Protocols
|
||||
#
|
||||
# CONFIG_IEEE1394_VIDEO1394 is not set
|
||||
# CONFIG_IEEE1394_SBP2 is not set
|
||||
# CONFIG_IEEE1394_ETH1394_ROM_ENTRY is not set
|
||||
# CONFIG_IEEE1394_ETH1394 is not set
|
||||
# CONFIG_IEEE1394_DV1394 is not set
|
||||
CONFIG_IEEE1394_RAWIO=y
|
||||
@@ -775,7 +779,8 @@ CONFIG_TULIP=y
|
||||
# CONFIG_HP100 is not set
|
||||
CONFIG_NET_PCI=y
|
||||
# CONFIG_PCNET32 is not set
|
||||
# CONFIG_AMD8111_ETH is not set
|
||||
CONFIG_AMD8111_ETH=y
|
||||
# CONFIG_AMD8111E_NAPI is not set
|
||||
# CONFIG_ADAPTEC_STARFIRE is not set
|
||||
CONFIG_B44=y
|
||||
CONFIG_FORCEDETH=y
|
||||
@@ -837,9 +842,10 @@ CONFIG_S2IO=m
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
# Wireless LAN
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
# CONFIG_WLAN_PRE80211 is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
@@ -853,7 +859,6 @@ CONFIG_S2IO=m
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
# CONFIG_NETPOLL_RX is not set
|
||||
# CONFIG_NETPOLL_TRAP is not set
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
@@ -987,57 +992,7 @@ CONFIG_HPET_MMAP=y
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
CONFIG_I2C=m
|
||||
CONFIG_I2C_CHARDEV=m
|
||||
|
||||
#
|
||||
# I2C Algorithms
|
||||
#
|
||||
# CONFIG_I2C_ALGOBIT is not set
|
||||
# CONFIG_I2C_ALGOPCF is not set
|
||||
# CONFIG_I2C_ALGOPCA is not set
|
||||
|
||||
#
|
||||
# I2C Hardware Bus support
|
||||
#
|
||||
# CONFIG_I2C_ALI1535 is not set
|
||||
# CONFIG_I2C_ALI1563 is not set
|
||||
# CONFIG_I2C_ALI15X3 is not set
|
||||
# CONFIG_I2C_AMD756 is not set
|
||||
# CONFIG_I2C_AMD8111 is not set
|
||||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
CONFIG_I2C_ISA=m
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_OCORES is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PASEMI is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_VIA is not set
|
||||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
# CONFIG_SENSORS_EEPROM is not set
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
@@ -1053,54 +1008,8 @@ CONFIG_I2C_ISA=m
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ABITUGURU is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1029 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_K8TEMP is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
# CONFIG_SENSORS_GL520SM is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
# CONFIG_SENSORS_LM63 is not set
|
||||
# CONFIG_SENSORS_LM75 is not set
|
||||
# CONFIG_SENSORS_LM77 is not set
|
||||
# CONFIG_SENSORS_LM78 is not set
|
||||
# CONFIG_SENSORS_LM80 is not set
|
||||
# CONFIG_SENSORS_LM83 is not set
|
||||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_PC87427 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47M192 is not set
|
||||
CONFIG_SENSORS_SMSC47B397=m
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_VT1211 is not set
|
||||
# CONFIG_SENSORS_VT8231 is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83791D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83793 is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
# CONFIG_SENSORS_HDAPS is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Multifunction device drivers
|
||||
@@ -1147,8 +1056,9 @@ CONFIG_SOUND=y
|
||||
# Open Sound System
|
||||
#
|
||||
CONFIG_SOUND_PRIME=y
|
||||
# CONFIG_OBSOLETE_OSS is not set
|
||||
CONFIG_OBSOLETE_OSS=y
|
||||
# CONFIG_SOUND_BT878 is not set
|
||||
# CONFIG_SOUND_ES1371 is not set
|
||||
CONFIG_SOUND_ICH=y
|
||||
# CONFIG_SOUND_TRIDENT is not set
|
||||
# CONFIG_SOUND_MSNDCLAS is not set
|
||||
@@ -1162,6 +1072,14 @@ CONFIG_SOUND_ICH=y
|
||||
CONFIG_HID=y
|
||||
# CONFIG_HID_DEBUG is not set
|
||||
|
||||
#
|
||||
# USB Input Devices
|
||||
#
|
||||
CONFIG_USB_HID=y
|
||||
# CONFIG_USB_HIDINPUT_POWERBOOK is not set
|
||||
# CONFIG_HID_FF is not set
|
||||
# CONFIG_USB_HIDDEV is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
@@ -1175,6 +1093,7 @@ CONFIG_USB=y
|
||||
# Miscellaneous USB options
|
||||
#
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||
# CONFIG_USB_SUSPEND is not set
|
||||
# CONFIG_USB_OTG is not set
|
||||
@@ -1225,10 +1144,6 @@ CONFIG_USB_STORAGE=y
|
||||
#
|
||||
# USB Input Devices
|
||||
#
|
||||
CONFIG_USB_HID=y
|
||||
# CONFIG_USB_HIDINPUT_POWERBOOK is not set
|
||||
# CONFIG_HID_FF is not set
|
||||
# CONFIG_USB_HIDDEV is not set
|
||||
# CONFIG_USB_AIPTEK is not set
|
||||
# CONFIG_USB_WACOM is not set
|
||||
# CONFIG_USB_ACECAD is not set
|
||||
@@ -1556,7 +1471,7 @@ CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=18
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_TIMER_STATS is not set
|
||||
CONFIG_TIMER_STATS=y
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
* This tricks binfmt_elf.c into loading 32bit binaries using lots
|
||||
* of ugly preprocessor tricks. Talk about very very poor man's inheritance.
|
||||
*/
|
||||
#define __ASM_X86_64_ELF_H 1
|
||||
|
||||
#undef ELF_CLASS
|
||||
#define ELF_CLASS ELFCLASS32
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/rwsem.h>
|
||||
@@ -50,9 +55,6 @@ struct elf_phdr;
|
||||
#undef ELF_ARCH
|
||||
#define ELF_ARCH EM_386
|
||||
|
||||
#undef ELF_CLASS
|
||||
#define ELF_CLASS ELFCLASS32
|
||||
|
||||
#define ELF_DATA ELFDATA2LSB
|
||||
|
||||
#define USE_ELF_CORE_DUMP 1
|
||||
@@ -136,7 +138,7 @@ struct elf_prpsinfo
|
||||
|
||||
#define user user32
|
||||
|
||||
#define __ASM_X86_64_ELF_H 1
|
||||
#undef elf_read_implies_exec
|
||||
#define elf_read_implies_exec(ex, executable_stack) (executable_stack != EXSTACK_DISABLE_X)
|
||||
//#include <asm/ia32.h>
|
||||
#include <linux/elf.h>
|
||||
|
||||
@@ -481,11 +481,7 @@ ia32_sys_call_table:
|
||||
.quad sys_symlink
|
||||
.quad sys_lstat
|
||||
.quad sys_readlink /* 85 */
|
||||
#ifdef CONFIG_IA32_AOUT
|
||||
.quad sys_uselib
|
||||
#else
|
||||
.quad quiet_ni_syscall
|
||||
#endif
|
||||
.quad sys_swapon
|
||||
.quad sys_reboot
|
||||
.quad compat_sys_old_readdir
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <asm/proto.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/ia32_unistd.h>
|
||||
#include <asm/vsyscall32.h>
|
||||
|
||||
extern unsigned char syscall32_syscall[], syscall32_syscall_end[];
|
||||
extern unsigned char syscall32_sysenter[], syscall32_sysenter_end[];
|
||||
|
||||
@@ -8,7 +8,8 @@ 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_x86_64.o \
|
||||
x8664_ksyms.o i387.o syscall.o vsyscall.o \
|
||||
setup64.o bootflag.o e820.o reboot.o quirks.o i8237.o \
|
||||
pci-dma.o pci-nommu.o alternative.o hpet.o tsc.o
|
||||
pci-dma.o pci-nommu.o alternative.o hpet.o tsc.o bugs.o \
|
||||
perfctr-watchdog.o
|
||||
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
obj-$(CONFIG_X86_MCE) += mce.o therm_throt.o
|
||||
@@ -21,8 +22,7 @@ obj-$(CONFIG_MICROCODE) += microcode.o
|
||||
obj-$(CONFIG_X86_CPUID) += cpuid.o
|
||||
obj-$(CONFIG_SMP) += smp.o smpboot.o trampoline.o tsc_sync.o
|
||||
obj-y += apic.o nmi.o
|
||||
obj-y += io_apic.o mpparse.o \
|
||||
genapic.o genapic_cluster.o genapic_flat.o
|
||||
obj-y += io_apic.o mpparse.o genapic.o genapic_flat.o
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o crash.o
|
||||
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
||||
obj-$(CONFIG_PM) += suspend.o
|
||||
@@ -58,3 +58,4 @@ i8237-y += ../../i386/kernel/i8237.o
|
||||
msr-$(subst m,y,$(CONFIG_X86_MSR)) += ../../i386/kernel/msr.o
|
||||
alternative-y += ../../i386/kernel/alternative.o
|
||||
pcspeaker-y += ../../i386/kernel/pcspeaker.o
|
||||
perfctr-watchdog-y += ../../i386/kernel/cpu/perfctr-watchdog.o
|
||||
|
||||
@@ -60,19 +60,6 @@ extern char wakeup_start, wakeup_end;
|
||||
|
||||
extern unsigned long acpi_copy_wakeup_routine(unsigned long);
|
||||
|
||||
static pgd_t low_ptr;
|
||||
|
||||
static void init_low_mapping(void)
|
||||
{
|
||||
pgd_t *slot0 = pgd_offset(current->mm, 0UL);
|
||||
low_ptr = *slot0;
|
||||
/* FIXME: We're playing with the current task's page tables here, which
|
||||
* is potentially dangerous on SMP systems.
|
||||
*/
|
||||
set_pgd(slot0, *pgd_offset(current->mm, PAGE_OFFSET));
|
||||
local_flush_tlb();
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_save_state_mem - save kernel state
|
||||
*
|
||||
@@ -81,8 +68,6 @@ static void init_low_mapping(void)
|
||||
*/
|
||||
int acpi_save_state_mem(void)
|
||||
{
|
||||
init_low_mapping();
|
||||
|
||||
memcpy((void *)acpi_wakeup_address, &wakeup_start,
|
||||
&wakeup_end - &wakeup_start);
|
||||
acpi_copy_wakeup_routine(acpi_wakeup_address);
|
||||
@@ -95,8 +80,6 @@ int acpi_save_state_mem(void)
|
||||
*/
|
||||
void acpi_restore_state_mem(void)
|
||||
{
|
||||
set_pgd(pgd_offset(current->mm, 0UL), low_ptr);
|
||||
local_flush_tlb();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -109,10 +92,11 @@ void acpi_restore_state_mem(void)
|
||||
*/
|
||||
void __init acpi_reserve_bootmem(void)
|
||||
{
|
||||
acpi_wakeup_address = (unsigned long)alloc_bootmem_low(PAGE_SIZE);
|
||||
if ((&wakeup_end - &wakeup_start) > PAGE_SIZE)
|
||||
acpi_wakeup_address = (unsigned long)alloc_bootmem_low(PAGE_SIZE*2);
|
||||
if ((&wakeup_end - &wakeup_start) > (PAGE_SIZE*2))
|
||||
printk(KERN_CRIT
|
||||
"ACPI: Wakeup code way too big, will crash on attempt to suspend\n");
|
||||
"ACPI: Wakeup code way too big, will crash on attempt"
|
||||
" to suspend\n");
|
||||
}
|
||||
|
||||
static int __init acpi_sleep_setup(char *str)
|
||||
|
||||
+109
-181
@@ -1,6 +1,7 @@
|
||||
.text
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/msr.h>
|
||||
|
||||
@@ -30,22 +31,28 @@ wakeup_code:
|
||||
cld
|
||||
# setup data segment
|
||||
movw %cs, %ax
|
||||
movw %ax, %ds # Make ds:0 point to wakeup_start
|
||||
movw %ax, %ds # Make ds:0 point to wakeup_start
|
||||
movw %ax, %ss
|
||||
mov $(wakeup_stack - wakeup_code), %sp # Private stack is needed for ASUS board
|
||||
# Private stack is needed for ASUS board
|
||||
mov $(wakeup_stack - wakeup_code), %sp
|
||||
|
||||
pushl $0 # Kill any dangerous flags
|
||||
pushl $0 # Kill any dangerous flags
|
||||
popfl
|
||||
|
||||
movl real_magic - wakeup_code, %eax
|
||||
cmpl $0x12345678, %eax
|
||||
jne bogus_real_magic
|
||||
|
||||
call verify_cpu # Verify the cpu supports long
|
||||
# mode
|
||||
testl %eax, %eax
|
||||
jnz no_longmode
|
||||
|
||||
testl $1, video_flags - wakeup_code
|
||||
jz 1f
|
||||
lcall $0xc000,$3
|
||||
movw %cs, %ax
|
||||
movw %ax, %ds # Bios might have played with that
|
||||
movw %ax, %ds # Bios might have played with that
|
||||
movw %ax, %ss
|
||||
1:
|
||||
|
||||
@@ -61,12 +68,15 @@ wakeup_code:
|
||||
|
||||
movb $0xa2, %al ; outb %al, $0x80
|
||||
|
||||
lidt %ds:idt_48a - wakeup_code
|
||||
xorl %eax, %eax
|
||||
movw %ds, %ax # (Convert %ds:gdt to a linear ptr)
|
||||
shll $4, %eax
|
||||
addl $(gdta - wakeup_code), %eax
|
||||
movl %eax, gdt_48a +2 - wakeup_code
|
||||
mov %ds, %ax # Find 32bit wakeup_code addr
|
||||
movzx %ax, %esi # (Convert %ds:gdt to a liner ptr)
|
||||
shll $4, %esi
|
||||
# Fix up the vectors
|
||||
addl %esi, wakeup_32_vector - wakeup_code
|
||||
addl %esi, wakeup_long64_vector - wakeup_code
|
||||
addl %esi, gdt_48a + 2 - wakeup_code # Fixup the gdt pointer
|
||||
|
||||
lidtl %ds:idt_48a - wakeup_code
|
||||
lgdtl %ds:gdt_48a - wakeup_code # load gdt with whatever is
|
||||
# appropriate
|
||||
|
||||
@@ -75,86 +85,63 @@ wakeup_code:
|
||||
jmp 1f
|
||||
1:
|
||||
|
||||
.byte 0x66, 0xea # prefix + jmpi-opcode
|
||||
.long wakeup_32 - __START_KERNEL_map
|
||||
.word __KERNEL_CS
|
||||
ljmpl *(wakeup_32_vector - wakeup_code)
|
||||
|
||||
.balign 4
|
||||
wakeup_32_vector:
|
||||
.long wakeup_32 - wakeup_code
|
||||
.word __KERNEL32_CS, 0
|
||||
|
||||
.code32
|
||||
wakeup_32:
|
||||
# Running in this code, but at low address; paging is not yet turned on.
|
||||
movb $0xa5, %al ; outb %al, $0x80
|
||||
|
||||
/* Check if extended functions are implemented */
|
||||
movl $0x80000000, %eax
|
||||
cpuid
|
||||
cmpl $0x80000000, %eax
|
||||
jbe bogus_cpu
|
||||
wbinvd
|
||||
mov $0x80000001, %eax
|
||||
cpuid
|
||||
btl $29, %edx
|
||||
jnc bogus_cpu
|
||||
movl %edx,%edi
|
||||
|
||||
movw $__KERNEL_DS, %ax
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %fs
|
||||
movw %ax, %gs
|
||||
movl $__KERNEL_DS, %eax
|
||||
movl %eax, %ds
|
||||
|
||||
movw $__KERNEL_DS, %ax
|
||||
movw %ax, %ss
|
||||
|
||||
mov $(wakeup_stack - __START_KERNEL_map), %esp
|
||||
movl saved_magic - __START_KERNEL_map, %eax
|
||||
cmpl $0x9abcdef0, %eax
|
||||
jne bogus_32_magic
|
||||
movw $0x0e00 + 'i', %ds:(0xb8012)
|
||||
movb $0xa8, %al ; outb %al, $0x80;
|
||||
|
||||
/*
|
||||
* Prepare for entering 64bits mode
|
||||
*/
|
||||
|
||||
/* Enable PAE mode and PGE */
|
||||
/* Enable PAE */
|
||||
xorl %eax, %eax
|
||||
btsl $5, %eax
|
||||
btsl $7, %eax
|
||||
movl %eax, %cr4
|
||||
|
||||
/* Setup early boot stage 4 level pagetables */
|
||||
movl $(wakeup_level4_pgt - __START_KERNEL_map), %eax
|
||||
leal (wakeup_level4_pgt - wakeup_code)(%esi), %eax
|
||||
movl %eax, %cr3
|
||||
|
||||
/* Setup EFER (Extended Feature Enable Register) */
|
||||
movl $MSR_EFER, %ecx
|
||||
rdmsr
|
||||
/* Fool rdmsr and reset %eax to avoid dependences */
|
||||
xorl %eax, %eax
|
||||
/* Enable Long Mode */
|
||||
btsl $_EFER_LME, %eax
|
||||
/* Enable System Call */
|
||||
btsl $_EFER_SCE, %eax
|
||||
/* Check if nx is implemented */
|
||||
movl $0x80000001, %eax
|
||||
cpuid
|
||||
movl %edx,%edi
|
||||
|
||||
/* No Execute supported? */
|
||||
/* Enable Long Mode */
|
||||
xorl %eax, %eax
|
||||
btsl $_EFER_LME, %eax
|
||||
|
||||
/* No Execute supported? */
|
||||
btl $20,%edi
|
||||
jnc 1f
|
||||
btsl $_EFER_NX, %eax
|
||||
1:
|
||||
|
||||
/* Make changes effective */
|
||||
1: movl $MSR_EFER, %ecx
|
||||
xorl %edx, %edx
|
||||
wrmsr
|
||||
wbinvd
|
||||
|
||||
xorl %eax, %eax
|
||||
btsl $31, %eax /* Enable paging and in turn activate Long Mode */
|
||||
btsl $0, %eax /* Enable protected mode */
|
||||
btsl $1, %eax /* Enable MP */
|
||||
btsl $4, %eax /* Enable ET */
|
||||
btsl $5, %eax /* Enable NE */
|
||||
btsl $16, %eax /* Enable WP */
|
||||
btsl $18, %eax /* Enable AM */
|
||||
|
||||
/* Make changes effective */
|
||||
movl %eax, %cr0
|
||||
|
||||
/* At this point:
|
||||
CR4.PAE must be 1
|
||||
CS.L must be 0
|
||||
@@ -162,11 +149,6 @@ wakeup_32:
|
||||
Next instruction must be a branch
|
||||
This must be on identity-mapped page
|
||||
*/
|
||||
jmp reach_compatibility_mode
|
||||
reach_compatibility_mode:
|
||||
movw $0x0e00 + 'i', %ds:(0xb8012)
|
||||
movb $0xa8, %al ; outb %al, $0x80;
|
||||
|
||||
/*
|
||||
* At this point we're in long mode but in 32bit compatibility mode
|
||||
* with EFER.LME = 1, CS.L = 0, CS.D = 1 (and in turn
|
||||
@@ -174,24 +156,19 @@ reach_compatibility_mode:
|
||||
* the new gdt/idt that has __KERNEL_CS with CS.L = 1.
|
||||
*/
|
||||
|
||||
movw $0x0e00 + 'n', %ds:(0xb8014)
|
||||
movb $0xa9, %al ; outb %al, $0x80
|
||||
|
||||
/* Load new GDT with the 64bit segment using 32bit descriptor */
|
||||
movl $(pGDT32 - __START_KERNEL_map), %eax
|
||||
lgdt (%eax)
|
||||
|
||||
movl $(wakeup_jumpvector - __START_KERNEL_map), %eax
|
||||
/* Finally jump in 64bit mode */
|
||||
ljmp *(%eax)
|
||||
ljmp *(wakeup_long64_vector - wakeup_code)(%esi)
|
||||
|
||||
wakeup_jumpvector:
|
||||
.long wakeup_long64 - __START_KERNEL_map
|
||||
.word __KERNEL_CS
|
||||
.balign 4
|
||||
wakeup_long64_vector:
|
||||
.long wakeup_long64 - wakeup_code
|
||||
.word __KERNEL_CS, 0
|
||||
|
||||
.code64
|
||||
|
||||
/* Hooray, we are in Long 64-bit mode (but still running in low memory) */
|
||||
/* Hooray, we are in Long 64-bit mode (but still running in
|
||||
* low memory)
|
||||
*/
|
||||
wakeup_long64:
|
||||
/*
|
||||
* We must switch to a new descriptor in kernel space for the GDT
|
||||
@@ -199,7 +176,15 @@ wakeup_long64:
|
||||
* addresses where we're currently running on. We have to do that here
|
||||
* because in 32bit we couldn't load a 64bit linear address.
|
||||
*/
|
||||
lgdt cpu_gdt_descr - __START_KERNEL_map
|
||||
lgdt cpu_gdt_descr
|
||||
|
||||
movw $0x0e00 + 'n', %ds:(0xb8014)
|
||||
movb $0xa9, %al ; outb %al, $0x80
|
||||
|
||||
movq saved_magic, %rax
|
||||
movq $0x123456789abcdef0, %rdx
|
||||
cmpq %rdx, %rax
|
||||
jne bogus_64_magic
|
||||
|
||||
movw $0x0e00 + 'u', %ds:(0xb8016)
|
||||
|
||||
@@ -211,75 +196,58 @@ wakeup_long64:
|
||||
movw %ax, %es
|
||||
movw %ax, %fs
|
||||
movw %ax, %gs
|
||||
movq saved_esp, %rsp
|
||||
movq saved_rsp, %rsp
|
||||
|
||||
movw $0x0e00 + 'x', %ds:(0xb8018)
|
||||
movq saved_ebx, %rbx
|
||||
movq saved_edi, %rdi
|
||||
movq saved_esi, %rsi
|
||||
movq saved_ebp, %rbp
|
||||
movq saved_rbx, %rbx
|
||||
movq saved_rdi, %rdi
|
||||
movq saved_rsi, %rsi
|
||||
movq saved_rbp, %rbp
|
||||
|
||||
movw $0x0e00 + '!', %ds:(0xb801a)
|
||||
movq saved_eip, %rax
|
||||
movq saved_rip, %rax
|
||||
jmp *%rax
|
||||
|
||||
.code32
|
||||
|
||||
.align 64
|
||||
gdta:
|
||||
/* Its good to keep gdt in sync with one in trampoline.S */
|
||||
.word 0, 0, 0, 0 # dummy
|
||||
|
||||
.word 0, 0, 0, 0 # unused
|
||||
|
||||
.word 0xFFFF # 4Gb - (0x100000*0x1000 = 4Gb)
|
||||
.word 0 # base address = 0
|
||||
.word 0x9B00 # code read/exec. ??? Why I need 0x9B00 (as opposed to 0x9A00 in order for this to work?)
|
||||
.word 0x00CF # granularity = 4096, 386
|
||||
# (+5th nibble of limit)
|
||||
|
||||
.word 0xFFFF # 4Gb - (0x100000*0x1000 = 4Gb)
|
||||
.word 0 # base address = 0
|
||||
.word 0x9200 # data read/write
|
||||
.word 0x00CF # granularity = 4096, 386
|
||||
# (+5th nibble of limit)
|
||||
# this is 64bit descriptor for code
|
||||
.word 0xFFFF
|
||||
.word 0
|
||||
.word 0x9A00 # code read/exec
|
||||
.word 0x00AF # as above, but it is long mode and with D=0
|
||||
/* ??? Why I need the accessed bit set in order for this to work? */
|
||||
.quad 0x00cf9b000000ffff # __KERNEL32_CS
|
||||
.quad 0x00af9b000000ffff # __KERNEL_CS
|
||||
.quad 0x00cf93000000ffff # __KERNEL_DS
|
||||
|
||||
idt_48a:
|
||||
.word 0 # idt limit = 0
|
||||
.word 0, 0 # idt base = 0L
|
||||
|
||||
gdt_48a:
|
||||
.word 0x8000 # gdt limit=2048,
|
||||
.word 0x800 # gdt limit=2048,
|
||||
# 256 GDT entries
|
||||
.word 0, 0 # gdt base (filled in later)
|
||||
.long gdta - wakeup_code # gdt base (relocated in later)
|
||||
|
||||
|
||||
real_save_gdt: .word 0
|
||||
.quad 0
|
||||
real_magic: .quad 0
|
||||
video_mode: .quad 0
|
||||
video_flags: .quad 0
|
||||
|
||||
.code16
|
||||
bogus_real_magic:
|
||||
movb $0xba,%al ; outb %al,$0x80
|
||||
movb $0xba,%al ; outb %al,$0x80
|
||||
jmp bogus_real_magic
|
||||
|
||||
bogus_32_magic:
|
||||
.code64
|
||||
bogus_64_magic:
|
||||
movb $0xb3,%al ; outb %al,$0x80
|
||||
jmp bogus_32_magic
|
||||
jmp bogus_64_magic
|
||||
|
||||
bogus_31_magic:
|
||||
movb $0xb1,%al ; outb %al,$0x80
|
||||
jmp bogus_31_magic
|
||||
|
||||
bogus_cpu:
|
||||
movb $0xbc,%al ; outb %al,$0x80
|
||||
jmp bogus_cpu
|
||||
.code16
|
||||
no_longmode:
|
||||
movb $0xbc,%al ; outb %al,$0x80
|
||||
jmp no_longmode
|
||||
|
||||
#include "../verify_cpu.S"
|
||||
|
||||
/* This code uses an extended set of video mode numbers. These include:
|
||||
* Aliases for standard modes
|
||||
@@ -301,6 +269,7 @@ bogus_cpu:
|
||||
#define VIDEO_FIRST_V7 0x0900
|
||||
|
||||
# Setting of user mode (AX=mode ID) => CF=success
|
||||
.code16
|
||||
mode_seta:
|
||||
movw %ax, %bx
|
||||
#if 0
|
||||
@@ -346,21 +315,18 @@ check_vesaa:
|
||||
|
||||
_setbada: jmp setbada
|
||||
|
||||
.code64
|
||||
bogus_magic:
|
||||
movw $0x0e00 + 'B', %ds:(0xb8018)
|
||||
jmp bogus_magic
|
||||
|
||||
bogus_magic2:
|
||||
movw $0x0e00 + '2', %ds:(0xb8018)
|
||||
jmp bogus_magic2
|
||||
|
||||
|
||||
wakeup_stack_begin: # Stack grows down
|
||||
|
||||
.org 0xff0
|
||||
wakeup_stack: # Just below end of page
|
||||
|
||||
.org 0x1000
|
||||
ENTRY(wakeup_level4_pgt)
|
||||
.quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE
|
||||
.fill 510,8,0
|
||||
/* (2^48-(2*1024*1024*1024))/(2^39) = 511 */
|
||||
.quad level3_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE
|
||||
|
||||
ENTRY(wakeup_end)
|
||||
|
||||
##
|
||||
@@ -373,28 +339,11 @@ ENTRY(wakeup_end)
|
||||
#
|
||||
# Returned address is location of code in low memory (past data and stack)
|
||||
#
|
||||
.code64
|
||||
ENTRY(acpi_copy_wakeup_routine)
|
||||
pushq %rax
|
||||
pushq %rcx
|
||||
pushq %rdx
|
||||
|
||||
sgdt saved_gdt
|
||||
sidt saved_idt
|
||||
sldt saved_ldt
|
||||
str saved_tss
|
||||
|
||||
movq %cr3, %rdx
|
||||
movq %rdx, saved_cr3
|
||||
movq %cr4, %rdx
|
||||
movq %rdx, saved_cr4
|
||||
movq %cr0, %rdx
|
||||
movq %rdx, saved_cr0
|
||||
sgdt real_save_gdt - wakeup_start (,%rdi)
|
||||
movl $MSR_EFER, %ecx
|
||||
rdmsr
|
||||
movl %eax, saved_efer
|
||||
movl %edx, saved_efer2
|
||||
|
||||
movl saved_video_mode, %edx
|
||||
movl %edx, video_mode - wakeup_start (,%rdi)
|
||||
movl acpi_video_flags, %edx
|
||||
@@ -403,21 +352,13 @@ ENTRY(acpi_copy_wakeup_routine)
|
||||
movq $0x123456789abcdef0, %rdx
|
||||
movq %rdx, saved_magic
|
||||
|
||||
movl saved_magic - __START_KERNEL_map, %eax
|
||||
cmpl $0x9abcdef0, %eax
|
||||
jne bogus_32_magic
|
||||
movq saved_magic, %rax
|
||||
movq $0x123456789abcdef0, %rdx
|
||||
cmpq %rdx, %rax
|
||||
jne bogus_64_magic
|
||||
|
||||
# make sure %cr4 is set correctly (features, etc)
|
||||
movl saved_cr4 - __START_KERNEL_map, %eax
|
||||
movq %rax, %cr4
|
||||
|
||||
movl saved_cr0 - __START_KERNEL_map, %eax
|
||||
movq %rax, %cr0
|
||||
jmp 1f # Flush pipelines
|
||||
1:
|
||||
# restore the regs we used
|
||||
popq %rdx
|
||||
popq %rcx
|
||||
popq %rax
|
||||
ENTRY(do_suspend_lowlevel_s4bios)
|
||||
ret
|
||||
@@ -450,13 +391,13 @@ do_suspend_lowlevel:
|
||||
movq %r15, saved_context_r15(%rip)
|
||||
pushfq ; popq saved_context_eflags(%rip)
|
||||
|
||||
movq $.L97, saved_eip(%rip)
|
||||
movq $.L97, saved_rip(%rip)
|
||||
|
||||
movq %rsp,saved_esp
|
||||
movq %rbp,saved_ebp
|
||||
movq %rbx,saved_ebx
|
||||
movq %rdi,saved_edi
|
||||
movq %rsi,saved_esi
|
||||
movq %rsp,saved_rsp
|
||||
movq %rbp,saved_rbp
|
||||
movq %rbx,saved_rbx
|
||||
movq %rdi,saved_rdi
|
||||
movq %rsi,saved_rsi
|
||||
|
||||
addq $8, %rsp
|
||||
movl $3, %edi
|
||||
@@ -503,25 +444,12 @@ do_suspend_lowlevel:
|
||||
|
||||
.data
|
||||
ALIGN
|
||||
ENTRY(saved_ebp) .quad 0
|
||||
ENTRY(saved_esi) .quad 0
|
||||
ENTRY(saved_edi) .quad 0
|
||||
ENTRY(saved_ebx) .quad 0
|
||||
ENTRY(saved_rbp) .quad 0
|
||||
ENTRY(saved_rsi) .quad 0
|
||||
ENTRY(saved_rdi) .quad 0
|
||||
ENTRY(saved_rbx) .quad 0
|
||||
|
||||
ENTRY(saved_eip) .quad 0
|
||||
ENTRY(saved_esp) .quad 0
|
||||
ENTRY(saved_rip) .quad 0
|
||||
ENTRY(saved_rsp) .quad 0
|
||||
|
||||
ENTRY(saved_magic) .quad 0
|
||||
|
||||
ALIGN
|
||||
# saved registers
|
||||
saved_gdt: .quad 0,0
|
||||
saved_idt: .quad 0,0
|
||||
saved_ldt: .quad 0
|
||||
saved_tss: .quad 0
|
||||
|
||||
saved_cr0: .quad 0
|
||||
saved_cr3: .quad 0
|
||||
saved_cr4: .quad 0
|
||||
saved_efer: .quad 0
|
||||
saved_efer2: .quad 0
|
||||
|
||||
@@ -51,7 +51,6 @@ static void __init insert_aperture_resource(u32 aper_base, u32 aper_size)
|
||||
|
||||
static u32 __init allocate_aperture(void)
|
||||
{
|
||||
pg_data_t *nd0 = NODE_DATA(0);
|
||||
u32 aper_size;
|
||||
void *p;
|
||||
|
||||
@@ -65,12 +64,12 @@ static u32 __init allocate_aperture(void)
|
||||
* Unfortunately we cannot move it up because that would make the
|
||||
* IOMMU useless.
|
||||
*/
|
||||
p = __alloc_bootmem_node(nd0, aper_size, aper_size, 0);
|
||||
p = __alloc_bootmem_nopanic(aper_size, aper_size, 0);
|
||||
if (!p || __pa(p)+aper_size > 0xffffffff) {
|
||||
printk("Cannot allocate aperture memory hole (%p,%uK)\n",
|
||||
p, aper_size>>10);
|
||||
if (p)
|
||||
free_bootmem_node(nd0, __pa(p), aper_size);
|
||||
free_bootmem(__pa(p), aper_size);
|
||||
return 0;
|
||||
}
|
||||
printk("Mapping aperture over %d KB of RAM @ %lx\n",
|
||||
|
||||
@@ -68,6 +68,28 @@ int using_apic_timer __read_mostly = 0;
|
||||
|
||||
static void apic_pm_activate(void);
|
||||
|
||||
void apic_wait_icr_idle(void)
|
||||
{
|
||||
while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
unsigned int safe_apic_wait_icr_idle(void)
|
||||
{
|
||||
unsigned int send_status;
|
||||
int timeout;
|
||||
|
||||
timeout = 0;
|
||||
do {
|
||||
send_status = apic_read(APIC_ICR) & APIC_ICR_BUSY;
|
||||
if (!send_status)
|
||||
break;
|
||||
udelay(100);
|
||||
} while (timeout++ < 1000);
|
||||
|
||||
return send_status;
|
||||
}
|
||||
|
||||
void enable_NMI_through_LVT0 (void * dummy)
|
||||
{
|
||||
unsigned int v;
|
||||
@@ -817,14 +839,15 @@ static void setup_APIC_timer(unsigned int clocks)
|
||||
|
||||
static int __init calibrate_APIC_clock(void)
|
||||
{
|
||||
int apic, apic_start, tsc, tsc_start;
|
||||
unsigned apic, apic_start;
|
||||
unsigned long tsc, tsc_start;
|
||||
int result;
|
||||
/*
|
||||
* Put whatever arbitrary (but long enough) timeout
|
||||
* value into the APIC clock, we just want to get the
|
||||
* counter running for calibration.
|
||||
*/
|
||||
__setup_APIC_LVTT(1000000000);
|
||||
__setup_APIC_LVTT(4000000000);
|
||||
|
||||
apic_start = apic_read(APIC_TMCCT);
|
||||
#ifdef CONFIG_X86_PM_TIMER
|
||||
@@ -835,15 +858,15 @@ static int __init calibrate_APIC_clock(void)
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
rdtscl(tsc_start);
|
||||
rdtscll(tsc_start);
|
||||
|
||||
do {
|
||||
apic = apic_read(APIC_TMCCT);
|
||||
rdtscl(tsc);
|
||||
rdtscll(tsc);
|
||||
} while ((tsc - tsc_start) < TICK_COUNT &&
|
||||
(apic - apic_start) < TICK_COUNT);
|
||||
(apic_start - apic) < TICK_COUNT);
|
||||
|
||||
result = (apic_start - apic) * 1000L * cpu_khz /
|
||||
result = (apic_start - apic) * 1000L * tsc_khz /
|
||||
(tsc - tsc_start);
|
||||
}
|
||||
printk("result %d\n", result);
|
||||
|
||||
@@ -21,6 +21,14 @@
|
||||
|
||||
#define BLANK() asm volatile("\n->" : : )
|
||||
|
||||
#define __NO_STUBS 1
|
||||
#undef __SYSCALL
|
||||
#undef _ASM_X86_64_UNISTD_H_
|
||||
#define __SYSCALL(nr, sym) [nr] = 1,
|
||||
static char syscalls[] = {
|
||||
#include <asm/unistd.h>
|
||||
};
|
||||
|
||||
int main(void)
|
||||
{
|
||||
#define ENTRY(entry) DEFINE(tsk_ ## entry, offsetof(struct task_struct, entry))
|
||||
@@ -71,5 +79,7 @@ int main(void)
|
||||
DEFINE(TSS_ist, offsetof(struct tss_struct, ist));
|
||||
BLANK();
|
||||
DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx));
|
||||
BLANK();
|
||||
DEFINE(__NR_syscall_max, sizeof(syscalls) - 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user