Centralize i386 Constants
PATCH 1/1 Centralize i386 Constants
Name: Centralize i386 Constants
Status: Tested on 2.6.5-rc2-bk1
__FIXADDR_TOP and PAGE_OFFSET are hardcoded in various places. I had to change it to run the kernel under qemu-fast, so I wanted to centralize them.
To do this, we rename vsyscall.lds to vsyscall.lds.s, and generate it from vsyscall.lds.S.
arch/i386/kernel/Makefile +4 -2
@@ -47,12 +47,14 @@ quiet_cmd_syscall = SYSCALL $@ cmd_syscall = $(CC) -nostdlib $(SYSCFLAGS_$(@F)) \ -Wl,-T,$(filter-out FORCE,$^) -o $@ +export AFLAGS_vsyscall.lds.o += -P -C -U$(ARCH) + vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 SYSCFLAGS_vsyscall-sysenter.so = $(vsyscall-flags) SYSCFLAGS_vsyscall-int80.so = $(vsyscall-flags) $(obj)/vsyscall-int80.so $(obj)/vsyscall-sysenter.so: \ -$(obj)/vsyscall-%.so: $(src)/vsyscall.lds $(obj)/vsyscall-%.o FORCE +$(obj)/vsyscall-%.so: $(src)/vsyscall.lds.s $(obj)/vsyscall-%.o FORCE $(call if_changed,syscall) # We also create a special relocatable object that should mirror the symbol
@@ -63,5 +65,5 @@ $(obj)/built-in.o: $(obj)/vsyscall-syms. $(obj)/built-in.o: ld_flags += -R $(obj)/vsyscall-syms.o SYSCFLAGS_vsyscall-syms.o = -r -$(obj)/vsyscall-syms.o: $(src)/vsyscall.lds $(obj)/vsyscall-sysenter.o FORCE +$(obj)/vsyscall-syms.o: $(src)/vsyscall.lds.s $(obj)/vsyscall-sysenter.o FORCE $(call if_changed,syscall)
arch/i386/kernel/vmlinux.lds.S +2 -1
@@ -4,6 +4,7 @@ #include <asm-generic/vmlinux.lds.h> #include <asm/thread_info.h> +#include <asm/page.h> OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386)
@@ -11,7 +12,7 @@ ENTRY(startup_32) jiffies = jiffies_64; SECTIONS { - . = 0xC0000000 + 0x100000; + . = __PAGE_OFFSET + 0x100000; /* read-only */ _text = .; /* Text and read-only data */ .text : {
arch/i386/kernel/vsyscall.lds +0 -67
67 lines not on this page · raw message
arch/i386/kernel/vsyscall.lds.S +67 -0
67 lines not on this page · raw message
include/asm-i386/fixmap.h +12 -7
@@ -14,6 +14,15 @@#define _ASM_FIXMAP_H#include <linux/config.h> + +/* used by vmalloc.c, vsyscall.lds.S. +* +* Leave one empty page between vmalloc'ed areas and +* the start of the fixmap. +*/ +#define __FIXADDR_TOP 0xfffff000 + +#ifndef __ASSEMBLY__#include <linux/kernel.h> #include <asm/acpi.h> #include <asm/apicdef.h>
@@ -97,13 +110,8 @@ extern void __set_fixmap (enum fixed_add#define clear_fixmap (idx) \ __set_fixmap(idx, 0, __pgprot(0)) -/* -* used by vmalloc.c. -* -* Leave one empty page between vmalloc'ed areas and -* the start of the fixmap. -*/ -#define FIXADDR_TOP (0xfffff000UL) +#define FIXADDR_TOP ((unsigned long)__FIXADDR_TOP) +#define __FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)#define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
@@ -148,4 +156,5 @@ static inline unsigned long virt_to_fix(return __virt_to_fix (vaddr); } +#endif /* !__ASSEMBLY__ */ #endif
Signature · 1 line
Anyone who quotes me in their signature is an idiot -- Rusty Russell
Rusty> __FIXADDR_TOP and PAGE_OFFSET are hardcoded in various Rusty> places. I had to change it to run the kernel under Rusty> qemu-fast, so I wanted to centralize them.
I like this patch -- I recently built a kernel with PAGE_OFFSET 0xb0000000 to avoid highmem on my box with 1G of RAM, based on recent discussion, and I made the same change to vmlinux.lds.S (although since <asm-i386/thread_info.h> includes <asm-i386/page.h>, I didn't bother adding the "#include <asm/page.h>" line).
In any case it seems there is at least one more place where 0xc0000000 is hardcoded in arch/i386. The patch below uses PAGE_OFFSET instead of 0xc0000000 in doublefault.c's ptr_ok() macro.
- Roland
arch/i386/kernel/doublefault.c +1 -1
@@ -13,7 +13,7 @@static unsigned long doublefault_stack[DOUBLEFAULT_STACKSIZE ];#define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE) -#define ptr_ok (x) ((x) > 0xc0000000 && (x) < 0xc1000000) +#define ptr_ok (x) ((x) > PAGE_OFFSET && (x) < PAGE_OFFSET + 0x1000000)static void doublefault_fn (void ) {